express-用户密码加密
【摘要】 express-用户密码加密
outline: deep
express-用户密码加密
之前这里我们没进行密码的加密,这里我们就统一完善一下
安装bcrypt
npm i bcrypt
使用bcrypt
加密密码
只需要将我们加密的部分给更改一下
// 加密密码
const bcrypt = require('bcrypt');
// 加密密码
const hashed_pwd = bcrypt.hash(password, PASSWORD_SECURITY_LENGTH);
const values = [name, username, hashed_pwd];
注册测试,这个时候我们已经可以看到我们加密以后的密码了
校验密码
更改一下我们对于密码的校验部分,测试一下,这个时候已经ok了
const isValidPassword = bcrypt.compare(password, results[0].password);
if(isValidPassword){}
菜单路由接口
菜单数据结构的转变
之前我们的菜单结构都是直接返回所有的菜单数据,接下来我们在Express之中将我们的菜单数据结构进行转化,转化为我们想要的树结构的数据
{
"menu_id": 1,
"menu_name": "系统管理",
"parent_id": 0,
"order_num": 1,
"path": "system",
"component": null,
"query": "",
"is_frame": 1,
"is_cache": 0,
"menu_type": "M",
"visible": "1",
"status": "0",
"perms": "",
"icon": "system",
"create_by": "admin",
"create_time": "2024-05-28T05:43:38.000Z",
"update_by": "",
"update_time": null,
"remark": "系统管理目录"
}
转换为下面这种结构,这个时候完善一下我们方法即可
{
"id": 1,
"name": "系统管理",
"path": "/system",
"hidden": false,
"component": null,
"meta": {
"title": "系统管理",
"icon": "system",
"no_cache": false,
"link": null,
"show": false
},
"children": [
{
"id": 100,
"name": "用户管理",
"path": "/user",
"hidden": true,
"component": "system/user/index",
"meta": {
"title": "用户管理",
"icon": "user",
"no_cache": false,
"link": null,
"show": true
},
"children": []
},
]
}
转树方法
// 扁平化菜单转树形结构
function buildMenuTree(menus) {
// 创建菜单映射
const menuMap = new Map();
const rootMenus = [];
// 第一遍:创建所有菜单节点
menus.forEach(menu => {
menuMap.set(menu.menu_id, {
id: menu.menu_id,
name: menu.menu_name,
path: "/" + menu.path,
hidden: menu.menu_type !== "M",
component: menu.component,
meta: {
title: menu.menu_name,
icon: menu.icon,
no_cache: menu.is_cache === 1,
link: menu.query ? (query => query.trim() ? query : null)(menu.query) : null,
show: menu.visible === "0" // "0" 显示 "1" 隐藏
},
children: []
});
});
// 第二遍:构建树形结构
menus.forEach(menu => {
const node = menuMap.get(menu.menu_id);
if (menu.parent_id === 0) {
// 根节点
rootMenus.push(node);
} else {
// 子节点
const parent = menuMap.get(menu.parent_id);
if (parent) {
parent.children.push(node);
}
}
});
// 对菜单进行排序
function sortMenus(menus) {
menus.sort((a, b) => {
const aMenu = menus.find(m => m.id === a.id);
const bMenu = menus.find(m => m.id === b.id);
return (aMenu?.order_num || 0) - (bMenu?.order_num || 0);
});
menus.forEach(menu => {
if (menu.children && menu.children.length > 0) {
sortMenus(menu.children);
}
});
}
// 获取原始菜单数据用于排序
function findMenu(id) {
return menus.find(m => m.menu_id === id);
}
// 改进的排序函数
function improvedSortMenus(menuList) {
menuList.sort((a, b) => {
const aMenu = findMenu(a.id);
const bMenu = findMenu(b.id);
return (aMenu?.order_num || 0) - (bMenu?.order_num || 0);
});
menuList.forEach(menu => {
if (menu.children && menu.children.length > 0) {
improvedSortMenus(menu.children);
}
});
}
// 执行排序
improvedSortMenus(rootMenus);
return rootMenus;
}
module.exports = {
// 菜单结构 扁平 => 树结构
buildMenuTree,
};
使用方法,测试一下,这个时候我们的数据已经ok了
data:buildMenuTree(result), // 返回菜单信息
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)