feat: Hair Keeper v1.1.0 版本更新
本次更新包含以下主要改进: ## 新功能 - 添加quickstart.sh脚本帮助用户快速使用模板项目 - 添加simple_deploy.sh便于部署 - 新增院系管理功能(DeptAdmin),支持增删改查院系管理员信息 - 用户可以在header中切换管理的院系 - 添加zustand全局状态管理 - 添加DEFAULT_USER_PASSWORD环境变量,作为创建用户时的默认密码 - 添加p-limit库和DB_PARALLEL_LIMIT环境变量控制数据库批次操作并发数 ## 安全修复 - 修复Next.js CVE-2025-66478漏洞 - 限制只有超级管理员才能创建超级管理员用户 ## 开发环境优化 - 开发终端兼容云端环境 - MinIO客户端直传兼容云端环境 - 开发容器增加vim和Claude Code插件 - 编程代理改用Claude - docker-compose.yml添加全局name属性 ## Bug修复与代码优化 - 删除用户时级联删除SelectionLog - 手机端关闭侧边栏后刷新页面延迟调整(300ms=>350ms) - instrumentation.ts移至src内部以适配生产环境 - 删除部分引发类型错误的无用代码 - 优化quickstart.sh远程仓库推送相关配置 ## 文件变更 - 新增49个文件,修改多个配置和源代码文件 - 重构用户管理模块目录结构 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
13
README.md
13
README.md
@@ -1,5 +1,5 @@
|
||||
## 项目说明
|
||||
本项目模板(Hair Keeper v1.0.0)是一个高度集成、深度定制、约定优于配置的全栈Web应用模板,旨在保持灵活性的同时提供一套基于成熟架构的开发底座,自带身份认证、权限控制、丰富前端组件、文件上传、后台任务、智能体开发等丰富功能,提供AI开发辅助,免于纠结功能如何实现,可快速上手专注于业务逻辑。
|
||||
本项目模板(Hair Keeper v1.1.0)是一个高度集成、深度定制、约定优于配置的全栈Web应用模板,旨在保持灵活性的同时提供一套基于成熟架构的开发底座,自带身份认证、权限控制、丰富前端组件、文件上传、后台任务、智能体开发等丰富功能,提供AI开发辅助,免于纠结功能如何实现,可快速上手专注于业务逻辑。
|
||||
|
||||
Hair Keeper是个诙谐有趣的名称,和项目内容毫无关系。
|
||||
|
||||
@@ -14,7 +14,7 @@ Hair Keeper是个诙谐有趣的名称,和项目内容毫无关系。
|
||||
- 数据和存储:pg(PostgreSQL) + ioredis + minio
|
||||
- 后台任务及消息队列:bullmq
|
||||
- AI大模型交互: ai + ai-sdk/react + ai-elements(基于shadcn/ui库添加组件)
|
||||
- 辅助性库:lodash + zod + date-fns + nanoid
|
||||
- 辅助性库:lodash + zod + date-fns + nanoid + zustand + p-limit
|
||||
- 其他:next-auth + bcryptjs + nuqs + superjson(前后端序列化类型安全) + copy-to-clipboard
|
||||
|
||||
## 项目约定
|
||||
@@ -27,11 +27,12 @@ Hair Keeper是个诙谐有趣的名称,和项目内容毫无关系。
|
||||
|
||||
### 后端
|
||||
- tRPC接口报错时可使用TRPCError,例如throw new TRPCError({ code: 'NOT_FOUND', message: '' })
|
||||
- server/trpc.ts中预定义了publicProcedure用于创建无权限限制、也不需要登录的api
|
||||
- server/trpc.ts中预定义了publicProcedurepermissionRequiredProcedure,用来创建限制特定权限访问的路由,例如permissionRequiredProcedure(Permissions.USER_MANAGE);空字符串表示无权限要求,但是需要用户登录;约定用permissionRequiredProcedure('SUPER_ADMIN_ONLY')限制超级管理员才能访问,该权限不在Permissions中定义,只有超级管理员才能绕过授权限制访问所有接口,因此SUPER_ADMIN_ONLY这个字符串只是一个通用的约定。
|
||||
- server/trpc.ts中导出了createTRPCRouter(本质是t.router)用来创建路由,预定义了publicProcedure用于创建无权限限制、也不需要登录的api
|
||||
- server/trpc.ts中预定义了permissionRequiredProcedure,用来创建限制特定权限访问的api,例如permissionRequiredProcedure(Permissions.USER_MANAGE);空字符串表示无权限要求,但是需要用户登录;约定用permissionRequiredProcedure('SUPER_ADMIN_ONLY')限制超级管理员才能访问,该权限不在Permissions中定义,只有超级管理员才能绕过授权限制访问所有接口,因此SUPER_ADMIN_ONLY这个字符串只是一个通用的约定。
|
||||
- 数据库批次操作时,使用`const dbParallelLimit = pLimit(parseInt(process.env.DB_PARALLEL_LIMIT || '16', 10))`控制最大并发数
|
||||
|
||||
### 数据和存储
|
||||
- Prisma 生成的客户端输出为默认路径,导入时使用`@prisma/client`
|
||||
- Prisma 生成的客户端输出为默认路径,导入时使用`@prisma/client`,可以从中导入定义的数据表的ts类型,例如`import type { User } from '@prisma/client'`
|
||||
- 数据库连接使用 `server/db.ts` 中的全局单例 `db`,不要直接实例化 PrismaClient
|
||||
- 时间字段统一使用 `@db.Timestamptz` 类型
|
||||
- 前后端参数传递尽量使用扁平结构而非嵌套结构
|
||||
@@ -58,6 +59,7 @@ Hair Keeper是个诙谐有趣的名称,和项目内容毫无关系。
|
||||
- `app/(main)/users/`:用户管理模块,提供用户CRUD、角色管理、批量授权等完整的用户管理功能的页面和组件实现
|
||||
- `hooks/`:可复用React Hooks库,部分复杂的组件也通过hook实现Headless UI逻辑与样式分离,组件中可复用的逻辑都可以放在这
|
||||
- `lib/trpc.ts`:创建并导出tRPC React客户端实例,用于前端与后端API通信
|
||||
- `lib/stores/`:通过zustand管理的全局的状态
|
||||
|
||||
### 后端
|
||||
- `server/routers/`:项目trpc api定义文件,开发者主要在这里定义和实现业务的后端API
|
||||
@@ -77,6 +79,7 @@ Hair Keeper是个诙谐有趣的名称,和项目内容毫无关系。
|
||||
### 其他
|
||||
- `constants/`:项目全局常量管理
|
||||
- `constants/permissions.ts`:权限定义,支持前后端一致的权限控制,支持解析复杂的权限表达式(如"A&B|(C&D)")
|
||||
- `constants/menu.ts`: 菜单管理工具库,提供菜单项定义、查询、权限过滤等功能
|
||||
- `lib/schema/`:集中管理数据验证schema,定义前后端统一的数据结构和验证规则,前端对默认值等其他要求写在表单组件中,后端对默认值等其他要求写在接口文件中,使用z.input而不是z.infer来获取Schema的输入类型
|
||||
- `lib/algorithom.ts`:通用计算机算法实现,例如拓扑排序
|
||||
- `lib/format.ts`:数据格式化工具函数库
|
||||
|
||||
Reference in New Issue
Block a user