185 lines
49 KiB
JSON
185 lines
49 KiB
JSON
{
|
||
"built_at": "2026-03-17T07:02:12.075281+08:00",
|
||
"prompt_id": "P20260317-070104",
|
||
"prompt_at": "2026-03-17T07:01:04.555724+08:00",
|
||
"audit_required": true,
|
||
"db_docs_required": false,
|
||
"reasons": [
|
||
"root-file",
|
||
"dir:miniprogram"
|
||
],
|
||
"changed_files": [
|
||
"NeoZQYY.code-workspace",
|
||
"VI-COLOR-SYSTEM-PROJECT-SUMMARY.md",
|
||
"apps/miniprogram/miniprogram/app.wxss",
|
||
"apps/miniprogram/miniprogram/components/clue-card/",
|
||
"apps/miniprogram/miniprogram/components/note-modal/note-modal.ts",
|
||
"apps/miniprogram/miniprogram/components/note-modal/note-modal.wxml",
|
||
"apps/miniprogram/miniprogram/pages/apply/apply.wxss",
|
||
"apps/miniprogram/miniprogram/pages/board-coach/board-coach.json",
|
||
"apps/miniprogram/miniprogram/pages/board-coach/board-coach.ts",
|
||
"apps/miniprogram/miniprogram/pages/board-customer/board-customer.json",
|
||
"apps/miniprogram/miniprogram/pages/board-customer/board-customer.ts",
|
||
"apps/miniprogram/miniprogram/pages/board-finance/board-finance.json",
|
||
"apps/miniprogram/miniprogram/pages/chat-history/chat-history.json",
|
||
"apps/miniprogram/miniprogram/pages/chat/chat.json",
|
||
"apps/miniprogram/miniprogram/pages/chat/chat.wxml",
|
||
"apps/miniprogram/miniprogram/pages/coach-detail/coach-detail.json",
|
||
"apps/miniprogram/miniprogram/pages/coach-detail/coach-detail.ts",
|
||
"apps/miniprogram/miniprogram/pages/coach-detail/coach-detail.wxml",
|
||
"apps/miniprogram/miniprogram/pages/coach-detail/coach-detail.wxss",
|
||
"apps/miniprogram/miniprogram/pages/customer-detail/customer-detail.json",
|
||
"apps/miniprogram/miniprogram/pages/customer-detail/customer-detail.ts",
|
||
"apps/miniprogram/miniprogram/pages/customer-detail/customer-detail.wxml",
|
||
"apps/miniprogram/miniprogram/pages/customer-detail/customer-detail.wxss",
|
||
"apps/miniprogram/miniprogram/pages/customer-service-records/customer-service-records.json",
|
||
"apps/miniprogram/miniprogram/pages/dev-tools/dev-tools.ts",
|
||
"apps/miniprogram/miniprogram/pages/login/login.ts",
|
||
"apps/miniprogram/miniprogram/pages/login/login.wxss",
|
||
"apps/miniprogram/miniprogram/pages/no-permission/no-permission.wxss",
|
||
"apps/miniprogram/miniprogram/pages/notes/notes.json",
|
||
"apps/miniprogram/miniprogram/pages/performance-records/performance-records.json",
|
||
"apps/miniprogram/miniprogram/pages/performance/MIGRATION_NOTES.md",
|
||
"apps/miniprogram/miniprogram/pages/performance/performance.json",
|
||
"apps/miniprogram/miniprogram/pages/performance/performance.ts",
|
||
"apps/miniprogram/miniprogram/pages/performance/performance.wxml",
|
||
"apps/miniprogram/miniprogram/pages/performance/performance.wxss",
|
||
"apps/miniprogram/miniprogram/pages/reviewing/reviewing.wxss",
|
||
"apps/miniprogram/miniprogram/pages/task-detail/task-detail.json",
|
||
"apps/miniprogram/miniprogram/pages/task-detail/task-detail.ts",
|
||
"apps/miniprogram/miniprogram/pages/task-detail/task-detail.wxml",
|
||
"apps/miniprogram/miniprogram/pages/task-detail/task-detail.wxss",
|
||
"apps/miniprogram/miniprogram/pages/task-list/task-list.wxml",
|
||
"apps/miniprogram/miniprogram/pages/task-list/task-list.wxss",
|
||
"apps/miniprogram/miniprogram/utils/ai-color-manager.ts",
|
||
"apps/miniprogram/miniprogram/utils/task-config.ts",
|
||
"apps/miniprogram/miniprogram/utils/vi-colors.ts",
|
||
"apps/miniprogram/package-lock.json",
|
||
"apps/miniprogram/package.json",
|
||
"apps/miniprogram/project.config.json",
|
||
"apps/miniprogram/project.private.config.json",
|
||
"docs/h5_ui/pages/customer-detail.html"
|
||
],
|
||
"high_risk_files": [
|
||
"apps/miniprogram/miniprogram/app.wxss",
|
||
"apps/miniprogram/miniprogram/components/clue-card/",
|
||
"apps/miniprogram/miniprogram/components/note-modal/note-modal.ts",
|
||
"apps/miniprogram/miniprogram/components/note-modal/note-modal.wxml",
|
||
"apps/miniprogram/miniprogram/pages/apply/apply.wxss",
|
||
"apps/miniprogram/miniprogram/pages/board-coach/board-coach.json",
|
||
"apps/miniprogram/miniprogram/pages/board-coach/board-coach.ts",
|
||
"apps/miniprogram/miniprogram/pages/board-customer/board-customer.json",
|
||
"apps/miniprogram/miniprogram/pages/board-customer/board-customer.ts",
|
||
"apps/miniprogram/miniprogram/pages/board-finance/board-finance.json",
|
||
"apps/miniprogram/miniprogram/pages/chat-history/chat-history.json",
|
||
"apps/miniprogram/miniprogram/pages/chat/chat.json",
|
||
"apps/miniprogram/miniprogram/pages/chat/chat.wxml",
|
||
"apps/miniprogram/miniprogram/pages/coach-detail/coach-detail.json",
|
||
"apps/miniprogram/miniprogram/pages/coach-detail/coach-detail.ts",
|
||
"apps/miniprogram/miniprogram/pages/coach-detail/coach-detail.wxml",
|
||
"apps/miniprogram/miniprogram/pages/coach-detail/coach-detail.wxss",
|
||
"apps/miniprogram/miniprogram/pages/customer-detail/customer-detail.json",
|
||
"apps/miniprogram/miniprogram/pages/customer-detail/customer-detail.ts",
|
||
"apps/miniprogram/miniprogram/pages/customer-detail/customer-detail.wxml",
|
||
"apps/miniprogram/miniprogram/pages/customer-detail/customer-detail.wxss",
|
||
"apps/miniprogram/miniprogram/pages/customer-service-records/customer-service-records.json",
|
||
"apps/miniprogram/miniprogram/pages/dev-tools/dev-tools.ts",
|
||
"apps/miniprogram/miniprogram/pages/login/login.ts",
|
||
"apps/miniprogram/miniprogram/pages/login/login.wxss",
|
||
"apps/miniprogram/miniprogram/pages/no-permission/no-permission.wxss",
|
||
"apps/miniprogram/miniprogram/pages/notes/notes.json",
|
||
"apps/miniprogram/miniprogram/pages/performance-records/performance-records.json",
|
||
"apps/miniprogram/miniprogram/pages/performance/MIGRATION_NOTES.md",
|
||
"apps/miniprogram/miniprogram/pages/performance/performance.json",
|
||
"apps/miniprogram/miniprogram/pages/performance/performance.ts",
|
||
"apps/miniprogram/miniprogram/pages/performance/performance.wxml",
|
||
"apps/miniprogram/miniprogram/pages/performance/performance.wxss",
|
||
"apps/miniprogram/miniprogram/pages/reviewing/reviewing.wxss",
|
||
"apps/miniprogram/miniprogram/pages/task-detail/task-detail.json",
|
||
"apps/miniprogram/miniprogram/pages/task-detail/task-detail.ts",
|
||
"apps/miniprogram/miniprogram/pages/task-detail/task-detail.wxml",
|
||
"apps/miniprogram/miniprogram/pages/task-detail/task-detail.wxss",
|
||
"apps/miniprogram/miniprogram/pages/task-list/task-list.wxml",
|
||
"apps/miniprogram/miniprogram/pages/task-list/task-list.wxss",
|
||
"apps/miniprogram/miniprogram/utils/ai-color-manager.ts",
|
||
"apps/miniprogram/miniprogram/utils/task-config.ts",
|
||
"apps/miniprogram/miniprogram/utils/vi-colors.ts",
|
||
"apps/miniprogram/package-lock.json",
|
||
"apps/miniprogram/package.json",
|
||
"apps/miniprogram/project.config.json",
|
||
"apps/miniprogram/project.private.config.json"
|
||
],
|
||
"session_diff": {
|
||
"added": [
|
||
"docs/audit/prompt_logs/prompt_log_20260317_070104.md",
|
||
"docs/audit/session_logs/2026-03/15/20_d1a9ed3d_100853/main_01_02a57347.md"
|
||
],
|
||
"modified": [
|
||
"apps/miniprogram/miniprogram/pages/no-permission/no-permission.wxss",
|
||
"apps/miniprogram/miniprogram/pages/reviewing/reviewing.wxss",
|
||
"docs/audit/session_logs/2026-02/11/_day_index.json",
|
||
"docs/audit/session_logs/2026-02/11/_day_index_full.json",
|
||
"docs/audit/session_logs/2026-02/12/_day_index.json",
|
||
"docs/audit/session_logs/2026-02/12/_day_index_full.json",
|
||
"docs/audit/session_logs/2026-02/13/_day_index.json",
|
||
"docs/audit/session_logs/2026-02/13/_day_index_full.json",
|
||
"docs/audit/session_logs/2026-02/14/_day_index.json",
|
||
"docs/audit/session_logs/2026-02/14/_day_index_full.json",
|
||
"docs/audit/session_logs/2026-02/15/_day_index.json",
|
||
"docs/audit/session_logs/2026-02/15/_day_index_full.json",
|
||
"docs/audit/session_logs/2026-02/16/_day_index.json",
|
||
"docs/audit/session_logs/2026-02/16/_day_index_full.json",
|
||
"docs/audit/session_logs/2026-02/17/_day_index.json",
|
||
"docs/audit/session_logs/2026-02/17/_day_index_full.json",
|
||
"docs/audit/session_logs/2026-02/18/_day_index.json",
|
||
"docs/audit/session_logs/2026-02/18/_day_index_full.json",
|
||
"docs/audit/session_logs/2026-02/19/_day_index.json",
|
||
"docs/audit/session_logs/2026-02/19/_day_index_full.json",
|
||
"docs/audit/session_logs/2026-02/20/_day_index.json",
|
||
"docs/audit/session_logs/2026-02/20/_day_index_full.json",
|
||
"docs/audit/session_logs/2026-02/21/_day_index.json",
|
||
"docs/audit/session_logs/2026-02/21/_day_index_full.json",
|
||
"docs/audit/session_logs/2026-02/22/_day_index.json",
|
||
"docs/audit/session_logs/2026-02/22/_day_index_full.json",
|
||
"docs/audit/session_logs/2026-02/23/_day_index.json",
|
||
"docs/audit/session_logs/2026-02/23/_day_index_full.json",
|
||
"docs/audit/session_logs/2026-02/24/_day_index.json",
|
||
"docs/audit/session_logs/2026-02/24/_day_index_full.json",
|
||
"docs/audit/session_logs/2026-02/25/_day_index.json",
|
||
"docs/audit/session_logs/2026-02/25/_day_index_full.json",
|
||
"docs/audit/session_logs/2026-02/26/_day_index.json",
|
||
"docs/audit/session_logs/2026-02/26/_day_index_full.json",
|
||
"docs/audit/session_logs/2026-02/27/_day_index.json",
|
||
"docs/audit/session_logs/2026-02/27/_day_index_full.json",
|
||
"docs/audit/session_logs/2026-02/28/_day_index.json",
|
||
"docs/audit/session_logs/2026-02/28/_day_index_full.json",
|
||
"docs/audit/session_logs/2026-03/01/_day_index.json",
|
||
"docs/audit/session_logs/2026-03/01/_day_index_full.json",
|
||
"docs/audit/session_logs/2026-03/02/_day_index.json",
|
||
"docs/audit/session_logs/2026-03/02/_day_index_full.json",
|
||
"docs/audit/session_logs/2026-03/03/_day_index.json",
|
||
"docs/audit/session_logs/2026-03/03/_day_index_full.json",
|
||
"docs/audit/session_logs/2026-03/04/_day_index.json",
|
||
"docs/audit/session_logs/2026-03/04/_day_index_full.json",
|
||
"docs/audit/session_logs/2026-03/05/_day_index.json",
|
||
"docs/audit/session_logs/2026-03/05/_day_index_full.json",
|
||
"docs/audit/session_logs/2026-03/06/_day_index.json",
|
||
"docs/audit/session_logs/2026-03/06/_day_index_full.json"
|
||
],
|
||
"deleted": [
|
||
"docs/audit/session_logs/2026-03/15/20_d1a9ed3d_100853/main_01_f7198f3e.md"
|
||
]
|
||
},
|
||
"compliance": {
|
||
"code_without_docs": [],
|
||
"new_migration_sql": [],
|
||
"has_bd_manual": false,
|
||
"has_audit_record": false,
|
||
"has_ddl_baseline": false,
|
||
"api_changed": false,
|
||
"openapi_spec_stale": false
|
||
},
|
||
"diff_stat": ".kiro/state/.audit_state.json | 68 +-\n .kiro/state/.compliance_state.json | 2 +-\n .kiro/state/.file_baseline.json | 2 +-\n .kiro/state/.last_prompt_id.json | 4 +-\n NeoZQYY.code-workspace | 1 +\n apps/miniprogram/miniprogram/app.wxss | 175 ++++\n .../components/note-modal/note-modal.ts | 20 +-\n .../components/note-modal/note-modal.wxml | 4 +-\n .../miniprogram/miniprogram/pages/apply/apply.wxss | 62 +-\n .../miniprogram/pages/board-coach/board-coach.ts | 2 +\n .../pages/board-customer/board-customer.ts | 2 +\n .../pages/coach-detail/coach-detail.json | 3 +-\n .../miniprogram/pages/coach-detail/coach-detail.ts | 15 +-\n .../pages/coach-detail/coach-detail.wxml | 78 +-\n .../pages/coach-detail/coach-detail.wxss | 371 +++++--\n .../pages/customer-detail/customer-detail.json | 11 +-\n .../pages/customer-detail/customer-detail.ts | 373 +++----\n .../pages/customer-detail/customer-detail.wxml | 131 ++-\n .../pages/customer-detail/customer-detail.wxss | 689 ++++++++-----\n .../miniprogram/pages/dev-tools/dev-tools.ts | 6 +-\n apps/miniprogram/miniprogram/pages/login/login.ts | 2 +-\n .../miniprogram/miniprogram/pages/login/login.wxss | 52 +-\n .../miniprogram/pages/performance/performance.ts | 5 +\n .../miniprogram/pages/performance/performance.wxml | 5 +-\n .../miniprogram/pages/performance/performance.wxss | 2 +-\n .../miniprogram/pages/task-detail/task-detail.json | 3 +-\n .../miniprogram/pages/task-detail/task-detail.ts | 11 +\n .../miniprogram/pages/task-detail/task-detail.wxml | 30 +-\n .../miniprogram/pages/task-detail/task-detail.wxss | 60 +-\n .../miniprogram/pages/task-list/task-list.wxml | 2 +\n .../miniprogram/pages/task-list/task-list.wxss | 38 +-\n apps/miniprogram/package-lock.json | 10 +\n apps/miniprogram/package.json | 1 +\n apps/miniprogram/project.config.json | 1 +\n apps/miniprogram/project.private.config.json | 4 +-\n docs/h5_ui/pages/customer-detail.html | 52 +-\n .../appendix_a_spacing_and_sizing_dictionary_v3.md | 180 ----\n ...appendix_b_typography_and_text_dictionary_v3.md | 266 -----\n .../New/appendix_c_color_dictionary_v3.md | 198 ----\n ...ppendix_d_layout_class_mapping_dictionary_v3.md | 204 ----\n ...niprogram_migration_bridge_appendix_index_v3.md | 140 ---\n docs/miniprogram-dev/README-migration-docs.md | 153 ---\n docs/miniprogram-dev/ai-icon-color-system.md | 173 ----\n docs/miniprogram-dev/h5-to-mp-bridge-v3.md | 1080 --------------------\n 44 files changed, 1457 insertions(+), 3234 deletions(-)",
|
||
"high_risk_diff": "diff --git a/apps/miniprogram/miniprogram/app.wxss b/apps/miniprogram/miniprogram/app.wxss\nindex e67ab09..9fadd32 100644\n--- a/apps/miniprogram/miniprogram/app.wxss\n+++ b/apps/miniprogram/miniprogram/app.wxss\n@@ -110,6 +110,181 @@ page {\n flex: 1;\n }\n \n+/* ============================================\n+ * VI 设计系统 - 完整颜色常量库\n+ * 基于 docs/miniprogram-dev/VI-DESIGN-SYSTEM.md v1.0\n+ * ============================================ */\n+\n+/* --- 1. 任务分类配色(4 种) --- */\n+page {\n+ /* 高优先召回 */\n+ --task-high-priority-border: #dc2626;\n+ --task-high-priority-from: #b91c1c;\n+ --task-high-priority-to: #dc2626;\n+\n+ /* 优先召回 */\n+ --task-priority-recall-border: #f97316;\n+ --task-priority-recall-from: #ea580c;\n+ --task-priority-recall-to: #f97316;\n+\n+ /* 客户回访 */\n+ --task-callback-border: #14b8a6;\n+ --task-callback-from: #0d9488;\n+ --task-callback-to: #14b8a6;\n+\n+ /* 关系构建 */\n+ --task-relationship-border: #f472b6;\n+ --task-relationship-from: #ec4899;\n+ --task-relationship-to: #f472b6;\n+\n+ /* --- 2. 客户标签配色(6 种) --- */\n+ /* 客户基础 */\n+ --tag-basic-text: #0052d9;\n+ --tag-basic-bg: #ecf2fe;\n+ --tag-basic-border: #bfdbfe;\n+\n+ /* 消费习惯 */\n+ --tag-consume-text: #00a870;\n+ --tag-consume-bg: #e6f7f0;\n+ --tag-consume-border: #a7f3d0;\n+\n+ /* 玩法偏好 */\n+ --tag-hobby-text: #ed7b2f;\n+ --tag-hobby-bg: #fff3e6;\n+ --tag-hobby-border: #fed7aa;\n+\n+ /* 促销偏好 */\n+ --tag-promo-text: #d4a017;\n+ --tag-promo-bg: #fffbeb;\n+ --tag-promo-border: #fef3c7;\n+\n+ /* 社交关系 */\n+ --tag-social-text: #764ba2;\n+ --tag-social-bg: #f3e8ff;\n+ --tag-social-border: #e9d5ff;\n+\n+ /* 重要反馈 */\n+ --tag-feedback-text: #e34d59;\n+ --tag-feedback-bg: #ffe6e8;\n+ --tag-feedback-border: #fecdd3;\n+\n+ /* --- 3. 关系等级配色(4 种) --- */\n+ /* 很好 (💖) */\n+ --rel-excellent-from: #e91e63;\n+ --rel-excellent-to: #f472b6;\n+ --rel-excellent-shadow: rgba(233,30,99,0.30);\n+\n+ /* 良好 (🧡) */\n+ --rel-good-from: #ea580c;\n+ --rel-good-to: #fb923c;\n+ --rel-good-shadow: rgba(234,88,12,0.30);\n+\n+ /* 一般 (💛) */\n+ --rel-normal-from: #eab308;\n+ --rel-normal-to: #fbbf24;\n+ --rel-normal-shadow: rgba(234,179,8,0.30);\n+\n+ /* 待发展 (💙) */\n+ --rel-poor-from: #64748b;\n+ --rel-poor-to: #94a3b8;\n+ --rel-poor-shadow: rgba(100,116,139,0.30);\n+\n+ /* --- 4. 置顶/放弃状态 --- */\n+ /* 置顶 */\n+ --status-pinned-glow: #f59e0b;\n+ --status-pinned-shadow-light: rgba(245, 158, 11, 0.12);\n+ --status-pinned-shadow-glow: rgba(245, 158, 11, 0.08);\n+\n+ /* 放弃 */\n+ --status-abandoned-border: #d1d5db;\n+ --status-abandoned-text: #9ca3af;\n+ --status-abandoned-opacity: 0.55;\n+\n+ /* --- 5. 助教等级配色(4 级 + 星级) --- */\n+ /* 初级 */\n+ --coach-junior-text: #0052d9;\n+ --coach-junior-bg: #ecf2fe;\n+ --coach-junior-border: #bfdbfe;\n+\n+ /* 中级 */\n+ --coach-middle-text: #ed7b2f;\n+ --coach-middle-bg: #fff3e6;\n+ --coach-middle-border: #fed7aa;\n+\n+ /* 高级 */\n+ --coach-senior-text: #e91e63;\n+ --coach-senior-bg: #ffe6e8;\n+ --coach-senior-border: #fecdd3;\n+\n+ /* 星级 */\n+ --coach-star-text: #fbbf24;\n+ --coach-star-bg: #fffef0;\n+ --coach-star-border: #fef3c7;\n+\n+ /* --- 颜色变体(用于透明度和阴影) --- */\n+ /* 错误色变体 */\n+ --color-error-light: #ffe6e8;\n+ --color-error-lighter: #fff5f5;\n+ --color-error-shadow: rgba(227, 77, 89, 0.3);\n+ --color-error-shadow-light: rgba(227, 77, 89, 0.18);\n+ --color-error-shadow-lighter: rgba(227, 77, 89, 0.06);\n+ --color-error-shadow-minimal: rgba(227, 77, 89, 0.1);\n+ --color-error-shadow-micro: rgba(227, 77, 89, 0.03);\n+\n+ /* 警告色变体 */\n+ --color-warning-light: #fff3e6;\n+ --color-warning-shadow: rgba(237, 123, 47, 0.3);\n+ --color-warning-shadow-light: rgba(237, 123, 47, 0.18);\n+ --color-warning-shadow-lighter: rgba(237, 123, 47, 0.06);\n+ --color-warning-shadow-minimal: rgba(237, 123, 47, 0.1);\n+ --color-warning-shadow-micro: rgba(237, 123, 47, 0.03);\n+\n+ /* 主色变体 */\n+ --color-primary-shadow: rgba(0, 82, 217, 0.3);\n+ --color-primary-shadow-light: rgba(0, 82, 217, 0.18);\n+ --color-primary-shadow-lighter: rgba(0, 82, 217, 0.06);\n+ --color-primary-shadow-minimal: rgba(0, 82, 217, 0.1);\n+ --color-primary-shadow-micro: rgba(0, 82, 217, 0.03);\n+\n+ /* 成功色变体 */\n+ --color-success-shadow-minimal: rgba(0, 168, 112, 0.1);\n+\n+ /* 白色和透明 */\n+ --color-white: #ffffff;\n+ --color-white-overlay-light: rgba(255, 255, 255, 0.95);\n+ --color-white-overlay-lighter: rgba(255, 255, 255, 0.2);\n+ --color-white-overlay-minimal: rgba(255, 255, 255, 0.1);\n+\n+ /* 新增:简化的颜色别名(用于页面样式) */\n+ --bg-primary: var(--color-gray-1);\n+ --bg-secondary: var(--color-white);\n+ --bg-tertiary: var(--color-gray-1);\n+ --text-primary: var(--color-gray-13);\n+ --text-secondary: var(--color-gray-7);\n+ --text-tertiary: var(--color-gray-6);\n+ --text-disabled: var(--color-gray-5);\n+ --border-light: var(--color-gray-2);\n+ --shadow-xs: 0 2rpx 8rpx rgba(0,0,0,0.03);\n+ --shadow-sm: 0 8rpx 28rpx rgba(0,0,0,0.06);\n+\n+ /* 状态色的数值变体 */\n+ --error-300: #fda4af;\n+ --error-400: #f87171;\n+ --error-500: var(--color-error);\n+ --warning-300: #fcd34d;\n+ --warning-500: var(--color-warning);\n+ --warning-600: #ed7b2f;\n+ --success-500: var(--color-success);\n+\n+ /* 主色的数值变体和装饰点 */\n+ --primary-500: #3b82f6;\n+ --primary-dot-cyan: #22d3ee;\n+ --primary-dot-cyan-shadow: rgba(34, 211, 238, 0.4);\n+ --primary-dot-blue: #93c5fd;\n+ --primary-dot-blue-shadow: rgba(147, 197, 253, 0.4);\n+ --primary-shadow-minimal: rgba(0, 82, 217, 0.1);\n+}\n+\n /* ============================================\n * AI 图标配色系统(基于 docs/h5_ui/css/ai-icons.css)\n * 6 种配色 + 2 个系列(inline-icon / title-badge)\ndiff --git a/apps/miniprogram/miniprogram/components/note-modal/note-modal.ts b/apps/miniprogram/miniprogram/components/note-modal/note-modal.ts\nindex 34459b4..5316e5f 100644\n--- a/apps/miniprogram/miniprogram/components/note-modal/note-modal.ts\n+++ b/apps/miniprogram/miniprogram/components/note-modal/note-modal.ts\n@@ -21,6 +21,11 @@ Component({\n type: Boolean,\n value: true,\n },\n+ /** 是否显示评分区域 */\n+ showRating: {\n+ type: Boolean,\n+ value: true,\n+ },\n },\n \n data: {\n@@ -45,7 +50,7 @@ Component({\n if (val) {\n // 打开弹窗时重置\n this.setData({\n- ratingExpanded: !this.data.showExpandBtn, // 有展开按钮时默认收起,无按钮时默认展开\n+ ratingExpanded: this.data.showRating && !this.data.showExpandBtn, // 只有在显示评分且无按钮时才默认展开\n serviceScore: 0,\n returnScore: 0,\n content: this.data.initialContent || '',\n@@ -60,14 +65,17 @@ Component({\n }\n },\n // 任意评分或内容变化时重新计算 canSave\n- 'serviceScore, returnScore, content'(\n+ 'serviceScore, returnScore, content, showRating'(\n serviceScore: number,\n returnScore: number,\n- content: string\n+ content: string,\n+ showRating: boolean\n ) {\n- this.setData({\n- canSave: serviceScore > 0 && returnScore > 0 && content.trim().length > 0,\n- })\n+ // 如果不显示评分,只需要有内容即可保存;否则需要评分和内容都有\n+ const canSave = showRating\n+ ? serviceScore > 0 && returnScore > 0 && content.trim().length > 0\n+ : content.trim().length > 0\n+ this.setData({ canSave })\n },\n },\ndiff --git a/apps/miniprogram/miniprogram/components/note-modal/note-modal.wxml b/apps/miniprogram/miniprogram/components/note-modal/note-modal.wxml\nindex d46625a..1f7080b 100644\n--- a/apps/miniprogram/miniprogram/components/note-modal/note-modal.wxml\n+++ b/apps/miniprogram/miniprogram/components/note-modal/note-modal.wxml\n@@ -4,7 +4,7 @@\n <view class=\"modal-header\">\n <view class=\"header-left\">\n <text class=\"modal-title\">添加备注</text>\n- <view class=\"expand-btn\" wx:if=\"{{showExpandBtn}}\" bindtap=\"onToggleExpand\" hover-class=\"expand-btn--hover\">\n+ <view class=\"expand-btn\" wx:if=\"{{showExpandBtn && showRating}}\" bindtap=\"onToggleExpand\" hover-class=\"expand-btn--hover\">\n <text class=\"expand-text\">{{ratingExpanded ? '收起评价 ▴' : '展开评价 ▾'}}</text>\n </view>\n </view>\n@@ -14,7 +14,7 @@\n </view>\n \n <!-- 评分区域 -->\n- <view class=\"rating-section\" wx:if=\"{{ratingExpanded}}\">\n+ <view class=\"rating-section\" wx:if=\"{{showRating && ratingExpanded}}\">\n <!-- 再次服务此客户 - 爱心 -->\n <view class=\"rating-group\">\n <text class=\"rating-label\">再次服务此客户</text>\ndiff --git a/apps/miniprogram/miniprogram/pages/apply/apply.wxss b/apps/miniprogram/miniprogram/pages/apply/apply.wxss\nindex 127d79a..5135f1a 100644\n--- a/apps/miniprogram/miniprogram/pages/apply/apply.wxss\n+++ b/apps/miniprogram/miniprogram/pages/apply/apply.wxss\n@@ -2,7 +2,7 @@\n \n .page {\n min-height: 100vh;\n- background: linear-gradient(135deg, #e0f2fe 0%, #f0f9ff 50%, #ecfeff 100%);\n+ background: linear-gradient(135deg, var(--primary-shadow-minimal) 0%, var(--color-primary-light) 50%, var(--primary-shadow-minimal) 100%);\n display: flex;\n flex-direction: column;\n box-sizing: border-box;\n@@ -19,8 +19,8 @@\n position: sticky;\n top: 0;\n z-index: 10;\n- background: rgba(255, 255, 255, 0.95);\n- border-bottom: 1rpx solid rgba(229, 231, 235, 0.5);\n+ background: var(--color-white-overlay-light);\n+ border-bottom: 1rpx solid var(--border-light);\n }\n \n .navbar-back {\n@@ -33,7 +33,7 @@\n .navbar-title {\n font-size: 28rpx;\n font-weight: 500;\n- color: #242424;\n+ color: var(--text-primary);\n letter-spacing: 0.5rpx;\n }\n \n@@ -46,11 +46,11 @@\n \n /* ---- 欢迎卡片 p-5=20px→36rpx, rounded-2xl=16px→28rpx ---- */\n .welcome-card {\n- background: linear-gradient(135deg, #0052d9, #60a5fa);\n+ background: linear-gradient(135deg, var(--color-primary), var(--primary-500));\n border-radius: 28rpx;\n padding: 36rpx;\n margin-bottom: 28rpx;\n- box-shadow: 0 14rpx 36rpx rgba(0, 82, 217, 0.2);\n+ box-shadow: 0 14rpx 36rpx var(--color-primary-shadow-light);\n }\n \n /* gap-4=16px→28rpx, mb-4=16px→28rpx */\n@@ -66,7 +66,7 @@\n width: 84rpx;\n height: 84rpx;\n min-width: 84rpx;\n- background: rgba(255, 255, 255, 0.2);\n+ background: var(--color-white-overlay-lighter);\n border-radius: 22rpx;\n display: flex;\n align-items: center;\n@@ -83,19 +83,19 @@\n .welcome-title {\n font-size: 32rpx;\n font-weight: 600;\n- color: #ffffff;\n+ color: var(--color-white);\n }\n \n /* text-sm=14px→24rpx */\n .welcome-desc {\n font-size: 24rpx;\n- color: rgba(255, 255, 255, 0.8);\n+ color: var(--color-white-overlay-light);\n font-weight: 300;\n }\n \n /* ---- 审核流程步骤条 p-4=16px→28rpx, rounded-xl=12px→22rpx ---- */\n .steps-bar {\n- background: rgba(255, 255, 255, 0.1);\n+ background: var(--color-white-overlay-minimal);\n border-radius: 22rpx;\n padding: 28rpx;\n }\n@@ -117,18 +117,18 @@\n width: 50rpx;\n height: 50rpx;\n border-radius: 50%;\n- background: rgba(255, 255, 255, 0.2);\n+ background: var(--color-white-overlay-lighter);\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 22rpx;\n font-weight: 500;\n- color: rgba(255, 255, 255, 0.7);\n+ color: var(--color-white-overlay-light);\n }\n \n .step-circle--active {\n- background: #ffffff;\n- color: #0052d9;\n+ background: var(--color-white);\n+ color: var(--color-primary);\n font-weight: 600;\n }\n \n@@ -154,10 +154,10 @@\n \n /* ---- 表单卡片 rounded-2xl=16px→28rpx ---- */\n .form-card {\n- background: #ffffff;\n+ background: var(--bg-secondary);\n border-radius: 28rpx;\n overflow: hidden;\n- box-shadow: 0 8rpx 28rpx rgba(0, 0, 0, 0.04);\n+ box-shadow: var(--shadow-sm);\n }\n \n /* px-5=20px→36rpx, py-4=16px→28rpx+2rpx 视觉补偿 */\n@@ -166,7 +166,7 @@\n }\n \n .form-item--border {\n- border-bottom: 2rpx solid #f3f3f3;\n+ border-bottom: 2rpx solid var(--bg-tertiary);\n }\n \n /* text-sm=14px→24rpx, mb-2=8px→14rpx */\n@@ -177,19 +177,19 @@\n margin-bottom: 14rpx;\n font-size: 24rpx;\n font-weight: 500;\n- color: #242424;\n+ color: var(--text-primary);\n }\n \n /* text-sm=14px→24rpx */\n .required {\n- color: #e34d59;\n+ color: var(--color-error);\n font-size: 24rpx;\n }\n \n /* text-xs=12px→22rpx */\n .optional-tag {\n font-size: 20rpx;\n- color: #a6a6a6;\n+ color: var(--text-tertiary);\n font-weight: 400;\n margin-left: 10rpx;\n }\n@@ -200,17 +200,17 @@\n width: 100%;\n height: 80rpx;\n padding: 0 28rpx;\n- background: #f8f8f8;\n+ background: var(--bg-tertiary);\n border-radius: 22rpx;\n- border: 2rpx solid #f3f3f3;\n+ border: 2rpx solid var(--bg-tertiary);\n font-size: 24rpx;\n font-weight: 300;\n- color: #242424;\n+ color: var(--text-primary);\n box-sizing: border-box;\n }\n \n .form-input::placeholder {\n- color: #c5c5c5;\n+ color: var(--text-disabled);\n font-weight: 300;\n }\n \n@@ -219,7 +219,7 @@\n display: block;\n text-align: center;\n font-size: 20rpx;\n- color: #a6a6a6;\n+ color: var(--text-tertiary);\n margin-bottom: 18rpx;\n font-weight: 300;\n }\n@@ -232,8 +232,8 @@\n bottom: 0;\n padding: 28rpx;\n padding-bottom: calc(56rpx + env(safe-area-inset-bottom));\n- background: rgba(255, 255, 255, 0.95);\n- border-top: 2rpx solid #f3f3f3;\n+ background: var(--color-white-overlay-light);\n+ border-top: 2rpx solid var(--bg-tertiary);\n z-index: 10;\n }\n \n@@ -244,9 +244,9 @@\n display: flex;\n align-items: center;\n justify-content: center;\n- background: linear-gradient(135deg, #0052d9, #3b82f6);\n+ background: linear-gradient(135deg, var(--color-primary), var(--primary-500));\n border-radius: 22rpx;\n- box-shadow: 0 10rpx 28rpx rgba(0, 82, 217, 0.3);\n+ box-shadow: 0 10rpx 28rpx var(--color-primary-shadow);\n }\n \n .submit-btn--disabled {\n@@ -257,7 +257,7 @@\n .submit-btn-text {\n font-size: 28rpx;\n font-weight: 500;\n- color: #ffffff;\n+ color: var(--color-white);\n }\n \n /* text-xs=12px→22rpx, mt-3=12px→22rpx */\n@@ -265,7 +265,7 @@\n display: block;\n text-align: center;\n font-size: 20rpx;\n- color: #c5c5c5;\n+ color: var(--text-disabled);\n margin-top: 22rpx;\n font-weight: 300;\n }\n--- /dev/null\n+++ b/apps/miniprogram/miniprogram/pages/board-coach/board-coach.json\n@@ -0,0 +1 @@\n{\n \"navigationBarTitleText\": \"助教看板\",\n \"navigationBarBackgroundColor\": \"#ffffff\",\n \"navigationBarTextStyle\": \"black\",\n \"enablePullDownRefresh\": true,\n \"usingComponents\": {\n \"filter-dropdown\": \"/components/filter-dropdown/filter-dropdown\",\n \"ai-float-button\": \"/components/ai-float-button/ai-float-button\",\n \"board-tab-bar\": \"/custom-tab-bar/index\",\n \"t-loading\": \"tdesign-miniprogram/loading/loading\",\n \"t-icon\": \"tdesign-miniprogram/icon/icon\",\n \"t-empty\": \"tdesign-miniprogram/empty/empty\",\n \"t-tag\": \"tdesign-miniprogram/tag/tag\",\n \"dev-fab\": \"/components/dev-fab/dev-fab\"\n }\n}\n\ndiff --git a/apps/miniprogram/miniprogram/pages/board-coach/board-coach.ts b/apps/miniprogram/miniprogram/pages/board-coach/board-coach.ts\nindex d5f49b5..6397896 100644\n--- a/apps/miniprogram/miniprogram/pages/board-coach/board-coach.ts\n+++ b/apps/miniprogram/miniprogram/pages/board-coach/board-coach.ts\n@@ -1,5 +1,7 @@\n // 助教看板页 — 排序×技能×时间三重筛选,4 种维度卡片\n // TODO: 联调时替换 mock 数据为真实 API 调用\n+import { initPageAiColor } from '../../utils/ai-color-manager'\n+\n export {}\n \n /** 排序维度 → 卡片模板映射 */\n--- /dev/null\n+++ b/apps/miniprogram/miniprogram/pages/board-customer/board-customer.json\n@@ -0,0 +1 @@\n{\n \"navigationBarTitleText\": \"客户看板\",\n \"navigationBarBackgroundColor\": \"#ffffff\",\n \"navigationBarTextStyle\": \"black\",\n \"enablePullDownRefresh\": true,\n \"usingComponents\": {\n \"filter-dropdown\": \"/components/filter-dropdown/filter-dropdown\",\n \"heart-icon\": \"/components/heart-icon/heart-icon\",\n \"ai-float-button\": \"/components/ai-float-button/ai-float-button\",\n \"board-tab-bar\": \"/custom-tab-bar/index\",\n \"dev-fab\": \"/components/dev-fab/dev-fab\",\n \"t-loading\": \"tdesign-miniprogram/loading/loading\",\n \"t-icon\": \"tdesign-miniprogram/icon/icon\",\n \"t-empty\": \"tdesign-miniprogram/empty/empty\",\n \"t-tag\": \"tdesign-miniprogram/tag/tag\"\n }\n}\n\ndiff --git a/apps/miniprogram/miniprogram/pages/board-customer/board-customer.ts b/apps/miniprogram/miniprogram/pages/board-customer/board-customer.ts\nindex 96dbe6b..810480a 100644\n--- a/apps/miniprogram/miniprogram/pages/board-customer/board-customer.ts\n+++ b/apps/miniprogram/miniprogram/pages/board-customer/board-customer.ts\n@@ -1,5 +1,7 @@\n // 客户看板页 — 8 个维度查看前 100 名客户\n // TODO: 联调时替换 mock 数据为真实 API 调用\n+import { initPageAiColor } from '../../utils/ai-color-manager'\n+\n export {}\n \n /** 维度类型 → 卡片模板映射 */\n--- /dev/null\n+++ b/apps/miniprogram/miniprogram/pages/board-finance/board-finance.json\n@@ -0,0 +1 @@\n{\n \"navigationBarTitleText\": \"看板\",\n \"navigationBarBackgroundColor\": \"#ffffff\",\n \"navigationBarTextStyle\": \"black\",\n \"enablePullDownRefresh\": true,\n \"usingComponents\": {\n \"metric-card\": \"/components/metric-card/metric-card\",\n \"filter-dropdown\": \"/components/filter-dropdown/filter-dropdown\",\n \"ai-float-button\": \"/components/ai-float-button/ai-float-button\",\n \"t-loading\": \"tdesign-miniprogram/loading/loading\",\n \"t-icon\": \"tdesign-miniprogram/icon/icon\",\n \"t-empty\": \"tdesign-miniprogram/empty/empty\"\n }\n}\n\n--- /dev/null\n+++ b/apps/miniprogram/miniprogram/pages/chat-history/chat-history.json\n@@ -0,0 +1 @@\n{\n \"navigationBarTitleText\": \"对话历史\",\n \"navigationBarBackgroundColor\": \"#ffffff\",\n \"navigationBarTextStyle\": \"black\",\n \"enablePullDownRefresh\": true,\n \"usingComponents\": {\n \"ai-float-button\": \"/components/ai-float-button/ai-float-button\",\n \"t-loading\": \"tdesign-miniprogram/loading/loading\",\n \"t-icon\": \"tdesign-miniprogram/icon/icon\",\n \"t-empty\": \"tdesign-miniprogram/empty/empty\",\n \"dev-fab\": \"/components/dev-fab/dev-fab\"\n }\n}\n\n--- /dev/null\n+++ b/apps/miniprogram/miniprogram/pages/chat/chat.json\n@@ -0,0 +1 @@\n{\n \"navigationBarTitleText\": \"AI 助手\",\n \"navigationBarBackgroundColor\": \"#ffffff\",\n \"navigationBarTextStyle\": \"black\",\n \"usingComponents\": {\n \"t-loading\": \"tdesign-miniprogram/loading/loading\",\n \"t-icon\": \"tdesign-miniprogram/icon/icon\",\n \"dev-fab\": \"/components/dev-fab/dev-fab\"\n }\n}\n\n--- /dev/null\n+++ b/apps/miniprogram/miniprogram/pages/chat/chat.wxml\n@@ -0,0 +1 @@\n<!-- pages/chat/chat.wxml — AI 对话页 -->\n\n<!-- 加载态 -->\n<view class=\"loading-container\" wx:if=\"{{pageState === 'loading'}}\">\n <t-loading theme=\"circular\" size=\"48rpx\" text=\"加载中...\" />\n</view>\n\n<!-- 错误态 -->\n<view class=\"page-error\" wx:elif=\"{{pageState === 'error'}}\">\n <view class=\"error-content\">\n <text class=\"error-icon\">😵</text>\n <text class=\"error-text\">加载失败,请重试</text>\n <view class=\"retry-btn\" hover-class=\"retry-btn--hover\" bindtap=\"onRetry\">\n <text class=\"retry-btn-text\">重新加载</text>\n </view>\n </view>\n</view>\n\n<!-- 正常态 -->\n<view class=\"chat-page\" wx:elif=\"{{pageState === 'normal' || pageState === 'empty'}}\">\n <!-- 消息列表 -->\n <scroll-view\n class=\"message-list\"\n scroll-y\n scroll-into-view=\"{{scrollToId}}\"\n scroll-with-animation\n enhanced\n show-scrollbar=\"{{false}}\"\n >\n <!-- 引用卡片(从其他页面跳转时显示) -->\n <view class=\"reference-card\" wx:if=\"{{referenceCard}}\">\n <view class=\"reference-header\">\n <t-icon name=\"file-copy\" size=\"32rpx\" color=\"var(--color-gray-7)\" />\n <text class=\"reference-source\">来源:{{referenceCard.title}}</text>\n </view>\n <text class=\"reference-summary\">{{referenceCard.summary}}</text>\n </view>\n\n <!-- 空对话提示 -->\n <view class=\"empty-hint\" wx:if=\"{{pageState === 'empty' && messages.length === 0}}\">\n <view class=\"empty-icon\">🤖</view>\n <text class=\"empty-text\">你好,我是 AI 助手</text>\n <text class=\"empty-sub\">有什么可以帮你的?</text>\n </view>\n\n <!-- 消息气泡列表 -->\n <block wx:for=\"{{messages}}\" wx:key=\"id\">\n <!-- 用户消息:右对齐蓝色 -->\n <view\n class=\"message-row message-user\"\n wx:if=\"{{item.role === 'user'}}\"\n id=\"msg-{{item.id}}\"\n >\n <view class=\"bubble bubble-user\">\n <text class=\"bubble-text\">{{item.content}}</text>\n </view>\n </view>\n\n <!-- AI 消息:左对齐白色 -->\n <view\n class=\"message-row message-assistant\"\n wx:else\n id=\"msg-{{item.id}}\"\n >\n <view class=\"ai-avatar\">\n <text class=\"ai-avatar-emoji\">🤖</text>\n </view>\n <view class=\"bubble-wrapper\">\n <view class=\"bubble bubble-assistant\">\n <text class=\"bubble-text\">{{item.content}}</text>\n </view>\n <!-- 引用卡片(AI 消息内联) -->\n <view class=\"inline-ref-card\" wx:if=\"{{item.referenceCard}}\">\n <view class=\"inline-ref-header\">\n <text class=\"inline-ref-type\">{{item.referenceCard.type === 'customer' ? '👤 客户' : '📋 记录'}}</text>\n <text class=\"inline-ref-title\">{{item.referenceCard.title}}</text>\n </view>\n <text class=\"inline-ref-summary\">{{item.referenceCard.summary}}</text>\n <view class=\"inline-ref-data\">\n <view\n class=\"ref-data-item\"\n wx:for=\"{{item.referenceCard.dataList}}\"\n wx:for-item=\"entry\"\n wx:key=\"key\"\n >\n <text class=\"ref-data-key\">{{entry.key}}</text>\n <text class=\"ref-data-value\">{{entry.value}}</text>\n </view>\n </view>\n </view>\n </view>\n </view>\n </block>\n\n <!-- AI 正在输入指示器 -->\n <view class=\"message-row message-assistant\" wx:if=\"{{isStreaming && !streamingContent}}\" id=\"msg-typing\">\n <view class=\"ai-avatar\">\n <text class=\"ai-avatar-emoji\">🤖</text>\n </view>\n <view class=\"bubble bubble-assistant typing-bubble\">\n <view class=\"typing-dots\">\n <view class=\"dot dot-1\"></view>\n <view class=\"dot dot-2\"></view>\n <view class=\"dot dot-3\"></view>\n </view>\n </view>\n </view>\n\n <!-- 底部占位,确保最后一条消息不被输入框遮挡 -->\n <view class=\"scroll-bottom-spacer\" id=\"scroll-bottom\"></view>\n </scroll-view>\n\n <!-- 底部输入区域 -->\n <view class=\"input-bar safe-area-bottom\">\n <view class=\"input-wrapper\">\n <input\n class=\"chat-input\"\n value=\"{{inputText}}\"\n placeholder=\"输入消息...\"\n placeholder-class=\"input-placeholder\"\n confirm-type=\"send\"\n bindinput=\"onInputChange\"\n bindconfirm=\"onSendMessage\"\n disabled=\"{{isStreaming}}\"\n />\n </view>\n <view\n class=\"send-btn {{inputText.length > 0 && !isStreaming ? 'send-btn-active' : 'send-btn-disabled'}}\"\n hover-class=\"send-btn--hover\"\n bindtap=\"onSendMessage\"\n >\n <t-icon name=\"send\" size=\"40rpx\" color=\"{{inputText.length > 0 && !isStreaming ? '#ffffff' : 'var(--color-gray-6)'}}\" />\n </view>\n </view>\n</view>\n\n<dev-fab />\n\ndiff --git a/apps/miniprogram/miniprogram/pages/coach-detail/coach-detail.json b/apps/miniprogram/miniprogram/pages/coach-detail/coach-detail.json\nindex 58f3ead..93fd6f0 100644\n--- a/apps/miniprogram/miniprogram/pages/coach-detail/coach-detail.json\n+++ b/apps/miniprogram/miniprogram/pages/coach-detail/coach-detail.json\n@@ -5,8 +5,7 @@\n \"usingComponents\": {\n \"note-modal\": \"/components/note-modal/note-modal\",\n \"ai-float-button\": \"/components/ai-float-button/ai-float-button\",\n- \"heart-icon\": \"/components/heart-icon/heart-icon\",\n- \"star-rating\": \"/components/star-rating/star-rating\",\n+ \"dev-fab\": \"/components/dev-fab/dev-fab\",\n \"t-loading\": \"tdesign-miniprogram/loading/loading\",\n \"t-icon\": \"tdesign-miniprogram/icon/icon\",\n \"t-tag\": \"tdesign-miniprogram/tag/tag\"\ndiff --git a/apps/miniprogram/miniprogram/pages/coach-detail/coach-detail.ts b/apps/miniprogram/miniprogram/pages/coach-detail/coach-detail.ts\nindex 5e1b6f2..03a6703 100644\n--- a/apps/miniprogram/miniprogram/pages/coach-detail/coach-detail.ts\n+++ b/apps/miniprogram/miniprogram/pages/coach-detail/coach-detail.ts\n@@ -93,9 +93,9 @@ interface HistoryMonth {\n const mockCoachDetail: CoachDetail = {\n id: 'coach-001',\n name: '小燕',\n- avatar: '/assets/images/avatar-default.png',\n+ avatar: '/assets/images/avatar-coach.png',\n level: '星级',\n- skills: ['中🎱', '🎯 斯诺克'],\n+ skills: ['中🎱', '🎯斯诺克'],\n workYears: 3,\n customerCount: 68,\n hireDate: '2023-03-15',\n@@ -122,9 +122,9 @@ const mockCoachDetail: CoachDetail = {\n ],\n },\n notes: [\n- { id: 'n1', content: '本月表现优秀,客户好评率高', timestamp: '2026-03-05 14:30', score: 9, customerName: '管理员', tagLabel: '管理员', createdAt: '2026-03-05 14:30' },\n- { id: 'n2', content: '需要加强斯诺克教学技巧', timestamp: '2026-02-28 10:00', score: 7, customerName: '管理员', tagLabel: '管理员', createdAt: '2026-02-28 10:00' },\n- { id: 'n3', content: '客户王先生反馈服务态度很好', timestamp: '2026-02-20 16:45', score: 8, customerName: '王先生', tagLabel: '王先生', createdAt: '2026-02-20 16:45' },\n+ { id: 'n1', content: '本月表现优秀,客户好评率高', timestamp: '2026-03-05T14:30:00', score: 9, customerName: '管理员', tagLabel: '管理员', createdAt: '2026-03-05 14:30' },\n+ { id: 'n2', content: '需要加强斯诺克教学技巧', timestamp: '2026-02-28T10:00:00', score: 7, customerName: '管理员', tagLabel: '管理员', createdAt: '2026-02-28 10:00' },\n+ { id: 'n3', content: '客户王先生反馈服务态度很好', timestamp: '2026-02-20T16:45:00', score: 8, customerName: '王先生', tagLabel: '王先生', createdAt: '2026-02-20 16:45' },\n ],\n }\n \n@@ -377,11 +377,6 @@ Page({\n this.loadData(id)\n },\n \n- /** 返回 */\n- onBack() {\n- wx.navigateBack()\n- },\n-\n /** 问问助手 */\n onStartChat() {\n const id = this.data.coachId || this.data.detail?.id || ''\ndiff --git a/apps/miniprogram/miniprogram/pages/coach-detail/coach-detail.wxml b/apps/miniprogram/miniprogram/pages/coach-detail/coach-detail.wxml\nindex 4c3c5c8..233f10d 100644\n--- a/apps/miniprogram/miniprogram/pages/coach-detail/coach-detail.wxml\n+++ b/apps/miniprogram/miniprogram/pages/coach-detail/coach-detail.wxml\n@@ -18,6 +18,40 @@\n \n <!-- 正常态 -->\n <block wx:elif=\"{{pageState === 'normal'}}\">\n+ <!-- Banner 区域 — SVG 做渐变底图 -->\n+ <view class=\"banner-section\">\n+ <image class=\"banner-bg-img\" src=\"/assets/images/banner-bg-coral-aurora.svg\" mode=\"widthFix\" />\n+ <view class=\"banner-overlay\">\n+ <!-- 助教头部信息 -->\n+ <view class=\"coach-header\">\n+ <view class=\"avatar-box\">\n+ <image class=\"avatar-img\" src=\"/assets/images/avatar-coach.png\" mode=\"aspectFill\" />\n+ </view>\n+ <view class=\"info-middle\">\n+ <view class=\"name-row\">\n+ <text class=\"coach-name\">{{detail.name}}</text>\n+ <text class=\"skill-tag\">{{detail.level}}</text>\n+ </view>\n+ <view class=\"skill-row\">\n+ <text class=\"skill-tag\" wx:for=\"{{detail.skills}}\" wx:key=\"index\">{{item}}</text>\n+ </view>\n+ </view>\n+ <view class=\"info-right-stats\">\n+ <view class=\"right-stat\">\n+ <text class=\"right-stat-label\">工龄</text>\n+ <text class=\"right-stat-value\">{{detail.workYears}}</text>\n+ <text class=\"right-stat-label\">年</text>\n+ </view>\n+ <view class=\"right-stat\">\n+ <text class=\"right-stat-label\">客户</text>\n+ <text class=\"right-stat-value\">{{detail.customerCount}}</text>\n+ <text class=\"right-stat-label\">人</text>\n+ </view>\n+ </view>\n+ </view>\n+ </view>\n+ </view>\n+\n <!-- 主体内容 -->\n <view class=\"main-content\">\n <!-- 绩效概览 -->\n@@ -33,7 +67,6 @@\n <text class=\"perf-sub\">{{item.sub}}</text>\n </view>\n </view>\n- <!-- 绩效档位进度条 -->\n <view class=\"perf-progress-box\">\n <view class=\"perf-progress-header\">\n <text class=\"perf-progress-label\">绩效档位进度</text>\n@@ -54,13 +87,11 @@\n <view class=\"card-header\">\n <text class=\"section-title title-green\">收入明细</text>\n <view class=\"income-tabs\">\n- <view class=\"income-tab {{incomeTab === 'this' ? 'active' : ''}}\"\n- data-tab=\"this\" bindtap=\"onIncomeTabTap\" hover-class=\"income-tab--hover\">\n+ <view class=\"income-tab {{incomeTab === 'this' ? 'active' : ''}}\" data-tab=\"this\" bindtap=\"onIncomeTabTap\" hover-class=\"income-tab--hover\">\n <text>本月</text>\n <text class=\"income-tab-est\" wx:if=\"{{incomeTab === 'this'}}\">预估</text>\n </view>\n- <view class=\"income-tab {{incomeTab === 'last' ? 'active' : ''}}\"\n- data-tab=\"last\" bindtap=\"onIncomeTabTap\" hover-class=\"income-tab--hover\">\n+ <view class=\"income-tab {{incomeTab === 'last' ? 'active' : ''}}\" data-tab=\"last\" bindtap=\"onIncomeTabTap\" hover-class=\"income-tab--hover\">\n <text>上月</text>\n </view>\n </view>\n@@ -88,42 +119,34 @@\n <text class=\"task-summary-callback\">回访<text class=\"task-summary-num\">{{taskStats.callback}}</text>个</text>\n </view>\n </view>\n- <!-- 可见任务列表 -->\n <view class=\"task-list\">\n- <view class=\"task-item task-item-{{item.typeClass}}\"\n- wx:for=\"{{visibleTasks}}\" wx:key=\"index\">\n+ <view class=\"task-item task-item-{{item.typeClass}}\" wx:for=\"{{visibleTasks}}\" wx:key=\"index\">\n <text class=\"task-tag-text {{item.typeClass}}\">{{item.typeLabel}}</text>\n <text class=\"task-customer-name\">{{item.customerName}}</text>\n- <view class=\"task-note-btn\" wx:if=\"{{item.noteCount > 0}}\"\n- catchtap=\"onTaskNoteTap\" data-index=\"{{index}}\" hover-class=\"task-note-btn--hover\">\n+ <view class=\"task-note-btn\" wx:if=\"{{item.noteCount > 0}}\" catchtap=\"onTaskNoteTap\" data-index=\"{{index}}\" hover-class=\"task-note-btn--hover\">\n <t-icon name=\"chat\" size=\"32rpx\" color=\"#777777\" />\n <text class=\"task-note-count\">{{item.noteCount}}</text>\n </view>\n <text class=\"task-pin\" wx:if=\"{{item.pinned}}\">📌</text>\n </view>\n </view>\n- <!-- 隐藏的更多任务 -->\n <block wx:if=\"{{tasksExpanded}}\">\n <view class=\"task-list task-list-extra\">\n- <view class=\"task-item task-item-{{item.typeClass}}\"\n- wx:for=\"{{hiddenTasks}}\" wx:key=\"index\">\n+ <view class=\"task-item task-item-{{item.typeClass}}\" wx:for=\"{{hiddenTasks}}\" wx:key=\"index\">\n <text class=\"task-tag-text {{item.typeClass}}\">{{item.typeLabel}}</text>\n <text class=\"task-customer-name\">{{item.customerName}}</text>\n- <view class=\"task-note-btn\" wx:if=\"{{item.noteCount > 0}}\"\n- catchtap=\"onTaskNoteTap\" data-hidden-index=\"{{index}}\" hover-class=\"task-note-btn--hover\">\n+ <view class=\"task-note-btn\" wx:if=\"{{item.noteCount > 0}}\" catchtap=\"onTaskNoteTap\" data-hidden-index=\"{{index}}\" hover-class=\"task-note-btn--hover\">\n <t-icon name=\"chat\" size=\"32rpx\" color=\"#777777\" />\n <text class=\"task-note-count\">{{item.noteCount}}</text>\n </view>\n </view>\n- <!-- 已放弃任务 -->\n <view class=\"task-item task-item-abandoned\" wx:for=\"{{abandonedTasks}}\" wx:key=\"index\">\n <text class=\"task-abandoned-name\">{{item.customerName}}</text>\n <text class=\"task-abandoned-reason\">{{item.reason}}</text>\n </view>\n </view>\n </block>\n- <view class=\"task-toggle\" bindtap=\"onToggleTasks\" hover-class=\"task-toggle--hover\"\n- wx:if=\"{{hiddenTasks.length > 0 || abandonedTasks.length > 0}}\">\n+ <view class=\"task-toggle\" bindtap=\"onToggleTasks\" hover-class=\"task-toggle--hover\" wx:if=\"{{hiddenTasks.length > 0 || abandonedTasks.length > 0}}\">\n <text>{{tasksExpanded ? '收起 ↑' : '展开全部 ↓'}}</text>\n </view>\n </view>\n@@ -135,9 +158,7 @@\n <text class=\"header-hint\">近60天</text>\n </view>\n <view class=\"top5-list\">\n- <view class=\"top5-card {{index < 2 ? (index === 0 ? 'top5-card-pink' : 'top5-card-amber') : 'top5-card-gray'}}\"\n- wx:for=\"{{topCustomers}}\" wx:key=\"id\"\n- data-id=\"{{item.id}}\" bindtap=\"onCustomerTap\" hover-class=\"top5-card--hover\">\n+ <view class=\"top5-card {{index < 2 ? (index === 0 ? 'top5-card-pink' : 'top5-card-amber') : 'top5-card-gray'}}\" wx:for=\"{{topCustomers}}\" wx:key=\"id\" data-id=\"{{item.id}}\" bindtap=\"onCustomerTap\" hover-class=\"top5-card--hover\">\n <view class=\"top5-avatar {{item.avatarGradient}}\">\n <text class=\"top5-avatar-text\">{{item.initial}}</text>\n </view>\n@@ -198,8 +219,7 @@\n <text class=\"history-th\">业绩时长</text>\n <text class=\"history-th\">工资</text>\n </view>\n- <view class=\"history-row {{index === 0 ? 'history-row-current' : ''}}\"\n- wx:for=\"{{historyMonths}}\" wx:key=\"month\">\n+ <view class=\"history-row {{index === 0 ? 'history-row-current' : ''}}\" wx:for=\"{{historyMonths}}\" wx:key=\"month\">\n <view class=\"history-td history-td-left\">\n <text>{{item.month}}</text>\n <text class=\"history-est\" wx:if=\"{{item.estimated}}\">预估</text>\n@@ -246,12 +266,7 @@\n </view>\n \n <!-- 备注弹窗 -->\n- <note-modal\n- visible=\"{{noteModalVisible}}\"\n- customerName=\"{{detail.name}}\"\n- bind:confirm=\"onNoteConfirm\"\n- bind:cancel=\"onNoteCancel\"\n- />\n+ <note-modal visible=\"{{noteModalVisible}}\" customerName=\"{{detail.name}}\" showExpandBtn=\"{{false}}\" showRating=\"{{false}}\" bind:confirm=\"onNoteConfirm\" bind:cancel=\"onNoteCancel\" />\n \n <!-- 备注列表弹窗 -->\n <view class=\"notes-popup-overlay\" wx:if=\"{{notesPopupVisible}}\" catchtap=\"onHideNotesPopup\">\n@@ -273,9 +288,6 @@\n </view>\n </view>\n </view>\n-\n- <!-- AI 悬浮按钮 -->\n- <ai-float-button wx:if=\"{{false}}\" bottom=\"{{200}}\" customerId=\"{{detail.id}}\" />\n </block>\n \n-<dev-fab wx:if=\"{{false}}\" />\n+<dev-fab />\n\n[TRUNCATED: diff exceeds 30KB]",
|
||
"latest_prompt_log": "- [P20260317-070104] 2026-03-17 07:01:04 +0800\n - summary: apps\\miniprogram\\miniprogram\\pages 下的no-permission;reviewing;2个文件夹,还原到最后的Git提交的版本。\n - prompt:\n```text\napps\\miniprogram\\miniprogram\\pages 下的no-permission;reviewing;2个文件夹,还原到最后的Git提交的版本。\n```\n"
|
||
} |