diff --git a/CLAUDE.md b/CLAUDE.md index 17e6d32..c40d3a3 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -38,6 +38,9 @@ pnpm db:generate # 生成 Prisma Client pnpm db:push # 推送 schema 到数据库 pnpm db:migrate # 运行迁移 cd apps/api && pnpm db:studio # 打开 Prisma Studio + +# 代码生成 +pnpm generate # CRUD 模块生成器(交互式,生成后端+前端+类型+种子脚本) ``` ## Architecture @@ -61,6 +64,25 @@ cd apps/api && pnpm db:studio # 打开 Prisma Studio | 组件本地状态 | useState | 表单输入、弹窗开关 | | URL 状态 | Next.js Router | 分页参数、筛选条件 | +**前端权限控制**:使用 `` 组件包裹需要权限的 UI 元素: +```tsx + + + + +// 多个权限(OR 关系) + + + + +// 多个权限(AND 关系) + + + +``` + +权限数据通过 `usePermissionStore` 管理,登录后自动缓存,退出时清除。 + **数据请求分层** ``` @@ -80,9 +102,20 @@ NestJS 采用模块化架构: - **AuthModule** - JWT 认证(注册、登录、token 验证) - **UserModule** - 用户 CRUD,继承 CrudService 基类 - **CaptchaModule** - 验证码服务,支持多场景验证 +- **PermissionModule** - 权限管理(角色、权限、菜单) 认证流程:使用 `@Public()` 装饰器标记公开接口,其他接口需要 JWT Bearer Token。使用 `@CurrentUser()` 装饰器获取当前登录用户信息(类型为 `AuthUser`)。 +**权限控制**:使用 `@RequirePermission()` 装饰器控制接口权限,配合 `PermissionGuard` 使用: +```typescript +@UseGuards(JwtAuthGuard, PermissionGuard) +@RequirePermission('user:create') +@Post() +create(@Body() dto: CreateUserDto) { ... } +``` + +权限码格式:`{resource}:{action}`(如 `user:create`、`user:read`、`user:update`、`user:delete`) + **后端导入规范:禁止使用 Barrel Imports** 后端代码禁止使用 `index.ts` 统一导出(barrel exports),必须直接从具体文件导入: @@ -289,3 +322,22 @@ docs/ - `packages/shared/src/types/` - 共享类型定义 - `packages/shared/src/crypto/` - 跨平台加密实现 - `apps/web/src/types/` - 前端特有类型定义 + +### 代码生成器 + +`pnpm generate` 启动交互式代码生成器,可一键生成完整 CRUD 模块: + +- **后端**: Controller、Service、DTO、Module +- **前端**: Service、Hooks、Table、CreateDialog、EditDialog、Page +- **共享类型**: TypeScript 接口定义 +- **Prisma Model**: 数据库模型 +- **种子脚本**: 菜单和权限初始化数据 + +生成的代码自动集成权限控制(`@RequirePermission` + `PermissionGuard`)。详见 `plop/README.md`。 + +### 通用组件 + +**DataTable** (`components/shared/DataTable/`): 封装 TanStack Table 的通用数据表格组件 +- 支持服务端分页、排序、搜索 +- 内置加载状态、错误状态、空状态渲染 +- 使用示例见 `components/*/XxxTable.tsx`