No Description

彭峰 84cc6b6566 Show reading history article count 4 hours ago
.vscode 018b3f181c feat: migrate xiaoshu app to Angular 18 1 month ago
deployment 89aef36d2f fix(data): refresh learning data in real time 2 days ago
docs efd1a97d80 Guard payroll settlement on legacy sync and reconcile review rewards 4 hours ago
legacy-sync-bridge 0298322d9c feat: sync student coach and backend migration updates 3 weeks ago
perf a0a12e8e87 perf(admin): retain loaded operations pages and refresh on change 1 day ago
projects 84cc6b6566 Show reading history article count 4 hours ago
public 0298322d9c feat: sync student coach and backend migration updates 3 weeks ago
scripts b6410f3c9b Test sync worker dependency ordering 4 hours ago
tools 0298322d9c feat: sync student coach and backend migration updates 3 weeks ago
.editorconfig 018b3f181c feat: migrate xiaoshu app to Angular 18 1 month ago
.gitignore 3a7c5df3ee feat: add legacy realtime sync bridge 1 month ago
AGENTS.md 237c14ac02 chore: 添加任务完成后自动同步 Git 规则 1 month ago
README.md 4b8abbd275 build(admin): prepare verifiable frontend release packages 2 weeks ago
angular.json cec86749c4 refactor: split mobile and admin Angular applications 3 weeks ago
design-qa-mobile-implementation.png f5c94f86c9 fix(admin): improve mobile schedule layout 1 month ago
design-qa-mobile-source.png f5c94f86c9 fix(admin): improve mobile schedule layout 1 month ago
design-qa.md 601bdc7231 fix: unify student read-only vocabulary access 3 weeks ago
package-lock.json b90e4eb822 Fix reading PDF text splits across pages 5 hours ago
package.json b90e4eb822 Fix reading PDF text splits across pages 5 hours ago
proxy.conf.cjs 330800a025 fix: restore integrated AI reading generation 3 weeks ago
tsconfig.json 018b3f181c feat: migrate xiaoshu app to Angular 18 1 month ago

README.md

小树陪练 Angular 多项目工作区

这是从同级 xiaoshu-uniapp 迁移出的 Angular 18 工作区。移动端与运营管理后台是两个物理隔离、可独立构建和发布的 Angular 应用:

  • projects/xiaoshu-mobile:学生端与老师端,根据登录身份展示对应业务能力。
  • projects/xiaoshu-admin:运营管理后台与仅超级管理员可见的技术后台。

两个应用拥有独立入口、路由、测试配置、开发端口和构建产物,不会把另一端的业务源码打进自己的前端包。

环境

  • Node.js 18.19+(当前验证版本为 Node.js 22)
  • npm 9+
  • Angular 18.2

本地运行

npm install
npm run start:mobile
npm run start:admin

移动端运行在 http://127.0.0.1:4200/,管理后台运行在 http://127.0.0.1:4300/admin/login。两个开发服务器都通过 proxy.conf.cjs 转发所需服务,避免本地调试时的跨域问题。

AI 阅读统一通过生产云函数调用生成服务,本地 Angular 进程不需要、也不应持有生成服务令牌。首次部署服务端配置时执行:

XIAOSHU_MASTER_KEY="..." FMODE_API_TOKEN="..." npm run reading:ai:configure
npm run cloud:deploy -- --only=xiaoshu/app/gateway

构建与测试

npm run build
npm run test:ci

也可以分别执行:

npm run build:mobile
npm run build:admin
npm run test:mobile:ci
npm run test:admin:ci

移动端输出到 dist/xiaoshu-mobile/browser/,管理后台输出到 dist/xiaoshu-admin/browser/。两个站点部署时都需要把各自的 Angular 路由回退到对应的 index.html。

管理端发布包使用 npm run release:admin:prepare 生成,要求已跟踪的修改先提交。输出位于 dist/admin-release/,包含静态站点、带源码提交号的版本清单、每个文件的 SHA-256 和压缩包校验和。压缩包只包含前端构建,不包含云函数、数据库备份或服务端密钥。

上传 site/ 内容到现有后台站点时,先上传资源文件,最后更新 index.html;保留旧的哈希资源,避免已打开的页面找不到旧脚本。上传完成后执行 npm run release:admin:verify,核对 https://admin.xiaoshu.pro 的版本、全部文件及 /admin/login、/admin/payroll 深层路由。其他核验地址通过 XIAOSHU_ADMIN_URL 指定。准备和核验命令均不会上传文件或修改线上配置。

当前公网后台直接调用 https://server.xiaoshu.pro/api/functions,仅本地开发使用代理。前端上传需要独立的站点托管权限;XIAOSHU_MASTER_KEY 不具备该权限,不能放入前端配置或发布包。

