fix:添加模型配置页面

This commit is contained in:
lz-ui 2025-10-13 16:36:01 +08:00
parent dfff5b4dbf
commit 17121c94f1
5 changed files with 127 additions and 154 deletions

28
src/api/tc/model.js Normal file
View File

@ -0,0 +1,28 @@
import request from '@/utils/request'
/** 模型列表*/
export function modelList() {
return request({
url: `/model/config/modelList`,
method: 'get'
})
}
/** 模型配置列表*/
export function modelConfigList(data) {
return request({
url: '/model/config/list',
method: 'post',
data: data
})
}
/** 模型配置保存*/
export function modelConfigUpdate(data) {
return request({
url: '/model/config/update',
method: 'post',
data: data
})
}

View File

@ -84,7 +84,7 @@ service.interceptors.response.use(res => {
if (code === 401) {
if (!isRelogin.show) {
isRelogin.show = true
ElMessageBox.confirm('登录状态已过期,您可以继续留在该页面,或者重新登录', '系统提示', { confirmButtonText: '重新登录', cancelButtonText: '取消', type: 'warning' }).then(() => {
ElMessageBox.confirm('登录状态已过期,您可以继续留在该页面,或者重新登录', '系统提示', { confirmButtonText: '重新登录', cancelButtonText: '取消', type: 'warning', closeOnClickModal: false }).then(() => {
isRelogin.show = false
useUserStore().logOut().then(() => {
location.href = '/'

View File

@ -2,8 +2,8 @@
<div class="app-container">
<!-- 搜索区域 -->
<el-form :model="queryParams" ref="queryRef" v-show="showSearch" :inline="true" label-width="80px">
<el-form-item label="名称" prop="matchNumStr">
<el-input v-model="queryParams.matchNumStr" placeholder="请输入名称" clearable style="width: 240px"
<el-form-item label="模型名称" prop="useCase">
<el-input v-model="queryParams.useCase" placeholder="请输入名称" clearable style="width: 240px"
@keyup.enter="handleQuery" />
</el-form-item>
<el-form-item>
@ -12,36 +12,21 @@
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button type="primary" plain icon="Plus" @click="openDialog('add')">新增</el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList" :columns="columns"></right-toolbar>
</el-row>
<!--loading-->
<div v-if="loading" v-loading="loading" class="loading-page" element-loading-text="正在加载..."
style="width: 100%; height: calc(100vh - 250px)"></div>
<div v-else-if="pageList.length && !loading">
<!-- 表格数据 -->
<el-table v-loading="loading" :data="pageList">
<el-table-column label="名称" prop="matchNumStr" />
<el-table-column label="类型" prop="leagueAllName" :show-overflow-tooltip="true" />
<el-table-column label="模型" prop="homeTeamAllName" :show-overflow-tooltip="true" />
<el-table-column label="状态" align="center" prop="reportSatus">
<template #default="scope">
<el-switch
v-model="scope.row.reportSatus"
:active-value="0"
:inactive-value="1"
@change="handleStatusChange(scope.row)"
></el-switch>
</template>
</el-table-column>
<el-table-column label="模型名称" prop="useCase" />
<el-table-column label="模型类型" prop="modelType" />
<el-table-column label="模型" prop="modelName" />
<el-table-column label="API密钥" prop="apiKey" :show-overflow-tooltip="true" />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template #default="scope">
<el-tooltip content="编辑" placement="top" v-if="scope.row.reportSatus === 1">
<el-button link type="primary" icon="Edit" @click="openDialog('edit', scope.row)">编辑</el-button>
<el-tooltip content="编辑" placement="top">
<el-button link type="primary" icon="Edit"
@click="openDialog('edit', scope.row)">编辑</el-button>
</el-tooltip>
</template>
</el-table-column>
@ -57,51 +42,38 @@
<!-- 添加或修改对话框 -->
<el-dialog :title="dialogTitle" v-model="dialogOpen" width="600px" append-to-body :close-on-click-modal="false" @close="cancel">
<el-dialog :title="dialogTitle" v-model="dialogOpen" width="600px" append-to-body :close-on-click-modal="false"
@close="cancel">
<el-form :model="dialogForm" :rules="dialogRules" ref="configModelsRef" label-width="80px">
<el-row>
<el-col :span="24">
<el-form-item label="名称" prop="nickName">
<el-input v-model="dialogForm.nickName" placeholder="请输入名称" maxlength="30" />
<el-form-item label="模型名称" prop="useCase">
<el-input v-model="dialogForm.useCase" disabled="true" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="类型" prop="types">
<el-select v-model="dialogForm.types" placeholder="请选择">
<el-option key="zuqiu" label="足球(竞彩)" value="zuqiu" />
<el-option key="lanqiu" label="篮球(竞彩)" value="lanqiu" />
<el-option key="zuqiuremen" label="足球(热门)" value="zuqiuremen" />
<el-option key="yingxiao" label="营销专用" value="yingxiao" />
<el-form-item label="模型" prop="modelId">
<el-select v-model="dialogForm.modelId" placeholder="请选择模型" @change="handleModelChange">
<el-option v-for="item in modelsOptions" :key="item.id" :label="item.modelName" :value="item.id" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="模型" prop="models">
<el-select v-model="dialogForm.models">
<template #label="{ value }">
<div class="flex align-center">
<span v-html="modelToIcon" style="width: 13px;" class="mr-8 flex align-center"></span>
{{ modelToName }}
</div>
</template>
<el-option v-for="model in EnumsModels" :key="model.name" :value="model.key" :label="model.name">
<div class="flex align-center">
<span v-html="model.icon" style="width: 13px;" class="mr-8 flex align-center"></span>
{{ model.name }}
</div>
</el-option>
</el-select>
<el-form-item label="API密钥" prop="apiKey">
<el-input v-model="dialogForm.apiKey" type="textarea" placeholder="请输入API密钥"
rows="4"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="提示词" prop="remark">
<el-input v-model="dialogForm.remark" type="textarea" placeholder="请输入内容" rows="12"></el-input>
<el-form-item label="提示词" prop="modelPrompt">
<el-input v-model="dialogForm.modelPrompt" type="textarea" placeholder="请输入内容"
:rows="12"></el-input>
</el-form-item>
</el-col>
</el-row>
@ -117,74 +89,86 @@
</template>
<script setup name="configModels">
import { Info, infoSelectDistinctLeagueAbbNames } from "@/api/tc/eventAnalysisReport"
import { jumpLink, processMatchResults } from "@/utils/tc"
import { EnumsModels } from "@/enums/tc"
import { modelList, modelConfigList, modelConfigUpdate } from "@/api/tc/model"
import { ref } from "vue"
const router = useRouter()
const { proxy } = getCurrentInstance()
const pageList = ref([])
const loading = ref(false)
const showSearch = ref(true)
const total = ref(0)
const dateRange = ref([])
const modelsOptions = ref([])
/** 配置模型表单引用 */
const configModelsRef = ref(null)
const dialogOpen = ref(false)
const dialogTitle = ref('新增')
const dialogForm = ref({
nickName: '',
models: '',
remark: '',
types: '',
useCase: '',
modelId: '',
modelName: '',
modelPrompt: '',
apiKey: '',
})
const dialogRules = ref({
nickName: [{ required: true, message: '请输入名称', trigger: ['blur'] }],
types: [{ required: true, message: '请选择类型', trigger: ['change'] }],
models: [{ required: true, message: '请选择模型', trigger: ['change'] }],
remark: [{ required: true, message: '请输入提示词', trigger: ['blur'] }],
modelId: [{ required: true, message: '请选择模型', trigger: ['change'] }],
modelPrompt: [{ required: true, message: '请输入提示词', trigger: ['blur'] }],
apiKey: [{ required: true, message: '请输入API密钥', trigger: ['blur'] }],
})
/** 数据范围选项*/
const dataScopeOptions = ref([])
const data = reactive({
form: {},
queryParams: {
pageNum: 1,
pageSize: 10,
matchNumStr: undefined,
leagueAbbName: undefined,
useCase: undefined,
},
rules: {},
})
const { queryParams } = toRefs(data)
/** 查询模型列表 */
function getModelList() {
modelList().then(res => {
modelsOptions.value = res.rows
})
}
/** 解析模型icon图标 */
const modelToIcon = computed(() => {
return EnumsModels.find((item) => item.key === dialogForm.value.models).icon
})
/** 解析模型名称 */
const modelToName = computed(() => {
return EnumsModels.find((item) => item.key === dialogForm.value.models).name
})
/** 模型选择 */
function handleModelChange() {
dialogForm.value.modelName = modelsOptions.value.find(item => item.id === dialogForm.value.modelId)?.modelName || ''
}
/** 提交表单 */
function submitForm() {
// const data = configModelsRef.value.getFormData()
// reportUpdate(data).then(response => {
// proxy.$message.success(response.msg)
// getList()
// }).finally(() => {
// dialogOpen.value = false
// })
//
configModelsRef.value.validate((valid) => {
if (valid) {
const data = { ...dialogForm.value }; //
console.log(data);
const params = {
id: data.id,
modelId: data.modelId,
modelName: data.modelName,
modelPrompt: data.modelPrompt,
apiKey: data.apiKey,
}
//
modelConfigUpdate(params).then(response => {
proxy.$message.success(response.msg);
getList(); //
}).finally(() => {
dialogOpen.value = false; //
reset()
});
} else {
console.log('表单验证失败');
}
});
}
/** 取消按钮 */
@ -196,9 +180,11 @@ function cancel() {
/** 重置操作表单 */
function reset() {
dialogForm.value = {
nickName: undefined,
models: undefined,
remark: undefined
useCase: '',
modelId: '',
modelName: '',
modelPrompt: '',
apiKey: '',
}
proxy.resetForm("configModelsRef")
}
@ -213,61 +199,12 @@ function openDialog(type = 'add', row = {}) {
}
dialogOpen.value = true
}
/** 状态修改 */
function handleStatusChange(row) {
let text = row.reportSatus === 0 ? "启用" : "停用"
proxy.$modal.confirm('确认要"' + text + '"吗?').then(function () {
return true
}).then(() => {
proxy.$modal.msgSuccess(text + "成功")
}).catch(function () {
row.status = row.status === 0 ? 1 : 0
})
}
/** 获取联赛类型 */
function getLeagueAbbNames() {
infoSelectDistinctLeagueAbbNames().then(response => {
dataScopeOptions.value = response.rows ? response.rows.map(item => ({ value: item, label: item })) : []
})
}
/** 跳转链接 */
// function handleJumpLink(row) {
// jumpLink(row.matchId, 1)
// }
// /** */
// function handleView(row) {
// if (row.reportSatus != 1) {
// return
// }
// // window.open(window.location.origin + '/#/tc/eventAnalysisReport/detail?id=' + row.matchId)
// router.push({
// path: '/tc/eventAnalysisReport/detail',
// query: {
// id: row.matchId
// }
// })
// }
/** 查询列表 */
function getList() {
loading.value = true
const data = { ...queryParams.value }
if (dateRange.value && dateRange.value[0] && dateRange.value[1]) {
data.beginTime = dateRange.value[0]
data.endTime = dateRange.value[1]
} else {
data.beginTime = undefined
data.endTime = undefined
}
Info(data).then(response => {
const res = response.rows.map(item => ({
...item,
matchResults: item.matchResults ? processMatchResults(item.matchResults) : null
}));
modelConfigList(data).then(response => {
const res = response.rows;
pageList.value = res
total.value = response.total
}).finally(() => {
@ -283,14 +220,13 @@ function handleQuery() {
/** 重置按钮操作 */
function resetQuery() {
dateRange.value = []
proxy.resetForm("queryRef")
handleQuery()
}
onMounted(() => {
//
getLeagueAbbNames()
//
getModelList()
//
getList()
})

View File

@ -56,10 +56,14 @@
</el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template #default="scope">
<span :class="['flex-row cursor-pointer tc-view-time', scope.row.reportSatus != 1 && 'tc-view-time-disabled']" @click="handleView(scope.row)">
<span :class="['flex-row cursor-pointer tc-view-time mr-8', scope.row.reportSatus != 1 && 'tc-view-time-disabled']" @click="handleView(scope.row)">
脚本结果<br/>
{{ scope.row.reportSatus === 1? timerToStr(scope.row.reportTime, 'HH:mm') : '待' }}更新
</span>
<span :class="['flex-row cursor-pointer tc-view-time', scope.row.reportSatus != 1 && 'tc-view-time-disabled']" @click="handleView(scope.row)">
营销文案<br/>
{{ scope.row.reportSatus === 1? timerToStr(scope.row.reportTime, 'HH:mm') : '待' }}更新
</span>
<!-- <el-tooltip content="查看" placement="top" v-if="scope.row.roleId !== 1">
<el-button link type="primary" icon="view" @click="handleView(scope.row)"></el-button>
</el-tooltip> -->

View File

@ -59,10 +59,15 @@
</el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template #default="scope">
<span :class="['flex-row cursor-pointer tc-view-time', scope.row.reportSatus != 1 && 'tc-view-time-disabled']" @click="handleView(scope.row)">
<span :class="['flex-row cursor-pointer tc-view-time mr-8', scope.row.reportSatus != 1 && 'tc-view-time-disabled']" @click="handleView(scope.row)">
脚本结果<br/>
{{ scope.row.reportSatus === 1? timerToStr(scope.row.reportTime, 'HH:mm') : '待' }}更新
</span>
<span :class="['flex-row cursor-pointer tc-view-time', scope.row.reportSatus != 1 && 'tc-view-time-disabled']" @click="handleView(scope.row)">
营销文案<br/>
{{ scope.row.reportSatus === 1? timerToStr(scope.row.reportTime, 'HH:mm') : '待' }}更新
</span>
<!-- <el-tooltip content="查看" placement="top" v-if="scope.row.roleId !== 1">
<el-button link type="primary" icon="view" @click="handleView(scope.row)"></el-button>
</el-tooltip> -->