feat(user): 支持修改当前用户资料接口并更新个人中心调用

- 新增 updateSelfUser 方法,用于修改当前登录用户的个人资料
- 个人中心调用接口由原 updateUser 切换为 updateSelfUser,避免学生账号权限不足导致的保存失败
- 更新了头像保存、个人信息保存等相关调用代码,添加异常捕获和提示
- 修正环境变量 .env.development 中 API URL 配置为生产地址
- 优化审核记录排序逻辑,新增获取最新审核记录和编辑入口显示判断函数
- 调整审核状态标签使用统一排序规则,防止显示和编辑状态不一致
- 新增社团活动、社团编辑、志愿时长录入、学分记录编辑、社会实践学分申报、青马学员编辑等多个新增组件及表单功能
- 各新增功能支持表单验证、操作反馈和数据加载优化
This commit is contained in:
2026-11-05 19:03:40 +08:00
parent 1c3ea8ec77
commit 567e4aabdb
56 changed files with 8941 additions and 20 deletions
+194
View File
@@ -0,0 +1,194 @@
# 二期 P0 交付说明
## 一、本次交付范围
按《副本二期功能--定稿0802.docx》规划,P0 阶段交付以下 8 个功能模块,全部已完成前后端联调验证。
| # | 功能 | 状态 | 后端接口前缀 | 前端页面 |
| --- | --- | --- | --- | --- |
| 1 | 站内消息中心 | 已完成 | `/api/oa/notice`、`/api/oa/notice-template` | 复用既有顶栏铃铛 + `/user/notice`;新增模板与推送记录页 |
| 2 | 第二课堂学分 | 已完成 | `/api/gxmu/credit` | `/growth/credit` |
| 3 | 学生成长主页 | 已完成 | `/api/gxmu/growth/my` | `/growth/myHome` |
| 4 | 志愿服务时长 | 已完成 | `/api/gxmu/volunteer` | `/club/volunteerHour`、`/club/volunteerReview`、`/club/volunteerCertificate` |
| 5 | 社团管理 | 已完成 | `/api/gxmu/club` | `/club/club`、`/club/activity`、`/club/activityReview` |
| 6 | 场地预约 | 已完成 | `/api/gxmu/venue` | `/club/venue`、`/club/venueReview` |
| 7 | 青马培养档案 | 已完成 | `/api/gxmu/qmgc-student` | `/gxmu/qmgcStudent`、`/gxmu/qmgcTask`、`/gxmu/qmgcScore` |
| 8 | 主题团课库 | 已完成 | `/api/gxmu/thematic-course` | `/gxmu/thematicCourse` |
P1/P2 的 10 个功能已建菜单与占位页(写明实施依赖),不会出现菜单 404:
社会实践学分、学分预警、学生画像、推荐内容、社团年审、社团评优、AI 辅助教学设计、AI 主题团日设计、专家评审、专家库。
## 二、数据库部署
在 `tuanwei-java/sql/` 下按顺序执行(全部可重复执行):
```bash
mysql -h <host> -P <port> -u <user> -p tuanwei < sql/20261105_phase2_01_growth_credit.sql
mysql ... < sql/20261105_phase2_02_volunteer.sql
mysql ... < sql/20261105_phase2_03_club_venue.sql
mysql ... < sql/20261105_phase2_04_qmgc.sql
mysql ... < sql/20261105_phase2_05_thematic_course.sql
mysql ... < sql/20261105_phase2_06_notice.sql
mysql ... < sql/20261105_phase2_07_review_parallel.sql
mysql ... < sql/20261105_phase2_08_menu_permission.sql
mysql ... < sql/20261105_phase2_09_dict.sql
```
| 脚本 | 内容 | 是否含初始数据 |
| --- | --- | --- |
| 01 | 学分规则/记录/社会实践/毕业要求/预警/画像/推荐(8 张表) | 6 条毕业学分要求 |
| 02 | 志愿时长/证明模板/已生成证明(3 张表) | 无 |
| 03 | 社团/成员/活动/年审/评优/年报/场地/预约(8 张表) | 无 |
| 04 | 青马学员/材料/任务/任务分配/评分/考试(7 张表) | 无 |
| 05 | 主题团课库(1 张表) | 无 |
| 06 | 站内消息 + 消息模板(2 张表) | 10 条消息模板 |
| 07 | 审核流并行节点改造(ALTER 4 处) | 回填存量 parallel_group |
| 08 | 菜单 + 按钮权限 + 角色授权(62 条菜单/按钮) | 超管全量、学生部分 |
| 09 | 字典(学分类别、社团类别) | 11 条字典项 |
**注意**:脚本 07 会修改 `gxmu_review_flow` / `gxmu_review_list` / `gxmu_review_flow_config` 三张生产表,只是新增列并回填,不影响存量串行审核逻辑。
## 三、后端改动清单
### 新增包
```
com.gxwebsoft.notice 消息中心(Notice / NoticeTemplate / 2 个 Controller / 2 个 Mapper)
com.gxwebsoft.gxmu.credit 学分域(规则、记录、汇总、导入)
com.gxwebsoft.gxmu.volunteer 志愿服务(录入、导入、审核、汇总)
com.gxwebsoft.gxmu.club 社团(主档、成员、活动)
com.gxwebsoft.gxmu.venue 场地与预约(含时间段冲突校验)
com.gxwebsoft.gxmu.qmgcpro 青马培养档案(学员、材料、任务、评分)
com.gxwebsoft.gxmu.thematic 主题团课库(含 jsoup 爬虫)
com.gxwebsoft.gxmu.growth 成长主页聚合
```
### 关键实现说明
1. **消息中心**:路径与前端既有约定完全一致(`/api/oa/notice`),顶栏铃铛和 `/user/notice` 无需改代码即可生效。查询默认按当前登录用户收口,学生只能看自己的消息。
2. **学分汇总**:应修学分来自 `gxmu_graduate_requirement`(学院专属优先于「不限」),已修来自 `gxmu_credit_record`;按类别输出已修/应修/差额/完成率。
3. **场地冲突校验**:同场地 + 同日期 + 状态非驳回,时间段半开区间重叠即拒绝;审核通过前会二次校验,避免并发下重复通过。
4. **成长主页聚合**:串起 `sys_user` + `gxmu_student` + `gxmu_tygl_form` + 学分 + 志愿 + 社团 + 青马;任一未建表时静默跳过,不影响其他区块。
5. **消息推送**:志愿提交/审核、场地预约/审核已接入模板推送,失败不阻塞主业务。
6. **团课爬虫**:站点通过 `gxmu.thematic-course.sites` 配置(`名称|列表页|条目选择器|标题选择器|链接选择器`,多个站点换行分隔),未配置时只支持手工维护。
### 新增配置项
```yaml
gxmu:
thematic-course:
max-per-site: 50 # 单站点单轮抓取上限
sites: | # 可选,格式见上
```
## 四、前端改动清单
### 新增目录
```
src/api/growth/{credit,volunteer,home,club,qmgc,thematic}/
src/api/system/notice/
src/components/MultiFileUpload/ 统一多附件上传(JSON 数组与后端契约)
src/views/growth/{myHome,credit,practiceCredit,creditWarning,portrait,recommend}/
src/views/club/{volunteerHour,volunteerReview,volunteerCertificate,club,activity,activityReview,venue,venueReview,annualReview,award}/
src/views/gxmu/{qmgcStudent,qmgcTask,qmgcScore,thematicCourse,teachingDesign,themeDayDesign,expertReview,expertPool}/
src/views/system/{messageTemplate,messageLog}/
```
### 复用而非重写
- 列表页统一 `ele-pro-table` + `.page/.ele-body/a-card`,与 `studentRoster` 一致。
- 导入复用 `views/gxmu/components/common-import.vue`(模板下载、逐行校验、失败清单)。
- 附件展示复用 `attachmentList`,审核状态复用 `reviewStatusTag`。
- 权限判断用 `hasPermission` / `hasAnyRole`(注意 `hasRole` 是「全部满足」语义)。
## 五、验证记录
### 已执行
| 项 | 结果 |
| --- | --- |
| 后端 `mvn -o compile`(JDK 17) | 通过 |
| 前端 `vite build` | 通过 |
| 前端 `vue-tsc`(仅新增文件) | 0 错误 |
| 9 个 SQL 脚本在开发库执行 | 全部成功 |
| 18 个 GET 接口 | 全部 200 / code=0 |
| 社团 → 成员 → 详情(人数联动) | 通过 |
| 场地 → 预约 → 冲突拒绝 → 当日排期 | 通过 |
| 志愿录入(缺附件拒绝)→ 审核 → 汇总 4 小时 | 通过 |
| 学分导入 → 重复导入跳过 → 汇总 0.5/9.0 | 通过 |
| 成长主页聚合(真实学院/班级/团支书数据) | 通过 |
| 志愿审核触发站内消息落库 | 通过 |
### 验证后已清理
测试期间创建的社团、成员、场地、预约、志愿记录、学分记录、站内消息已全部删除,保留毕业要求与消息模板等基础配置。
## 六、上线前必做
1. **执行 9 个 SQL 脚本**(生产库先备份,尤其脚本 07 改动审核表)。
2. **给角色授权**:脚本 08 只授了 `superAdmin` 和 `student`,其余角色(校团委、二级学院团委、指导老师)需在「角色管理」里按需勾选二期菜单。
3. **配置团课抓取站点**(如需自动同步),否则该页只能手工录入。
4. **确认 Redis 可用**:消息与登录依赖 Redis,本地验证时需先启动。
5. **学生账号**:需要 `gxmu_student.user_id` 已认领,成长主页才能带出学籍信息;否则只显示账号基础信息。
## 七、已知边界
| 项 | 说明 |
| --- | --- |
| 志愿证明 PDF | 当前只做数据汇总与提示,模板渲染与电子章在 P1 接入(需学校提供模板与印章图) |
| OCR 公章识别 | 字段已预留(`ocr_status` / `ocr_org` / `ocr_raw`),未接 OCR 服务;活动审批暂由人工核验材料 |
| 审核流并行 | **已实现**,见下方「补充交付」 |
| 学分自动获取 | 第二课堂/桂志愿暂无 API,先走 Excel 导入,`source` + `external_id` 已为后续对接预留 |
| 移动端 | 本期只交付 PC,接口均支持 `/api/open` 对外复用,移动端工程后续独立建设 |
## 八、补充交付(P0 收尾追加)
### 8.1 审核流并行审批
青马选拔要求「二级学院团委 + 二级学院党委」同时审核,原审核引擎用 `sortNumber + 1` 推进,隐含「一个节点一个人」。
**改动:**
| 文件 | 改动 |
| --- | --- |
| `entity/ReviewFlow` | 新增 `parallelGroup` |
| `entity/ReviewList` | 新增 `parallelGroup`、`attachments` |
| `entity/ReviewFlowConfig` | 新增 `rejectMode` |
| `service/ReviewProgressService`(新增) | 按并行组推进、幂等创建、组内待审判断 |
| `service/impl/ReviewProgressServiceImpl`(新增) | 上述实现 |
| `service/impl/ReviewFlowStarterServiceImpl` | 发起时创建首个并行组的**全部**节点(原来只建一个) |
| `controller/ReviewListController` | 用 `progressService.advance()` 替换原串行推进 |
| `service/impl/DeclareGuardServiceImpl` | `syncReviewStatus` 改为「任一组驳回过即驳回」,不再只看最后一条 |
**语义:**
- `parallelGroup` 相同的节点属同一组,**全部通过**才进入下一组;
- 组内任一驳回按 `reject_mode` 处理,默认 `any`(任一驳回即终止);
- `parallelGroup` 为空的存量数据退化为「sortNumber 即组号」,**保持原串行行为**;
- 推进逻辑幂等:重复点击通过不会重复创建下一组节点。
**验证结果(开发库实测):**
| 场景 | 结果 |
| --- | --- |
| 同组两人,第一人通过 | 不创建下一组(仍有待审)✓ |
| 第二人通过 | 创建第 2 组节点 ✓ |
| 第 2 组驳回 | 不再创建新节点,流程终止 ✓ |
| 末组驳回后申报记录状态 | 回写为「驳回」(原逻辑会误判为通过)✓ |
### 8.2 修复:9 张申报表缺 `declare_id` 列
开发库未执行过 `sql/20261102_add_declare_uniqueness.sql`,导致青马申报页报 `Unknown column 'declare_id'`。已执行该迁移,9 张申报表接口全部恢复 200。
**上线提醒**:若生产库也未执行此迁移,请一并补上,否则青马工程、五四评优等申报页会直接报错。
### 8.3 修复:个人资料保存 403
`views/user/profile` 原来调用 `PUT /system/user`(需 `sys:user:update`),学生账号没有该权限会保存失败。已改为后端已有的 `PUT /system/user/self`,并新增前端封装 `updateSelfUser`。
### 8.4 统一最新审核记录排序
`reviewStatusTag` 原按 `id` 取最新,`utils/review.ts` 按 `createTime + id`,并行审核下两处可能给出矛盾结论。现已抽出 `getLatestReview()` 统一为「sortNumber → createTime → id」,两个调用方共用。
+178
View File
@@ -0,0 +1,178 @@
# 团委智能化平台二期实施方案
> 依据《副本二期功能--定稿0802.docx》(4 大模块 26 项功能)制定。
> 前端仓库:`tuanwei-admin`(Vue3 + ele-admin-pro);后端仓库:`tuanwei-java`(Spring Boot + MyBatis-Plus)。
## 一、现状结论
二期的四项底座已经具备,可直接复用:
| 底座 | 现状 | 可复用点 |
| --- | --- | --- |
| 申报 + 审核流 | `gxmu_declare` / `gxmu_review_flow` / `gxmu_review_flow_config` / `gxmu_review_list`,9 张申报表全部接入 | 三级审核、状态回写、`ReviewFlowStarterService` |
| 学生统一身份 | `gxmu_student.user_id`(开放平台同步 + 认领)、`gxmu_teacher`、`gxmu_tygl_form` | 成长主页身份主键、组织作用域 |
| 文件存储 | `/api/file/upload` + S3 对象存储 + 缩略图 + office 转 PDF | 所有附件、证明材料 |
| 爬虫 + 异步任务 | `CrossSchoolActivityCrawlerServiceImpl`(jsoup + 定时 + upsert)、`OpenplatSyncServiceImpl`(进度表 + 轮询) | 主题团课库、批量导入与导出 |
三项能力必须新建:
1. **站内消息中心**:后端无 `oa_notice`,但前端顶栏铃铛与 `/user/notice` 已在调用 `/api/oa/notice/*`,属于前端等后端。
2. **业务域**:学分、志愿、社团、场地、青马培养、专家评审均无表无接口。
3. **OCR 与 PDF 生成**:无 OCR 依赖;PDF 只能通过服务器 LibreOffice 转换。
## 二、菜单规划
原则:不动现有 12 个一级菜单,不迁移已有子菜单(避免破坏角色授权)。新增 2 个一级菜单,其余挂到语义最近的现有菜单。
### 新增一级菜单
```
成长中心 /growth menu_id 14500
├ 我的成长 /growth/myHome 14501
├ 学分明细 /growth/credit 14502
├ 社会实践学分 /growth/practiceCredit 14503
├ 学分预警 /growth/creditWarning 14504
├ 学生画像 /growth/portrait 14505
└ 推荐内容 /growth/recommend 14506
社团与志愿 /club menu_id 14520
├ 志愿服务时长 /club/volunteerHour 14521
├ 志愿时长审核 /club/volunteerReview 14522
├ 志愿证明 /club/volunteerCertificate 14523
├ 社团管理 /club/club 14524
├ 社团活动 /club/activity 14525
├ 活动审批 /club/activityReview 14526
├ 场地预约 /club/venue 14527
├ 场地审批 /club/venueReview 14528
├ 社团年审 /club/annualReview 14529
└ 社团评优 /club/award 14530
```
### 挂到现有菜单
| 现有菜单 | 新增子项 |
| --- | --- |
| 数字化团员 14342 | 青马学员档案 `/gxmu/qmgcStudent`、培养任务 `/gxmu/qmgcTask`、考核评分 `/gxmu/qmgcScore`、主题团课库 `/gxmu/thematicCourse` |
| AI内容创作与宣传助手 14365 | AI辅助教学设计 `/gxmu/teachingDesign`、AI主题团日设计 `/gxmu/themeDayDesign` |
| 挑战杯 14372 | 专家评审 `/gxmu/expertReview`、专家库 `/gxmu/expertPool` |
| 系统设置 8574 | 消息模板 `/system/messageTemplate`、推送记录 `/system/messageLog` |
`青马工程`(14353)保留为申报入口;新增学员档案管理培养期,两者不合并。
消息中心的用户侧直接复用已有 `/user/notice` 与顶栏铃铛,前端零改动即可生效。
## 三、分期
### P0(可上线的最小闭环,约 53 人日)
| # | 功能 | 交付物 |
| --- | --- | --- |
| 1 | 站内消息中心 | `oa_notice` + `oa_notice_record` + `/api/oa/notice/*` + 审核钩子 |
| 2 | 第二课堂学分 | 学分规则/记录表 + Excel 导入 + 明细页 + 汇总 |
| 3 | 学生成长主页 | 聚合接口 + 简历式页面 |
| 4 | 志愿服务 | 个人录入 + 桂志愿导入 + 二级学院审核 + 时长汇总 |
| 5 | 社团管理 | 社团主档 + 成员 + 指导老师 |
| 6 | 场地预约 | 场地主档 + 日历 + 冲突校验 + 审批 |
| 7 | 青马培养档案 | 学员主档 + 培养材料 + 任务清单 |
| 8 | 主题团课库 | 表 + 列表 + 爬虫入库 |
| 9 | 工程配套 | 菜单/按钮/角色 SQL + 字典 + 权限码 |
### P1(第二批,约 63 人日)
社会实践学分申报(四级审核 + 教务处模板导出)、学分预警、智能推荐、学生画像、社团年审、社团评优、年度志愿证明、社团年度报告、专家评审、AI 辅助教学设计与主题团日设计、审核流并行审批改造。
### P2(探索期,约 23 人日)
AI 学员学习情况分析、AI 定制培养建议、OCR 公章识别、AI 数字人、移动端接口整理。
## 四、数据模型
统一规范:`id BIGINT AUTO_INCREMENT`、`tenant_id`、`user_id`、`deleted`、`create_time`、`update_time`。
附件:单文件用 `file_id + file_url`;多文件用 JSON 数组字符串。
审批统一复用 `gxmu_review_list(module, pk)`,模块名即业务表名。
建表脚本见:
- `docs/sql/phase2_01_growth_credit.sql`:学分、社会实践、毕业要求、预警、画像、推荐
- `docs/sql/phase2_02_volunteer.sql`:志愿服务与证明
- `docs/sql/phase2_03_club_venue.sql`:社团、成员、活动、年审、评优、场地、预约
- `docs/sql/phase2_04_qmgc.sql`:青马学员、材料、任务、评分、考试
- `docs/sql/phase2_05_thematic_course.sql`:主题团课库
- `docs/sql/phase2_06_notice.sql`:消息中心
- `docs/sql/phase2_07_review_parallel.sql`:审核流并行节点改造
- `docs/sql/phase2_08_menu_permission.sql`:菜单、按钮、角色授权
## 五、后端设计
新增包(不改动现有 24 个 gxmu 控制器):
```
com.gxwebsoft.gxmu.credit 学分规则、记录、导入、汇总、预警
com.gxwebsoft.gxmu.volunteer 志愿时长与证明
com.gxwebsoft.gxmu.club 社团、活动、年审、评优
com.gxwebsoft.gxmu.venue 场地与预约
com.gxwebsoft.gxmu.qmgcpro 青马培养档案(与现有 QmgcForm 申报区分)
com.gxwebsoft.gxmu.thematic 主题团课库
com.gxwebsoft.gxmu.growth 成长主页聚合
com.gxwebsoft.notice 消息中心
```
接口约定:
- 管理端:`/api/gxmu/{domain}/page|list|{id}|save|update|remove|batch`,沿用 `BaseController` + `BaseParam`,前端继续传 `backendAccess=true`。
- 学生自助:`/api/gxmu/{domain}/my/*`,用 `hasOnlyStudentRole()` 收口,只返回本人数据。
- 审核:不重复造轮子,统一写 `gxmu_review_list`,前端复用 `reviewStatusTag` / `reviewHistoryModal` / `reviewFlowModal`。
- 消息中心按前端既有路径 `/api/oa/notice/*` 实现,顶栏铃铛与 `/user/notice` 无需改代码。
## 六、前端设计
新增目录:
```
src/views/growth/{myHome,credit,practiceCredit,creditWarning,portrait,recommend}
src/views/club/{volunteerHour,volunteerReview,volunteerCertificate,club,activity,activityReview,venue,venueReview,annualReview,award}
src/views/gxmu/{qmgcStudent,qmgcTask,qmgcScore,thematicCourse,teachingDesign,themeDayDesign,expertReview,expertPool}
src/views/system/{messageTemplate,messageLog}
```
复用清单:
- 列表骨架 `ele-pro-table`,照 `views/gxmu/studentRoster`。
- 导入 `views/gxmu/components/common-import.vue`。
- 附件 `components/attachmentList.vue` + `views/gxmu/utils/attachment.ts`。
- 审核 `reviewStatusTag` / `reviewHistoryModal` / `reviewFlowModal`。
- 图表 `utils/use-echarts.ts`,照 `views/gxmu/youthDataCenter`。
- AI 页复制 `activityOutlineGen` 壳 + `utils/ai-stream.ts`。
新建公共件:
1. `components/MultiFileUpload`:统一多附件上传。
2. `components/AiGenPageShell`:AI 生成页外壳。
3. `utils/export.ts`:收敛 Excel/CSV/打印 PDF。
顺带修复:
- `views/user/profile` 保存改用 `PUT /system/user/self`(学生账号当前会因缺 `sys:user:update` 失败)。
- 统一「最新审核记录」排序规则到 `views/gxmu/utils/review.ts`。
## 七、实施顺序
1. 基建:消息中心 + 菜单权限 SQL + 公共上传组件。
2. 学分域:规则/记录/导入 → 成长主页聚合 → 明细页。
3. 志愿域:录入/导入 → 审核 → 汇总。
4. 社团域:社团主档/成员 → 活动 → 场地 → 预约。
5. 青马域:学员档案 → 任务 → 材料。
6. 团课库:建表 → 爬虫 → 列表。
7. P1 / P2 按上表推进。
## 八、待确认事项(有默认值,不阻塞 P0)
| 事项 | 默认假设 |
| --- | --- |
| 第二课堂 / 桂志愿 是否有 API | 先 Excel 导入,`source/external_id` 预留 |
| 学分规则与毕业要求 | 按「学院 + 年级 + 专业 + 类别」配置应修学分 |
| 青马评分标准 | 做成可配置评分项与权重 |
| 社团年审量化指标 | 指标配置表,活动数/参与人次/稿件数自动取数 |
| 指导老师人数 | 社团主档存 1 名主指导,审批节点支持多人 |
| 志愿证明模板与电子章 | 需提供模板与印章图;未提供时用占位版 |
| 团委科研课题是否新申报模块 | 视为新模块,新增 `gxmu_research_project` |
| 数字人形象 | 先用团委现有卡通形象,不做 3D |