fix: align governance pages with growth workflow copy
All checks were successful
CD Pipeline / deploy (push) Successful in 1m2s
All checks were successful
CD Pipeline / deploy (push) Successful in 1m2s
This commit is contained in:
@@ -402,7 +402,7 @@ YOUTUBE_API_KEY = os.getenv('YOUTUBE_API_KEY', '')
|
||||
# ==========================================
|
||||
# 系統版本與路徑
|
||||
# ==========================================
|
||||
SYSTEM_VERSION = "V10.667"
|
||||
SYSTEM_VERSION = "V10.668"
|
||||
LOG_FILE_PATH = os.path.join(BASE_DIR, 'logs/system.log')
|
||||
public_url = PUBLIC_URL # 用於模板顯示
|
||||
|
||||
|
||||
@@ -744,3 +744,4 @@ POSTGRES_HOST=momo-db
|
||||
| 2026-06-25 | 說明、空狀態與登入頁不可停在教學口吻,必須提示下一個業績動作 | V10.665 起 AI 助手說明、業績空狀態、缺貨舊首頁、登入頁與 PPT 視覺 QA 空狀態改為行動導向短句,避免使用者在說明文字中迷路。 |
|
||||
| 2026-06-25 | PPT 視覺 QA 頁首不可依 runtime 條件退回描述型長句 | V10.666 起 PPT 視覺 QA 主頁首固定顯示「先確認簡報可預覽、可審核,再把問題交給修復流程」,避免 runtime 已就緒時失去行動導向。 |
|
||||
| 2026-06-25 | 邊角工具頁不可只描述功能,必須說明如何支援 PChome 業績判斷 | V10.667 起 AI 生成歷史、PChome 爬蟲、趨勢資料、用戶管理、外部工具狀態與市場情報停用頁都改為短句,聚焦資料新鮮度、文案回收、權限治理與正式比價流程。 |
|
||||
| 2026-06-25 | 低頻治理頁與舊入口不可出現英文工程狀態或教學句 | V10.668 起 legacy bridge、維護/權限、匯入、設定、通知模板、缺貨管理、登入歷史、系統日誌與 AI 健康檢查頁統一改為繁中短句,聚焦資料可靠、權限守門、供貨風險與部署治理如何支援業績流程。 |
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
{% set active_page = 'settings' %}
|
||||
{% set legacy_bridge_title = '權限不足' %}
|
||||
{% set legacy_bridge_kicker = 'ACCESS CONTROL' %}
|
||||
{% set legacy_bridge_kicker = '權限守門' %}
|
||||
{% set legacy_bridge_icon = 'fas fa-ban' %}
|
||||
{% set legacy_bridge_heading = '權限不足' %}
|
||||
{% set legacy_bridge_body = '這個頁面需要更高權限才能存取。若這是你的工作範圍,請改用具備授權的帳號重新登入。' %}
|
||||
{% set legacy_bridge_body = '此入口需要更高權限;請使用已授權帳號,避免未授權操作影響營運資料。' %}
|
||||
{% set legacy_bridge_target = '/' %}
|
||||
{% set legacy_bridge_cta = '回到商品看板' %}
|
||||
{% set legacy_bridge_secondary_target = '/settings' %}
|
||||
{% set legacy_bridge_secondary_cta = '系統管理' %}
|
||||
{% set legacy_bridge_meta = '403 / Forbidden' %}
|
||||
{% set legacy_bridge_meta = '權限控管' %}
|
||||
{% extends "ewoooc_base.html" %}
|
||||
|
||||
{% block title %}權限不足 - EwoooC{% endblock %}
|
||||
|
||||
@@ -127,9 +127,9 @@
|
||||
<div class="smoke-hero mb-4">
|
||||
<div class="d-flex flex-column flex-lg-row justify-content-between gap-3 position-relative" style="z-index: 1;">
|
||||
<div>
|
||||
<span class="smoke-pill mb-3"><i class="fas fa-robot"></i>四 Agent 控制面</span>
|
||||
<span class="smoke-pill mb-3"><i class="fas fa-robot"></i>AI 閉環守門</span>
|
||||
<h1 class="fw-bold mb-2">AI 自動化健康檢查</h1>
|
||||
<p class="mb-0 text-muted">快速確認 EventRouter、AutoHeal、NemoTron、OpenClaw 與 ElephantAlpha 的閉環狀態。</p>
|
||||
<p class="mb-0 text-muted">確認 AI 建議、修復與通知是否能支援業績流程。</p>
|
||||
</div>
|
||||
<div class="text-lg-end">
|
||||
<div id="overallStatus" class="h4 fw-bold mb-2">讀取中...</div>
|
||||
@@ -162,7 +162,7 @@
|
||||
<div class="d-flex flex-column flex-md-row justify-content-between gap-2 mb-3">
|
||||
<div>
|
||||
<h5 class="mb-1">最近健康檢查趨勢</h5>
|
||||
<div class="text-muted small">每次 API 快檢會保存一筆精簡紀錄,保留最近 200 筆。</div>
|
||||
<div class="text-muted small">保留最近檢查結果,判斷 AI 閉環是否連續穩定。</div>
|
||||
</div>
|
||||
<div class="text-muted small" id="historySummary">等待資料...</div>
|
||||
</div>
|
||||
@@ -175,7 +175,7 @@
|
||||
<div class="d-flex flex-column flex-md-row justify-content-between gap-2 mb-3">
|
||||
<div>
|
||||
<h5 class="mb-1">每日摘要</h5>
|
||||
<div class="text-muted small">依最近保存紀錄彙整,方便快速觀察是否有連續注意或嚴重狀態。</div>
|
||||
<div class="text-muted small">用每日彙整快速找出連續風險。</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="table-responsive">
|
||||
@@ -301,7 +301,7 @@ async function loadSmoke() {
|
||||
|
||||
document.getElementById('refreshBtn').addEventListener('click', loadSmoke);
|
||||
document.getElementById('clearHistoryBtn').addEventListener('click', async () => {
|
||||
if (!confirm('確定要清理 AI 健康檢查趨勢紀錄?這只會刪除本頁健康檢查紀錄檔,不會影響 DB 或事件資料。')) {
|
||||
if (!confirm('確定要清理 AI 健康檢查趨勢紀錄?這只會刪除本頁趨勢,不影響正式事件資料。')) {
|
||||
return;
|
||||
}
|
||||
const btn = document.getElementById('clearHistoryBtn');
|
||||
|
||||
@@ -206,7 +206,7 @@
|
||||
<header class="card-header ar-card__head ar-card__head--warn-soft d-flex justify-content-between align-items-center py-2">
|
||||
<div>
|
||||
<h6 class="mb-0"><i class="fas fa-lightbulb me-2"></i>商品洞察分析</h6>
|
||||
<small class="text-muted">結合網路搜尋的即時市場分析</small>
|
||||
<small class="text-muted">把外部訊號轉成可追蹤的銷售動作</small>
|
||||
</div>
|
||||
<button class="btn btn-sm btn-warning" onclick="doProductInsights()" id="insightsBtn">
|
||||
<i class="fas fa-search-dollar me-1"></i>分析商品
|
||||
@@ -214,8 +214,8 @@
|
||||
</header>
|
||||
<div id="productInsightsResult" class="card-body py-3" style="display: none;"></div>
|
||||
<div id="productInsightsPlaceholder" class="card-body py-3 text-center text-muted">
|
||||
<i class="fas fa-info-circle me-1"></i>輸入商品名稱後點擊「分析商品」<br>
|
||||
<small>AI 會先搜尋最新網路資訊,再進行深度分析</small>
|
||||
<i class="fas fa-info-circle me-1"></i>輸入商品後,判斷是否值得主推、調價或補比價。<br>
|
||||
<small>先整理外部訊號,再回到 PChome 銷售動作。</small>
|
||||
</div>
|
||||
</article>
|
||||
</div>
|
||||
|
||||
@@ -84,10 +84,10 @@
|
||||
<div>
|
||||
<p class="ai-notice__title">每日業績快照</p>
|
||||
<p class="ai-notice__body" style="margin-bottom: var(--momo-space-1);">
|
||||
匯入格式:<code>即時業績_當日_YYYYMMDD.xlsx</code>(例:即時業績_當日_20260113.xlsx)
|
||||
上傳當日業績檔,更新日報、成長分析與今日作戰清單。
|
||||
</p>
|
||||
<p class="ai-notice__body">
|
||||
<small>資料將會<strong>累加寫入</strong>至 <code>daily_sales_snapshot</code> 資料表,並自動去重。</small>
|
||||
<small>檔名建議:<code>即時業績_當日_YYYYMMDD.xlsx</code>;系統會去重後寫入業績快照。</small>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -98,14 +98,15 @@
|
||||
{% block content %}
|
||||
<div class="brand-assets-page">
|
||||
<div class="container">
|
||||
<h1>WOOO TECH 品牌資產庫</h1>
|
||||
<h1>EwoooC 品牌資產庫</h1>
|
||||
<p class="mb-4 text-muted">維持對外報表與通知素材一致,避免品牌資產混用。</p>
|
||||
|
||||
<div class="section">
|
||||
<h2 class="section-title">1. 主品牌標誌 (Main Logo)</h2>
|
||||
<h2 class="section-title">1. 主品牌標誌</h2>
|
||||
<div class="asset-grid">
|
||||
<div class="asset-item">
|
||||
<div class="preview-box">
|
||||
<img src="/static/images/logo_navbar.svg" alt="Main Logo">
|
||||
<img src="/static/images/logo_navbar.svg" alt="主品牌標誌">
|
||||
</div>
|
||||
<div>
|
||||
<strong>SVG (向量)</strong><br>
|
||||
@@ -116,7 +117,7 @@
|
||||
</div>
|
||||
<div class="asset-item">
|
||||
<div class="preview-box">
|
||||
<img src="/static/images/logo.png" alt="Main Logo PNG">
|
||||
<img src="/static/images/logo.png" alt="主品牌 PNG 標誌">
|
||||
</div>
|
||||
<div>
|
||||
<strong>PNG</strong><br>
|
||||
@@ -139,11 +140,11 @@
|
||||
</div>
|
||||
|
||||
<div class="section">
|
||||
<h2 class="section-title">2. 玻璃質感版 (Glass Version)</h2>
|
||||
<h2 class="section-title">2. 玻璃質感版</h2>
|
||||
<div class="asset-grid">
|
||||
<div class="asset-item">
|
||||
<div class="preview-box">
|
||||
<img src="/static/images/logo_v4_glass.png" alt="Glass Logo">
|
||||
<img src="/static/images/logo_v4_glass.png" alt="玻璃質感標誌">
|
||||
</div>
|
||||
<div>
|
||||
<strong>PNG</strong><br>
|
||||
@@ -167,11 +168,11 @@
|
||||
</div>
|
||||
|
||||
<div class="section">
|
||||
<h2 class="section-title">3. 能量流動版 (Gradient Version)</h2>
|
||||
<h2 class="section-title">3. 能量流動版</h2>
|
||||
<div class="asset-grid">
|
||||
<div class="asset-item">
|
||||
<div class="preview-box">
|
||||
<img src="/static/images/logo_v4_gradient.png" alt="Gradient Logo">
|
||||
<img src="/static/images/logo_v4_gradient.png" alt="能量流動標誌">
|
||||
</div>
|
||||
<div>
|
||||
<strong>PNG</strong><br>
|
||||
|
||||
@@ -163,7 +163,7 @@
|
||||
|
||||
<!-- 密碼要求提示 -->
|
||||
<div class="password-rule-note">
|
||||
<h6 class="alert-heading"><i class="fas fa-info-circle me-2"></i>密碼要求</h6>
|
||||
<h6 class="alert-heading"><i class="fas fa-info-circle me-2"></i>帳號保護要求</h6>
|
||||
<ul class="mb-0 ps-3">
|
||||
{% for req in password_requirements %}
|
||||
<li>{{ req }}</li>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{% extends "ewoooc_base.html" %}
|
||||
|
||||
{% block title %}AI 程式碼審查 - EwoooC{% endblock %}
|
||||
{% block title %}部署守門與程式碼審查 - EwoooC{% endblock %}
|
||||
|
||||
{% block extra_css %}
|
||||
<style>
|
||||
@@ -276,8 +276,8 @@
|
||||
<!-- Top Bar -->
|
||||
<div class="topbar">
|
||||
<span>🔍</span>
|
||||
<h1>AI 程式碼審查</h1>
|
||||
<span class="badge">EwoooC · 部署後檢查流程</span>
|
||||
<h1>部署守門與程式碼審查</h1>
|
||||
<span class="badge">EwoooC · 業績流程上線前檢查</span>
|
||||
<div id="liveDot" class="live-dot idle" title="流程狀態"></div>
|
||||
</div>
|
||||
|
||||
@@ -288,7 +288,7 @@
|
||||
|
||||
<!-- Pipeline Steps -->
|
||||
<div class="card">
|
||||
<div class="card-header">🤖 流程進度
|
||||
<div class="card-header">審查流程
|
||||
<span id="pipelineId" style="font-size:11px;color:var(--muted);margin-left:auto;font-family:monospace"></span>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
@@ -304,7 +304,7 @@
|
||||
|
||||
<!-- Severity Summary -->
|
||||
<div class="card">
|
||||
<div class="card-header">📊 問題嚴重度分佈</div>
|
||||
<div class="card-header">風險等級分佈</div>
|
||||
<div class="card-body">
|
||||
<div class="sev-grid">
|
||||
<div class="sev-cell sev-critical"><div class="num" id="cnt-critical">—</div><div class="lbl">🔴 最高</div></div>
|
||||
@@ -317,7 +317,7 @@
|
||||
|
||||
<!-- Commit Info -->
|
||||
<div class="card">
|
||||
<div class="card-header">📦 本次部署資訊</div>
|
||||
<div class="card-header">部署證據</div>
|
||||
<div class="card-body" id="commitInfo" style="font-size:13px;color:var(--muted);line-height:1.8;">
|
||||
<span style="color:var(--muted)">等待下次部署觸發...</span>
|
||||
</div>
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
<div class="legacy-bridge__copy">
|
||||
<div class="legacy-bridge__kicker">
|
||||
<i class="{{ legacy_bridge_icon|default('fas fa-arrow-right') }}" aria-hidden="true"></i>
|
||||
<span>{{ legacy_bridge_kicker|default('MIGRATED PAGE') }}</span>
|
||||
<span>{{ legacy_bridge_kicker|default('正式入口') }}</span>
|
||||
</div>
|
||||
<h1>{{ legacy_bridge_heading|default(legacy_bridge_title|default('頁面已升級')) }}</h1>
|
||||
<p>{{ legacy_bridge_body|default('請前往新版工作台完成同一個業績任務。') }}</p>
|
||||
@@ -21,9 +21,9 @@
|
||||
</div>
|
||||
</div>
|
||||
<aside class="legacy-bridge__status" aria-label="頁面狀態">
|
||||
<span class="legacy-bridge__status-label">STATUS</span>
|
||||
<strong>V3 READY</strong>
|
||||
<span>{{ legacy_bridge_meta|default('Growth workflow active') }}</span>
|
||||
<span class="legacy-bridge__status-label">頁面狀態</span>
|
||||
<strong>已整併</strong>
|
||||
<span>{{ legacy_bridge_meta|default('業績流程可用') }}</span>
|
||||
</aside>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{% set active_page = 'settings' %}
|
||||
{% set legacy_bridge_title = '爬蟲管理已整併' %}
|
||||
{% set legacy_bridge_kicker = 'SYSTEM OPERATIONS' %}
|
||||
{% set legacy_bridge_kicker = '系統治理' %}
|
||||
{% set legacy_bridge_icon = 'fas fa-gear' %}
|
||||
{% set legacy_bridge_heading = '爬蟲管理已移到系統管理' %}
|
||||
{% set legacy_bridge_body = '到系統管理確認爬蟲與排程,讓比價與業績判斷保持新鮮。' %}
|
||||
@@ -8,7 +8,7 @@
|
||||
{% set legacy_bridge_cta = '開啟系統管理' %}
|
||||
{% set legacy_bridge_secondary_target = '/logs' %}
|
||||
{% set legacy_bridge_secondary_cta = '查看日誌' %}
|
||||
{% set legacy_bridge_meta = 'Legacy guard / crawler_management.html' %}
|
||||
{% set legacy_bridge_meta = '已整併到系統管理' %}
|
||||
{% extends "ewoooc_base.html" %}
|
||||
|
||||
{% block title %}爬蟲管理已整併 - EwoooC{% endblock %}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{% set active_page = 'dashboard' %}
|
||||
{% set legacy_bridge_title = '商品看板已升級' %}
|
||||
{% set legacy_bridge_kicker = 'MIGRATED DASHBOARD' %}
|
||||
{% set legacy_bridge_kicker = '業績指揮台' %}
|
||||
{% set legacy_bridge_icon = 'fas fa-border-all' %}
|
||||
{% set legacy_bridge_heading = '請使用業績成長指揮台' %}
|
||||
{% set legacy_bridge_body = '先回業績成長指揮台,從業績、價差與下一步決定今天要處理的商品。' %}
|
||||
@@ -8,7 +8,7 @@
|
||||
{% set legacy_bridge_cta = '開啟業績成長指揮台' %}
|
||||
{% set legacy_bridge_secondary_target = '/observability/overview' %}
|
||||
{% set legacy_bridge_secondary_cta = 'AI 觀測台' %}
|
||||
{% set legacy_bridge_meta = 'Legacy guard / dashboard.html' %}
|
||||
{% set legacy_bridge_meta = '已整併到正式首頁' %}
|
||||
{% extends "ewoooc_base.html" %}
|
||||
|
||||
{% block title %}商品看板已升級 - EwoooC{% endblock %}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{% set active_page = 'edm' %}
|
||||
{% set legacy_bridge_title = '活動看板已升級' %}
|
||||
{% set legacy_bridge_kicker = 'MIGRATED CAMPAIGN' %}
|
||||
{% set legacy_bridge_kicker = '活動作戰' %}
|
||||
{% set legacy_bridge_icon = 'fas fa-bullhorn' %}
|
||||
{% set legacy_bridge_heading = '請使用新版活動看板' %}
|
||||
{% set legacy_bridge_body = '用新版活動看板查看價格異動,決定主推、補貨與曝光位置。' %}
|
||||
@@ -8,7 +8,7 @@
|
||||
{% set legacy_bridge_cta = '開啟活動看板' %}
|
||||
{% set legacy_bridge_secondary_target = '/festival' %}
|
||||
{% set legacy_bridge_secondary_cta = '節慶活動' %}
|
||||
{% set legacy_bridge_meta = 'Legacy guard / edm_dashboard.html' %}
|
||||
{% set legacy_bridge_meta = '已整併到活動看板' %}
|
||||
{% extends "ewoooc_base.html" %}
|
||||
|
||||
{% block title %}活動看板已升級 - EwoooC{% endblock %}
|
||||
|
||||
@@ -70,7 +70,7 @@
|
||||
</script>
|
||||
<section class="external-tool-webcrumbs-preview" aria-label="Webcrumbs live preview">
|
||||
<div class="external-tool-section-title">
|
||||
<span class="external-tool-kicker">Live Plugin</span>
|
||||
<span class="external-tool-kicker">共用預覽</span>
|
||||
<h2>共用 UI 預覽</h2>
|
||||
</div>
|
||||
<div class="external-tool-webcrumbs-grid">
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{% set active_page = 'vendor_stockout' %}
|
||||
{% set legacy_bridge_title = '發送歷史已升級' %}
|
||||
{% set legacy_bridge_kicker = 'VENDOR OPERATIONS' %}
|
||||
{% set legacy_bridge_kicker = '缺貨治理' %}
|
||||
{% set legacy_bridge_icon = 'fas fa-clock-rotate-left' %}
|
||||
{% set legacy_bridge_heading = '請使用新版發送歷史' %}
|
||||
{% set legacy_bridge_body = '查看缺貨處理紀錄,先補救會影響主推商品的供貨風險。' %}
|
||||
@@ -8,7 +8,7 @@
|
||||
{% set legacy_bridge_cta = '開啟發送歷史' %}
|
||||
{% set legacy_bridge_secondary_target = '/vendor-stockout/list' %}
|
||||
{% set legacy_bridge_secondary_cta = '缺貨清單' %}
|
||||
{% set legacy_bridge_meta = 'Legacy guard / history.html' %}
|
||||
{% set legacy_bridge_meta = '已整併到正式缺貨流程' %}
|
||||
{% extends "ewoooc_base.html" %}
|
||||
|
||||
{% block title %}發送歷史已升級 - EwoooC{% endblock %}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{% set active_page = 'vendor_stockout' %}
|
||||
{% set legacy_bridge_title = 'Excel 匯入已升級' %}
|
||||
{% set legacy_bridge_kicker = 'VENDOR OPERATIONS' %}
|
||||
{% set legacy_bridge_kicker = '資料匯入' %}
|
||||
{% set legacy_bridge_icon = 'fas fa-file-import' %}
|
||||
{% set legacy_bridge_heading = '請使用新版雲端匯入入口' %}
|
||||
{% set legacy_bridge_body = '先補齊缺貨與業績資料,讓分析、建議與解法有可靠來源。' %}
|
||||
@@ -8,7 +8,7 @@
|
||||
{% set legacy_bridge_cta = '開啟廠商匯入' %}
|
||||
{% set legacy_bridge_secondary_target = '/auto_import' %}
|
||||
{% set legacy_bridge_secondary_cta = '雲端匯入' %}
|
||||
{% set legacy_bridge_meta = 'Legacy guard / import.html' %}
|
||||
{% set legacy_bridge_meta = '已整併到正式匯入流程' %}
|
||||
{% extends "ewoooc_base.html" %}
|
||||
|
||||
{% block title %}Excel 匯入已升級 - EwoooC{% endblock %}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{% extends 'ewoooc_base.html' %}
|
||||
{% block title %}廠商缺貨通知系統 - WOOO TECH{% endblock %}
|
||||
{% block title %}缺貨治理 - EwoooC{% endblock %}
|
||||
|
||||
{#
|
||||
v3 改寫重點:
|
||||
|
||||
@@ -140,7 +140,7 @@
|
||||
<div class="container-fluid py-4 login-history-page">
|
||||
<div class="page-header">
|
||||
<h1><i class="fas fa-clock-rotate-left me-2"></i>登入歷史</h1>
|
||||
<p>系統登入記錄與異常嘗試追蹤</p>
|
||||
<p>追蹤登入風險,避免未授權操作影響業績流程。</p>
|
||||
</div>
|
||||
|
||||
<div class="card">
|
||||
@@ -162,7 +162,7 @@
|
||||
<th>狀態</th>
|
||||
<th>IP</th>
|
||||
<th>原因</th>
|
||||
<th>User Agent</th>
|
||||
<th>裝置資訊</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id="loginHistoryBody">
|
||||
|
||||
@@ -29,9 +29,9 @@
|
||||
<section class="stats-grid">
|
||||
{% set stats = [
|
||||
('total', 'fa-list', 'total-lines', '總行數'),
|
||||
('error', 'fa-times-circle', 'error-count', 'ERROR'),
|
||||
('warning', 'fa-exclamation-triangle','warning-count', 'WARNING'),
|
||||
('info', 'fa-info-circle', 'info-count', 'INFO')
|
||||
('error', 'fa-times-circle', 'error-count', '錯誤'),
|
||||
('warning', 'fa-exclamation-triangle','warning-count', '注意'),
|
||||
('info', 'fa-info-circle', 'info-count', '資訊')
|
||||
] %}
|
||||
{% for kind, icon, vid, label in stats %}
|
||||
<article class="stat-card stat-card--{{ kind }}">
|
||||
@@ -69,10 +69,10 @@
|
||||
<div class="filter-row">
|
||||
<div class="filter-buttons">
|
||||
{% for level, icon, label in [
|
||||
('all', 'fa-list', 'ALL'),
|
||||
('error', 'fa-times-circle', 'ERROR'),
|
||||
('warning', 'fa-exclamation-triangle','WARNING'),
|
||||
('info', 'fa-info-circle', 'INFO')
|
||||
('all', 'fa-list', '全部'),
|
||||
('error', 'fa-times-circle', '錯誤'),
|
||||
('warning', 'fa-exclamation-triangle','注意'),
|
||||
('info', 'fa-info-circle', '資訊')
|
||||
] %}
|
||||
<button class="btn-filter btn-filter--{{ level }}{% if level == 'all' %} is-active{% endif %}"
|
||||
data-level="{{ level }}" onclick="filterByLevel('{{ level }}')">
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
{% set active_page = 'settings' %}
|
||||
{% set legacy_bridge_title = '系統維護中' %}
|
||||
{% set legacy_bridge_kicker = 'SYSTEM MAINTENANCE' %}
|
||||
{% set legacy_bridge_kicker = '服務維護' %}
|
||||
{% set legacy_bridge_icon = 'fas fa-screwdriver-wrench' %}
|
||||
{% set legacy_bridge_heading = '正在進行系統升級' %}
|
||||
{% set legacy_bridge_body = '服務正在短暫維護與優化,完成後會恢復正常入口。這個頁面已套用新版字型、色彩與點陣規範。' %}
|
||||
{% set legacy_bridge_body = '系統正在短暫維護;恢復後請先確認業績、比價與匯入狀態。' %}
|
||||
{% set legacy_bridge_target = '/health' %}
|
||||
{% set legacy_bridge_cta = '檢查健康狀態' %}
|
||||
{% set legacy_bridge_secondary_target = '/' %}
|
||||
{% set legacy_bridge_secondary_cta = '回首頁' %}
|
||||
{% set legacy_bridge_meta = '維護模式 / Asia Taipei' %}
|
||||
{% set legacy_bridge_meta = '維護模式 / 台北時間' %}
|
||||
{% extends "ewoooc_base.html" %}
|
||||
|
||||
{% block title %}系統維護中 - EwoooC{% endblock %}
|
||||
|
||||
@@ -571,7 +571,7 @@
|
||||
<section class="market-intel-page">
|
||||
<header class="market-intel-hero">
|
||||
<div>
|
||||
<p class="market-intel-kicker">MARKET INTEL</p>
|
||||
<p class="market-intel-kicker">市場情報</p>
|
||||
<h1 class="market-intel-title">市場情報入口</h1>
|
||||
<p class="market-intel-copy">
|
||||
市場情報尚未進入正式決策;先用比價覆核、PChome 爬蟲與 AI 觀測台守住商品判斷。
|
||||
@@ -611,7 +611,7 @@
|
||||
</section>
|
||||
|
||||
<section class="market-intel-panel" aria-labelledby="market-intel-flow-title">
|
||||
<p class="market-intel-label">OPERATIONS</p>
|
||||
<p class="market-intel-label">操作入口</p>
|
||||
<h2 id="market-intel-flow-title" class="market-intel-title">正式操作入口</h2>
|
||||
<div class="market-intel-flow">
|
||||
<article class="market-intel-flow-item">
|
||||
|
||||
@@ -99,7 +99,7 @@
|
||||
<div class="mb-3">
|
||||
<label class="form-label">預覽</label>
|
||||
<div class="notification-preview" id="previewArea">
|
||||
點擊「預覽」按鈕查看效果
|
||||
尚未預覽,先確認訊息是否清楚交代商品、風險與下一步。
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
@@ -458,7 +458,7 @@ function editTemplate(code) {
|
||||
document.getElementById('editActive').value = template.is_active ? 'true' : 'false';
|
||||
document.getElementById('editTitle').value = template.title || '';
|
||||
document.getElementById('editBody').value = template.body || '';
|
||||
document.getElementById('previewArea').textContent = '點擊「預覽」按鈕查看效果';
|
||||
document.getElementById('previewArea').textContent = '尚未預覽,先確認訊息是否清楚交代商品、風險與下一步。';
|
||||
|
||||
new bootstrap.Modal(document.getElementById('editModal')).show();
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{% set active_page = 'vendor_stockout' %}
|
||||
{% set legacy_bridge_title = '郵件發送已升級' %}
|
||||
{% set legacy_bridge_kicker = 'VENDOR OPERATIONS' %}
|
||||
{% set legacy_bridge_kicker = '缺貨治理' %}
|
||||
{% set legacy_bridge_icon = 'fas fa-paper-plane' %}
|
||||
{% set legacy_bridge_heading = '請使用新版郵件發送' %}
|
||||
{% set legacy_bridge_body = '先處理缺貨通知失敗,避免補貨協調中斷。' %}
|
||||
@@ -8,7 +8,7 @@
|
||||
{% set legacy_bridge_cta = '開啟郵件發送' %}
|
||||
{% set legacy_bridge_secondary_target = '/vendor-stockout/vendor-management' %}
|
||||
{% set legacy_bridge_secondary_cta = '廠商管理' %}
|
||||
{% set legacy_bridge_meta = 'Legacy guard / send_email.html' %}
|
||||
{% set legacy_bridge_meta = '已整併到正式缺貨流程' %}
|
||||
{% extends "ewoooc_base.html" %}
|
||||
|
||||
{% block title %}郵件發送已升級 - EwoooC{% endblock %}
|
||||
|
||||
@@ -124,7 +124,7 @@
|
||||
|
||||
<div class="alert alert-info mb-5">
|
||||
<i class="fas fa-lightbulb me-2"></i>
|
||||
<strong>提示:</strong> 分類設定採用動態讀取機制,新增或修改後<strong>無需重啟系統</strong>,下一次爬蟲任務執行時將自動載入最新設定。
|
||||
<strong>比價來源同步:</strong> 新增或修改分類後,下一次爬蟲會使用最新清單補齊 MOMO 參考來源。
|
||||
</div>
|
||||
|
||||
{# Toast / Loading / Modal #}
|
||||
|
||||
@@ -99,8 +99,8 @@
|
||||
<h5 class="mb-3">系統維護</h5>
|
||||
<div class="d-flex align-items-center justify-content-between gap-3">
|
||||
<div>
|
||||
<h6 class="fw-bold mb-1">完整備份</h6>
|
||||
<p class="text-muted mb-0 small">將目前的系統程式碼與資料庫打包存檔。</p>
|
||||
<h6 class="fw-bold mb-1">營運資料備份</h6>
|
||||
<p class="text-muted mb-0 small">上線或匯入前建立備份,保留可回復的業績與設定狀態。</p>
|
||||
</div>
|
||||
<button class="btn btn-outline-secondary" onclick="triggerBackup()">
|
||||
<i class="fas fa-file-archive me-2"></i>建立備份
|
||||
@@ -174,7 +174,7 @@ function getCSRFToken() {
|
||||
}
|
||||
|
||||
function triggerBackup() {
|
||||
if (confirm('確定要執行系統完整備份嗎?\n這將會打包所有程式碼與資料庫檔案。')) {
|
||||
if (confirm('確定要建立營運資料備份嗎?\n會保留目前程式與資料狀態,方便必要時回復。')) {
|
||||
fetch('/api/backup', {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
@@ -212,7 +212,7 @@ function uploadSalesReport() {
|
||||
if (!confirm('檔案名稱似乎不符合「即時業績(全月)」的格式,確定要繼續匯入嗎?\n系統將嘗試根據檔名建立資料表。')) {
|
||||
return;
|
||||
}
|
||||
} else if (!confirm('確定要匯入此份業績報表嗎?\n資料將會累加至 `realtime_sales_monthly` 資料表的現有內容中。')) {
|
||||
} else if (!confirm('確定要匯入此份業績報表嗎?\n匯入後會更新月度業績判斷,供成長分析與報表使用。')) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{% extends 'base.html' %}
|
||||
|
||||
{% block title %}測試頁面 - WOOO TECH{% endblock %}
|
||||
{% block title %}測試頁面 - EwoooC{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="container">
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
<i class="fas fa-file-import"></i>匯入 Excel
|
||||
</a>
|
||||
<a class="vendor-action" href="{{ url_for('vendor.list_page') }}">
|
||||
<i class="fas fa-list-check"></i>查看清單
|
||||
<i class="fas fa-list-check"></i>處理缺貨
|
||||
</a>
|
||||
<a class="vendor-action" href="{{ url_for('vendor.vendor_management_page') }}">
|
||||
<i class="fas fa-address-book"></i>廠商資料
|
||||
@@ -167,7 +167,7 @@
|
||||
</div>
|
||||
{% if stats.total_stockouts == 0 %}
|
||||
<div class="vendor-empty momo-mono">
|
||||
目前沒有匯入的缺貨資料;請先使用既有 Excel 匯入流程建立真實批次。
|
||||
尚無缺貨批次;先匯入 Excel,確認主推商品供貨風險。
|
||||
</div>
|
||||
{% endif %}
|
||||
</section>
|
||||
|
||||
@@ -272,7 +272,7 @@
|
||||
<div class="mb-3">
|
||||
<label class="form-label">郵件地址 <small class="text-muted">(每行一個郵件地址)</small></label>
|
||||
<textarea class="form-control" id="vendorEmails" rows="5" placeholder="輸入郵件地址,每行一個"></textarea>
|
||||
<small class="text-muted">提示:可以從 Excel 複製貼上多個郵件地址</small>
|
||||
<small class="text-muted">可貼上多個收件人,讓缺貨通知一次送到正確窗口。</small>
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
|
||||
@@ -731,3 +731,89 @@ def test_edge_tool_pages_keep_growth_decision_copy_concise():
|
||||
assert marker in text
|
||||
for bad in forbidden:
|
||||
assert bad not in text
|
||||
|
||||
|
||||
def test_governance_and_low_frequency_pages_avoid_engineering_status_copy():
|
||||
from pathlib import Path
|
||||
|
||||
expected = {
|
||||
"templates/components/_legacy_bridge_panel.html": ["頁面狀態", "已整併", "業績流程可用"],
|
||||
"templates/403.html": ["權限守門", "未授權操作影響營運資料", "權限控管"],
|
||||
"templates/maintenance.html": ["服務維護", "確認業績、比價與匯入狀態", "台北時間"],
|
||||
"templates/auto_import_index.html": ["更新日報、成長分析與今日作戰清單", "去重後寫入業績快照"],
|
||||
"templates/settings.html": ["比價來源同步", "補齊 MOMO 參考來源"],
|
||||
"templates/system_settings.html": ["營運資料備份", "可回復的業績與設定狀態"],
|
||||
"templates/ai_recommend.html": ["值得主推、調價或補比價", "回到 PChome 銷售動作"],
|
||||
"templates/notification_templates.html": ["商品、風險與下一步"],
|
||||
"templates/vendor_stockout_index_v2.html": ["處理缺貨", "主推商品供貨風險"],
|
||||
"templates/vendor_stockout_vendor_management_v2.html": ["正確窗口"],
|
||||
"templates/login_history.html": ["避免未授權操作影響業績流程", "裝置資訊"],
|
||||
"templates/logs.html": ["錯誤", "注意", "資訊"],
|
||||
"templates/ai_automation_smoke.html": ["AI 閉環守門", "支援業績流程"],
|
||||
"templates/external_tool_status.html": ["共用預覽"],
|
||||
"templates/market_intel/disabled.html": ["市場情報", "操作入口"],
|
||||
"templates/brand_assets.html": ["EwoooC 品牌資產庫", "品牌資產混用"],
|
||||
"templates/code_review.html": ["部署守門與程式碼審查", "業績流程上線前檢查", "部署證據"],
|
||||
}
|
||||
forbidden = [
|
||||
"MIGRATED PAGE",
|
||||
"V3 READY",
|
||||
"Growth workflow active",
|
||||
"ACCESS CONTROL",
|
||||
"403 / Forbidden",
|
||||
"SYSTEM MAINTENANCE",
|
||||
"Asia Taipei",
|
||||
"VENDOR OPERATIONS",
|
||||
"SYSTEM OPERATIONS",
|
||||
"MIGRATED DASHBOARD",
|
||||
"MIGRATED CAMPAIGN",
|
||||
"Legacy guard",
|
||||
"資料將會",
|
||||
"無需重啟系統",
|
||||
"完整備份",
|
||||
"打包所有程式碼與資料庫",
|
||||
"輸入商品名稱後點擊",
|
||||
"點擊「預覽」按鈕查看效果",
|
||||
"目前沒有匯入的缺貨資料",
|
||||
"提示:可以從 Excel",
|
||||
"系統登入記錄與異常嘗試追蹤",
|
||||
"User Agent",
|
||||
"四 Agent 控制面",
|
||||
"不會影響 DB",
|
||||
"Live Plugin",
|
||||
"MARKET INTEL",
|
||||
"OPERATIONS",
|
||||
"WOOO TECH",
|
||||
"Main Logo",
|
||||
"Glass Version",
|
||||
"Gradient Version",
|
||||
"AI 程式碼審查",
|
||||
]
|
||||
|
||||
legacy_paths = [
|
||||
"templates/dashboard.html",
|
||||
"templates/edm_dashboard.html",
|
||||
"templates/send_email.html",
|
||||
"templates/history.html",
|
||||
"templates/import.html",
|
||||
"templates/crawler_management.html",
|
||||
"web/templates/vendor_stockout/send_email.html",
|
||||
"web/templates/vendor_stockout/index.html",
|
||||
"web/templates/vendor_stockout/list.html",
|
||||
"web/templates/vendor_stockout/history.html",
|
||||
"web/templates/vendor_stockout/import.html",
|
||||
"web/templates/vendor_stockout/vendor_management.html",
|
||||
]
|
||||
|
||||
for path, markers in expected.items():
|
||||
text = Path(path).read_text(encoding="utf-8")
|
||||
for marker in markers:
|
||||
assert marker in text
|
||||
for bad in forbidden:
|
||||
assert bad not in text
|
||||
|
||||
for path in legacy_paths:
|
||||
text = Path(path).read_text(encoding="utf-8")
|
||||
assert "已整併" in text
|
||||
for bad in forbidden:
|
||||
assert bad not in text
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{% set active_page = 'vendor_stockout' %}
|
||||
{% set legacy_bridge_title = '發送歷史已升級' %}
|
||||
{% set legacy_bridge_kicker = 'VENDOR OPERATIONS' %}
|
||||
{% set legacy_bridge_kicker = '缺貨治理' %}
|
||||
{% set legacy_bridge_icon = 'fas fa-clock-rotate-left' %}
|
||||
{% set legacy_bridge_heading = '請使用新版發送歷史' %}
|
||||
{% set legacy_bridge_body = '舊版 web vendor history 已停用,正式入口已接到新版營運工具頁與一致的響應式佈局。' %}
|
||||
@@ -8,7 +8,7 @@
|
||||
{% set legacy_bridge_cta = '開啟發送歷史' %}
|
||||
{% set legacy_bridge_secondary_target = '/vendor-stockout/send-email' %}
|
||||
{% set legacy_bridge_secondary_cta = '郵件發送' %}
|
||||
{% set legacy_bridge_meta = 'Legacy guard / vendor_stockout/history.html' %}
|
||||
{% set legacy_bridge_meta = '已整併到正式缺貨流程' %}
|
||||
{% extends "ewoooc_base.html" %}
|
||||
|
||||
{% block title %}發送歷史已升級 - EwoooC{% endblock %}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{% set active_page = 'vendor_stockout' %}
|
||||
{% set legacy_bridge_title = '缺貨匯入已升級' %}
|
||||
{% set legacy_bridge_kicker = 'VENDOR OPERATIONS' %}
|
||||
{% set legacy_bridge_kicker = '資料匯入' %}
|
||||
{% set legacy_bridge_icon = 'fas fa-file-arrow-up' %}
|
||||
{% set legacy_bridge_heading = '請使用新版缺貨匯入' %}
|
||||
{% set legacy_bridge_body = '舊版 web vendor import 已停用,正式匯入頁已接到新版上傳區、表單與響應式規範。' %}
|
||||
@@ -8,7 +8,7 @@
|
||||
{% set legacy_bridge_cta = '開啟缺貨匯入' %}
|
||||
{% set legacy_bridge_secondary_target = '/vendor-stockout/list' %}
|
||||
{% set legacy_bridge_secondary_cta = '缺貨清單' %}
|
||||
{% set legacy_bridge_meta = 'Legacy guard / vendor_stockout/import.html' %}
|
||||
{% set legacy_bridge_meta = '已整併到正式匯入流程' %}
|
||||
{% extends "ewoooc_base.html" %}
|
||||
|
||||
{% block title %}缺貨匯入已升級 - EwoooC{% endblock %}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{% set active_page = 'vendor_stockout' %}
|
||||
{% set legacy_bridge_title = '廠商缺貨首頁已升級' %}
|
||||
{% set legacy_bridge_kicker = 'VENDOR OPERATIONS' %}
|
||||
{% set legacy_bridge_kicker = '缺貨治理' %}
|
||||
{% set legacy_bridge_icon = 'fas fa-box-open' %}
|
||||
{% set legacy_bridge_heading = '請使用新版廠商缺貨首頁' %}
|
||||
{% set legacy_bridge_body = '這個 web/templates 舊入口已停用,正式頁面已接到新版營運視覺、響應式卡片與 V3 shell。' %}
|
||||
@@ -8,7 +8,7 @@
|
||||
{% set legacy_bridge_cta = '開啟廠商缺貨' %}
|
||||
{% set legacy_bridge_secondary_target = '/vendor-stockout/list' %}
|
||||
{% set legacy_bridge_secondary_cta = '缺貨清單' %}
|
||||
{% set legacy_bridge_meta = 'Legacy guard / vendor_stockout/index.html' %}
|
||||
{% set legacy_bridge_meta = '已整併到正式缺貨流程' %}
|
||||
{% extends "ewoooc_base.html" %}
|
||||
|
||||
{% block title %}廠商缺貨首頁已升級 - EwoooC{% endblock %}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{% set active_page = 'vendor_stockout' %}
|
||||
{% set legacy_bridge_title = '缺貨清單已升級' %}
|
||||
{% set legacy_bridge_kicker = 'VENDOR OPERATIONS' %}
|
||||
{% set legacy_bridge_kicker = '缺貨治理' %}
|
||||
{% set legacy_bridge_icon = 'fas fa-list-check' %}
|
||||
{% set legacy_bridge_heading = '請使用新版缺貨清單' %}
|
||||
{% set legacy_bridge_body = '舊版 web vendor list 已停用,正式清單已改用新版桌手機響應式排版與新版 token。' %}
|
||||
@@ -8,7 +8,7 @@
|
||||
{% set legacy_bridge_cta = '開啟缺貨清單' %}
|
||||
{% set legacy_bridge_secondary_target = '/vendor-stockout' %}
|
||||
{% set legacy_bridge_secondary_cta = '廠商缺貨首頁' %}
|
||||
{% set legacy_bridge_meta = 'Legacy guard / vendor_stockout/list.html' %}
|
||||
{% set legacy_bridge_meta = '已整併到正式缺貨流程' %}
|
||||
{% extends "ewoooc_base.html" %}
|
||||
|
||||
{% block title %}缺貨清單已升級 - EwoooC{% endblock %}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{% set active_page = 'vendor_stockout' %}
|
||||
{% set legacy_bridge_title = '郵件發送已升級' %}
|
||||
{% set legacy_bridge_kicker = 'VENDOR OPERATIONS' %}
|
||||
{% set legacy_bridge_kicker = '缺貨治理' %}
|
||||
{% set legacy_bridge_icon = 'fas fa-paper-plane' %}
|
||||
{% set legacy_bridge_heading = '請使用新版郵件發送' %}
|
||||
{% set legacy_bridge_body = '舊版 web vendor send_email 已停用,正式入口已使用新版廠商工具頁與一致的按鈕、字型、色彩。' %}
|
||||
@@ -8,7 +8,7 @@
|
||||
{% set legacy_bridge_cta = '開啟郵件發送' %}
|
||||
{% set legacy_bridge_secondary_target = '/vendor-stockout/history' %}
|
||||
{% set legacy_bridge_secondary_cta = '發送歷史' %}
|
||||
{% set legacy_bridge_meta = 'Legacy guard / vendor_stockout/send_email.html' %}
|
||||
{% set legacy_bridge_meta = '已整併到正式缺貨流程' %}
|
||||
{% extends "ewoooc_base.html" %}
|
||||
|
||||
{% block title %}郵件發送已升級 - EwoooC{% endblock %}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{% set active_page = 'vendor_stockout' %}
|
||||
{% set legacy_bridge_title = '廠商管理已升級' %}
|
||||
{% set legacy_bridge_kicker = 'VENDOR OPERATIONS' %}
|
||||
{% set legacy_bridge_kicker = '供貨治理' %}
|
||||
{% set legacy_bridge_icon = 'fas fa-address-book' %}
|
||||
{% set legacy_bridge_heading = '請使用新版廠商管理' %}
|
||||
{% set legacy_bridge_body = '舊版 web vendor management 已停用,正式入口已接到新版廠商工具頁與手機版友善表格。' %}
|
||||
@@ -8,7 +8,7 @@
|
||||
{% set legacy_bridge_cta = '開啟廠商管理' %}
|
||||
{% set legacy_bridge_secondary_target = '/vendor-stockout/list' %}
|
||||
{% set legacy_bridge_secondary_cta = '缺貨清單' %}
|
||||
{% set legacy_bridge_meta = 'Legacy guard / vendor_stockout/vendor_management.html' %}
|
||||
{% set legacy_bridge_meta = '已整併到正式缺貨流程' %}
|
||||
{% extends "ewoooc_base.html" %}
|
||||
|
||||
{% block title %}廠商管理已升級 - EwoooC{% endblock %}
|
||||
|
||||
Reference in New Issue
Block a user