提交代码

main
姜玉琦 2024-07-10 02:00:20 +08:00
parent 7ddabba1e0
commit 9826b3285a
3 changed files with 229 additions and 174 deletions

View File

@ -3,7 +3,9 @@
<div class="app-container model-detail"> <div class="app-container model-detail">
<!-- 用户新增/编辑表单 --> <!-- 用户新增/编辑表单 -->
<el-card> <el-card>
<template #header><svg-icon icon-class="pause" style="width:20px;height:20px;" /> 算子基本信息 </template> <template #header
><svg-icon icon-class="pause" style="width: 20px; height: 20px" /> 算子基本信息
</template>
<el-row> <el-row>
<el-col :lg="12" :xs="24"> <el-col :lg="12" :xs="24">
<el-form <el-form
@ -13,71 +15,79 @@
v-loading="loading" v-loading="loading"
label-width="80px" label-width="80px"
> >
<el-form-item label="算子名称" prop="username"> <el-form-item label="算子名称" prop="operator_name">
<el-input <el-input v-model="formData.operator_name" placeholder="请输入算子名称" />
v-model="formData.username"
:readonly="!!formData.id"
placeholder="请输入算子名称"
/>
</el-form-item> </el-form-item>
<el-form-item label="算子版本" prop="nickname"> <el-form-item label="算子类型" prop="oper_sub_type">
<el-input v-model="formData.nickname" placeholder="请输入算子版本" /> <el-row style="width: 100%">
</el-form-item>
<el-form-item label="算子类型" prop="roleIds">
<el-row style="width:100%">
<el-col :span="12"> <el-col :span="12">
<el-select <el-select
v-model="formData.roleIds" v-model="formData.oper_main_type"
placeholder="请选择算子类型" placeholder="请选择算子主类型"
size="large"
style="width: 100%" style="width: 100%"
@change="handleChange"
> >
<el-option label="前置处理" value="1" /> <el-option
v-for="item in listOpt.operTypeList"
:key="item.oper_main_type"
:label="item.oper_main_type_name"
:value="item.oper_main_type"
/>
</el-select> </el-select>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-select <el-select
v-model="formData.roleIds2" v-model="formData.oper_sub_type"
placeholder="请选择算子类型" placeholder="请选择算子子类型"
size="large"
style="width: 100%" style="width: 100%"
> >
<el-option label="缩放算子" value="0" /> <el-option
<el-option label="图像分类" value="1" /> v-for="item in listOpt.operTypeList"
<el-option label="目标检测" value="2" /> :key="item.oper_sub_type"
:label="item.oper_sub_type_name"
:value="item.oper_sub_type"
/>
</el-select> </el-select>
</el-col> </el-col>
</el-row> </el-row>
</el-form-item> </el-form-item>
<el-form-item label="算子说明" prop="mobile"> <el-form-item label="算子说明" prop="operator_desc">
<el-input <el-input
v-model="formData.mobile" v-model="formData.operator_desc"
:rows="2" :rows="2"
type="textarea" type="textarea"
placeholder="请输入算子说明" placeholder="请输入算子说明"
maxlength="11" maxlength="1024"
/> />
</el-form-item> </el-form-item>
<el-form-item label="算子文件" prop="email"> <el-form-item label="算子文件">
<el-upload <el-upload
v-model:file-list="fileList" action=""
class="upload-demo" class="upload-demo"
action="https://run.mocky.io/v3/9d059bf9-4660-45f2-925d-ce80ad6c4d15" ref="upload"
multiple :on-change="handleFileChange"
:on-preview="handlePreview" :on-remove="handleFileRemove"
:on-remove="handleRemove" :auto-upload="false"
:before-remove="beforeRemove" :limit="1"
:limit="3" accept="application/json"
:on-exceed="handleExceed"
> >
<el-button type="primary" <el-button type="primary"
><el-icon class="el-icon--upload"> <i-ep-upload-filled /> </el-icon ><el-icon class="el-icon--upload"> <i-ep-upload-filled /> </el-icon
>选择文件</el-button >选择文件</el-button
> >
<template #tip> <template #tip>
<div class="el-upload__tip">请上传大小不超过 <strong style="color: red">10M</strong>格式为 <div class="el-upload__tip">
<strong style="color: red">json</strong> 的文件</div> 请上传大小不超过 <strong style="color: red">10M</strong>格式为
<strong style="color: red">json</strong> 的文件
</div>
</template> </template>
</el-upload> </el-upload>
</el-form-item> </el-form-item>
<el-form-item label="文件预览">
<pre class="line-numbers"><code :class="`language-${type}`">{{code}}</code></pre>
</el-form-item>
</el-form> </el-form>
</el-col> </el-col>
<el-col :lg="12" :xs="24"> <el-col :lg="12" :xs="24">
@ -106,16 +116,48 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
defineOptions({ import request from "axios";
name: "User", import ConstApi from "@/api/const";
inheritAttrs: false, import JsonViewer from 'vue-json-viewer';
});
import UserAPI from "@/api/user"; import UserAPI from "@/api/user";
import { UserForm } from "@/api/user/model"; import { UserForm } from "@/api/user/model";
const router = useRouter(); const router = useRouter();
const loading = ref(false); // const loading = ref(false); //
const fileStatus = ref(false); //
// JSON
const props = withDefaults(defineProps<{
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 calTypeList = ref<OptionType[]>(); //
@ -124,6 +166,12 @@ const formData = reactive<UserForm>({
status: 1, status: 1,
}); });
//
let listOpt = reactive({
operTypeList: [],
operSubTypeList: [],
});
// //
const rules = reactive({ const rules = reactive({
username: [{ required: true, message: "不能为空", trigger: "blur" }], username: [{ required: true, message: "不能为空", trigger: "blur" }],
@ -172,36 +220,101 @@ function closeBack() {
router.replace({ path: "/operatorLibrary/calculate" }); router.replace({ path: "/operatorLibrary/calculate" });
} }
/** 算子主类型改变 */
function handleChange() {
listOpt.operTypeList.forEach((item) => {
if (item.oper_main_type == formData.oper_main_type) {
listOpt.operSubTypeList.value = item.oper_sub_type_list;
}
});
}
//
function handleFileChange(file) {
// FileReader
let reader = new FileReader();
// FileReader
if (typeof FileReader === "undefined") {
this.$message({
type: "info",
message: "您的浏览器不支持文件读取。",
});
return;
}
uploadFile(file).then((res) => {
props.code = res;
fileStatus.value = true;
});
}
//
function uploadFile(file) {
return new Promise(function (resolve, reject) {
let reader = new FileReader();
reader.readAsArrayBuffer(file.raw);
reader.onload = function (e) {
var ints = new Uint8Array(e.target.result); //使Uint8Array
let snippets = new TextDecoder("UTF-8").decode(ints); //
resolve(snippets);
};
});
}
//
function handleFileRemove() {
props.code = "";
fileStatus.value = false;
}
//
const initData = () => {
request.all(ConstApi.operMainType()).then((res) => {
if (res.code == 200) {
listOpt.operTypeList.value = res.data.data.oper_main_type_list;
}
});
};
onMounted(() => { onMounted(() => {
//handleQuery(); initData();
}); });
</script> </script>
<style scoped lang='scss'> <style scoped lang="scss">
.model-detail{ .model-detail {
:deep(.el-card__header){ :deep(.el-card__header) {
padding:8px 4px; padding: 8px 4px;
display: flex; display: flex;
align-items: center align-items: center;
} }
} }
.sp-file{ .sp-file {
color:#29d; color: #29d;
} }
.tb-base-info{ .tb-base-info {
line-height: 30px; line-height: 30px;
} }
:deep(.svg-icon){ :deep(.svg-icon) {
margin-right:8px; margin-right: 8px;
} }
.card-footer{ .card-footer {
position: fixed; position: fixed;
width: calc(100% - 215px); width: calc(100% - 215px);
bottom: 0px; bottom: 0px;
:deep(.el-card__body){ :deep(.el-card__body) {
padding:10px; padding: 10px;
.el-pagination{ .el-pagination {
justify-content: end; justify-content: end;
} }
} }
} }
</style> </style>
<style lang="scss">
pre {
span {
font-family: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace;
}
code {
font-size: 16px !important;
}
}
</style>

View File

@ -5,21 +5,15 @@
<template #header> <template #header>
<div class="flex justify-between"> <div class="flex justify-between">
<div> <div>
<el-button type="primary" @click="openDialog('user-form')" <el-button type="primary" @click="handleAdd()"
><i-ep-plus />添加算子</el-button ><i-ep-plus />添加算子</el-button
> >
<el-button
type="primary"
:disabled="removeIds.length === 0"
@click="handleDelete()"
><i-ep-delete />算子例程下载</el-button
>
</div> </div>
<div> <div>
<el-form ref="queryFormRef" :model="queryParams" :inline="true"> <el-form ref="queryFormRef" :model="queryParams" :inline="true">
<el-form-item label="算子名称" prop="keywords"> <el-form-item label="算子名称" prop="operator_name">
<el-input <el-input
v-model="queryParams.keywords" v-model="queryParams.operator_name"
placeholder="请输入算子名称" placeholder="请输入算子名称"
clearable clearable
style="width: 200px" style="width: 200px"
@ -42,27 +36,25 @@
<el-table <el-table
v-loading="loading" v-loading="loading"
:data="tableData" :data="pageData"
stripe stripe
@selection-change="handleSelectionChange" @selection-change="handleSelectionChange"
> >
<el-table-column label="算子名称" align="left" prop="szmc" width="300" /> <el-table-column label="算子名称" align="left" prop="operator_name" width="300" />
<el-table-column label="算子主类型" align="left" prop="szlx" width="180"/> <el-table-column label="算子主类型" align="left" prop="oper_main_type_name" width="180"/>
<el-table-column label="算子子类型" align="left" prop="szzlx" width="180" /> <el-table-column label="算子子类型" align="left" prop="oper_sub_type_name" width="180" />
<!-- <el-table-column label="版本" width="180" align="left" prop="bb" /> <el-table-column label="算子说明" align="left" prop="operator_desc" />
<el-table-column label="适配硬件" width="280" align="left" prop="spyj" /> --> <el-table-column label="创建时间" width="180" align="left" prop="create_time" />
<el-table-column label="算子说明" align="left" prop="spyj" /> <el-table-column label="操作" fixed="right" align="center" width="220">
<el-table-column label="创建时间" width="180" align="left" prop="hlcjsj" />
<el-table-column label="操作" fixed="right" width="220">
<template #default="scope"> <template #default="scope">
<el-button <el-button
text text
type="primary" type="primary"
size="small" size="small"
@click="openDialogView('user-form', scope.row.id)" @click="handleDetail(scope.row.operator_id)"
><i-ep-view />查看</el-button ><i-ep-view />查看</el-button
> >
<el-button text type="primary" size="small" @click="handleDelete(scope.row)" <el-button text type="primary" size="small" @click="handleDelete(scope.row.operator_id)"
><i-ep-delete />删除</el-button ><i-ep-delete />删除</el-button
> >
</template> </template>
@ -72,8 +64,8 @@
<pagination <pagination
v-if="total > 0" v-if="total > 0"
v-model:total="total" v-model:total="total"
v-model:page="queryParams.pageNum" v-model:page="queryParams.page_num"
v-model:limit="queryParams.pageSize" v-model:limit="queryParams.page_size"
@pagination="handleQuery" @pagination="handleQuery"
/> />
</el-card> </el-card>
@ -81,135 +73,79 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
defineOptions({ import OperatorApi from '@/api/operator'
name: "calculateIndex",
inheritAttrs: false,
});
import { UserQuery } from "@/api/user/model";
const queryFormRef = ref(ElForm); //
const router = useRouter(); const router = useRouter();
const loading = ref(false); // const loading = ref(false); //
const removeIds = ref([]); // ID const queryFormRef = ref(ElForm); //
const queryParams = reactive<UserQuery>({ const queryParams = reactive({
pageNum: 1, page_num: 1,
pageSize: 10, page_size: 10,
order_type:null,
order_by:null,
operator_name:null,
oper_main_type:null
}); });
const dateTimeRange = ref("");
const total = ref(0); // const total = ref(0); //
const pageData = ref([]); //
watch(dateTimeRange, (newVal) => { const removeIds = ref([]); // ID
if (newVal) {
queryParams.startTime = newVal[0];
queryParams.endTime = newVal[1];
}
});
const tableData = [
{
szmc: "图像分类算子名称",
szlx: "前处理",
szzlx: "图像分类",
bb: "1.2",
spyj: "进行19种类型的图像分类模型",
hlcjsj: "2024-05-03",
},
{
szmc: "目标检测算子名称",
szlx: "前处理",
szzlx: "目标检测",
bb: "1.5",
spyj: "人员检测的模型",
hlcjsj: "2024-06-07",
},
{
szmc: "人脸识别算子名称",
szlx: "前处理",
szzlx: "人脸识别",
bb: "1.0.0",
spyj: "人脸识别",
hlcjsj: "2024-06-08",
},
{
szmc: "数据分析算子名称",
szlx: "后处理",
szzlx: "数据分析",
bb: "1.6.1",
spyj: "进行数据分离ETL工具",
hlcjsj: "2024-06-08",
},
];
/** 查询 */ /** 查询 */
function handleQuery() { function handleQuery() {
loading.value = true; loading.value = true;
ElMessage.success("查询成功"); OperatorApi.list(queryParams)
.then((res) => {
pageData.value = res.data.data.operator_list;
total.value = res.data.data.total;
})
.finally(() => {
loading.value = false; loading.value = false;
// UserAPI.getPage(queryParams) });
// .then((data) => {
// console.log("handleQuery", data);
// pageData.value = data.list;
// total.value = data.total;
// })
// .finally(() => {
// loading.value = false;
// });
} }
/** 重置查询 */ /** 重置查询 */
function resetQuery() { function resetQuery() {
queryFormRef.value.resetFields(); queryFormRef.value.resetFields();
dateTimeRange.value = "";
queryParams.pageNum = 1; queryParams.pageNum = 1;
queryParams.deptId = undefined; queryParams.order_type = null,
queryParams.startTime = undefined; queryParams.order_by = null,
queryParams.endTime = undefined; queryParams.operator_name = null,
queryParams.oper_main_type = null
handleQuery(); handleQuery();
} }
/** 行选中 */ /** 行选中 */
function handleSelectionChange(selection: any) { function handleSelectionChange(selection: any) {
removeIds.value = selection.map((item: any) => item.id); removeIds.value = selection.map((item: any) => item.operator_id);
} }
/** 删除数据 */ /** 删除数据 */
function handleDelete(row: { [key: string]: any }) { function handleDelete(id?: number) {
ElMessageBox.confirm("确认删除算子?", "警告", { ElMessageBox.confirm("确认删除算子?", "警告", {
confirmButtonText: "确定", confirmButtonText: "确定",
cancelButtonText: "取消", cancelButtonText: "取消",
type: "warning", type: "warning",
}).then(function () { }).then(function () {
OperatorApi.deleteOperator(id).then((res) => {
ElMessage.success("删除成功"); ElMessage.success("删除成功");
resetQuery();
});
}); });
} }
/** /** 查看算子 */
* 打开弹窗 function handleDetail(id?: number) {
* router.replace({ path: "/operatorLibrary/calculateView?id="+id });
* @param type 弹窗类型 用户表单user-form | 用户导入user-import }
* @param id 用户ID
*/ /** 新增算子 */
async function openDialog(type: string, id?: number) { function handleAdd() {
router.replace({ path: "/operatorLibrary/calculateEdit" }); router.replace({ path: "/operatorLibrary/calculateEdit" });
} }
async function openDialogView(type: string, id?: number) {
router.replace({ path: "/operatorLibrary/calculateView" });
}
/** 下载导入模板 */
function downloadTemplate() {
ElMessage.success("下载模板成功");
}
/** 导出用户 */
function handleExport() {
ElMessage.success("导出成功");
}
onMounted(() => { onMounted(() => {
//handleQuery(); handleQuery();
}); });
</script> </script>

View File

@ -8,6 +8,12 @@
<el-button type="primary" @click="openDialog('user-form')" <el-button type="primary" @click="openDialog('user-form')"
><i-ep-plus />添加算子程序</el-button ><i-ep-plus />添加算子程序</el-button
> >
<el-button
type="primary"
:disabled="removeIds.length === 0"
@click="handleDelete()"
><i-ep-delete />算子例程下载</el-button
>
</div> </div>
<div> <div>
<el-form ref="queryFormRef" :model="queryParams" :inline="true"> <el-form ref="queryFormRef" :model="queryParams" :inline="true">