refactor: 优化前端代码生成逻辑及部分 freemarker 模板

This commit is contained in:
Charles7c 2023-08-20 13:43:45 +08:00
parent 54ea41048a
commit f312505238
4 changed files with 70 additions and 50 deletions

View File

@ -259,11 +259,11 @@ public class GeneratorServiceImpl implements GeneratorService {
} }
// 1生成 api 代码 // 1生成 api 代码
// 例如D:/continew-admin/continew-admin-ui // 例如D:/continew-admin/continew-admin-ui
genConfigMap.put("fieldConfigs", fieldConfigList);
List<String> frontendSubPathList = StrUtil.split(frontendPath, "src"); List<String> frontendSubPathList = StrUtil.split(frontendPath, "src");
String frontendModulePath = frontendSubPathList.get(0); String frontendModulePath = frontendSubPathList.get(0);
// 例如D:/continew-admin/continew-admin-ui/src/api/tool/xxx.ts // 例如D:/continew-admin/continew-admin-ui/src/api/tool/xxx.ts
String moduleSimpleName = new File(frontendPath).getName(); File apiParentFile = FileUtil.file(frontendModulePath, "src", "api", apiModuleName);
File apiParentFile = FileUtil.file(frontendModulePath, "src", "api", moduleSimpleName);
String apiFileName = classNamePrefix.toLowerCase() + ".ts"; String apiFileName = classNamePrefix.toLowerCase() + ".ts";
File apiFile = new File(apiParentFile, apiFileName); File apiFile = new File(apiParentFile, apiFileName);
if (apiFile.exists() && !isOverride) { if (apiFile.exists() && !isOverride) {
@ -273,7 +273,8 @@ public class GeneratorServiceImpl implements GeneratorService {
FileUtil.writeString(apiContent, apiFile, StandardCharsets.UTF_8); FileUtil.writeString(apiContent, apiFile, StandardCharsets.UTF_8);
// 2生成 view 代码 // 2生成 view 代码
// 例如D:/continew-admin/continew-admin-ui/src/views/tool/xxx/index.vue // 例如D:/continew-admin/continew-admin-ui/src/views/tool/xxx/index.vue
File indexFile = FileUtil.file(frontendPath, classNamePrefix, "index.vue"); File indexFile =
FileUtil.file(frontendPath, apiModuleName, StrUtil.lowerFirst(classNamePrefix), "index.vue");
if (indexFile.exists() && !isOverride) { if (indexFile.exists() && !isOverride) {
return; return;
} }

View File

@ -54,7 +54,7 @@ public class ${className} implements Serializable {
*/ */
@Schema(description = "${fieldConfig.comment}") @Schema(description = "${fieldConfig.comment}")
@Query(type = QueryTypeEnum.${fieldConfig.queryType}) @Query(type = QueryTypeEnum.${fieldConfig.queryType})
<#if fieldConfig.queryType == 'IN' || fieldConfig.queryType == 'NOT_IN' || fieldConfig.queryType == 'BETWEEN'> <#if fieldConfig.queryType = 'IN' || fieldConfig.queryType = 'NOT_IN' || fieldConfig.queryType = 'BETWEEN'>
private List<${fieldConfig.fieldType}> ${fieldConfig.fieldName}; private List<${fieldConfig.fieldType}> ${fieldConfig.fieldName};
<#else> <#else>
private ${fieldConfig.fieldType} ${fieldConfig.fieldName}; private ${fieldConfig.fieldType} ${fieldConfig.fieldName};

View File

@ -3,17 +3,17 @@ import qs from 'query-string';
const BASE_URL = '/${apiModuleName}/${apiName}'; const BASE_URL = '/${apiModuleName}/${apiName}';
export interface ${classNamePrefix}Record { export interface DataRecord {
<#if fieldConfigs??> <#if fieldConfigs??>
<#list fieldConfigs as fieldConfig> <#list fieldConfigs as fieldConfig>
<#if fieldConfig.showInList> ${fieldConfig.fieldName}?: string;
${fieldConfig.fieldName}: string;
</#if>
</#list> </#list>
createUserString?: string;
updateUserString?: string;
</#if> </#if>
} }
export interface ${classNamePrefix}Param { export interface ListParam {
<#if fieldConfigs??> <#if fieldConfigs??>
<#list fieldConfigs as fieldConfig> <#list fieldConfigs as fieldConfig>
<#if fieldConfig.showInQuery> <#if fieldConfig.showInQuery>
@ -26,13 +26,13 @@ export interface ${classNamePrefix}Param {
sort?: Array<string>; sort?: Array<string>;
} }
export interface ${classNamePrefix}ListRes { export interface ListRes {
list: ${classNamePrefix}Record[]; list: DataRecord[];
total: number; total: number;
} }
export function list${classNamePrefix}(params: ${classNamePrefix}Param) { export function list(params: ListParam) {
return axios.get<${classNamePrefix}ListRes>(`${BASE_URL}`, { return axios.get<ListRes>(`${'$'}{BASE_URL}`, {
params, params,
paramsSerializer: (obj) => { paramsSerializer: (obj) => {
return qs.stringify(obj); return qs.stringify(obj);
@ -40,18 +40,18 @@ export function list${classNamePrefix}(params: ${classNamePrefix}Param) {
}); });
} }
export function get${classNamePrefix}(id: string) { export function get(id: string) {
return axios.get<${classNamePrefix}Record>(`${BASE_URL}/${id}`); return axios.get<DataRecord>(`${'$'}{BASE_URL}/${'$'}{id}`);
} }
export function add${classNamePrefix}(req: ${classNamePrefix}Record) { export function add(req: DataRecord) {
return axios.post(BASE_URL, req); return axios.post(BASE_URL, req);
} }
export function update${classNamePrefix}(req: ${classNamePrefix}Record, id: string) { export function update(req: DataRecord, id: string) {
return axios.put(`${BASE_URL}/${id}`, req); return axios.put(`${'$'}{BASE_URL}/${'$'}{id}`, req);
} }
export function delete${classNamePrefix}(ids: string | Array<string>) { export function del(ids: string | Array<string>) {
return axios.delete(`${BASE_URL}/${ids}`); return axios.delete(`${'$'}{BASE_URL}/${'$'}{ids}`);
} }

View File

@ -89,7 +89,7 @@
<a-table <a-table
ref="tableRef" ref="tableRef"
row-key="id" row-key="id"
:data="${apiName}List" :data="dataList"
:loading="loading" :loading="loading"
:row-selection="{ :row-selection="{
type: 'checkbox', type: 'checkbox',
@ -112,9 +112,17 @@
> >
<template #columns> <template #columns>
<#list fieldConfigs as fieldConfig> <#list fieldConfigs as fieldConfig>
<#if fieldConfig_index = 0>
<a-table-column title="${fieldConfig.comment}" data-index="${fieldConfig.fieldName}">
<template #cell="{ record }">
<a-link @click="toDetail(record.id)">{{ record.${fieldConfig.fieldName} }}</a-link>
</template>
</a-table-column>
<#else>
<#if fieldConfig.showInList> <#if fieldConfig.showInList>
<a-table-column title="${fieldConfig.comment}" data-index="${fieldConfig.fieldName}" /> <a-table-column title="${fieldConfig.comment}" data-index="${fieldConfig.fieldName}" />
</#if> </#if>
</#if>
</#list> </#list>
<a-table-column <a-table-column
v-if="checkPermission(['${apiModuleName}:${apiName}:update', '${apiModuleName}:${apiName}:delete'])" v-if="checkPermission(['${apiModuleName}:${apiName}:update', '${apiModuleName}:${apiName}:delete'])"
@ -166,9 +174,9 @@
<#list fieldConfigs as fieldConfig> <#list fieldConfigs as fieldConfig>
<#if fieldConfig.showInForm> <#if fieldConfig.showInForm>
<a-form-item label="${fieldConfig.comment}" field="${fieldConfig.fieldName}"> <a-form-item label="${fieldConfig.comment}" field="${fieldConfig.fieldName}">
<#if fieldConfig.formType == 'TEXT'> <#if fieldConfig.formType = 'TEXT'>
<a-input v-model="form.${fieldConfig.fieldName}" placeholder="请输入${fieldConfig.comment}" /> <a-input v-model="form.${fieldConfig.fieldName}" placeholder="请输入${fieldConfig.comment}" />
<#elseif fieldConfig.formType == 'TEXT_AREA'> <#elseif fieldConfig.formType = 'TEXT_AREA'>
<a-textarea <a-textarea
v-model="form.${fieldConfig.fieldName}" v-model="form.${fieldConfig.fieldName}"
:max-length="200" :max-length="200"
@ -178,7 +186,7 @@
}" }"
show-word-limit show-word-limit
/> />
<#elseif fieldConfig.formType == 'SELECT'> <#elseif fieldConfig.formType = 'SELECT'>
<#--<a-select <#--<a-select
v-model="form.${fieldConfig.fieldName}" v-model="form.${fieldConfig.fieldName}"
:options="${apiName}Options" :options="${apiName}Options"
@ -189,12 +197,12 @@
:allow-search="{ retainInputValue: true }" :allow-search="{ retainInputValue: true }"
style="width: 416px" style="width: 416px"
/>--> />-->
<#elseif fieldConfig.formType == 'RADIO'> <#elseif fieldConfig.formType = 'RADIO'>
<#--<a-radio-group v-model="form.${fieldConfig.fieldName}" type="button"> <#--<a-radio-group v-model="form.${fieldConfig.fieldName}" type="button">
</a-radio-group>--> </a-radio-group>-->
<#elseif fieldConfig.formType == 'DATE'> <#elseif fieldConfig.formType = 'DATE'>
<a-date-picker v-model="form.${fieldConfig.fieldName}" placeholder="请选择${fieldConfig.comment}"/> <a-date-picker v-model="form.${fieldConfig.fieldName}" placeholder="请选择${fieldConfig.comment}"/>
<#elseif fieldConfig.formType == 'DATE_TIME'> <#elseif fieldConfig.formType = 'DATE_TIME'>
<a-date-picker <a-date-picker
v-model="form.${fieldConfig.fieldName}" v-model="form.${fieldConfig.fieldName}"
placeholder="请选择${fieldConfig.comment}" placeholder="请选择${fieldConfig.comment}"
@ -225,7 +233,13 @@
<a-skeleton v-if="detailLoading" :animation="true"> <a-skeleton v-if="detailLoading" :animation="true">
<a-skeleton-line :rows="1" /> <a-skeleton-line :rows="1" />
</a-skeleton> </a-skeleton>
<span v-else>{{ ${apiName}.${fieldConfig.fieldName} }}</span> <#if fieldConfig.fieldName = 'createUser'>
<span v-else>{{ detail.createUserString }}</span>
<#elseif fieldConfig.fieldName = 'updateUser'>
<span v-else>{{ detail.updateUserString }}</span>
<#else>
<span v-else>{{ detail.${fieldConfig.fieldName} }}</span>
</#if>
</a-descriptions-item> </a-descriptions-item>
</#list> </#list>
</a-descriptions> </a-descriptions>
@ -237,22 +251,24 @@
<script lang="ts" setup> <script lang="ts" setup>
import { getCurrentInstance, ref, toRefs, reactive } from 'vue'; import { getCurrentInstance, ref, toRefs, reactive } from 'vue';
import { import {
${classNamePrefix}Record, DataRecord,
${classNamePrefix}Param, ListParam,
list${classNamePrefix}, list,
get${classNamePrefix}, get,
add${classNamePrefix}, add,
update${classNamePrefix}, update,
delete${classNamePrefix}, del,
} from '@/api/${apiModuleName}/${apiName}'; } from '@/api/${apiModuleName}/${apiName}';
import checkPermission from '@/utils/permission'; import checkPermission from '@/utils/permission';
const { proxy } = getCurrentInstance() as any; const { proxy } = getCurrentInstance() as any;
// const { DisEnableStatusEnum } = proxy.useDict('DisEnableStatusEnum'); // const { DisEnableStatusEnum } = proxy.useDict('DisEnableStatusEnum');
const ${apiName}List = ref<${classNamePrefix}Record[]>([]); const dataList = ref<DataRecord[]>([]);
const ${apiName} = ref<${classNamePrefix}Record>({ const detail = ref<DataRecord>({
// TODO 待补充详情字段默认值
}); });
const total = ref(0);
const ids = ref<Array<string>>([]); const ids = ref<Array<string>>([]);
const title = ref(''); const title = ref('');
const single = ref(true); const single = ref(true);
@ -272,10 +288,12 @@
${fieldConfig.fieldName}: undefined, ${fieldConfig.fieldName}: undefined,
</#if> </#if>
</#list> </#list>
page: 1,
size: 10,
sort: ['createTime,desc'], sort: ['createTime,desc'],
}, },
// 表单数据 // 表单数据
form: {} as ${classNamePrefix}Record, form: {} as DataRecord,
// 表单验证规则 // 表单验证规则
rules: { rules: {
<#list fieldConfigs as fieldConfig> <#list fieldConfigs as fieldConfig>
@ -292,11 +310,11 @@
* *
* @param params 查询参数 * @param params 查询参数
*/ */
const getList = (params: ${classNamePrefix}Param = { ...queryParams.value }) => { const getList = (params: ListParam = { ...queryParams.value }) => {
loading.value = true; loading.value = true;
list${classNamePrefix}(params) list(params)
.then((res) => { .then((res) => {
${apiName}List.value = res.data.list; dataList.value = res.data.list;
total.value = res.data.total; total.value = res.data.total;
}) })
.finally(() => { .finally(() => {
@ -321,7 +339,7 @@
*/ */
const toUpdate = (id: string) => { const toUpdate = (id: string) => {
reset(); reset();
get${classNamePrefix}(id).then((res) => { get(id).then((res) => {
form.value = res.data; form.value = res.data;
title.value = '修改${businessName}'; title.value = '修改${businessName}';
visible.value = true; visible.value = true;
@ -333,6 +351,7 @@
*/ */
const reset = () => { const reset = () => {
form.value = { form.value = {
// TODO 待补充需要重置的字段默认值,详情请参考其他模块 index.vue
}; };
proxy.$refs.formRef?.resetFields(); proxy.$refs.formRef?.resetFields();
}; };
@ -352,13 +371,13 @@
proxy.$refs.formRef.validate((valid: any) => { proxy.$refs.formRef.validate((valid: any) => {
if (!valid) { if (!valid) {
if (form.value.id !== undefined) { if (form.value.id !== undefined) {
update${classNamePrefix}(form.value, form.value.id).then((res) => { update(form.value, form.value.id).then((res) => {
handleCancel(); handleCancel();
getList(); getList();
proxy.$message.success(res.msg); proxy.$message.success(res.msg);
}); });
} else { } else {
add${classNamePrefix}(form.value).then((res) => { add(form.value).then((res) => {
handleCancel(); handleCancel();
getList(); getList();
proxy.$message.success(res.msg); proxy.$message.success(res.msg);
@ -377,9 +396,9 @@
if (detailLoading.value) return; if (detailLoading.value) return;
detailLoading.value = true; detailLoading.value = true;
detailVisible.value = true; detailVisible.value = true;
get${classNamePrefix}(id) get(id)
.then((res) => { .then((res) => {
${apiName}.value = res.data; detail.value = res.data;
}) })
.finally(() => { .finally(() => {
detailLoading.value = false; detailLoading.value = false;
@ -418,7 +437,7 @@
* @param ids ID 列表 * @param ids ID 列表
*/ */
const handleDelete = (ids: Array<string>) => { const handleDelete = (ids: Array<string>) => {
delete${classNamePrefix}(ids).then((res) => { del(ids).then((res) => {
proxy.$message.success(res.msg); proxy.$message.success(res.msg);
getList(); getList();
}); });