- Added `ThresholdRepository` for managing customer loss threshold configurations and notifications. - Introduced `threshold_service` to handle loss threshold alerts based on customer portfolio performance. - Enhanced `customer_prompts` to include new intent for querying product net values. - Updated `customer_service` to integrate new threshold alert functionality into existing workflows. - Implemented `sanitize_postprocess` for improved compliance handling in customer interactions. - Enhanced course documentation to reflect updates in advisor training modules and interactive elements. This update significantly improves the customer experience by providing proactive loss threshold notifications and enhancing the overall service framework.
78 lines
4.0 KiB
HTML
78 lines
4.0 KiB
HTML
<section class="module" id="module-4">
|
||
<div class="module-inner">
|
||
<p class="eyebrow animate-in">模块 4 · 未接线</p>
|
||
<h1 class="module-title animate-in">菜单有 ≠ API 已接<br>Chat 还有 B 方案三端点</h1>
|
||
<p class="module-lead animate-in">
|
||
前端 P0 主链路已真接,但和后端课对照,仍有<strong>页面占位、风控/平台按钮缺失、SSE 行为</strong>等缝。
|
||
改 URL 进别人工作台,前端藏菜单<strong>拦不住</strong>,后端才是闸。
|
||
</p>
|
||
|
||
<div class="screen animate-in">
|
||
<h2>前端未全接清单(2026-09)</h2>
|
||
<div class="pattern-cards">
|
||
<div class="pattern-card">
|
||
<h3>风控</h3>
|
||
<p>AML scan · 适当性校验按钮 · 台账高级筛选 — 部分 API 有,UI 简版或未接。</p>
|
||
</div>
|
||
<div class="pattern-card">
|
||
<h3>问数</h3>
|
||
<p><code>AnalystChatShell</code> 占位 · 真问数在 <code>AnalystQueryPage</code> + dashboard/assets。</p>
|
||
</div>
|
||
<div class="pattern-card">
|
||
<h3>游客</h3>
|
||
<p><code>VisitorChatWidget</code> 首页试聊 · 与登录 ChatPanel 不同 API。</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="screen animate-in">
|
||
<h2>Chat 方案 B:三端点 + SSE 注意点</h2>
|
||
<div class="translation-block">
|
||
<div class="translation-code">
|
||
<span class="translation-label">会话 API</span>
|
||
<pre><code><span class="code-line">GET /api/chat/sessions</span>
|
||
<span class="code-line">GET /api/chat/sessions/{id}/messages</span>
|
||
<span class="code-line">POST /api/chat/sessions/{id}/close</span>
|
||
<span class="code-line">POST /api/chat/stream → customer SSE</span></code></pre>
|
||
</div>
|
||
<div class="translation-english">
|
||
<span class="translation-label">白话</span>
|
||
<div class="translation-lines">
|
||
<p class="tl">列表/历史/关闭与发消息共用同一套鉴权(Bearer + X-Agent-Type)。</p>
|
||
<p class="tl">SSE 无心跳:断连可能留下半空回合——排障时查 session 表 + 是否 uvicorn 重启。</p>
|
||
<p class="tl">HashRouter:URL 带 <code>#</code>,生产 Nginx 要配 SPA fallback。</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="screen animate-in">
|
||
<h2>改 URL 进别人工作台</h2>
|
||
<p><code>RequireAuth</code> 只验「有没有 token」,<strong>不</strong>验「这个角色能不能进 /app/risk」。菜单隐藏 ≠ 安全——后端 <code>AGENT_ACCESS_MATRIX</code> 和平台 RBAC 才拒 403。</p>
|
||
|
||
<div class="quiz-container" id="quiz-frontend-m4">
|
||
<div class="quiz-question-block"
|
||
data-correct="option-b"
|
||
data-explanation-right="对。前端藏菜单是 UX;越权要靠后端模块鉴权(deps.py)矩阵和 SessionGuard 403。"
|
||
data-explanation-wrong="仅改前端路由守卫不够,必须对后端入口断言。">
|
||
<h3 class="quiz-question">客户账号手动打开 /app/risk/alerts,只靠前端能拦住吗?</h3>
|
||
<div class="quiz-options">
|
||
<button class="quiz-option" data-value="option-a" onclick="selectOption(this)">
|
||
<div class="quiz-option-radio"></div><span>能,RequireAuth 够了</span>
|
||
</button>
|
||
<button class="quiz-option" data-value="option-b" onclick="selectOption(this)">
|
||
<div class="quiz-option-radio"></div><span>不能,必须后端 risk 角色 + X-Agent-Type: risk</span>
|
||
</button>
|
||
<button class="quiz-option" data-value="option-c" onclick="selectOption(this)">
|
||
<div class="quiz-option-radio"></div><span>能,Hash 路由自动 404</span>
|
||
</button>
|
||
</div>
|
||
<div class="quiz-feedback"></div>
|
||
</div>
|
||
<button class="quiz-check-btn" onclick="checkQuiz('quiz-frontend-m4')">检查答案</button>
|
||
<button class="quiz-reset-btn" onclick="resetQuiz('quiz-frontend-m4')">重做</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</section>
|