组员这次提交的两套新页面方向都对,但各有一处"接不上"的地方,这里补齐。 1) 访客客服浮窗(此前一问即失败) 客服 Agent 让访客走 query_knowledge(访客令牌的角色是 visitor、权限只有 agent:run + knowledge:query),但发布配置里三个知识意图只发了 search_knowledge, 于是 ToolExecutor 直接抛 ForbiddenAgentError,而客服代码对白名单失败是 「必须冒泡」的 —— 访客拿不到任何回答,登录客户侧却完全正常。 发布脚本的知识类意图改为同时发 search_knowledge 与 query_knowledge: 访客走前者、客户走后者,缺任一条对应人群就失败关闭。 (suitability_check 不发 query_knowledge:访客意图白名单不含它,访客到不了。) 2) 发布脚本会静默丢提示词 旧写法只查 platform_config_item 就当作"继承",而 config_release 是整版本替换 语义,新版本没带上的行等于被删除 —— 实际把 customer_service_chitchat 提示词 漏在了旧版本里(admin 端只在激活时打一句 stderr 警告)。 改为走 ConfigReleaseService.effective_snapshot() 读全三张受管表,补上提示词 搬运(version 重分配、带上 input_schema/output_schema),并在激活后硬校验 配置项与提示词条数,条数不符即失败退出。 (model_routing_rule 本环境为空;不为空则直接中止,不假装支持。) 丢失的那条提示词已按原文恢复,active 版本现为 9 条配置项 + 1 条提示词。 3) 投顾工作台永远为空 published() 取的是 customer_id == 自己 user_id,而投顾是员工账号、不可能是 客户;且只认 advisor_recommendation_plan + approved,而投顾交付的主产物是 investment_goal_book,发布后状态是 published。三重不匹配下页面永远显示空态。 改为按「本人 + sys_customer_assignment 里名下归属客户」过滤(不用 data_scope: 投顾因持有 all 级权限会把整个身份的 scope 抬到 all,那会放开到全部客户), 并覆盖两类 content_type 与两种已发布取值。 实测:投顾可见归属客户 9001 的方案书,客户仍只见自己的,风控仍 403。 4) 访客页把"演示数据"声明删了但假数据还在 mock-data.js 的 MOCK_SOURCE_NOTICE 与两个页面的 data-source-notice 区块被删除, 而 MOCK_PRODUCTS/MOCK_RANKING_CHANGE 仍在渲染(详情页含历史净值曲线)。 恢复声明常量、页面区块与样式,并给 products/product-detail 的 link 与 script 加上版本参数 —— 此前没有版本号,浏览器会命中旧缓存,改动看不见。 其他:投顾页显示交付物类型与客户编号(后端新返回的字段),README 补上投顾页 数据口径、访客/客户两条检索工具的差别,以及"渲染 mock 必须带来源声明"的约定。
39 lines
3.0 KiB
Markdown
39 lines
3.0 KiB
Markdown
# Portal 路由与角色映射
|
||
|
||
正式门户使用原生 JavaScript、原生 CSS 与同源 `fetch`,静态资源统一从 `/static/portal/` 加载。
|
||
|
||
| 路由 | 角色 | 数据源 |
|
||
|---|---|---|
|
||
| `/portal/guest/home/` | 访客 / 全部 | 公开展示,产品摘要为集中 mock |
|
||
| `/portal/guest/products/` | 访客 / 全部 | `fin_product` 同字段集中 mock |
|
||
| `/portal/guest/product-detail/?code=` | 访客 / 全部 | `fin_product`、`fin_nav_history` 同字段集中 mock |
|
||
| `/portal/customer/login/` | 未登录客户 | A034 |
|
||
| `/portal/customer/dashboard/` | customer / admin | T001、T002 |
|
||
| `/portal/customer/holdings/` | customer / admin | T006 |
|
||
| `/portal/customer/profit-loss/` | customer / admin | T001 |
|
||
| `/portal/customer/orders/` | customer / admin | T003 |
|
||
| `/portal/customer/transactions/` | customer / admin | T007 |
|
||
| `/portal/customer/cash-ledger/` | customer / admin | T009 |
|
||
| `/portal/customer/risk-questionnaire/` | customer | ONB001、ONB002 |
|
||
| `/portal/employee-console/login/` | 未登录员工 / 管理员 | A034 |
|
||
| `/portal/employee-console/workspace/` | admin / super_admin | A002-A006、A012、A033、A035-A040、客服转人工管理接口 |
|
||
| `/portal/employee-risk/dashboard/` | risk_operator / admin / super_admin | `/api/v1/risk/**`、R001-R003 |
|
||
| `/portal/employee-advisor/dashboard/` | advisor / admin / super_admin | `/api/v1/advisor/recommendations/published`(本人 + 名下归属客户的**已发布**交付物) |
|
||
| `/portal/employee-operations/dashboard/` | operator / admin / super_admin | `/api/v1/offsite-fund/mails`、`/api/v1/offsite-fund/mailbox-status` |
|
||
|
||
> 投顾页的数据口径:接口按「本人 + `sys_customer_assignment` 里名下归属客户」过滤,且同时覆盖
|
||
> `investment_goal_book`(方案书,发布后 `review_status='published'`)与
|
||
> `advisor_recommendation_plan`(推荐方案,审核后 `review_status='approved'`)两类内容。
|
||
> 方案书的**审核与发布都要求管理员**(`investment-goal:review` / `publish` 都带 `admin=True`),
|
||
> 投顾自己发不出来 —— 这是有意设计的复核环节,不是缺陷。
|
||
|
||
客服浮窗由公开首页、基金产品页和客户工作台统一挂载。访客使用 `/api/v1/visitor-tokens`
|
||
获取短期令牌(角色 `visitor`,权限只有 `agent:run` + `knowledge:query`),因此**必须**走
|
||
`query_knowledge` 这个工具名;登录客户走 `search_knowledge`。两者都要出现在发布配置的
|
||
`agent_tools/customer_service:<intent>` 白名单里,缺哪一条,对应人群就一问即失败。
|
||
|
||
公开产品 HTTP 接口尚未实现,因此相关页面使用 `common/mock-data.js`,不得与登录后的真实账户数据混用。
|
||
**凡渲染这些 mock 数据的页面都必须挂 `data-source-notice` 并写入 `MOCK_SOURCE_NOTICE`**
|
||
(`guest/products/`、`guest/product-detail/`)—— 删掉声明不会让数据变真,只会让客户误以为看到的是真实净值。
|
||
客户页面均由 `common/auth.js` 执行入口守卫,接口路径只在 `common/api-client.js` 的端点表登记。
|