Files
chunyu_prject_react/PROGRESS_C-01.md
T

4.8 KiB
Raw Blame History

PROGRESS — C-01 路由/代理前缀冲突修复

  • 状态:done
  • 执行模型:muse-spark-1.3-contributor(AGI 自驱 M1)
  • 日期:2026-09-12
  • 分支/提交:未提交(工作区另有他模未提交改动:C-02 热榜/C-03 运行器 locales+Home,见遗留 §4)

改动文件(本卡)

  • chunyu_project_react/src/App.tsx(修改):冲突 SPA 路由改名 + 旧路径 SPA 内 <Navigate> 重定向(/api-docs→/open-api-docs、/api-directory→/open-api-directory、/api→/open-api、/api-detail/*→/open-api-detail/*、/api/<5页>→/open-api/<5页>、/article/:id→/post/:id、/user、/user/:id→/user-home);新增 LegacyApiDetailRedirect/LegacyPostRedirect/LegacyUserHomeRedirect 带参透传
  • chunyu_project_react/src/components/Navbar/Navbar.tsx、MobileBottomNav、MobileGuard、MobileTopNav、pages/Home/Home.tsx、HomeMobile.tsx、pages/Search/Search.tsx、pages/ApiDirectory/*(3)、pages/ArticleDetail、ArticleManage、Articles、Chat、Console、Favorites、UserHome(修改):全部 SPA 跳转/link 引用同步新路径
  • chunyu_project_react/vite.config.ts(重写代理段):宽前缀改为精确正则白名单(^/api/、^/user/、^/bug/reports/、^/article/(articles|my-articles|comments)/、^/learn/(courses|chapters|my-courses|my-progress|materials|favorites|cdn)/、^/history/records/、^/message/、^/chat/(friend-requests|friends|users|conversations|messages|upload|favorite-stickers)/、^/tool/、^/search/(有参代理/无参放行)、^/app/、^/logs/api/、^/shorturl/、/s 短码形态、^/user/ 数字 id 放行旧分享);旧分享链接 + SPA 精确路径 bypass 放行
  • chunyu_project_react/nginx.conf + vscode/nginx-docker.conf(同步改写,两文件一致):生产宽正则 ^/(api|user|...)/ 拆分为同 vite 口径的精确 location;/search/ 按 $args 有无分流(@spa_fallback);/user/\d+ 放行旧分享
  • chunyu_project_react/scripts/check_routes.mjs(新增):86 路由回归脚本(73 新路由 + 13 旧重定向),劫持判定=Django404/后端JSON 且无 #root,SPA 到达判定=含 id="root"(dev 外壳口径)
  • chunyu_project_react/tests/c01-route-regression.spec.ts(新增):Playwright 3 项(新路由直访/旧链接重定向/API 代理回归)

验收命令与结果

$ node scripts/check_routes.mjs --base http://127.0.0.1:5174
ROUTES=86 PASS=86 hijacked=0 blank=0
# 首轮 81/86:5 条旧 /api/<页> 被 ^/api/ 劫持 → 补 LEGACY_API_PAGES 放行后 86/86

$ PLAYWRIGHT_BASE_URL=http://127.0.0.1:5174 npx playwright test tests/c01-route-regression.spec.ts
3 passed (4.2s)
# 新路由直访 / 旧链接重定向(/article/1→/post/1、/user/1→/user-home/1、/api-detail/1→/open-api-detail/1)/ API 代理回归全绿

$ curl 经 vite 代理:/api/apidirectory/categories/ → {"code":200,...}; /article/articles/ → {"code":10000,...}; /tool/list/ → 200;/search/hot-keywords/ → 200
$ curl SPA 直访:/open-api、/post/1、/user-home/1 → 均含 id="root"

$ npx tsc -b
TSC_EXIT=0(无输出即通过)

$ npx vite build
✓ built in 13.34s(仅 chunk-size 警告,既有)

$ 残留检查(卡内 grep 口径,排除 API 调用/CSS 类名/重定向本身)
零残留(仅 ApiDirectory.tsx:114 的 EXCLUDED_PATHS "/api-docs/" 是后端 url_path 过滤常量,非 SPA 引用)

$ 生产 nginx 审查:7 条冲突段(5 条 /api/* 数据页 + /article/:id + /user/:id)全部让路
新 /open-api*、/post/*、/user-home* 无一条命中代理 location;nginx -t 未能执行(本机无 nginx 二进制、Docker daemon 未启动),以括号配平(28/28)+ 逐段静态审查代替

基线对照

  • 开工前:manage.py check EXIT=0(12 issues:W005×1+W042×11,与 baselines.json 一致);git 工作区已脏(他模 C-02/C-03 改动未提交);dev 22 条劫持(报告值,未复跑旧配置)
  • 完工后:86/86 直访 SPA;代理 API 回归 4/4;tsc/build/Playwright 全绿;后端 check 未新增告警

遗留问题 / 下一模型注意事项

  1. 工作区混有他模未提交改动(locales/*.json 热榜/签到词条、Home.tsx 热榜卡片、CodeRunnerPage/、utils/request.ts 2 行等,属 C-02/C-03/C-06)——验收 C-01 时只看本卡文件;提交时建议按卡分批 commit。
  2. /search/ 无参裸路径:vite 走 bypass 放行 SPA,nginx 走 $args 分流——后端 GlobalSearchView 无参行为(空搜索 vs 400)未改,保持原样。
  3. nginx 未做运行时 -t(本机无二进制、Docker 未启动)——上线前在 CI/服务器上补 nginx -t。
  4. /s 短码 vs SPA 无冲突(SPA 无 /s/* 页面),短码形态 ^/s/[^/]+/?$ 代理;/settings、/shorturl-detail 天然不命中。