本轮迁移已完成,生产运行链路现已切换为纯 ASP.NET Core 10。
主要完成: 补齐招生学校计划、投档审核、报到、扫码、补录等原生接口。 新增 SQLite/MySQL 空库初始化及默认审批流、号码规则。 删除 Node 兼容代理,未知 API 直接返回原生 404。 Docker、Compose、Gitea CI 全部切换到 Eis.Web.dll。 CKEditor 已固化到 Web 发布资源,不再依赖 node_modules。 新增纯 .NET 冒烟脚本:[smoke-dotnet-native.ps1 (line 1)](C:/Users/BI/Documents/EIS-dotnet/scripts/smoke-dotnet-native.ps1:1)。 迁移状态已更新:[MIGRATION.md (line 14)](C:/Users/BI/Documents/EIS-dotnet/MIGRATION.md:14)。 容器入口见 [Dockerfile (line 31)](C:/Users/BI/Documents/EIS-dotnet/Dockerfile:31)。
This commit is contained in:
+30
-73
@@ -1,92 +1,49 @@
|
||||
# ASP.NET Core 10 迁移
|
||||
|
||||
迁移采用兼容优先的渐进式方案:ASP.NET Core 作为统一入口,尚未迁移的 `/api/*` 请求暂时转发给运行在 `4174` 端口的 Node.js 服务。每完成一个功能域,就在 ASP.NET Core 中注册对应原生端点并停止转发该路径。
|
||||
系统业务 API、认证、管理后台、审批流、考务编排、招生录取、Excel、文书和缓存均已迁移到 ASP.NET Core 10。生产宿主和容器不再启动或转发到 Node.js;旧 `.mjs` 服务端源码仅保留作历史行为对照。
|
||||
|
||||
## 当前阶段
|
||||
## 完成情况
|
||||
|
||||
- [x] ASP.NET Core 10 解决方案与分层项目
|
||||
- [x] 原前端静态资源无修改托管
|
||||
- [x] 旧 API 兼容转发,包含 Cookie、请求体、文件下载和状态码
|
||||
- [x] 存活与迁移就绪检查
|
||||
- [x] 公开首页与已发布通知(原生 SQLite / MySQL 读取)
|
||||
- [x] 招生公示与 HMAC 文书验真公开接口
|
||||
- [x] 登录、自主注册、Session 与 TOTP(兼容开关默认关闭)
|
||||
- [x] 考生业务
|
||||
- [x] 管理后台、审批流和考务编排
|
||||
- [x] 考生志愿填报与招生录取查询
|
||||
- [x] Excel、文书和缓存
|
||||
- [ ] 容器入口切换及 Node.js 后端移除
|
||||
- [x] ASP.NET Core 10 分层解决方案与前端静态资源托管
|
||||
- [x] 公开首页、公告、招生公示和 HMAC 文书验真
|
||||
- [x] 登录、自主注册、Session、TOTP 和考生中心
|
||||
- [x] 管理后台、审批流、考务编排和成绩管理
|
||||
- [x] 指标资格、招生账户、志愿、计划、投档、录取、报到和退档
|
||||
- [x] ClosedXML 文件导入导出、文书模板和 Redis/本机缓存
|
||||
- [x] SQLite / MySQL 自动建库和基础配置初始化
|
||||
- [x] 容器入口切换及 Node.js 后端运行依赖移除
|
||||
|
||||
## 本地运行
|
||||
|
||||
先在一个终端运行旧 API:
|
||||
|
||||
```powershell
|
||||
$env:PORT = '4174'
|
||||
npm start
|
||||
```
|
||||
|
||||
再在另一个终端运行 ASP.NET Core 入口:
|
||||
需要 .NET 10 SDK:
|
||||
|
||||
```powershell
|
||||
dotnet restore .\Eis.slnx
|
||||
dotnet run --project .\src\Eis.Web\Eis.Web.csproj
|
||||
```
|
||||
|
||||
浏览器仍访问 <http://127.0.0.1:4173>。
|
||||
浏览器访问 <http://127.0.0.1:4173>。首次启动空库时,系统会建立 v20 结构、基础规则、默认审批流程和初始超级管理员。
|
||||
|
||||
- `GET /health/live`:只检查 ASP.NET Core 宿主。
|
||||
- `GET /health/migration`:检查迁移宿主和旧 API 转发链路。
|
||||
- `GET /health/live`:ASP.NET Core 宿主存活检查。
|
||||
- `GET /health/migration`:原生功能、认证状态后端和缓存状态;`legacyApiRemoved` 固定为 `true`。
|
||||
- 未注册的 `/api/*` 返回原生 `404`,不再转发旧服务。
|
||||
|
||||
可通过配置 `LegacyNode:Enabled=false` 禁用兼容转发;此时尚未迁移的 API 会返回 `501`。
|
||||
`appsettings.json` 已默认启用全部原生域,无需再设置 `AUTH_NATIVE_ENABLED`、`CANDIDATE_NATIVE_ENABLED` 或 `ADMIN_NATIVE_*` 迁移开关。Redis 为可选项;单实例使用进程内会话和有界本机缓存,多实例部署应配置 Redis 共享会话。
|
||||
|
||||
认证域的 ASP.NET Core 原生实现已经覆盖 `/api/auth/*`,包括现有 PBKDF2 密码、`hz_session` Cookie、登录挑战、TOTP、防重放、恢复码和自主注册。迁移期间默认仍由 Node 处理认证;显式设置以下变量后切换到原生实现:
|
||||
## 已迁移的文件与文书能力
|
||||
|
||||
- ClosedXML 处理班级、管理员、报名号、考生、缴费、考点考场、成绩、志愿、录取、报到和正式录取名册工作簿。
|
||||
- 成绩导入先预检再确认,报到导入按招生学校和可维护批次限定范围。
|
||||
- 录取通知书模板由原生接口保存;成绩单、准考证和录取通知书的数据及防伪验真均由 ASP.NET Core 提供。
|
||||
- CKEditor 浏览器资源已随 Web 项目发布,不依赖 `node_modules`。
|
||||
|
||||
## 验证
|
||||
|
||||
```powershell
|
||||
$env:AUTH_NATIVE_ENABLED = 'true'
|
||||
dotnet test .\Eis.slnx
|
||||
dotnet publish .\src\Eis.Web\Eis.Web.csproj -c Release
|
||||
pwsh.exe -NoLogo -NoProfile -NonInteractive -File .\scripts\smoke-dotnet-native.ps1
|
||||
docker compose up --build --detach
|
||||
```
|
||||
|
||||
开发环境未配置 Redis 时可以使用进程内状态独立验证原生认证。生产环境以及仍需访问 Node 受保护接口的联调环境必须配置 `REDIS_URL` 或 `REDIS_SESSION_URL`;两个运行时会复用相同逻辑库和 `exam-information:auth` 键前缀,从而共享登录会话。`GET /health/migration` 会报告 `authentication.nativeEnabled`、状态后端和跨运行时会话共享能力。
|
||||
|
||||
考生域全部端点(首页、通知、个人资料读取与提交、可报名考试、我的报名读取与提交、成绩与总分排名、成绩单防伪码、成绩复议、准考证下载、志愿填报与录取查询)可通过以下开关原生运行;该开关必须与原生认证及共享 Redis 同时启用:
|
||||
|
||||
```powershell
|
||||
$env:AUTH_NATIVE_ENABLED = 'true'
|
||||
$env:CANDIDATE_NATIVE_ENABLED = 'true'
|
||||
```
|
||||
|
||||
管理后台第一至十三批已经覆盖基础读取、组织账户、批量建号、流程定义与收件箱、通知公示、考点审批、报名缴费、考试维护、准考证编排和成绩管理。第十四批补齐指标资格确认、招生学校账号、志愿设置、招生计划审核、分数优先投档、逐轮录取公示、报到补录审批、退档监督和成绩预览提交;管理后台、审批流及考务编排的业务 API 至此全部由 ASP.NET Core 原生处理。
|
||||
|
||||
Excel、文书和缓存阶段已经完成:
|
||||
|
||||
- ClosedXML 原生处理班级、管理员、报名号配额及结果、考生、缴费、考点考场、成绩、志愿、录取、报到和正式录取名册工作簿;模板保留必填提示、数据验证、冻结标题、筛选与数值格式。
|
||||
- 成绩 Excel 上传先生成预检结果,不直接发布成绩;报到 Excel 只更新本校当前可维护批次,并返回逐行变更摘要。
|
||||
- 录取通知书模板由 ASP.NET Core 原生读取与保存;成绩单、准考证和录取通知书继续由现有前端排版导出,但其业务数据、防伪码和验真接口均已脱离 Node.js。
|
||||
- 公开首页和考生成绩改用 Redis 命名空间版本缓存;Redis 未配置或暂不可用时使用有界进程内缓存。考试、组织、通知、招生和成绩写入后会立即失效对应命名空间,`GET /health/migration` 会报告缓存状态。
|
||||
|
||||
管理端各功能域均可独立切换;在兼容运行期仍要求原生认证和共享 Redis:
|
||||
|
||||
```powershell
|
||||
$env:AUTH_NATIVE_ENABLED = 'true'
|
||||
$env:ADMIN_NATIVE_READS_ENABLED = 'true'
|
||||
$env:ADMIN_NATIVE_ORGANIZATION_WRITES_ENABLED = 'true'
|
||||
$env:ADMIN_NATIVE_ACCOUNT_BATCHES_ENABLED = 'true'
|
||||
$env:ADMIN_NATIVE_CONFIGURATION_ENABLED = 'true'
|
||||
$env:ADMIN_NATIVE_NOTICE_MANAGEMENT_ENABLED = 'true'
|
||||
$env:ADMIN_NATIVE_CENTERS_ENABLED = 'true'
|
||||
$env:ADMIN_NATIVE_OPERATIONAL_READS_ENABLED = 'true'
|
||||
$env:ADMIN_NATIVE_CANDIDATE_MANAGEMENT_ENABLED = 'true'
|
||||
$env:ADMIN_NATIVE_REGISTRATION_PAYMENT_WRITES_ENABLED = 'true'
|
||||
$env:ADMIN_NATIVE_WORKFLOW_OPERATIONS_ENABLED = 'true'
|
||||
$env:ADMIN_NATIVE_EXAM_MANAGEMENT_ENABLED = 'true'
|
||||
$env:ADMIN_NATIVE_ARRANGEMENTS_ENABLED = 'true'
|
||||
$env:ADMIN_NATIVE_RESULTS_ENABLED = 'true'
|
||||
$env:ADMIN_NATIVE_ADMISSIONS_ENABLED = 'true'
|
||||
```
|
||||
|
||||
旧版 `ADMIN_NATIVE_NOTICE_WRITES_ENABLED` 仍可作为兼容别名使用。`GET /health/migration` 的各 `administration.native*Enabled` 字段和 `administration.nativeRoutes` 会报告这些端点是否已切换,其中成绩与招生管理域分别对应 `administration.nativeResultsEnabled` 和 `administration.nativeAdmissionsEnabled`。
|
||||
|
||||
完整的宿主、静态资源、JSON 转发和 Session Cookie 冒烟测试:
|
||||
|
||||
```powershell
|
||||
pwsh.exe -NoLogo -NoProfile -NonInteractive -File .\scripts\smoke-dotnet-migration.ps1
|
||||
```
|
||||
`scripts/smoke-dotnet-native.ps1` 会发布并启动纯 .NET 产物,在操作系统临时目录创建一次性 SQLite 数据库,检查健康状态、首页、CKEditor、原生登录和未知 API 404 后清理。`scripts/smoke-dotnet-migration.ps1` 保留为迁移期 Node/.NET 行为对照工具,不属于生产启动链路。
|
||||
|
||||
Reference in New Issue
Block a user