astock-agent/frontend/.next/server/app/recommendations/page.js
2026-04-08 00:36:55 +08:00

1 line
9.6 KiB
JavaScript

(()=>{var e={};e.id=70,e.ids=[70],e.modules={2934:e=>{"use strict";e.exports=require("next/dist/client/components/action-async-storage.external.js")},4580:e=>{"use strict";e.exports=require("next/dist/client/components/request-async-storage.external.js")},5869:e=>{"use strict";e.exports=require("next/dist/client/components/static-generation-async-storage.external.js")},399:e=>{"use strict";e.exports=require("next/dist/compiled/next-server/app-page.runtime.prod.js")},822:(e,t,s)=>{"use strict";s.r(t),s.d(t,{GlobalError:()=>l.a,__next_app__:()=>m,originalPathname:()=>x,pages:()=>c,routeModule:()=>u,tree:()=>d}),s(3343),s(5166),s(5866);var a=s(3191),r=s(8716),n=s(7922),l=s.n(n),i=s(5231),o={};for(let e in i)0>["default","tree","pages","GlobalError","originalPathname","__next_app__","routeModule"].indexOf(e)&&(o[e]=()=>i[e]);s.d(t,o);let d=["",{children:["recommendations",{children:["__PAGE__",{},{page:[()=>Promise.resolve().then(s.bind(s,3343)),"/Users/aaron/source_code/astock-agent/frontend/src/app/recommendations/page.tsx"]}]},{}]},{layout:[()=>Promise.resolve().then(s.bind(s,5166)),"/Users/aaron/source_code/astock-agent/frontend/src/app/layout.tsx"],"not-found":[()=>Promise.resolve().then(s.t.bind(s,5866,23)),"next/dist/client/components/not-found-error"]}],c=["/Users/aaron/source_code/astock-agent/frontend/src/app/recommendations/page.tsx"],x="/recommendations/page",m={require:s,loadChunk:()=>Promise.resolve()},u=new a.AppPageRouteModule({definition:{kind:r.x.APP_PAGE,page:"/recommendations/page",pathname:"/recommendations",bundlePath:"",filename:"",appPaths:[]},userland:{loaderTree:d}})},2915:(e,t,s)=>{Promise.resolve().then(s.bind(s,2631))},2631:(e,t,s)=>{"use strict";s.r(t),s.d(t,{default:()=>o});var a=s(326),r=s(7577),n=s(8069),l=s(9677),i=s(7892);function o(){let[e,t]=(0,r.useState)(null),[s,o]=(0,r.useState)("all"),[d,c]=(0,r.useState)(!1),x=(0,r.useCallback)(async()=>{try{let[e,s]=await Promise.all([(0,n.Io)("/api/recommendations/latest"),(0,n.Io)("/api/health")]);t(e),c(s.llm_enabled)}catch(e){console.error("加载推荐失败:",e)}},[]);(0,i.s)((0,r.useCallback)(()=>{x()},[x]));let m=e?.recommendations??[],u="all"===s?m:"buy"===s?m.filter(e=>"BUY"===e.signal):m.filter(e=>e.level===s);return(0,a.jsxs)("div",{className:"max-w-7xl mx-auto px-4 md:px-8 pt-6 pb-20 md:pb-10",children:[a.jsx("div",{className:"flex items-center justify-between mb-5 animate-fade-in-up",children:(0,a.jsxs)("div",{children:[a.jsx("h1",{className:"text-lg font-bold tracking-tight",children:"推荐列表"}),(0,a.jsxs)("p",{className:"text-xs text-text-muted mt-0.5",children:["共 ",a.jsx("span",{className:"font-mono tabular-nums",children:u.length})," 只"]})]})}),a.jsx("div",{className:"flex gap-2 mb-5 overflow-x-auto pb-1 animate-fade-in-up delay-75",children:[{key:"all",label:"全部"},{key:"buy",label:"买入信号"},{key:"强烈推荐",label:"强烈推荐"},{key:"推荐",label:"推荐"},{key:"观望",label:"观望"}].map(({key:e,label:t})=>a.jsx("button",{onClick:()=>o(e),className:`text-xs px-4 py-1.5 rounded-xl whitespace-nowrap transition-all duration-200 font-medium ${s===e?"bg-gradient-to-r from-amber-500/25 to-amber-600/20 text-amber-400 border border-amber-500/15":"bg-white/[0.03] text-text-muted hover:text-text-secondary hover:bg-white/[0.06] border border-transparent"}`,children:t},e))}),0===u.length?(0,a.jsxs)("div",{className:"glass-card-static p-12 text-center animate-fade-in-up",children:[(0,a.jsxs)("div",{className:"text-text-muted text-sm mb-1",children:["暂无","all"===s?"":"符合条件的","推荐"]}),a.jsx("div",{className:"text-text-muted/50 text-xs",children:"尝试切换筛选条件或触发新的扫描"})]}):a.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4",children:u.map((e,t)=>a.jsx("div",{className:"animate-fade-in-up",style:{animationDelay:`${60*t}ms`},children:a.jsx(l.Z,{rec:e,showLLMLoading:d})},e.ts_code))})]})}},9677:(e,t,s)=>{"use strict";s.d(t,{Z:()=>n});var a=s(326),r=s(1223);function n({rec:e,showLLMLoading:t=!1}){let s=(0,r.ny)(e.level);return(0,a.jsxs)("a",{href:`/stock/${e.ts_code}`,className:"block glass-card p-5 group",children:[(0,a.jsxs)("div",{className:"flex items-start justify-between mb-3",children:[(0,a.jsxs)("div",{children:[(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[a.jsx("span",{className:"font-semibold text-sm tracking-tight",children:e.name}),a.jsx("span",{className:`text-xs px-2 py-0.5 rounded-full font-medium ${s.bg} ${s.text}`,children:e.level})]}),(0,a.jsxs)("div",{className:"text-xs text-text-muted mt-1 font-mono tabular-nums",children:[e.ts_code," ",a.jsx("span",{className:"text-text-muted/40 mx-1",children:"\xb7"})," ",e.sector]})]}),(0,a.jsxs)("div",{className:"text-right",children:[a.jsx("div",{className:`text-xl font-bold font-mono tabular-nums tracking-tight ${(0,r.Uz)(e.score)}`,children:e.score}),a.jsx("div",{className:`text-xs font-semibold tracking-wider ${(0,r.R8)(e.signal)}`,children:"BUY"===e.signal?"买入":"SELL"===e.signal?"卖出":"持有"})]})]}),(0,a.jsxs)("div",{className:"grid grid-cols-4 gap-2 mb-4",children:[a.jsx(l,{label:"市场",value:e.market_temp_score}),a.jsx(l,{label:"板块",value:e.sector_score}),a.jsx(l,{label:"资金",value:e.capital_score}),a.jsx(l,{label:"技术",value:e.technical_score})]}),e.entry_price&&(0,a.jsxs)("div",{className:"flex justify-between text-xs mb-3 bg-white/[0.03] rounded-xl px-4 py-2.5 border border-white/[0.04]",children:[(0,a.jsxs)("div",{children:[a.jsx("span",{className:"text-text-muted",children:"买入 "}),a.jsx("span",{className:"text-red-400 font-mono tabular-nums",children:e.entry_price})]}),(0,a.jsxs)("div",{children:[a.jsx("span",{className:"text-text-muted",children:"目标 "}),a.jsx("span",{className:"text-amber-400 font-mono tabular-nums",children:e.target_price})]}),(0,a.jsxs)("div",{children:[a.jsx("span",{className:"text-text-muted",children:"止损 "}),a.jsx("span",{className:"text-emerald-400 font-mono tabular-nums",children:e.stop_loss})]})]}),a.jsx("div",{className:"space-y-1.5",children:e.reasons.map((e,t)=>(0,a.jsxs)("div",{className:"text-xs text-text-secondary flex items-start gap-2",children:[a.jsx("span",{className:"w-1 h-1 rounded-full bg-amber-500/60 mt-[7px] shrink-0"}),a.jsx("span",{className:"leading-relaxed",children:e})]},t))}),e.llm_analysis?(0,a.jsxs)("div",{className:"mt-3 bg-accent-cyan/[0.06] border border-accent-cyan/[0.12] rounded-xl px-4 py-3",children:[a.jsx("div",{className:"text-xs text-accent-cyan/80 font-semibold tracking-wider mb-1.5",children:"AI 分析"}),a.jsx("div",{className:"text-xs text-text-secondary leading-relaxed",children:e.llm_analysis})]}):t?(0,a.jsxs)("div",{className:"mt-3 text-xs text-text-muted flex items-center gap-2",children:[a.jsx("span",{className:"inline-block w-3 h-3 border border-accent-cyan/30 border-t-accent-cyan/80 rounded-full animate-spin"}),"AI 分析中..."]}):null,e.risk_note&&a.jsx("div",{className:"mt-3 text-xs text-amber-500/60 bg-amber-500/[0.04] border border-amber-500/[0.08] rounded-lg px-3 py-1.5",children:e.risk_note}),(0,a.jsxs)("div",{className:"mt-3 flex items-center gap-1 text-xs text-text-muted opacity-0 group-hover:opacity-100 transition-opacity duration-300",children:[a.jsx("span",{children:"查看详情"}),a.jsx("svg",{width:"10",height:"10",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:a.jsx("path",{d:"M5 12h14M12 5l7 7-7 7"})})]})]})}function l({label:e,value:t}){return(0,a.jsxs)("div",{children:[(0,a.jsxs)("div",{className:"flex justify-between text-xs text-text-muted mb-1",children:[a.jsx("span",{className:"font-medium",children:e}),a.jsx("span",{className:"font-mono tabular-nums",children:t.toFixed(0)})]}),a.jsx("div",{className:"h-1.5 bg-white/[0.04] rounded-full overflow-hidden",children:a.jsx("div",{className:`h-full rounded-full transition-all duration-700 ease-out ${t>=70?"score-bar-gradient-high":t>=50?"score-bar-gradient-mid":"score-bar-gradient-low"}`,style:{width:`${Math.min(t,100)}%`}})})]})}},7892:(e,t,s)=>{"use strict";s.d(t,{s:()=>r});var a=s(7577);function r(e){let[t,s]=(0,a.useState)(!1),r=(0,a.useRef)(null),n=(0,a.useRef)(),l=(0,a.useCallback)(()=>{let t="https:"===window.location.protocol?"wss:":"ws:",a=new WebSocket(`${t}//${window.location.host}/ws`);a.onopen=()=>{s(!0);let e=setInterval(()=>{a.readyState===WebSocket.OPEN&&a.send("ping")},3e4);a.addEventListener("close",()=>clearInterval(e))},a.onmessage=t=>{if("pong"!==t.data)try{let s=JSON.parse(t.data);e?.(s)}catch{}},a.onclose=()=>{s(!1),n.current=setTimeout(l,5e3)},a.onerror=()=>a.close(),r.current=a},[e]);return{connected:t}}},1223:(e,t,s)=>{"use strict";function a(e){return Math.abs(e)>=1e4?(e/1e4).toFixed(2)+"亿":Math.abs(e)>=1?e.toFixed(2)+"万":e.toFixed(2)}function r(e){return e>=80?"text-red-400":e>=60?"text-orange-400":e>=40?"text-yellow-400":"text-gray-400"}function n(e){switch(e){case"强烈推荐":return{bg:"bg-red-500/20",text:"text-red-400"};case"推荐":return{bg:"bg-orange-500/20",text:"text-orange-400"};case"观望":return{bg:"bg-yellow-500/20",text:"text-yellow-400"};default:return{bg:"bg-gray-500/20",text:"text-gray-400"}}}function l(e){return"BUY"===e?"text-red-400":"SELL"===e?"text-green-400":"text-gray-400"}function i(e){return e>=70?"#ff6b6b":e>=50?"#f59e0b":e>=30?"#fbbf24":"#34d399"}function o(e){return e>=70?"火热":e>=50?"温和":e>=30?"偏冷":"冰点"}s.d(t,{R8:()=>l,Uz:()=>r,Zd:()=>o,jD:()=>i,ny:()=>n,uf:()=>a})},3343:(e,t,s)=>{"use strict";s.r(t),s.d(t,{default:()=>a});let a=(0,s(8570).createProxy)(String.raw`/Users/aaron/source_code/astock-agent/frontend/src/app/recommendations/page.tsx#default`)}};var t=require("../../webpack-runtime.js");t.C(e);var s=e=>t(t.s=e),a=t.X(0,[948,982,171],()=>s(822));module.exports=a})();