117 lines
3.8 KiB
JavaScript
117 lines
3.8 KiB
JavaScript
import express from 'express'
|
|
import { permissions, rolePermissions } from '../db/seedAuth.js'
|
|
import { nextId } from '../utils/id.js'
|
|
import { sendOk, sendFail } from '../utils/response.js'
|
|
import { requireAuth } from '../middleware/requireAuth.js'
|
|
|
|
const router = express.Router()
|
|
router.use(requireAuth)
|
|
|
|
function toTreeVo(p) {
|
|
return {
|
|
id: p.id,
|
|
permissionName: p.permissionName,
|
|
permissionCode: p.permissionCode,
|
|
permissionType: p.permissionType,
|
|
parentId: p.parentId,
|
|
level: p.level,
|
|
sortOrder: p.sortOrder,
|
|
icon: p.icon,
|
|
routePath: p.routePath,
|
|
children: [],
|
|
pageResourceList: (p.pageResourcePathList || []).map((path, idx) => ({
|
|
id: p.id * 1000 + idx,
|
|
permissionId: p.id,
|
|
pageResourcePath: path
|
|
})),
|
|
apiResourceList: (p.apiResourcePathList || []).map((path, idx) => ({
|
|
id: p.id * 2000 + idx,
|
|
permissionId: p.id,
|
|
apiResourcePath: path
|
|
}))
|
|
}
|
|
}
|
|
|
|
function buildTree() {
|
|
const sorted = [...permissions].sort((a, b) => (a.sortOrder ?? 0) - (b.sortOrder ?? 0))
|
|
const nodeMap = new Map(sorted.map((p) => [p.id, toTreeVo(p)]))
|
|
const roots = []
|
|
nodeMap.forEach((node) => {
|
|
if (node.parentId && nodeMap.has(node.parentId)) {
|
|
nodeMap.get(node.parentId).children.push(node)
|
|
} else {
|
|
roots.push(node)
|
|
}
|
|
})
|
|
return roots
|
|
}
|
|
|
|
router.get('/tree', (req, res) => {
|
|
sendOk(res, buildTree())
|
|
})
|
|
|
|
router.post('/create', (req, res) => {
|
|
const {
|
|
permissionType,
|
|
permissionName,
|
|
permissionCode,
|
|
parentId,
|
|
level,
|
|
sortOrder,
|
|
icon,
|
|
routePath,
|
|
pageResourcePaths,
|
|
apiResourcePaths
|
|
} = req.body || {}
|
|
if (!permissionName || !permissionCode) return sendFail(res, '权限名称和编码不能为空', 400)
|
|
if (permissions.some((p) => p.permissionCode === permissionCode)) return sendFail(res, '权限编码已存在', 400)
|
|
const id = nextId('permission')
|
|
const permission = {
|
|
id,
|
|
permissionType: permissionType || 'PAGE',
|
|
permissionName,
|
|
permissionCode,
|
|
parentId: parentId || null,
|
|
level: level ?? 0,
|
|
sortOrder: sortOrder ?? 0,
|
|
icon: icon || '',
|
|
routePath: routePath || '',
|
|
pageResourcePathList: pageResourcePaths || [],
|
|
apiResourcePathList: apiResourcePaths || []
|
|
}
|
|
permissions.push(permission)
|
|
sendOk(res, { id, permissionCode }, '创建成功')
|
|
})
|
|
|
|
router.post('/update', (req, res) => {
|
|
const { id, permissionName, permissionCode, parentId, level, sortOrder, icon, routePath, pageResourcePaths, apiResourcePaths } =
|
|
req.body || {}
|
|
const permission = permissions.find((p) => p.id === id)
|
|
if (!permission) return sendFail(res, '权限不存在', 404)
|
|
if (permissionName !== undefined) permission.permissionName = permissionName
|
|
if (permissionCode !== undefined) permission.permissionCode = permissionCode
|
|
if (parentId !== undefined) permission.parentId = parentId
|
|
if (level !== undefined) permission.level = level
|
|
if (sortOrder !== undefined) permission.sortOrder = sortOrder
|
|
if (icon !== undefined) permission.icon = icon
|
|
if (routePath !== undefined) permission.routePath = routePath
|
|
if (pageResourcePaths !== undefined) permission.pageResourcePathList = pageResourcePaths
|
|
if (apiResourcePaths !== undefined) permission.apiResourcePathList = apiResourcePaths
|
|
sendOk(res, true, '更新成功')
|
|
})
|
|
|
|
router.post('/delete', (req, res) => {
|
|
const { id } = req.body || {}
|
|
const index = permissions.findIndex((p) => p.id === id)
|
|
if (index === -1) return sendFail(res, '权限不存在', 404)
|
|
const hasChildren = permissions.some((p) => p.parentId === id)
|
|
if (hasChildren) return sendFail(res, '存在子级权限,不可删除', 400)
|
|
permissions.splice(index, 1)
|
|
for (let i = rolePermissions.length - 1; i >= 0; i -= 1) {
|
|
if (rolePermissions[i].permissionId === id) rolePermissions.splice(i, 1)
|
|
}
|
|
sendOk(res, true, '删除成功')
|
|
})
|
|
|
|
export default router
|