143 lines
3.9 KiB
TypeScript
143 lines
3.9 KiB
TypeScript
import BaseController from '../common/base.controller'
|
|
|
|
export class RouterData {
|
|
target?: any
|
|
method?: string
|
|
path?: string
|
|
fun?: Function
|
|
}
|
|
|
|
export class RouterMap {
|
|
static decoratedRouters: Map<
|
|
Function,
|
|
{
|
|
roles?: string[]
|
|
permissions?: string[][]
|
|
data?: RouterData[]
|
|
depts?: string[]
|
|
}
|
|
> = new Map()
|
|
}
|
|
|
|
export function router(route?: string) {
|
|
return (target: BaseController, name: string, value: PropertyDescriptor) => {
|
|
if (!route) {
|
|
const controller = target.constructor.name
|
|
const controllerName = controller.toLowerCase().replace('.controller', '')
|
|
route = 'all ' + ['', controllerName, name].join('/')
|
|
}
|
|
const split = route.split(' ')
|
|
if (split.length > 2) {
|
|
throw new Error('路由中只允许一个空格')
|
|
}
|
|
const [method, path] = split
|
|
// @ts-ignore
|
|
const key = target[name]
|
|
let routerData = new RouterData()
|
|
routerData.target = target
|
|
routerData.method = method
|
|
routerData.path = path
|
|
// @ts-ignore
|
|
routerData.fun = target[name]
|
|
|
|
if (RouterMap.decoratedRouters.has(key)) {
|
|
let objCurrent = RouterMap.decoratedRouters.get(key)
|
|
if (!objCurrent.data) {
|
|
objCurrent.data = [routerData]
|
|
} else {
|
|
objCurrent.data.push(routerData)
|
|
}
|
|
// @ts-ignore
|
|
RouterMap.decoratedRouters.set(target[name], objCurrent)
|
|
} else {
|
|
let routerObj = {
|
|
data: [routerData],
|
|
}
|
|
// @ts-ignore
|
|
RouterMap.decoratedRouters.set(target[name], routerObj)
|
|
}
|
|
}
|
|
}
|
|
|
|
export function role(roles?: string | string[]) {
|
|
return (target: BaseController, name: string, value: PropertyDescriptor) => {
|
|
let roleList: string[] = []
|
|
if (roles) {
|
|
if (Array.isArray(roles)) {
|
|
roleList = roles
|
|
} else {
|
|
roleList = [roles]
|
|
}
|
|
}
|
|
// @ts-ignore
|
|
const key = target[name]
|
|
let roleObj = { roles: roleList }
|
|
if (RouterMap.decoratedRouters.has(key)) {
|
|
let objCurrent = RouterMap.decoratedRouters.get(key)
|
|
Object.assign(objCurrent, roleObj)
|
|
// @ts-ignore
|
|
RouterMap.decoratedRouters.set(target[name], objCurrent)
|
|
} else {
|
|
// @ts-ignore
|
|
RouterMap.decoratedRouters.set(target[name], roleObj)
|
|
}
|
|
}
|
|
}
|
|
|
|
export function permission(permissions?: string | string[]) {
|
|
return (target: BaseController, name: string, value: PropertyDescriptor) => {
|
|
let permissionList: string[][] = [[]]
|
|
if (permissions) {
|
|
if (Array.isArray(permissions)) {
|
|
let arr = []
|
|
for (let sub of permissions) {
|
|
arr.push(sub.split(':'))
|
|
}
|
|
permissionList = arr
|
|
} else {
|
|
permissionList = [permissions.split(':')]
|
|
}
|
|
}
|
|
// @ts-ignore
|
|
const key = target[name]
|
|
let permissionObj = { permissions: permissionList }
|
|
if (RouterMap.decoratedRouters.has(key)) {
|
|
let objCurrent = RouterMap.decoratedRouters.get(key)
|
|
Object.assign(objCurrent, permissionObj)
|
|
// @ts-ignore
|
|
RouterMap.decoratedRouters.set(target[name], objCurrent)
|
|
} else {
|
|
// @ts-ignore
|
|
RouterMap.decoratedRouters.set(target[name], permissionObj)
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 有dept修饰器的, 需要验证部门id是否存在
|
|
*/
|
|
export function dept(depts?: string | string[]) {
|
|
return (target: BaseController, name: string, value: PropertyDescriptor) => {
|
|
let deptList: string[] = []
|
|
if (depts) {
|
|
if (Array.isArray(depts)) {
|
|
deptList = depts
|
|
} else {
|
|
deptList = [depts]
|
|
}
|
|
}
|
|
// @ts-ignore
|
|
const key = target[name]
|
|
let deptObj = { depts: deptList }
|
|
if (RouterMap.decoratedRouters.has(key)) {
|
|
let objCurrent = RouterMap.decoratedRouters.get(key)
|
|
Object.assign(objCurrent, deptObj)
|
|
// @ts-ignore
|
|
RouterMap.decoratedRouters.set(target[name], objCurrent)
|
|
} else {
|
|
// @ts-ignore
|
|
RouterMap.decoratedRouters.set(target[name], deptObj)
|
|
}
|
|
}
|
|
}
|