2022-11-24 11:18:27 +08:00

222 lines
5.5 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

const md5 = require("md5");
const jwt = require("jsonwebtoken");
const { validate } = require("validate.js");
const {
findUserByPageDao,
loginDao,
addUserDao,
deleteUserDao,
findUserByIdDao,
updateUserDao,
findUserByLoginId,
findUserByPointsRankDao,
} = require("../dao/userDao");
const { userRule } = require("./rules");
const { ValidationError } = require("../utils/errors");
const { randomAvatar } = require("../utils/tools");
/**
* 根据分页信息来查询用户
* @returns 返回查询结果
*/
module.exports.findUserByPageService = async function (pager) {
return await findUserByPageDao(pager);
};
/**
* 查询积分前 10 名的用户
*/
module.exports.findUserByPointsRankService = async function () {
return await findUserByPointsRankDao();
};
/**
* 登录的业务逻辑
* @param {*} loginInfo
*/
module.exports.loginService = async function (loginInfo) {
// 1. 首先对用户输入的密码进行加密
loginInfo.loginPwd = md5(loginInfo.loginPwd);
// 2. 接下来调用持久层的方法进行查询
let data = await loginDao(loginInfo);
// 3. 根据查询结果,来决定是否添加 token
if (data) {
// 说明用户填写的账号密码正确
// 接下来需要判断用户的状态
if (!data.enabled) {
// 用户已经被禁用
return {
data: {
_id: data._id,
loginId: data.loginId,
enabled: data.enabled,
},
};
}
// 添加 token
data = {
_id: data._id,
loginId: data.loginId,
enabled: data.enabled,
};
var loginPeriod = 1; // token 的有效时间默认是 1 天
if (loginInfo.remember) {
// 进入此 if说明用户勾选了 7 天有效token 的有效时长就为 7 天
loginPeriod = process.env.LOGIN_PERIOD;
}
// 生成 token
const token = jwt.sign(data, md5(process.env.JWT_SECRET), {
expiresIn: 60 * 60 * 24 * loginPeriod,
});
return {
data,
token,
};
}
// 没有进入上面的 if说明账号密码不正确
return {
data,
};
};
/**
* 用户注册
* @param {*} newUserInfo
* @returns
*/
module.exports.addUserService = async function (newUserInfo) {
console.log("newUserInfo", newUserInfo);
// 首先需要进行验证,验证通过后才能添加至数据库
return validate.async(newUserInfo, userRule).then(
async function () {
// 说明验证成功
// 密码如果传递了就使用传递的密码,否则使用默认值
if (!newUserInfo.loginPwd) {
// 用户没有填写密码,则使用默认值
newUserInfo.loginPwd = md5(process.env.NEW_USER_PASSWORD);
} else {
// 密码加密
newUserInfo.loginPwd = md5(newUserInfo.loginPwd);
}
// 创建时间
newUserInfo.registerDate = new Date().getTime().toString();
// 上次登录时间
newUserInfo.lastLoginDate = newUserInfo.registerDate;
// 初始积分
newUserInfo.points = 100;
// 默认是可用状态
newUserInfo.enabled = true;
if (!newUserInfo.avatar) {
// 如果用户没有上传头像,则使用随机头像
newUserInfo.avatar = await randomAvatar();
}
if (!newUserInfo.nickname) {
// 如果用户没有书写昵称,则使用默认的昵称(默认值 + 时间戳的后 6 位 + 1000 以内随机数)
newUserInfo.nickname =
process.env.NEW_USER_NICKNAME +
newUserInfo.registerDate.split("").reverse().join("").slice(0, 6) +
Math.floor(Math.random() * 1000 + 1);
}
if (!newUserInfo.intro) {
// 个人介绍
newUserInfo.intro = "";
}
if (!newUserInfo.mail) {
// qq
newUserInfo.mail = "";
}
if (!newUserInfo.qq) {
// 邮箱
newUserInfo.qq = "";
}
if (!newUserInfo.wechat) {
// 微信
newUserInfo.wechat = "";
}
return await addUserDao(newUserInfo);
},
function () {
return new ValidationError("数据验证失败");
}
);
};
/**
* 根据 id 删除用户
* @param {*} id
* @returns
*/
module.exports.deleteUserService = async function (id) {
return await deleteUserDao(id);
};
/**
* 根据 id 来查找用户
* @param {*} id
* @returns
*/
module.exports.findUserByIdService = async function (id) {
return await findUserByIdDao(id);
};
/**
* 根据 id 来更新用户信息
* @param {*} id
* @param {*} newInfo
* @returns
*/
module.exports.updateUserService = async function (id, newInfo) {
// 根据 id 获取该用户原来的信息
const userInfo = await findUserByIdDao(id);
if (newInfo.loginPwd && newInfo.loginPwd !== userInfo.loginPwd) {
// 如果传递了密码
// 并且传递过来的的密码和原来的密码不相等,则说明密码变了,需要重新加密
newInfo.loginPwd = md5(newInfo.loginPwd);
}
return await updateUserDao(id, newInfo);
};
/**
*
* @param {*} loginId 用户的登录账号
*/
module.exports.userIsExistService = async function (loginId) {
const data = await findUserByLoginId(loginId);
if (data.length) {
return true;
} else {
return false;
}
};
/**
* 确认用户输入的密码是否正确
* @param {*} param0
* @returns
*/
module.exports.passwordcheckService = async function ({ userId, loginPwd }) {
console.log(userId, "1");
console.log(loginPwd, "2");
const userInfo = await findUserByIdDao(userId);
console.log(userInfo);
if (userInfo.loginPwd === md5(loginPwd)) {
return true;
} else {
return false;
}
};