Files
zszq-trs/项目文档/00-项目接手总览.md

154 lines
12 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.
# 00 · 项目接手总览(技术栈 / 避坑 / 文档复核 统一入口)
> 本文是 zszq-trs 项目的**唯一接手入口文档**。所有"技术栈怎么学、哪里容易踩坑、现有文档准不准"都先读这一份。
> 模块级细节(某个字段互算、某个改进方案)见末尾「专项文档索引」,不要本文件里展开。
> 所有结论均来自对代码库的实际扫描(2026-07-29 核实),非凭印象。
---
## 一、一句话定位
这是一个 **ASP.NET Core (C#) 后端 + 老前端(jQuery 3.5.1 / Vue 2.6.14 / 内部 FastVue+ 新前端(TypeScript + qiankun 微前端 V3)三栈并存** 的项目。
你以为要啃"古老",其实主力是 **jQuery + Vue2 + FastVue**,且新模块已经走 **Vue3 微前端(otcdms-ui**。约 **494 个存量页面**仍是 Razor 服务端渲染 + 老前端。
---
## 二、技术栈真实地图(实测)
| 层 | 真实技术 | 备注 |
|---|---|---|
| 后端 | ASP.NET Core (C#) | 146 个 Controllers/WebAPIYLErpDAL 数据层;SignalR Hubs 实时推送 |
| 老前端(存量 ~494 页) | jQuery **3.5.1** + Vue **2.6.14** + 内部 **FastVue** | 以 bundle 全局加载;无 webpack/HMR |
| 后台管理区(Areas/Admin | jQuery + Vue2 + **bootstrap-table** + toastr,打包为 `bundleV2.js` | 与主站 bundle **不同栈**:无 FastVue、无 jqGrid;仅 `Areas/Admin/_Layout.cshtml` 及其子页引用(如 OwnerInfo)。**与微前端无关** |
| 新前端微前端 | **qiankun 2.10.5** 加载子应用 **otcdms-ui**(Vue3) | 源码/构建在**另一仓库**;本仓库仅 `Views/V3/Index.cshtml` 宿主页经 `qiankun.registerMicroApps/start()` 加载 `/otcdms-ui/` |
| 控件 | layer(弹窗) / chosen / flatpickr / ueditor / bootstrap-table | layer 最高频 |
| 构建 | `bundleconfig.json` + `rebuild-bundles.py/ps1/sh` 手工打包 | 浏览器用 `?v=HtmlUtil.JsVersion` 缓存戳 |
> ⚠️ 常见误判:**不是 Vue 1.x,是 Vue 2.6.14jQuery 也不是 1.x,是 3.5.1。** 另外项目已经用上 qiankun 微前端,别把它当纯古老项目。
---
## 三、高频技术优先级(按本项目真实文件数排序)
数字 = 在 `Views`/`wwwroot/Scripts` 中出现该技术的文件数,直接决定你把精力放哪。
| 技术 | 文件数 | 角色 | 学习优先级 |
|---|---:|---|---|
| Razor / `ViewBag` / `@section` / `HtmlUtil.JsVersion` | **494** | 服务端模板,几乎每页 | 🔴 必学 |
| jQuery(含 `$.ajax` **113** | 全页 bundle | DOM 操作 + 数据请求 | 🔴 必学 |
| `layer` 弹窗 | **355** | 弹层/确认框,最高频控件 | 🔴 必学 |
| Vue 2.6`new Vue(` **84** + 内部 **FastVue****73** | 84 / 73 | 表单与组件 | 🔴 必学(用 FastVue,不是裸 Vue |
| `chosen`(40) / `flatpickr`(26) / `ueditor`(17) / `bootstrap-table`(14) | — | 下拉/日期/富文本/表格 | 🟡 按需 |
| SignalR Hubs | 后端 | 实时推送 | 🟡 后端侧 |
| qiankun / TS V2otcdms-ui | **2**(V3 宿主页) | 新微前端 | 🟢 只做新模块才碰 |
**结论**:别把时间砸在"现代前端工具链"上。老前端没有 webpack、没有 npm 打包、没有 HMR;你 80% 的活在 **jQuery + layer + Vue2(FastVue) + Razor** 这四样。
---
## 四、Java 老兵最易踩的 6 个坑
1. **改了 JS 页面没反应(最高频)** — 老前端不是实时编译。你改的是 `wwwroot/Scripts/` 源文件,必须经 `rebuild-bundles` 重新打包成 `bundles/*.js`,浏览器再靠 `?v=JsVersion` 缓存戳刷新。**没重跑构建 = 跑的还是旧 bundle。**
2. **jQuery 直接操作 Vue 管理的 DOM** — 灾难。`el:'#vueDiv'` 挂载后那块 DOM 归 Vue 管,别用 `$(el).html()` 改;反之 jQuery 控制的区域也别挂 Vue。
3. **Vue2 响应式陷阱**(和 Vue3 完全不同,无 Composition API):给 `data` 对象**新增属性**必须 `this.$set(form,'x',val)`**数组按索引赋值**不更新,用 `splice/push``v-for``v-if` 同元素时 **v-for 优先级更高**;组件 `data` 必须是函数。
4. **Razor / `ViewBag` 运行时炸** — 如 `RiskDailyReportLimit data = ViewBag.Data;` 若后端没塞值,服务端直接 **500**。这是 `dynamic` 无编译期检查,Java 的 Optional/类型安全在这里没有。
5. **script 加载顺序 + iframe** — jQuery/Vue 在 `_Layout.cshtml` 里先以 bundle 加载,业务脚本用 `@section JS` 注入;顺序错就 `$ is not defined`。很多页面嵌在 iframe 里(见 `window.parent.location.reload()`)。
6. **FastVue ≠ 原生 Vue** — 项目封了 `FastVue`autocomplete / numberInput / Form 等)。新人常照原生 Vue 写而踩坑:**先读 `fastVue.base.js`/`components.js`/`form.js` 吃透约定**(表单绑定、组件注册),别裸写。
---
## 五、20 年 Java 老兵速成路径(借力优势)
你的优势很强,别从"前端小白"视角学,从"工程老手"视角映射:
- **强类型 → 直奔 V2 的 TypeScript**`.mts/.mjs` 有类型,你最舒服,也最保值)。
- **OOP/分层 → 理解 FastVue 组件化**(本质是 Options API 封装,组件 = 数据/方法/生命周期,和写 Java Bean+方法没两样)。
- **后端经验 → 读契约**:直接看 `Controllers/WebAPI`146 个)和 `Hubs`,搞清请求/响应字段,前端只是渲染。
**不要浪费时间**:别学 webpack 现代打包(老前端用不上)、别学 Vue3 Composition API(项目是 Vue2 Options API)、qiankun 只在新子应用出现(2 处)。
**里程碑顺序**
1. 打通「改→构建→生效」闭环:本地 `start.dev.sh` 起服 → 改一个 cshtml 里的小 JS → 跑 `rebuild-bundles` → 浏览器看生效。(解决 80% 卡点)
2. 精读 3 个典型页对照:一个纯 jQuery、一个 `new Vue(`、一个 FastVue。
3. 通读 `fastVue.base.js / components.js / form.js` 三个封装文件。
4. jQuery 核心:选择器、`$().on` 事件委托(动态元素必须委托)、`$.ajax`/`Deferred``layer.open/confirm`
5. Vue2 Options API`data/methods/computed/watch/components/$set/$emit`
6. 后端侧:读一个 Controller + 对应 ViewBag 数据来源,闭环理解契约。
7. 进阶(仅新模块):TS + qiankun 接入方式。
---
## 六、现有文档准确性复核(踩坑指南 / 长期改进方案)
> 复核对象:《互换债券三字段互算踩坑总结与测试指南》《互换模块长期改进方案》(均已读,并与代码库逐项核对)。
### 6.1 经代码核实「准确」的部分(可放心照做)
| 项 | 核实结果 |
|---|---|
| 5 个根因(`.native` 被 jQuery 拦截 / 非 `data()` 属性不响应 / `$set` 同引用不触发 / `main.post` reject 不走 `.done` / 构建缓存路径) | ✅ 全部属实,且有代码佐证(`fastVue.base.js:488` 用 jQuery 绑 keydown`swapTradeEdit.js:380` `$set``base/main.js:384` `deferred.reject`,且代码里已有 `⚠️【全局陷阱/接手必读】__post 的成败路由` 注释——文档结论已反哺代码) |
| `bundle.js` 体积 | ✅ 实测 800.8KB(文档 801KB |
| `swapTradeEdit.js` 行数 | ✅ 实测 1963 行 |
| `FastVue.autocomplete(el,options,context)` / `numberInput(append/precision/negative)` 签名 | ✅ 与代码一致 |
### 6.2 需要修正的数字与一处自相矛盾
| 文档说法 | 实测(排除 node_modules | 修正建议 |
|---|---|---|
| `new Vue` 组件 **67 个** | **88 文件 / 115 处** | 更新数字或注明统计口径(如"仅互换模块" |
| JS 单测 **22 个文件** | **9 个 `.test.js`**(fe-tests | 更新;当前远不到 22 |
| C# 单测 **133 文件 / 37933 行** | **261 个 `*Test*.cs`**(排除 obj/bin) | 重数并更新,注明统计范围 |
| `289 个 JS 文件` | 准确,但 = `wwwroot/Scripts` 自有脚本;全量(含 libs)是 **553** | 注明口径,避免与全量混淆 |
**内部矛盾**:《长期改进方案》2.3 写"前端组件测试 `@vue/test-utils` ✗ 缺失",但同系列《踩坑总结》5.1 明确列了 `fastVue.enter.test.js` / `numberInput.paste.test.js` 已存在且全绿。两文档自相矛盾——实际上组件测试**已部分存在**,缺的是页面级集成测试。
### 6.3 最关键的补充:文档漏掉了真实的现代化路径(otcdms-ui / V3 微前端)
- 代码里已有一个**在跑的 Vue3 微前端**:`Views/V3/Index.cshtml:60-85``window.qiankun.registerMicroApps([{name:'vue3', entry:'/otcdms-ui/', activeRule:'/v3'}])` + `initGlobalState` + `start()`
-**otcdms-ui 是 Vue3 子应用,经 qiankun 嵌入 C# 主站**;跨应用通信用 `initGlobalState`/`actions.onGlobalStateChange`(见 V3 页 67-84 行)。
- 但《长期改进方案》把终态设为"纯 Vue2 组件化 + 去 jQuery + esbuild",对 qiankun/V3/otcdms-ui/Vue3 **零提及**(grep 整个项目文档,仅《估值模块重构》在"否决方案"表里顺带提了 otcdms-ui 一句)。
**影响**:阶段 2/3 的目标与代码实际演进方向不一致。新人按文档会以为"还技术债 = 把老页面重写成 Vue2 原生",但团队真实做法是「**新模块写 otcdms-ui(Vue3) 微前端,老模块只做稳定 + 补测试**」。
**建议修订动作**
- [ ] 补一节「前端战略:otcdms-ui(Vue3) 微前端」——V3 宿主页、子应用接入规范、全局状态通信约定、独立构建与 C# 主站版本协同。
- [ ] 阶段 0/1(测试 + CI + 构建现代化)依然正确且最高优先级,但应明确"**仅用于老栈止血**";阶段 2/3 改写为"老栈只做稳定+测试,新功能一律 otcdms-ui"。
- [ ] 另补一篇《V3/otcdms-ui 微前端接入与避坑》:qiankun JS 沙箱/样式隔离、public-path、全局变量污染、jQuery 全局 `$` 与沙箱冲突、子应用独立部署与缓存版本协同(当前完全无文档)。
### 6.4 其他建议
- [ ] 量化指标脚本化(如 `grep -rl "new Vue(" | wc -l`),避免再陈旧。
- [ ] 核实 CI 是否真接 jest:文档自己说"有 Jenkins 但不跑前端测试"。若仍如此,阶段 0 第一件事就是接 `npm test`
- [ ] 后端解耦未覆盖:《估值模块重构》透露 otcdms-ui 仍"数据来自 C#,未实现解耦",走 otcdms-ui 还需"Java 中转层"。微前端目前只是 UI 隔离,建议补一节 BFF/网关等后端解耦讨论。
---
## 七、专项文档索引(细节去这里,不要在本文件展开)
**踩坑 / 根因类**
- `互换债券三字段互算踩坑总结与测试指南.md` — EQD-6838 七次提交的根因全记录(本文 6.1 的根因均出自此)
- `互换模块长期改进方案.md` — 5 阶段改进路线(注意本文 6.2/6.3 的修正点)
- `互换模块可测性改造Seam实践指南.md` — 可测性改造手法
- `JS组件/FastVue.txt` — FastVue APIautocomplete / numberInput 签名)
- `JS组件/OTC项目Layer弹窗机制.docx` — layer 弹窗机制
- `JS组件/宽表格的水平滚动条处理.txt``JS组件/组合标的价格控件.docx`
**字段语义 / 命名类(最易引入新 bug)**
- `互换价格字段命名规范决策文档.md` — PosiNetPrice 名为 Net 实为含费全价,命名坑
- `MarkClosePnl字段语义统一决策文档.md`
- `互换交易价格字段存储与显示规范.md`
- `互换分红损益字段语义与重复计算分析.md`
**模块方案类**
- `互换模块独立化最终方案.md`
- `估值模块重构-前端改造说明.md` — 提及 otcdms-ui(见 6.3
- `互换重收盘误删手动互换资金记录问题分析.md``互换收益结算审核后状态卡死阻止收盘问题分析.md``互换部分平仓后利息端预付金默认盈亏偏大问题分析.md`
**其他**
- `readme.txt` — 项目说明入口
- `API测试/``Python/``定价与估值/``数据库/``业务处理/` 各子目录
---
> 本文件为统一入口,专项细节请点上面的索引。若发现本文件与代码不符,以代码为准并回来更新这一份。