update code

main
lj7788 2024-11-06 22:13:10 +08:00
parent d80cc2b84a
commit 682cf2a917
11 changed files with 920 additions and 14 deletions

View File

@ -47,6 +47,19 @@ class MenuAPI {
alwaysShow: false,
},
},
{
path: "editModel",
component: "model/editModel",
name: "editModel",
meta: {
title: "更新模型",
icon: "user",
hidden: true,
roles: ["ADMIN", "GUEST"],
keepAlive: true,
alwaysShow: false,
},
},
{
path: "modelDetail",
component: "model/modelDetail",
@ -194,6 +207,19 @@ class MenuAPI {
alwaysShow: false,
},
},
{
path: "taskDesc",
component: "simulationEvaluation/taskDesc",
name: "simulationEvaluationTaskDesc",
meta: {
title: "任务详情",
icon: "oper",
hidden: true,
roles: ["ADMIN", "GUEST"],
keepAlive: true,
alwaysShow: false,
},
},
{
path: "execution",
component: "simulationEvaluation/execution",

View File

@ -62,6 +62,16 @@ const upload = (file) => {
},
});
}
const updateModel=(data)=>{
return request({
url: `/models/${data.id}/files`,
method: "put",
data:{
file_name:data.fileName,
modl_file_type:data.fileType
}
});
}
export default {
list,
add,
@ -69,5 +79,6 @@ export default {
findOne,
adaptOperators,
download,
upload
upload,
updateModel
}

View File

@ -31,6 +31,15 @@ const addTask = (data) => {
})
}
//创建推理任务
const deleteTask = (id) => {
return request({
url: '/tasks/'+id,
method: 'delete'
})
}
//创建推理任务
const stopTask = (id) => {
return request({
@ -41,10 +50,33 @@ const stopTask = (id) => {
}
})
}
const taskDetail=id=>{
return request({
url: '/tasks/'+id,
method: 'get'
})
}
const taskResults=id=>{
return request({
url: '/tasks/'+id+'/results',
method: 'get'
})
}
const taskImage=(id,fileName)=>{
return request({
url: '/tasks/'+id+'/results/'+fileName,
method: 'get'
})
}
export default {
tasks,
availableDevices,
running,
addTask,
stopTask
stopTask,
taskDetail,
taskResults,
deleteTask,
taskImage
}

View File

@ -0,0 +1 @@
<svg class="icon" style="width: 1em;height: 1em;vertical-align: middle;fill: currentColor;overflow: hidden;" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="8029"><path d="M560.697 472.022a23 23 0 0 1 13.27 4.214L820.026 650.05c10.375 7.33 12.844 21.681 5.515 32.056a23 23 0 0 1-5.1 5.215L574.383 869.495c-10.21 7.559-24.613 5.41-32.171-4.799a23 23 0 0 1-4.515-13.686V733.816h-201.16c-143.36 0.815-221.206-70.034-233.537-212.546 12.457 13.043 66.902 90 233.537 90 111.09 0 178.144-1.277 201.16-3.828v-112.42c0-12.703 10.297-23 23-23zM406.788 119.304a23 23 0 0 1 4.515 13.686v117.194h201.16c143.36-0.815 221.206 70.034 233.537 212.546-12.457-13.043-66.902-90-233.537-90-111.09 0-178.144 1.277-201.16 3.828v112.42c0 12.703-10.297 23-23 23a23 23 0 0 1-13.27-4.214L128.974 333.95c-10.375-7.33-12.844-21.681-5.515-32.056a23 23 0 0 1 5.1-5.215l246.058-182.173c10.21-7.559 24.613-5.41 32.171 4.799z" p-id="8030"></path></svg>

After

Width:  |  Height:  |  Size: 950 B

BIN
src/assets/img.png 100644

Binary file not shown.

After

Width:  |  Height:  |  Size: 677 B

View File

