1.5node.js

3. 个人中心

3.1 获取用户的基本信息

3.1.0 实现步骤

  1. 初始化 路由 模块

  2. 初始化 路由处理函数 模块

  3. 获取用户的基本信息

3.1.1 初始化路由模块

  1. 创建 /router/userinfo.js 路由模块,并初始化如下的代码结构:

// 导入 express
const express = require('express')
// 创建路由对象
const router = express.Router()

// 获取用户的基本信息
router.get('/userinfo', (req, res) => {
  res.send('ok')
})

// 向外共享路由对象
module.exports = router

 2.在app.js 中导入并使用个人中心的路由模块:

// 导入并使用用户信息路由模块
const userinfoRouter = require('./router/userinfo')
// 注意:以 /my 开头的接口,都是有权限的接口,需要进行 Token 身份认证
app.use('/my', userinfoRouter)

3.1.2 初始化路由处理函数模块

  1. 创建 /router_handler/userinfo.js 路由处理函数模块,并初始化如下的代码结构:

 

// 获取用户基本信息的处理函数
exports.getUserInfo = (req, res) => {
  res.send('ok')
}

2.修改 /router/userinfo.js 中的代码如下:

const express = require('express')
const router = express.Router()

// 导入用户信息的处理函数模块
const userinfo_handler = require('../router_handler/userinfo')

// 获取用户的基本信息
router.get('/userinfo', userinfo_handler.getUserInfo)

module.exports = router

3.1.3 获取用户的基本信息

  1. /router_handler/userinfo.js 头部导入数据库操作模块:

// 导入数据库操作模块
const db = require('../db/index')

 

2.定义 SQL 语句:

// 根据用户的 id,查询用户的基本信息
// 注意:为了防止用户的密码泄露,需要排除 password 字段
const sql = `select id, username, nickname, email, user_pic from ev_users where id=?`

3.调用 db.query() 执行 SQL 语句:

// 注意:req 对象上的 user 属性,是 Token 解析成功,express-jwt 中间件帮我们挂载上去的
db.query(sql, req.user.id, (err, results) => {
  // 1. 执行 SQL 语句失败
  if (err) return res.cc(err)

  // 2. 执行 SQL 语句成功,但是查询到的数据条数不等于 1
  if (results.length !== 1) return res.cc('获取用户信息失败!')

  // 3. 将用户信息响应给客户端
  res.send({
    status: 0,
    message: '获取用户基本信息成功!',
    data: results[0],
  })
})

3.2 更新用户的基本信息

3.2.0 实现步骤

  1. 定义路由和处理函数

  2. 验证表单数据

  3. 实现更新用户基本信息的功能

3.2.1 定义路由和处理函数

  1. /router/userinfo.js 模块中,新增 更新用户基本信息 的路由:

// 更新用户的基本信息
router.post('/userinfo', userinfo_handler.updateUserInfo)

 

2.在 /router_handler/userinfo.js 模块中,定义并向外共享 更新用户基本信息 的路由处理函数:

// 更新用户基本信息的处理函数
exports.updateUserInfo = (req, res) => {
  res.send('ok')
}

3.2.2 验证表单数据

  1. /schema/user.js 验证规则模块中,定义 idnicknameemail 的验证规则如下:

// 定义 id, nickname, emial 的验证规则
const id = joi.number().integer().min(1).required()
const nickname = joi.string().required()
const email = joi.string().email().required()

 

2.并使用 exports 向外共享如下的 验证规则对象

// 验证规则对象 - 更新用户基本信息
exports.update_userinfo_schema = {
  body: {
    id,
    nickname,
    email,
  },
}

3.在 /router/userinfo.js 模块中,导入验证数据合法性的中间件:

// 导入验证数据合法性的中间件
const expressJoi = require('@escook/express-joi')

4.在 /router/userinfo.js 模块中,导入需要的验证规则对象:

// 导入需要的验证规则对象
const { update_userinfo_schema } = require('../schema/user')

5.在 /router/userinfo.js 模块中,修改 更新用户的基本信息 的路由如下:

// 更新用户的基本信息
router.post('/userinfo', expressJoi(update_userinfo_schema), userinfo_handler.updateUserInfo)

3.2.3 实现更新用户基本信息的功能

  1. 定义待执行的 SQL 语句:

const sql = `update ev_users set ? where id=?`

2.调用db.query() 执行 SQL 语句并传参:

db.query(sql, [req.body, req.body.id], (err, results) => {
  // 执行 SQL 语句失败
  if (err) return res.cc(err)

  // 执行 SQL 语句成功,但影响行数不为 1
  if (results.affectedRows !== 1) return res.cc('修改用户基本信息失败!')

  // 修改用户信息成功
  return res.cc('修改用户基本信息成功!', 0)
})

协同过滤是推荐系统中常用的算法之一,而Node.js也可以用来实现协同过滤算法。下面是一个简单的Node.js实现协同过滤的例子: ```javascript // 假设有一个用户评分的数据集ratingsData,其中包含多个用户对多个物品的评分 const ratingsData = { 'user1': { 'item1': 3.5, 'item2': 2.0, 'item3': 4.5, 'item4': 5.0 }, 'user2': { 'item1': 2.5, 'item3': 3.0, 'item4': 3.5 }, 'user3': { 'item2': 4.5, 'item3': 1.5, 'item4': 4.0 }, 'user4': { 'item1': 3.0, 'item2': 4.0, 'item3': 2.0, 'item4': 3.0 } }; // 计算两个用户之间的相似度 function similarity(user1, user2) { let sum = 0; let count = 0; for (let item in user1) { if (item in user2) { sum += Math.pow(user1[item] - user2[item], 2); count++; } } return count === 0 ? 0 : 1 / (1 + Math.sqrt(sum / count)); } // 找到与指定用户最相似的K个用户 function findKNearestNeighbors(username, k) { let distances = []; for (let user in ratingsData) { if (user !== username) { let dist = similarity(ratingsData[username], ratingsData[user]); distances.push({user: user, distance: dist}); } } distances.sort((a, b) => b.distance - a.distance); return distances.slice(0, k); } // 预测指定用户对指定物品的评分 function predictRating(username, itemname) { let neighbors = findKNearestNeighbors(username, 3); let numerator = 0; let denominator = 0; for (let neighbor of neighbors) { let weight = neighbor.distance; let neighborRatings = ratingsData[neighbor.user]; if (itemname in neighborRatings) { numerator += weight * neighborRatings[itemname]; denominator += weight; } } return denominator === 0 ? 0 : numerator / denominator; } // 示例:预测用户user1对物品item2的评分 console.log(predictRating('user1', 'item2')); // 输出:3.75 ``` 上述代码中,我们首先定义了一个包含多个用户对多个物品的评分数据集ratingsData。然后,我们定义了三个函数:similarity用于计算两个用户之间的相似度,findKNearestNeighbors用于找到与指定用户最相似的K个用户,predictRating用于预测指定用户对指定物品的评分。最后,我们给出了一个示例,预测用户user1对物品item2的评分为3.75。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值