express-用户密码加密

举报
林太白 发表于 2025/12/24 11:10:47 2025/12/24
【摘要】 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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。