Browse Source

重构资产管理页面

dev
qb 4 weeks ago
parent
commit
b50d1fdd6b
  1. 47
      src/api/basic/basicProperty.js
  2. 277
      src/option/basic/basicProperty.js
  3. 678
      src/views/basic/property/basicProperty.vue
  4. 5
      src/views/basic/property/basicPropertyDetails.vue
  5. 8
      src/views/resource/attach.vue
  6. 1
      src/views/resource/oss.vue

47
src/api/basic/basicProperty.js

@ -1,50 +1,45 @@
import request from '@/axios'; import request from '@/axios';
export const getList = (current, size, params) => { export const getList = params => {
return request({ return request({
url: '/api/logpm-basic/property/list', url: '/api/logpm-basic/property/list',
method: 'get', method: 'get',
params: { params,
...params, });
current, };
size,
}
})
}
export const getDetail = (id) => { export const getDetail = id => {
return request({ return request({
url: '/api/logpm-basic/property/detail', url: '/api/logpm-basic/property/detail',
method: 'get', method: 'get',
params: { params: {
id id,
} },
}) });
} };
export const remove = (ids) => { export const remove = ids => {
return request({ return request({
url: '/api/logpm-basic/property/remove', url: '/api/logpm-basic/property/remove',
method: 'post', method: 'post',
params: { params: {
ids, ids,
} },
}) });
} };
export const add = (row) => { export const add = row => {
return request({ return request({
url: '/api/logpm-basic/property/save', url: '/api/logpm-basic/property/save',
method: 'post', method: 'post',
data: row data: row,
}) });
} };
export const update = (row) => { export const update = row => {
return request({ return request({
url: '/api/logpm-basic/property/update', url: '/api/logpm-basic/property/update',
method: 'post', method: 'post',
data: row data: row,
}) });
} };

277
src/option/basic/basicProperty.js

@ -1,194 +1,83 @@
export default { export const columnList = [
height:'auto', {
calcHeight: 30, prop: '',
tip: false, label: '复选框',
searchShow: false, type: 0,
searchMenuSpan: 6, width: 55,
border: true, fixed: true,
index: true, },
viewBtn: false, {
editBtn: false, prop: '',
selection: true, label: '序号',
addBtn:false, type: 12,
dialogClickModal: false, values: '',
column: [ width: 55,
{ fixed: true,
label: "主键", },
prop: "id", {
type: "input", label: '资产类型',
addDisplay: false, prop: 'assetTypeName',
editDisplay: false, type: 3,
viewDisplay: false, values: '',
hide: true, width: '200',
}, checkarr: [],
{ fixed: false,
label: "租户号", sortable: true,
prop: "tenantId", head: false,
type: "input", },
addDisplay: false, {
editDisplay: false, label: '资产名称',
viewDisplay: false, prop: 'assetName',
hide: true, type: 2,
}, values: '',
{ width: '150',
label: "创建人", checkarr: [],
prop: "createUser", fixed: false,
type: "input", sortable: true,
addDisplay: false, head: false,
editDisplay: false, },
viewDisplay: false, {
hide: true, label: '资产统一编号',
}, prop: 'assetId',
{ type: 2,
label: "创建时间", values: '',
prop: "createTime", width: '150',
type: "input", checkarr: [],
addDisplay: false, fixed: false,
editDisplay: false, sortable: true,
viewDisplay: false, head: false,
hide: true, },
}, {
{ label: '资产现有数量',
label: "更新人", prop: 'assetNub',
prop: "updateUser", type: 1,
type: "input", values: '',
addDisplay: false, width: '150',
editDisplay: false, checkarr: [],
viewDisplay: false, fixed: false,
hide: true, sortable: true,
}, head: false,
{ },
label: "更新时间",
prop: "updateTime", {
type: "input", label: '备注',
addDisplay: false, prop: 'remark',
editDisplay: false, type: 1,
viewDisplay: false, values: '',
hide: true, width: '150',
}, checkarr: [],
{ fixed: false,
label: "状态", sortable: true,
prop: "status", head: false,
type: "input", },
addDisplay: false, {
editDisplay: false, prop: '',
viewDisplay: false, label: '操作',
hide: true, type: 6,
}, values: '',
{ width: '200',
label: "是否已删除", checkarr: [],
prop: "isDeleted", fixed: 'right',
type: "input", sortable: false,
addDisplay: false, },
editDisplay: false, ];
viewDisplay: false,
hide: true,
},
{
label: "创建部门",
prop: "createDept",
type: "input",
addDisplay: false,
editDisplay: false,
viewDisplay: false,
hide: true,
},
{
label: "预留1",
prop: "reserve1",
type: "input",
addDisplay: false,
editDisplay: false,
viewDisplay: false,
hide: true,
},
{
label: "预留2",
prop: "reserve2",
type: "input",
addDisplay: false,
editDisplay: false,
viewDisplay: false,
hide: true,
},
{
label: "预留3",
prop: "reserve3",
type: "input",
addDisplay: false,
editDisplay: false,
viewDisplay: false,
hide: true,
},
{
label: "预留4",
prop: "reserve4",
type: "input",
addDisplay: false,
editDisplay: false,
viewDisplay: false,
hide: true,
},
{
label: "预留5",
prop: "reserve5",
type: "input",
addDisplay: false,
editDisplay: false,
viewDisplay: false,
hide: true,
},
{
label: "资产类型",
prop: "assetType",
type: "select",
labelWidth:'150',
width:"280px",
align:'center',
span:11,
dicUrl: '/api/blade-system/dict-biz/dictionary?code=basic_property_type',
props: {
label: 'dictValue',
value: 'dictKey',
},
search: true,
},
{
label: "资产名称",
prop: "assetName",
type: "input",
labelWidth:'150',
width:"270px",
align:'center',
span:11,
search: true,
},
{
label: "资产统一编号",
prop: "assetId",
type: "input",
labelWidth:'150',
width:"200px",
align:'center',
span:11,
},
{
label: "资产现有数量",
prop: "assetNub",
type: "input",
labelWidth:'150',
width:"250px",
align:'center',
span:11,
},
{
label: "备注",
prop: "node",
type: "input",
labelWidth:'150',
width:"360px",
align:'center',
span:11,
},
]
}

