姜玉琦 2024-07-28 12:07:53 +08:00
commit be2bf491d9
13 changed files with 2668 additions and 1554 deletions

View File

@ -3,9 +3,9 @@ VITE_APP_PORT = 3000
# 代理前缀
VITE_APP_BASE_API = '/api'
# VITE_APP_API_URL = http://62.234.3.186/mk/ai/api
VITE_APP_API_URL = http://62.234.3.186/mk/ai/api
# 线上接口地址
VITE_APP_API_URL = http://10.5.1.137:8800
#VITE_APP_API_URL = http://10.5.1.137:8800
# 开发接口地址
# VITE_APP_API_URL = http://localhost:8989

View File

@ -1 +1,57 @@
function init(){var s=location.search;var url="";var onnxModelName="";if(s.indexOf("=")>=0){url=s.substring(s.indexOf("=")+1);if(url.toLocaleLowerCase().indexOf(".onnx")>=0){onnxModelName=url.substring(url.lastIndexOf("/")+1)}else{console.error("使用方法:onnx.html?url=[onnx路径]");return}}else{console.error("使用方法:onnx.html?url=[onnx路径]");return}document.body.title=onnxModelName;var http=new XMLHttpRequest;http.responseType="arraybuffer";http.open("GET",url);http.onload=function(){if(http.status==200){var reader=proto.protobuf.Reader.create(new Uint8Array(http.response));var onnxProtoModel=window.proto.onnx.ModelProto.decode(reader);let{locations,graphs}=window.getExternalLocations(onnxProtoModel);let model=new window.onnx.Model(onnxProtoModel,graphs,new Map);let host=window;let view=new window.View(host);view.start().then(data=>{view.open(model,onnxModelName)}).catch(err=>{console.log(err)});window.mainView=view}};http.send()}function exportImg(file,blob){const element=this.document.createElement("a");element.download=file;element.href=URL.createObjectURL(blob);this.document.body.appendChild(element);element.click();this.document.body.removeChild(element)}function toggleMenu(){let el=document.getElementById("menu");if(el.style.display=="none"){el.style.display="block";updateState()}else{el.style.display="none"}}function doToggle(att){mainView.toggle(att);updateState()}function updateState(){var op=mainView.options;document.getElementById("opAtt").innerText=op.attributes?"Hide Attributes":"Show Attributes";document.getElementById("opWeight").innerText=op.weights?"Hide Weights":"Show Weights";document.getElementById("opName").innerText=op.names?"Hide Names":"Show Names";document.getElementById("opDir").innerText=op.direction=="vertical"?"Show Horizontal":"Show Vertical";document.getElementById("opMouse").innerText=op.mousewheel=="scroll"?"Mouse Wheel: Zoom":"Mouse Wheel: Scroll"}init();
function init() {
var s = location.search;
var url = "";
var onnxModelName = "";
if (s.indexOf("=") >= 0) {
url = s.substring(s.indexOf("=") + 1);
} else {
console.error("使用方法:onnx.html?id=[模型ID]")
return;
}
document.body.title = onnxModelName;
var accessToken = localStorage.getItem("accessToken");
var http = new XMLHttpRequest();
http.responseType = "json"
http.open('GET', MODELDOWNLOADAPI + `${url}/download`);
http.setRequestHeader("Authorization", accessToken);
http.onload = function () {
if (http.status == 200) {
var reader = proto.protobuf.Reader.create(base64ToUint8Array(http.response.data.file_content));
var onnxProtoModel = window.proto.onnx.ModelProto.decode(reader);
let { locations, graphs } = window.getExternalLocations(onnxProtoModel);
let model = new window.onnx.Model(onnxProtoModel, graphs, new Map());
let host = window;
let view = new window.View(host);
view.start().then((data) => {
view.open(model, onnxModelName);
}).catch((err) => {
console.log(err);
})
window.mainView = view;
}
};
http.send();
}
function base64ToUint8Array(base64String) {
try {
let padding = '='.repeat((4 - base64String.length % 4) % 4);
let base64 = (base64String + padding)
.replace(/\-/g, '+')
.replace(/_/g, '/');
let rawData = atob(base64);
let outputArray = new Uint8Array(rawData.length);
for (let i = 0; i < rawData.length; ++i) {
outputArray[i] = rawData.charCodeAt(i);
}
return outputArray;
}
catch (e) {
throw e;
}
}
init();

File diff suppressed because it is too large Load Diff

View File

