fix: align governance pages with growth workflow copy
All checks were successful
CD Pipeline / deploy (push) Successful in 1m2s

This commit is contained in:
ogt
2026-06-25 11:58:45 +08:00
parent 890af82d8b
commit e89b651748
35 changed files with 172 additions and 84 deletions

View File

@@ -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 # 用於模板顯示

View File

@@ -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 健康檢查頁統一改為繁中短句,聚焦資料可靠、權限守門、供貨風險與部署治理如何支援業績流程。 |

View File

@@ -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 %}

View File

@@ -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');

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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 %}

View File

@@ -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 %}

View File

@@ -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 %}

View File

@@ -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">

View File

@@ -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 %}

View File

@@ -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 %}

View File

@@ -1,5 +1,5 @@
{% extends 'ewoooc_base.html' %}
{% block title %}廠商缺貨通知系統 - WOOO TECH{% endblock %}
{% block title %}缺貨治理 - EwoooC{% endblock %}
{#
v3 改寫重點:

View File

@@ -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">

View File

@@ -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 }}')">

View File

@@ -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 %}

View File

@@ -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">

View File

@@ -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();
}

View File

@@ -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 %}

View File

@@ -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 #}

View File

@@ -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;
}

View File

@@ -1,6 +1,6 @@
{% extends 'base.html' %}
{% block title %}測試頁面 - WOOO TECH{% endblock %}
{% block title %}測試頁面 - EwoooC{% endblock %}
{% block content %}
<div class="container">

View File

@@ -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>

View File

@@ -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">

View File

@@ -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

View File

@@ -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 %}

View File

@@ -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 %}

View File

@@ -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 %}

View File

@@ -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 %}

View File

@@ -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 %}

View File

@@ -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 %}