尚未收集儲存庫資訊。
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
製作者的介紹僅有上面的一句話。 更多詳情請閱讀儲存庫 README。 儲存庫 README ↗
正在載入完整 README。
檢視完整 README ↗A股短線情緒看板與個股技術分析:**https://lfjmwl.com**(Vercel 預設網址 stockmarketshortemotion.vercel.app 也可用)。
由 twsvp-frontend 的「短線情緒」原樣遷出(來源 69593b1,PR #126),獨立部署。twsvp.com 保留自己的短線情緒頁面,兩站各自取數、互不依賴。
| 網址 | 內容 |
|---|---|
/about | 介紹頁(公開):產品介紹、今日情緒分數、底部「登录」按鈕 |
/login | 登入頁:輸入郵箱 → 同一頁填驗證碼,免費註冊 |
/home | 首頁(需登入):積分與簽到、個股技術分析輸入框、今日短線情緒(分數、階段、市場概況)、當日題材異動(可直接解鎖) |
/technicalanalysis | 個股技術分析(需登入,每次分析扣 10 積分) |
/shortemotion/cn | 短線情緒 · A股(需登入) |
/limitup | 漲停情緒(需登入,整頁須解鎖:10 積分 / 12 小時):漲停天梯、跌停股、晉級率、題材強弱與今日亮點 |
/ | 已登入 → /home;未登入 → /about |
/cn、/cn-short-emotion、/short-emotion | 舊網址,轉到上面的新網址 |
/tw、/tw-short-emotion、/shortemotion/tw、/shortemotion/hk | 已下線的台股、港股看板,轉到 A股看板 |
每個看板放在自己的資料夾(/看板名/…),以後新增看板照同樣方式加。
Supabase Cron(supabase/migrations/20261023033000_cron_dispatch.sql,工作日北京時間 09:02、09:32–11:32、13:02–15:02 每 30 分鐘;早報 06:50)
└─ POST /api/cron → 經 GitHub API 手動運行工作流(準點觸發;GitHub 自帶的定時常晚 25–30 分鐘,還會整次丟掉)
GitHub Actions(.github/workflows/short-emotion.yml;A股盤中每 30 分鐘、新聞每小時。自帶的定時 09:07–16:37 每 30 分鐘留作備用,同一時段只呼叫一次 Wind;延遲到窗口外時自動補抓 11:30 / 15:00 收盤快照)
└─ scripts/short-emotion/refresh.mjs 呼叫 Wind MCP 計算快照
└─ 強制推送到 short-emotion-data 分支
Vercel
├─ middleware.js 打開看板前檢查登入(未登入 → /login?next=原網址)
├─ public/about/、public/login/ 介紹頁、登入頁(共用 public/shared/lang.js 簡繁切換)
├─ public/short-emotion/ 短線情緒看板頁面
├─ public/home/、public/technical-analysis/ 首頁、個股技術分析頁面(共用 public/shared/nav-account.js)
├─ public/limitup/ 漲停情緒頁面
├─ api/limitup.js 漲停情緒:只讀資料分支(4 個數字免費,其餘須解鎖)、解鎖扣積分
├─ api/auth.js 登入:驗證碼通過後把憑證寫進 HttpOnly cookie、查詢登入狀態、退出
├─ api/short-emotion.js 只讀資料分支(summary 公開,其餘需登入);POST action=refresh 觸發上面的工作流
└─ api/technical-analysis.js 個股技術分析:由網站伺服器直接呼叫 Wind MCP(需要 WIND_API_KEY),扣積分
Supabase Auth 寄送與驗證郵箱驗證碼(經 Resend 寄出,不使用資料表)
短線情緒的頁面不直接呼叫 Wind,「刷新」觸發 GitHub Actions 取數。個股技術分析例外:每次查詢的股票不同、無法事先算好,所以由 api/technical-analysis.js 直接呼叫 Wind。
api/_lib/technical-analysis/engine.js,照原版搬過來,只換了 Wind 呼叫方式、日期按北京時間、輸出不標注數據來源)。supabase/migrations/20261021b_analysis_history.sql,每人保留最近 10 筆,只有本人看得到)。首頁與個股分析頁的輸入框下方顯示最近 3 條(同一支股票只留最新一次),點開直接看當時的結果(/technicalanalysis?id=<記錄>),不調用行情、不扣分;頂部標明分析時間,「重新分析」才扣分。/technicalanalysis 直接分析;網址上的 ?q= 只預填、不自動分析(避免打開分享連結就扣分)。WIND_API_KEY(Production);Supabase SQL Editor 執行 supabase/migrations/20261021_points_analysis.sql。沒有 Key 時頁面顯示「暫未開通」,不扣分。(n−1)/n);空表为0、未返回payload为未知。原版缺失数据兜底及诊断口径不另作优化。[2.5%, 5.5%),按题材归属、涨幅、量比、换手、成交额及题材分钟动能评分。领涨优先最早封板;龙头按归属评分与涨幅;中军按成交额/市值排名,字段不足时按涨幅中位兜底。batch 标签文案,避免原版出现 undefined;当前已有“启动”文案继续保留。台股、港股看板已於 2026-10-18 移除(程式與歷史資料一併刪除)。
POST /api/auth?action=session,伺服器寫入兩個 HttpOnly cookie(se_at、se_rt,SameSite=Lax)。api/_lib/supabase-public.js(只放公開的 Publishable key);本地或測試可用 SHORT_EMOTION_AUTH=off 關閉登入。[email protected]),郵件範本改為顯示驗證碼 {{ .Token }};
寄信上限 20 封/小時,登入請求 10 次/5 分鐘/IP。Resend 免費版每天 100 封、每月 3000 封。daily_active 表每人每天一行,只記「哪天來過」(不記看了哪個市場、用了哪個功能)。
打開看板時由 middleware 寫入(每人每天一次,se_seen cookie 去重);寫入用登入用戶自己的憑證呼叫 record_activity(),
不需要 secret key,函數每次寫入時順手刪除 30 天前的記錄。SQL 見 supabase/migrations/(依檔名順序執行)。/_vercel/insights/script.js,在 Vercel 專案的 Analytics 查看。需要先在 Vercel 專案的 Analytics 頁按 Enable。activity_summary(註冊數、近 7 天新註冊、今日 / 7 天 / 30 天活躍)與 activity_daily(每天活躍人數)。
表與視圖都不對網站訪客開放。/account(需登入):姓名、郵箱(只讀)、電話(區號 + 手機號,不做驗證碼)。full_name / display_name、phone_country_code、phone_number),
透過 GET / POST /api/auth?action=profile 用登入用戶自己的憑證讀寫,不另建表;Supabase 後台 Users 的 Display name 會顯示姓名。/account 的「外觀」:白版、黑版、自適應(預設,跟隨系統深淺色)。記在這台裝置的瀏覽器(localStorage twsvp_theme,沿用 TWSVP 時期的鍵名),所有頁面打開時讀取。se_rf cookie,10 分鐘有效)。定時更新照舊,不扣分。supabase/migrations/20261020_points.sql,在 SQL Editor 執行一次),只能經由 points_* 函數用登入者自己的憑證存取;
流水只記類型(註冊贈送/簽到/刷新/解鎖異動/退回),永久保留。營運概況:select * from points_overview;/account 顯示餘額、簽到按鈕與積分記錄。同一個 Vercel 專案順便提供設計 Demo,和看板互不影響:
public/demo/<名稱>/index.html,網址是 https://demo.lfjmwl.com/<名稱>(vercel.json 開頭兩條帶 has: host 的改寫)。demo.lfjmwl.com/ 由 middleware.js 送到 /like(點讚反饋 Demo,手機版:單擊/雙擊/連擊 × 顏色/動畫/文字共 9 種條件,底部淺色按鈕切換與重置;網址後加 #double-anim 等可直接打開某個條件)。/ → /about 的跳轉加了 missing: host,不作用在 demo 網域;demo 網域上看板相關網址照常需要登入。npm run dev 後打開 http://localhost:3000/demo/like/index.html 。demo.lfjmwl.com;若 lfjmwl.com 的 DNS 不在 Vercel,到 DNS 服務商加 CNAME demo → cname.vercel-dns.com。WIND_API_KEY。
沒設定之前,定時任務會自動跳過(只留一條警告),不會寄失敗通知。vercel.json 已指定輸出目錄 public)。GITHUB_ACTIONS_TOKEN:GitHub fine-grained token,只授權本倉庫,
權限 Actions: Read and write、Contents: Read-only。沒有它頁面照常顯示,只是「刷新」不可用。WIND_API_KEY:個股技術分析用(可與 GitHub Actions 同一把)。沒有它個股分析顯示「暫未開通」。supabase/migrations/20261023033000_cron_dispatch.sql 開頭的步驟):Supabase Vault 生成密鑰 shortemotion_cron_secret,
同一個值填到 Vercel 環境變數 CRON_SECRET 並 Redeploy,再在 SQL Editor 執行該檔案。沒做之前只靠 GitHub 自帶的定時(會延遲)。npm install
npm test # 單元測試
npm run dev # http://localhost:3000 ,預設讀線上資料分支,登入用真實 Supabase
SHORT_EMOTION_AUTH=off npm run dev # 不登入直接看看板
SHORT_EMOTION_DATA_DIR=./short-emotion-data npm run dev # 改讀本地檢出的資料分支
SHORT_EMOTION_AUTH=off WIND_MOCK=1 npm run dev # 個股技術分析用離線樣本(樣本電子 603936、樣本新材 300986 等)
手動跑一次取數(需要 WIND_API_KEY):WIND_API_KEY=... npm run refresh -- --force --market=all
main 是線上版本,受保護規則限制,所有改動都走「分支 → PR → 合併」。流程、分工與衝突處理見 CONTRIBUTING.md。
分享長圖、小卡底部附二維碼(public/short-emotion/qr-site.svg,指向 https://lfjmwl.com:已登入進看板、未登入到介紹頁);網址改了用 python3 scripts/short-emotion/build-share-qr.py 重新產生。
Logo:紅色實心方塊反白,L 與 J 合起來是一個 D(public/short-emotion/logo.svg);分頁圖示另有 favicon-32.png、/favicon.ico,手機桌面圖示 /apple-touch-icon.png。
twsvp_theme、twsvp_price_scheme;樣式檔仍叫 twsvp.cssapi/_lib/limitup/engine.js,对应原版 limit-engine.js),计算口径不改。只改了接线:
api/_lib/limitup/themes.js;短线情绪 v4 评分与题材雷达仍用自己的词表,两边互不影响,题材名偶尔对不上属于预期。api/_lib/short-emotion/engine.js,与短线情绪在同一次更新里共用,不重复取数。schedule.js 的 limitup,交易时段每 30 分钟,11:30 / 15:00 收盘补抓;当日已有 15:00 之后的收盘快照就不再重算)。用户点「刷新」(−5 积分)会一并重算。
kv/limitup_news-cache_<日期>.json,同一只股票当天只查一次资讯,之后的更新只查新出现的涨停股。limitup_latest(最新)、limitup_day_<日期>(每日定格,「较上日」用上一交易日这份,保留 90 天)、资讯缓存(保留 3 天)。/limitup 整页须解锁,−10 积分,12 小时内首页天梯与整页都能看。与题材异动的解锁分开计算、分开扣分;不限额账号不扣分。未解锁时接口只返回 4 个数字,不返回个股。supabase/migrations/20261027090000_limitup_unlock.sql(新增 points_limitup_status、points_unlock_limitup 与流水类型「解锁涨停情绪」)。没执行之前页面显示「积分服务暂时不可用」,不扣分。合并后数据任务跑过一次才有数据,之前页面显示「暂无快照」。首页最下方展示最新一期(标题、板块、100—150字摘要);点击进入 /kandian/article?id=YYYYMMDD。/kandian?tab=reports 倒序分页保留全部文章,?tab=views 保留原观点预览。阅读不扣积分,接口需登录。
生成由 .github/workflows/morning-report.yml 执行,复用 Wind MCP 和数据分支,不新增数据库。北京时间工作日06:50由 Supabase Cron 准点触发生成(同上,经 /api/cron),GitHub 自带的06:50、07:10、07:30定时留作备用补跑;接口在07:20前隐藏当日内容。GitHub定时任务可能延迟,因此07:20是最早可见时间,不能保证准点完成。与原行情任务使用相同并发组,避免覆盖数据。已生成的日期不重写,已报道的行情日不重复生成;失败不写索引、保留上一期。首次节假日仍可能总结未报道的上一交易日(尚未接入权威的前瞻交易日历),后续无新收盘数据则跳过。
启用前在GitHub配置:
WIND_API_KEY:沿用现有配置。MORNING_REPORT_API_KEY:模型接口密钥。MORNING_REPORT_BASE_URL:支持 /chat/completions 的HTTPS API基础地址,通常以 /v1 结尾。MORNING_REPORT_MODEL:该接口支持的模型ID;须支持JSON模式和足够长的上下文。可使用提供兼容接口的Alice服务;仅有Alice聊天界面不能直接接入。手动运行 Morning report 工作流验证首篇;缺少配置会明确失败,不发布占位文章。详情先生成、同次输出摘要并验证长度、五段正文、候选板块和引用id;留存原始证据以便核查。当前校验不等同人工事实审核;历史对照基于真实日K由模型解释,尚不提供经过回测的相似度/胜率,也未独立计算历史事件样本。上线前需人工检查首篇数字、消息时间与历史案例,按实际效果补充研究规则。不能把这部分当作已完成的量化回测系统。
首页资金模块与 /sectorflow 共用 public/shared/fund-flow.js:首页展示今日流入/流出各前三,点击板块带入详情;详情支持今天、5日、20日以及金额/占比、最多10个板块选择。板块颜色按代码固定,支持浅色/深色主题。今天为盘中累计净流入,多日为每日净流入;多日默认选线按区间合计排序,右端数值是最后一个有效采样值。范围沿用短线情绪概念池(非全市场资金排名)。
数据复用原有 sectorflow 盘中与每日快照,新增存成交额,用对应时点的净流入额/成交额计算占比;老快照无成交额时不回填占比。Actions 首轮及收盘后通过 Wind analytics 按区间合计筛选的概念查询真实20日序列,5日与20日共用查询并缓存到 sectorflow:windows:v1,同日盘中、盘后分别最多尝试一次;失败保留旧序列并记录错误。首次查询可能增加运行时间。没有新增密钥、数据库或浏览器端 Wind 调用。
已有数据可立即展示;历史接口不返回序列时仅展示已存的真实每日点,明确提示不足,不使用区间总额补造每日点或开盘零点。读取 summary/full 仍需登录、不扣积分,新增 dashboard 字段并保留旧协议字段。上线后需在真实 Actions 取数中确认 Wind 返回的历史字段、单位及日期范围;本地验证使用模拟数据,未消耗真实 Wind 配额。
北京时间每个交易日16:05触发生成盘后总结,完成后自动进入「要闻」及首页最新文章,作者统一「官方看点」。正文700—1400字、摘要100—150字,覆盖全天盘面、主线演变、驱动与分歧、回看日内观察、下一交易日观察。必须有当日15:00收盘快照;休市跳过,数据缺失报错,GitHub16:15、16:35备用补跑。消息截点固定16:05,盘后消息不能反推盘中涨跌。独立id为日期-evening,不阻断次日早报。复用现有模型配置与数据存储。16:05是触发时间,排队和生成可能延后。
一级业务页使用 Logo、页面标题、签到页面入口、积分余额与个人中心。Logo 根据有效登录态跳转 /home 或 /about。个人中心及二三级页面保留顶部返回箭头及各自的页面动作:个人中心右上角是「设置」,编辑页保留「保存」,文章详情保留「分享」。签到入口仅打开 /account/signin,不会直接领取积分;领取动作只能在签到页确认后触发,服务器端同一北京时间自然日仅允许一次。
/admin 的「全站功能使用」按北京时间展示今日/近7日事件次数、登录账号去重人数和匿名浏览器标识数。所有产品页面接入 /shared/usage.js,记录页面访问、手机返回恢复、按钮/链接点击、表单提交及选项切换;不记录输入文本、查询参数、股票代码、文章ID或完整URL。匿名浏览器标识 cookie 保留30天,原始事件每天清理30天以前的数据;管理员页面不采集为产品使用。
waitUntil 异步记录,采集失败不改变业务响应。采集接口复用 /api/auth?action=usage;浏览器只能写观察事件。API执行结果凭证复用服务器 CRON_SECRET,数据库校验 Vault 的 shortemotion_cron_secret。凭证不发给浏览器。usage_private 原表禁止匿名和普通登录账号直接访问;只读汇总 RPC admin_usage 检查管理员身份。相同事件ID去重,每个账号/匿名标识每分钟最多120条。数据库迁移:supabase/migrations/20261028101645_feature_usage.sql。数据库迁移先于新版API/前端部署;回退代码时保留新增表和RPC即可,不删除现有业务数据。