新增数据重置功能:管理员可一键清空所有行情数据,需输入确认文字防误操作

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
fish
2026-05-04 23:20:07 +08:00
parent 7b6732488a
commit fa5fa07ef6
6 changed files with 72 additions and 0 deletions

View File

@@ -0,0 +1,22 @@
package handlers
import (
"fmt"
"io"
"net/http"
"time"
)
func (d *Deps) AdminResetData(w http.ResponseWriter, r *http.Request) {
client := &http.Client{Timeout: 10 * time.Second}
resp, err := client.Post(d.TushareURL+"/api/v1/admin/reset-data", "application/json", nil)
if err != nil {
writeErr(w, http.StatusBadGateway, fmt.Sprintf("tushare service unavailable: %v", err))
return
}
defer resp.Body.Close()
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(resp.StatusCode)
_, _ = io.Copy(w, resp.Body)
}

View File

@@ -38,6 +38,7 @@ func New(d *handlers.Deps, dist fs.FS) http.Handler {
r.Post("/admin/users", d.AdminCreateUser)
r.Patch("/admin/users/{id}", d.AdminPatchUser)
r.Delete("/admin/users/{id}", d.AdminDeleteUser)
r.Post("/admin/reset-data", d.AdminResetData)
})
})
})

View File

@@ -1,9 +1,11 @@
<script setup lang="ts">
import { computed, ref } from 'vue'
import { useRouter, useRoute } from 'vue-router'
import { ElMessage, ElMessageBox } from 'element-plus'
import { useAuthStore } from '@/stores/auth'
import { useThemeStore } from '@/stores/theme'
import { useMobile } from '@/composables/useMobile'
import { resetAllData } from '@/api/admin'
const auth = useAuthStore()
const theme = useThemeStore()
@@ -12,6 +14,7 @@ const route = useRoute()
const { isMobile } = useMobile()
const drawerOpen = ref(false)
const resetting = ref(false)
const showLayout = computed(() => route.meta.layout !== 'blank' && !!auth.token)
@@ -29,6 +32,26 @@ function logout() {
function closeDrawer() {
drawerOpen.value = false
}
async function handleReset() {
closeDrawer()
try {
await ElMessageBox.prompt('此操作将清空所有行情数据candles + scores不可恢复。请输入"确认重置"后继续:', '数据重置', {
confirmButtonText: '确认重置',
cancelButtonText: '取消',
inputPattern: /^确认重置$/,
inputErrorMessage: '请输入"确认重置"',
type: 'warning',
})
resetting.value = true
await resetAllData()
ElMessage.success('已清空所有行情数据')
} catch {
// user cancelled
} finally {
resetting.value = false
}
}
</script>
<template>
@@ -47,6 +70,9 @@ function closeDrawer() {
<el-menu-item index="/chart">K 线 / 持仓</el-menu-item>
<el-menu-item index="/run">手动打分</el-menu-item>
<el-menu-item v-if="auth.isAdmin" index="/admin/users">用户管理</el-menu-item>
<el-menu-item v-if="auth.isAdmin" :index="() => {}" @click="handleReset" :disabled="resetting">
数据重置
</el-menu-item>
</el-menu>
</el-aside>

View File

@@ -0,0 +1,5 @@
import client from './client'
export function resetAllData() {
return client.post('/admin/reset-data').then((r) => r.data)
}