diff --git a/src/api/tool/generator.ts b/src/api/tool/generator.ts index c2d110c..24bd9f4 100644 --- a/src/api/tool/generator.ts +++ b/src/api/tool/generator.ts @@ -10,6 +10,7 @@ export interface TableRecord { charset: string; createTime?: string; isConfiged: boolean; + disabled: boolean; } export interface TableParam { @@ -87,9 +88,9 @@ export function preview(tableName: string) { return axios.get(`${BASE_URL}/preview/${tableName}`); } -export function generate(tableName: string) { +export function generate(tableNames: Array) { return axios.request({ - url: `${BASE_URL}/${tableName}`, + url: `${BASE_URL}/${tableNames}`, method: 'post', responseType: 'blob', }); diff --git a/src/views/tool/generator/index.vue b/src/views/tool/generator/index.vue index 09007c0..987356a 100644 --- a/src/views/tool/generator/index.vue +++ b/src/views/tool/generator/index.vue @@ -18,6 +18,7 @@ preview, generate, } from '@/api/tool/generator'; + import {TableData} from "@arco-design/web-vue"; const { proxy } = getCurrentInstance() as any; const { form_type_enum, query_type_enum } = proxy.useDict( @@ -27,12 +28,16 @@ const queryFormRef = ref(); const formRef = ref(); + const tableRef = ref(); const { copy, copied } = useClipboard(); const extensions = [java(), javascript()]; const tableList = ref([]); const fieldConfigList = ref([]); const total = ref(0); + const ids = ref>([]); const title = ref(''); + const single = ref(true); + const multiple = ref(true); const showQuery = ref(true); const loading = ref(false); const visible = ref(false); @@ -80,6 +85,45 @@ }; getList(); + /** + * 点击行选择器 + */ + const handleSelect = (rowKeys: any, rowKey: any, record: TableData) => { + if (rowKeys.find((key: any) => key === rowKey)) { + if (record.children) { + record.children.forEach((r) => { + tableRef.value.select(r.id); + rowKeys.push(r.id); + if (r.children) { + handleSelect(rowKeys, rowKey, r); + } + }); + } + } else if (record.children) { + record.children.forEach((r) => { + rowKeys.splice( + rowKeys.findIndex((key: number | undefined) => key === r.id), + 1, + ); + tableRef.value.select(r.id, false); + if (r.children) { + handleSelect(rowKeys, rowKey, r); + } + }); + } + }; + + /** + * 已选择的数据行发生改变 + * + * @param rowKeys ID 列表 + */ + const handleSelectionChange = (rowKeys: Array) => { + ids.value = rowKeys; + single.value = rowKeys.length !== 1; + multiple.value = !rowKeys.length; + }; + /** * 打开配置对话框 * @@ -199,13 +243,24 @@ } }); + /** + * 批量生成代码 + */ + const handleBatchGenerate = () => { + if (ids.value.length === 0) { + proxy.$message.info('请选择生成的表数据'); + } else { + handleGenerate(ids.value); + } + } + /** * 生成代码 * - * @param tableName 表名称 + * @param tableNames 表名称 */ - const handleGenerate = (tableName: string) => { - generate(tableName).then((res) => { + const handleGenerate = (tableNames: Array) => { + generate(tableNames).then((res) => { const contentDisposition = res.headers['content-disposition']; const pattern = new RegExp('filename=([^;]+\\.[^\\.;]+);*'); const result = pattern.exec(contentDisposition) || ''; @@ -300,6 +355,12 @@ 重置 + + 批量生成 + @@ -311,6 +372,11 @@ row-key="tableName" :data="tableList" :loading="loading" + :row-selection="{ + type: 'checkbox', + showCheckedAll: true, + onlyCurrent: false, + }" :pagination="{ showTotal: true, showPageSize: true, @@ -321,6 +387,8 @@ column-resizable stripe size="large" + @select="handleSelect" + @selection-change="handleSelectionChange" @page-change="handlePageChange" @page-size-change="handlePageSizeChange" > @@ -359,7 +427,7 @@ size="small" :title="record.isConfiged ? '生成' : '请先进行生成配置'" :disabled="!record.isConfiged" - @click="handleGenerate(record.tableName)" + @click="handleGenerate([record.tableName])" > 生成