@ -1,34 +1,35 @@
import request from "@/utils/request";
//获取任务列表
const tasks=()=>{
const tasks = () => {
return request({
url:'/tasks',
method:'get'
url: '/tasks',
method: 'get'
})
}
//获取可用的设备状态
const availableDevices=()=>{
const availableDevices = (data) => {
return request({
url:'/tasks/available_devices',
method:'get'
url: '/tasks/available_devices',
method: 'get',
params: data
})
}
//获取正在执行的任务
const running=()=>{
//获取正在执行的任务
const running = () => {
return request({
url:'/tasks/running',
method:'get'
url: '/tasks/running',
method: 'get'
})
}
//创建推理任务
const addTask=(data)=>{
const addTask = (data) => {
return request({
url:'/tasks',
url: '/tasks',
method: 'post',
data:data
data: data
})
}
export default{
export default {
tasks,
availableDevices,
running,

View File

@ -81,12 +81,11 @@
<span class="sp-label">输入参数:</span>
<div class="div-param">
<div v-if="info.param.inputs.length > 1" class="div-navs">
<span v-for="(it, idx) in info.param.inputs" @click="doInputSelected(idx)" :key="idx"
class="sp-nav" :class="it.selected ? 'active' : ''">{{ it.input_id }}</span>
<span v-for="(it, idx) in info.param.inputs" @click="doInputSelected(idx)" :key="idx" class="sp-nav"
:class="it.selected ? 'active' : ''">{{ it.input_id }}</span>
</div>
<span class="sp-text sp-paramter scroll">
<span v-for="(it, idx) in info.param.inputs " :key="idx" v-show="it.selected"
class="param-item">
<span v-for="(it, idx) in info.param.inputs " :key="idx" v-show="it.selected" class="param-item">
<paramShow :paramInfo="it"></paramShow>
</span>
</span>
@ -96,13 +95,12 @@
<span class="sp-label">输出参数:</span>
<div class="div-param">
<div v-if="info.param.outputs.length > 1" class="div-navs">
<span v-for="(it, idx) in info.param.outputs" @click="doOutputSelected(idx)"
:key="idx" class="sp-nav" :class="it.selected ? 'active' : ''">{{ it.output_id
<span v-for="(it, idx) in info.param.outputs" @click="doOutputSelected(idx)" :key="idx" class="sp-nav"
:class="it.selected ? 'active' : ''">{{ it.output_id
}}</span>
</div>
<span class="sp-text sp-paramter scroll">
<span v-for="(it, idx) in info.param.outputs " :key="idx" v-show="it.selected"
class="param-item">
<span v-for="(it, idx) in info.param.outputs " :key="idx" v-show="it.selected" class="param-item">
<paramShow :paramInfo="it"></paramShow>
</span>
</span>
@ -170,14 +168,14 @@ const doNodeClick = (node) => {
onMounted(() => {
loadData();
});
const doInputSelected=idx=>{
info.param.inputs.forEach((it,i)=>{
it.selected=i==idx;
const doInputSelected = idx => {
info.param.inputs.forEach((it, i) => {
it.selected = i == idx;
});
}
const doOutputSelected=idx=>{
info.param.outputs.forEach((it,i)=>{
it.selected=i==idx;
const doOutputSelected = idx => {
info.param.outputs.forEach((it, i) => {
it.selected = i == idx;
});
}
</script>
@ -190,10 +188,11 @@ const doOutputSelected=idx=>{
}
.detail-content {
.sp-text{
.sp-text {
display: inline-block;
margin-left:4px;
margin-left: 4px;
}
.sp-paramter {
height: 100px;
border: solid 1px #409EFF;
@ -257,7 +256,7 @@ const doOutputSelected=idx=>{
.sp-text {
flex-grow: 1;
display: block;
margin-left:4px;
margin-left: 4px;
}
.div-param {

View File

@ -78,8 +78,9 @@
<div class="row" v-if="selNode.info.parameters && selNode.info.parameters.inputs">
<span class="sp-label">输入参数:</span>
<div class="div-param">
<div v-if="selNode.info.parameters.inputs.length>1" class="div-navs">
<span v-for="(it,idx) in selNode.info.parameters.inputs" @click="doInputSelected(idx)" :key="idx" class="sp-nav" :class="it.selected?'active':''">{{ it.input_id }}</span>
<div v-if="selNode.info.parameters.inputs.length > 1" class="div-navs">
<span v-for="(it, idx) in selNode.info.parameters.inputs" @click="doInputSelected(idx)" :key="idx"
class="sp-nav" :class="it.selected ? 'active' : ''">{{ it.input_id }}</span>
</div>
<span class="sp-text sp-paramter scroll" @click="doEdit(selNode.info, '输入参数', 'i')">
<span v-for="(it, idx) in selNode.info.parameters.inputs " :key="idx" v-show="it.selected"
@ -91,9 +92,10 @@
</div>
<div class="row" style="margin-top:4px;" v-if="selNode.info.parameters && selNode.info.parameters.outputs">
<span class="sp-label">输出参数:</span>
<div class="div-param" >
<div v-if="selNode.info.parameters.outputs.length>1" class="div-navs">
<span v-for="(it,idx) in selNode.info.parameters.outputs" @click="doOutputSelected(idx)" :key="idx" class="sp-nav" :class="it.selected?'active':''">{{ it.output_id }}</span>
<div class="div-param">
<div v-if="selNode.info.parameters.outputs.length > 1" class="div-navs">
<span v-for="(it, idx) in selNode.info.parameters.outputs" @click="doOutputSelected(idx)" :key="idx"
class="sp-nav" :class="it.selected ? 'active' : ''">{{ it.output_id }}</span>
</div>
<span class="sp-text sp-paramter scroll" @click="doEdit(selNode.info, '输出参数', 'o')">
<span v-for="(it, idx) in selNode.info.parameters.outputs " :key="idx" v-show="it.selected"
@ -105,7 +107,8 @@
</div>
<div class="row" style="margin-top:4px;" v-if="selNode.info.parameters && selNode.info.parameters.process">
<span class="sp-label">处理参数:</span>
<span class="sp-text sp-paramter scroll" @click="doEdit(selNode.info, '处理参数', 'p')" v-if="selNode.info.parameters.process">
<span class="sp-text sp-paramter scroll" @click="doEdit(selNode.info, '处理参数', 'p')"
v-if="selNode.info.parameters.process">
<paramShow :paramInfo="selNode.info.parameters.process"></paramShow>
</span>
</div>
@ -152,56 +155,56 @@ const info = reactive({
})
const selNode = reactive({
info: null,
node:null,
node: null,
})
let lf = ref(null)
let edFlow = ref()
const ndPanel = ref()
const doOutputSelected=idx=>{
selNode.info.parameters.outputs.forEach((it,i)=>{
it.selected=i==idx;
const doOutputSelected = idx => {
selNode.info.parameters.outputs.forEach((it, i) => {
it.selected = i == idx;
});
}
const doInputSelected=idx=>{
selNode.info.parameters.inputs.forEach((it,i)=>{
it.selected=i==idx;
const doInputSelected = idx => {
selNode.info.parameters.inputs.forEach((it, i) => {
it.selected = i == idx;
});
}
const doEditSuccess = (obj) => {
let t = info.editObj.type;
if (t == 'i') {
obj.forEach(o=>{
let cobjs=selNode.info.parameters.inputs.filter(d=>d.input_id==o.id);
if(cobjs.length>0){
let cobj=cobjs[0];
o.attrs.forEach(oo=>{
if(oo.name=="oper_inout_data_type"){
cobj.oper_inout_data_type=oo.value;
}else{
cobj[oo.name].value=oo.value;
obj.forEach(o => {
let cobjs = selNode.info.parameters.inputs.filter(d => d.input_id == o.id);
if (cobjs.length > 0) {
let cobj = cobjs[0];
o.attrs.forEach(oo => {
if (oo.name == "oper_inout_data_type") {
cobj.oper_inout_data_type = oo.value;
} else {
cobj[oo.name].value = oo.value;
}
});
}
})
}
if (t == 'o') {
obj.forEach(o=>{
let cobjs=selNode.info.parameters.outputs.filter(d=>d.output_id==o.id);
if(cobjs.length>0){
let cobj=cobjs[0];
o.attrs.forEach(oo=>{
if(oo.name=="oper_inout_data_type"){
cobj.oper_inout_data_type=oo.value;
}else{
cobj[oo.name].value=oo.value;
obj.forEach(o => {
let cobjs = selNode.info.parameters.outputs.filter(d => d.output_id == o.id);
if (cobjs.length > 0) {
let cobj = cobjs[0];
o.attrs.forEach(oo => {
if (oo.name == "oper_inout_data_type") {
cobj.oper_inout_data_type = oo.value;
} else {
cobj[oo.name].value = oo.value;
}
});
}
})
}
if (t == 'p') {
obj[0].attrs.forEach(o=>{
selNode.info.parameters.process[o.name]["value"]=o.value;
obj[0].attrs.forEach(o => {
selNode.info.parameters.process[o.name]["value"] = o.value;
});
}
let tmps = info.nodes.filter(d => d.id == selNode.info.id);
@ -212,7 +215,7 @@ const doEditSuccess = (obj) => {
tmps[0].outputs = selNode.info.parameters.outputs;
tmps[0].process = selNode.info.parameters.process;
}
edFlow.value.updateNode(selNode.info,selNode.node);
edFlow.value.updateNode(selNode.info, selNode.node);
};
const doEdit = (obj, title, t) => {
info.editObj = {
@ -221,7 +224,7 @@ const doEdit = (obj, title, t) => {
type: t
}
editDlg.value.showDialog({
type:t,
type: t,
obj: t == 'i' ? obj.parameters.inputs : t == 'o' ? obj.parameters.outputs : obj.parameters.process,
title: title
});
@ -241,7 +244,7 @@ const doUpdateNode = (data) => {
const doNodeClick = (node) => {
if (node) {
selNode.info = node.data.properties.data;
selNode.node=node;
selNode.node = node;
let tmps = info.nodes.filter(d => d.id == selNode.info.id);
if (tmps.length == 0) {
info.nodes.push(selNode.info);
@ -251,17 +254,17 @@ const doNodeClick = (node) => {
selNode.info.parameters.process = tmps[0].parameters.process;
}
selNode.info.parameters.inputs.forEach(d=>{
d.selected=false;
selNode.info.parameters.inputs.forEach(d => {
d.selected = false;
});
selNode.info.parameters.outputs.forEach(d=>{
d.selected=false;
selNode.info.parameters.outputs.forEach(d => {
d.selected = false;
});
if(selNode.info.parameters.inputs.length>0){
selNode.info.parameters.inputs[0].selected=true;
if (selNode.info.parameters.inputs.length > 0) {
selNode.info.parameters.inputs[0].selected = true;
}
if(selNode.info.parameters.outputs.length>0){
selNode.info.parameters.outputs[0].selected=true;
if (selNode.info.parameters.outputs.length > 0) {
selNode.info.parameters.outputs[0].selected = true;
}
}
@ -278,52 +281,62 @@ const doSave = () => {
ElMessage.error("请绘制算子互联流程图!");
return;
}
let isNoConnect=false;
let nodeObj={};
let operator_list=[];
flowData.nodes.forEach(n=>{
nodeObj[n.id]=n.properties.data;
let node=info.nodes.filter(nd=>nd.id==n.properties.data.id);
let oper={
operator_id:n.properties.data.id,
parameters:{}
let isNoConnect = false;
let nodeObj = {};
let operator_list = [];
flowData.nodes.forEach(n => {
nodeObj[n.id] = n.properties.data;
let node = info.nodes.filter(nd => nd.id == n.properties.data.id);
let oper = {
operator_id: n.properties.data.id,
parameters: {}
}
if(node.length>0){
oper.parameters.inputs=node[0].inputs;
oper.parameters.outputs=node[0].outputs;
oper.parameters.process=node[0].process;
if (node.length > 0) {
oper.parameters.inputs = node[0].inputs;
oper.parameters.outputs = node[0].outputs;
oper.parameters.process = node[0].process;
}
operator_list.push(oper);
let tmps=flowData.edges.filter(e=>e.sourceNodeId==n.id||e.targetNodeId==n.id);
if(tmps.length==0){
isNoConnect=true;
let tmps = flowData.edges.filter(e => e.sourceNodeId == n.id || e.targetNodeId == n.id);
if (tmps.length == 0) {
isNoConnect = true;
}
});
if(isNoConnect){
if (isNoConnect) {
ElMessage.error("请在流程图中连接各个算子!");
return;
}
let operator_connection_list=[];
flowData.edges.forEach(e=>{
let operator_connection_list = [];
flowData.edges.forEach(e => {
operator_connection_list.push({
start_oper_id:nodeObj[e.sourceNodeId].id,
end_oper_id:nodeObj[e.targetNodeId].id,
start_oper_id: nodeObj[e.sourceNodeId].id,
end_oper_id: nodeObj[e.targetNodeId].id,
});
});
operator_list = flowData.nodes.map(it => it.properties.data);
operator_connection_list = flowData.edges.map(it => {
let obj = {
start_oper_id: nodeObj[it.sourceNodeId].id,
end_oper_id: nodeObj[it.targetNodeId].id,
start_oper_output_id: it.properties.sourceAnchorId,
end_oper_input_id: it.properties.targetAnchorId,
};
return obj;
})
editForm.value?.validate(valid => {
if (valid) {
let postData={
connection_name:upForm.connection_name,
connection_label:upForm.connection_label,
connection_desc:upForm.connection_desc,
operator_list:operator_list,
operator_connection_list:operator_connection_list,
operator_connection_nodes:flowData.nodes,
operator_connection_edges:flowData.edges
let postData = {
connection_name: upForm.connection_name,
connection_label: upForm.connection_label,
connection_desc: upForm.connection_desc,
operator_list: operator_list,
operator_connection_list: operator_connection_list,
operator_connection_nodes: flowData.nodes,
operator_connection_edges: flowData.edges
};
ConnApi.add(postData).then(d=>{
if(d.data.code==0){
ConnApi.add(postData).then(d => {
if (d.data.code == 0) {
ElMessage.success("增加模型成功!");
router.push({ path: "/connection/index" })
}
@ -461,18 +474,20 @@ onMounted(() => {
.sp-text {
flex-grow: 1;
display: block;
margin-left:4px;
margin-left: 4px;
}
.div-param{
.div-navs{
.sp-nav{
.div-param {
.div-navs {
.sp-nav {
display: inline-block;
line-height:24px;
padding:0px 12px;
line-height: 24px;
padding: 0px 12px;
cursor: pointer;
&.active{
&.active {
background-color: #409EFF;
color:#fff;
color: #fff;
}
}
}

View File

@ -11,7 +11,7 @@ import '@logicflow/core/dist/style/index.css';
import { Menu } from "@logicflow/extension";
import AiNodeExtension from '@/components/flow/index'
import RegisteMenu from '@/components/flow/menu.js'
const emit=defineEmits(["initLf","updateNode","nodeClick"])
const emit = defineEmits(["initLf", "updateNode", "nodeClick"])
const themeApprove = {
rect: { //
radius: 8,
@ -48,38 +48,41 @@ const config = {
},
keyboard: { enabled: true },
style: themeApprove,
plugins: [AiNodeExtension,Menu]
plugins: [AiNodeExtension, Menu]
};
const flow = ref()
let lf = ref(null)
let showProp=ref(false)
let nodeData=reactive(null)
let nodePropKey=ref(1)
const initEvent=(lf)=>{
lf.on("blank:click",node=>{
emit("nodeClick",null)
let showProp = ref(false)
let nodeData = reactive(null)
let nodePropKey = ref(1)
const initEvent = (lf) => {
lf.on("blank:click", node => {
emit("nodeClick", null)
});
lf.on("element:click",node=>{
nodeData=node.data
showProp.value=true
lf.on("element:click", node => {
nodeData = node.data
showProp.value = true
nodePropKey.value++
emit("nodeClick",node)
emit("nodeClick", node)
});
lf.on("node:dnd-add",data=>{
nodeData=data.data;
showProp.value=true
lf.on("node:dnd-add", data => {
nodeData = data.data;
showProp.value = true
nodePropKey.value++
doUpdateState()
});
lf.on("connection:not-allowed",(a,b,c)=>{
if(a.msg=="不允许添加连线"){
lf.on("anchor:dragend", (a, b, c) => {
updateEdges(a, b, c);
});
lf.on("connection:not-allowed", (a, b, c) => {
if (a.msg == "不允许添加连线") {
ElMessage.error("开始结点只能连接结束节点!");
}else{
} else {
ElMessage.error(a.msg);
}
});
lf.on("node:delete",data=>{
if(data.data.text.value=="目标绘图"){
lf.on("node:delete", data => {
if (data.data.text.value == "目标绘图") {
ElMessage.error("目标绘图节点不能删除");
setTimeout(() => {
lf.undo();
@ -88,22 +91,33 @@ const initEvent=(lf)=>{
}
doUpdateState()
});
lf.on("node:contextmenu",(d)=>{
if(d.data.text.value=="目标绘图"){
setTimeout(()=>{
document.querySelector(".lf-menu").style.display="none";
},0)
lf.on("node:contextmenu", (d) => {
if (d.data.text.value == "目标绘图") {
setTimeout(() => {
document.querySelector(".lf-menu").style.display = "none";
}, 0)
}
});
}
const doEdit=(n)=>{
const updateEdges = (a, b, c) => {
let edges = lf.value.getGraphData().edges.filter(d => d.sourceNodeId == a.edgeModel.sourceNodeId && d.targetNodeId == a.edgeModel.targetNodeId);
if (edges.length > 0) {
//edges[0].properties.edgeModel = a.edgeModel
lf.value.setProperties(edges[0].id, {
sourceAnchorId: a.edgeModel.sourceAnchorId.split("_")[0],
targetAnchorId: a.edgeModel.targetAnchorId.split("_")[0],
})
}
}
const doUpdateState=()=>{
const doEdit = (n) => {
}
const doUpdateState = () => {
//nodePanel.value.updateNode(lf.value.getGraphData());
emit("updateNode",lf.value.getGraphData())
emit("updateNode", lf.value.getGraphData())
}
const getFlowData=()=>{
const getFlowData = () => {
return lf.value.getGraphData();
}
onMounted(() => {
@ -115,7 +129,7 @@ onMounted(() => {
logicFlow.setDefaultEdgeType("ai-link");
RegisteMenu(logicFlow)
initEvent(logicFlow);
emit("initLf",lf);
emit("initLf", lf);
window.lf = lf;
logicFlow.render({
nodes: [],
@ -123,9 +137,9 @@ onMounted(() => {
})
doUpdateState();
});
const updateNode=(info,node)=>{
lf.value.setProperties(node.data.id,{
data:info
const updateNode = (info, node) => {
lf.value.setProperties(node.data.id, {
data: info
})
}
defineExpose({

View File

@ -20,12 +20,12 @@
<el-table v-loading="loading" :data="info.data" stripe @selection-change="handleSelectionChange">
<el-table-column label="模型名称" align="left" prop="model_name" />
<el-table-column label="网络名称" align="left" prop="modl_net_type" width="120"/>
<el-table-column label="模型类型" align="left" prop="modl_main_type_name">
<template #default="{row}">{{ row.modl_main_type_name }}/{{row.modl_sub_type_name }}</template>
<el-table-column label="网络名称" align="left" prop="modl_net_type" width="120" />
<el-table-column label="模型类型" align="left" prop="modl_net_type">
<template #default="{ row }">{{ row.modl_main_type_name }}/{{ row.modl_sub_type_name }}</template>
</el-table-column>
<el-table-column label="版本" align="left" prop="connection_version" />
<el-table-column label="互联名称" align="left" prop="connection_name" width="120"/>
<el-table-column label="互联名称" align="left" prop="connection_name" width="120" />
<el-table-column label="互联说明" align="left" prop="connection_desc" />
<el-table-column label="互联创建时间" width="120" align="left" prop="create_time" />
<el-table-column label="创建用户" width="100" align="left" prop="user_name" />
@ -38,15 +38,13 @@
<el-table-column label="操作" fixed="right" align="center" width="270">
<template #default="scope">
<template v-if="scope.row.connection_created">
<el-button text type="primary" size="small" @click="doShowDetail(scope.row)"><i-ep-edit />查看</el-button>
<el-button text type="primary" size="small"
@click="doShowDetail(scope.row)"><i-ep-edit />查看</el-button>
<el-button text type="primary" size="small"
@click="doEdit(scope.row.connection_id)"><i-ep-link/>修改互联</el-button>
@click="doEdit(scope.row.connection_id)"><i-ep-link />修改互联</el-button>
<el-button text type="primary" size="small" @click="handleDelete(scope.row)"><i-ep-delete />删除</el-button>
</template>
<template v-else>
<el-button text type="primary" size="small"
@click="doAdd(scope.row)">新建互联</el-button>
<el-button text type="primary" size="small" @click="doAdd(scope.row)"></el-button>
</template>
</template>
</el-table-column>
@ -72,13 +70,13 @@ const removeIds = ref([]); // 删除用户ID集合 用于批量删除
const queryParams = reactive<any>({
page_num: 1,
page_size: 10,
connection_name:''
connection_name: ''
});
const dateTimeRange = ref("");
const total = ref(100); //
const info=reactive({
total:0,
data:[]
const info = reactive({
total: 0,
data: []
})
watch(dateTimeRange, (newVal) => {
if (newVal) {
@ -90,15 +88,15 @@ watch(dateTimeRange, (newVal) => {
/** 查询 */
function handleQuery() {
loading.value = true;
ConnApi.list(queryParams).then(d=>{
ConnApi.list(queryParams).then(d => {
loading.value = false;
info.total=d.data?.total||0;
info.data=d.data?.data||[];
info.total = d.data?.data?.total || 0;
info.data = d.data?.data?.connection_list || [];
});
}
function doUploadModel(){
function doUploadModel() {
router.push({ path: "/modelMgr/uploadModel" });
}
@ -125,24 +123,24 @@ function handleDelete(row: { [key: string]: any }) {
cancelButtonText: "取消",
type: "warning",
}).then(function () {
ConnApi.deleteConnect(row.connection_id).then(d=>{
if(d.data.code==0){
ConnApi.deleteConnect(row.connection_id).then(d => {
if (d.data.code == 0) {
ElMessage.success("删除互联成功");
}
});
});
}
const doShowDetail=(row:any)=>{
router.push({path:"/connection/detail",query:{id:row.connection_id}})
const doShowDetail = (row: any) => {
router.push({ path: "/connection/detail", query: { id: row.connection_id } })
}
const doEdit=(row:any)=>{
router.push({path:"/connection/edit",query:{id:row.connection_id,type:'edit'}})
const doEdit = (row: any) => {
router.push({ path: "/connection/edit", query: { id: row.connection_id, type: 'edit' } })
}
const doAdd=(row:any)=>{
router.push({path:"/connection/edit",query:{id:row.connection_id,type:'add'}})
const doAdd = (row: any) => {
router.push({ path: "/connection/edit", query: { id: row.connection_id, type: 'add' } })
}
@ -153,19 +151,21 @@ onMounted(() => {
<style scoped lang='scss'>
.search-container{
display:flex;
.search-container {
display: flex;
}
.card-footer{
.card-footer {
position: fixed;
width: calc(100% - 215px);
bottom: 0px;
:deep(.el-card__body){
padding:0px;
.el-pagination{
:deep(.el-card__body) {
padding: 0px;
.el-pagination {
justify-content: end;
}
}
}
</style>

View File

@ -100,7 +100,7 @@ defineExpose({
})
const initData = () => {
OperApi.list().then(d => {
OperApi.list({ page_num: 1, page_size: 100 }).then(d => {
let tmps = (d.data?.data?.operator_list || []).map(it => {
it.show = true;
it.text = it.operator_name;
@ -186,6 +186,7 @@ onMounted(() => {
&.item4 {
background: #A7BEE7;
}
&.item5 {
background: #4C8DD1;
}

View File

@ -8,12 +8,12 @@
<tr>
<td style="width: 50%;">
<span class="sp-title">模型名称:</span>
<span class="sp-text">{{modelInfo.info.model_name}}</span>
<span class="sp-text">{{ modelInfo.info.model_name }}</span>
</td>
<td style="width: 50%;">
<span class="sp-title">模型类型:</span>
<span class="sp-text">{{modelInfo.info.modl_main_type_name}}
/{{modelInfo.info.modl_sub_type_name}}
<span class="sp-text">{{ modelInfo.info.modl_main_type_name }}
/{{ modelInfo.info.modl_sub_type_name }}
</span>
</td>
</tr>
@ -21,13 +21,13 @@
<td style="width: 50%;">
<span class="sp-title">模型版本:</span>
<span class="sp-text">
{{modelInfo.info.model_version}}
{{ modelInfo.info.model_version }}
</span>
</td>
<td style="width: 50%;">
<span class="sp-title">版本描述:</span>
<span class="sp-text">
{{modelInfo.info.model_desc}}
{{ modelInfo.info.model_desc }}
</span>
</td>
</tr>
@ -35,25 +35,25 @@
<td style="width: 50%;">
<span class="sp-title">模型网络:</span>
<span class="sp-text">
{{modelInfo.info.modl_net_type}}
{{ modelInfo.info.model_net_type }}
</span>
</td>
<td style="width: 50%;">
<span class="sp-title">上传用户:</span>
<span class="sp-text"> {{modelInfo.info.user_name}}</span>
<span class="sp-text"> {{ modelInfo.info.user_name }}</span>
</td>
</tr>
<tr>
<td style="width: 50%;">
<span class="sp-title">算法框架:</span>
<span class="sp-text">
{{modelInfo.info.modl_framework}}
{{ modelInfo.info.modl_framework }}
</span>
</td>
<td style="width: 50%;">
<span class="sp-title">上传时间:</span>
<span class="sp-text">
{{modelInfo.info.create_time}}
{{ modelInfo.info.create_time }}
</span>
</td>
</tr>
@ -61,13 +61,15 @@
<td style="width: 50%;">
<span class="sp-title">文件格式:</span>
<span class="sp-text">
{{modelInfo.info.modl_file_type}}
{{ modelInfo.info.modl_file_type }}
</span>
</td>
<td style="width: 50%;">
<span class="sp-title">网络配置:</span>
<span class="sp-text sp-file">
<a style="line-height:24px;"ref="#"><el-icon><Document /></el-icon></a>
<a style="line-height:24px;" ref="#"><el-icon>
<Document />
</el-icon></a>
</span>
</td>
</tr>
@ -76,7 +78,7 @@
<el-card style="margin-top: 12px;">
<template #header>
<svg-icon icon-class="pause" style="width:20px;height:20px;" />可适配算子</template>
<el-button v-for="(it,idx) in modelInfo.opers" :key="idx">{{ it.oper_type_name }}</el-button>
<el-button v-for="(it, idx) in modelInfo.opers" :key="idx">{{ it.operator_name }}</el-button>
</el-card>
<el-card style="margin-top: 12px;margin-bottom:60px;">
@ -84,7 +86,8 @@
<svg-icon icon-class="pause" style="width:20px;height:20px;" />
模型结构</template>
<div style="position: relative;min-height:50vh;" class="scroll">
<iframe frameborder="0" scrolling="no" :src="url" style="width:100%;height:100%;position: absolute;top:0px;"></iframe>
<iframe frameborder="0" scrolling="no" :src="url"
style="width:100%;height:100%;position: absolute;top:0px;"></iframe>
</div>
</el-card>
<el-card class="card-footer">
@ -97,61 +100,69 @@
import ModelApi from '@/api/models'
import request from 'axios'
const router = useRouter();
const route =useRoute()
let url=ref("")
let modelInfo=reactive({
info:{},
opers:[]
const route = useRoute()
let url = ref("")
let modelInfo = reactive({
info: {},
opers: []
})
const initData=()=>{
let id=route.query.id;
let ajaxs=[];
const initData = () => {
let id = route.query.id;
let ajaxs = [];
ajaxs.push(ModelApi.findOne(id))
ajaxs.push(ModelApi.adaptOperators(id));
request.all(ajaxs).then(res=>{
modelInfo.info=res[0].data?.data||{};
modelInfo.opers=res[1].data?.data?.adapt_operator_list||[];
request.all(ajaxs).then(res => {
modelInfo.info = res[0].data?.data || {};
modelInfo.opers = res[1].data?.data?.adapt_operator_list || [];
});
};
onMounted(()=>{
url.value="./onnx/onnx.html?url=/ai/siamRPN_192.onnx";
onMounted(() => {
let id = route.query.id;
url.value = "./onnx/onnx.html?id=" + id;
initData();
});
const doBack=()=>{
if(route.query.from=='simulation'){
router.push({path:"/simulationEvaluation/index"})
const doBack = () => {
if (route.query.from == 'simulation') {
router.push({ path: "/simulationEvaluation/index" })
return;
}
router.push({path:"/modelMgr/index"})
router.push({ path: "/modelMgr/index" })
}
</script>
<style scoped lang='scss'>
.model-detail{
:deep(.el-card__header){
padding:8px 4px;
.model-detail {
:deep(.el-card__header) {
padding: 8px 4px;
display: flex;
align-items: center
}
}
.sp-file{
color:#29d;
.sp-file {
color: #29d;
}
.tb-base-info{
.tb-base-info {
line-height: 30px;
:deep(span){
:deep(span) {
font-size: 14px;
}
}
:deep(.svg-icon){
margin-right:8px;
:deep(.svg-icon) {
margin-right: 8px;
}
.card-footer{
.card-footer {
position: fixed;
width: calc(100% - 215px);
bottom: 0px;
:deep(.el-card__body){
padding:10px;
.el-pagination{
:deep(.el-card__body) {
padding: 10px;
.el-pagination {
justify-content: end;
}
}

View File

@ -28,51 +28,52 @@
import connApi from '@/api/connection'
const loading = ref(false);
const modelSelection = ref("")//id
const info=reactive({
data:[]
const info = reactive({
data: []
})
const queryParams = reactive({
pageNum: 1,
pageSize: 10,
connection_name:''
connection_name: ''
});
const total = ref(100); //
const handleChange = (row) => {
modelSelection.value = row.id + "";
}
const doRowClick=(row)=>{
modelSelection.value=row.id+"";
const doRowClick = (row) => {
modelSelection.value = row.id + "";
}
/** 查询 */
function handleQuery(a) {
if(a){
queryParams.pageSize=a.limit;
queryParams.pageNum=a.page;
if (a) {
queryParams.pageSize = a.limit;
queryParams.pageNum = a.page;
}
//ElMessage.success("");
loading.value = true;
connApi.list(queryParams).then(d=>{
loading.value=false;
info.data=(d.data?.data||[]).map(it=>{
it.id=it.connection_id;
it.modelType=it.modl_main_type_name+"/"+it.modl_sub_type_name;
connApi.list(queryParams).then(d => {
loading.value = false;
info.data = (d.data?.data?.connection_list || []).map(it => {
it.id = it.model_id;
it.modelType = it.modl_net_type;
return it;
});
total.value=d.data?.total||0;
total.value = d.data?.data?.total || 0;
});
}
const checkForm=()=>{
if(modelSelection.value){
let tmps=info.data.filter(d=>d.id==modelSelection.value);
return tmps.length>0?tmps[0]:null;
const checkForm = () => {
if (modelSelection.value) {
let tmps = info.data.filter(d => d.id == modelSelection.value);
return tmps.length > 0 ? tmps[0] : null;
}
return null;
};
onMounted(()=>{
onMounted(() => {
handleQuery();
});

View File

@ -6045,6 +6045,11 @@ js-base64@^2.1.9:
resolved "https://registry.npmmirror.com/js-base64/-/js-base64-2.6.4.tgz#f4e686c5de1ea1f867dbcad3d46d969428df98c4"
integrity sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==
js-md5@^0.8.3:
version "0.8.3"
resolved "https://registry.npmmirror.com/js-md5/-/js-md5-0.8.3.tgz#921bab7efa95bfc9d62b87ee08a57f8fe4305b69"
integrity sha512-qR0HB5uP6wCuRMrWPTrkMaev7MJZwJuuw4fnwAzRgP4J4/F8RwtodOKpGp4XpqsLBFzzgqIO42efFAyz2Et6KQ==
js-tokens@^4.0.0:
version "4.0.0"
resolved "https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"