|
|
48aaea7773
|
Merge pull request 'test/ci-workflow' (#7) from test/ci-workflow into main
Deploy / Build and Push Images (push) Failing after 1m20s
Deploy / Deploy to Knative (push) Has been skipped
Reviewed-on: #7
Reviewed-by: gitea_admin <gitea@local.domain>
|
2026-01-22 10:36:57 +00:00 |
|
charilezhou
|
a632d48590
|
ci: 移除 pnpm 缓存配置
CI / Build Check (pull_request) Successful in 2m10s
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
2026-01-22 18:22:07 +08:00 |
|
charilezhou
|
e98c726796
|
fix(ci): 使用 .nvmrc 和 packageManager 配置版本
CI / Build Check (pull_request) Successful in 2m21s
- Node.js 版本从 .nvmrc 读取
- pnpm 版本从 package.json 的 packageManager 字段读取
- 移除硬编码的版本号
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
2026-01-22 18:19:41 +08:00 |
|
charilezhou
|
c5e08b5632
|
ci: 使用 registry 缓存替代 gha 缓存
CI / Build Check (pull_request) Failing after 1m28s
Docker 构建缓存改为存储在镜像仓库中,兼容 Gitea Actions
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
2026-01-22 18:17:13 +08:00 |
|
charilezhou
|
a82144a676
|
ci: 移除容器配置,改为 Runner 级别配置
CI / Build Check (pull_request) Failing after 4m51s
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
2026-01-22 18:08:57 +08:00 |
|
charilezhou
|
a211da4468
|
ci: 添加 pnpm 依赖包缓存配置
CI / Build Check (pull_request) Failing after 33s
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
2026-01-22 18:02:26 +08:00 |
|
charilezhou
|
9c93e324dd
|
fix(ci): 添加容器镜像配置解决 Node.js 缺失问题
CI / Build Check (pull_request) Failing after 25s
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
2026-01-22 18:00:41 +08:00 |
|
charilezhou
|
fbe88764e5
|
ci: 移除手动触发配置
CI / Build Check (pull_request) Failing after 1m18s
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
2026-01-22 17:50:46 +08:00 |
|
charilezhou
|
42501148b9
|
ci: 添加手动触发支持
CI / Build Check (pull_request) Failing after 4m43s
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
2026-01-22 17:45:45 +08:00 |
|
charilezhou
|
08bd6397c8
|
ci: 添加 Gitea Actions CI/CD 和 Knative 部署配置
- 添加 CI workflow(PR 构建检查)
- 添加 Deploy workflow(main 分支自动部署)
- 添加 Web/API 多阶段 Dockerfile
- 添加 Knative Service 配置(自动扩缩容)
- 添加 K8s ConfigMap、Secret、Namespace 配置
- 添加 .dockerignore 优化构建
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
2026-01-22 17:38:28 +08:00 |
|
charilezhou
|
595d59ab5b
|
chore: 将 next-env.d.ts 加入 .gitignore
该文件由 Next.js 自动生成,不应纳入版本控制。
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
2026-01-20 18:24:38 +08:00 |
|
charilezhou
|
5c1a998192
|
feat(web): 实现自定义主题功能
支持 6 套预设主题(默认、海洋、森林、日落、玫瑰、紫罗兰)和自定义主色色相滑块,
通过动态注入 CSS 变量实现主题切换,使用 localStorage 持久化存储,
添加 SSR 初始化脚本避免首次加载颜色闪烁。
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
2026-01-20 18:22:22 +08:00 |
|
charilezhou
|
ad847f1e4c
|
refactor(web): 将刷新权限缓存功能移至系统设置
- 新增 PermissionSettings 组件
- 从个人中心页面移除刷新权限缓存功能
- 在系统设置页面添加权限缓存设置卡片
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
2026-01-20 17:32:24 +08:00 |
|
charilezhou
|
3943bd112f
|
docs: 更新 OIDC Provider 文档并完善环境配置
文档更新:
- 从"实施方案"改为"实施文档",标记为已完成状态
- 添加快速开始章节,提供完整的使用示例
- 补充第一方应用自动授权的两种场景实现细节
- 补充 Grant Scope 存储的 payload 结构说明
- 新增客户端服务章节(cuid2 ID + 随机密钥)
- 更新关键文件清单(后端/前端/共享类型)
环境配置:
- 添加 FRONTEND_URL 配置
- 添加 OIDC Provider 开发环境配置
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
2026-01-20 17:29:26 +08:00 |
|
charilezhou
|
90513e8278
|
feat: 实现完整的 OIDC Provider 功能
- 后端:基于 node-oidc-provider 实现 OIDC Provider
- 支持 authorization_code、refresh_token、client_credentials 授权类型
- Redis adapter 存储会话数据,Prisma adapter 存储持久化数据
- 客户端管理 CRUD API(创建、更新、删除、重新生成密钥)
- 交互 API(登录、授权确认、中止)
- 第一方应用自动跳过授权确认页面
- 使用 cuid2 生成客户端 ID
- 前端:OIDC 客户端管理界面
- 客户端列表表格(支持分页、排序)
- 创建/编辑弹窗(支持所有 OIDC 配置字段)
- OIDC 交互页面(登录表单、授权确认表单)
- 共享类型:添加 OIDC 相关 TypeScript 类型定义
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
2026-01-20 17:22:32 +08:00 |
|
charilezhou
|
8db25538d4
|
docs: 添加 OIDC Provider 实施方案文档
- 基于 panva/node-oidc-provider 的完整实施方案
- 混合存储策略:PostgreSQL(Client、Grant、RefreshToken)+ Redis(短期令牌)
- 前端采用 SSR + Server Actions,独立路由组 (oidc)
- 包含 Prisma 模型、适配器、控制器、前端页面等完整设计
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
2026-01-20 11:02:48 +08:00 |
|
charilezhou
|
66cce5a765
|
feat(api): health 接口添加 storage 服务监控
- StorageService 添加 healthCheck 方法
- 健康检查响应增加 storage 状态
- 更新共享类型定义
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
2026-01-20 10:37:33 +08:00 |
|
charilezhou
|
140c268412
|
fix(web): 切换账号后权限缓存不刷新问题
- 登录/注册成功时先清除旧的权限缓存
- 确保切换账号后重新加载新账号的权限数据
feat(web): 系统状态接入真实 health API
- 新增 health.service.ts 调用后端健康检查接口
- 新增 useHealth hook,每 30 秒自动刷新
- DashboardStats 显示真实健康状态(正常/部分异常/异常)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
2026-01-20 10:35:15 +08:00 |
|
charilezhou
|
e7496ed41b
|
docs: 更新 CLAUDE.md 补充权限系统和代码生成器说明
新增内容:
- pnpm generate 代码生成命令
- 前端权限控制(PermissionGuard 组件、usePermissionStore)
- 后端权限控制(@RequirePermission 装饰器、PermissionModule)
- 代码生成器生成内容说明
- DataTable 通用组件说明
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
2026-01-19 20:50:23 +08:00 |
|
charilezhou
|
2aa992c88d
|
docs(plop): 更新 README 文档
新增内容:
- 服务类型说明(CrudService/RelationCrudService/ManyToManyCrudService)
- 关系配置 DSL 语法(一对多/多对一/多对多)
- 种子脚本生成和执行说明
- 权限控制说明(@RequirePermission + PermissionGuard)
- 新增模板文件(page.hbs、module-seed.hbs)
- Helpers 完整列表(含 openBrace/closeBrace)
- FAQ 扩展(QueryDto 生成、JSX 花括号、种子脚本)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
2026-01-19 20:46:50 +08:00 |
|
charilezhou
|
695f34bc3d
|
refactor(plop): QueryDto 始终生成并在 controller 中使用
- dto.hbs: 移除 hasQueryDto 条件,始终生成 QueryDto 类
- controller.hbs: 始终导入使用 QueryDto 而非 PaginationQueryDto
- hasQueryDto 现只控制是否提取查询字段,不影响类型声明
便于后续扩展查询参数,无需修改 controller 导入
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
2026-01-19 20:39:33 +08:00 |
|
charilezhou
|
1d204647fd
|
feat(plop): 代码生成器改进
- Table 模板添加 error 状态渲染支持
- Controller 模板统一使用 PATCH 方法(update 和 restore)
- 修复 edit-dialog 模板花括号输出问题,添加 openBrace/closeBrace helper
- 简化 Table 模板的 refetch 逻辑
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
2026-01-19 20:28:39 +08:00 |
|
charilezhou
|
1b84aff71a
|
feat: DataTable 错误状态支持和 403 页面退出登录
- DataTable 组件添加 error 和 onRetry 属性,支持错误状态渲染
- 新增 Alert 组件(shadcn/ui 风格)
- 403 页面添加重新登录按钮,方便权限更新后刷新缓存
- auth.ts 退出登录时同时清除权限缓存
- CrudService restore 方法修复:显式指定 deletedAt 条件绕过软删除过滤
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
2026-01-19 20:28:15 +08:00 |
|
charilezhou
|
c37ee29071
|
feat(plop): 生成的模块自动应用权限控制
后端 Controller:
- 添加 PermissionGuard 守卫
- 每个接口添加 @RequirePermission 装饰器
- 权限格式: {module}:create/read/update/delete
前端 Table:
- 使用 PermissionGuard 组件进行权限控制
- 新建按钮根据 create 权限显示/隐藏
- 编辑/删除/恢复按钮根据对应权限显示/隐藏
- 整个操作菜单根据 update/delete 权限显示/隐藏
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
2026-01-19 19:57:28 +08:00 |
|
charilezhou
|
ed901250bd
|
feat(plop): 添加菜单/权限种子脚本生成功能
- 新增种子脚本模板 module-seed.hbs
- 生成器新增「菜单/权限种子脚本」选项
- 添加菜单图标和排序的提示问题
- 生成的脚本包含 4 个 CRUD 权限和 1 个菜单项
- 支持独立运行或被主 seed.ts 导入调用
- 修复 ESM 模块导入路径(添加 .ts 扩展名)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
2026-01-19 19:42:11 +08:00 |
|
charilezhou
|
331142d87a
|
fix(plop): 修复 edit-dialog 模板 Handlebars 解析错误
使用 {{"{"}} 输出 JSX 花括号字面量,避免与三重大括号语法冲突
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
2026-01-19 17:38:32 +08:00 |
|
charilezhou
|
3119460f13
|
feat(plop): 优化生成器支持 Prisma 关联关系
- 支持一对多/多对一关系定义并生成到 Prisma schema
- 简化流程:查询关联配置根据关系自动预填
- 修复 Handlebars 模板 HTML 转义导致的乱码问题
- 修复 controller 模板缺少 Prisma 导入的问题
- 新增页面模板 (page.hbs) 生成前端页面
- 添加 FindAllParams/PaginationQueryDto 索引签名修复类型兼容
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
2026-01-19 17:30:18 +08:00 |
|
charilezhou
|
e5b3285519
|
fix(plop): 修复生成文件路径和 app.module.ts 正则
- 添加 --dest . 参数确保文件生成到项目根目录
- 修复 app.module.ts 导入语句和 imports 数组的正则匹配
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
2026-01-19 16:19:54 +08:00 |
|
charilezhou
|
8c904c419a
|
feat(plop): 关联配置支持从 Schema 选择模型和字段
- 新增 schema-parser.ts 解析 Prisma schema 文件
- 关联关系先选择模型,再编辑预填的配置
- 多对多关系自动推断中间表配置
- 可用字段作为注释显示,方便用户参考
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
2026-01-19 16:14:48 +08:00 |
|
charilezhou
|
31598d79ae
|
fix(plop): 修复模板文件路径
模板路径应相对于 plopfile 所在目录,移除多余的 plop/ 前缀
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
2026-01-19 16:11:46 +08:00 |
|
charilezhou
|
f492e7c172
|
feat(plop): 模板支持关联关系和多对多生成
- service.hbs: 支持三种服务类型,生成 @CrudOptions 关联配置和 DTO 转换方法
- dto.hbs: 生成 BriefDto、DetailResponseDto、AssignDto
- controller.hbs: 支持关联查询端点和多对多分配端点
- types.hbs: 添加关联类型接口定义
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
2026-01-19 16:03:12 +08:00 |
|
charilezhou
|
f126e03cf1
|
feat(plop): 代码生成器支持 CrudService 分层架构
- 新增 relation-parser.ts 关联关系 DSL 解析器
- 生成器支持三种服务类型选择:CrudService/RelationCrudService/ManyToManyCrudService
- 添加关联关系、多对多关系、统计关系配置问题
- 修复 helpers 导入路径扩展名问题
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
2026-01-19 16:02:48 +08:00 |
|
charilezhou
|
3ae13fd512
|
feat: 添加教学管理模块(教师、学生、班级)
后端:
- 新增 Teacher、Student、Class 模块及 CRUD 接口
- 新增 ClassTeacher 多对多关系支持任课教师管理
- Student 支持班级关联查询
- Class 支持班主任一对一和任课教师多对多关系
- 更新 Prisma schema 和种子数据
前端:
- 新增教师、学生、班级管理页面
- 新增对应的 hooks 和 services
- 更新路由常量和 hooks 导出
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
2026-01-19 15:39:10 +08:00 |
|
charilezhou
|
0156e17131
|
refactor(api): CrudService 分层架构重构
- 新增 BaseCrudService 抽象基类,提取通用辅助方法
- 新增 RelationCrudService 支持关联查询和一对一关系管理
- 新增 ManyToManyCrudService 支持多对多关系管理
- 重构 CrudService 继承 BaseCrudService
- 迁移 UserService 到 ManyToManyCrudService(用户-角色多对多)
- 迁移 RoleService 到 ManyToManyCrudService(角色-权限、角色-菜单双多对多)
- 更新 CrudService 使用文档
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
2026-01-19 15:37:27 +08:00 |
|
charilezhou
|
c759b50efd
|
chore(api): 更新种子数据菜单结构
- 添加文件管理权限 (file:read, file:delete)
- 调整菜单层级:用户管理、文件管理等移至系统管理下
- 优化种子数据初始化逻辑
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
2026-01-19 13:48:50 +08:00 |
|
charilezhou
|
c5656813ae
|
feat(web): 添加文件管理页面
- 新增 /files 文件管理页面
- 添加 FilesTable 组件支持分页、筛选、删除
- 添加 FileStats 组件展示统计信息
- 扩展 file.service.ts 添加列表和统计接口
- 新增 useFiles、useFileStats、useDeleteFile hooks
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
2026-01-19 13:48:18 +08:00 |
|
charilezhou
|
0acea22262
|
feat(api): 文件管理模块添加列表和统计接口
- 添加 GET /files 分页查询接口
- 添加 GET /files/stats 统计信息接口
- FileService 使用 @CrudOptions 配置过滤字段
- 新增 FileQueryDto、PaginatedFileResponseDto、FileStatsResponseDto
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
2026-01-19 13:47:56 +08:00 |
|
charilezhou
|
76f835a2ad
|
feat(api): StorageService 支持 MINIO_PUBLIC_URL 配置
- 添加 publicUrl 配置支持外部访问地址
- getPresignedUrl 方法自动替换内部地址为公开地址
- 移除已迁移到 file 模块的路径前缀常量
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
2026-01-19 13:47:36 +08:00 |
|
charilezhou
|
2914d1e090
|
feat(api): CrudService 添加配置式过滤和 count 方法
- 新增 FilterOperator、FilterFieldConfig、FilterableField 类型
- 添加 filterableFields 配置项支持声明式过滤字段
- 实现 buildFilterWhere 方法自动构建 where 条件
- 添加 count 方法支持条件计数
- findAll/count 方法支持泛型参数兼容 DTO 类型
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
2026-01-19 13:47:09 +08:00 |
|
charilezhou
|
5fab73e514
|
refactor(api): 优化文件上传验证分层
Controller 层(Multer 配置):
- 添加全局文件大小限制(10MB)和类型过滤
- 在文件写入内存前进行基本验证,防止恶意大文件
Service 层(业务规则):
- 新增 FILE_PURPOSE_CONFIG 配置映射
- 按场景(头像/附件)进行细化验证
- 提取 validateFile 方法,职责清晰
常量重组织:
- storage.constants.ts 只保留全局限制和存储路径
- file.constants.ts 添加场景特定限制配置
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
2026-01-19 13:07:20 +08:00 |
|
charilezhou
|
c935d0b6aa
|
docs: 更新 CLAUDE.md 项目文档
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
2026-01-19 12:37:18 +08:00 |
|
charilezhou
|
9c65d39dd2
|
feat(web): 更新 UI 组件和个人资料页
- 更新个人资料页支持头像上传
- 优化 Header、Sidebar、UserNav 组件
- 更新表单验证规则
- 调整常量配置
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
2026-01-19 12:37:08 +08:00 |
|
charilezhou
|
4e1be2b494
|
feat(api): 更新用户模块支持头像功能
- 更新 AuthDto 调整验证规则
- 更新 UserDto 添加头像相关字段
- 更新 UserController 支持更新用户头像
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
2026-01-19 12:36:39 +08:00 |
|
charilezhou
|
d9673e2ba3
|
chore: 更新配置和依赖
- 添加 MinIO 和邮件服务相关环境变量
- 添加 @nestjs-modules/mailer, minio, multer 等依赖
- 更新 app.module.ts 注册新模块
- docker-compose 添加 MinIO 服务配置
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
2026-01-19 12:36:20 +08:00 |
|
charilezhou
|
1627d98be5
|
feat: 更新数据模型和共享类型
- 更新 Prisma schema 添加 File 模型和相关字段
- 更新共享类型定义,添加文件和密码重置相关类型
- 添加 CaptchaScene.RESET_PASSWORD 场景
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
2026-01-19 12:36:04 +08:00 |
|
charilezhou
|
e008179c03
|
feat: 添加忘记密码功能
后端:
- 新增 MailService 集成 Nodemailer 发送邮件
- 新增 EmailCodeService 管理邮箱验证码
- 新增 sendResetPasswordEmail 和 resetPassword 接口
- 支持验证码过期和次数限制
前端:
- 新增忘记密码页面 (forgot-password)
- 新增 ForgotPasswordForm 组件,支持邮箱验证和密码重置
- 更新 auth.service.ts 添加相关 API 调用
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
2026-01-19 12:35:24 +08:00 |
|
charilezhou
|
58529f0321
|
feat: 添加文件上传功能
后端:
- 新增 StorageService 集成 MinIO 对象存储
- 新增 FileService 和 FileController 处理文件上传
- 支持头像上传场景,含文件类型和大小验证
- 支持生成临时访问 URL
前端:
- 新增 AvatarUpload 组件,支持拖拽和点击上传
- 新增 useUploadAvatar 和 useFileUrl hooks
- 新增 file.service.ts 封装文件 API
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
2026-01-19 12:34:58 +08:00 |
|
charilezhou
|
b305e49e9b
|
fix(web): 修复 lint 错误
- 调整 permissions/page.tsx 的 import 顺序
- 重命名未使用的 collectAllMenuIds 为 _collectAllMenuIds
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
2026-01-19 12:34:32 +08:00 |
|
charilezhou
|
d747f98d08
|
refactor(api): 优化 PrismaService 类型设计,修复依赖注入问题
- 重构 PrismaService 使其类型包含所有模型访问器
- 使用 PrismaServiceImpl 内部类 + 类型断言导出 PrismaService
- 所有 Service 现在可以直接使用 PrismaService 类型注入
- 修复 NestJS 依赖注入无法识别类型别名的问题
- 统一各 Service 的 PrismaService 导入方式
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
2026-01-19 12:34:11 +08:00 |
|
charilezhou
|
57456be013
|
refactor(api): 移除手动 softDelete 配置,改为基于 schema 自动检测
- 从 CrudServiceOptions 中移除 softDelete 属性
- CrudService 基于 Prisma schema 自动检测模型是否支持软删除
- 新增 supportsSoftDelete getter 用于判断软删除支持
- 更新 findDeleted/restore 方法使用自动检测
- PrismaService 底层已自动处理软删除逻辑
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
2026-01-19 12:33:46 +08:00 |
|