明树Git Lab

Commit dd3436a3 authored by zfp1's avatar zfp1

update

parent ead0be59
const errorMessage = require("../utils/errorMessage");
const { Op } = require('sequelize');
async function createMenu(req, res, next) {
try {
const body = req.body;
if (body.parentId) {
//查父节点
let parendNode = await DB.Menu.findOne({ where: { id: body.parentId }, raw: true, attributes: ['parentIds'] });
if (!parendNode) {
return res.sendError(errorMessage.resourceNotFound);
}
if (parendNode.parentIds) {
body.parentIds = parendNode.parentIds + "," + String(body.parentId);
} else {
body.parentIds = String(body.parentId);
}
}
const ret = await DB.Menu.create(body);
return res.sendData(ret);
} catch (error) {
next(error);
}
}
async function updateMenu(req, res, next) {
try {
let body = req.body;
if (!body.id) {
return res.sendError(errorMessage.resourceNotFound)
}
// sequelize 只有update 写时需要注意条件 不能为空
const ret = await DB.Menu.update(body, { where: { id: body.id } });
return res.sendData(ret);
} catch (error) {
next(error);
}
}
async function listMenu(req, res, next) {
try {
let search = { where: { del: 0 } };
let page = req.body.page || 1;
let limit = req.body.pageSize || 10;
let offset = (page - 1) * limit;
if (req.body.name) {
search.where = {
[Op.or]: [
{ name: { [Op.like]: `%${req.body.name}%` } }
],
del: 0,
}
}
search.limit = limit;
search.offset = offset;
let ret = await DB.Menu.findAndCountAll(search);
return res.sendData(ret);
} catch (error) {
next(error);
}
}
async function treeMenu(req, res, next) {
try {
let nodes = await DB.Menu.findAll({ where: { del: 0 }, raw: true });
let tree = utils.buildTree(nodes);
return res.sendData(tree);
} catch (error) {
next(error);
}
}
/**
*
* 删除菜单,则此菜单所有子菜单借删除
*/
async function deleteMenu(req, res, next) {
try {
if (!req.body.id) {
return res.sendError(errorMessage.resourceNotFound);
}
let curNode = await DB.Menu.findOne({ where: { id: req.body.id } });
if (!(curNode && curNode.id)) {
return res.sendError(errorMessage.resourceNotFound);
}
let parStr = curNode.parentIds ? `${curNode.parentIds},${curNode.id}` : curNode.id;
const ret = await DB.Menu.update(
{ del: 1 },
{
where: {
[Op.or]: [
{ parentIds: { [Op.startsWith]: parStr } },
{ id: curNode.id }
]
}
});
return res.sendData(ret);
} catch (error) {
next(error);
}
}
async function getMenu(req, res, next) {
try {
if (!req.body.id) {
return res.sendError(errorMessage.resourceNotFound);
}
const ret = await DB.User.findOne({ where: { id: req.body.id }, raw: true });
return res.sendData(ret);
} catch (error) {
next(error);
}
}
module.exports = {
createMenu,
getMenu,
listMenu,
updateMenu,
deleteMenu,
treeMenu,
}
\ No newline at end of file
......@@ -38,7 +38,7 @@ async function deleteRole(req, res, next) {
async function listRole(req, res, next) {
try {
let search = {};
let search = {where: {del: 0}};
let page = req.body.page || 1;
let limit = req.body.pageSize || 10;
let offset = (page - 1) * limit;
......@@ -72,11 +72,46 @@ async function getRole(req, res, next) {
}
async function setRoleMenu(req, res, next) {
try {
const {roleId, menuIds} = req.body;
if(!roleId) {
return res.sendError(errorMessage.resourceNotFound);
}
const rolemenus = await DB.RoleMenu.findAll({where: {roleId: roleId}, raw: true});
let needAddIds = [], needDelIds = [], dbMenuIds = [];
for (let index = 0; index < rolemenus.length; index++) {
const element = rolemenus[index];
dbMenuIds.push(element.menuId);
if(!(menuIds.includes(element.menuId))) {
needDelIds.push(element.menuId);
}
}
for (let index = 0; index < menuIds.length; index++) {
const element = menuIds[index];
if(!(dbMenuIds.includes(element))) {
needAddIds.push(element);
}
}
if(needAddIds.length) {
let objs = needAddIds.map(o => {return {roleId, menuId: o}});
await DB.RoleMenu.bulkCreate(objs);
}
if(needDelIds.length) {
await DB.RoleMenu.destroy({where: {roleId, menuId: {[Op.in]: needDelIds}}});
}
return res.sendData();
} catch (error) {
next(error);
}
}
module.exports = {
getRole,
createRole,
listRole,
updateRole,
deleteRole
deleteRole,
setRoleMenu,
}
\ No newline at end of file
......@@ -31,12 +31,20 @@ async function login(req, res, next) {
const { mobile, password } = req.body;
let user = await DB.User.findOne({
where: { mobile, del: 0, enable: 0 },
include: {
include: [{
model: DB.Role,
as: 'roles',
where: { del: 0 },
attributes: {exclude: ['system_user_role']}
}
attributes: ["id", "name"],
through: { attributes: [] },
include: [{
model: DB.Menu,
as: 'menus',
// where: { del: 0 },
// attributes: ['id', 'name', 'parentId'],
through: { attributes: [] },
}]
}]
});
user = user.toJSON();
if (!user) {
......@@ -56,11 +64,20 @@ async function login(req, res, next) {
user.token = token.split('-').join("");
let userStr = JSON.stringify(user);
await ioRedis.set(`token:${user.token}`, userStr, 'EX', sysConfig.tokenEx);
let ret = _.omit(user, ['password', 'salt']);
user = _.omit(user, ['password', 'salt']);
// let menus = await userModule.getRoleMenus(ret.roles, user.mobile);
// ret.menus = menus;
return res.sendData(ret);
//处理菜单
const roles = user.roles || [];
let newRoles = [], menus = [];
for (let index = 0; index < roles.length; index++) {
const element = roles[index];
menus = menus.concat(element.menus);
delete element.menus;
newRoles.push(element);
}
user.roles = roles || [];
user.menus = utils.buildTree(menus);
return res.sendData(user);
} catch (error) {
next(error);
}
......@@ -127,7 +144,7 @@ async function updateUser(req, res, next) {
async function listUser(req, res, next) {
try {
let search = {};
let search = { where: { del: 0 } };
let page = req.body.page || 1;
let limit = req.body.pageSize || 10;
let offset = (page - 1) * limit;
......@@ -175,15 +192,15 @@ async function setUserRole(req, res, next) {
try {
let { userId, roleIds } = req.body;
//1. 先查被设置用户 有什么角色
const roles = await DB.UserRole.findAll({ where: { user_id: req.body.userId }, raw: true, attributes: ['role_id', 'user_id'] });
const roles = await DB.UserRole.findAll({ where: { userId: req.body.userId }, raw: true, attributes: ['roleId', 'userId'] });
//需新增得
let dbRoleIds = [], needAddRoleIds = [], needDelRoleIds = [];
for (let index = 0; index < roles.length; index++) {
const element = roles[index];
dbRoleIds.push(element.role_id);
if (!roleIds.includes(element.role_id)) {
dbRoleIds.push(element.roleId);
if (!roleIds.includes(element.roleId)) {
// 1. roleIds里面没有 但是关系表里有的 需要删除
needDelRoleIds.push(element.role_id);
needDelRoleIds.push(element.roleId);
}
}
for (let index = 0; index < roleIds.length; index++) {
......@@ -193,11 +210,11 @@ async function setUserRole(req, res, next) {
}
}
if (needAddRoleIds.length) {
let objs = needAddRoleIds.map(o => { return { user_id: userId, role_id: o } });
let objs = needAddRoleIds.map(o => { return { userId: userId, roleId: o } });
await DB.UserRole.bulkCreate(objs);
}
if (needDelRoleIds.length) {
await DB.UserRole.destroy({ where: { user_id: userId, role_id: { [Op.in]: needDelRoleIds } } });
await DB.UserRole.destroy({ where: { userId: userId, roleId: { [Op.in]: needDelRoleIds } } });
}
return res.sendData();
} catch (error) {
......
......@@ -14,6 +14,7 @@ global.DB = {
RequestLog,
Role,
UserRole,
Menu,
RoleMenu,
}
......@@ -23,32 +24,33 @@ global.DB = {
/**
* 关联关系定义
*/
User.hasMany(RequestLog, { foreignKey: 'user_id' });
User.hasMany(RequestLog, { foreignKey: 'userId' });
RequestLog.belongsTo(User, { foreignKey: 'user_id' });
RequestLog.belongsTo(User, { foreignKey: 'userId' });
User.belongsToMany(Role, {
through: 'system_user_role', // 中间表名
foreignKey: 'user_id', // 用户ID外键
otherKey: 'role_id', // 角色ID外键
foreignKey: 'userId', // 用户ID外键
otherKey: 'roleId', // 角色ID外键
as: 'roles',
});
Role.belongsToMany(User, {
through: 'system_user_role',
foreignKey: 'role_id',
otherKey: 'user_id',
foreignKey: 'roleId',
otherKey: 'userId',
as: 'users'
});
Role.belongsToMany(Menu, {
through: 'systen_role_menu',
foreignKey: 'role_id',
otherKey: 'menu_id'
through: 'system_role_menu',
foreignKey: 'roleId',
otherKey: 'menuId',
as: 'menus'
});
Menu.belongsToMany(Role, {
through: 'systen_role_menu',
foreignKey: 'menu_id',
otherKey: 'role_id'
through: 'system_role_menu',
foreignKey: 'menuId',
otherKey: 'roleId'
});
......@@ -16,13 +16,11 @@ const Menu = sequelize.define('Menu', {
level: DataTypes.INTEGER,
url: {
type: DataTypes.STRING,
unique: true,
comment: "菜单唯一标识"
comment: "地址"
},
key: {
type: DataTypes.STRING,
unique: true,
comment: "按钮唯一标识",
comment: "唯一标识",
},
order: {
type: DataTypes.INTEGER,
......@@ -30,24 +28,31 @@ const Menu = sequelize.define('Menu', {
},
parent_id: {
parentId: {
type: DataTypes.INTEGER,
default: null,
},
parentIds: {
type: DataTypes.STRING(500),
default: "",
},
type: {
type: DataTypes.INTEGER,
comment: "类型: 1. 菜单, 2. 按钮",
default: 1
},
enable: {
type: DataTypes.BOOLEAN,
defaultValue: true,
comment: "true: 启用, false: 不启用"
// enable: {
// type: DataTypes.INTEGER,
// defaultValue: 0,
// comment: "0: 启用, 1: 不启用"
// },
del: {
type: DataTypes.INTEGER,
defaultValue: 0,
comment: "0 正常 1 删除"
},
}, {
tableName: 'system_menu', // 指定表名(如果与模型名不同)
timestamps: true, // 是否自动添加 createdAt 和 updatedAt 字段(覆盖全局设置)
......@@ -55,7 +60,7 @@ const Menu = sequelize.define('Menu', {
// 同步模型到数据库(创建表)
Menu.sync({
force: false, // force: true 会删除已存在表并重新创建
// force: false, // force: true 会删除已存在表并重新创建
// alter: true
})
.then(() => {
......
......@@ -13,7 +13,7 @@ const RequestLog = sequelize.define('User', {
type: DataTypes.STRING,
comment: "给每一个请求分配一个id"
},
user_id: {
userId: {
type: DataTypes.INTEGER,
comment:"关联查询用"
},
......
......@@ -35,7 +35,7 @@ const Role = sequelize.define('Role', {
// 同步模型到数据库(创建表)
Role.sync({
// force: false, // force: true 会删除已存在表并重新创建
alter: true
// alter: true
})
.then(() => {
console.log('Role 表同步成功');
......
......@@ -11,11 +11,11 @@ const RoleMenu = sequelize.define('RoleMenu', {
primaryKey: true,
autoIncrement: true
},
menu_id: {
menuId: {
type: DataTypes.INTEGER,
references: { model: Menu, key: 'id' }
},
role_id: {
roleId: {
type: DataTypes.INTEGER,
references: { model: Role, key: 'id' }
}
......@@ -27,7 +27,7 @@ const RoleMenu = sequelize.define('RoleMenu', {
// 同步模型到数据库(创建表)
RoleMenu.sync({
// force: false, // force: true 会删除已存在表并重新创建
// alter: true
alter: true
})
.then(() => {
console.log('RoleMenu 表同步成功');
......
......@@ -11,11 +11,11 @@ const UserRole = sequelize.define('UserRole', {
primaryKey: true,
autoIncrement: true
},
user_id: {
userId: {
type: DataTypes.INTEGER,
references: { model: User, key: 'id' }
},
role_id: {
roleId: {
type: DataTypes.INTEGER,
references: { model: Role, key: 'id' }
}
......
const express = require('express');
const router = express.Router();
const userController = require('../controller/userController');
router.post('/regist', userController.regist);
router.post('/login', userController.login);
\ No newline at end of file
......@@ -5,8 +5,11 @@ const router = express.Router();
const userController = require('../controller/userController');
const roleController = require('../controller/roleController');
const menuController = require('../controller/menuController');
/**
* 用户
*/
router.post('/regist', userController.regist);
router.post('/login', userController.login);
router.post('/manage/listUser', userController.listUser);
......@@ -26,9 +29,17 @@ router.post('/role/updateRole', roleController.updateRole);
router.post('/role/deleteRole', roleController.deleteRole);
router.post('/role/listRole', roleController.listRole);
router.post('/role/getRole', roleController.getRole);
router.post('/role/setRoleMenu', roleController.setRoleMenu);
/**
* 菜单
*/
router.post('/menu/createMenu', menuController.createMenu);
router.post('/menu/updateMenu', menuController.updateMenu);
router.post('/menu/deleteMenu', menuController.deleteMenu);
router.post('/menu/listMenu', menuController.listMenu);
router.post('/menu/treeMenu', menuController.treeMenu);
router.post('/menu/getMenu', menuController.getMenu);
module.exports = router;
\ No newline at end of file
......@@ -50,7 +50,7 @@ app.use(function(req, res, next) {
// error handler
app.use(function (err, req, res, next) {
console.log(err.code, err.status)
console.log(err)
// 记录下错误日志
// requestLogModule.createRequestLog({
// url: req.path,
......
......@@ -30,23 +30,23 @@ function checkUserPassword({ reqPw, salt, userPw }) {
function buildTree(nodes) {
// 创建一个映射,将节点ID映射到节点对象
const nodeMap = new Map(nodes.map(node => [String(node._id), { ...node, children: [] }]));
const nodeMap = new Map(nodes.map(node => [String(node.id), { ...node, children: [] }]));
// 遍历所有节点,并将它们添加到对应父节点的children数组中
nodes.forEach(node => {
const parent_id = String(node.parent_id);
if (parent_id !== null) {
const parentId = String(node.parentId);
if (parentId !== null) {
// 确保父节点在映射中存在
if (nodeMap.has(parent_id)) {
if (nodeMap.has(parentId)) {
// 将当前节点添加到父节点的children数组中
nodeMap.get(parent_id).children.push(nodeMap.get(String(node._id)));
nodeMap.get(parent_id).children = _.orderBy(nodeMap.get(parent_id).children, 'order')
nodeMap.get(parentId).children.push(nodeMap.get(String(node.id)));
nodeMap.get(parentId).children = _.orderBy(nodeMap.get(parentId).children, 'order')
}
}
});
// 从映射中提取顶级节点(parent_id为null)
return _.orderBy(Array.from(nodeMap.values()).filter(node => node.parent_id === null), 'order');
// 从映射中提取顶级节点(parentId为null)
return _.orderBy(Array.from(nodeMap.values()).filter(node => node.parentId === null), 'order');
}
function disTree(tree) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment