From 40ee7f4dc0ee2202b937a2455cb7feeb0bed66f9 Mon Sep 17 00:00:00 2001 From: Hermes Agent Date: Tue, 16 Jun 2026 15:02:01 +0800 Subject: [PATCH] feat(frontend): complete local UI remediation for web, portal, and dashboard --- admin/routes/web_public.py | 910 ++++++++++++++---- admin/static/dashboard.html | 20 +- admin/static/dashboard.js | 14 +- admin/static/portal-ui.css | 139 +++ admin/tests/test_app.py | 9 +- admin/tests/test_order_info_form.py | 20 +- admin/tests/test_web_public.py | 71 +- docs/CURRENT_STATE.md | 13 +- docs/FRONTEND_UI_AUDIT_2026-06-16.md | 245 +++++ .../FRONTEND_UI_EXECUTION_BOARD_2026-06-16.md | 369 +++++++ 10 files changed, 1572 insertions(+), 238 deletions(-) create mode 100644 admin/static/portal-ui.css create mode 100644 docs/FRONTEND_UI_AUDIT_2026-06-16.md create mode 100644 docs/FRONTEND_UI_EXECUTION_BOARD_2026-06-16.md diff --git a/admin/routes/web_public.py b/admin/routes/web_public.py index ef2a18c..b335acc 100644 --- a/admin/routes/web_public.py +++ b/admin/routes/web_public.py @@ -26,6 +26,7 @@ from data.customer_portal.token import ( verify_portal_token, ) from data.notifications.email_service import DeliveryNotificationService +from data.orders import crypto from data.orders.dao import OrderNotFound, OrdersDAO from data.orders.intake_schema import IntakePayload from data.orders.intake_store import IntakeStore @@ -34,6 +35,7 @@ from data.orders.public_flow import ( PublicOrderCreate, create_public_order, ) +from data.orders.crypto import MissingEncryptionKey from data.payments.service import PaymentError, PaymentService @@ -154,8 +156,17 @@ def create_public_order_endpoint( detail=f"payment provider unavailable: {exc}", ) from exc - with OrdersDAO.connect(settings.orders_db_path) as dao: - order = create_public_order(dao, payload) + try: + with OrdersDAO.connect(settings.orders_db_path) as dao: + order = create_public_order(dao, payload) + except MissingEncryptionKey as exc: + crypto.get_fernet.cache_clear() + logger.warning("public order create blocked by missing encryption key: %s", exc) + raise HTTPException( + status_code=503, + detail="当前暂时无法创建订单,请稍后重试或联系客服获取人工协助。", + ) from exc + portal_token = issue_portal_token(order.id, settings.portal_token_secret) try: checkout = payment_service.create_checkout(order.id, portal_token=portal_token) @@ -696,44 +707,155 @@ def _render_landing_page() -> str: - 高考志愿填报智能系统 - 用户端 Web 自助服务 + 高考志愿填报智能规划服务 +
-

高考志愿填报智能系统

-

用户端 Web 自助服务已接入公开套餐、下单、Mock 支付沙箱、资料填写、订单状态页与报告查看/下载链路。

-
- 查看服务套餐 - 进入运营后台 +
+
湖南新高考志愿填报 · 家长决策支持
+

高考志愿填报智能规划服务

+

把分数、位次、选科、意向城市和专业偏好整理成可执行的志愿方案。先完成线上下单,再进入资料向导补充详细信息,后续可在站内查看报告与交付进度。

+ +
+
适配湖南志愿规则围绕本科批 / 专业组 / 风险梯度做信息整理与方案表达。
+
先下单后补资料先确认家长联系方式与考生基础信息,支付后进入 5 步资料向导。
+
站内可追踪交付支持资料进度、通知记录、报告在线查看与 PDF 下载入口。
+
-
-
49元 AI方案审核

适合已拿到其他 AI 方案,需要快速校验政策、扎堆和数据来源的用户。

-
99元 完整志愿方案

