ソースを参照

fix(web): 时间边界条改简洁(去边框盒 + 去 T+1 黑话)

icon + 日期范围 +(不含今日),替换原来的边框 chip。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
tianyu.chu 1 ヶ月 前
コミット
5844fac880
3 ファイル変更54 行追加3 行削除
  1. 3 3
      apps/web/src/modules/funnel/FunnelPage.tsx
  2. 6 0
      infra/serve-start.sh
  3. 45 0
      infra/serve.py

+ 3 - 3
apps/web/src/modules/funnel/FunnelPage.tsx

@@ -77,14 +77,14 @@ export function FunnelPage() {
         拼团漏斗:启动 → 曝光 → 拼团详情 → 下单 → 成功
       </p>
 
-      {/* 时间边界 —— 醒目展示这次漏斗覆盖的日期范围 + 不含今日(T+1) */}
+      {/* 时间边界 —— 简洁展示这次漏斗覆盖的日期范围,不含今日 */}
       {mutation.data?.snapshot_dt && (
-        <div className="inline-flex w-fit items-center gap-2 rounded-md border border-border bg-muted/40 px-3 py-1.5 text-sm">
+        <div className="flex items-center gap-1.5 text-sm m-0">
           <CalendarRange className="size-4 shrink-0 text-primary" />
           <span className="font-medium text-foreground">
             {funnelRangeText(period, mutation.data.snapshot_dt)}
           </span>
-          <span className="text-muted-foreground">· 数据 T+1,不含今日</span>
+          <span className="text-muted-foreground">(不含今日)</span>
         </div>
       )}
 

+ 6 - 0
infra/serve-start.sh

@@ -0,0 +1,6 @@
+#!/bin/bash
+# 服务器静态服务守护启动器:没在跑就拉起(cron 每分钟调 + @reboot)。
+# 托管 ~/hs-data(deploy 分支 clone)的静态产物,端口 6666,用户空间、不动系统。
+pgrep -f "serve-hs.py" >/dev/null 2>&1 || \
+  setsid python3 -u "$HOME/serve-hs.py" "$HOME/hs-data" 6666 \
+    >"$HOME/hs-web.log" 2>&1 </dev/null &

+ 45 - 0
infra/serve.py

@@ -0,0 +1,45 @@
+#!/usr/bin/env python3
+"""极简静态服务器(带 SPA 路由回退)—— 用户空间,CentOS 自带 Python 3.6 即可。
+
+托管前端构建产物(deploy 分支的 dist),供内网访问。客户端路由(如
+/behavior/funnel/group)刷新时回退到 index.html,避免 404。
+兼容 Python 3.6(不用 3.7+ 的 `directory=` 参数,改 os.chdir)。
+
+用法:
+    python3 serve.py <静态目录> [端口]
+例:
+    nohup python3 ~/serve-hs.py ~/hs-data 6666 > ~/hs-web.log 2>&1 &
+"""
+import os
+import sys
+from http.server import SimpleHTTPRequestHandler
+from socketserver import ThreadingTCPServer
+
+ROOT = os.path.abspath(sys.argv[1] if len(sys.argv) > 1 else ".")
+PORT = int(sys.argv[2]) if len(sys.argv) > 2 else 6666
+os.chdir(ROOT)
+
+
+class SpaHandler(SimpleHTTPRequestHandler):
+    def do_GET(self):
+        # 路径不是真实文件 → 回退到 index.html(SPA 客户端路由)。
+        rel = self.path.split("?", 1)[0].split("#", 1)[0].lstrip("/")
+        if rel and not os.path.isfile(os.path.join(ROOT, rel)):
+            self.path = "/index.html"
+        return SimpleHTTPRequestHandler.do_GET(self)
+
+    def end_headers(self):
+        # index.html 不缓存(构建产物自带 hash,可长缓存)。
+        if self.path in ("/", "/index.html"):
+            self.send_header("Cache-Control", "no-cache")
+        SimpleHTTPRequestHandler.end_headers(self)
+
+
+class Server(ThreadingTCPServer):
+    allow_reuse_address = True
+    daemon_threads = True
+
+
+if __name__ == "__main__":
+    print("serving %s on 0.0.0.0:%d (SPA fallback)" % (ROOT, PORT))
+    Server(("0.0.0.0", PORT), SpaHandler).serve_forever()