678
src/views/basic/property/basicProperty.vue

@ -1,274 +1,480 @@
<template> <template>
<basic-container> <basic-container v-loading="details.loadingObj.pageLoading">
<avue-crud :option="option" <div class="avue-crud">
v-model:search="search" <!-- 搜索模块 -->
v-model:page="page" <div v-h5uShow="search">
v-model="form" <!-- 查询模块 -->
:table-loading="loading" <el-form :inline="true" :model="query" class="header_search" label-width="100px">
:data="data" <!-- 查询按钮 -->
:permission="permissionList" <el-form-item>
:before-open="beforeOpen" <el-button type="primary" icon="el-icon-search" @click="searchChange"> </el-button>
ref="crud" <el-button icon="el-icon-delete" @click="searchReset"> </el-button>
@row-update="rowUpdate" </el-form-item>
@row-save="rowSave" </el-form>
@row-del="rowDel" </div>
@search-change="searchChange"
@search-reset="searchReset" <!-- 控件模块 -->
@selection-change="selectionChange" <div class="avue-crud__header flex-c-sb">
@current-change="currentChange" <!-- 头部左侧按钮模块 -->
@size-change="sizeChange" <div class="avue-crud__left">
@refresh-change="refreshChange" <!-- 新增 -->
@on-load="onLoad"> <el-button
<template #menu-left> v-if="$store.state.user.permission.basicProperty_add"
<!-- <el-button type="danger"--> type="primary"
<!-- icon="el-icon-delete"--> icon="Plus"
<!-- plain--> @click="handleAdd"
<!-- v-if="permission.basicProperty_delete"--> >
<!-- @click="handleDelete"> --> </el-button>
<!-- </el-button>-->
<el-button type="primary" <!-- 删除 -->
plain <el-button
icon="el-icon-plus" v-if="$store.state.user.permission.basicProperty_delete"
@click="handleadd"> type="primary"
icon="Delete"
@click="handleBatchRemove"
>
</el-button> </el-button>
</div>
<!-- 头部右侧按钮模块 -->
<div class="avue-crud__right">
<el-button icon="el-icon-refresh" @click="searchChange" circle></el-button>
<el-button icon="Operation" @click="showdrawer(true)" circle></el-button>
<el-button icon="Search" @click="searchHide" circle></el-button>
</div>
</div>
<!-- 列表模块 -->
<tablecmt
ref="tableNodeRef"
:columnList="details.columnList"
:tableData="details.data"
:loading="loadingObj.list"
@inputTxt="inputsc"
@timeCheck="timesc"
@btnCheck="btnsc"
@selectCheck="selectsc"
@selection="selectionChange"
>
<template #default="{ scope: { row, column } }">
<!-- 操作 -->
<template v-if="column.label === '操作'">
<!-- 删除 -->
<el-text
v-if="$store.state.user.permission.basicProperty_delete"
@click="() => handleDelete(row)"
>
</el-text>
<!-- 编辑 -->
<el-text
v-if="$store.state.user.permission.basicProperty_edit"
@click="() => handleEdit(row)"
>
</el-text>
<!-- 查看 -->
<el-text
v-if="$store.state.user.permission.basicProperty_view"
@click="() => handleView(row)"
>
</el-text>
</template> </template>
<template #menu="{size,row,index}">
<el-button type="primary" text icon="el-icon-view" @click="handleEdit(row)"> </el-button>
<el-button type="primary" text icon="el-icon-view" @click="handleview(row)"> </el-button>
</template> </template>
</avue-crud> </tablecmt>
<!-- 分页模块 -->
<div class="avue-crud__pagination flex-c-sb" style="width: 100%">
<div style="font-size: 14px">勾选数量: {{ selectionList.length }}</div>
<!-- 分页模块 -->
<el-pagination
align="right"
background
@size-change="sizeChange"
@current-change="currentChange"
:current-page="page.current"
:page-sizes="[30, 50, 80, 120, 500]"
:page-size="page.size"
layout="total, sizes, prev, pager, next, jumper"
:total="page.total"
>
</el-pagination>
</div>
</div>
</basic-container> </basic-container>
<edittablehead
@closce="showdrawer"
:drawerShow="drawerShow"
:columnList="details.columnList"
v-model="details.columnList"
></edittablehead>
</template> </template>
<script> <script setup lang="ts">
import { ref, reactive, toRefs, computed } from 'vue';
import functions from '@/utils/functions.js';
import dayjs from 'dayjs';
import { mapGetters, useStore } from 'vuex';
/** 获取字典 */
import { getDictionaryBiz } from '@/api/system/dict';
import { getList, getDetail, add, update, remove } from '@/api/basic/basicProperty'; import { getList, getDetail, add, update, remove } from '@/api/basic/basicProperty';
import option from '@/option/basic/basicProperty'; import {
import { mapGetters } from 'vuex'; setNodeHeight,
import { exportBlob } from '@/api/common'; getHtmls,
deepClone,
getObjType,
handleTranslationDataSeclect,
handleClearTableQuery,
handleSelectQuery,
handleInputQuery,
downloadXls,
} from '@/utils/util';
import { useRouter } from 'vue-router';
import { ElMessage, ElMessageBox } from 'element-plus';
import { columnList } from '@/option/basic/basicProperty';
import { getToken } from '@/utils/auth'; import { getToken } from '@/utils/auth';
import { downloadXls } from '@/utils/util';
import { dateNow } from '@/utils/date'; //
import NProgress from 'nprogress'; const $router = useRouter();
import 'nprogress/nprogress.css'; const $store = useStore();
export default { console.log('$store.state.permission :>> ', $store.state);
data() {
return { //
form: {}, const tableNodeRef = ref();
const details = reactive<any>({
/** 是否开启搜索 */
search: true,
/** 表格搜索条件 */
query: {}, query: {},
search: {}, /** 时间快捷选择设置 */
loading: true, shortcuts: [
page: { {
pageSize: 30, text: '最近一周',
currentPage: 1, value: () => {
total: 0 const end = new Date();
const start = new Date();
start.setTime(start.getTime() - 3600 * 1000 * 24 * 7);
return [start, end];
}, },
selectionList: [],
option: option,
data: []
};
}, },
computed: { {
...mapGetters(['permission']), text: '最近一个月',
permissionList() { value: () => {
return { const end = new Date();
addBtn: this.validData(this.permission.basicProperty_add, false), const start = new Date();
viewBtn: this.validData(this.permission.basicProperty_view, false), start.setTime(start.getTime() - 3600 * 1000 * 24 * 30);
delBtn: this.validData(this.permission.basicProperty_delete, false), return [start, end];
editBtn: this.validData(this.permission.basicProperty_edit, false)
};
}, },
ids() {
let ids = [];
this.selectionList.forEach(ele => {
ids.push(ele.id);
});
return ids.join(',');
}
}, },
methods: { {
// text: '最近三个月',
handleEdit(row) { value: () => {
this.$message.success('修改字段信息可能会导致原有数据不匹配'); const end = new Date();
this.$router.push({ const start = new Date();
path: '/basic/property/basicPropertyform', start.setTime(start.getTime() - 3600 * 1000 * 24 * 90);
query: { return [start, end];
data: encodeURIComponent(JSON.stringify(row)),
edt: false,
name: row.assetName + '-字段编辑'
}
});
}, },
handleadd() {
this.$router.push({
path: '/basic/property/basicPropertyform',
query: {
name: '资产新增',
edt: false
}
});
}, },
// ],
handleview(row) { columnList: deepClone(columnList),
this.$router.push({ data: [],
path: '/basic/property/basicPropertyform', /** 头部搜索配置 */
query: { titleSearchOption: [],
data: row.id, /** 流转节点数据 */
edt: true, flowNodeData: [],
name: row.assetName + '-字段查看' /** 页面loading */
} loadingObj: {
}); /** 列表加载loading */
list: false,
packageListLoading: false,
upload: false,
}, },
rowSave(row, done, loading) { /** 列表复选框选中的数据 */
add(row).then(() => { selectionList: [],
this.onLoad(this.page); /** 是否显示设置表格 */
this.$message({ drawerShow: false,
type: 'success', /** 分页参数 */
message: '操作成功!' page: {
}); current: 1,
done(); size: 30,
}, error => { total: 0,
loading();
window.console.log(error);
});
}, },
rowUpdate(row, index, done, loading) { /** 弹出层显示 */
update(row).then(() => { popUpShow: {
this.onLoad(this.page); add: false,
this.$message({
type: 'success',
message: '操作成功!'
});
done();
}, error => {
loading();
console.log(error);
});
}, },
rowDel(row) { /** 全屏 */
this.$confirm('确定将选择数据删除?', { fullscreenObj: {},
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
.then(() => {
return remove(row.id);
})
.then(() => {
this.onLoad(this.page);
this.$message({
type: 'success',
message: '操作成功!'
}); });
// TOKEN
const headers = computed(() => {
return { 'Blade-Auth': 'Bearer ' + getToken() };
}); });
},
handleDelete() { const { search, query, shortcuts, loadingObj, selectionList, drawerShow, page } = toRefs(details);
if (this.selectionList.length === 0) {
this.$message.warning('请选择至少一条数据'); /** 权限按钮 */
return; const permissionObj = reactive({});
/** 请求页面数据 */
const onLoad = async (params = {}) => {
try {
details.loadingObj.list = true;
const submitData = { ...details.page, ...details.query, ...params };
for (const key in submitData) {
const element = submitData[key];
if (!element && element !== 0) delete submitData[key];
} }
this.$confirm('确定将选择数据删除?', {
confirmButtonText: '确定', delete submitData.total;
cancelButtonText: '取消',
type: 'warning' const res = await getList(submitData);
}) const { code, data } = res.data;
.then(() => { if (code !== 200) return;
return remove(this.ids); details.data = getObjType(data.records) === 'array' ? data.records : [];
details.page.total = data.total;
handleTranslationDataSeclect(details.data, details.columnList);
} catch (error) {
console.log('error :>> ', error);
} finally {
details.loadingObj.list = false;
}
};
//
const handleData = (key, res) => {
const { code, data } = res.data;
if (code !== 200) return;
for (let i = 0; i < details.columnList.length; i++) {
const value = details.columnList[i];
if (value.label === key)
return (value.checkarr =
getObjType(data) === 'array'
? data.map(val => {
val.label = val.dictValue;
val.value = val.dictKey;
return val;
}) })
.then(() => { : []);
this.onLoad(this.page); }
this.$message({ };
type: 'success',
message: '操作成功!' const init = async () => {
try {
details.loadingObj.pageLoading = true;
//
await Promise.all([
//
getDictionaryBiz('basic_property_type').then(res => handleData('资产类型', res)),
onLoad(),
]);
} catch (error) {
console.log('error :>> ', error);
} finally {
details.loadingObj.pageLoading = false;
}
};
init();
/** 搜索 */
const searchChange = () => {
onLoad();
};
/** 清空表单 */
const searchReset = () => {
details.query = {};
details.page.current = 1;
handleClearTableQuery(details.columnList);
onLoad();
};
/** 展开列表控件 */
const showdrawer = (_flag?: boolean) => {
details.drawerShow = _flag;
};
/** 是否开启搜索区 */
const searchHide = () => {
details.search = !details.search;
setNodeHeight(tableNodeRef.value.$el, '', true);
};
/** 表格表头输入框搜索 */
const inputsc = (index, row) => {
handleInputQuery(index, row, details.query);
onLoad();
};
/** 表格表头时间选择 */
const timesc = (index, row) => {
console.log(index, row);
if (!!index) {
index = dayjs(index).format('YYYY-MM-DD');
}
details.query[row.prop] = index;
if (!index) {
delete details.query[row.prop];
}
onLoad();
};
/** 表格表头输入框搜索 */
const btnsc = () => {};
/** 表格表头下拉框选择 */
const selectsc = (index, row) => {
handleSelectQuery(index, row, details.query);
onLoad();
};
/** 表格表头复选框选择 */
const selectionChange = (list: any) => {
details.selectionList = list;
};
/** 每页数量改变执行的回调 */
const sizeChange = (size: number) => {
details.page.size = size;
onLoad();
};
/** 页码改变执行的回调 */
const currentChange = current => {
details.page.current = current;
onLoad();
};
/** 删除提交 */
const handleDelete = row => {
ElMessageBox.confirm('确认删除', '提示', {
type: 'warning',
}).then(async () => {
try {
details.loadingObj.pageLoading = true;
const res = await remove(row.id);
const { code, msg } = res.data;
if (code !== 200) return;
ElMessage.success(msg);
onLoad();
} catch (error) {
console.log('error :>> ', error);
} finally {
details.loadingObj.pageLoading = false;
}
}); });
this.$refs.crud.toggleSelection(); };
/** 批量删除 */
const handleBatchRemove = () => {
if (details.selectionList.length === 0) return ElMessage.warning('请选择需要删除的数据');
ElMessageBox.confirm('确认批量删除', '提示', {
type: 'warning',
}).then(async () => {
try {
details.loadingObj.pageLoading = true;
const res = await remove(details.selectionList.map(val => val.id).join(','));
const { code, msg } = res.data;
if (code !== 200) return;
ElMessage.success(msg);
onLoad();
} catch (error) {
console.log('error :>> ', error);
} finally {
details.loadingObj.pageLoading = false;
}
}); });
};
/** 新增 */
const handleAdd = () => {
$router.push({
path: '/basic/property/basicPropertyform',
query: {
name: '资产新增',
edt: false,
}, },
handleExport() {
let downloadUrl = `/basicProperty/basicProperty/export-basicProperty?${this.website.tokenHeader}=${getToken()}`;
const {} = this.query;
let values = {};
this.$confirm('是否导出数据?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
NProgress.start();
exportBlob(downloadUrl, values).then(res => {
downloadXls(res.data, `资产${dateNow()}.xlsx`);
NProgress.done();
});
}); });
};
/** 编辑 */
const handleEdit = row => {
ElMessage.success('修改字段信息可能会导致原有数据不匹配');
$router.push({
path: '/basic/property/basicPropertyform',
query: {
data: encodeURIComponent(JSON.stringify(row)),
edt: false,
name: row.assetName + '-字段编辑',
}, },
beforeOpen(done, type) {
if (['edit', 'view'].includes(type)) {
getDetail(this.form.id).then(res => {
this.form = res.data.data;
}); });
} };
done();
}, /** 查看 */
searchReset() { const handleView = row => {
this.query = {}; $router.push({
this.onLoad(this.page); path: '/basic/property/basicPropertyform',
}, query: {
searchChange(params, done) { data: row.id,
this.query = params; edt: true,
this.page.currentPage = 1; name: row.assetName + '-字段查看',
this.onLoad(this.page, params);
done();
},
selectionChange(list) {
this.selectionList = list;
},
selectionClear() {
this.selectionList = [];
this.$refs.crud.toggleSelection();
},
currentChange(currentPage) {
this.page.currentPage = currentPage;
},
sizeChange(pageSize) {
this.page.pageSize = pageSize;
},
refreshChange() {
this.onLoad(this.page, this.query);
}, },
onLoad(page, params = {}) {
this.loading = true;
const {} = this.query;
let values = {};
getList(page.currentPage, page.pageSize, values).then(res => {
const data = res.data.data;
this.page.total = data.total;
this.data = data.records;
this.loading = false;
this.selectionClear();
}); });
}
}
}; };
</script> </script>
<style scoped lang='scss'> <style scoped lang="scss">
:deep(.no-print ){ //
margin-left: auto !important; :deep(.el-date-editor.el-input) {
height: 100% !important;
width: 100% !important;
}
:deep(.el-form-item__content) {
height: fit-content;
}
.el_div_input {
width: 100%;
display: flex;
align-items: center;
.el_dy_icon {
font-size: 1.5em;
}
}
.el-dialog-add {
:deep(.el-form) {
display: flex;
flex-wrap: wrap;
}
:deep(.el-form-item) {
width: 100%;
}
:deep(.el-input-number) {
width: 100% !important;
input {
text-align: left;
}
} }
:deep(.el-form-item__label){
width:auto !important;
} }
// :deep(.el-table__header){
// width: inherit !important;
// }
// :deep(.el-table__row){
// width: inherit !important;
// }
// :deep(.el-scrollbar__view){
// width: inherit !important;
// }
// :deep(.el-table__body){
// width: inherit !important;
// }
</style> </style>

5
src/views/basic/property/basicPropertyDetails.vue

@ -354,7 +354,7 @@ export default {
this.loading = true; this.loading = true;
const {} = this.query; const {} = this.query;
let values = {}; let values = {};
getList(1, 50, values).then(res => { getList(values).then(res => {
const data = res.data.data; const data = res.data.data;
// this.page.total = data.total; // this.page.total = data.total;
let activeTabId = data.records[0].id; let activeTabId = data.records[0].id;
@ -638,7 +638,7 @@ export default {
}; };
</script> </script>
<style scoped lang='scss'> <style scoped lang="scss">
:deep(.no-print) { :deep(.no-print) {
// margin-left: auto !important; // margin-left: auto !important;
} }
@ -681,5 +681,4 @@ export default {
:deep(.el-tabs__content) { :deep(.el-tabs__content) {
padding: 0; padding: 0;
} }
</style> </style>

8
src/views/resource/attach.vue

@ -19,7 +19,7 @@
<div class="avue-crud__left"> <div class="avue-crud__left">
<!-- 新增 --> <!-- 新增 -->
<el-button <el-button
v-if="$store.state.user.permission.oss_add" v-if="$store.state.user.permission.attach_add"
type="primary" type="primary"
icon="Upload" icon="Upload"
@click="handleUpload" @click="handleUpload"
@ -28,7 +28,7 @@
<!-- 删除 --> <!-- 删除 -->
<el-button <el-button
v-if="$store.state.user.permission.oss_delete" v-if="$store.state.user.permission.attach_delete"
type="primary" type="primary"
icon="Delete" icon="Delete"
@click="handleBatchRemove" @click="handleBatchRemove"
@ -65,7 +65,7 @@
<template v-else-if="column.label === '操作'"> <template v-else-if="column.label === '操作'">
<!-- 删除 --> <!-- 删除 -->
<el-text <el-text
v-if="$store.state.user.permission.oss_delete" v-if="$store.state.user.permission.attach_delete"
@click="() => handleDelete(row)" @click="() => handleDelete(row)"
> >
@ -73,7 +73,7 @@
<!-- 编辑 --> <!-- 编辑 -->
<el-text <el-text
v-if="$store.state.user.permission.oss_edit" v-if="$store.state.user.permission.attach_download"
@click="() => handleDownload(row)" @click="() => handleDownload(row)"
> >

1
src/views/resource/oss.vue

@ -250,7 +250,6 @@ import { mapGetters, useStore } from 'vuex';
/** 获取字典 */ /** 获取字典 */
import { getDictionary } from '@/api/system/dict'; import { getDictionary } from '@/api/system/dict';
import { getList, getDetail, add, update, remove, enable } from '@/api/resource/oss'; import { getList, getDetail, add, update, remove, enable } from '@/api/resource/oss';
import { getListName } from '@/api/basicdata/basicdataVehicle';
import { import {
setNodeHeight, setNodeHeight,
getHtmls, getHtmls,

Loading…
Cancel
Save