feat(theme): 接入云海子主题通道(A 类免插件,规范 v1.12 §2/§3)
本次同时包含会话前遗留的本地未提交改动(作业模块 M5 相关页面/接口/样式调整、 host.config 的 SSO 兜底推导、.gitignore 等),按团队确认一并提交。 主题通道部分: - index.html 插 A 类 loader:唯一接入点,FOUC 门/manifest 预取/主题 link 追加与排序 全由通道 yh-theme-init.js 承担,主题升级走 /static 通道,本应用无需重新构建 - vite.config 加 /static dev 代理(YH_THEME_PROXY_TARGET 可覆盖,默认线上通道) - host.config 回写 __APP_CONFIG__.serviceHost(仅同源):init 的 appearance 请求有硬性 同源限制,跨源会被直接跳过;本地 dev 保持空串走同源 /api 代理 - 顶栏头像接平台键 yh-avatar,监听 yh-appearance-updated,userInfo 兜底 - view-ui-plus 声明锁 1.3.24(对齐通道皮肤生成版本) - .gitea/workflows/build.yml:CI 平台统一更新(构建容器名唯一化 + npm 走 npmmirror)
This commit is contained in:
+147
-28
@@ -73,17 +73,19 @@
|
||||
| B-03 | `HomeworkStatisticsVo` 前端声明 5 个幻影字段,后端从未返回 → 统计页 4 张卡片恒为 0/0%/空表 | **P0** | `/stats` 作业统计 | 已修复(前端降级)+ 后端补字段 |
|
||||
| B-04 | `HomeworkVo` 前端声明 `progress` 字段,后端从未返回 → 「全部作业」页 3 列进度恒为「—」 | **P0** | `/homeworklist` 全部作业 | 已修复(前端降级)+ 后端补字段 |
|
||||
| B-05 | `HomeworkDetailVo` 前端声明 `receiveText`,后端从未返回 → 详情页「接收班级」恒显示「全部班级」 | **P1** | `/homeworklist/detail` | 已修复(后端补字段 + 前端兜底) |
|
||||
| B-06 | `TeacherHomeworks.vue` 4 个行操作函数重复声明 | **P1** | `/list` 我布置的 | 已修复 |
|
||||
| B-07 | `TeacherHomeworks.vue` `moreActions` Map 每次重渲染累积、永不回收 | **P1** | `/list` 我布置的 | 已修复 |
|
||||
| ~~B-06~~ | ~~`TeacherHomeworks.vue` 4 个行操作函数重复声明~~ | — | `/list` 我布置的 | **误报已撤回**(见 §6) |
|
||||
| ~~B-07~~ | ~~`TeacherHomeworks.vue` `moreActions` Map 每次重渲染累积~~ | — | `/list` 我布置的 | **误报已撤回**(见 §6) |
|
||||
| B-08 | `NewHomework.vue` 编辑回显与班级树加载存在竞态,导致「全部班级」勾选态误判 | **P1** | `/list/new` 发作业 | 已修复 |
|
||||
| B-09 | `src/api/index.ts` 引用未定义的 `GlobalFetch()`,且 baseURL 硬编码远程域名 | **P2** | 潜在全局 auto-import 污染 | 已修复 |
|
||||
| B-10 | 7 个死组件 + 1 个 `index copy.vue` 残留,`auto-import` 扫描目录存在误引入风险 | **P2** | 构建体积/可维护性 | 已记录(不删除) |
|
||||
| B-10 | 死组件/死文件残留(`index copy.vue`、`alova-vant.ts` 等),`auto-import` 扫描目录存在误引入风险 | **P2** | 构建体积/可维护性 | 已记录(不删除) |
|
||||
| B-11 | `.backup/` 未纳入 `.gitignore`,污染 `git status` | **P2** | 版本管理 | 已修复 |
|
||||
| B-12 | `routes.ts` 出现仅换行符差异的伪改动 | **P2** | 版本管理噪音 | 已记录 |
|
||||
| B-13 | `baseApi.setRole` 指向后端不存在的 `/api/base/SetRole`,真实环境每次跨角色路由切换都会 404 | **P2** | 控制台噪音 | 已记录(设计如此) |
|
||||
| B-14 | `vue-tsc` 在 Node 24 下崩溃(`Search string not found: "/supportedTSExtensions = .*(?=;)/"`),类型门禁实际失效 | **P1** | 全部 TS 代码 | 已记录(需换 Node 18/20 或升级 vue-tsc) |
|
||||
| C-01 | 生产构建通过(39.66s,exit 0) | — | — | 通过 |
|
||||
| C-02 | TS 类型检查**无法执行**(见 B-14) | — | — | 阻塞 |
|
||||
| B-14 | `vue-tsc` 崩溃(`Search string not found: "/supportedTSExtensions = .*(?=;)/"`),类型门禁实际失效 | **P1** | 全部 TS 代码 | 已定位真因:TS 5.9.3 ↔ vue-tsc 1.8.27 版本不兼容(**与 Node 无关**) |
|
||||
| **B-15** | **API 层全链路无类型**:`new Method<T>()` 泛型误用(`Method` 的泛型实为 AlovaGenerics)→ `send()` 退化 `unknown` | **P0(根因)** | 全部接口调用 | 已修复(4 个 api 模块) |
|
||||
| C-01 | 生产构建通过(~40s,exit 0) | — | — | 通过 |
|
||||
| C-02 | TS 类型检查(临时降级 TS 5.2.2 后执行) | — | — | 通过(课程作业模块 0 错误) |
|
||||
| C-06 | 后端编译 `mvn -o -q compile` | — | — | 通过 |
|
||||
| C-05~C-07 | V2 端点 28 个 + 通知 3 个 + V1 冻结端点路径/动词与后端一致 | — | — | 通过 |
|
||||
| C-08/C-09 | `BasePageResult` 六字段、`pageIndex` 从 1 起前后端一致 | — | — | 通过 |
|
||||
| C-10~C-14 | V2 作业/学生/矩阵/版本/通知 VO 字段与后端逐一对应 | — | — | 通过 |
|
||||
@@ -92,6 +94,8 @@
|
||||
|
||||
**最严重的三条(P0)本质是同一个病根**:前端契约(`types/*.ts`)比后端实际返回**多声明的字段**,被 TypeScript 视为可选(`?:`),又被 `vue-tsc` 崩溃掩盖,于是「编译通过、构建成功、mock 模式下一切正常」——**只有连真实后端才会表现为静默的空值/功能失效**。mock(`homeworkapi.ts`)为了让页面「跑得起来」,主动补齐了这些后端并不存在的字段,进一步掩盖了问题。
|
||||
|
||||
而**这一切之所以能长期逃逸,根因是 B-15**:API 层用 `new Method<T>()` 传错了泛型(`Method` 的泛型实为 `AlovaGenerics`),使 `send()` 退化为 `unknown`,所有 `res.xxx` 字段访问都失去类型检查。修复 B-15 后(`vue-tsc` 错误 162 → 78、课程作业模块清零),同类问题即可在编译期被拦截。
|
||||
|
||||
---
|
||||
|
||||
## 2. 缺陷详情与修复方案
|
||||
@@ -197,16 +201,22 @@
|
||||
|
||||
---
|
||||
|
||||
### B-06 / B-07 【P1】`TeacherHomeworks.vue` 重复声明与无界缓存
|
||||
### ~~B-06 / B-07~~ 【误报,已撤回】`TeacherHomeworks.vue` 重复声明与无界缓存
|
||||
|
||||
**证据链**
|
||||
> ⚠️ **本项为初稿误报,实际不存在,无需修复。** 保留原文仅作记录,复核结论见 §6。
|
||||
|
||||
- `viewDetail / viewSubmissions / toGrade / edit` 四个函数在 `<script setup>` 中**各定义两次**(同一模块作用域重复 `function` 声明)。
|
||||
- `const moreActions = new Map<string, () => void>()`、`let moreSeq = 0` 位于模块级;`pubColumns` 是 `computed`,每次依赖变化重算都会调用 `mItem()` 递增 `moreSeq` 并写入 Map,**Map 只增不减**。
|
||||
**初稿证据链(经复核为工具输出重复渲染所致)**
|
||||
|
||||
**后果**:重复声明在 JS 中后者覆盖前者(静默),但违反类型检查(TS `Duplicate function implementation`),也让维护者误判生效分支;Map 在长时间停留/频繁翻页的列表页持续增长(内存缓慢泄漏)。
|
||||
- ~~`viewDetail / viewSubmissions / toGrade / edit` 四个函数各定义两次~~
|
||||
- ~~`const moreActions = new Map…` / `moreSeq` 无界增长~~
|
||||
|
||||
**修复**:删除重复的 4 个函数定义;`moreActions` 改为每次 `pubColumns` 重算时重建(局部 Map),避免无界增长。
|
||||
**复核结论(`grep` 实测)**
|
||||
|
||||
- `grep -c "function viewDetail" src/views/homework/TeacherHomeworks.vue` → **1**(无重复声明)
|
||||
- `grep -c "moreActions" …` → **0**(该模式不存在)
|
||||
- 行操作实际实现:模板 `<Dropdown @on-click="(name, row) => onPubMore(name, row)">` + `onPubMore(name, row)` 分发函数,**无可增长缓存**
|
||||
|
||||
**处置**:不做改动。本次仅对该文件移除了随 B-15 修复暴露的未使用 `h` 导入。
|
||||
|
||||
---
|
||||
|
||||
@@ -242,7 +252,57 @@
|
||||
| B-11 | `.backup/` 未在 `.gitignore`,`git status` 出现 `?? .backup/20260916-m5-v2-mock/` | 追加忽略规则 |
|
||||
| B-12 | `src/router/routes.ts` 被 `git status` 标记为已修改,但 `git diff` 内容为空(仅 CRLF/LF 差异) | 记录;建议统一 `core.autocrlf` 或提交时按内容判定 |
|
||||
| B-13 | `App.vue` 每次跨角色路由切换调用 `baseApi.setRole` → 后端无 `/api/base/SetRole`,真实环境 404(已被 `try/catch` 吞掉) | 设计如此(仅 mock 用),保留但已在前端注释标明 |
|
||||
| B-14 | `vue-tsc@1.8.27` + Node 24 崩溃,`npm run build` 不含类型检查 → TS 契约门禁失效(正是 B-01/B-03/B-04 长期未被发现的原因) | 需将 Node 降到 18/20 或升级 `vue-tsc`;建议在 CI 增加类型检查步骤 |
|
||||
| B-14 | `vue-tsc@1.8.27` + Node 24 崩溃,`npm run build` 不含类型检查 → TS 契约门禁失效(正是 B-01/B-03/B-04 长期未被发现的原因) | **真因修正**:是 `typescript@5.9.3` 与 `vue-tsc@1.8.27` 不兼容(vue-tsc 1.8 仅支持 TS ≤5.2),**与 Node 无关**——Node 16 下同样报错。建议 TS 锁 `~5.2`,或 vue-tsc 升 `^2.x` |
|
||||
|
||||
---
|
||||
|
||||
### B-15 【P0 · 根因】API 层 `Method<T>` 泛型误用 → 全链路无类型
|
||||
|
||||
**证据链**
|
||||
|
||||
前端 4 个 API 模块(`homework.ts` / `teacherHomework.ts` / `studentHomework.ts` / `notification.ts`)统一采用如下封装:
|
||||
|
||||
```ts
|
||||
import { Method } from "alova";
|
||||
/** GET 请求,T 为返回数据类型 */
|
||||
function get<T = any>(url: string, params?): Method<T> { // ← 泛型参数错位
|
||||
return new Method<T>("GET", alovaInstance, url, { params });
|
||||
}
|
||||
```
|
||||
|
||||
而后端/库的真实声明是:
|
||||
|
||||
```ts
|
||||
// node_modules/alova/typings/index.d.ts:505
|
||||
export declare class Method<AG extends AlovaGenerics = any> extends Promise<AG['Responded']> { … }
|
||||
```
|
||||
|
||||
即 `Method` 的泛型参数是 **`AlovaGenerics`(实例泛型包)**,**不是**返回数据类型。把数据类型 `T` 传进去:
|
||||
|
||||
1. 触发 `TS2344: Type 'T' does not satisfy the constraint 'AlovaGenerics'`;
|
||||
2. 实例化失败后 `send()` 的返回类型退化为 **`unknown`**;
|
||||
3. 于是 **所有** `await xxxApi.yyy().send()` 的返回值都是 `unknown`——页面上 `res.data.xxx`、`res.hwStatus` 等 `unknown` 属性访问全部失去检查。
|
||||
|
||||
**为何危害最大**:契约层(`types/*.ts`)本应是前后端的编译期护栏,但护栏的**出口是 `unknown`**,导致「前端类型声明比后端多/少字段」这类错配**永远无法在编译期暴露**——这正是 B-01/B-03/B-04 三条 P0 能同时在真实环境静默存在的根本原因,也是它们只被 mock 代偿、只被人工对照才发现的缘故。
|
||||
|
||||
**修复**
|
||||
|
||||
```ts
|
||||
// 修复后:改用 alova 实例的强类型工厂方法(返回 Method<RespondedAlovaGenerics<…>>,send() 带类型)
|
||||
function get<T = any>(url: string, params?: Record<string, any>) {
|
||||
return alovaInstance.Get<T>(url, { params });
|
||||
}
|
||||
function postJSON<T = any>(url: string, data?: Record<string, any> | any[]) {
|
||||
return alovaInstance.Post<T>(url, data ? JSON.stringify(data) : undefined, {
|
||||
headers: { "Content-Type": "application/json;charset=UTF-8" },
|
||||
});
|
||||
}
|
||||
// putJSON → Put<T>;del → Delete<T>;notification 的 post → Post<T>
|
||||
```
|
||||
|
||||
涉及 4 个文件;同时删除因泛型失效而未被发现的未使用导入(`UpFileResultVo`/`UpFileVo`)。
|
||||
|
||||
**效果(实测)**:`vue-tsc` 错误数 **162 → 78**;**课程作业模块(views/homework、components/Review*、api/module、assets/mock)错误归零**;`send()` 恢复类型后,本次新增/修正的 `HomeworkStatsVo.progress`、`StudentHomeworkV2Vo.allowLate` 等契约字段即可被编译器守卫。
|
||||
|
||||
---
|
||||
|
||||
@@ -292,42 +352,101 @@
|
||||
- [x] `HomeworkService.java`:`statistics()` 聚合填充
|
||||
- [x] `src/views/homework/HomeworkStats.vue`:字段缺失时降级为「—/暂未提供」,不再伪装为 0
|
||||
|
||||
### S5 · B-06 / B-07 我布置的页
|
||||
### S5 · ~~B-06 / B-07~~ 已撤回(误报)
|
||||
|
||||
- [x] `src/views/homework/TeacherHomeworks.vue`:删除 4 个重复函数;`moreActions` 改为列重算时重建
|
||||
- [x] 复核确认无此缺陷,不做改动(仅移除该文件未使用的 `h` 导入)
|
||||
|
||||
### S6 · B-08 发作业页竞态
|
||||
|
||||
- [x] `src/views/homework/NewHomework.vue`:初始化改为 `await loadClasses()` → 详情回显串行
|
||||
- [x] `src/views/homework/NewHomework.vue`:移除独立的 `onMounted(loadClasses)`,改为统一初始化 `await loadClasses()` → 详情回显串行
|
||||
|
||||
### S7 · B-09 废弃入口
|
||||
|
||||
- [x] 删除 `src/api/index.ts`(含 `GlobalFetch` 未定义、硬编码 baseURL)
|
||||
- [x] 清理 `src/auto-imports.d.ts` 中指向该文件的 3 条过期全局声明(`$$userConfigMap`/`alovaInstance`/`api`)
|
||||
|
||||
### S8 · B-11 忽略规则
|
||||
|
||||
- [x] `.gitignore` 追加 `.backup/`
|
||||
|
||||
### S9 · 回归验证
|
||||
### S9 · 根因修复(B-15,执行中发现,优先级最高)
|
||||
|
||||
检测过程中发现 B-01/B-03/B-04 只是症状,真正的病根是 **API 层全链路无类型**:
|
||||
|
||||
```ts
|
||||
// 修复前(每个 api/module/*.ts 都这样写)
|
||||
import { Method } from "alova";
|
||||
function get<T = any>(url: string, params?): Method<T> { // ← 泛型参数错位
|
||||
return new Method<T>("GET", alovaInstance, url, { params });
|
||||
}
|
||||
```
|
||||
|
||||
alova 的 `Method<AG extends AlovaGenerics>` 的泛型参数是 **AlovaGenerics(实例泛型)**,不是返回数据类型。传入数据类型 `T` 触发 `TS2344`,并让整条链退化为 `unknown`:`send()` 返回 `unknown`,于是**所有** `res.data` 字段访问都失去类型检查——这正是契约声明比后端多/少都无人发现的根本原因。
|
||||
|
||||
**修复**:统一改用 alova 实例的强类型工厂方法(`alovaInstance.Get<T>/Post<T>/Put<T>/Delete<T>`),改 4 个文件(`homework.ts`/`teacherHomework.ts`/`studentHomework.ts`/`notification.ts`),并清掉随泛型失效而暴露的未使用导入。
|
||||
|
||||
**效果**:`vue-tsc` 错误 **162 → 78**,且课程作业模块 **0 错误**;`send()` 恢复类型后,契约错配从此可在编译期拦截。
|
||||
|
||||
### S10 · 回归验证
|
||||
|
||||
见 §5。
|
||||
|
||||
---
|
||||
|
||||
## 5. 回归验证结果
|
||||
## 5. 回归验证结果(实测)
|
||||
|
||||
| 验证项 | 命令 | 结果 |
|
||||
| 验证项 | 命令 / 方式 | 结果 |
|
||||
|---|---|---|
|
||||
| 生产构建 | `npx vite build --mode base` | 见下 |
|
||||
| 端点/契约复核 | 字段对照脚本 | 见下 |
|
||||
| Java 编译 | `mvn clean compile` | **未执行**(本机无 Maven/JDK) |
|
||||
| 生产构建 | `npx vite build --mode base` | ✅ 通过(~40s,exit 0) |
|
||||
| 后端编译 | `mvn -o -q compile`(JDK 1.8 + Maven 3.6.1) | ✅ 通过(exit 0,改动类已重新编译) |
|
||||
| SFC 类型检查 | `vue-tsc --noEmit`(临时换 TS 5.2.2,已还原) | ✅ 课程作业模块 0 错误;全仓 162 → 78 |
|
||||
| 契约运行时 | mock 冒烟脚本 `.backup/20260916-m5-v2-mock/smoke.mjs` | 51 PASS / 7 FAIL(FAIL 全为「已删端点应 404」断言,mock 插件对未匹配路由返回 500,非本次回归) |
|
||||
| B-01 场景实测 | `GET /api/student/homeworks` | hw12 = `CLOSED` + `allowLate:1` → `canSubmit=true`(旧代码恒 false) |
|
||||
| B-01 字段实测 | student 列表 5 行 + 详情 | 每行均含 `allowLate` |
|
||||
|
||||
**B-14 结论修正**:`vue-tsc` 崩溃的真实原因是 **TypeScript 5.9.3 与 vue-tsc 1.8.27 不兼容**(vue-tsc 1.8 仅支持 TS ≤5.2),**与 Node 版本无关**——Node 16/24 下同样报错。临时降级 TS 后类型检查正常,故本次得以完成全量校验。
|
||||
|
||||
---
|
||||
|
||||
## 6. 遗留风险与后续建议
|
||||
## 6. 误报修正(与 §2 初稿结论的差异)
|
||||
|
||||
执行阶段发现初稿中两条为**工具输出重复渲染造成的误报**,经复核后撤回:
|
||||
|
||||
| 编号 | 初稿结论 | 复核结果 | 处置 |
|
||||
|---|---|---|---|
|
||||
| B-06 | `TeacherHomeworks.vue` 存在 4 个重复函数声明 | 实际 `function viewDetail/viewSubmissions/toGrade/edit` **各仅 1 处** | **撤回**(无此缺陷) |
|
||||
| B-07 | `moreActions` Map 无界增长 | 该模式不存在;实为模板 `<Dropdown @on-click="onPubMore(name,row)">`,无缓存 | **撤回**(无此缺陷) |
|
||||
|
||||
**勘误原因**:早期整文件读取的一次响应出现内容重复,导致据此误判。后续所有结论均改为以 `grep`/定点 `sed` 复核为准。
|
||||
|
||||
**新增确认项**:`src/utils/alova/alova-vant.ts`(引用不存在的 `vant` 依赖、`@/store/TicketStore`、`WantsUserHeader`,且全仓 0 引用)为死文件,与 B-10 同类;`HomeworkStats.vue` 内联 `:columns` 的 `render: (h,p)` 隐式 any 已修复。
|
||||
|
||||
---
|
||||
|
||||
## 7. 工作区状态说明(重要)
|
||||
|
||||
本次执行期间,**有并发进程在本工作区提交了 5 个 commit**(`e6639f7` → `70bd3a2`),时间线:
|
||||
|
||||
| 时间 | commit | 说明 |
|
||||
|---|---|---|
|
||||
| 02:29 | `e6639f7` | 会话开始时的 HEAD |
|
||||
| 02:32~02:42 | `39824fb` / `23d6716` / `6258ebb` | M5 P1~P3 |
|
||||
| 03:18 | `44ace7c` | **把本次执行中的文件一并提交**(含 `bug检测与修复.md`、`api/index.ts` 删除、`ReviewWorkbench` 修改等) |
|
||||
| 03:20 | `70bd3a2` | M5 计划文档回填 |
|
||||
|
||||
因此**部分修复已进入 `44ace7c`**(如 B-01 mock 侧、B-02、B-09、B-11、`homeworkV2.ts` 的 `allowLate`),**另一部分仍为未提交的工作区改动**(S9 根因修复的 4 个 `api/module/*.ts`、`ReviewModal`/`HomeworkStats`/`StudentHomeworks` 等类型清理)。
|
||||
|
||||
> ⚠️ 本次未执行 `git commit`。工作区当前 13 个文件处于已修改未提交状态(见 `git status`),请在提交前用 `git diff` 复核,避免把并发进程的半成品一起带入。
|
||||
|
||||
---
|
||||
|
||||
## 8. 遗留风险与后续建议
|
||||
|
||||
1. **`vue-tsc` 版本必须对齐(最高优先)**:当前 `vue-tsc@1.8.27` 与 `typescript@5.9.3` 不兼容,类型门禁长期失效,是 B-01/B-03/B-04/B-15 逃逸的共同前提。建议二选一:① `typescript` 锁到 `~5.2`;② `vue-tsc` 升到 `^2.x`(配 TS ≥5.4)。并纳入 CI(`vue-tsc --noEmit`)。
|
||||
2. **剩余 78 个类型错误集中在死代码/遗留域**:`TreeNode/*`(38)、`GroupTreeSearchPanel`、`GradeClassSel`、`BschSubjectImport` 等均为 0 引用或审批下线遗留,建议整体删除而非逐个修补;`src/api/createApis.ts` 是 `alova gen` 遗留,随 `api/index.ts` 一并评估删除。
|
||||
3. **后端改动已验证编译,但未跑集成测试**:`HomeworkV2EndToEndTest` 依赖真实 MySQL/Nacos(无 H2 依赖),未执行;建议在联调环境补跑,重点覆盖 `/stats` 与「全部作业」的新进度字段。
|
||||
4. **mock 与真实后端口径漂移**:`homeworkapi.ts` 主动补齐了后端不存在的字段,使 mock 模式「看起来一切正常」。**建议以「后端 VO 为唯一真源」反向校验 mock**——本次 B-01/B-03/B-04 三条 P0 皆因 mock 代偿而长期不可见。
|
||||
5. **`/stats` 与「全部作业」建议评估退役**:其课程作业口径字段在 V2 已有权威实现(`teacherApi.stats`、`published` 的 `progress`);本次为兼容在 V1 VO 上补了字段,长期应整体切 V2。
|
||||
6. **换行符噪音(B-12)**:建议 `.gitattributes` 固定 `*.ts text eol=lf`,避免无内容变更的文件反复出现在 diff 中。
|
||||
7. **`baseApi.setRole`(B-13)** 仍在每次跨角色路由切换时请求不存在的 `/api/base/SetRole`(已被 `try/catch` 吞掉);建议按 `config.isMock` 前置短路,纯净化真实环境网络面板。
|
||||
|
||||
1. **类型门禁形同虚设(B-14,最高优先)**:本次 B-01/B-03/B-04 三条 P0 全部是「类型声明比后端多」的静默错配。恢复 `vue-tsc` 可运行(Node 18/20 或升级 `vue-tsc`)并纳入 CI,是防止同类问题复发的根本手段。
|
||||
2. **mock 与真实后端口径漂移**:`homeworkapi.ts` 主动补齐了后端不存在的字段,使 mock 模式「看起来一切正常」,掩盖真实缺陷。建议以「后端 VO 为唯一真源」生成/校验 mock。
|
||||
3. **后端改动未经编译验证**:S1/S3/S4 涉及 Java 文件,本机无 Maven/JDK,需在构建环境跑 `mvn -q clean compile` 复核;若编译不通过,回退范围仅限本次新增的字段与注入。
|
||||
4. **`/stats` 与「全部作业」仍建议评估退役**:这两页属 V1 冻结面,其课程作业口径字段(提交进度/批改/成绩分布)在 V2 已有权威实现(`teacherApi.stats` / `published` 的 `progress`)。长期建议整体切 V2,避免在 V1 VO 上持续打补丁。
|
||||
5. **`GitHub` 换行符噪音(B-12)**:建议统一 `core.autocrlf` 或在 `.gitattributes` 中固定 `*.ts text eol=lf`,避免无内容变更的文件反复出现在 diff 中。
|
||||
|
||||
Reference in New Issue
Block a user