适合需要从资料收集到完整方案输出的标准 Web 自助用户。

-
199元 深度辅导版

适合需要人工介入、反复沟通和多轮修订的复杂场景。

+ +
+ +
+

为什么家长选择我们

+

高考志愿填报不是只看一个分数,而是要在时间、信息、风险和沟通成本之间做平衡。页面设计先把这些关键决策点讲清楚,再引导进入下单。

+
+
+ 信息整理 +

先收敛决策范围

+

先明确分数位次、城市偏好、专业倾向和预算,再决定应该看哪些院校与专业组。

+
+
+ 风险沟通 +

把风险解释给家长听懂

+

不只输出结果,还会说明冲稳保梯度、可能踩线的位置,以及需要重点确认的选择风险。

+
+
+ 交付透明 +

过程可追踪

+

从下单、资料填写、通知到报告查看,都能在站内看到当前进度,减少反复追问。

+
+ +
+

服务流程

+

让家长知道每一步会发生什么,比空泛地说“智能系统已接入”更重要。

+
+
Step 1

选择套餐

按需要的服务深度选择审核版、完整方案版或深度辅导版。

+
Step 2

确认下单

先填写考生姓名、手机号等最小信息,避免在支付前被长表单劝退。

+
Step 3

补充资料

支付成功后进入资料向导,分步提交分数、位次、偏好与已有方案附件。

+
Step 4

查看交付

在站内追踪状态、查看通知,并在交付就绪后在线阅读或下载 PDF。

+
+
+
-

当前自助流程建设重点

-
    -
  • 公开套餐页与下单入口
  • -
  • 系统内支付与回调验签
  • -
  • 支付后资料填写与订单状态页
  • -
  • 站内查看报告 + PDF 交付
  • -
+

基础信任说明

+
+
资料最小化采集支付前只收必要信息,详细资料在支付后按步骤补充。
+
隐私与删除入口可见隐私政策、服务说明和删除申请入口在全站统一可访问。
+
交付状态有记录资料提交、通知、报告状态都会在用户可见页面持续更新。
+
+
+ +
+
+

先看套餐,再决定是否立即下单

+

如果你已经明确要做完整方案,可以直接进入 99 元方案页查看内容和下单说明。

+
+
{_render_footer_links()}
@@ -748,39 +870,132 @@ def _render_pricing_page() -> str: - 服务套餐 - 高考志愿填报智能系统 + 服务套餐 - 高考志愿填报智能规划服务 +
-

服务套餐

-

当前页面已接入最小 Web 自助闭环,可直接进入下单与支付沙箱。

-
+
+
+

服务套餐

+

先按服务深度选择适合自己的方案:如果你已经拿到其他方案,先做审核;如果希望一次拿到完整建议,优先看完整志愿方案;如果家庭需要反复沟通和多轮修订,再选择深度辅导版。

+
+ +
+ +
+
快速校验

49元 AI方案审核

-
¥49
- 立即下单 +
¥49/ 次
+

适合已经拿到其他 AI 志愿方案,想先判断方案是否踩线、是否扎堆、是否存在明显风险的家庭。

+
    +
  • 适合已有初版方案的家长
  • +
  • 聚焦风险点、冲稳保结构与明显异常
  • +
  • 给出是否值得继续深做的判断
  • +
+ 立即下单
-
+ +
+ 推荐方案 +
完整规划

99元 完整志愿方案

-
¥99
+
¥99/ 单
+

适合大多数希望一次拿到完整志愿建议的家庭:先完成线上下单,再在资料向导里补充分数、位次、偏好与已有方案信息。

+
    +
  • 适合首次系统化做志愿规划的家长
  • +
  • 站内追踪资料、通知与交付状态
  • +
  • 支持在线查看报告与 PDF 下载
  • +
立即下单
+
+
深度辅导

199元 深度辅导版

-
¥199
- 立即下单 +
¥199/ 单
+

