算子优化

main
姜玉琦 2024-07-11 01:27:21 +08:00
parent abc1a392b1
commit 612593eb28
4 changed files with 179 additions and 223 deletions

View File

@ -260,9 +260,9 @@ class MenuAPI {
}, },
}, },
{ {
path: "calculateView", path: "calculateDetail",
component: "manage/calculate/view", component: "manage/calculate/view",
name: "calculateView", name: "calculateDetail",
meta: { meta: {
title: "算子查看", title: "算子查看",
hidden: true, hidden: true,

View File

@ -9,7 +9,7 @@
<el-row> <el-row>
<el-col :lg="12" :xs="24"> <el-col :lg="12" :xs="24">
<el-form <el-form
ref="userFormRef" ref="formRef"
:model="formData" :model="formData"
:rules="rules" :rules="rules"
v-loading="loading" v-loading="loading"
@ -42,9 +42,10 @@
placeholder="请选择算子子类型" placeholder="请选择算子子类型"
size="large" size="large"
style="width: 100%" style="width: 100%"
@change="handleChangeRules"
> >
<el-option <el-option
v-for="item in listOpt.operTypeList" v-for="item in listOpt.operSubTypeList"
:key="item.oper_sub_type" :key="item.oper_sub_type"
:label="item.oper_sub_type_name" :label="item.oper_sub_type_name"
:value="item.oper_sub_type" :value="item.oper_sub_type"
@ -62,13 +63,13 @@
maxlength="1024" maxlength="1024"
/> />
</el-form-item> </el-form-item>
<el-form-item label="算子文件"> <el-form-item label="算子文件" prop="parameters">
<el-upload <el-upload
action="" ref="uploadRef"
class="upload-demo" class="upload-demo"
ref="upload"
:on-change="handleFileChange" :on-change="handleFileChange"
:on-remove="handleFileRemove" :on-remove="handleFileRemove"
:on-exceed="handleFileExceed"
:auto-upload="false" :auto-upload="false"
:limit="1" :limit="1"
accept="application/json" accept="application/json"
@ -85,8 +86,8 @@
</template> </template>
</el-upload> </el-upload>
</el-form-item> </el-form-item>
<el-form-item label="文件预览"> <el-form-item label="文件预览" v-if="fileStatus">
<pre class="line-numbers"><code :class="`language-${type}`">{{code}}</code></pre> <code id="codeHtml" v-html="codeHtml"></code>
</el-form-item> </el-form-item>
</el-form> </el-form>
</el-col> </el-col>
@ -116,56 +117,25 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import request from "axios";
import ConstApi from "@/api/const"; import ConstApi from "@/api/const";
import JsonViewer from 'vue-json-viewer'; import { useUserStore } from "@/store";
import OperatorApi from "@/api/operator";
import UserAPI from "@/api/user";
import { UserForm } from "@/api/user/model";
const router = useRouter(); const router = useRouter();
const formRef = ref(ElForm); //
const loading = ref(false); // const loading = ref(false); //
const fileStatus = ref(false); // const fileStatus = ref(false); //
const codeHtml = ref(""); //
// JSON //
const props = withDefaults(defineProps<{ const uploadRef = ref<UploadInstance>();
type?: string
code: string
}>(), {
type: "json",
code: `<el-upload
v-model:file-list="fileList"
class="upload-demo"
action="https://run.mocky.io/v3/9d059bf9-4660-45f2-925d-ce80ad6c4d15"
multiple
:on-preview="handlePreview"
:on-remove="handleRemove"
:before-remove="beforeRemove"
:limit="3"
:on-exceed="handleExceed"
>
<el-button type="primary">Click to upload</el-button>
<template #tip>
<div class="el-upload__tip">
jpg/png files with a size less than 500KB.
</div>
</el-upload>
`
})
watch(() => props.code, () => {
nextTick(() => {
Prism.highlightAll()
})
})
const calTypeList = ref<OptionType[]>(); //
// //
const formData = reactive<UserForm>({ const formData = reactive({
status: 1, status: 1,
}); });
const userStore = useUserStore();
// //
let listOpt = reactive({ let listOpt = reactive({
operTypeList: [], operTypeList: [],
@ -174,45 +144,35 @@ let listOpt = reactive({
// //
const rules = reactive({ const rules = reactive({
username: [{ required: true, message: "不能为空", trigger: "blur" }], operator_name: [{ required: true, message: "算子名称不能为空", trigger: "blur" }],
nickname: [{ required: true, message: "不能为空", trigger: "blur" }], oper_main_type: [{ required: true, message: "算子类型不能为空", trigger: "blur" }],
deptId: [{ required: true, message: "不能为空", trigger: "blur" }], oper_sub_type: [{ required: true, message: "算子类型不能为空", trigger: "blur" }],
roleIds: [{ required: true, message: "不能为空", trigger: "blur" }], operator_desc: [{ required: true, message: "算子说明不能为空", trigger: "blur" }],
email: [ parameters: [{ required: true, message: "算子文件不能为空", trigger: "blur" }],
{
pattern: /\w[-\w.+]*@([A-Za-z0-9][-A-Za-z0-9]+\.)+[A-Za-z]{2,14}/,
message: "请输入正确的邮箱地址",
trigger: "blur",
},
],
mobile: [
{
pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/,
message: "请输入正确的手机号码",
trigger: "blur",
},
],
}); });
const list = [ //
{ function handleChangeRules(){
csmc: "图像分类算子名称", formRef.value.validateField('oper_main_type');
csms: "进行19种类型的图像分类模型", formRef.value.validateField('oper_sub_type');
}, }
{
csmc: "目标检测算子名称",
csms: "人员检测的模型",
},
];
/** 表单提交 */ /** 表单提交 */
const handleSubmit = useThrottleFn(() => { const handleSubmit = useThrottleFn(() => {
loading.value = true; formRef.value.validate((valid: any) => {
setTimeout(() => { if (valid) {
ElMessage.success("保存成功"); loading.value = true;
loading.value = false; formData.user_id = userStore.user?.id;
closeBack(); formData.create_time = new Date();
}, 1000); OperatorApi.add(formData).then((res) => {
if (res.data.code == 0) {
ElMessage.success("保存成功");
loading.value = false;
closeBack();
}
});
}
});
}, 3000); }, 3000);
/** 返回默认页面 */ /** 返回默认页面 */
@ -224,7 +184,7 @@ function closeBack() {
function handleChange() { function handleChange() {
listOpt.operTypeList.forEach((item) => { listOpt.operTypeList.forEach((item) => {
if (item.oper_main_type == formData.oper_main_type) { if (item.oper_main_type == formData.oper_main_type) {
listOpt.operSubTypeList.value = item.oper_sub_type_list; listOpt.operSubTypeList = item.oper_sub_type_list;
} }
}); });
} }
@ -242,11 +202,35 @@ function handleFileChange(file) {
return; return;
} }
uploadFile(file).then((res) => { uploadFile(file).then((res) => {
props.code = res; if (isJSON(res)) {
fileStatus.value = true; let jsonStr = JSON.stringify(res);
formData.parameters = jsonStr;
formRef.value.validateField('parameters');
let json = JSON.parse(jsonStr);
codeHtml.value = highlightJSON(json);
fileStatus.value = true;
}
}); });
} }
/** 解析json */
function isJSON(str) {
try {
//
JSON.parse(str);
ElMessage.success("JSON文件解析成功");
return true;
//
} catch (error) {
//
ElMessage.error("JSON文件解析失败");
uploadRef.value.clearFiles();
fileStatus.value = false;
formData.parameters = "";
return false;
}
}
// //
function uploadFile(file) { function uploadFile(file) {
return new Promise(function (resolve, reject) { return new Promise(function (resolve, reject) {
@ -262,16 +246,45 @@ function uploadFile(file) {
// //
function handleFileRemove() { function handleFileRemove() {
props.code = ""; formData.parameters = "";
codeHtml.value = "<p></p>";
fileStatus.value = false; fileStatus.value = false;
} }
//
function handleFileExceed() {
uploadRef.value.clearFiles();
ElMessage.warning("已清空文件列表,请重新上传!");
handleFileRemove();
}
//
function highlightJSON(json) {
// key
let keyReg = new RegExp('"(.*)"(?=:)', "g");
// value
let valueReg = new RegExp('(?<=: )("(.*)"|\\d+)', "g");
if (typeof json === "object" && json !== null) {
json = JSON.stringify(json, this, 5);
}
//
let res = json
.replace(keyReg, (match) => {
return `<span class="green">${match}</span>`;
})
.replace(valueReg, (match) => {
if (/\d/.test(match)) {
return `<span class="blue">${match}</span>`;
}
return `<span class="black">${match}</span>`;
});
return res;
}
// //
const initData = () => { const initData = () => {
request.all(ConstApi.operMainType()).then((res) => { ConstApi.operMainType().then((res) => {
if (res.code == 200) { listOpt.operTypeList = res.data.data.oper_main_type_list || [];
listOpt.operTypeList.value = res.data.data.oper_main_type_list;
}
}); });
}; };
@ -308,13 +321,20 @@ onMounted(() => {
} }
} }
</style> </style>
<style lang="scss"> <style lang="scss" scope>
pre { #codeHtml {
span { font-size: 16px;
font-family: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace; color: #e36209;
} font-family: "Courier New", Courier, monospace;
code { background: #f5f5f5;
font-size: 16px !important; .green {
} color: #22863a;
}
.blue {
color: #005cc5;
}
.black {
color: #032f62;
}
} }
</style> </style>

View File

@ -136,8 +136,8 @@ function handleDelete(id?: number) {
} }
/** 查看算子 */ /** 查看算子 */
function handleDetail(id?: number) { function handleDetail(operator_id?: number) {
router.replace({ path: "/operatorLibrary/calculateView?id="+id }); router.replace({path:"/operatorLibrary/calculateDetail",query:{id:operator_id}})
} }
/** 新增算子 */ /** 新增算子 */

View File

@ -7,52 +7,51 @@
<el-row> <el-row>
<el-col :lg="12" :xs="24"> <el-col :lg="12" :xs="24">
<el-form <el-form
ref="userFormRef" ref="formRef"
:model="formData"
v-loading="loading" v-loading="loading"
label-width="100px" label-width="100px"
size="small" size="small"
> >
<el-form-item label="算子名称" prop="username"> 目标分类模型 </el-form-item> <el-form-item label="算子名称">{{dataInfo.operator_name}}</el-form-item>
<!-- <el-form-item label="算子版本" prop="nickname"> <el-form-item label="算子主类型">
<el-tag type="primary" effect="plain">V1.22.1</el-tag> {{dataInfo.oper_main_type_name}}</el-form-item
>
<el-form-item label="算子子类型">
{{dataInfo.oper_sub_type_name}}</el-form-item
>
<el-form-item label="算子说明">
<el-input
v-model="dataInfo.operator_desc"
:disabled="true"
placeholder="请输入数据集名称"
:rows="3"
type="textarea"
/>
</el-form-item>
<el-form-item label="创建人">
{{dataInfo.user_name}}</el-form-item
>
<el-form-item label="创建时间">
{{dataInfo.create_time}}</el-form-item
>
<el-form-item label="算子参数">
<el-input
v-model="dataInfo.parametersJson"
:disabled="true"
placeholder="请输入算子参数"
:rows="10"
type="textarea"
/>
</el-form-item>
<!-- <el-form-item label="输出参数" prop="nickname33">
<el-input
v-model="dataInfo.usernamedd3"
:disabled="true"
placeholder="请输入数据集名称"
:rows="3"
type="textarea"
/>
</el-form-item> --> </el-form-item> -->
<el-form-item label="算子主类型" prop="nickname33">
前处理/缩放算子</el-form-item
>
<el-form-item label="算子子类型" prop="nickname33">
缩放算子</el-form-item
>
<el-form-item label="创建时间" prop="nickname33">
2024-06-24 22:28:12</el-form-item
>
<el-form-item label="算子说明" prop="nickname33">
<el-input
v-model="formData.usernamedd1"
:disabled="true"
placeholder="请输入数据集名称"
:rows="3"
type="textarea"
/>
</el-form-item>
<el-form-item label="输入参数" prop="nickname33">
<el-input
v-model="formData.usernamedd2"
:disabled="true"
placeholder="请输入数据集名称"
:rows="3"
type="textarea"
/>
</el-form-item>
<el-form-item label="输出参数" prop="nickname33">
<el-input
v-model="formData.usernamedd3"
:disabled="true"
placeholder="请输入数据集名称"
:rows="3"
type="textarea"
/>
</el-form-item>
</el-form> </el-form>
</el-col> </el-col>
<el-col :lg="12" :xs="24"> </el-col> <el-col :lg="12" :xs="24"> </el-col>
@ -65,96 +64,33 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
defineOptions({ import OperatorApi from '@/api/operator'
name: "User",
inheritAttrs: false,
});
import UserAPI from "@/api/user";
import { UserForm } from "@/api/user/model";
const route =useRoute()
const router = useRouter(); const router = useRouter();
const loading = ref(false); // const loading = ref(false); //
//
const calTypeList = ref<OptionType[]>(); // const dataInfo = ref({});
//
const formData = reactive<UserForm>({
status: 1,
usernamedd1:"算算子说明算子说明算子说明算子说明算子说明算子说明算子说明算子说明子说明",
usernamedd2:"输入参数输入参数",
usernamedd3:"输出参数输出参数输出参数输出参数",
});
//
const rules = reactive({
username: [{ required: true, message: "用户名不能为空", trigger: "blur" }],
nickname: [{ required: true, message: "用户昵称不能为空", trigger: "blur" }],
deptId: [{ required: true, message: "所属部门不能为空", trigger: "blur" }],
roleIds: [{ required: true, message: "用户角色不能为空", trigger: "blur" }],
email: [
{
pattern: /\w[-\w.+]*@([A-Za-z0-9][-A-Za-z0-9]+\.)+[A-Za-z]{2,14}/,
message: "请输入正确的邮箱地址",
trigger: "blur",
},
],
mobile: [
{
pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/,
message: "请输入正确的手机号码",
trigger: "blur",
},
],
});
const list = [
{
csmc: "10.0.8.12",
csms: "异腾310",
csmc1: "Atlas 2000 DK A2",
csmc2: "PCIE-AI-NPU",
csmc3: "华为",
csmc4: "1.2",
csmc5: "已连接",
},
{
csmc: "192.168.1.44",
csms: "思源220",
csmc1: "Atlas 2000 DK A2",
csmc2: "PCIE-AI-NPU",
csmc3: "华为",
csmc4: "1.2",
csmc5: "已连接",
},
{
csmc: "192.168.1.66",
csms: "RTX4090",
csmc1: "Atlas 2000 DK A2",
csmc2: "PCIE-AI-NPU",
csmc3: "华为",
csmc4: "1.2",
csmc5: "已连接",
},
];
/** 表单提交 */
const handleSubmit = useThrottleFn(() => {
loading.value = true;
setTimeout(() => {
ElMessage.success("修改用户成功");
loading.value = false;
closeBack();
}, 1000);
}, 3000);
/** 返回默认页面 */ /** 返回默认页面 */
function closeBack() { function closeBack() {
router.replace({ path: "/operatorLibrary/calculate" }); router.replace({ path: "/operatorLibrary/calculate" });
} }
/** 初始化数据 */
function initData(){
let id=route.query.id;
loading.value = true;
OperatorApi.findOne(id).then(res =>{
//JSON
res.data.data.parametersJson = JSON.stringify(res.data.data.parameters);
dataInfo.value = res.data.data;
loading.value = false;
});
}
onMounted(() => { onMounted(() => {
//handleQuery(); initData();
}); });
</script> </script>
<style scoped lang='scss'> <style scoped lang='scss'>