@ -0,0 +1,242 @@
<template>
<div class="app-container edit-model">
<el-card>
<template #header>
<svg-icon icon-class="pause" style="width:20px;height:20px;" />
模型基本信息 - 更新模型</template>
<table style="width:100%" class="tb-base-info">
<tr>
<td style="width: 50%;">
<span class="sp-title">模型名称:</span>
<span class="sp-text">{{ data.info.model_name }}</span>
</td>
<td style="width: 50%;">
<span class="sp-title">模型类型:</span>
<span class="sp-text">{{ data.info.modl_main_type_name }}
/{{ data.info.modl_sub_type_name }}
</span>
</td>
</tr>
<tr>
<td style="width: 50%;">
<span class="sp-title">模型版本:</span>
<span class="sp-text">
{{ data.info.model_version }}
</span>
</td>
<td style="width: 50%;">
<span class="sp-title">版本描述:</span>
<span class="sp-text">
{{ data.info.model_desc }}
</span>
</td>
</tr>
<tr>
<td style="width: 50%;">
<span class="sp-title">模型网络:</span>
<span class="sp-text">
{{ data.info.model_net_type }}
</span>
</td>
<td style="width: 50%;">
<span class="sp-title">上传用户:</span>
<span class="sp-text"> {{ data.info.user_name }}</span>
</td>
</tr>
<tr>
<td style="width: 50%;">
<span class="sp-title">算法框架:</span>
<span class="sp-text">
{{ data.info.modl_framework }}
</span>
</td>
<td style="width: 50%;">
<span class="sp-title">上传时间:</span>
<span class="sp-text">
{{ data.info.create_time }}
</span>
</td>
</tr>
<tr>
<td colspan="2" style="width: 100%;">
<el-form ref="uploadForm" :rules="upRules" :model="upForm" label-width="120">
<el-form-item label="网络参数" prop="model_file_list">
<el-upload ref="uploadRef1" class="uploadFile1" :action="fileUpload" :data="upModelData"
:headers="uploadHeaders" :before-upload="handleBeforeUploadModel"
:on-success="handleUploadModelSuccess" :on-error="handleUploadModelFail"
:on-remove="handleFileRemove" :on-exceed="handleFileExceed"
:auto-upload-demo="false" :limit="1" accept=".onnx,.ts">
<el-button type="primary"><el-icon class="el-icon--upload"> <i-ep-upload-filled />
</el-icon></el-button>
<template #tip>
<div class="el-upload__tip">
请上传大小不超过<span style="color:coral">500M</span>,格式为<span
style="color:coral">onnx/ts</span>的文件
</div>
</template>
</el-upload>
</el-form-item>
</el-form>
</td>
</tr>
</table>
</el-card>
<el-card class="card-footer">
<el-button type="primary" @click="doSave"></el-button>
<el-button @click="doBack"></el-button>
</el-card>
</div>
</template>
<script setup>
import ModelApi from '@/api/models'
import { TOKEN_KEY } from "@/enums/CacheEnum";
const router = useRouter();
const route = useRoute()
const data = reactive({
info: {}
});
let listOpt = reactive({
upFiles: []
});
let fileUpload = ref(import.meta.env.VITE_APP_BASE_API + "/models/upload");
let uploadHeaders = ref({
Authorization: localStorage.getItem(TOKEN_KEY)
})
let upModelData = reactive({
file_name: '',
file_content: null
});
const uploadForm = ref(ElForm)
let upForm = reactive({
model_file_list: [
]
})
function handleFileExceed() {
ElMessage.warning("超过上传上限!");
}
function handleBeforeUploadModel(file, b, c) {
if (file.size > 500 * 1024 * 1024) {
ElMessage.warning("文件大小不能超500M");
file.onError("文件大小不能超500M")
return false;
}
let ext = file.name.split(".").pop().toLowerCase();
if (["onnx", "ts"].indexOf(ext) == -1) {
ElMessage.warning("请上传onnx/ts格式文件");
file.onError("请上传onnx/ts格式文件")
return false;
}
upModelData.file_name = file.name;
upModelData.file_content = file;
}
function handleUploadModelSuccess(res) {
if (res.code == 0) {
listOpt.upFiles.push({
name: res.data.file_name,
serverName: res.data.file_name
})
upForm.model_file_list = listOpt.upFiles.map(it => it.serverName);
} else {
ElMessage.error("上传失败," + res.message);
uploadRef1.value.clearFiles();
}
}
function handleFileRemove(a, b, c) {
let tmps = listOpt.upFiles.filter(d => d.name == a.name);
if (tmps.length > 0) {
let idx = listOpt.upFiles.indexOf(tmps[0]);
listOpt.upFiles.splice(idx, 1);
}
upForm.model_file_list = listOpt.upFiles.map(it => it.serverName);
}
function handleUploadModelFail(res) {
uploadRef1.value.clearFiles();
}
const upRules = computed(() => {
return {
model_file_list: [{ required: true, trigger: "blur", message: "请上传网络参数", }],
}
});
const doSave = () => {
uploadForm.value?.validate((valid) => {
if (valid) {
let id = route.query.id;
let name=listOpt.upFiles[0].name;
let data={
id:id,
fileName:name,
fileType:name.split(".").pop()
}
ModelApi.updateModel(data).then(d=>{
if(d.data?.code==0){
ElMessage.success("更新模型成功!");
setTimeout(()=>{
doBack();
},1000);
}else{
ElMessage.error("更新模型失败!");
}
});
}
}
);
}
const doBack = () => {
router.push({ path: "/modelMgr/index" })
}
const initData = () => {
let id = route.query.id;
ModelApi.findOne(id).then(d => {
data.info = d.data.data;
});
}
onMounted(() => {
initData();
})
</script>
<style lang="scss" scoped>
.tb-base-info {
line-height: 30px;
:deep(span) {
font-size: 14px;
}
}
.edit-model {
:deep(.el-card__header) {
padding: 8px 4px;
display: flex;
align-items: center
}
}
.card-footer {
position: fixed;
width: calc(100% - 215px);
bottom: 0px;
:deep(.el-card__body) {
padding: 10px;
.el-pagination {
justify-content: end;
}
}
}
</style>

