zayac-admin/continew-admin-ui/src/views/tool/generator/index.vue
Charles7c 1f73aa732d refactor: 优化枚举字典处理,增加颜色类型
1.重构 useDict 方法,同时支持枚举和查询字典,对应后端接口增加缓存处理
2.优化 BaseEnum 处理,增加 color 字段可用于设置对应枚举背景颜色(同字典背景颜色)
2023-09-17 18:03:14 +08:00

501 lines
15 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<div class="app-container">
<Breadcrumb :items="['menu.tool', 'menu.tool.generator.list']" />
<a-card class="general-card" :title="$t('menu.tool.generator.list')">
<!-- 头部区域 -->
<div class="header">
<!-- 搜索栏 -->
<div v-if="showQuery" class="header-query">
<a-form ref="queryRef" :model="queryParams" layout="inline">
<a-form-item field="tableName" hide-label>
<a-input
v-model="queryParams.tableName"
placeholder="输入表名称搜索"
allow-clear
style="width: 150px"
@press-enter="handleQuery"
/>
</a-form-item>
<a-form-item hide-label>
<a-space>
<a-button type="primary" @click="handleQuery">
<template #icon><icon-search /></template>查询
</a-button>
<a-button @click="resetQuery">
<template #icon><icon-refresh /></template>重置
</a-button>
</a-space>
</a-form-item>
</a-form>
</div>
</div>
<!-- 列表区域 -->
<a-table
ref="tableRef"
row-key="tableName"
:data="tableList"
:loading="loading"
:pagination="{
showTotal: true,
showPageSize: true,
total: total,
current: queryParams.page,
}"
:bordered="false"
column-resizable
stripe
size="large"
@page-change="handlePageChange"
@page-size-change="handlePageSizeChange"
>
<template #columns>
<a-table-column title="序号">
<template #cell="{ rowIndex }">
{{ rowIndex + 1 + (queryParams.page - 1) * queryParams.size }}
</template>
</a-table-column>
<a-table-column title="表名称" data-index="tableName" :width="225" />
<a-table-column title="描述" data-index="comment" tooltip />
<a-table-column title="存储引擎" data-index="engine" align="center" />
<a-table-column title="字符集" data-index="charset" />
<a-table-column title="创建时间" data-index="createTime" />
<a-table-column title="操作" align="center">
<template #cell="{ record }">
<a-button
type="text"
size="small"
title="配置"
@click="toConfig(record.tableName)"
>
<template #icon><icon-settings /></template>配置
</a-button>
<a-button
type="text"
size="small"
:title="record.isConfiged ? '生成' : '请先进行生成配置'"
:disabled="!record.isConfiged"
@click="handleGenerate(record.tableName)"
>
<template #icon><icon-robot-add /></template>生成
</a-button>
</template>
</a-table-column>
</template>
<template #pagination-left>
<a-tooltip content="刷新">
<div class="action-icon" @click="handleQuery">
<icon-refresh size="18" />
</div>
</a-tooltip>
</template>
</a-table>
<!-- 表单区域 -->
<a-drawer
:title="title"
:visible="visible"
:width="1000"
:mask-closable="false"
:esc-to-close="false"
unmount-on-close
render-to-body
@ok="handleOk"
@cancel="handleCancel"
>
<a-card title="字段配置" class="field-config">
<template #extra>
<a-popconfirm
content="确定要同步最新数据表结构吗?同步后只要不点击确定保存,则不影响原有配置数据。"
type="warning"
@ok="handleRefresh(form.tableName)"
>
<a-tooltip content="同步最新数据表结构">
<a-button
type="primary"
status="success"
size="small"
title="同步"
:disabled="
fieldConfigList.length !== 0 &&
fieldConfigList[0].createTime === null
"
>
<template #icon><icon-sync /></template>同步
</a-button>
</a-tooltip>
</a-popconfirm>
</template>
<a-table
ref="fieldConfigRef"
:data="fieldConfigList"
:loading="fieldConfigLoading"
:pagination="false"
:bordered="false"
size="large"
:scroll="{
y: 400,
}"
>
<template #columns>
<a-table-column
title="名称"
data-index="fieldName"
:width="125"
ellipsis
tooltip
/>
<a-table-column
title="类型"
data-index="fieldType"
:width="95"
ellipsis
tooltip
/>
<a-table-column title="描述" data-index="comment" :width="170">
<template #cell="{ record }">
<a-input v-model="record.comment" />
</template>
</a-table-column>
<a-table-column
title="列表"
data-index="showInList"
:width="60"
align="center"
>
<template #cell="{ record }">
<a-checkbox v-model="record.showInList" value="true" />
</template>
</a-table-column>
<a-table-column
title="表单"
data-index="showInForm"
:width="60"
align="center"
>
<template #cell="{ record }">
<a-checkbox v-model="record.showInForm" value="true" />
</template>
</a-table-column>
<a-table-column
title="必填"
data-index="isRequired"
:width="60"
align="center"
>
<template #cell="{ record }">
<a-checkbox
v-if="record.showInForm"
v-model="record.isRequired"
value="true"
/>
<a-checkbox v-else disabled />
</template>
</a-table-column>
<a-table-column
title="查询"
data-index="showInQuery"
:width="60"
align="center"
>
<template #cell="{ record }">
<a-checkbox v-model="record.showInQuery" value="true" />
</template>
</a-table-column>
<a-table-column
title="表单类型"
data-index="formType"
:width="150"
>
<template #cell="{ record }">
<a-select
v-if="record.showInForm || record.showInQuery"
v-model="record.formType"
:options="form_type_enum"
placeholder="请选择表单类型"
/>
<span v-else>无需设置</span>
</template>
</a-table-column>
<a-table-column title="查询方式" data-index="queryType">
<template #cell="{ record }">
<a-select
v-if="record.showInQuery"
v-model="record.queryType"
:options="query_type_Enum"
placeholder="请选择查询方式"
/>
<span v-else>无需设置</span>
</template>
</a-table-column>
</template>
</a-table>
</a-card>
<a-card title="生成配置" style="margin-top: 10px">
<a-form
ref="formRef"
:model="form"
:rules="rules"
class="gen-config"
size="large"
>
<a-form-item label="作者名称" field="author">
<a-input v-model="form.author" placeholder="请输入作者名称" />
</a-form-item>
<a-form-item label="业务名称" field="businessName">
<a-input
v-model="form.businessName"
placeholder="自定义业务名称,例如:用户"
/>
</a-form-item>
<a-form-item label="所属模块" field="moduleName">
<a-input
v-model="form.moduleName"
placeholder="项目模块名称例如continew-admin-system"
/>
</a-form-item>
<a-form-item label="模块包名" field="packageName">
<a-input
v-model="form.packageName"
placeholder="项目模块包名例如top.charles7c.cnadmin.system"
/>
</a-form-item>
<a-form-item label="前端路径" field="frontendPath">
<a-input
v-model="form.frontendPath"
placeholder="前端项目 views 目录地址"
/>
</a-form-item>
<a-form-item label="去表前缀" field="tablePrefix">
<a-input
v-model="form.tablePrefix"
placeholder="数据库表前缀例如sys_"
/>
</a-form-item>
<a-form-item label="是否覆盖" field="isOverride">
<a-radio-group v-model="form.isOverride" type="button">
<a-radio :value="true">是</a-radio>
<a-radio :value="false"></a-radio>
</a-radio-group>
</a-form-item>
</a-form>
</a-card>
</a-drawer>
</a-card>
</div>
</template>
<script lang="ts" setup>
import { getCurrentInstance, ref, toRefs, reactive } from 'vue';
import {
TableRecord,
TableParam,
FieldConfigRecord,
GenConfigRecord,
listTable,
listFieldConfig,
getGenConfig,
GeneratorConfigRecord,
saveConfig,
generate,
} from '@/api/tool/generator';
const { proxy } = getCurrentInstance() as any;
const { form_type_enum, query_type_Enum } = proxy.useDict(
'form_type_enum',
'query_type_Enum'
);
const tableList = ref<TableRecord[]>([]);
const fieldConfigList = ref<FieldConfigRecord[]>([]);
const total = ref(0);
const title = ref('');
const showQuery = ref(true);
const loading = ref(false);
const visible = ref(false);
const fieldConfigLoading = ref(false);
const data = reactive({
// 查询参数
queryParams: {
tableName: undefined,
page: 1,
size: 10,
},
// 表单数据
form: {} as GenConfigRecord,
// 代码生成配置数据
config: {} as GeneratorConfigRecord,
// 表单验证规则
rules: {
author: [{ required: true, message: '请输入作者名称' }],
moduleName: [{ required: true, message: '请输入所属模块' }],
packageName: [{ required: true, message: '请输入模块包名' }],
businessName: [{ required: true, message: '请输入业务名称' }],
},
});
const { queryParams, form, rules, config } = toRefs(data);
/**
* 查询列表
*
* @param params 查询参数
*/
const getList = (params: TableParam = { ...queryParams.value }) => {
loading.value = true;
listTable(params)
.then((res) => {
tableList.value = res.data.list;
total.value = res.data.total;
})
.finally(() => {
loading.value = false;
});
};
getList();
/**
* 打开配置对话框
*
* @param tableName 表名称
*/
const toConfig = (tableName: string) => {
let tableComment = tableList.value.filter(
(t) => t.tableName === tableName
)[0].comment;
tableComment = tableComment ? `${tableComment}` : ' ';
title.value = `${tableName}${tableComment}配置`;
visible.value = true;
// 查询字段配置
getFieldConfig(tableName, false);
// 查询生成配置
getGenConfig(tableName).then((res) => {
form.value = res.data;
form.value.isOverride = false;
});
};
/**
* 同步
*
* @param tableName 表名称
*/
const handleRefresh = (tableName: string) => {
getFieldConfig(tableName, true);
};
/**
* 查询字段配置
*
* @param tableName 表名称
* @param requireSync 是否需要同步
*/
const getFieldConfig = (tableName: string, requireSync: boolean) => {
fieldConfigLoading.value = true;
listFieldConfig(tableName, requireSync)
.then((res) => {
fieldConfigList.value = res.data;
})
.finally(() => {
fieldConfigLoading.value = false;
});
};
/**
* 确定
*/
const handleOk = () => {
proxy.$refs.formRef.validate((valid: any) => {
if (!valid) {
config.value.fieldConfigs = fieldConfigList.value;
config.value.genConfig = form.value;
saveConfig(form.value.tableName, config.value).then((res) => {
handleCancel();
getList();
proxy.$message.success(res.msg);
});
}
});
};
/**
* 关闭配置
*/
const handleCancel = () => {
visible.value = false;
proxy.$refs.formRef?.resetFields();
fieldConfigList.value = [];
};
/**
* 生成代码
*
* @param tableName 表名称
*/
const handleGenerate = (tableName: string) => {
generate(tableName).then((res) => {
proxy.$message.success(res.msg);
});
};
/**
* 查询
*/
const handleQuery = () => {
getList();
};
/**
* 重置
*/
const resetQuery = () => {
proxy.$refs.queryRef.resetFields();
handleQuery();
};
/**
* 切换页码
*
* @param current 页码
*/
const handlePageChange = (current: number) => {
queryParams.value.page = current;
getList();
};
/**
* 切换每页条数
*
* @param pageSize 每页条数
*/
const handlePageSizeChange = (pageSize: number) => {
queryParams.value.size = pageSize;
getList();
};
</script>
<script lang="ts">
export default {
name: 'Generator',
};
</script>
<style scoped lang="less">
.field-config :deep(.arco-card-body) {
padding: 0;
}
:deep(.gen-config.arco-form) {
width: 50%;
}
.action-icon {
cursor: pointer;
margin-right: 10px;
}
.action-icon:hover {
color: #0960bd;
}
</style>