162 lines
4.2 KiB
JavaScript
162 lines
4.2 KiB
JavaScript
const md5 = require("md5");
|
||
const jwt = require("jsonwebtoken");
|
||
const { validate } = require("validate.js");
|
||
const {
|
||
findAllAdminDao,
|
||
loginDao,
|
||
addAdminDao,
|
||
deleteAdminDao,
|
||
findAdminByIdDao,
|
||
updateAdminDao,
|
||
findAdminByLoginId
|
||
} = require("../dao/adminDao");
|
||
const { adminRule } = require("./rules");
|
||
const { ValidationError } = require("../utils/errors");
|
||
const { randomAvatar } = require("../utils/tools");
|
||
|
||
/**
|
||
* 查询所有的管理员的业务逻辑
|
||
* @returns 返回查询结果
|
||
*/
|
||
module.exports.findAllAdminService = async function () {
|
||
return await findAllAdminDao();
|
||
};
|
||
|
||
/**
|
||
* 登录的业务逻辑
|
||
* @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 {*} newAdminInfo
|
||
* @returns
|
||
*/
|
||
module.exports.addAdminService = async function (newAdminInfo) {
|
||
// 首先需要进行验证,验证通过后才能添加至数据库
|
||
return validate.async(newAdminInfo, adminRule).then(
|
||
async function () {
|
||
// success
|
||
// 说明验证成功
|
||
|
||
// 密码如果传递了就使用传递的密码,否则使用默认值
|
||
if (!newAdminInfo.loginPwd) {
|
||
// 用户没有填写密码,则使用默认值
|
||
newAdminInfo.loginPwd = md5(process.env.NEW_ADMIN_PASSWORD);
|
||
} else {
|
||
newAdminInfo.loginPwd = md5(newAdminInfo.loginPwd);
|
||
}
|
||
|
||
if (!newAdminInfo.avatar) {
|
||
// 如果用户没有上传头像,则使用随机头像
|
||
newAdminInfo.avatar = await randomAvatar();
|
||
}
|
||
if (!newAdminInfo.nickname) {
|
||
// 如果用户没有书写昵称,则使用默认的管理员昵称
|
||
newAdminInfo.nickname = process.env.NEW_ADMIN_NICKNAME;
|
||
}
|
||
// 默认是可用状态
|
||
newAdminInfo.enabled = true;
|
||
|
||
return await addAdminDao(newAdminInfo);
|
||
},
|
||
function () {
|
||
return new ValidationError("数据验证失败");
|
||
}
|
||
);
|
||
};
|
||
|
||
/**
|
||
* 根据 id 删除管理员
|
||
* @param {*} id
|
||
* @returns
|
||
*/
|
||
module.exports.deleteAdminService = async function (id) {
|
||
return await deleteAdminDao(id);
|
||
};
|
||
|
||
/**
|
||
* 根据 id 来查找管理员
|
||
* @param {*} id
|
||
* @returns
|
||
*/
|
||
module.exports.findAdminByIdService = async function (id) {
|
||
return await findAdminByIdDao(id);
|
||
};
|
||
|
||
/**
|
||
* 根据 id 来更新管理员信息
|
||
* @param {*} id
|
||
* @param {*} newInfo
|
||
* @returns
|
||
*/
|
||
module.exports.updateAdminService = async function (id, newInfo) {
|
||
// 根据 id 获取该管理员原来的信息(主要是为了处理密码)
|
||
const adminInfo = await findAdminByIdDao(id);
|
||
if (newInfo.loginPwd && newInfo.loginPwd !== adminInfo.loginPwd) {
|
||
// 如果传递了密码
|
||
// 并且传递过来的的密码和原来的密码不相等,则说明密码变了,需要重新加密
|
||
newInfo.loginPwd = md5(newInfo.loginPwd);
|
||
}
|
||
return await updateAdminDao(id, newInfo);
|
||
};
|
||
|
||
/**
|
||
*
|
||
* @param {*} loginId 管理员的登录账号
|
||
*/
|
||
module.exports.adminIsExistService = async function (loginId) {
|
||
const data = await findAdminByLoginId(loginId);
|
||
if (data.length) {
|
||
return true;
|
||
} else {
|
||
return false;
|
||
}
|
||
};
|