View File

@ -27,11 +27,12 @@
<el-table-column label="说明" width="300" align="left" prop="model_desc" />
<el-table-column label="上传时间" width="120" align="left" prop="create_time" />
<el-table-column label="上传用户" width="100" align="left" prop="user_name" />
<el-table-column label="操作" fixed="right" width="250">
<el-table-column label="操作" fixed="right" width="350">
<template #default="scope">
<el-button text type="primary" size="small"
@click="doShowModelDetail(scope.row)"><i-ep-edit />查看</el-button>
@click="doShowModelDetail(scope.row)"><i-ep-edit />查看</el-button>
<el-button text type="primary" size="small" @click="doconnection()" v-if="!isV2"><i-ep-link />互联</el-button>
<el-button text type="primary" size="small" @click="updateModel(scope.row)" v-if="!isV2"> <svg-icon icon-class="update" />更新模型</el-button>
<el-button text type="primary" size="small" @click="handleDelete(scope.row)" v-if="!isV2"><i-ep-delete />删除</el-button>
</template>
</el-table-column>
@ -91,6 +92,10 @@ function doconnection() {
router.push({ path: "/connection/index" });
}
/**更新模型 **/
function updateModel(row){
router.push({ path: "/modelMgr/editModel",query:{id:row.model_id} });
}
/** 重置查询 */
function resetQuery() {
queryFormRef.value.resetFields();

View File

@ -125,6 +125,7 @@
<script setup>
import choiceTaskDlg from './components/choiceTaskDlg.vue'
import ReportApi from '@/api/report'
import OperatorApi from '@/api/operator'
const router = useRouter();
const info = reactive({
tableData: [],
@ -135,6 +136,7 @@ const info = reactive({
lvl2: [],
},
choiceType: '',
opId:null,
})
const loading=ref(false);
@ -186,6 +188,9 @@ function doMakeReport(){
};
}
ReportApi.addReport(postData).then(d=>{
debugger
//info.opId=d.data.op_id;
//loadOpLog();
loading.value = false;
let reportId=d.data?.data?.report_id||'';
if(reportId){
@ -196,6 +201,11 @@ function doMakeReport(){
}
});
}
const loadOpLog=()=>{
OperatorApi.findOne(id).then(d=>{
debugger
})
}
//
function doDelete(row) {
info.tableData = [];

View File

@ -23,10 +23,10 @@
<el-table-column label="模型网络" align="left" prop="modl_net_type" />
<el-table-column label="创建时间" align="left" prop="create_time" width="160" />
<el-table-column label="完成时间" align="left" prop="finish_time" width="160" />
<el-table-column label="操作" fixed="right" align="center" width="200" v-if="1==2">
<el-table-column label="操作" fixed="right" align="center" width="200">
<template #default="scope">
<el-button text type="primary" size="small" @click="doShowDetail(scope.row)"><i-ep-view />查看报告</el-button>
<el-button text type="primary" v-if="1 == 2" size="small"
<el-button text type="primary" size="small" @click="doShowDetail(scope.row)"><i-ep-view />查看任务</el-button>
<el-button text type="primary" size="small"
@click="doDelete(scope.row)"><i-ep-close-bold />删除</el-button>
</template>
</el-table-column>
@ -67,16 +67,18 @@ const doDelete = (row) => {
type: "warning",
}).then(function () {
let idx = tableData.indexOf(row);
if (idx >= 0) {
tableData.splice(idx, 1);
ElMessage.success("删除成功");
}
TaskApi.deleteTask(row.task_id).then(d=>{
if(d.data.code==0){
ElMessage.success("删除成功");
loadData();
}else{
ElMessage.error("删除失败!");
}
});
});
}
const doShowDetail = row => {
router.push({ path: "/simulationEvaluation/taskDesc", query: { ...row } });
router.push({ path: "/simulationEvaluation/taskDesc", query: {id:row.task_id } });
}
const loadData = () => {
loading.value = true;

View File

@ -0,0 +1,241 @@
<template>
<div class="app-container task-detail">
<el-card>
<template #header>
<svg-icon icon-class="pause" style="width:20px;height:20px;" />
任务详情</template>
<table style="width:100%" class="tb-base-info">
<tr>
<td style="width: 50%;">
<span class="sp-title">任务名称:</span>
<span class="sp-text">{{ data.taskInfo.task_name }}</span>
</td>
<td style="width: 50%;">
<span class="sp-title">任务说明:</span>
<span class="sp-text">{{ data.taskInfo.task_desc }}
</span>
</td>
</tr>
<tr>
<td style="width: 50%;">
<span class="sp-title">互联名称:</span>
<span class="sp-text">
{{ data.taskInfo.connection_name }}
</span>
</td>
<td style="width: 50%;">
<span class="sp-title">互联说明:</span>
<span class="sp-text">
{{ data.taskInfo.connection_desc }}
</span>
</td>
</tr>
<tr>
<td style="width: 50%;">
<span class="sp-title">数据集:</span>
<span class="sp-text">
{{ data.taskInfo.dataset_name }}
</span>
</td>
<td style="width: 50%;">
<span class="sp-title">图像数量:</span>
<span class="sp-text"> {{ data.taskInfo.image_count }}</span>
</td>
</tr>
<tr>
<td style="width: 50%;">
<span class="sp-title">运行模型:</span>
<span class="sp-text">
{{ data.taskInfo.model_name }}
</span>
</td>
<td style="width: 50%;">
<span class="sp-title">模型网络:</span>
<span class="sp-text">
{{ data.taskInfo.modl_net_type }}
</span>
</td>
</tr>
<tr>
<td style="width: 50%;">
<span class="sp-title">设备名称:</span>
<span class="sp-text">
{{ data.taskInfo.device_name }}
</span>
</td>
</tr>
<tr>
<td style="width: 50%;">
<span class="sp-title">开始时间:</span>
<span class="sp-text">
{{ data.taskInfo.create_time }}
</span>
</td>
<td style="width: 50%;">
<span class="sp-title">结束时间:</span>
<span class="sp-text">
{{ data.taskInfo.finish_time }}
</span>
</td>
</tr>
</table>
</el-card>
<el-card style="margin-top: 20px;" class="image-list">
<template #header>
<svg-icon icon-class="pause" style="width:20px;height:20px;" />
结果集图像列表({{ data.imageList.length }})</template>
<el-upload v-model:file-list="data.imageList" class="upload-demo upload-demo-2"
:on-preview="handlePreview" />
<el-empty v-if="data.imageList.length == 0" description="暂 无 数 据" />
</el-card>
<div class="demo-image__preview">
<el-image class="imgPreView" :src="imgPreSrc" :zoom-rate="1.2" :max-scale="7" :min-scale="0.2"
:preview-src-list="imgPreSrcList" :initial-index="4" style="width: 1px; height: 1px" fit="cover" />
</div>
<el-card class="card-footer">
<el-button type="primary" @click="doDelete"></el-button>
<el-button @click="doBack"></el-button>
</el-card>
</div>
</template>
<script setup>
import task from '@/api/task';
import DataSetApi from "@/api/dataSet";
const router = useRouter();
const route = useRoute()
const imgPreSrcList = ref([]);
const imgPreSrc = ref("");
const imgViewer = ref(false);
const data = reactive({
taskInfo: {},
imageList: [],
elKey: 0
})
const doDelete = () => {
ElMessageBox.confirm("确认删除?", "警告", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
}).then(function () {
let id = route.query.id;
task.deleteTask(id).then(d => {
if (d.data.code == 0) {
ElMessage.success("删除成功");
setTimeout(() => {
doBack();
}, 1000);
} else {
ElMessage.error("删除失败!");
}
});
});
}
const doBack = () => {
router.push({ path: "/simulationEvaluation/hisTaskList" })
}
/** 预览图片 */
function handlePreview(file) {
imgPreSrcList.value = [];
let id = route.query.id;
task.taskImage(id, file.name).then(res => {
if (res.data.code == 0) {
imgPreSrc.value = "data:image/gif;base64," + res.data.data.file_content;
imgPreSrcList.value.push(imgPreSrc.value);
setTimeout(() => {
console.log("点击事件===>");
imgViewer.value = true;
document.getElementsByClassName("imgPreView")[0].children[0].click();
}, 50);
}
});
}
const initData = () => {
let id = route.query.id;
task.taskDetail(id).then(d => {
data.taskInfo = d.data.data || {};
data.elKey++;
})
task.taskResults(id).then(d => {
data.imageList = (d.data.data.image_list || []).map(it => {
return {
name: it, url: it
}
});
data.elKey++;
})
}
onMounted(() => {
initData();
});
</script>
<style lang="scss" scoped>
.tb-base-info {
line-height: 30px;
:deep(span) {
font-size: 14px;
}
}
:deep(.svg-icon) {
margin-right: 8px;
}
.card-footer {
position: fixed;
width: calc(100% - 215px);
bottom: 0px;
:deep(.el-card__body) {
padding: 10px;
.el-pagination {
justify-content: end;
}
}
}
</style>
<style lang="scss">
.app-container.task-detail{
.image-list{
.el-upload.el-upload--text{
display: none;
}
.el-upload-list{
margin-top: 0px;
.el-upload-list__item{
display: inline-block;
width:23%;
.el-icon.el-icon--document{
background-image: url("../../assets/img.png");
width:18px;
background-repeat: no-repeat;
svg{
display: none;
}
}
.el-icon.el-icon--close{
display: none;
}
.el-upload-list__item-status-label{
display:none;
}
}
}
}
}
</style>

File diff suppressed because one or more lines are too long