提交代码

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">
<!-- 用户新增/编辑表单 -->
<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-col :lg="12" :xs="24">
<el-form
@ -13,71 +15,79 @@
v-loading="loading"
label-width="80px"
>
<el-form-item label="算子名称" prop="username">
<el-input
v-model="formData.username"
:readonly="!!formData.id"
placeholder="请输入算子名称"
/>
<el-form-item label="算子名称" prop="operator_name">
<el-input v-model="formData.operator_name" placeholder="请输入算子名称" />
</el-form-item>
<el-form-item label="算子版本" prop="nickname">
<el-input v-model="formData.nickname" placeholder="请输入算子版本" />
</el-form-item>
<el-form-item label="算子类型" prop="roleIds">
<el-row style="width:100%">
<el-form-item label="算子类型" prop="oper_sub_type">
<el-row style="width: 100%">
<el-col :span="12">
<el-select
v-model="formData.roleIds"
placeholder="请选择算子类型"
v-model="formData.oper_main_type"
placeholder="请选择算子主类型"
size="large"
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-col>
<el-col :span="12">
<el-select
v-model="formData.roleIds2"
placeholder="请选择算子类型"
v-model="formData.oper_sub_type"
placeholder="请选择算子子类型"
size="large"
style="width: 100%"
>
<el-option label="缩放算子" value="0" />
<el-option label="图像分类" value="1" />
<el-option label="目标检测" value="2" />
<el-option
v-for="item in listOpt.operTypeList"
:key="item.oper_sub_type"
:label="item.oper_sub_type_name"
:value="item.oper_sub_type"
/>
</el-select>
</el-col>
</el-row>
</el-form-item>
<el-form-item label="算子说明" prop="mobile">
<el-form-item label="算子说明" prop="operator_desc">
<el-input
v-model="formData.mobile"
v-model="formData.operator_desc"
:rows="2"
type="textarea"
placeholder="请输入算子说明"
maxlength="11"
maxlength="1024"
/>
</el-form-item>
<el-form-item label="算子文件" prop="email">
<el-form-item label="算子文件">
<el-upload
v-model:file-list="fileList"
action=""
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"
ref="upload"
:on-change="handleFileChange"
:on-remove="handleFileRemove"
:auto-upload="false"
:limit="1"
accept="application/json"
>
<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">请上传大小不超过 <strong style="color: red">10M</strong>格式为
<strong style="color: red">json</strong> 的文件</div>
<div class="el-upload__tip">
请上传大小不超过 <strong style="color: red">10M</strong>格式为
<strong style="color: red">json</strong> 的文件
</div>
</template>
</el-upload>
</el-form-item>
<el-form-item label="文件预览">
<pre class="line-numbers"><code :class="`language-${type}`">{{code}}</code></pre>
</el-form-item>
</el-form>
</el-col>
<el-col :lg="12" :xs="24">
@ -99,23 +109,55 @@
</el-row>
</el-card>
<el-card class="card-footer">
<el-button type="primary" @click="handleSubmit"><i-ep-check /> </el-button>
<el-button @click="closeBack"><i-ep-close /> </el-button>
<el-button type="primary" @click="handleSubmit"><i-ep-check /> </el-button>
<el-button @click="closeBack"><i-ep-close /> </el-button>
</el-card>
</div>
</template>
<script setup lang="ts">
defineOptions({
name: "User",
inheritAttrs: false,
});
import request from "axios";
import ConstApi from "@/api/const";
import JsonViewer from 'vue-json-viewer';
import UserAPI from "@/api/user";
import { UserForm } from "@/api/user/model";
const router = useRouter();
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[]>(); //
@ -124,6 +166,12 @@ const formData = reactive<UserForm>({
status: 1,
});
//
let listOpt = reactive({
operTypeList: [],
operSubTypeList: [],
});
//
const rules = reactive({
username: [{ required: true, message: "不能为空", trigger: "blur" }],
@ -172,36 +220,101 @@ function closeBack() {
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(() => {
//handleQuery();
initData();
});
</script>
<style scoped lang='scss'>
.model-detail{
:deep(.el-card__header){
padding:8px 4px;
display: flex;
align-items: center
}
<style scoped lang="scss">
.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{
line-height: 30px;
.tb-base-info {
line-height: 30px;
}
: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;
}
}
}
</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>
<div class="flex justify-between">
<div>
<el-button type="primary" @click="openDialog('user-form')"
<el-button type="primary" @click="handleAdd()"
><i-ep-plus />添加算子</el-button
>
<el-button
type="primary"
:disabled="removeIds.length === 0"
@click="handleDelete()"
><i-ep-delete />算子例程下载</el-button
>
</div>
<div>
<el-form ref="queryFormRef" :model="queryParams" :inline="true">
<el-form-item label="算子名称" prop="keywords">
<el-form-item label="算子名称" prop="operator_name">
<el-input
v-model="queryParams.keywords"
v-model="queryParams.operator_name"
placeholder="请输入算子名称"
clearable
style="width: 200px"
@ -42,27 +36,25 @@
<el-table
v-loading="loading"
:data="tableData"
:data="pageData"
stripe
@selection-change="handleSelectionChange"
>
<el-table-column label="算子名称" align="left" prop="szmc" width="300" />
<el-table-column label="算子主类型" align="left" prop="szlx" width="180"/>
<el-table-column label="算子子类型" align="left" prop="szzlx" width="180" />
<!-- <el-table-column label="版本" width="180" align="left" prop="bb" />
<el-table-column label="适配硬件" width="280" align="left" prop="spyj" /> -->
<el-table-column label="算子说明" align="left" prop="spyj" />
<el-table-column label="创建时间" width="180" align="left" prop="hlcjsj" />
<el-table-column label="操作" fixed="right" width="220">
<el-table-column label="算子名称" align="left" prop="operator_name" width="300" />
<el-table-column label="算子主类型" align="left" prop="oper_main_type_name" width="180"/>
<el-table-column label="算子子类型" align="left" prop="oper_sub_type_name" width="180" />
<el-table-column label="算子说明" align="left" prop="operator_desc" />
<el-table-column label="创建时间" width="180" align="left" prop="create_time" />
<el-table-column label="操作" fixed="right" align="center" width="220">
<template #default="scope">
<el-button
text
type="primary"
size="small"
@click="openDialogView('user-form', scope.row.id)"
@click="handleDetail(scope.row.operator_id)"
><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
>
</template>
@ -72,8 +64,8 @@
<pagination
v-if="total > 0"
v-model:total="total"
v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize"
v-model:page="queryParams.page_num"
v-model:limit="queryParams.page_size"
@pagination="handleQuery"
/>
</el-card>
@ -81,135 +73,79 @@
</template>
<script setup lang="ts">
defineOptions({
name: "calculateIndex",
inheritAttrs: false,
});
import { UserQuery } from "@/api/user/model";
const queryFormRef = ref(ElForm); //
import OperatorApi from '@/api/operator'
const router = useRouter();
const loading = ref(false); //
const removeIds = ref([]); // ID
const queryParams = reactive<UserQuery>({
pageNum: 1,
pageSize: 10,
const queryFormRef = ref(ElForm); //
const queryParams = reactive({
page_num: 1,
page_size: 10,
order_type:null,
order_by:null,
operator_name:null,
oper_main_type:null
});
const dateTimeRange = ref("");
const total = ref(0); //
const pageData = ref([]); //
watch(dateTimeRange, (newVal) => {
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",
},
];
const removeIds = ref([]); // ID
/** 查询 */
function handleQuery() {
loading.value = true;
ElMessage.success("查询成功");
loading.value = false;
// UserAPI.getPage(queryParams)
// .then((data) => {
// console.log("handleQuery", data);
// pageData.value = data.list;
// total.value = data.total;
// })
// .finally(() => {
// loading.value = false;
// });
OperatorApi.list(queryParams)
.then((res) => {
pageData.value = res.data.data.operator_list;
total.value = res.data.data.total;
})
.finally(() => {
loading.value = false;
});
}
/** 重置查询 */
function resetQuery() {
queryFormRef.value.resetFields();
dateTimeRange.value = "";
queryParams.pageNum = 1;
queryParams.deptId = undefined;
queryParams.startTime = undefined;
queryParams.endTime = undefined;
queryParams.order_type = null,
queryParams.order_by = null,
queryParams.operator_name = null,
queryParams.oper_main_type = null
handleQuery();
}
/** 行选中 */
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("确认删除算子?", "警告", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
}).then(function () {
ElMessage.success("删除成功");
OperatorApi.deleteOperator(id).then((res) => {
ElMessage.success("删除成功");
resetQuery();
});
});
}
/**
* 打开弹窗
*
* @param type 弹窗类型 用户表单user-form | 用户导入user-import
* @param id 用户ID
*/
async function openDialog(type: string, id?: number) {
/** 查看算子 */
function handleDetail(id?: number) {
router.replace({ path: "/operatorLibrary/calculateView?id="+id });
}
/** 新增算子 */
function handleAdd() {
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(() => {
//handleQuery();
handleQuery();
});
</script>

View File

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