diff --git a/web/backend/go.sum b/web/backend/go.sum new file mode 100644 index 0000000..88d1e28 --- /dev/null +++ b/web/backend/go.sum @@ -0,0 +1,5 @@ +github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= +github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= +github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +golang.org/x/crypto v0.27.0/go.mod h1:1Xngt8kV6Dvbssa53Ziq6Eqn0HqbZi5Z6R0ZpwQzt70= +modernc.org/sqlite v1.32.0/go.mod h1:UqoylwmTb9F+IqXERT8bW9zzOWN8qwAIcLdzeBZs4hA= diff --git a/web/backend/internal/handlers/scores.go b/web/backend/internal/handlers/scores.go index 4b562d3..eb19703 100644 --- a/web/backend/internal/handlers/scores.go +++ b/web/backend/internal/handlers/scores.go @@ -22,6 +22,7 @@ func (d *Deps) ListScores(w http.ResponseWriter, r *http.Request) { TsCode: q.Get("ts_code"), Start: q.Get("start"), End: q.Get("end"), + Signal: q.Get("signal"), Limit: limit, }) if err != nil { diff --git a/web/backend/internal/store/futures.go b/web/backend/internal/store/futures.go index b96cca8..23de2bf 100644 --- a/web/backend/internal/store/futures.go +++ b/web/backend/internal/store/futures.go @@ -48,6 +48,7 @@ type ScoreFilter struct { TsCode string Start string End string + Signal string Limit int } @@ -69,6 +70,10 @@ func (s *FuturesStore) ListScores(f ScoreFilter) ([]Score, error) { q += " AND trade_date <= " + next() args = append(args, f.End) } + if f.Signal != "" { + q += " AND signal LIKE " + next() + args = append(args, "%"+f.Signal+"%") + } q += " ORDER BY trade_date DESC, id DESC" if f.Limit <= 0 || f.Limit > 500 { f.Limit = 200 diff --git a/web/frontend/src/api/scores.ts b/web/frontend/src/api/scores.ts index 360ca25..1e17992 100644 --- a/web/frontend/src/api/scores.ts +++ b/web/frontend/src/api/scores.ts @@ -49,6 +49,7 @@ export interface ScoreListParams { ts_code?: string start?: string end?: string + signal?: string limit?: number } diff --git a/web/frontend/src/views/ScoresView.vue b/web/frontend/src/views/ScoresView.vue index d6a8ae9..4deb98d 100644 --- a/web/frontend/src/views/ScoresView.vue +++ b/web/frontend/src/views/ScoresView.vue @@ -4,9 +4,15 @@ import { listContracts, listScores, type Score } from '@/api/scores' import ScoreDetailDrawer from '@/components/ScoreDetailDrawer.vue' import { parseTsCode } from '@/utils/contract' -const filter = reactive<{ ts_code?: string; range: [string, string] | []; limit: number }>({ +const filter = reactive<{ + ts_code?: string + range: [string, string] | [] + signal?: string + limit: number +}>({ ts_code: undefined, range: [], + signal: undefined, limit: 200, }) @@ -23,6 +29,7 @@ async function reload() { ts_code: filter.ts_code, start: start || undefined, end: end || undefined, + signal: filter.signal, limit: filter.limit, }) } finally { @@ -30,6 +37,11 @@ async function reload() { } } +function toggleSignal(s: string) { + filter.signal = filter.signal === s ? undefined : s + reload() +} + function signalTagType(s: string) { if (s.includes('强烈看多')) return 'success' if (s.includes('偏多')) return '' @@ -75,6 +87,22 @@ onMounted(async () => { 查询 + + + + 强烈看多 + + + 强烈看空 + + +