mirror of
http://git.xinwangdao.com/cnnc-embedded-parts-detect/detect-embeded.git
synced 2025-06-24 13:34:13 +08:00
fixed
This commit is contained in:
parent
6bb925a1ec
commit
673bac2372
@ -124,7 +124,10 @@
|
|||||||
|
|
||||||
:deep(.vben-basic-table .ant-table-wrapper .ant-table.ant-table-bordered .ant-table-title) {
|
:deep(.vben-basic-table .ant-table-wrapper .ant-table.ant-table-bordered .ant-table-title) {
|
||||||
padding-top: 8px !important;
|
padding-top: 8px !important;
|
||||||
border-radius: 0;
|
border-radius: 8px 8px 0 0;
|
||||||
|
border-left: 1px solid #183171 !important;
|
||||||
|
border-top: 1px solid #183171 !important;
|
||||||
|
border-right: 1px solid #183171 !important;
|
||||||
background-color: #13265a !important;
|
background-color: #13265a !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -475,3 +478,39 @@
|
|||||||
:deep(.ant-picker-time-panel-cell-selected .ant-picker-time-panel-cell-inner) {
|
:deep(.ant-picker-time-panel-cell-selected .ant-picker-time-panel-cell-inner) {
|
||||||
background-color: rgba(146,214,237,0.3) !important;
|
background-color: rgba(146,214,237,0.3) !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
:deep(.ant-card) {
|
||||||
|
border: 1px solid #183171 !important;
|
||||||
|
background-color: #13265a !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep(.ant-card-body) {
|
||||||
|
padding: 0 !important ;
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep(.ant-page-header-heading-title) {
|
||||||
|
font-family: "Noto Sans SC", serif;
|
||||||
|
font-size: 20px;
|
||||||
|
font-weight: normal;
|
||||||
|
color: white !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep(.ant-descriptions-view) {
|
||||||
|
border: 1px solid #183171 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep(.ant-descriptions-row) {
|
||||||
|
border-bottom: 1px solid #183171 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep(.ant-descriptions-item-label) {
|
||||||
|
background-color: rgba(146,214,237,0.05) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep(.ant-descriptions-item-label),
|
||||||
|
:deep(.ant-descriptions-item-content) {
|
||||||
|
font-family: "Noto Sans SC", serif;
|
||||||
|
font-size: 14px;
|
||||||
|
color: white !important;
|
||||||
|
border-inline-end: 1px solid #183171 !important;
|
||||||
|
}
|
||||||
|
@ -26,7 +26,7 @@ const data: AppRouteModule = {
|
|||||||
name: 'TaskPage',
|
name: 'TaskPage',
|
||||||
component: () => import('/@/views/data/task/index.vue'),
|
component: () => import('/@/views/data/task/index.vue'),
|
||||||
meta: {
|
meta: {
|
||||||
title: '任务',
|
title: '任务管理',
|
||||||
ignoreAuth: true,
|
ignoreAuth: true,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -39,6 +39,15 @@ const data: AppRouteModule = {
|
|||||||
ignoreAuth: true,
|
ignoreAuth: true,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
path: 'task-log',
|
||||||
|
name: 'TaskLogPage',
|
||||||
|
component: () => import('/@/views/data/task-log/index.vue'),
|
||||||
|
meta: {
|
||||||
|
title: '任务日志',
|
||||||
|
ignoreAuth: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
],
|
],
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
const entity = ref();
|
const entity = ref();
|
||||||
|
|
||||||
const [registerForm, { resetFields, setFieldsValue, validate }] = useForm({
|
const [registerForm, { resetFields, setFieldsValue, validate }] = useForm({
|
||||||
labelWidth: 120,
|
labelWidth: 100,
|
||||||
schemas: formSchema,
|
schemas: formSchema,
|
||||||
showActionButtonGroup: false,
|
showActionButtonGroup: false,
|
||||||
});
|
});
|
||||||
|
@ -1,74 +0,0 @@
|
|||||||
<template>
|
|
||||||
<Card :bordered="false" :loading="isLoading">
|
|
||||||
<PageHeader
|
|
||||||
:title="title"
|
|
||||||
@back="() => $router.go(-1)"
|
|
||||||
>
|
|
||||||
<template #extra>
|
|
||||||
<a-button type="primary" @click="$router.go(-1)">返回上一页面</a-button>
|
|
||||||
</template>
|
|
||||||
</PageHeader>
|
|
||||||
<Descriptions bordered :column="3">
|
|
||||||
<Descriptions.Item
|
|
||||||
v-for="p in displayProps"
|
|
||||||
:key="p.key"
|
|
||||||
:label="p.title"
|
|
||||||
:span="['avatar'].includes(p.key) ? 3 : 1"
|
|
||||||
>
|
|
||||||
<span v-if="p.key === 'avatar'">
|
|
||||||
<Image style="width: 100px" :src="p.value"/>
|
|
||||||
</span>
|
|
||||||
<template v-else>
|
|
||||||
{{ p.value }}
|
|
||||||
</template>
|
|
||||||
</Descriptions.Item>
|
|
||||||
</Descriptions>
|
|
||||||
</Card>
|
|
||||||
</template>
|
|
||||||
<script lang="ts" setup>
|
|
||||||
import { onMounted, computed, ref, Ref } from 'vue';
|
|
||||||
import { useRoute } from 'vue-router';
|
|
||||||
import { useAsyncState } from '@vueuse/core';
|
|
||||||
import { PageHeader, Descriptions, Card } from 'ant-design-vue';
|
|
||||||
import { descriptionColumns } from './schema';
|
|
||||||
import * as TaskLogApi from '@/api/data/taskLogApi';
|
|
||||||
import { TaskLog } from '@/api/model/taskLog';
|
|
||||||
|
|
||||||
const route = useRoute();
|
|
||||||
const id = ref(route.params?.id);
|
|
||||||
const title = route.meta.title
|
|
||||||
|
|
||||||
// id 查询
|
|
||||||
const {
|
|
||||||
state: detail,
|
|
||||||
isReady: isDetailReady,
|
|
||||||
isLoading,
|
|
||||||
execute,
|
|
||||||
} = useAsyncState(
|
|
||||||
TaskLogApi.getById(id.value).then((res: TaskLog) => res),
|
|
||||||
null,
|
|
||||||
{
|
|
||||||
immediate: false,
|
|
||||||
},
|
|
||||||
);
|
|
||||||
|
|
||||||
onMounted(() => {
|
|
||||||
execute();
|
|
||||||
});
|
|
||||||
|
|
||||||
const displayProps: Ref<Array<any>> = computed(() => {
|
|
||||||
if (!isDetailReady.value) return {};
|
|
||||||
const display: any = descriptionColumns.map(({ title, dataIndex = '', customRender }) => ({
|
|
||||||
key: dataIndex,
|
|
||||||
title,
|
|
||||||
value: customRender ? customRender({ text: detail.value[dataIndex], record: detail.value }) : detail.value[dataIndex],
|
|
||||||
}));
|
|
||||||
return display;
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style scoped lang="less">
|
|
||||||
::v-deep(.ant-card-body){
|
|
||||||
padding-top: 0;
|
|
||||||
}
|
|
||||||
</style>
|
|
@ -1,63 +0,0 @@
|
|||||||
<template>
|
|
||||||
<BasicDrawer v-bind="$attrs" @register="registerDrawer" showFooter :title="getTitle" width="600px" @ok="handleSubmit">
|
|
||||||
<BasicForm @register="registerForm" />
|
|
||||||
</BasicDrawer>
|
|
||||||
</template>
|
|
||||||
<script lang="ts" setup>
|
|
||||||
import { defineEmits, ref, computed, unref } from 'vue';
|
|
||||||
import { BasicForm, useForm } from '@/components/Form/index';
|
|
||||||
import { formSchema } from './schema';
|
|
||||||
import { BasicDrawer, useDrawerInner } from '@/components/Drawer';
|
|
||||||
import * as TaskLogApi from '@/api/data/taskLogApi';
|
|
||||||
|
|
||||||
const emit = defineEmits(['success', 'register']);
|
|
||||||
const isUpdate = ref(true);
|
|
||||||
const entity = ref();
|
|
||||||
|
|
||||||
const [registerForm, { resetFields, setFieldsValue, validate }] = useForm({
|
|
||||||
labelWidth: 120,
|
|
||||||
schemas: formSchema,
|
|
||||||
showActionButtonGroup: false,
|
|
||||||
});
|
|
||||||
|
|
||||||
const [registerDrawer, { setDrawerProps, closeDrawer }] = useDrawerInner(async (data) => {
|
|
||||||
await resetFields();
|
|
||||||
setDrawerProps({ confirmLoading: false });
|
|
||||||
isUpdate.value = !!data?.isUpdate;
|
|
||||||
entity.value = data?.record;
|
|
||||||
|
|
||||||
if (unref(isUpdate)) {
|
|
||||||
await setFieldsValue({
|
|
||||||
...data.record,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
const getTitle = computed(() => (!unref(isUpdate) ? '新增' : '编辑'));
|
|
||||||
|
|
||||||
async function handleSubmit() {
|
|
||||||
try {
|
|
||||||
const values = await validate();
|
|
||||||
setDrawerProps({ confirmLoading: true });
|
|
||||||
const {
|
|
||||||
...rest
|
|
||||||
} = values;
|
|
||||||
const action = !unref(isUpdate) ? TaskLogApi.add : TaskLogApi.update;
|
|
||||||
const data = !unref(isUpdate)
|
|
||||||
? {
|
|
||||||
...rest,
|
|
||||||
}
|
|
||||||
: Object.assign({},
|
|
||||||
{
|
|
||||||
...unref(entity),
|
|
||||||
...rest,
|
|
||||||
},
|
|
||||||
);
|
|
||||||
await action(data);
|
|
||||||
closeDrawer();
|
|
||||||
emit('success');
|
|
||||||
} finally {
|
|
||||||
setDrawerProps({ confirmLoading: false });
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
@ -1,128 +1,50 @@
|
|||||||
<template>
|
<template>
|
||||||
<div>
|
<div>
|
||||||
<BasicTable @register="registerTable">
|
<div class="header">
|
||||||
<template #headerTop>
|
<SvgIcon size="19" name="list" />
|
||||||
<Alert type="info" show-icon>
|
<div class="title">检测日志</div>
|
||||||
<template #message>
|
</div>
|
||||||
<template v-if="checkedKeys.length > 0">
|
<BasicTable @register="registerTable" />
|
||||||
<span>已选中{{ checkedKeys.length }}条记录</span>
|
|
||||||
<a-button type="link" @click="setSelectedRowKeys([])" size="small">清空</a-button>
|
|
||||||
<Popconfirm
|
|
||||||
v-if="hasPermission('AUTH_DATA_TASK_LOG:DELETE')"
|
|
||||||
class="ml-4"
|
|
||||||
title="确定要全部删除吗?"
|
|
||||||
ok-text="是"
|
|
||||||
cancel-text="否"
|
|
||||||
@confirm="handleBatchDelete"
|
|
||||||
>
|
|
||||||
<a href="#" class="text-red-500">删除</a>
|
|
||||||
</Popconfirm>
|
|
||||||
</template>
|
|
||||||
<template v-else>
|
|
||||||
<span>未选中任何项目</span>
|
|
||||||
</template>
|
|
||||||
</template>
|
|
||||||
</Alert>
|
|
||||||
</template>
|
|
||||||
<template #toolbar>
|
|
||||||
<a-button v-auth="'AUTH_DATA_TASK_LOG:ADD'" type="primary" @click="handleCreate"> 新增</a-button>
|
|
||||||
</template>
|
|
||||||
<template #bodyCell="{ column, record }">
|
|
||||||
<template v-if="column.dataIndex === 'action'">
|
|
||||||
<TableAction
|
|
||||||
:actions="[
|
|
||||||
{
|
|
||||||
label: '编辑',
|
|
||||||
icon: 'clarity:note-edit-line',
|
|
||||||
onClick: handleEdit.bind(null, record),
|
|
||||||
ifShow: hasPermission('AUTH_DATA_TASK_LOG:EDIT'),
|
|
||||||
divider:true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: '详情',
|
|
||||||
icon: 'ant-design:eye-outlined',
|
|
||||||
onClick: handleView.bind(null, record),
|
|
||||||
divider:true
|
|
||||||
},
|
|
||||||
]"
|
|
||||||
:dropDownActions="[
|
|
||||||
{
|
|
||||||
label: '删除',
|
|
||||||
icon: 'ant-design:delete-outlined',
|
|
||||||
color: 'error',
|
|
||||||
popConfirm: {
|
|
||||||
title: '是否确认删除',
|
|
||||||
confirm: handleDelete.bind(null, record),
|
|
||||||
placement: 'topRight',
|
|
||||||
},
|
|
||||||
ifShow: hasPermission('AUTH_DATA_TASK_LOG:DELETE'),
|
|
||||||
},
|
|
||||||
]"
|
|
||||||
/>
|
|
||||||
</template>
|
|
||||||
</template>
|
|
||||||
</BasicTable>
|
|
||||||
<TaskLogDrawer @register="registerDrawer" @success="handleSuccess" />
|
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import { ref } from 'vue';
|
|
||||||
import { Alert,Popconfirm } from 'ant-design-vue';
|
|
||||||
import { useGo } from '@/hooks/web/usePage';
|
import { useGo } from '@/hooks/web/usePage';
|
||||||
import { usePermission } from '@/hooks/web/usePermission';
|
import { usePermission } from '@/hooks/web/usePermission';
|
||||||
import { BasicTable, useTable, TableAction } from '@/components/Table';
|
import { BasicTable, useTable } from '@/components/Table';
|
||||||
import { isObject } from '@/utils/is';
|
import { isObject } from '@/utils/is';
|
||||||
import dayjs from 'dayjs';
|
import dayjs from 'dayjs';
|
||||||
import * as TaskLogApi from '@/api/data/taskLogApi';
|
import * as TaskLogApi from '@/api/data/taskLogApi';
|
||||||
import { useDrawer } from '@/components/Drawer';
|
|
||||||
import TaskLogDrawer from './drawer.vue';
|
|
||||||
import { columns, searchFormSchema } from './schema';
|
import { columns, searchFormSchema } from './schema';
|
||||||
import { useMessage } from "@/hooks/web/useMessage";
|
import { useMessage } from '@/hooks/web/useMessage';
|
||||||
|
import { SvgIcon } from '@/components/Icon';
|
||||||
defineOptions({
|
|
||||||
name: 'AUTH_DATA_TASK_LOG'
|
|
||||||
})
|
|
||||||
|
|
||||||
const { createMessage } = useMessage();
|
const { createMessage } = useMessage();
|
||||||
const { hasPermission } = usePermission();
|
const { hasPermission } = usePermission();
|
||||||
const go = useGo();
|
const go = useGo();
|
||||||
|
|
||||||
const checkedKeys = ref<Array<string | number>>([]);
|
|
||||||
const onSelectChange = (selectedRowKeys: (string | number)[]) => {
|
|
||||||
checkedKeys.value = selectedRowKeys.filter(k => typeof k !== 'undefined');
|
|
||||||
}
|
|
||||||
|
|
||||||
const [registerDrawer, { openDrawer }] = useDrawer();
|
|
||||||
const [registerTable, { reload, setSelectedRowKeys }] = useTable({
|
const [registerTable, { reload, setSelectedRowKeys }] = useTable({
|
||||||
title: '任务检测日志表',
|
|
||||||
api: (params) => TaskLogApi.search(handleParams(params)),
|
api: (params) => TaskLogApi.search(handleParams(params)),
|
||||||
columns,
|
columns,
|
||||||
formConfig: {
|
formConfig: {
|
||||||
labelWidth: 120,
|
labelWidth: 0,
|
||||||
schemas: searchFormSchema,
|
schemas: searchFormSchema,
|
||||||
showAdvancedButton: false,
|
showAdvancedButton: false,
|
||||||
},
|
},
|
||||||
rowSelection: {
|
|
||||||
type: 'checkbox',
|
|
||||||
onChange: onSelectChange,
|
|
||||||
},
|
|
||||||
useSearchForm: true,
|
useSearchForm: true,
|
||||||
showTableSetting: false,
|
showTableSetting: false,
|
||||||
bordered: false,
|
bordered: true,
|
||||||
showIndexColumn: false,
|
showIndexColumn: false,
|
||||||
canResize: false,
|
canResize: false,
|
||||||
rowKey: (record: any) => record.id,
|
rowKey: (record: any) => record.id,
|
||||||
actionColumn: {
|
|
||||||
width: 170,
|
|
||||||
title: '操作',
|
|
||||||
dataIndex: 'action',
|
|
||||||
fixed: 'right',
|
|
||||||
},
|
|
||||||
});
|
});
|
||||||
|
|
||||||
const handleParams = (params) => {
|
const handleParams = (params) => {
|
||||||
const { pageNum, pageSize, field = 'id', order = 'descend', ...rest } = params;
|
const { pageNum, pageSize, field = 'id', order = 'descend', ...rest } = params;
|
||||||
const handledParams: any = { pageNum, pageSize, orderByClause: `${field} ${order === 'descend' ? 'desc' : 'asc'}` };
|
const handledParams: any = {
|
||||||
|
pageNum,
|
||||||
|
pageSize,
|
||||||
|
orderByClause: `${field} ${order === 'descend' ? 'desc' : 'asc'}`,
|
||||||
|
};
|
||||||
Object.keys(rest).forEach((key) => {
|
Object.keys(rest).forEach((key) => {
|
||||||
const schema = searchFormSchema.find((item) => item.field === key);
|
const schema = searchFormSchema.find((item) => item.field === key);
|
||||||
const value = params[key];
|
const value = params[key];
|
||||||
@ -134,10 +56,16 @@
|
|||||||
} else if (['Select', 'ApiSelect', 'ApiTreeSelect'].includes(schema.component)) {
|
} else if (['Select', 'ApiSelect', 'ApiTreeSelect'].includes(schema.component)) {
|
||||||
handledParams[paramKey] = isObject(value) ? value.value : value;
|
handledParams[paramKey] = isObject(value) ? value.value : value;
|
||||||
} else if (schema.component === 'RangePicker') {
|
} else if (schema.component === 'RangePicker') {
|
||||||
handledParams[`${paramKey}From`] = dayjs(value[0]).startOf('d').format('YYYY-MM-DD HH:mm:ss');
|
handledParams[`${paramKey}From`] = dayjs(value[0])
|
||||||
handledParams[`${paramKey}To`] = dayjs(value[1]).endOf('d').format('YYYY-MM-DD HH:mm:ss');
|
.startOf('d')
|
||||||
|
.format('YYYY-MM-DD HH:mm:ss');
|
||||||
|
handledParams[`${paramKey}To`] = dayjs(value[1])
|
||||||
|
.endOf('d')
|
||||||
|
.format('YYYY-MM-DD HH:mm:ss');
|
||||||
} else if (schema.component === 'DatePicker') {
|
} else if (schema.component === 'DatePicker') {
|
||||||
handledParams[paramKey] = dayjs(value).format((schema.componentProps as any).format || 'YYYY-MM-DD');
|
handledParams[paramKey] = dayjs(value).format(
|
||||||
|
(schema.componentProps as any).format || 'YYYY-MM-DD',
|
||||||
|
);
|
||||||
} else {
|
} else {
|
||||||
handledParams[paramKey] = value;
|
handledParams[paramKey] = value;
|
||||||
}
|
}
|
||||||
@ -148,44 +76,7 @@
|
|||||||
});
|
});
|
||||||
return handledParams;
|
return handledParams;
|
||||||
};
|
};
|
||||||
|
|
||||||
const handleCreate = () => {
|
|
||||||
openDrawer(true, {
|
|
||||||
isUpdate: false,
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
const handleEdit = (record: Recordable) => {
|
|
||||||
openDrawer(true, {
|
|
||||||
record,
|
|
||||||
isUpdate: true,
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
const handleDelete = (record: Recordable) => {
|
|
||||||
TaskLogApi.remove(record.id).then((_) => {
|
|
||||||
reload();
|
|
||||||
setSelectedRowKeys([])
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
const handleBatchDelete = () => {
|
|
||||||
if (checkedKeys.value.length === 0) {
|
|
||||||
createMessage.error('当前未选中任何项目!');
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
TaskLogApi.batchRemove(checkedKeys.value).then((_) => {
|
|
||||||
reload();
|
|
||||||
setSelectedRowKeys([])
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
const handleSuccess = () => {
|
|
||||||
reload();
|
|
||||||
};
|
|
||||||
|
|
||||||
const handleView = (record) => {
|
|
||||||
go('/data/task-log/detail/' + record.id);
|
|
||||||
};
|
|
||||||
</script>
|
</script>
|
||||||
<style lang="less" scoped></style>
|
<style lang="scss" scoped>
|
||||||
|
@use '@/assets/custom.scss';
|
||||||
|
</style>
|
||||||
|
@ -10,9 +10,7 @@ import { BasicColumn } from '@/components/Table';
|
|||||||
import { FormSchema } from '@/components/Table';
|
import { FormSchema } from '@/components/Table';
|
||||||
|
|
||||||
|
|
||||||
|
const colProps = { xs: { span: 24 }, sm: { span: 24 }, lg: { span: 6 } };
|
||||||
|
|
||||||
const colProps = { xs: { span: 24 }, sm: { span: 24 }, lg: { span: 8 } };
|
|
||||||
const colPropsInDrawer = { span: 24 };
|
const colPropsInDrawer = { span: 24 };
|
||||||
|
|
||||||
export const schema = {
|
export const schema = {
|
||||||
@ -37,7 +35,7 @@ export const schema = {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
field: 'taskId',
|
field: 'taskId',
|
||||||
label: 'dat_detect_task.id',
|
label: '任务ID',
|
||||||
defaultValue: undefined,
|
defaultValue: undefined,
|
||||||
form: {
|
form: {
|
||||||
componentProps: {
|
componentProps: {
|
||||||
@ -49,6 +47,7 @@ export const schema = {
|
|||||||
rules: [{ required: true, message: '请输入dat_detect_task.id!' }],
|
rules: [{ required: true, message: '请输入dat_detect_task.id!' }],
|
||||||
},
|
},
|
||||||
table: {
|
table: {
|
||||||
|
width: 140,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -64,6 +63,7 @@ export const schema = {
|
|||||||
component: 'Input',
|
component: 'Input',
|
||||||
},
|
},
|
||||||
table: {
|
table: {
|
||||||
|
width: 200,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -79,11 +79,12 @@ export const schema = {
|
|||||||
component: 'Input',
|
component: 'Input',
|
||||||
},
|
},
|
||||||
table: {
|
table: {
|
||||||
|
ellipsis: true,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
field: 'createTime',
|
field: 'createTime',
|
||||||
label: 'CreateTime',
|
label: '创建时间',
|
||||||
defaultValue: undefined,
|
defaultValue: undefined,
|
||||||
form: {
|
form: {
|
||||||
colProps,
|
colProps,
|
||||||
@ -98,6 +99,7 @@ export const schema = {
|
|||||||
rules: [{ required: true, message: '请输入CreateTime!' }],
|
rules: [{ required: true, message: '请输入CreateTime!' }],
|
||||||
},
|
},
|
||||||
table: {
|
table: {
|
||||||
|
width: 150,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -122,10 +124,10 @@ export const schema = {
|
|||||||
],
|
],
|
||||||
};
|
};
|
||||||
|
|
||||||
const queryFields = ['id','taskId','deviceSn','content','createTime','updateTime'];
|
const queryFields = ['deviceSn', 'createTime'];
|
||||||
const editFields = ['taskId','deviceSn','content'];
|
const editFields = ['taskId','deviceSn','content'];
|
||||||
const tableFields = ['taskId','deviceSn','content','createTime','updateTime'];
|
const tableFields = ['taskId','deviceSn','content','createTime'];
|
||||||
const descriptionFields = ['taskId','deviceSn','content','createTime','updateTime'];
|
const descriptionFields = ['taskId','deviceSn','content','createTime'];
|
||||||
|
|
||||||
const queryFieldsIndexMap = new Map(queryFields.map((field, index) => [field, index]));
|
const queryFieldsIndexMap = new Map(queryFields.map((field, index) => [field, index]));
|
||||||
export const searchFormSchema: FormSchema[] = schema.properties.filter(item => queryFields.includes(item.field))
|
export const searchFormSchema: FormSchema[] = schema.properties.filter(item => queryFields.includes(item.field))
|
||||||
|
@ -1,29 +1,24 @@
|
|||||||
<template>
|
<template>
|
||||||
<Card :bordered="false" :loading="isLoading">
|
<div class="detail-container">
|
||||||
<PageHeader
|
<Card :bordered="false" :loading="isLoading">
|
||||||
:title="title"
|
<PageHeader
|
||||||
@back="() => $router.go(-1)"
|
:title="title"
|
||||||
>
|
@back="() => $router.go(-1)"
|
||||||
<template #extra>
|
|
||||||
<a-button type="primary" @click="$router.go(-1)">返回上一页面</a-button>
|
|
||||||
</template>
|
|
||||||
</PageHeader>
|
|
||||||
<Descriptions bordered :column="3">
|
|
||||||
<Descriptions.Item
|
|
||||||
v-for="p in displayProps"
|
|
||||||
:key="p.key"
|
|
||||||
:label="p.title"
|
|
||||||
:span="['avatar'].includes(p.key) ? 3 : 1"
|
|
||||||
>
|
>
|
||||||
<span v-if="p.key === 'avatar'">
|
<template #extra>
|
||||||
<Image style="width: 100px" :src="p.value"/>
|
<a-button type="primary" @click="$router.go(-1)">返回上一页面</a-button>
|
||||||
</span>
|
|
||||||
<template v-else>
|
|
||||||
{{ p.value }}
|
|
||||||
</template>
|
</template>
|
||||||
</Descriptions.Item>
|
</PageHeader>
|
||||||
</Descriptions>
|
<Descriptions bordered :column="1">
|
||||||
</Card>
|
<Descriptions.Item
|
||||||
|
v-for="p in displayProps"
|
||||||
|
:key="p.key"
|
||||||
|
:label="p.title">
|
||||||
|
{{ p.value }}
|
||||||
|
</Descriptions.Item>
|
||||||
|
</Descriptions>
|
||||||
|
</Card>
|
||||||
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import { onMounted, computed, ref, Ref } from 'vue';
|
import { onMounted, computed, ref, Ref } from 'vue';
|
||||||
@ -67,8 +62,10 @@
|
|||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped lang="less">
|
<style lang="scss" scoped>
|
||||||
::v-deep(.ant-card-body){
|
@use '@/assets/custom.scss';
|
||||||
padding-top: 0;
|
.detail-container {
|
||||||
|
padding: 10px;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
<div>
|
<div>
|
||||||
<div class="header">
|
<div class="header">
|
||||||
<SvgIcon size="19" name="list" />
|
<SvgIcon size="19" name="list" />
|
||||||
<div class="title">设备列表</div>
|
<div class="title">任务列表</div>
|
||||||
</div>
|
</div>
|
||||||
<BasicTable @register="registerTable">
|
<BasicTable @register="registerTable">
|
||||||
<template #toolbar>
|
<template #toolbar>
|
||||||
@ -64,7 +64,6 @@
|
|||||||
|
|
||||||
const [registerDrawer, { openDrawer }] = useDrawer();
|
const [registerDrawer, { openDrawer }] = useDrawer();
|
||||||
const [registerTable, { reload }] = useTable({
|
const [registerTable, { reload }] = useTable({
|
||||||
title: '检测任务表',
|
|
||||||
api: (params) => TaskApi.search(handleParams(params)),
|
api: (params) => TaskApi.search(handleParams(params)),
|
||||||
columns,
|
columns,
|
||||||
formConfig: {
|
formConfig: {
|
||||||
@ -143,7 +142,6 @@
|
|||||||
|
|
||||||
const handleView = (record) => {
|
const handleView = (record) => {
|
||||||
go('/data/task/' + record.id);
|
go('/data/task/' + record.id);
|
||||||
// go({ name: 'TaskDetailPage', params: { id: record.id } });
|
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
|
@ -37,16 +37,16 @@ export const schema = {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
field: 'name',
|
field: 'name',
|
||||||
label: '名称',
|
label: '任务名称',
|
||||||
defaultValue: undefined,
|
defaultValue: undefined,
|
||||||
form: {
|
form: {
|
||||||
componentProps: {
|
componentProps: {
|
||||||
allowClear: false,
|
allowClear: false,
|
||||||
placeholder: '名称',
|
placeholder: '任务名称',
|
||||||
},
|
},
|
||||||
colProps,
|
colProps,
|
||||||
component: 'Input',
|
component: 'Input',
|
||||||
rules: [{ required: true, message: '请输入名称!' }],
|
rules: [{ required: true, message: '请输入任务名称!' }],
|
||||||
},
|
},
|
||||||
table: {
|
table: {
|
||||||
},
|
},
|
||||||
@ -74,7 +74,7 @@ export const schema = {
|
|||||||
componentProps: {
|
componentProps: {
|
||||||
allowClear: true,
|
allowClear: true,
|
||||||
placeholder: '任务参数',
|
placeholder: '任务参数',
|
||||||
autoSize: {minRows: 8, maxRows: 8},
|
autoSize: {minRows: 15, maxRows: 15},
|
||||||
},
|
},
|
||||||
component: 'InputTextArea',
|
component: 'InputTextArea',
|
||||||
colProps: { span: 24 },
|
colProps: { span: 24 },
|
||||||
@ -90,7 +90,7 @@ export const schema = {
|
|||||||
componentProps: {
|
componentProps: {
|
||||||
allowClear: true,
|
allowClear: true,
|
||||||
placeholder: '任务结果',
|
placeholder: '任务结果',
|
||||||
autoSize: {minRows: 8, maxRows: 8},
|
autoSize: {minRows: 15, maxRows: 15},
|
||||||
},
|
},
|
||||||
component: 'InputTextArea',
|
component: 'InputTextArea',
|
||||||
colProps: { span: 24 },
|
colProps: { span: 24 },
|
||||||
@ -224,9 +224,9 @@ export const schema = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const queryFields = ['name','deviceSn','startTimeQuery','state'];
|
const queryFields = ['name','deviceSn','startTimeQuery','state'];
|
||||||
const editFields = ['name','deviceSn','paramJson','resultJson','startTime','endTime'];
|
const editFields = ['name','deviceSn','paramJson'];
|
||||||
const tableFields = ['name','deviceSn','startTime','endTime','state','createTime'];
|
const tableFields = ['name','deviceSn','startTime','endTime','state','createTime'];
|
||||||
const descriptionFields = ['name','deviceSn','paramJson','resultJson','startTime','endTime','state','createTime','updateTime'];
|
const descriptionFields = ['name','deviceSn','paramJson','resultJson','startTime','endTime','state'];
|
||||||
|
|
||||||
const queryFieldsIndexMap = new Map(queryFields.map((field, index) => [field, index]));
|
const queryFieldsIndexMap = new Map(queryFields.map((field, index) => [field, index]));
|
||||||
export const searchFormSchema: FormSchema[] = schema.properties.filter(item => queryFields.includes(item.field))
|
export const searchFormSchema: FormSchema[] = schema.properties.filter(item => queryFields.includes(item.field))
|
||||||
|
@ -1,74 +0,0 @@
|
|||||||
<template>
|
|
||||||
<Card :bordered="false" :loading="isLoading">
|
|
||||||
<PageHeader
|
|
||||||
:title="title"
|
|
||||||
@back="() => $router.go(-1)"
|
|
||||||
>
|
|
||||||
<template #extra>
|
|
||||||
<a-button type="primary" @click="$router.go(-1)">返回上一页面</a-button>
|
|
||||||
</template>
|
|
||||||
</PageHeader>
|
|
||||||
<Descriptions bordered :column="3">
|
|
||||||
<Descriptions.Item
|
|
||||||
v-for="p in displayProps"
|
|
||||||
:key="p.key"
|
|
||||||
:label="p.title"
|
|
||||||
:span="['avatar'].includes(p.key) ? 3 : 1"
|
|
||||||
>
|
|
||||||
<span v-if="p.key === 'avatar'">
|
|
||||||
<Image style="width: 100px" :src="p.value"/>
|
|
||||||
</span>
|
|
||||||
<template v-else>
|
|
||||||
{{ p.value }}
|
|
||||||
</template>
|
|
||||||
</Descriptions.Item>
|
|
||||||
</Descriptions>
|
|
||||||
</Card>
|
|
||||||
</template>
|
|
||||||
<script lang="ts" setup>
|
|
||||||
import { onMounted, computed, ref, Ref } from 'vue';
|
|
||||||
import { useRoute } from 'vue-router';
|
|
||||||
import { useAsyncState } from '@vueuse/core';
|
|
||||||
import { PageHeader, Descriptions, Card } from 'ant-design-vue';
|
|
||||||
import { descriptionColumns } from './schema';
|
|
||||||
import * as LogApi from '@/api/system/logApi';
|
|
||||||
import { Log } from '@/api/model/log';
|
|
||||||
|
|
||||||
const route = useRoute();
|
|
||||||
const id = ref(route.params?.id);
|
|
||||||
const title = route.meta.title
|
|
||||||
|
|
||||||
// id 查询
|
|
||||||
const {
|
|
||||||
state: detail,
|
|
||||||
isReady: isDetailReady,
|
|
||||||
isLoading,
|
|
||||||
execute,
|
|
||||||
} = useAsyncState(
|
|
||||||
LogApi.getById(id.value).then((res: Log) => res),
|
|
||||||
null,
|
|
||||||
{
|
|
||||||
immediate: false,
|
|
||||||
},
|
|
||||||
);
|
|
||||||
|
|
||||||
onMounted(() => {
|
|
||||||
execute();
|
|
||||||
});
|
|
||||||
|
|
||||||
const displayProps: Ref<Array<any>> = computed(() => {
|
|
||||||
if (!isDetailReady.value) return {};
|
|
||||||
const display: any = descriptionColumns.map(({ title, dataIndex = '', customRender }) => ({
|
|
||||||
key: dataIndex,
|
|
||||||
title,
|
|
||||||
value: customRender ? customRender({ text: detail.value[dataIndex], record: detail.value }) : detail.value[dataIndex],
|
|
||||||
}));
|
|
||||||
return display;
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style scoped lang="less">
|
|
||||||
::v-deep(.ant-card-body){
|
|
||||||
padding-top: 0;
|
|
||||||
}
|
|
||||||
</style>
|
|
@ -1,65 +0,0 @@
|
|||||||
<template>
|
|
||||||
<BasicDrawer v-bind="$attrs" @register="registerDrawer" showFooter :title="getTitle" width="600px" @ok="handleSubmit">
|
|
||||||
<BasicForm @register="registerForm" />
|
|
||||||
</BasicDrawer>
|
|
||||||
</template>
|
|
||||||
<script lang="ts" setup>
|
|
||||||
import { defineEmits, ref, computed, unref } from 'vue';
|
|
||||||
import { BasicForm, useForm } from '@/components/Form/index';
|
|
||||||
import { formSchema } from './schema';
|
|
||||||
import { BasicDrawer, useDrawerInner } from '@/components/Drawer';
|
|
||||||
import * as LogApi from '@/api/system/logApi';
|
|
||||||
import dayjs from "dayjs";
|
|
||||||
|
|
||||||
const emit = defineEmits(['success', 'register']);
|
|
||||||
const isUpdate = ref(true);
|
|
||||||
const entity = ref();
|
|
||||||
|
|
||||||
const [registerForm, { resetFields, setFieldsValue, validate }] = useForm({
|
|
||||||
labelWidth: 120,
|
|
||||||
schemas: formSchema,
|
|
||||||
showActionButtonGroup: false,
|
|
||||||
});
|
|
||||||
|
|
||||||
const [registerDrawer, { setDrawerProps, closeDrawer }] = useDrawerInner(async (data) => {
|
|
||||||
await resetFields();
|
|
||||||
setDrawerProps({ confirmLoading: false });
|
|
||||||
isUpdate.value = !!data?.isUpdate;
|
|
||||||
entity.value = data?.record;
|
|
||||||
|
|
||||||
if (unref(isUpdate)) {
|
|
||||||
await setFieldsValue({
|
|
||||||
...data.record,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
const getTitle = computed(() => (!unref(isUpdate) ? '新增' : '编辑'));
|
|
||||||
|
|
||||||
async function handleSubmit() {
|
|
||||||
try {
|
|
||||||
const values = await validate();
|
|
||||||
setDrawerProps({ confirmLoading: true });
|
|
||||||
const {
|
|
||||||
...rest
|
|
||||||
} = values;
|
|
||||||
const action = !unref(isUpdate) ? LogApi.add : LogApi.update;
|
|
||||||
const data = !unref(isUpdate)
|
|
||||||
? {
|
|
||||||
...rest,
|
|
||||||
}
|
|
||||||
: Object.assign({},
|
|
||||||
{
|
|
||||||
...unref(entity),
|
|
||||||
...rest,
|
|
||||||
updateTime: dayjs().format('YYYY-MM-DD HH:mm:ss')
|
|
||||||
},
|
|
||||||
);
|
|
||||||
await action(data);
|
|
||||||
closeDrawer();
|
|
||||||
emit('success');
|
|
||||||
} finally {
|
|
||||||
setDrawerProps({ confirmLoading: false });
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
@ -1,50 +1,23 @@
|
|||||||
<template>
|
<template>
|
||||||
<div>
|
<div>
|
||||||
<BasicTable @register="registerTable">
|
<div class="header">
|
||||||
<template #bodyCell="{ column, record }">
|
<SvgIcon size="19" name="list" />
|
||||||
<template v-if="column.dataIndex === 'action'">
|
<div class="title">日志列表</div>
|
||||||
<TableAction
|
</div>
|
||||||
:actions="[
|
<BasicTable @register="registerTable" />
|
||||||
{
|
|
||||||
label: '详情',
|
|
||||||
icon: 'ant-design:eye-outlined',
|
|
||||||
divider: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: '删除',
|
|
||||||
icon: 'ant-design:delete-outlined',
|
|
||||||
color: 'error',
|
|
||||||
popConfirm: {
|
|
||||||
title: '是否确认删除',
|
|
||||||
confirm: handleDelete.bind(null, record),
|
|
||||||
placement: 'topRight',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
]"
|
|
||||||
/>
|
|
||||||
</template>
|
|
||||||
</template>
|
|
||||||
</BasicTable>
|
|
||||||
<LogDrawer @register="registerDrawer" @success="handleSuccess" />
|
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import { ref } from 'vue';
|
|
||||||
import { Alert,Popconfirm } from 'ant-design-vue';
|
|
||||||
import { useGo } from '@/hooks/web/usePage';
|
import { useGo } from '@/hooks/web/usePage';
|
||||||
import { usePermission } from '@/hooks/web/usePermission';
|
import { usePermission } from '@/hooks/web/usePermission';
|
||||||
import { BasicTable, useTable, TableAction } from '@/components/Table';
|
import { BasicTable, useTable } from '@/components/Table';
|
||||||
import { isObject } from '@/utils/is';
|
import { isObject } from '@/utils/is';
|
||||||
import dayjs from 'dayjs';
|
import dayjs from 'dayjs';
|
||||||
import * as LogApi from '@/api/system/logApi';
|
import * as LogApi from '@/api/system/logApi';
|
||||||
import { useDrawer } from '@/components/Drawer';
|
import { useDrawer } from '@/components/Drawer';
|
||||||
import LogDrawer from './drawer.vue';
|
|
||||||
import { columns, searchFormSchema } from './schema';
|
import { columns, searchFormSchema } from './schema';
|
||||||
import { useMessage } from "@/hooks/web/useMessage";
|
import { useMessage } from "@/hooks/web/useMessage";
|
||||||
|
import {SvgIcon} from "@/components/Icon";
|
||||||
defineOptions({
|
|
||||||
name: 'LogPage'
|
|
||||||
})
|
|
||||||
|
|
||||||
const { createMessage } = useMessage();
|
const { createMessage } = useMessage();
|
||||||
const { hasPermission } = usePermission();
|
const { hasPermission } = usePermission();
|
||||||
@ -55,7 +28,7 @@
|
|||||||
api: (params) => LogApi.search(handleParams(params)),
|
api: (params) => LogApi.search(handleParams(params)),
|
||||||
columns,
|
columns,
|
||||||
formConfig: {
|
formConfig: {
|
||||||
labelWidth: 120,
|
labelWidth: 0,
|
||||||
schemas: searchFormSchema,
|
schemas: searchFormSchema,
|
||||||
showAdvancedButton: false,
|
showAdvancedButton: false,
|
||||||
},
|
},
|
||||||
@ -65,12 +38,6 @@
|
|||||||
showIndexColumn: false,
|
showIndexColumn: false,
|
||||||
canResize: false,
|
canResize: false,
|
||||||
rowKey: (record: any) => record.id,
|
rowKey: (record: any) => record.id,
|
||||||
actionColumn: {
|
|
||||||
width: 170,
|
|
||||||
title: '操作',
|
|
||||||
dataIndex: 'action',
|
|
||||||
fixed: 'right',
|
|
||||||
},
|
|
||||||
});
|
});
|
||||||
|
|
||||||
const handleParams = (params, embedded = true) => {
|
const handleParams = (params, embedded = true) => {
|
||||||
@ -102,33 +69,6 @@
|
|||||||
});
|
});
|
||||||
return handledParams;
|
return handledParams;
|
||||||
};
|
};
|
||||||
|
|
||||||
const handleCreate = () => {
|
|
||||||
openDrawer(true, {
|
|
||||||
isUpdate: false,
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
const handleEdit = (record: Recordable) => {
|
|
||||||
openDrawer(true, {
|
|
||||||
record,
|
|
||||||
isUpdate: true,
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
const handleDelete = (record: Recordable) => {
|
|
||||||
LogApi.remove(record.id).then((_) => {
|
|
||||||
reload();
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
const handleSuccess = () => {
|
|
||||||
reload();
|
|
||||||
};
|
|
||||||
|
|
||||||
const handleView = (record) => {
|
|
||||||
go('/system/log/detail/' + record.id);
|
|
||||||
};
|
|
||||||
</script>
|
</script>
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
@use '@/assets/custom.scss';
|
@use '@/assets/custom.scss';
|
||||||
|
@ -12,7 +12,7 @@ import { FormSchema } from '@/components/Table';
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
const colProps = { xs: { span: 24 }, sm: { span: 24 }, lg: { span: 8 } };
|
const colProps = { xs: { span: 24 }, sm: { span: 24 }, lg: { span: 6 } };
|
||||||
const colPropsInDrawer = { span: 24 };
|
const colPropsInDrawer = { span: 24 };
|
||||||
|
|
||||||
export const schema = {
|
export const schema = {
|
||||||
@ -51,21 +51,6 @@ export const schema = {
|
|||||||
table: {
|
table: {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
|
||||||
field: 'username',
|
|
||||||
label: '操作人',
|
|
||||||
defaultValue: undefined,
|
|
||||||
form: {
|
|
||||||
componentProps: {
|
|
||||||
allowClear: true,
|
|
||||||
placeholder: '操作人',
|
|
||||||
},
|
|
||||||
colProps,
|
|
||||||
component: 'Input',
|
|
||||||
},
|
|
||||||
table: {
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
field: 'description',
|
field: 'description',
|
||||||
label: '描述',
|
label: '描述',
|
||||||
@ -80,6 +65,7 @@ export const schema = {
|
|||||||
rules: [{ required: true, message: '请输入描述!' }],
|
rules: [{ required: true, message: '请输入描述!' }],
|
||||||
},
|
},
|
||||||
table: {
|
table: {
|
||||||
|
ellipsis: true,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -95,6 +81,24 @@ export const schema = {
|
|||||||
component: 'Input',
|
component: 'Input',
|
||||||
},
|
},
|
||||||
table: {
|
table: {
|
||||||
|
width: 400,
|
||||||
|
ellipsis: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
field: 'username',
|
||||||
|
label: '操作人',
|
||||||
|
defaultValue: undefined,
|
||||||
|
form: {
|
||||||
|
componentProps: {
|
||||||
|
allowClear: true,
|
||||||
|
placeholder: '操作人',
|
||||||
|
},
|
||||||
|
colProps,
|
||||||
|
component: 'Input',
|
||||||
|
},
|
||||||
|
table: {
|
||||||
|
width: 150,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -114,6 +118,7 @@ export const schema = {
|
|||||||
rules: [{ required: true, message: '请选择日志时间!' }],
|
rules: [{ required: true, message: '请选择日志时间!' }],
|
||||||
},
|
},
|
||||||
table: {
|
table: {
|
||||||
|
width: 150,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
@ -121,7 +126,7 @@ export const schema = {
|
|||||||
|
|
||||||
const queryFields = ['createTime'];
|
const queryFields = ['createTime'];
|
||||||
const editFields = ['description','userId','remark'];
|
const editFields = ['description','userId','remark'];
|
||||||
const tableFields = ['username','description','remark','createTime'];
|
const tableFields = ['description','remark','username','createTime'];
|
||||||
const descriptionFields = ['description','userId','username','remark','createTime'];
|
const descriptionFields = ['description','userId','username','remark','createTime'];
|
||||||
|
|
||||||
const queryFieldsIndexMap = new Map(queryFields.map((field, index) => [field, index]));
|
const queryFieldsIndexMap = new Map(queryFields.map((field, index) => [field, index]));
|
||||||
|
Loading…
Reference in New Issue
Block a user