library-picturebook-activity/AGENTS.md
aid 418aa57ea8 Day4: 超管端设计优化 + UGC绘本创作社区P0实现
一、超管端设计优化
- 文档管理SOP体系建立,docs目录重组
- 统一用户管理:跨租户全局视角,合并用户管理+公众用户
- 活动监管全模块重构:全部活动(统计卡片+阶段筛选+SuperDetail详情页)、报名数据/作品数据/评审进度(两层合一扁平列表)、成果发布(去Tab+统计+隐藏写操作)
- 菜单精简:移除评委管理/评审规则/通知管理
- Bug修复:租户编辑丢失隐藏菜单、pageSize限制、主色统一

二、UGC绘本创作社区P0
- 数据库:10张新表(user_works/user_work_pages/work_tags等)
- 子女账号独立化:Child升级为独立User,家长切换+独立登录
- 用户作品库:CRUD+发布审核,8个API
- AI创作流程:提交→生成→保存到作品库,4个API
- 作品广场:首页改造为推荐流,标签+搜索+排序
- 内容审核(超管端):作品审核+作品管理+标签管理
- 活动联动:WorkSelector作品选择器
- 布局改造:底部5Tab(发现/创作/活动/作品库/我的)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-27 22:20:25 +08:00

129 lines
3.3 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Competition Management System - Agent Instructions
这是一个多租户的竞赛管理系统,采用 NestJS + Vue 3 技术栈。
## 🚨 最重要的规则
### 多租户数据隔离
**所有数据库查询必须包含 `tenantId` 条件!** 这是系统安全的核心。
```typescript
// ✅ 正确
const users = await prisma.user.findMany({
where: { tenantId, validState: 1 }
});
// ❌ 错误 - 绝对不允许
const users = await prisma.user.findMany();
```
## 后端开发
### 模块结构
- 使用 NestJS 标准模块结构module、controller、service、dto
- 所有数据操作通过 Prisma禁止直接 SQL
- 使用 `@Injectable()`、`@Controller()` 装饰器
### 权限控制
- 使用 `@RequirePermission('module:action')` 装饰器
- 格式:`user:create`、`contest:update`、`role:delete`
- 所有路由默认需要认证,公开接口使用 `@Public()`
### DTO 验证
```typescript
export class CreateUserDto {
@IsString()
username: string;
@IsEmail()
@IsOptional()
email?: string;
}
```
### 错误处理
- 使用 NestJS 内置异常,消息用中文
- `NotFoundException`、`BadRequestException`、`ForbiddenException`
## 前端开发
### 组件开发
- 使用 Vue 3 `<script setup lang="ts">` 语法
- 页面组件放在 `views/` 目录,按模块组织
- 使用 Ant Design Vue 组件库
### API 调用
- API 文件放在 `api/` 目录,按模块组织
- 函数命名:`getXxx`、`createXxx`、`updateXxx`、`deleteXxx`
- 使用 TypeScript 类型定义
### 路由
- 路由路径必须包含租户编码:`/:tenantCode/users`
- 使用动态路由(基于菜单权限)
### 状态管理
- 使用 Piniastore 命名:`useAuthStore`、`useUserStore`
## 数据库设计
### 必需字段
所有业务表必须包含:
```prisma
model YourModel {
id Int @id @default(autoincrement())
tenantId Int @map("tenant_id")
validState Int @default(1) @map("valid_state")
creator Int?
modifier Int?
createTime DateTime @default(now()) @map("create_time")
modifyTime DateTime @updatedAt @map("modify_time")
}
```
### 性能优化
- 使用 `include` 预加载,避免 N+1 查询
- 使用 `select` 精简字段
- 实现分页查询
## 代码风格
- TypeScript 严格模式
- 使用 async/await避免 Promise.then()
- 使用中文注释
- Git 提交信息:`类型: 描述`(如 `feat: 添加用户管理`
## 快速参考
### 创建新模块
1. 在 Prisma schema 定义模型
2. 运行 `pnpm prisma:migrate:dev`
3. 创建 NestJS 模块module、controller、service、dto
4.`app.module.ts` 注册
5. 创建前端 API 和页面
### 常用装饰器
- `@CurrentTenantId()` - 获取租户ID
- `@CurrentUser()` - 获取当前用户
- `@RequirePermission()` - 权限检查
- `@Public()` - 公开接口
### 开发命令
```bash
# 后端
cd backend
pnpm start:dev # 启动开发服务器
pnpm prisma:migrate:dev # 数据库迁移
pnpm init:admin # 初始化管理员
# 前端
cd frontend
pnpm dev # 启动开发服务器
pnpm build # 构建生产版本
```
---
💡 **记住**:租户隔离是系统的核心安全机制,所有数据操作都必须验证 `tenantId`