适合志愿范围复杂、目标城市/专业冲突较大,或需要更多人工沟通、反复修订和深度解释的家庭。

+
    +
  • 适合目标复杂或分歧较大的家庭
  • +
  • 留出多轮沟通与补充说明空间
  • +
  • 更强调过程解释与决策支持
  • +
+ 立即下单
-
支付接入建设中:当前使用 Mock 支付沙箱完成本地闭环验证,后续可切换真实 provider。
+ +
+
站内可追踪下单后可以查看资料提交、通知记录和交付状态,不需要反复追问进度。
+
资料入口清晰支付前只收必要下单信息,详细资料在支付后通过资料向导分步补充。
+
合规入口可见隐私政策、服务说明与删除申请入口始终保留在页面底部。
+
+ +
+

为什么推荐 99 元完整志愿方案?

它覆盖大多数家庭最关心的完整资料收集、站内进度追踪与报告交付,是当前最适合线上自助下单的标准路径。

+

支付后还要补哪些信息?

主要是分数、位次、选科、目标城市/专业、已有方案说明与附件。支付前不让家长一次填太长的表单。

+
+ +
如你当前只想先快速判断现有方案是否有明显问题,可先选择 49 元审核版;若希望直接拿到完整线上方案,优先进入 99 元完整志愿方案。
{_render_footer_links()}
@@ -794,11 +1009,17 @@ def _render_checkout_page(service_version: str) -> str: "standard": "99元 完整志愿方案", "premium": "199元 深度辅导版", }[service_version] + service_desc = { + "audit": "适合已经拿到其他方案、希望先快速校验风险的家庭。", + "basic": "适合需求较轻、希望先收敛选校范围的家庭。", + "standard": "适合大多数希望一次拿到完整建议与站内交付追踪的家庭。", + "premium": "适合需要更多沟通、补充说明与深度修订支持的家庭。", + }[service_version] province_options = [ "", "北京", "上海", "天津", "重庆", "河北", "河南", "山东", "山西", "陕西", "辽宁", "吉林", "黑龙江", "江苏", "浙江", "安徽", "福建", "江西", "湖北", "湖南", "广东", "广西", "海南", "四川", "贵州", "云南", "甘肃", "青海", "宁夏", "新疆", "内蒙古", "西藏", ] province_html = "".join( - f"" for p in province_options + f"" for p in province_options ) return f""" @@ -806,63 +1027,142 @@ def _render_checkout_page(service_version: str) -> str: 下单 - {escape(service_label)} +
-
+
+ 在线下单

{escape(service_label)}

-

先完成最小下单:只要求考生姓名与手机号;其余信息可在支付后补充。

-
-
-
- - -
-
-
- - -
-
+

{escape(service_desc)} 现在先确认联系人与考生基础信息;支付成功后,再进入资料向导补充分数、位次、偏好和已有方案附件。

+
+ +
+
+

填写下单信息

+

当前这一步只收会影响下单与后续联系的必要信息,不要求你一次性填完整个长表单。

+
+
步骤更短先支付,再补详细资料。
+
进度可追踪资料、通知和交付状态都可站内查看。
+
入口可核查隐私政策、服务说明、删除申请入口全程可见。
-
-
- - + +
+
+ + +
+
+
+ + +
+
-
- - +
+
+ + +
+
+ + +
+
+
+ + +
如果你暂时还没决定,也可以支付后在资料向导中补充。
+
+
+ + +
+
+
+ + 提交后会进入支付与资料完善流程。 +
+ +

+
服务保障:支付后可进入资料向导继续补充详细信息;提交资料后,后续状态、通知与交付入口都将在站内持续更新。
+ {_render_footer_links()} +
+ +
@@ -917,12 +1235,12 @@ def _render_checkout_page(service_version: str) -> str: def _render_mock_payment_page(payment_id: str, amount_cents: int, token: str) -> str: return _render_simulated_payment_html( - title="Mock 支付沙箱", + title="支付确认页", provider_slug="mock", payment_id=payment_id, amount_cents=amount_cents, token=token, - submit_label="模拟支付成功并返回订单页", + submit_label="确认支付并返回订单页", ) @@ -1049,76 +1367,187 @@ def _render_info_page( continue attachment_items.append( f"
  • {escape(str(item.get('original_name') or item.get('stored_name') or '未命名附件'))}" - f" ({escape(str(item.get('size_bytes') or '0'))} bytes)
  • " + f"{escape(str(item.get('size_bytes') or '0'))} bytes" ) - attachments_html = "".join(attachment_items) or "
  • 暂无附件
  • " + attachments_html = "".join(attachment_items) or "
  • 暂无附件
  • " + stage_title, stage_subtitle = _STAGE_META[stage] return f""" - 考生资料填写 - -
    -

    考生资料填写

    -

    当前阶段:{escape(_STAGE_META[stage][0])}

    -

    提交资料即表示:监护人已知情并同意将考生资料用于志愿填报服务;当前版本号:{escape(consent_version)}

    -
    -

    资料向导进度

    -
      -
    1. 1. 基础信息
    2. -
    3. 2. 偏好与目标
    4. -
    5. 3. 已有方案与附件
    6. -
    7. 4. 协议确认
    8. -
    9. 5. 提交确认
    10. -
    -
    -
    -
    -

    Step 1 / 基础信息

    -
    -
    -
    -
    -
    -

    Step 2 / 偏好与目标

    -
    -
    -
    -
    -
    -
    -

    Step 3 / 已有方案与附件

    -
    -
    -
    -

    已上传附件

    -
      {attachments_html}
    -
    - - -
    + + + + 资料填写向导 + + + + +
    +
    +
    + 资料填写向导 +

    填写并提交资料

    +

    支付完成后,请按向导逐步补充分数、位次、偏好与已有方案信息。我们会把这份资料作为后续方案分析与交付的基础。

    + +
    +

    五步资料向导

    +

    你不需要一次性完成所有内容。可以先保存草稿,再回来继续补充;提交成功后,状态页会更新为下一阶段。

    +
      +
    1. 基础信息
    2. +
    3. 偏好与目标
    4. +
    5. 已有方案与附件
    6. +
    7. 协议确认
    8. +
    9. 提交确认
    10. +
    + + +
    +

    基础信息

    +

    先确认最影响志愿方案判断的基本数据:分数、位次、选科。

    +
    +
    如暂未最终确认,也可先保存草稿。
    +
    建议填写与成绩单一致的最新位次。
    +
    +
    例如:物理,化学,生物
    +
    + +
    +

    偏好与目标

    +

    告诉我们你更看重什么,后续方案会围绕这些目标来解释选择逻辑。

    +
    +
    +
    +
    +
    +
    +
    + +
    +

    已有方案与附件

    +

    如果你已经拿到其他平台、老师或 AI 生成的方案,可以在这里上传并说明担心点。

    +
    +
    +
    +

    当前资料状态

    +

    支持继续补充方案附件、成绩截图或其他参考资料。

    +
    + +
    + +
    +
    +
      {attachments_html}
    +
    +
    + +
    +

    协议确认

    +

    请确认监护人已知情并同意将资料用于志愿填报服务。

    + + +
    + + + +
    +
    当前资料状态会随提交结果同步更新;未勾选必要同意项时,系统不会进入正式处理阶段。
    +
    + +
    +

    提交确认

    +

    请在提交前再快速浏览一次关键信息。提交成功后,系统会进入后续处理阶段。

    +
    +
    + +
    + + + + +
    + + + {_render_footer_links(token)} +
    -
    -

    Step 4 / 协议确认

    - - -
    -
    -
    -
    -
    -

    Step 5 / 提交确认

    -
    -
    -
    - - - - -
    - -

    返回订单状态页

    - {_render_footer_links(token)} -
    
    +
    +        
    +