fix: 调整视图列表
This commit is contained in:
parent
8f9cef2a90
commit
32ac8041ee
1
components.d.ts
vendored
1
components.d.ts
vendored
@ -33,6 +33,7 @@ declare module 'vue' {
|
||||
RouterLink: typeof import('vue-router')['RouterLink']
|
||||
RouterView: typeof import('vue-router')['RouterView']
|
||||
Table: typeof import('./src/components/common/table.vue')['default']
|
||||
YChart: typeof import('./src/components/common/y-chart.vue')['default']
|
||||
YTable: typeof import('./src/components/common/y-table.vue')['default']
|
||||
}
|
||||
}
|
||||
|
3212
package-lock.json
generated
3212
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@ -6,14 +6,16 @@
|
||||
"scripts": {
|
||||
"dev": "vite --mode staging",
|
||||
"build:pre": "vite build --mode staging",
|
||||
"build": "vite build --mode production",
|
||||
"build:pro": "vite build --mode production",
|
||||
"type-check": "vue-tsc --build --force",
|
||||
"lint": "eslint . --ext .vue,.js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts --fix --ignore-path .gitignore"
|
||||
},
|
||||
"dependencies": {
|
||||
"@antv/g2plot": "^2.4.31",
|
||||
"@vueuse/core": "^10.11.0",
|
||||
"ant-design-vue": "^4.1.2",
|
||||
"axios": "^1.6.7",
|
||||
"lodash": "^4.17.21",
|
||||
"pinia": "^2.1.7",
|
||||
"vue": "^3.4.15",
|
||||
"vue-router": "^4.2.5"
|
||||
@ -35,4 +37,4 @@
|
||||
"vite": "^5.0.11",
|
||||
"vue-tsc": "^1.8.27"
|
||||
}
|
||||
}
|
||||
}
|
34
src/components/common/y-chart.vue
Normal file
34
src/components/common/y-chart.vue
Normal file
@ -0,0 +1,34 @@
|
||||
<template>
|
||||
<div class="chart-show-box">
|
||||
<div class="switch-type">
|
||||
<a-radio-group v-model:value="chartType">
|
||||
<a-radio-button value="line">折线图</a-radio-button>
|
||||
<a-radio-button value="bar">柱状图</a-radio-button>
|
||||
</a-radio-group>
|
||||
</div>
|
||||
<div class="chart-wrap">
|
||||
<Column v-if="chartType === 'bar'" />
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { ref } from "vue";
|
||||
import Line from "@/plugins/antv-g2plot/line.vue";
|
||||
import Column from "@/plugins/antv-g2plot/column.vue";
|
||||
|
||||
const props = defineProps({
|
||||
chartCfg: {
|
||||
type: Array,
|
||||
default: () => [],
|
||||
},
|
||||
});
|
||||
|
||||
const chartType = ref("line");
|
||||
</script>
|
||||
|
||||
<style lang="less" scoped>
|
||||
.chart-wrap {
|
||||
padding: 20px;
|
||||
}
|
||||
</style>
|
@ -11,6 +11,7 @@
|
||||
v-if="item.type === 'select'"
|
||||
class="input-item"
|
||||
:options="item.options"
|
||||
allow-clear
|
||||
v-model:value="filterData[item.name]"
|
||||
@change="toFilt"
|
||||
></a-select>
|
||||
@ -18,6 +19,7 @@
|
||||
v-if="item.type === 'text'"
|
||||
class="input-item"
|
||||
placeholder="请输入"
|
||||
allow-clear
|
||||
v-model:value="filterData[item.name]"
|
||||
@change="toFilt"
|
||||
/>
|
||||
@ -47,6 +49,7 @@
|
||||
<script setup>
|
||||
import { reactive, ref, watch } from "vue";
|
||||
import { useDebounceFn } from "@vueuse/core";
|
||||
import _ from "lodash";
|
||||
|
||||
const props = defineProps({
|
||||
filterConfig: {
|
||||
@ -69,9 +72,6 @@ const props = defineProps({
|
||||
const emit = defineEmits(["handleFilt"]);
|
||||
|
||||
const filterData = ref({});
|
||||
// const filterConfig = ref([]);
|
||||
// const columnConfig = ref([]);
|
||||
// const dataList = ref([]);
|
||||
|
||||
const pageState = reactive({
|
||||
page: 1,
|
||||
@ -86,21 +86,24 @@ watch(
|
||||
newVal.forEach((item) => {
|
||||
filterData.value[item.name] = undefined;
|
||||
});
|
||||
|
||||
for (let i = 0; i < newVal.length; i++) {
|
||||
console.log(
|
||||
"props.filterConfig",
|
||||
newVal[i].label,
|
||||
newVal[i].name,
|
||||
newVal[i].type
|
||||
);
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
const getData = () => {
|
||||
const cloneFilter = _.cloneDeep(props.filterConfig);
|
||||
const filter = cloneFilter
|
||||
.filter((item) => {
|
||||
return filterData.value[item.name] !== undefined;
|
||||
})
|
||||
.map((item) => {
|
||||
return {
|
||||
name: item.name,
|
||||
type: item.type,
|
||||
value: filterData.value[item.name],
|
||||
};
|
||||
});
|
||||
emit("toFilt", {
|
||||
filter: filterData.value,
|
||||
filter,
|
||||
page: pageState.page,
|
||||
perPage: pageState.perPage,
|
||||
});
|
||||
|
26
src/plugins/antv-g2plot/column.vue
Normal file
26
src/plugins/antv-g2plot/column.vue
Normal file
@ -0,0 +1,26 @@
|
||||
<template>
|
||||
<div :class="className" :style="style" ref="container"></div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { Column } from "@antv/g2plot";
|
||||
// hooks
|
||||
import useChart from "./useChart";
|
||||
|
||||
const props = defineProps({
|
||||
className: {
|
||||
type: String,
|
||||
default: "",
|
||||
},
|
||||
style: {
|
||||
type: Object,
|
||||
default: () => ({}),
|
||||
},
|
||||
config: {
|
||||
type: Object,
|
||||
default: () => ({}),
|
||||
},
|
||||
});
|
||||
|
||||
const { container } = useChart(Column, props.config);
|
||||
</script>
|
26
src/plugins/antv-g2plot/line.vue
Normal file
26
src/plugins/antv-g2plot/line.vue
Normal file
@ -0,0 +1,26 @@
|
||||
<template>
|
||||
<div :class="className" :style="style" ref="container"></div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { Line } from "@antv/g2plot";
|
||||
// hooks
|
||||
import useChart from "./useChart";
|
||||
|
||||
const props = defineProps({
|
||||
className: {
|
||||
type: String,
|
||||
default: "",
|
||||
},
|
||||
style: {
|
||||
type: Object,
|
||||
default: () => ({}),
|
||||
},
|
||||
config: {
|
||||
type: Object,
|
||||
default: () => ({}),
|
||||
},
|
||||
});
|
||||
|
||||
const { container } = useChart(Line, props.config);
|
||||
</script>
|
26
src/plugins/antv-g2plot/pie.vue
Normal file
26
src/plugins/antv-g2plot/pie.vue
Normal file
@ -0,0 +1,26 @@
|
||||
<template>
|
||||
<div :class="className" :style="style" ref="container"></div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { Pie } from "@antv/g2plot";
|
||||
// hooks
|
||||
import useChart from "./useChart";
|
||||
|
||||
const props = defineProps({
|
||||
className: {
|
||||
type: String,
|
||||
default: "",
|
||||
},
|
||||
style: {
|
||||
type: Object,
|
||||
default: () => ({}),
|
||||
},
|
||||
config: {
|
||||
type: Object,
|
||||
default: () => ({}),
|
||||
},
|
||||
});
|
||||
|
||||
const { container } = useChart(Pie, props.config);
|
||||
</script>
|
91
src/plugins/antv-g2plot/useChart.js
Normal file
91
src/plugins/antv-g2plot/useChart.js
Normal file
@ -0,0 +1,91 @@
|
||||
import { onBeforeUnmount, onMounted, ref, watch } from "vue";
|
||||
import _ from "lodash";
|
||||
|
||||
export default function useChart(ChartClass, config) {
|
||||
const chart = ref(null); // 表格实例
|
||||
const chartOptions = ref(null); // 图表配置
|
||||
const container = ref(null); // 渲染图表元素
|
||||
const { onReady, onEvent } = config;
|
||||
|
||||
// 全局事件侦听器
|
||||
let handler;
|
||||
|
||||
onMounted(() => {
|
||||
chartOptions.value = _.cloneDeep(config);
|
||||
|
||||
// 实例化图表
|
||||
const chartInstance = new ChartClass(container.value, { ...config });
|
||||
chartInstance.toDataURL = (type, encoderOptions) => {
|
||||
return toDataURL(type, encoderOptions);
|
||||
};
|
||||
chartInstance.downloadImage = (name, type, encoderOptions) => {
|
||||
return downloadImage(name, type, encoderOptions);
|
||||
};
|
||||
chartInstance.render(); // 渲染图表
|
||||
|
||||
chart.value = chartInstance;
|
||||
|
||||
// 图表渲染完成回调
|
||||
if (onReady) {
|
||||
onReady(chartInstance);
|
||||
}
|
||||
// 侦听全局事件
|
||||
handler = (event) => {
|
||||
if (onEvent) {
|
||||
onEvent(chartInstance, event);
|
||||
}
|
||||
};
|
||||
chartInstance.on("*", handler);
|
||||
});
|
||||
|
||||
onBeforeUnmount(() => {
|
||||
chart.value.destroy();
|
||||
chart.value.off("*", handler);
|
||||
chart.value = undefined;
|
||||
});
|
||||
|
||||
// 配置更改时更新图表
|
||||
watch(
|
||||
() => config,
|
||||
(config) => {
|
||||
const newConfig = _.cloneDeep(config);
|
||||
chartOptions.value = newConfig;
|
||||
chart.value.update(newConfig);
|
||||
},
|
||||
{
|
||||
deep: true,
|
||||
}
|
||||
);
|
||||
|
||||
const toDataURL = (type = "image/png", encoderOptions) => {
|
||||
return chart.value?.chart.canvas.cfg.el.toDataURL(type, encoderOptions);
|
||||
};
|
||||
|
||||
const downloadImage = (
|
||||
name = "download",
|
||||
type = "image/png",
|
||||
encoderOptions
|
||||
) => {
|
||||
let imageName = name;
|
||||
if (name.indexOf(".") === -1) {
|
||||
imageName = `${name}.${type.split("/")[1]}`;
|
||||
}
|
||||
const base64 = chart.value?.chart.canvas.cfg.el.toDataURL(
|
||||
type,
|
||||
encoderOptions
|
||||
);
|
||||
let a = document.createElement("a");
|
||||
a.href = base64;
|
||||
a.download = imageName;
|
||||
document.body.appendChild(a);
|
||||
a.click();
|
||||
document.body.removeChild(a);
|
||||
a = null;
|
||||
return imageName;
|
||||
};
|
||||
|
||||
return {
|
||||
chart,
|
||||
container,
|
||||
};
|
||||
}
|
@ -74,7 +74,7 @@ const routeList: RouteType[] = [
|
||||
path: 'create-view',
|
||||
name: 'create-view',
|
||||
component: () => import('@/views/view-all-manage/create-view/index.vue'),
|
||||
meta: { title: '创建' },
|
||||
meta: { title: '创建视图' },
|
||||
isMenu: true,
|
||||
children: [],
|
||||
},
|
||||
|
@ -200,6 +200,7 @@ const handleCancel = (record) => {
|
||||
|
||||
const handleSave = (record) => {
|
||||
const params = {
|
||||
field_id: record.field_id,
|
||||
field_title: record.field_title,
|
||||
field_name: record.field_name,
|
||||
is_search: record.is_search,
|
||||
|
@ -13,6 +13,9 @@
|
||||
v-model:value="formData.project_name"
|
||||
/>
|
||||
</a-form-item>
|
||||
<a-form-item label="项目标识" name="mark">
|
||||
<a-input placeholder="请输入项目标识,例如:oa" />
|
||||
</a-form-item>
|
||||
<a-form-item label="展示状态" name="is_show">
|
||||
<a-switch
|
||||
v-model:checked="formData.is_show"
|
||||
@ -85,6 +88,7 @@ const formRules = {
|
||||
project_name: [
|
||||
{ required: true, message: "请输入项目名称", trigger: "submit" },
|
||||
],
|
||||
mark: [{ required: true, message: "请输入项目标识", trigger: "submit" }],
|
||||
database_address: [
|
||||
{ required: true, message: "请输入数据库地址", trigger: "submit" },
|
||||
],
|
||||
@ -105,6 +109,7 @@ const formRules = {
|
||||
const formRef = ref();
|
||||
const formData = ref({
|
||||
project_name: undefined,
|
||||
mark: undefined,
|
||||
is_show: 0,
|
||||
database_address: undefined,
|
||||
database_port: undefined,
|
||||
@ -159,6 +164,7 @@ const validateConnect = () => {
|
||||
const resetFormData = () => {
|
||||
formData.value = {
|
||||
project_name: undefined,
|
||||
mark: undefined,
|
||||
is_show: 0,
|
||||
database_address: undefined,
|
||||
database_port: undefined,
|
||||
|
@ -1,6 +1,7 @@
|
||||
export const projectCfgCols = [
|
||||
{ dataIndex: 'project_id', title: '编号', align: 'center'},
|
||||
{ dataIndex: 'project_name', title: '项目名称', align: 'center'},
|
||||
{ dataIndex: 'mark', title: '项目标识', align: 'center'},
|
||||
{ dataIndex: 'database_name', title: '数据库名', align: 'center'},
|
||||
{ dataIndex: 'is_show', title: '展示状态', align: 'center'},
|
||||
// { dataIndex: 'sort', title: '排序', align: 'center'},
|
||||
|
@ -56,18 +56,16 @@
|
||||
:options="item.options"
|
||||
v-model:value="previewData.filterData[item.name]"
|
||||
placeholder="请选择"
|
||||
allow-clear
|
||||
@change="toFilt"
|
||||
></a-select>
|
||||
<a-input
|
||||
v-else
|
||||
v-if="item.type === 'text'"
|
||||
class="input-item"
|
||||
placeholder="请输入"
|
||||
allow-clear
|
||||
v-model:value="previewData.filterData[item.name]"
|
||||
@change="
|
||||
(e) => {
|
||||
toFilt(item.name, e.target.value);
|
||||
}
|
||||
"
|
||||
@change="toFilt"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
@ -76,6 +74,7 @@
|
||||
:columns="previewData.columnConfig"
|
||||
:data-source="previewData.dataList"
|
||||
:pagination="false"
|
||||
:scroll="{ x: 1200 }"
|
||||
size="small"
|
||||
bordered
|
||||
></a-table>
|
||||
@ -90,6 +89,10 @@
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="preview-area" v-else>
|
||||
<div><BarChartOutlined /></div>
|
||||
<div>预览区</div>
|
||||
</div>
|
||||
</div>
|
||||
<a-modal
|
||||
:open="nameVisible"
|
||||
@ -112,6 +115,7 @@
|
||||
import { onMounted, reactive, ref } from "vue";
|
||||
import { getProModularField, preview, saveView } from "./service";
|
||||
import { message } from "ant-design-vue";
|
||||
import { BarChartOutlined } from "@ant-design/icons-vue";
|
||||
|
||||
const projectSel = ref([]);
|
||||
const modularSel = ref([]);
|
||||
@ -151,22 +155,39 @@ const onProjectChange = (val) => {
|
||||
modularId.value = undefined;
|
||||
fieldList.value = [];
|
||||
fieldIds.value = [];
|
||||
resetPreviewData();
|
||||
};
|
||||
|
||||
const onModularChange = (val) => {
|
||||
const target = modularSel.value.find((item) => item.value === val);
|
||||
fieldList.value = target.child;
|
||||
resetPreviewData();
|
||||
};
|
||||
|
||||
const resetPreviewData = () => {
|
||||
previewData.type = "";
|
||||
previewData.filterConfig = [];
|
||||
previewData.columnConfig = [];
|
||||
previewData.dataList = [];
|
||||
previewData.filterData = {};
|
||||
previewData.page = 1;
|
||||
previewData.perPage = 20;
|
||||
previewData.total = 0;
|
||||
};
|
||||
|
||||
const toPreview = () => {
|
||||
previewLoading.value = true;
|
||||
const filter = previewData.filterConfig.map((item) => {
|
||||
return {
|
||||
name: item.name,
|
||||
type: item.type,
|
||||
value: previewData.filterData[item.name],
|
||||
};
|
||||
});
|
||||
const filter = previewData.filterConfig
|
||||
.filter((item) => {
|
||||
return previewData.filterData[item.name] !== undefined;
|
||||
})
|
||||
.map((item) => {
|
||||
return {
|
||||
name: item.name,
|
||||
type: item.type,
|
||||
value: previewData.filterData[item.name],
|
||||
};
|
||||
});
|
||||
preview({
|
||||
modularId: modularId.value,
|
||||
fieldIds: fieldIds.value.toString(),
|
||||
@ -183,7 +204,6 @@ const toPreview = () => {
|
||||
? previewData.filterData[item.name]
|
||||
: undefined;
|
||||
});
|
||||
console.log("filterData", previewData.filterData);
|
||||
previewData.columnConfig = res.data.header;
|
||||
previewData.dataList = res.data.data;
|
||||
previewData.total = res.data.count;
|
||||
@ -214,8 +234,7 @@ const toSaveView = () => {
|
||||
});
|
||||
};
|
||||
|
||||
const toFilt = (key, value) => {
|
||||
previewData.filterData[key] = value;
|
||||
const toFilt = () => {
|
||||
previewData.page = 1;
|
||||
toPreview();
|
||||
};
|
||||
@ -224,13 +243,15 @@ const toFilt = (key, value) => {
|
||||
<style lang="less" scoped>
|
||||
.normal-container {
|
||||
height: calc(100vh - 120px);
|
||||
padding: 16px;
|
||||
}
|
||||
.view-create-box {
|
||||
display: flex;
|
||||
height: 100%;
|
||||
}
|
||||
.left-box {
|
||||
width: 400px;
|
||||
width: 320px;
|
||||
flex-shrink: 0;
|
||||
height: calc(100% - 20px);
|
||||
padding: 10px;
|
||||
border-right: 1px solid #ddd;
|
||||
@ -243,10 +264,24 @@ const toFilt = (key, value) => {
|
||||
}
|
||||
}
|
||||
.right-box {
|
||||
padding: 10px;
|
||||
padding: 0 0 0 10px;
|
||||
flex-grow: 1;
|
||||
overflow: auto;
|
||||
}
|
||||
.preview-area {
|
||||
background-color: #f6f6f6;
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
font-size: 20px;
|
||||
color: #999;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
.anticon-bar-chart {
|
||||
font-size: 100px;
|
||||
}
|
||||
}
|
||||
|
||||
.y-table-filter {
|
||||
display: flex;
|
||||
@ -264,5 +299,6 @@ const toFilt = (key, value) => {
|
||||
}
|
||||
.pagination-box {
|
||||
text-align: center;
|
||||
margin-top: 10px;
|
||||
}
|
||||
</style>
|
||||
|
@ -40,7 +40,26 @@
|
||||
"
|
||||
size="small"
|
||||
bordered
|
||||
></a-table>
|
||||
>
|
||||
<template #bodyCell="{ column, record }">
|
||||
<template v-if="column.dataIndex === 'action'">
|
||||
<a-popconfirm
|
||||
title="确定删除?"
|
||||
@confirm="toDelete(record.preview_id)"
|
||||
>
|
||||
<a-button
|
||||
type="link"
|
||||
@click="
|
||||
(e) => {
|
||||
e.stopPropagation();
|
||||
}
|
||||
"
|
||||
>删除</a-button
|
||||
>
|
||||
</a-popconfirm>
|
||||
</template>
|
||||
</template>
|
||||
</a-table>
|
||||
<a-pagination
|
||||
v-model:current="pageState.page"
|
||||
:total="pageState.total"
|
||||
@ -64,6 +83,10 @@
|
||||
}
|
||||
"
|
||||
/>
|
||||
<div class="preview-area" v-else>
|
||||
<div><BarChartOutlined /></div>
|
||||
<div>展示区</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@ -71,9 +94,11 @@
|
||||
|
||||
<script setup>
|
||||
import { onMounted, ref, reactive } from "vue";
|
||||
import { getProModular, getViewList, getViewInfo } from "./service";
|
||||
import { getProModular, getViewList, getViewInfo, deleteView } from "./service";
|
||||
import { viewListCols } from "./config";
|
||||
import yTable from "@/components/common/y-table.vue";
|
||||
import { message } from "ant-design-vue";
|
||||
import { BarChartOutlined } from "@ant-design/icons-vue";
|
||||
|
||||
const projectSel = ref([]);
|
||||
const modularSel = ref([]);
|
||||
@ -83,6 +108,7 @@ const dataList = ref([]);
|
||||
const selectedRowId = ref();
|
||||
const selectViewInfo = ref({
|
||||
type: "",
|
||||
filter: [],
|
||||
});
|
||||
|
||||
const pageState = reactive({
|
||||
@ -130,11 +156,19 @@ const onModularChange = () => {
|
||||
pageState.page = 1;
|
||||
toGetList();
|
||||
};
|
||||
|
||||
const toDelete = (previewId) => {
|
||||
deleteView({ previewId }).then(() => {
|
||||
message.success("删除成功");
|
||||
toGetList();
|
||||
});
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="less" scoped>
|
||||
.normal-container {
|
||||
height: calc(100vh - 120px);
|
||||
padding: 16px;
|
||||
}
|
||||
|
||||
.view-list-box {
|
||||
@ -143,14 +177,20 @@ const onModularChange = () => {
|
||||
}
|
||||
|
||||
.left-box {
|
||||
width: 400px;
|
||||
width: 320px;
|
||||
height: calc(100% - 20px);
|
||||
padding: 10px;
|
||||
flex-shrink: 0;
|
||||
border-right: 1px solid #ddd;
|
||||
}
|
||||
|
||||
.selected-row {
|
||||
background-color: beige;
|
||||
:deep(.ant-table-row:hover) {
|
||||
cursor: pointer;
|
||||
background-color: #e6f4ff;
|
||||
}
|
||||
|
||||
:deep(.selected-row) {
|
||||
background-color: #e6f4ff;
|
||||
}
|
||||
|
||||
.pagination-box {
|
||||
@ -158,8 +198,23 @@ const onModularChange = () => {
|
||||
margin-top: 10px;
|
||||
}
|
||||
.right-box {
|
||||
padding: 10px;
|
||||
padding: 0 0 0 10px;
|
||||
flex-grow: 1;
|
||||
overflow: auto;
|
||||
}
|
||||
|
||||
.preview-area {
|
||||
background-color: #f6f6f6;
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
font-size: 20px;
|
||||
color: #999;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
.anticon-bar-chart {
|
||||
font-size: 100px;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
@ -1,4 +1,4 @@
|
||||
import { get } from "@/utils/request";
|
||||
import { get, post } from "@/utils/request";
|
||||
|
||||
// 联动下拉
|
||||
export function getProModular() {
|
||||
@ -24,15 +24,25 @@ export function getViewInfo({
|
||||
previewId,
|
||||
page = 1,
|
||||
perPage = 20,
|
||||
filter = {},
|
||||
filter = [],
|
||||
}) {
|
||||
return get({
|
||||
return post({
|
||||
url: "/api/v1/preview/info",
|
||||
params: {
|
||||
data: {
|
||||
preview_id: previewId,
|
||||
page,
|
||||
perPage: perPage,
|
||||
per_page: perPage,
|
||||
filter,
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
// 删除视图
|
||||
export function deleteView({ previewId }) {
|
||||
return post({
|
||||
url: "/api/v1/preview/del",
|
||||
data: {
|
||||
preview_id: previewId,
|
||||
},
|
||||
});
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user