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 () => {
查询
+
+
+
+ 强烈看多
+
+
+ 强烈看空
+
+
+