迁移验收

  • pages.json 中 95/95 条路由已注册,路径保持不变。
  • 生成的源码对照清单跟踪 91 个字面 API 动作及 Bytedesk httpApi.* 外部业务调用,npm run parity:check 可检测源页面变化。
  • 原生微信授权接口 user_sync2 依赖 uni-app/微信容器,H5 改用短信登录、账号密码登录与注册。
  • 收货地址、发票、商品、库存、结算、发货、售后、订单评价、提现账户、实名认证和反馈均保留原后端载荷格式。
  • 生产构建通过,页面按路由懒加载;45 项自动测试覆盖路由对照、业务载荷、表单载荷、Bytedesk 会话/评价/留言协议、外部阅读参数和会员权益统计。
  • 公开页已在 390 x 844 与 1440 x 900 视口回归,无横向溢出或 Angular 运行时错误;未登录访问受保护页面会保留 returnUrl 并跳转登录页。
  • 客服页已迁移原 UniApp 使用的 Bytedesk 匿名访客登录、工作组会话、历史消息轮询、智能客服问答、图片上传与文件上传协议。2026-08-08 实测发现 uniapp.bytedesk.com 已停用原 /visitor/api/* 接口并改为返回微语官网 HTML,因此旧 UniApp 与迁移页目前都无法建立真实会话;页面会明确显示旧服务已停用。
  • 满意度评价与离线留言不再复用业务留言表单,分别保持原 /api/rate/detail、/api/rate/do、/api/leavemsg/save 协议及 tid/wid/aid/type/invite 会话参数;旧 Bytedesk 服务停用时会显示真实错误。
  • 用户中心和游戏中心入口按当前 UniApp 模板恢复:用户中心只显示源页面实际开放的服务,游戏中心四个年级入口继续提示“正在开发中”。
  • 页面会区分“没有业务数据”和“接口加载失败”;依赖订单或详情上下文的表单缺少 id 时禁止提交并提示从正确入口进入。
  • 学习记录中的“阅读”入口已完整内置:从记录 xxqs 提取单词后进入 Angular 阅读设置、AI 文章生成、词汇补全、选择题、历史成绩和 PDF 导出页面,不再加载 app.fmode.cn iframe。
  • 旧入口 /pages/iframe/index 保留参数兼容,原 params 中的单词列表与 NCloud 会话会被内部页面接收。
  • 独立项目原首页迁移到 /english:生词阅读入口可用,“外文源刊解析”和“智慧陪读陪练”继续按源代码显示“暂未开放”。
  • 阅读业务保持源仓库规则:原默认参数、随机题材与类型、相同词汇三篇上限、重复文章判断、120/180 秒任务超时、最多五次重试、最近答题恢复、题目与选项洗牌、成绩记录、10 条历史分页、满分后新文章和微信 PDF 提示均已迁移。

涉及支付、短信、上传、写入和登录后数据的真实联调,需要有效测试账号及可用的后端业务数据。自动测试使用模拟会话和模拟 API,避免在验收中产生真实订单、短信或数据变更。

原排行榜动态调用的 ranklist_1 至 ranklist_5 在当前后端返回“接口不存在”,H5 保留原请求并显示空状态。

第三方数据边界

  • 客服迁移代码仅允许向 uniapp.bytedesk.com、upload.bytedesk.com 发送聊天内容和所选附件。当前匿名会话握手会因旧接口下线而中止,不会继续发送聊天或上传文件。
  • AI 阅读的身份、文章、题目、答案、成绩和历史记录只由 server.xiaoshu.pro 的阅读云函数处理;生成所需的单词、年级、题材和提示词由该云函数转发至 api.fmode.cn。生成服务令牌与 Parse masterKey 只保留在服务端,不存放在前端源码、Angular 代理或浏览器存储中。
  • 上述流程已根据 2026-08-08 的明确授权启用。应用不会在该流程中自行向其他 NCloud 域名提交账号或密码。

生产部署需要配置 xiaoshu/app/gateway 云函数及 Parse Config 中的生成服务令牌;不要把 FMODE_API_TOKEN 或 Parse masterKey 写进 Angular 环境文件、反向代理或浏览器构建产物。

为避免扩大私有数据读取范围,迁移版在两处保留了比源仓库更严格的限制:答题记录始终限定当前用户,PDF 页面继续要求当前应用登录;源仓库中未带用户条件的历史查询和公开 PDF ID 读取没有照搬。H5 目标也不再执行原 iframe 中仅供 APP-PLUS 使用的 uni.postMessage PDF 回传。

恢复客服需要在新版微语后台取得新的 org、sid,并另行授权新版 H5 客服实际使用的域名;当前官方接入格式已不再使用旧版 subDomain、workGroupId。