Hair Keeper v1.0.0:一个高度集成、深度定制、约定优于配置的全栈Web应用模板,旨在保持灵活性的同时提供一套基于成熟架构的开发底座,自带身份认证、权限控制、丰富前端组件、文件上传、后台任务、智能体开发等丰富功能,提供AI开发辅助,免于纠结功能如何实现,可快速上手专注于业务逻辑

This commit is contained in:
2025-11-13 15:24:54 +08:00
commit 42be39b343
249 changed files with 38843 additions and 0 deletions

View File

@@ -0,0 +1,58 @@
// 权限常量列表
// 每个权限标识一个功能点,用于前后端一致的权限控制
export const Permissions = {
USER_MANAGE: '用户管理',
// SUPER_ADMIN_ONLY: '超级管理员' // 该权限不能被授权,因此注释掉,但在项目中统一用"SUPER_ADMIN_ONLY"表示超级管理员权限
} as const;
export type Permission = typeof Permissions[keyof typeof Permissions];
export const ALL_PERMISSIONS: Permission[] = Object.values(Permissions);
// 判断用户权限列表是否满足表达式,如 "A&B|(C&D)"
export function evaluatePermissionExpression(
expr: string,
userPermissions: string[]
): boolean {
if (!expr || expr.trim() === '') { // expr为空、null或者undefined都返回true
return true;
}
// 分词
const tokens: string[] = []
const regex = /(\&|\||\(|\))/
expr.split(regex).map(s => s.trim()).filter(s => s).forEach(tok => tokens.push(tok))
let pos = 0
function parseExpr(): boolean {
let value = parseTerm()
while (tokens[pos] === '|') {
pos++
value = value || parseTerm()
}
return value
}
function parseTerm(): boolean {
let value = parseFactor()
while (tokens[pos] === '&') {
pos++
value = value && parseFactor()
}
return value
}
function parseFactor(): boolean {
const tok = tokens[pos++]
if (tok === '(') {
const value = parseExpr()
if (tokens[pos] === ')') pos++
return value
}
// 普通权限名
return userPermissions.includes(tok)
}
try {
return parseExpr()
} catch {
return false
}
}