明树Git Lab

Commit bc09d118 authored by zfp1's avatar zfp1

update

parent dd3436a3
const errorMessage = require("../utils/errorMessage");
const { Op } = require('sequelize');
async function createDepart(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.Depart.create(body);
return res.sendData(ret);
} catch (error) {
next(error);
}
}
async function updateDepart(req, res, next) {
try {
let body = req.body;
if (!body.id) {
return res.sendError(errorMessage.resourceNotFound)
}
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);
}
}
// sequelize 只有update 写时需要注意条件 不能为空
const ret = await DB.Menu.update(body, { where: { id: body.id } });
return res.sendData(ret);
} catch (error) {
next(error);
}
}
async function listDepart(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.Depart.findAndCountAll(search);
return res.sendData(ret);
} catch (error) {
next(error);
}
}
async function treeDepart(req, res, next) {
try {
let nodes = await DB.Depart.findAll({ where: { del: 0 }, raw: true });
let tree = utils.buildTree(nodes);
return res.sendData(tree);
} catch (error) {
next(error);
}
}
/**
*
* 删除菜单,则此菜单所有子菜单借删除
*/
async function deleteDepart(req, res, next) {
try {
if (!req.body.id) {
return res.sendError(errorMessage.resourceNotFound);
}
let curNode = await DB.Depart.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 getDepart(req, res, next) {
try {
if (!req.body.id) {
return res.sendError(errorMessage.resourceNotFound);
}
const ret = await DB.Depart.findOne({ where: { id: req.body.id }, raw: true });
return res.sendData(ret);
} catch (error) {
next(error);
}
}
module.exports = {
createDepart,
updateDepart,
deleteDepart,
listDepart,
treeDepart,
getDepart,
}
\ No newline at end of file
...@@ -31,6 +31,19 @@ async function updateMenu(req, res, next) { ...@@ -31,6 +31,19 @@ async function updateMenu(req, res, next) {
if (!body.id) { if (!body.id) {
return res.sendError(errorMessage.resourceNotFound) return res.sendError(errorMessage.resourceNotFound)
} }
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);
}
}
// sequelize 只有update 写时需要注意条件 不能为空 // sequelize 只有update 写时需要注意条件 不能为空
const ret = await DB.Menu.update(body, { where: { id: body.id } }); const ret = await DB.Menu.update(body, { where: { id: body.id } });
return res.sendData(ret); return res.sendData(ret);
...@@ -108,7 +121,7 @@ async function getMenu(req, res, next) { ...@@ -108,7 +121,7 @@ async function getMenu(req, res, next) {
if (!req.body.id) { if (!req.body.id) {
return res.sendError(errorMessage.resourceNotFound); return res.sendError(errorMessage.resourceNotFound);
} }
const ret = await DB.User.findOne({ where: { id: req.body.id }, raw: true }); const ret = await DB.Depart.findOne({ where: { id: req.body.id }, raw: true });
return res.sendData(ret); return res.sendData(ret);
} catch (error) { } catch (error) {
next(error); next(error);
......
const errorMessage = require("../utils/errorMessage"); const errorMessage = require("../utils/errorMessage");
const userModule = require('../module/userModule');
async function createRole(req, res, next) { async function createRole(req, res, next) {
try { try {
...@@ -16,6 +17,27 @@ async function updateRole(req, res, next) { ...@@ -16,6 +17,27 @@ async function updateRole(req, res, next) {
if (!body.id) { if (!body.id) {
return res.sendError(errorMessage.resourceNotFound) return res.sendError(errorMessage.resourceNotFound)
} }
let role = await DB.Role.findOne({
where: {del: 0},
raw: true,
include: [
{
model: DB.Menu,
as: 'menus',
where: {del: 0},
attributes: ["id"],
through: { attributes: [] },
}
]
})
if(!(role && role.id)) {
return res.sendError(errorMessage.resourceNotFound);
}
if(body.menus) { //如果这里前端给的是树形结构 需要把它拆成平行,//TODO:
// body.menus = utils.disTree(body.menus);
await userModule.setRoleMenu(role.id, body.menus, role.menus);
delete body.menus;
}
// sequelize 只有update 写时需要注意条件 不能为空 // sequelize 只有update 写时需要注意条件 不能为空
const ret = await DB.Role.update(body, { where: { id: body.id } }); const ret = await DB.Role.update(body, { where: { id: body.id } });
return res.sendData(ret); return res.sendData(ret);
...@@ -64,7 +86,21 @@ async function getRole(req, res, next) { ...@@ -64,7 +86,21 @@ async function getRole(req, res, next) {
if (!req.body.id) { if (!req.body.id) {
return res.sendError(errorMessage.resourceNotFound); return res.sendError(errorMessage.resourceNotFound);
} }
const ret = await DB.User.findOne({ where: { id: req.body.id }, raw: true }); const ret = await DB.Role.findOne({
where: { id: req.body.id }, raw: true ,
include: [
{
model: DB.Menu,
as: 'menus',
where: {del: 0},
// attributes: ["id"],
through: { attributes: [] },
}
]
});
if(ret && ret.menus && ret.menus.length) {
ret.menus = utils.buildTree(ret.menus);
}
return res.sendData(ret); return res.sendData(ret);
} catch (error) { } catch (error) {
next(error); next(error);
...@@ -79,27 +115,7 @@ async function setRoleMenu(req, res, next) { ...@@ -79,27 +115,7 @@ async function setRoleMenu(req, res, next) {
return res.sendError(errorMessage.resourceNotFound); return res.sendError(errorMessage.resourceNotFound);
} }
const rolemenus = await DB.RoleMenu.findAll({where: {roleId: roleId}, raw: true}); const rolemenus = await DB.RoleMenu.findAll({where: {roleId: roleId}, raw: true});
let needAddIds = [], needDelIds = [], dbMenuIds = []; await userModule.setRoleMenu(roleId, menuIds, rolemenus);
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(); return res.sendData();
} catch (error) { } catch (error) {
next(error); next(error);
......
...@@ -44,7 +44,14 @@ async function login(req, res, next) { ...@@ -44,7 +44,14 @@ async function login(req, res, next) {
// attributes: ['id', 'name', 'parentId'], // attributes: ['id', 'name', 'parentId'],
through: { attributes: [] }, through: { attributes: [] },
}] }]
}] }, {
model: DB.Depart,
as: 'departs',
where: { del: 0 },
attributes: ["id", "name"],
through: { attributes: [] },
}
]
}); });
user = user.toJSON(); user = user.toJSON();
if (!user) { if (!user) {
...@@ -76,7 +83,7 @@ async function login(req, res, next) { ...@@ -76,7 +83,7 @@ async function login(req, res, next) {
newRoles.push(element); newRoles.push(element);
} }
user.roles = roles || []; user.roles = roles || [];
user.menus = utils.buildTree(menus); user.menus = utils.buildTree(menus);
return res.sendData(user); return res.sendData(user);
} catch (error) { } catch (error) {
next(error); next(error);
...@@ -94,7 +101,18 @@ async function createUser(req, res, next) { ...@@ -94,7 +101,18 @@ async function createUser(req, res, next) {
const { salt, passwordHash } = utils.saltHashPassword(req.body.password); const { salt, passwordHash } = utils.saltHashPassword(req.body.password);
body.salt = salt; body.salt = salt;
body.password = passwordHash; body.password = passwordHash;
const ret = await DB.User.create(body); const ret = await DB.User.create(body);
if (!(ret && ret.id)) {
return res.sendError(errorMessage.databaseQueryError);
}
//处理部门 角色
body.departs = body.departs || [];
body.roles = body.roles || [];
let userDeparts = body.departs.map(o => { return { userId: ret.id, departId: o && o.id || o } });
let userRoles = body.roles.map(o => { return { userId: ret.id, roleId: o && o.id || o } });
await DB.UserDepart.bulkCreate(userDeparts);
await DB.UserRole.bulkCreate(userRoles);
return res.sendData(ret); return res.sendData(ret);
} catch (error) { } catch (error) {
next(error); next(error);
...@@ -115,12 +133,12 @@ async function getUserInfo(req, res, next) { ...@@ -115,12 +133,12 @@ async function getUserInfo(req, res, next) {
where: query, where: query,
// raw: true, // raw: true,
attributes: { exclude: ['password', 'salt'] }, attributes: { exclude: ['password', 'salt'] },
include: { include: [{
model: DB.Role, model: DB.Role,
as: 'roles', as: 'roles',
where: { del: 0 }, where: { del: 0 },
// attributes: ['id'] // attributes: ['id']
} }]
}); });
return res.sendData(ret); return res.sendData(ret);
} catch (error) { } catch (error) {
...@@ -134,6 +152,40 @@ async function updateUser(req, res, next) { ...@@ -134,6 +152,40 @@ async function updateUser(req, res, next) {
if (!body.id) { if (!body.id) {
return res.sendError(errorMessage.resourceNotFound) return res.sendError(errorMessage.resourceNotFound)
} }
let user = await DB.User.findOne({
where: { id: body.id },
include: [
{
model: DB.Role,
as: 'roles',
where: { del: 0 },
attributes: ["id"],
through: { attributes: [] },
}, {
model: DB.Depart,
as: 'departs',
where: { del: 0 },
attributes: ["id"],
through: { attributes: [] },
}
],
raw: true,
});
if (!(user && user.id)) {
return res.sendError(errorMessage.resourceNotFound);
}
if (body.departs && body.departs.length) {
//跟现有情况对比 确定增删关系
const departIds = body.departs.map(o => {return o && o.id || o});
await userModule.setUserDepart(user.id, departIds, user.departs);
delete body.departs;
}
if (body.roles && body.roles.length) {
//跟现有情况对比 确定增删关系
const roleIds = body.roles.map(o => {return o && o.id || o});
await userModule.setUserRole(user.id, roleIds, user.roles);
delete body.roles;
}
const ret = await DB.User.update(body, { where: { id: body.id } }); const ret = await DB.User.update(body, { where: { id: body.id } });
return res.sendData(ret); return res.sendData(ret);
} catch (error) { } catch (error) {
...@@ -193,29 +245,7 @@ async function setUserRole(req, res, next) { ...@@ -193,29 +245,7 @@ async function setUserRole(req, res, next) {
let { userId, roleIds } = req.body; let { userId, roleIds } = req.body;
//1. 先查被设置用户 有什么角色 //1. 先查被设置用户 有什么角色
const roles = await DB.UserRole.findAll({ where: { userId: req.body.userId }, raw: true, attributes: ['roleId', 'userId'] }); const roles = await DB.UserRole.findAll({ where: { userId: req.body.userId }, raw: true, attributes: ['roleId', 'userId'] });
//需新增得 await userModule.setUserRole(userId, roleIds, roles);
let dbRoleIds = [], needAddRoleIds = [], needDelRoleIds = [];
for (let index = 0; index < roles.length; index++) {
const element = roles[index];
dbRoleIds.push(element.roleId);
if (!roleIds.includes(element.roleId)) {
// 1. roleIds里面没有 但是关系表里有的 需要删除
needDelRoleIds.push(element.roleId);
}
}
for (let index = 0; index < roleIds.length; index++) {
const element = roleIds[index];
if (!dbRoleIds.includes(element)) {
needAddRoleIds.push(element);
}
}
if (needAddRoleIds.length) {
let objs = needAddRoleIds.map(o => { return { userId: userId, roleId: o } });
await DB.UserRole.bulkCreate(objs);
}
if (needDelRoleIds.length) {
await DB.UserRole.destroy({ where: { userId: userId, roleId: { [Op.in]: needDelRoleIds } } });
}
return res.sendData(); return res.sendData();
} catch (error) { } catch (error) {
console.log(error) console.log(error)
......
...@@ -5,8 +5,14 @@ const Role = require("./model/role"); ...@@ -5,8 +5,14 @@ const Role = require("./model/role");
const UserRole = require("./model/userRole"); const UserRole = require("./model/userRole");
const Menu = require("./model/menu"); const Menu = require("./model/menu");
const RoleMenu = require("./model/roleMenu"); const RoleMenu = require("./model/roleMenu");
const Depart = require("./model/depart");
const UserDepart = require("./model/userDepart");
const RequestLog = require("./model/requestLog"); const RequestLog = require("./model/requestLog");
/**
* 业务表
*/
global.DB = { global.DB = {
...@@ -16,6 +22,9 @@ global.DB = { ...@@ -16,6 +22,9 @@ global.DB = {
UserRole, UserRole,
Menu, Menu,
RoleMenu, RoleMenu,
Depart,
UserDepart,
} }
...@@ -54,3 +63,17 @@ Menu.belongsToMany(Role, { ...@@ -54,3 +63,17 @@ Menu.belongsToMany(Role, {
foreignKey: 'menuId', foreignKey: 'menuId',
otherKey: 'roleId' otherKey: 'roleId'
}); });
User.belongsToMany(Depart, {
through: 'system_user_depart', // 中间表名
foreignKey: 'userId', // 用户ID外键
otherKey: 'departId', // 角色ID外键
as: 'departs',
});
Depart.belongsToMany(User, {
through: 'system_user_depart',
foreignKey: 'departId',
otherKey: 'userId',
as: 'users'
});
// models/Depart.js
const { DataTypes } = require('sequelize');
const sequelize = require('./index');
const Depart = sequelize.define('Depart', {
// 定义字段
id: {
type: DataTypes.INTEGER,
primaryKey: true,
autoIncrement: true
},
name: {
type: DataTypes.STRING(50),
allowNull: true
},
parentId: {
type: DataTypes.INTEGER,
},
parentIds: {
type: DataTypes.STRING(500),
},
del: {
type: DataTypes.INTEGER,
defaultValue: 0,
comment: "0 正常 1 删除"
},
}, {
tableName: 'system_depart', // 指定表名(如果与模型名不同)
timestamps: true, // 是否自动添加 createdAt 和 updatedAt 字段(覆盖全局设置)
});
// 同步模型到数据库(创建表)
Depart.sync({
// force: false,
// force: true ,//会删除已存在表并重新创建
// alter: true
})
.then(() => {
console.log('Depart 表同步成功');
});
module.exports = Depart;
\ No newline at end of file
// models/User.js
const { DataTypes } = require('sequelize');
const sequelize = require('./index');
const User = require('./user');
const Depart = require('./depart');
const UserDepart = sequelize.define('UserDepart', {
// 定义字段
id: {
type: DataTypes.INTEGER,
primaryKey: true,
autoIncrement: true
},
userId: {
type: DataTypes.INTEGER,
references: { model: User, key: 'id' }
},
departId: {
type: DataTypes.INTEGER,
references: { model: Depart, key: 'id' }
}
}, {
tableName: 'system_user_depart', // 指定表名(如果与模型名不同)
timestamps: true, // 是否自动添加 createdAt 和 updatedAt 字段(覆盖全局设置)
});
// 同步模型到数据库(创建表)
UserDepart.sync({
// force: false, // force: true 会删除已存在表并重新创建
alter: true
})
.then(() => {
console.log('UserDepart 表同步成功');
});
module.exports = UserDepart;
\ No newline at end of file
/**
*
* @param {*} userId 被设置用户
* @param {*} roleIds 被设置角色
* @param {*} roles 当前已拥有角色
*/
async function setUserRole(userId, roleIds, roles) {
//需新增得
let dbIds = [], needAddIds = [], needDelIds = [];
for (let index = 0; index < roles.length; index++) {
const element = roles[index];
dbIds.push(element.roleId);
if (!roleIds.includes(element.roleId)) {
// 1. roleIds里面没有 但是关系表里有的 需要删除
needDelIds.push(element.roleId);
}
}
for (let index = 0; index < roleIds.length; index++) {
const element = roleIds[index];
if (!dbIds.includes(element)) {
needAddIds.push(element);
}
}
if (needAddIds.length) {
let objs = needAddIds.map(o => { return { userId: userId, roleId: o } });
await DB.UserRole.bulkCreate(objs);
}
if (needDelIds.length) {
await DB.UserRole.destroy({ where: { userId: userId, roleId: { [Op.in]: needDelIds } } });
}
}
/**
*
* @param {*} userId 被设置用户
* @param {*} departIds 被设置部门
* @param {*} departs 当前已拥有部门
*/
async function setUserDepart(userId, departIds, departs) {
//需新增得
let dbIds = [], needAddIds = [], needDelIds = [];
for (let index = 0; index < departs.length; index++) {
const element = departs[index];
dbIds.push(element.roleId);
if (!departIds.includes(element.roleId)) {
// 1. departIds里面没有 但是关系表里有的 需要删除
needDelIds.push(element.roleId);
}
}
for (let index = 0; index < departIds.length; index++) {
const element = departIds[index];
if (!dbIds.includes(element)) {
needAddIds.push(element);
}
}
if (needAddIds.length) {
let objs = needAddIds.map(o => { return { userId: userId, roleId: o } });
await DB.UserRole.bulkCreate(objs);
}
if (needDelIds.length) {
await DB.UserRole.destroy({ where: { userId: userId, roleId: { [Op.in]: needDelIds } } });
}
}
/**
*
* @param {*} roleId 被设置角色
* @param {*} menuIds 被设置的菜单id
* @param {*} rolemenus 角色已有的菜单
*/
async function setRoleMenu(roleId, menuIds, rolemenus) {
menuIds = menuIds.map(o => {return o && o.id || o});
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 } } });
}
}
module.exports = {
setUserRole,
setUserDepart,
setRoleMenu,
}
\ No newline at end of file
...@@ -6,6 +6,7 @@ const router = express.Router(); ...@@ -6,6 +6,7 @@ const router = express.Router();
const userController = require('../controller/userController'); const userController = require('../controller/userController');
const roleController = require('../controller/roleController'); const roleController = require('../controller/roleController');
const menuController = require('../controller/menuController'); const menuController = require('../controller/menuController');
const departController = require('../controller/departController');
/** /**
* 用户 * 用户
...@@ -42,4 +43,15 @@ router.post('/menu/listMenu', menuController.listMenu); ...@@ -42,4 +43,15 @@ router.post('/menu/listMenu', menuController.listMenu);
router.post('/menu/treeMenu', menuController.treeMenu); router.post('/menu/treeMenu', menuController.treeMenu);
router.post('/menu/getMenu', menuController.getMenu); router.post('/menu/getMenu', menuController.getMenu);
/**
* 部门
*/
router.post('/depart/createDepart', departController.createDepart);
router.post('/depart/updateDepart', departController.updateDepart);
router.post('/depart/deleteDepart', departController.deleteDepart);
router.post('/depart/listDepart', departController.listDepart);
router.post('/depart/treeDepart', departController.treeDepart);
router.post('/depart/getDepart', departController.getDepart);
module.exports = router; module.exports = router;
\ No newline at end of file
...@@ -52,20 +52,20 @@ app.use(function(req, res, next) { ...@@ -52,20 +52,20 @@ app.use(function(req, res, next) {
app.use(function (err, req, res, next) { app.use(function (err, req, res, next) {
console.log(err) console.log(err)
// 记录下错误日志 // 记录下错误日志
// requestLogModule.createRequestLog({ requestLogModule.createRequestLog({
// url: req.path, url: req.path,
// params: JSON.stringify({ params: JSON.stringify({
// ...req.body, ...req.body,
// ...req.query, ...req.query,
// ...req.params, ...req.params,
// }), }),
// user: JSON.stringify(req.user), user: JSON.stringify(req.user),
// status: err.status || err.code || 500, status: err.status || err.code || 500,
// msg: err.message || 'server error' msg: err.message || 'server error'
// }); });
// if(err.code && err.message) { if(err.code && err.message) {
// return res.sendError(err); return res.sendError(err);
// } }
return res.status(err.status || 500).send({code: err.status ||500, msg: err.message || 'server error'}); return res.status(err.status || 500).send({code: err.status ||500, msg: err.message || 'server error'});
}); });
......
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