fix: 将 admin 改为普通目录

This commit is contained in:
hajimi
2026-07-31 16:39:16 +08:00
parent e7f9328611
commit fdf8022662
592 changed files with 41318 additions and 1 deletions
+67
View File
@@ -0,0 +1,67 @@
<template>
<div class="ai-analysis">
<el-card class="!border-none" shadow="never">
<el-form ref="formRef" class="mb-[-16px]" :model="queryParams" :inline="true">
<el-form-item class="w-[200px]" label="类型">
<el-select v-model="queryParams.type" clearable placeholder="全部">
<el-option label="赛事预测" :value="1" />
<el-option label="资讯分析" :value="2" />
<el-option label="用户可信度" :value="3" />
<el-option label="彩票分析" :value="4" />
<el-option label="帖子分析" :value="5" />
</el-select>
</el-form-item>
<el-form-item class="w-[200px]" label="状态">
<el-select v-model="queryParams.status" clearable placeholder="全部">
<el-option label="成功" :value="1" />
<el-option label="失败" :value="2" />
<el-option label="处理中" :value="3" />
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="resetPage">查询</el-button>
<el-button @click="resetParams">重置</el-button>
</el-form-item>
</el-form>
</el-card>
<el-card class="!border-none mt-4" shadow="never">
<el-table size="large" v-loading="pager.loading" :data="pager.lists">
<el-table-column label="ID" prop="id" min-width="60" />
<el-table-column label="类型" min-width="100">
<template #default="{ row }">
<el-tag v-if="row.type === 1">赛事预测</el-tag>
<el-tag v-else-if="row.type === 2" type="success">资讯分析</el-tag>
<el-tag v-else-if="row.type === 3" type="warning">用户可信度</el-tag>
<el-tag v-else-if="row.type === 4" type="danger">彩票分析</el-tag>
<el-tag v-else-if="row.type === 5" type="info">帖子分析</el-tag>
</template>
</el-table-column>
<el-table-column label="关联ID" prop="ref_id" min-width="80" />
<el-table-column label="状态" min-width="80">
<template #default="{ row }">
<el-tag v-if="row.status === 1" type="success">成功</el-tag>
<el-tag v-else-if="row.status === 2" type="danger">失败</el-tag>
<el-tag v-else-if="row.status === 3" type="warning">处理中</el-tag>
</template>
</el-table-column>
<el-table-column label="过期时间" prop="expire_time" min-width="140" />
<el-table-column label="创建时间" prop="create_time" min-width="140" />
</el-table>
<div class="flex justify-end mt-4">
<pagination v-model="pager" @change="getLists" />
</div>
</el-card>
</div>
</template>
<script lang="ts" setup name="aiAnalysis">
import { aiAnalysisLists } from '@/api/ai'
import { usePaging } from '@/hooks/usePaging'
const queryParams = reactive({ type: '', status: '' })
const { pager, getLists, resetPage, resetParams } = usePaging({
fetchFun: aiAnalysisLists,
params: queryParams
})
getLists()
</script>
+63
View File
@@ -0,0 +1,63 @@
<template>
<div class="ai-config">
<el-card class="!border-none" shadow="never">
<el-table size="large" v-loading="pager.loading" :data="pager.lists">
<el-table-column label="ID" prop="id" min-width="60" />
<el-table-column label="配置名称" prop="name" min-width="150" />
<el-table-column label="配置值" prop="value" min-width="250" show-overflow-tooltip />
<el-table-column label="备注" prop="remark" min-width="200" show-overflow-tooltip />
<el-table-column label="操作" width="100" fixed="right">
<template #default="{ row }">
<el-button v-perms="['ai.aiConfig/edit']" type="primary" link
@click="handleEdit(row)">编辑</el-button>
</template>
</el-table-column>
</el-table>
<div class="flex justify-end mt-4">
<pagination v-model="pager" @change="getLists" />
</div>
</el-card>
<el-dialog v-model="showEdit" title="编辑配置" :width="isPromptConfig ? '800px' : '600px'">
<el-form ref="editFormRef" :model="editData" label-width="80px">
<el-form-item label="名称">
<el-input v-model="editData.name" disabled />
</el-form-item>
<el-form-item label="备注">
<el-input v-model="editData.remark" placeholder="请输入备注" />
</el-form-item>
<el-form-item label="值">
<el-input v-model="editData.value" type="textarea" :rows="isPromptConfig ? 15 : 4"
placeholder="请输入配置值" />
</el-form-item>
</el-form>
<template #footer>
<el-button @click="showEdit = false">取消</el-button>
<el-button type="primary" @click="handleSubmit">确定</el-button>
</template>
</el-dialog>
</div>
</template>
<script lang="ts" setup name="aiConfig">
import { aiConfigLists, aiConfigEdit } from '@/api/ai'
import { usePaging } from '@/hooks/usePaging'
const { pager, getLists } = usePaging({ fetchFun: aiConfigLists })
const showEdit = ref(false)
const editData = reactive({ id: 0, name: '', value: '', remark: '' })
const isPromptConfig = computed(() => editData.name.includes('prompt'))
const handleEdit = (row: any) => {
Object.assign(editData, { id: row.id, name: row.name, value: row.value, remark: row.remark || '' })
showEdit.value = true
}
const handleSubmit = async () => {
await aiConfigEdit(editData)
showEdit.value = false
getLists()
}
getLists()
</script>
+62
View File
@@ -0,0 +1,62 @@
<template>
<div class="kb-config">
<el-card class="!border-none" shadow="never">
<el-table size="large" v-loading="pager.loading" :data="pager.lists">
<el-table-column label="ID" prop="id" min-width="60" />
<el-table-column label="配置名称" prop="name" min-width="180" />
<el-table-column label="配置值" prop="value" min-width="260" show-overflow-tooltip />
<el-table-column label="备注" prop="remark" min-width="220" show-overflow-tooltip />
<el-table-column label="操作" width="100" fixed="right">
<template #default="{ row }">
<el-button v-perms="['ai.kbConfig/edit']" type="primary" link @click="handleEdit(row)">编辑</el-button>
</template>
</el-table-column>
</el-table>
<div class="flex justify-end mt-4">
<pagination v-model="pager" @change="getLists" />
</div>
</el-card>
<el-dialog v-model="showEdit" title="编辑知识库配置" :width="isPromptConfig ? '800px' : '600px'">
<el-form :model="editData" label-width="90px">
<el-form-item label="名称">
<el-input v-model="editData.name" disabled />
</el-form-item>
<el-form-item label="备注">
<el-input v-model="editData.remark" />
</el-form-item>
<el-form-item label="值">
<el-input v-model="editData.value" type="textarea" :rows="isPromptConfig ? 12 : 4" />
</el-form-item>
</el-form>
<template #footer>
<el-button @click="showEdit = false">取消</el-button>
<el-button type="primary" @click="handleSubmit">确定</el-button>
</template>
</el-dialog>
</div>
</template>
<script lang="ts" setup name="kbConfig">
import { kbConfigEdit, kbConfigLists } from '@/api/ai'
import { usePaging } from '@/hooks/usePaging'
const { pager, getLists } = usePaging({ fetchFun: kbConfigLists })
const showEdit = ref(false)
const editData = reactive({ id: 0, name: '', value: '', remark: '' })
const isPromptConfig = computed(() => editData.name.includes('prompt'))
const handleEdit = (row: any) => {
Object.assign(editData, { id: row.id, name: row.name, value: row.value, remark: row.remark || '' })
showEdit.value = true
}
const handleSubmit = async () => {
await kbConfigEdit(editData)
showEdit.value = false
getLists()
}
getLists()
</script>
+69
View File
@@ -0,0 +1,69 @@
<template>
<div class="kb-document">
<el-card class="!border-none" shadow="never">
<el-form class="mb-[-16px]" :model="queryParams" :inline="true">
<el-form-item class="w-[180px]" label="领域">
<el-select v-model="queryParams.domain" clearable placeholder="全部">
<el-option label="资讯" value="article" />
<el-option label="帖子" value="post" />
<el-option label="彩票" value="lottery" />
</el-select>
</el-form-item>
<el-form-item class="w-[180px]" label="子类型">
<el-select v-model="queryParams.subtype" clearable placeholder="全部">
<el-option label="article" value="article" />
<el-option label="post" value="post" />
<el-option label="draw_result" value="draw_result" />
<el-option label="ai_history" value="ai_history" />
</el-select>
</el-form-item>
<el-form-item class="w-[180px]" label="状态">
<el-select v-model="queryParams.is_active" clearable placeholder="全部">
<el-option label="启用" :value="1" />
<el-option label="停用" :value="0" />
</el-select>
</el-form-item>
<el-form-item class="w-[220px]" label="关键词">
<el-input v-model="queryParams.title" placeholder="标题或关键词" clearable @keyup.enter="resetPage" />
</el-form-item>
<el-form-item>
<el-button type="primary" @click="resetPage">查询</el-button>
<el-button @click="resetParams">重置</el-button>
</el-form-item>
</el-form>
</el-card>
<el-card class="!border-none mt-4" shadow="never">
<el-table size="large" v-loading="pager.loading" :data="pager.lists">
<el-table-column label="ID" prop="id" min-width="80" />
<el-table-column label="领域" prop="domain" min-width="100" />
<el-table-column label="子类型" prop="subtype" min-width="110" />
<el-table-column label="来源ID" prop="source_id" min-width="100" />
<el-table-column label="标题" prop="title" min-width="260" show-overflow-tooltip />
<el-table-column label="关键词" prop="keywords" min-width="220" show-overflow-tooltip />
<el-table-column label="状态" min-width="80">
<template #default="{ row }">
<el-tag :type="row.is_active ? 'success' : 'info'">{{ row.is_active ? '启用' : '停用' }}</el-tag>
</template>
</el-table-column>
<el-table-column label="源更新时间" prop="source_updated_at_text" min-width="160" />
<el-table-column label="更新时间" prop="update_time_text" min-width="160" />
</el-table>
<div class="flex justify-end mt-4">
<pagination v-model="pager" @change="getLists" />
</div>
</el-card>
</div>
</template>
<script lang="ts" setup name="kbDocument">
import { kbDocumentLists } from '@/api/ai'
import { usePaging } from '@/hooks/usePaging'
const queryParams = reactive({ domain: '', subtype: '', is_active: '', title: '' })
const { pager, getLists, resetPage, resetParams } = usePaging({
fetchFun: kbDocumentLists,
params: queryParams
})
getLists()
</script>
+60
View File
@@ -0,0 +1,60 @@
<template>
<div class="kb-query-log">
<el-card class="!border-none" shadow="never">
<el-form class="mb-[-16px]" :model="queryParams" :inline="true">
<el-form-item class="w-[180px]" label="场景">
<el-input v-model="queryParams.scene" placeholder="输入场景名" clearable @keyup.enter="resetPage" />
</el-form-item>
<el-form-item class="w-[160px]" label="用户ID">
<el-input v-model="queryParams.user_id" placeholder="输入用户ID" clearable @keyup.enter="resetPage" />
</el-form-item>
<el-form-item class="w-[160px]" label="状态">
<el-select v-model="queryParams.status" clearable placeholder="全部">
<el-option label="成功" :value="1" />
<el-option label="失败" :value="2" />
</el-select>
</el-form-item>
<el-form-item class="w-[240px]" label="查询词">
<el-input v-model="queryParams.query_text" placeholder="输入查询词" clearable @keyup.enter="resetPage" />
</el-form-item>
<el-form-item>
<el-button type="primary" @click="resetPage">查询</el-button>
<el-button @click="resetParams">重置</el-button>
</el-form-item>
</el-form>
</el-card>
<el-card class="!border-none mt-4" shadow="never">
<el-table size="large" v-loading="pager.loading" :data="pager.lists">
<el-table-column label="ID" prop="id" min-width="70" />
<el-table-column label="场景" prop="scene" min-width="140" />
<el-table-column label="用户ID" prop="user_id" min-width="90" />
<el-table-column label="关联ID" prop="ref_id" min-width="90" />
<el-table-column label="查询词" prop="query_text" min-width="280" show-overflow-tooltip />
<el-table-column label="Token" prop="tokens_used" min-width="80" />
<el-table-column label="耗时(ms)" prop="cost_ms" min-width="90" />
<el-table-column label="状态" min-width="80">
<template #default="{ row }">
<el-tag :type="row.status === 1 ? 'success' : 'danger'">{{ row.status === 1 ? '成功' : '失败' }}</el-tag>
</template>
</el-table-column>
<el-table-column label="创建时间" prop="create_time_text" min-width="160" />
</el-table>
<div class="flex justify-end mt-4">
<pagination v-model="pager" @change="getLists" />
</div>
</el-card>
</div>
</template>
<script lang="ts" setup name="kbQueryLog">
import { kbQueryLogLists } from '@/api/ai'
import { usePaging } from '@/hooks/usePaging'
const queryParams = reactive({ scene: '', status: '', user_id: '', query_text: '' })
const { pager, getLists, resetPage, resetParams } = usePaging({
fetchFun: kbQueryLogLists,
params: queryParams
})
getLists()
</script>
+92
View File
@@ -0,0 +1,92 @@
<template>
<div class="kb-sync-job">
<el-card class="!border-none" shadow="never">
<div class="flex justify-between gap-4 flex-wrap">
<el-form class="mb-[-16px]" :model="queryParams" :inline="true">
<el-form-item class="w-[160px]" label="领域">
<el-select v-model="queryParams.domain" clearable placeholder="全部">
<el-option label="资讯" value="article" />
<el-option label="帖子" value="post" />
<el-option label="彩票" value="lottery" />
</el-select>
</el-form-item>
<el-form-item class="w-[160px]" label="动作">
<el-select v-model="queryParams.action" clearable placeholder="全部">
<el-option label="upsert" value="upsert" />
<el-option label="delete" value="delete" />
<el-option label="rebuild" value="rebuild" />
</el-select>
</el-form-item>
<el-form-item class="w-[160px]" label="状态">
<el-select v-model="queryParams.status" clearable placeholder="全部">
<el-option label="待处理" :value="0" />
<el-option label="处理中" :value="1" />
<el-option label="成功" :value="2" />
<el-option label="失败" :value="3" />
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="resetPage">查询</el-button>
<el-button @click="resetParams">重置</el-button>
</el-form-item>
</el-form>
<div class="flex gap-2">
<el-button v-perms="['ai.kbSyncJob/rebuild']" @click="runRebuild('article')">重建资讯</el-button>
<el-button v-perms="['ai.kbSyncJob/rebuild']" @click="runRebuild('post')">重建帖子</el-button>
<el-button v-perms="['ai.kbSyncJob/rebuild']" @click="runRebuild('lottery')">重建彩票</el-button>
<el-button v-perms="['ai.kbSyncJob/rebuild']" type="primary" @click="runRebuild('all')">全量重建</el-button>
</div>
</div>
</el-card>
<el-card class="!border-none mt-4" shadow="never">
<el-table size="large" v-loading="pager.loading" :data="pager.lists">
<el-table-column label="ID" prop="id" min-width="80" />
<el-table-column label="领域" prop="domain" min-width="90" />
<el-table-column label="子类型" prop="subtype" min-width="110" />
<el-table-column label="来源ID" prop="source_id" min-width="100" />
<el-table-column label="动作" prop="action" min-width="90" />
<el-table-column label="优先级" prop="priority" min-width="80" />
<el-table-column label="状态" min-width="80">
<template #default="{ row }">
<el-tag :type="statusTag(row.status)">{{ statusText(row.status) }}</el-tag>
</template>
</el-table-column>
<el-table-column label="重试次数" prop="retry_count" min-width="90" />
<el-table-column label="计划时间" prop="scheduled_at_text" min-width="160" />
<el-table-column label="处理时间" prop="processed_at_text" min-width="160" />
<el-table-column label="错误信息" prop="error_msg" min-width="260" show-overflow-tooltip />
</el-table>
<div class="flex justify-end mt-4">
<pagination v-model="pager" @change="getLists" />
</div>
</el-card>
</div>
</template>
<script lang="ts" setup name="kbSyncJob">
import { ElMessage } from 'element-plus'
import { kbSyncJobLists, kbSyncJobRebuild } from '@/api/ai'
import { usePaging } from '@/hooks/usePaging'
const queryParams = reactive({ domain: '', action: '', status: '' })
const { pager, getLists, resetPage, resetParams } = usePaging({
fetchFun: kbSyncJobLists,
params: queryParams
})
const runRebuild = async (domain: string) => {
await kbSyncJobRebuild({ domain })
ElMessage.success('已触发重建任务')
getLists()
}
const statusText = (status: number) => {
return ['待处理', '处理中', '成功', '失败'][status] || String(status)
}
const statusTag = (status: number) => {
return ['info', 'warning', 'success', 'danger'][status] || 'info'
}
getLists()
</script>
+59
View File
@@ -0,0 +1,59 @@
<template>
<div class="ai-log">
<el-card class="!border-none" shadow="never">
<el-form ref="formRef" class="mb-[-16px]" :model="queryParams" :inline="true">
<el-form-item class="w-[200px]" label="用户ID">
<el-input v-model="queryParams.user_id" placeholder="输入用户ID" clearable @keyup.enter="resetPage" />
</el-form-item>
<el-form-item>
<el-button type="primary" @click="resetPage">查询</el-button>
<el-button @click="resetParams">重置</el-button>
</el-form-item>
</el-form>
</el-card>
<el-card class="!border-none mt-4" shadow="never">
<el-table size="large" v-loading="pager.loading" :data="pager.lists">
<el-table-column label="ID" prop="id" min-width="60" />
<el-table-column label="用户ID" prop="user_id" min-width="80" />
<el-table-column label="类型" min-width="100">
<template #default="{ row }">
<el-tag v-if="row.type === 1">赛事预测</el-tag>
<el-tag v-else-if="row.type === 2" type="success">资讯分析</el-tag>
<el-tag v-else-if="row.type === 3" type="warning">用户可信度</el-tag>
<el-tag v-else-if="row.type === 4" type="danger">彩票分析</el-tag>
<el-tag v-else-if="row.type === 5" type="info">帖子分析</el-tag>
<el-tag v-else-if="row.type === 6" type="warning">知识库检索</el-tag>
<el-tag v-else-if="row.type === 7" type="success">助手对话</el-tag>
<el-tag v-else type="info">{{ row.type }}</el-tag>
</template>
</el-table-column>
<el-table-column label="关联ID" prop="ref_id" min-width="80" />
<el-table-column label="Token消耗" prop="tokens_used" min-width="100" />
<el-table-column label="耗时(ms)" prop="cost_ms" min-width="100" />
<el-table-column label="状态" min-width="80">
<template #default="{ row }">
<el-tag v-if="row.status === 1" type="success">成功</el-tag>
<el-tag v-else-if="row.status === 2" type="danger">失败</el-tag>
<el-tag v-else type="warning">{{ row.status }}</el-tag>
</template>
</el-table-column>
<el-table-column label="创建时间" prop="create_time" min-width="150" />
</el-table>
<div class="flex justify-end mt-4">
<pagination v-model="pager" @change="getLists" />
</div>
</el-card>
</div>
</template>
<script lang="ts" setup name="aiLog">
import { aiLogLists } from '@/api/ai'
import { usePaging } from '@/hooks/usePaging'
const queryParams = reactive({ user_id: '' })
const { pager, getLists, resetPage, resetParams } = usePaging({
fetchFun: aiLogLists,
params: queryParams
})
getLists()
</script>