Ver Fonte

docs: AGENTS.md 新增 C-23~C-25 组织页/落地页/改密变更记录

bob há 1 mês atrás
pai
commit
c898c0c887
1 ficheiros alterados com 44 adições e 0 exclusões
  1. 44 0
      AGENTS.md

+ 44 - 0
AGENTS.md

@@ -504,3 +504,47 @@
 - 未确认与风险:本机此前未安装 pnpm,已通过 corepack 临时激活;后续开发/CI 需确保 pnpm 可用(建议 `corepack enable` 或全局安装 pnpm)。`node_modules` 当前仍为 npm 格式,首次 `pnpm install` 会将其转为 pnpm 符号链接结构,属本地可逆变更。
 - 后续修改提示:所有安装、升级依赖必须走 pnpm;提交前确认 `pnpm-lock.yaml` 已更新且 `package-lock.json` 不出现在 `git status`。
 - 关联:D-010。
+
+### C-20260923-23|机构主页管理员点击课程进入详情
+
+- 日期:2026-09-23
+- 类型:功能
+- 需求与原因:组织管理员需要从机构主页课程进度表直接打开课程详情。
+- 修改范围:`src/pages/OrganizationPage.tsx` 将管理员视角的课程名称改为课程详情链接;点击时切换到该机构工作区。
+- 保留/新增判断:遵守 D-001;沿用现有课程详情接口的服务端权限校验,仅向机构管理员提供此入口。
+- 功能确认状态:部分确认
+- 验证证据:确认 `/courses/:id` 路由和课程详情接口允许所属组织管理员访问;`npm run check`、`npm run build`、`git diff --check` 通过。
+- 未确认与风险:未使用已登录机构管理员在浏览器实际点击验证,也未部署公网。
+- 后续修改提示:若普通组织成员也需进入课程详情,先调整并验证服务端课程访问权限,再开放入口。
+- 关联:D-001、C-20260923-04。
+
+### C-20260923-24|广告落地页 /lp:数字人课程制作引流入口与线索后台
+
+- 日期:2026-09-23
+- 类型:功能 / 数据库 / 前端
+- 需求与原因:需要在外部广告位投放 banner 引流,落地页须与主站隔离、互不干扰;以留下联系方式为主要目标、注册降为可选,并用广告语言写清数字人课程制作服务内容。用户确认:独立构建入口、留资为主 + 注册折叠选填、线索入库并做后台管理页、复用现有微信群二维码,微信号对外展示 bob-yuxinyang,价格不外露,暂不放样片。
+- 修改范围:
+  1. 新增独立入口 `landing.html` 与 `src/landing/`(`main.tsx`、`LandingPage.tsx`、`landing.css`);`vite.config.ts` 改为双入口构建;生产服务端新增 `/lp`、`/lp/*` 显式路由,返回 `dist/landing.html`。
+  2. `server/schema.sql` 新增 `lead_requests` 表(姓名/手机/微信/需求类型/体量/描述/来源/状态/备注/关联用户/时间)。
+  3. `server/index.ts` 新增 `POST /api/public/leads`(公开提交、按 IP 60 秒限流、同手机号 24 小时内合并更新、可选密码注册)、`GET /api/admin/leads`、`PATCH /api/admin/leads/:id`(均 adminAuth)。
+  4. 前端新增 `src/pages/admin/AdminLeads.tsx`、`/admin/leads` 路由与「落地页线索」导航项;`src/api.ts` 增加 `admin.listLeads` / `admin.updateLead`;`src/types.ts` 增加 `Lead` / `LeadStatus`;`src/styles.css` 仅新增 `.status-filter-select` 与 `.lead-message` 两个类。
+  5. README 补充落地页说明。
+- 保留/新增判断:保留 D-001 至 D-010。新增:广告落地页必须与主站物理隔离(独立 HTML 入口 + 独立 CSS,不加载主站认证/路由上下文,样式统一 `lp-` 前缀);线索属公开写入数据,必须限流并在服务端剥离 HTML;注册只能由用户显式填写密码触发,不得自动建号;同手机号 24 小时内重复提交按更新处理,避免线索重复。
+- 功能确认状态:部分确认
+- 验证证据:`npm run check`、`npm run build` 通过,产物含独立 `dist/landing.html` 与 `landing-*.css|js`,主站 `dist/index.html` 不引用任何 landing 资源(grep 计数 0)。以 `NODE_ENV=production` 启动本地服务(端口 3011)实测:`/lp` 与 `/lp/anything` 返回 200 且标题为「数字人课程制作 · 星痕智能课程工坊」,`/dashboard` 仍走主站 SPA 兜底;`POST /api/public/leads` 正常 201、非法手机号 400、缺微信号 400、同 IP 60 秒内 429、带密码提交返回 token 且用该 token 调 `/api/me` 返回 200(姓名与微信号已写入)、同手机号重复注册 409;同手机号 24 小时内再次提交经 SQL 核对仍为 1 行且字段为最新值;`<script>alert(1)</script><b>加粗</b>` 落库为「加粗正常内容」。`GET /api/admin/leads` 管理员 200 且带 userName,未登录与普通用户 token 均 401,`PATCH` 更新状态与备注返回 200。测试数据已清理(3 个测试账号、5 条线索、1 条临时管理员会话)。
+- 未确认与风险:未做公网部署验证(D-009 的 HTTPS 与真实域名层未覆盖);未做浏览器真机目视核对,桌面与窄屏仅按 CSS 断点编写;`/lp` 依赖 `NODE_ENV=production` 分支,本地开发需访问 `/landing.html`;`lead_requests` 建表仅在本地 dev 库执行过,未在生产库验证(语句为 CREATE TABLE IF NOT EXISTS + ADD COLUMN IF NOT EXISTS,可重复执行,但未经生产库实测);本次未新增依赖,`pnpm-lock.yaml` 无需变更,验证使用的是 npm scripts 而非 pnpm。
+- 后续修改提示:改落地页只动 `src/landing/` 与 `landing.css`,禁止 import 主站 `styles.css` 或 `src/api.ts`;新增线索字段须同步 `leadSchema`、`mapLead`、`Lead` 类型与后台表格;投放链接建议带 `?from=` 或 `utm_source` 以保留渠道归因;对外微信号与二维码位于 `LandingPage.tsx` 的 `WECHAT_ID` 常量与 `src/assets/contact-group-qrcode.jpg`。
+- 关联:无。
+
+### C-20260923-25|修复现场创建老师报错并取消首次登录强制改密
+
+- 日期:2026-09-23
+- 类型:修复 / 功能 / 数据库
+- 需求与原因:机构管理员创建老师后账号已写入,却因异步提交后读取已清空的 React 事件 `currentTarget` 而显示 `reset` 报错;用户要求老师首次登录直接进入工作区。
+- 修改范围:`src/pages/OrganizationManage.tsx` 在异步请求前保存表单元素,成功后重置表单并更新提示;`server/organizations.ts` 创建老师时将强制改密标记设为 `FALSE`;`server/index.ts` 与 `src/App.tsx` 移除旧强制改密拦截;`src/pages/Profile.tsx` 保留自愿改密入口但移除强制提示;`server/schema.sql` 幂等清除已有账号的旧强制改密标记;同步更新 `README.md`。
+- 保留/新增判断:本条替代 D-006 的“首次登录必须修改密码”规则。现场创建账号仍使用初始密码 `888888`,首次登录可直接进入工作区;用户可在账户安全自行改密。服务端仍须校验登录身份及组织权限(D-001)。
+- 功能确认状态:部分确认
+- 验证证据:代码检查确认创建流程在异步边界前保存表单引用;`npm run check`、`npm run build`、`git diff --check` 通过。迁移语句仅更新标记为 `TRUE` 的账号,重复执行不再产生变化。
+- 未确认与风险:未在隔离数据库中实际执行迁移及新老师登录全流程;未在公网部署或验收。固定初始密码仍需由机构管理员妥善交付,账号可自行改密。
+- 后续修改提示:不得恢复新老师首次登录强制改密,除非用户提出新的规则;涉及登录流程应同时核对前端路由和服务端鉴权。
+- 关联:替代 D-006;C-20260923-06。