🐛 修改前端代码生成逻辑

This commit is contained in:
bunny 2025-07-22 21:26:13 +08:00
parent e4b231ca14
commit 755e5fa5e5
23 changed files with 317 additions and 232 deletions

View File

@ -0,0 +1,16 @@
package com.auth.common.model.common;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
@Schema(name = "BaseDto", title = "基础分页请求")
public class BasePageDto {
@Schema(name = "pageIndex", title = "当前页")
private Integer pageIndex;
@Schema(name = "pageSize", title = "分页大小")
private Integer pageSize;
}

View File

@ -6,6 +6,7 @@ import lombok.Data;
import java.time.LocalDateTime;
@Data
@Schema(name = "BaseVo", title = "基础返回数据")
public class BaseVo {
@Schema(name = "createTime", title = "创建时间")

View File

@ -1,17 +1,16 @@
package com.auth.model.base.dto;
import com.auth.common.model.common.BasePageDto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.*;
@EqualsAndHashCode(callSuper = true)
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Schema(name = "DictDTO-系统数据字典传输", title = "系统数据字典", description = "系统数据字典的DTO对象")
public class DictDto {
public class DictDto extends BasePageDto {
@Schema(name = "dictType", title = "字典类型")
private String dictType;

View File

@ -7,6 +7,13 @@ import java.util.List;
*/
public interface DatabaseDialect {
/**
* 将数据库类型转换为Java类型
*
* @param columnType 数据库中的列类型
*/
String convertToJavaType(String columnType);
/**
* 提取表注释
*
@ -23,4 +30,11 @@ public interface DatabaseDialect {
*/
String extractColumnComment(List<String> columnSpecs);
/**
* 将数据库类型转换为JavaScript类型
*
* @param columnType 数据库中的列类型
*/
String convertToJavaScriptType(String columnType);
}

View File

@ -1,6 +1,7 @@
package com.auth.module.generator.core.dialect;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import java.util.List;
import java.util.regex.Matcher;
@ -34,4 +35,49 @@ public class MySqlDialect implements DatabaseDialect {
Matcher columnSpecsStringMatcher = Pattern.compile("COMMENT\\s*'(.*?)'", Pattern.CASE_INSENSITIVE).matcher(columnSpecsString);
return columnSpecsStringMatcher.find() ? columnSpecsStringMatcher.group(1) : null;
}
/**
* 将数据库类型转换为Java类型
*
* @param columnType 数据库中的列类型
*/
@Override
public String convertToJavaType(String columnType) {
if (columnType == null) return "Object";
columnType = columnType.toLowerCase();
return switch (columnType) {
case "varchar", "char", "text", "longtext", "mediumtext", "tinytext" -> "String";
case "int", "integer", "tinyint", "smallint" -> "Integer";
case "bigint" -> "Long";
case "decimal", "numeric" -> "BigDecimal";
case "float" -> "Float";
case "double" -> "Double";
case "boolean", "bit", "tinyint unsigned" -> "Boolean";
case "date", "year" -> "Date";
case "time" -> "Time";
case "datetime", "timestamp" -> "LocalDateTime";
case "blob", "longblob", "mediumblob", "tinyblob" -> "byte[]";
default -> "Object";
};
}
/**
* 将数据库类型转换为JavaScript类型
*
* @param columnType 数据库中的列类型
*/
@Override
public String convertToJavaScriptType(String columnType) {
if (columnType == null || columnType.equals("object")) return "any";
columnType = StringUtils.uncapitalize(columnType);
return switch (columnType) {
case "double", "int", "long", "integer", "float", "decimal" -> "number";
case "localDateTime", "date" -> "string";
default -> columnType;
};
}
}

View File

@ -1,17 +1,17 @@
package com.auth.module.generator.core.provider;
import com.auth.module.generator.core.dialect.DatabaseDialect;
import com.auth.module.generator.exception.GeneratorCodeException;
import com.auth.module.generator.exception.MetadataNotFoundException;
import com.auth.module.generator.exception.MetadataProviderException;
import com.auth.module.generator.model.entity.ColumnMetaData;
import com.auth.module.generator.model.entity.DatabaseInfoMetaData;
import com.auth.module.generator.model.entity.TableMetaData;
import com.auth.module.generator.utils.MysqlTypeConvertUtil;
import com.auth.module.generator.utils.CamelCaseNameConvertUtil;
import com.zaxxer.hikari.HikariDataSource;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
@ -29,6 +29,7 @@ import java.util.stream.Collectors;
public class DatabaseMetadataProvider implements IMetadataProvider {
private final HikariDataSource dataSource;
private final DatabaseDialect dialect;
@Value("${bunny.master.database}")
private String currentDatabase;
@ -127,11 +128,11 @@ public class DatabaseMetadataProvider implements IMetadataProvider {
ColumnMetaData column = new ColumnMetaData();
column.setColumnName(columnName);
column.setLowercaseName(MysqlTypeConvertUtil.convertToCamelCase(columnName, false));
column.setUppercaseName(MysqlTypeConvertUtil.convertToCamelCase(columnName, true));
column.setLowercaseName(CamelCaseNameConvertUtil.convertToCamelCase(columnName, false));
column.setUppercaseName(CamelCaseNameConvertUtil.convertToCamelCase(columnName, true));
column.setJdbcType(typeName);
column.setJavaType(MysqlTypeConvertUtil.convertToJavaType(typeName));
column.setJavascriptType(StringUtils.uncapitalize(column.getJavaType()));
column.setJavaType(dialect.convertToJavaType(typeName));
column.setJavascriptType(dialect.convertToJavaScriptType(column.getJavaType()));
column.setComment(columnsRs.getString("REMARKS"));
column.setIsPrimaryKey(primaryKeys.contains(columnName));

View File

@ -6,14 +6,13 @@ import com.auth.module.generator.exception.GeneratorCodeException;
import com.auth.module.generator.exception.SqlParseException;
import com.auth.module.generator.model.entity.ColumnMetaData;
import com.auth.module.generator.model.entity.TableMetaData;
import com.auth.module.generator.utils.MysqlTypeConvertUtil;
import com.auth.module.generator.utils.CamelCaseNameConvertUtil;
import lombok.RequiredArgsConstructor;
import net.sf.jsqlparser.JSQLParserException;
import net.sf.jsqlparser.parser.CCJSqlParserUtil;
import net.sf.jsqlparser.statement.Statement;
import net.sf.jsqlparser.statement.create.table.CreateTable;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import java.util.List;
@ -94,18 +93,18 @@ public class SqlMetadataProvider implements IMetadataProvider {
columnInfo.setJdbcType(dataType);
// 设置 Java 类型
String javaType = MysqlTypeConvertUtil.convertToJavaType(dataType.contains("varchar") ? "varchar" : dataType);
String javaType = dialect.convertToJavaType(dataType.contains("varchar") ? "varchar" : dataType);
columnInfo.setJavaType(javaType);
// 设置 JavaScript 类型
columnInfo.setJavascriptType(StringUtils.uncapitalize(javaType));
columnInfo.setJavascriptType(dialect.convertToJavaScriptType(javaType));
// 列字段转成 下划线 -> 小驼峰
String lowercaseName = MysqlTypeConvertUtil.convertToCamelCase(columnName, false);
String lowercaseName = CamelCaseNameConvertUtil.convertToCamelCase(columnName, false);
columnInfo.setLowercaseName(lowercaseName);
// 列字段转成 下划线 -> 大驼峰名称
String uppercaseName = MysqlTypeConvertUtil.convertToCamelCase(columnName, true);
String uppercaseName = CamelCaseNameConvertUtil.convertToCamelCase(columnName, true);
columnInfo.setUppercaseName(uppercaseName);
// 解析注释

View File

@ -2,7 +2,7 @@ package com.auth.module.generator.core.template;
import com.auth.module.generator.model.dto.VmsArgumentDto;
import com.auth.module.generator.model.entity.TableMetaData;
import com.auth.module.generator.utils.MysqlTypeConvertUtil;
import com.auth.module.generator.utils.CamelCaseNameConvertUtil;
import com.google.common.base.CaseFormat;
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
@ -78,11 +78,11 @@ public class VmsTBaseTemplateGenerator extends AbstractTemplateGenerator {
context.put("package", dto.getPackageName());
// 将类名称转成小驼峰
String lowerCamelCase = MysqlTypeConvertUtil.convertToCamelCase(cleanTableName, false);
String lowerCamelCase = CamelCaseNameConvertUtil.convertToCamelCase(cleanTableName, false);
context.put("classLowercaseName", lowerCamelCase);
// 将类名称转成大驼峰
String upperCameCase = MysqlTypeConvertUtil.convertToCamelCase(cleanTableName, true);
String upperCameCase = CamelCaseNameConvertUtil.convertToCamelCase(cleanTableName, true);
context.put("classUppercaseName", upperCameCase);
// 添加中划线

View File

@ -1,24 +1,12 @@
package com.auth.module.generator.service.helper;
import com.auth.module.generator.utils.MysqlTypeConvertUtil;
import com.auth.module.generator.utils.CamelCaseNameConvertUtil;
import com.google.common.base.CaseFormat;
import java.util.Map;
/**
* 代码生成工具类
*/
public class VmsGeneratorPathHelper {
private static final Map<String, String> FILE_TYPE_SUFFIXES = Map.of(
"controller", "Controller",
"service", "Service",
"serviceImpl", "ServiceImpl",
"mapper", "Mapper",
"resourceMapper", "Mapper",
"dto", "Dto",
"entity", "Entity",
"vo", "Vo"
);
/**
* 处理模板文件路径和命名
@ -28,7 +16,7 @@ public class VmsGeneratorPathHelper {
* @return 处理后的文件路径
*/
public static String processVmPath(String path, String tableName) {
String lowerCamelCase = MysqlTypeConvertUtil.convertToCamelCase(tableName, false);
String lowerCamelCase = CamelCaseNameConvertUtil.convertToCamelCase(tableName, false);
if (lowerCamelCase != null) {
String[] pathParts = path.replace("$className", lowerCamelCase).split("/");
@ -53,29 +41,23 @@ public class VmsGeneratorPathHelper {
String baseName = parts[0];
String extension = parts.length > 1 ? parts[1] : "";
String upperCamelCase = MysqlTypeConvertUtil.convertToCamelCase(tableName, true);
String lowerCamelCase = MysqlTypeConvertUtil.convertToCamelCase(tableName, false);
String upperCamelCase = CamelCaseNameConvertUtil.convertToCamelCase(tableName, true);
String lowerCamelCase = CamelCaseNameConvertUtil.convertToCamelCase(tableName, false);
// ==========================
// 💡Java
// 如果包含Java和xml需要进行处理
// ==========================
if (filename.contains("java") || filename.contains("xml")) {
return upperCamelCase + FILE_TYPE_SUFFIXES.getOrDefault(baseName, "") + "." + extension;
// 💡含Java和xml需要进行处理
if (filename.contains(".java") || filename.contains(".xml")) {
String toUpperCamelCase = CamelCaseNameConvertUtil.convertToCamelCase(baseName, true);
return upperCamelCase + toUpperCamelCase + "." + extension;
}
// ==========================
// 💡前端
// 前端配置
// ==========================
if (filename.equals("api.ts") || filename.equals("store.ts")) {
return lowerCamelCase + ".ts";
}
// 💡前端配置
return switch (filename) {
case "api.ts", "store.ts" -> lowerCamelCase + ".ts";
case "types.ts" -> lowerCamelCase + "DataType.ts";
case "dialog.vue" -> CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_HYPHEN, lowerCamelCase) + "-dialog.vue";
case "columns.tsx" -> lowerCamelCase + "-columns.tsx";
default -> filename;
};
if (filename.equals("dialog.vue")) {
return CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_HYPHEN, lowerCamelCase) + "-dialog.vue";
}
return filename;
}
}

View File

@ -0,0 +1,29 @@
package com.auth.module.generator.utils;
import com.google.common.base.CaseFormat;
import org.assertj.core.util.introspection.CaseFormatUtils;
/* 类型转换数据库转Java类型等 */
public class CamelCaseNameConvertUtil {
/**
* 下划线命名转驼峰命名
*
* @param name 原始名称传入的值可以是
* `xxx_xxx` `CaseFormat`
* `caseFormat`
* @param firstLetterCapital 首字母是否大写
*/
public static String convertToCamelCase(String name, boolean firstLetterCapital) {
if (name == null || name.isEmpty()) return name;
// 转成小驼峰
String lowerCamelCase = CaseFormatUtils.toCamelCase(name);
// 首字母不大写
if (!firstLetterCapital) return lowerCamelCase;
// 将小驼峰转成大驼峰
return CaseFormat.LOWER_CAMEL.to(CaseFormat.UPPER_CAMEL, lowerCamelCase);
}
}

View File

@ -1,52 +0,0 @@
package com.auth.module.generator.utils;
import com.google.common.base.CaseFormat;
import org.assertj.core.util.introspection.CaseFormatUtils;
/* 类型转换数据库转Java类型等 */
public class MysqlTypeConvertUtil {
/**
* 将数据库类型转换为Java类型
*/
public static String convertToJavaType(String columnType) {
if (columnType == null) return "Object";
columnType = columnType.toLowerCase();
return switch (columnType) {
case "varchar", "char", "text", "longtext", "mediumtext", "tinytext" -> "String";
case "int", "integer", "tinyint", "smallint" -> "Integer";
case "bigint" -> "Long";
case "decimal", "numeric" -> "BigDecimal";
case "float" -> "Float";
case "double" -> "Double";
case "boolean", "bit", "tinyint unsigned" -> "Boolean";
case "date", "year" -> "Date";
case "time" -> "Time";
case "datetime", "timestamp" -> "LocalDateTime";
case "blob", "longblob", "mediumblob", "tinyblob" -> "byte[]";
default -> "Object";
};
}
/**
* 下划线命名转驼峰命名
*
* @param name 原始名称传入的值可以是
* `xxx_xxx` `CaseFormat`
* `caseFormat`
* @param firstLetterCapital 首字母是否大写
*/
public static String convertToCamelCase(String name, boolean firstLetterCapital) {
if (name == null || name.isEmpty()) return name;
// 转成小驼峰
String lowerCamelCase = CaseFormatUtils.toCamelCase(name);
// 首字母不大写
if (!firstLetterCapital) return lowerCamelCase;
// 将小驼峰转成大驼峰
return CaseFormat.LOWER_CAMEL.to(CaseFormat.UPPER_CAMEL, lowerCamelCase);
}
}

View File

@ -35,44 +35,39 @@ public class ${classUppercaseName}Controller {
private final ${classUppercaseName}Service ${classLowercaseName}Service;
@Operation(summary = "分页查询${comment}", description = "分页查询${comment}")
@GetMapping("{page}/{limit}")
public Result<PageResult<${classUppercaseName}Vo>> get${classUppercaseName}Page(
@Parameter(name = "page", description = "当前页", required = true)
@PathVariable("page") Integer page,
@Parameter(name = "limit", description = "每页记录数", required = true)
@PathVariable("limit") Integer limit,
${classUppercaseName}Dto dto) {
Page<${classUppercaseName}Entity> pageParams = new Page<>(page, limit);
@GetMapping()
public Result<PageResult<${classUppercaseName}Vo>> get${classUppercaseName}Page(${classUppercaseName}Dto dto) {
Page<${classUppercaseName}Entity> pageParams = new Page<>(dto.getPageIndex(), dto.getPageSize());
PageResult<${classUppercaseName}Vo> pageResult = ${classLowercaseName}Service.get${classUppercaseName}Page(pageParams, dto);
return Result.success(pageResult);
}
@Operation(summary = "根据id查询${comment}详情", description = "根据id查询${comment}详情")
@GetMapping("{id}")
public Result<${classUppercaseName}Vo> get${classUppercaseName}ById(@PathVariable("id") Long id) {
${classUppercaseName}Vo ${classLowercaseName}Vo = ${classLowercaseName}Service.get${classUppercaseName}ById(id);
public Result<${classUppercaseName}Vo> getById(@PathVariable("id") Long id) {
${classUppercaseName}Vo ${classLowercaseName}Vo = ${classLowercaseName}Service.getById(id);
return Result.success(${classLowercaseName}Vo);
}
@Operation(summary = "添加${comment}", description = "添加${comment}")
@PostMapping()
public Result<String> add${classUppercaseName}(@Valid @RequestBody ${classUppercaseName}Dto dto) {
${classLowercaseName}Service.add${classUppercaseName}(dto);
public Result<String> create(@Valid @RequestBody ${classUppercaseName}Dto dto) {
${classLowercaseName}Service.create(dto);
return Result.success(ResultCodeEnum.ADD_SUCCESS);
}
@Operation(summary = "更新${comment}", description = "更新${comment}")
@PutMapping()
public Result<String> update${classUppercaseName}(@Valid @RequestBody ${classUppercaseName}Dto dto) {
${classLowercaseName}Service.update${classUppercaseName}(dto);
public Result<String> update(@Valid @RequestBody ${classUppercaseName}Dto dto) {
${classLowercaseName}Service.update(dto);
return Result.success(ResultCodeEnum.UPDATE_SUCCESS);
}
@Operation(summary = "删除${comment}", description = "删除${comment}")
@DeleteMapping()
public Result<String> delete${classUppercaseName}(@RequestBody List<Long> ids) {
${classLowercaseName}Service.delete${classUppercaseName}(ids);
public Result<String> batchDelete(@RequestBody List<Long> ids) {
${classLowercaseName}Service.batchDelete(ids);
return Result.success(ResultCodeEnum.DELETE_SUCCESS);
}
}

View File

@ -1,19 +1,18 @@
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.*;
import com.auth.common.model.common.BasePageDto;
import java.time.LocalDateTime;
import java.math.BigDecimal;
import java.util.Date;
@EqualsAndHashCode(callSuper = true)
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Schema(name = "${classUppercaseName}DTO-${comment}传输对象", title = "${comment}", description = "${comment}的DTO对象")
public class ${classUppercaseName}Dto {
public class ${classUppercaseName}Dto extends BasePageDto{
#foreach($field in ${columnInfoList})
@Schema(name = "${field.lowercaseName}", title = "${field.comment}")

View File

@ -54,7 +54,7 @@ public class ${classUppercaseName}ServiceImpl extends ServiceImpl<${classUpperca
* @param id 主键
* @return ${comment}详情 ${classUppercaseName}Vo}
*/
public ${classUppercaseName}Vo get${classUppercaseName}ById(Long id){
public ${classUppercaseName}Vo getById(Long id){
${classUppercaseName}Entity ${classLowercaseName}Entity = getById(id);
${classUppercaseName}Vo ${classLowercaseName}Vo = new ${classUppercaseName}Vo();
@ -69,7 +69,7 @@ public class ${classUppercaseName}ServiceImpl extends ServiceImpl<${classUpperca
* @param dto ${comment}添加
*/
@Override
public void add${classUppercaseName}(${classUppercaseName}Dto dto) {
public void create(${classUppercaseName}Dto dto) {
${classUppercaseName}Entity ${classLowercaseName} = new ${classUppercaseName}Entity();
BeanUtils.copyProperties(dto, ${classLowercaseName});
@ -82,7 +82,7 @@ public class ${classUppercaseName}ServiceImpl extends ServiceImpl<${classUpperca
* @param dto ${comment}更新
*/
@Override
public void update${classUppercaseName}(${classUppercaseName}Dto dto) {
public void update(${classUppercaseName}Dto dto) {
${classUppercaseName}Entity ${classLowercaseName} = new ${classUppercaseName}Entity();
BeanUtils.copyProperties(dto, ${classLowercaseName});
@ -95,7 +95,7 @@ public class ${classUppercaseName}ServiceImpl extends ServiceImpl<${classUpperca
* @param ids 删除id列表
*/
@Override
public void delete${classUppercaseName}(List<Long> ids) {
public void batchDelete(List<Long> ids) {
removeByIds(ids);
}
}

View File

@ -34,26 +34,26 @@ public interface ${classUppercaseName}Service extends IService<${classUppercaseN
* @param id 主键
* @return ${comment}详情 ${classUppercaseName}Vo}
*/
${classUppercaseName}Vo get${classUppercaseName}ById(Long id);
${classUppercaseName}Vo getById(Long id);
/**
* 添加${comment}
*
* @param dto {@link ${classUppercaseName}Dto} 添加表单
*/
void add${classUppercaseName}(${classUppercaseName}Dto dto);
void create(${classUppercaseName}Dto dto);
/**
* 更新${comment}
*
* @param dto {@link ${classUppercaseName}Dto} 更新表单
*/
void update${classUppercaseName}(${classUppercaseName}Dto dto);
void update(${classUppercaseName}Dto dto);
/**
* 删除|批量删除${comment}类型
*
* @param ids 删除id列表
*/
void delete${classUppercaseName}(List<Long> ids);
void batchDelete(List<Long> ids);
}

View File

@ -1,22 +1,28 @@
import type { PageResult, Result } from "@/types/common/Result";
import type { ResultPage, Result } from "@/types/base";
import type { ${classUppercaseName}ListItem } from "@/types/${classLowercaseName}/${classLowercaseName}DataType.ts";
import { http } from "@/utils/http";
/** ${comment}---获取${comment}列表 */
export const fetchGet${classUppercaseName}List = (data: any) => {
return http.request<BaseResult<ResultTable>>('get', `${classLowercaseName}/get${classUppercaseName}List/${data.currentPage}/${data.pageSize}`, {params: data});
export const query${classUppercaseName}Page = (params: any) => {
return http.request<ResultPage<${classUppercaseName}ListItem>>('get', `${classLowercaseName}`, {params});
};
/** 部门表---获取${comment}详情 */
export const get${classUppercaseName}Detail = (params: any) => {
return http.request<Result<${classUppercaseName}ListItem>>("get", `${classLowercaseName}/${params.id}`);
};
/** ${comment}---添加${comment} */
export const fetchAdd${classUppercaseName} = (data: any) => {
return http.request<BaseResult<any>>('post', '${classLowercaseName}/add${classUppercaseName}', {data});
export const create${classUppercaseName} = (data: any) => {
return http.request<Result<string>>('post', '${classLowercaseName}', {data});
};
/** ${comment}---更新${comment} */
export const fetchUpdate${classUppercaseName} = (data: any) => {
return http.request<BaseResult<any>>('put', '${classLowercaseName}/update${classUppercaseName}', {data});
export const update${classUppercaseName}ById = (data: any) => {
return http.request<Result<string>>('put', '${classLowercaseName}', {data});
};
/** ${comment}---删除${comment} */
export const fetchDelete${classUppercaseName} = (data: any) => {
return http.request<BaseResult<any>>('delete', '${classLowercaseName}/delete${classUppercaseName}', {data});
export const batchDelete${classUppercaseName} = (data: any) => {
return http.request<Result<string>>('delete', '${classLowercaseName}', {data});
};

View File

@ -1,13 +1,16 @@
import {defineStore} from 'pinia';
import {fetchAdd${classUppercaseName}, fetchDelete${classUppercaseName}, fetchUpdate${classUppercaseName}} from '';
import {pageSizes} from '@/enums/baseConstant';
import {query${classUppercaseName}Page,get${classUppercaseName}Detail, create${classUppercaseName}, update${classUppercaseName}ById,batchDelete${classUppercaseName}} from '@/api/${classLowercaseName}';
import {storeMessage} from '@/utils/message';
import {storePagination} from '@/store/useStorePagination';
import { storePagination } from "@/utils/pageResultUtil";
/**
* ${comment} Store
*/
export const use${classUppercaseName}Store = defineStore('${lowercaseName}Store', {
* ${comment} Store
* 数据库表名称:${tableName}
*
* @author ${author}
* @since ${date}
*/
export const use${classUppercaseName}Store = defineStore('${classLowercaseName}Store', {
state() {
return {
// ${comment}列表
@ -15,8 +18,8 @@ export const use${classUppercaseName}Store = defineStore('${lowercaseName}Store'
// 查询表单
form: {
#foreach($item in $columnInfoList)
// $!{item.comment}
$!{item.columnName}: undefined,
// $!{item.comment}
$!{item.lowercaseName}: undefined,
#end
},
// 分页查询结果
@ -24,7 +27,7 @@ export const use${classUppercaseName}Store = defineStore('${lowercaseName}Store'
currentPage: 1,
pageSize: 30,
total: 1,
pageSizes,
pageSizes: 0,
},
// 加载
loading: false,
@ -33,36 +36,42 @@ export const use${classUppercaseName}Store = defineStore('${lowercaseName}Store'
getters: {},
actions: {
/** 获取${comment} */
async get${classUppercaseName}List() {
async fetch${classUppercaseName}Page() {
// 整理请求参数
const data = {...this.pagination, ...this.form};
const data = {...this.pagination, ...this.form} as any;;
delete data.pageSizes;
delete data.total;
delete data.background;
// 获取${comment}列表
const result = await fetchGet${classUppercaseName}List(data);
const result = await query${classUppercaseName}Page(data);
// 公共页面函数hook
const pagination = storePagination.bind(this);
return pagination(result);
},
/** 查看${comment}详情 */
async get${classUppercaseName}Detail(data:any){
const result = await get${classUppercaseName}Detail(data);
return result.data;
},
/** 添加${comment} */
async add${classUppercaseName}(data: any) {
const result = await fetchAdd${classUppercaseName}(data);
async create${classUppercaseName}(data: any) {
const result = await create${classUppercaseName}(data);
return storeMessage(result);
},
/** 修改${comment} */
async update${classUppercaseName}(data: any) {
const result = await fetchUpdate${classUppercaseName}(data);
async update${classUppercaseName}ById(data: any) {
const result = await update${classUppercaseName}ById(data);
return storeMessage(result);
},
/** 删除${comment} */
async delete${classUppercaseName}(data: any) {
const result = await fetchDelete${classUppercaseName}(data);
async batchDelete${classUppercaseName}(data: any) {
const result = await batchDelete${classUppercaseName}(data);
return storeMessage(result);
},
},

View File

@ -1,17 +1,46 @@
import type { BaseModel } from "@/types/base";
/**
* ${comment}
* 数据库表:${tableName}
* ${comment}列表
* 数据库表名称${tableName}
*
* @author ${author}
* @since ${date}
*/
export type ${classUppercaseName}Result = {
export interface ${classUppercaseName}ListItem extends BaseModel{
#foreach($field in $columnInfoList)
/* $field.comment */
#if($field.javascriptType == "object")
$field.columnName: any
#else
$field.columnName: $field.javascriptType
/* $field.comment */
$field.lowercaseName: $field.javascriptType;
#end
};
/**
* ${comment}提交表单
* 数据库表名称:${tableName}
*
* @author ${author}
* @since ${date}
*/
export interface ${classUppercaseName}Form {
#foreach($field in $columnInfoList)
/* $field.comment */
$field.lowercaseName: $field.javascriptType;
#end
};
/**
* ${comment}详情
* 数据库表名称:${tableName}
*
* @author ${author}
* @since ${date}
*/
export interface ${classUppercaseName}Info {
#foreach($field in $columnInfoList)
/* $field.comment */
$field.lowercaseName: $field.javascriptType | undefined;
#end
};

View File

@ -1,21 +1,23 @@
<script lang="ts" setup>
import {ref} from 'vue';
import {FormInstance} from 'element-plus';
import {FormProps} from '';
import {ref} from 'vue';
import {FormInstance} from 'element-plus';
import { ${classUppercaseName}Info } from '@/types/${classLowercaseName}/${classLowercaseName}DataType.ts';
import { rules } from '../utils/${classLowercaseName}-columns';
import {FormInline} from './utils/hook';
const props = withDefaults(defineProps<FormProps>(), {
const props = withDefaults(defineProps<FormInline>(), {
formInline: () => ({
#foreach($item in $columnInfoList)
#if(${item.fieldName})
// $!{item.comment}
${item.fieldName}: undefined,
#if(${item.lowercaseName})
// $!{item.comment}
${item.lowercaseName}: undefined,
#end
#end
#end
}),
});
const formRef = ref<FormInstance>();
const form = ref(props.formInline);
const form = ref(props.formInline());
defineExpose({formRef});
</script>
@ -25,9 +27,9 @@
#foreach($item in $columnInfoList)
<!-- $item.comment -->
<el-form-item :label="$t('${item.fieldName}')" prop="$item.fieldName">
<el-input v-model="form.$item.fieldName" autocomplete="off" type="text"
:placeholder="$t('input') + $t('${item.fieldName}')"/>
<el-form-item label="${comment}" prop="$item.lowercaseName">
<el-input v-model="form.$item.lowercaseName" autocomplete="off" type="text"
placeholder="输入${item.comment}"/>
</el-form-item>
#end
</el-form>

View File

@ -1,7 +1,15 @@
<script lang="ts" setup>
import {onMounted, ref} from 'vue';
import {deleteIds, onSearch} from '';
import {FormInstance} from "element-plus";
import {onMounted, ref} from 'vue';
import {FormInstance} from "element-plus";
import { useRenderIcon } from '@/components/ReIcon/src/hooks';
import Delete from '~icons/ep/delete';
import EditPen from '~icons/ep/edit-pen';
import Refresh from '~icons/ep/refresh';
import AddFill from '~icons/ri/add-circle-line';
import { selectUserinfo } from '@/components/RePureTableBar/Userinfo/columns';
import { deleteIds, onSearch, onDeleteBatch, onAdd, onDelete, onUpdate,FormInline } from './utils/hook';
import { columns } from './utils/${classLowercaseName}-columns';
import { use${classUppercaseName}Store } from '@/store/modules/system/${classLowercaseName}';
const tableRef = ref();
const formRef = ref();
@ -15,7 +23,7 @@
/** 当分页发生变化 */
const onPageSizeChange = async (value: number) => {
${classLowercaseName}Store.pagination.pageSize = value;
${classLowercaseName}Store.pagination.pageSize = value;
await onSearch();
};
@ -43,29 +51,29 @@
#foreach($item in $columnInfoList)
<!-- $item.comment -->
<el-form-item :label="$t('${item.fieldName}')" prop="${item.fieldName}">
<el-input v-model="${classLowercaseName}Store.form.${item.fieldName}"
:placeholder="`$leftBrace$t('input')}$leftBrace$t('${item.fieldName}')}`"
<el-form-item label="${item.comment}" prop="${item.lowercaseName}">
<el-input v-model="${classLowercaseName}Store.form.${item.lowercaseName}"
placeholder="输入${item.comment}"
class="!w-[180px]" clearable/>
</el-form-item>
#end
<el-form-item>
<el-button :icon="useRenderIcon('ri:search-line')" :loading="${classLowercaseName}Store.loading" type="primary"
@click="onSearch"> {{ $t('search')
}}
@click="onSearch">
搜索
</el-button>
<el-button :icon="useRenderIcon(Refresh)" @click="resetForm(formRef)"> {{ $t('buttons.reset') }}</el-button>
<el-button :icon="useRenderIcon(Refresh)" @click="resetForm(formRef)"> 重置</el-button>
</el-form-item>
</el-form>
<PureTableBar :columns="columns" title="${classDescription}" @fullscreen="tableRef.setAdaptive()"
@refresh="onSearch">
<template #buttons>
<el-button :icon="useRenderIcon(AddFill)" type="primary" @click="onAdd"> {{ $t('addNew') }}</el-button>
<el-button :icon="useRenderIcon(AddFill)" type="primary" @click="onAdd"> 新增</el-button>
<!-- 批量删除按钮 -->
<el-button v-show="deleteIds.length > 0" :icon="useRenderIcon(Delete)" type="danger" @click="onDeleteBatch">
{{ $t('delete_batches') }}
删除
</el-button>
</template>
@ -105,17 +113,18 @@
<template #operation="{ row }">
<el-button :icon="useRenderIcon(EditPen)" :size="size" class="reset-margin" link type="primary"
@click="onUpdate(row)"> {{ $t('modify')
}}
@click="onUpdate(row)">
修改
</el-button>
<el-button :icon="useRenderIcon(AddFill)" :size="size" class="reset-margin" link type="primary"
@click="onAdd"> {{ $t('addNew') }}
@click="onAdd">
添加
</el-button>
<!-- TODO 待完成 -->
<el-popconfirm :title="`${leftBrace}$t('delete')}${row.email}?`" @confirm="onDelete(row)">
<el-popconfirm :title="`确认删除?`" @confirm="onDelete(row)">
<template #reference>
<el-button :icon="useRenderIcon(Delete)" :size="size" class="reset-margin" link type="primary">
{{ $t('delete') }}
删除
</el-button>
</template>
</el-popconfirm>

View File

@ -1,28 +1,27 @@
import {reactive} from 'vue';
import type {FormRules} from 'element-plus';
import { $t } from '@/plugins/i18n';
export const columns: TableColumnList = [
{type: 'selection', align: 'left'},
{type: 'index', index: (index: number) => index + 1, label: '序号', width: 60},
#foreach($field in $columnInfoList)
// $field.comment
{label: $t('$field.fieldName'), prop: '$field.fieldName'},
{label: "$field.comment", prop: '$field.lowercaseName'},
#end
{label: $t('table.updateTime'), prop: 'updateTime', sortable: true, width: 160},
{label: $t('table.createTime'), prop: 'createTime', sortable: true, width: 160},
{label: $t('table.createUser'), prop: 'createUser', slot: 'createUser', width: 130},
{label: $t('table.updateUser'), prop: 'updateUser', slot: 'updateUser', width: 130},
{label: $t('table.operation'), fixed: 'right', width: 210, slot: 'operation'},
{label: "更新时间", prop: 'updateTime', sortable: true, width: 160},
{label: "创建时间", prop: 'createTime', sortable: true, width: 160},
{label: "创建用户", prop: 'createUser', slot: 'createUser', width: 130},
{label: "更新用户", prop: 'updateUser', slot: 'updateUser', width: 130},
{label: "操作", fixed: 'right', width: 210, slot: 'operation'},
];
// 添加规则
export const rules = reactive < FormRules > ({
#foreach($field in $columnInfoList)
// $field.comment
$field.fieldName: [{
$field.lowercaseName: [{
required: true,
message: `$leftBrace$t('input')}$leftBrace$t('${field.fieldName}')}`,
message: `需要输入${field.lowercaseName}`,
trigger: 'blur'
}],
#end

View File

@ -1,7 +1,15 @@
import {addDialog} from '@/components/BaseDialog/index';
import { addDialog } from '@/components/ReDialog/index';
import {h, ref} from 'vue';
import {message, messageBox} from '@/utils/message';
import DeleteBatchDialog from "@/components/Table/DeleteBatchDialog.vue";
import { use${classUppercaseName}Store } from '@/store/modules/system/${classLowercaseName}';
import ${classUppercaseName}Dialog from '../components/${classLowercaseName}-dialog.vue';
import type { ${classUppercaseName}Info } from '@/types/${classLowercaseName}/${classLowercaseName}DataType.ts';
import type { FormItemProps } from 'element-plus';
export interface FormInline {
formInline?: () => ${classUppercaseName}Info;
}
export const formRef = ref();
// 删除ids
@ -11,19 +19,19 @@ const ${classLowercaseName}Store = use${classUppercaseName}Store();
/** 搜索初始化${comment} */
export async function onSearch() {
${classLowercaseName}Store.loading = true;
await ${classLowercaseName}Store.get${classUppercaseName}List();
await ${classLowercaseName}Store.fetch${classUppercaseName}Page();
${classLowercaseName}Store.loading = false;
}
/** 添加${comment} */
export function onAdd() {
addDialog({
title: `$leftBrace $t("addNew")}$leftBrace$t("${classLowercaseName}")}`,
title: `添加${comment}`,
width: '30%',
props: {
formInline: {
#foreach($item in $columnInfoList)
$!{item.columnName}: undefined,
$!{item.columnName}: undefined,
#end
},
},
@ -36,7 +44,7 @@ export function onAdd() {
formRef.value.formRef.validate(async (valid: any) => {
if (!valid) return;
const result = await ${classLowercaseName}Store.add${classUppercaseName}(form);
const result = await ${classLowercaseName}Store.create${classUppercaseName}(form);
if (!result) return;
done();
await onSearch();
@ -48,12 +56,12 @@ export function onAdd() {
/** 更新${comment} */
export function onUpdate(row: any) {
addDialog({
title: `$leftBrace$t("modify")}$leftBrace$t("${classLowercaseName}")}`,
title: `修改${comment}`,
width: '30%',
props: {
formInline: {
#foreach($item in $columnInfoList)
$!{item.columnName}: row.$!{item.fieldName},
$!{item.lowercaseName}: row.$!{item.lowercaseName},
#end
}
},
@ -66,7 +74,7 @@ export function onUpdate(row: any) {
formRef.value.formRef.validate(async (valid: any) => {
if (!valid) return;
const result = await ${classLowercaseName}Store.update${classUppercaseName}({...form, id: row.id});
const result = await ${classLowercaseName}Store.update${classUppercaseName}ById({...form, id: row.id});
if (!result) return;
done();
await onSearch();
@ -81,15 +89,15 @@ export const onDelete = async (row: any) => {
// 是否确认删除
const result = await messageBox({
title: $t('confirmDelete'),
title: "确认删除${comment}",
showMessage: false,
confirmMessage: undefined,
cancelMessage: $t("cancel_delete"),
cancelMessage: "已取消",
});
if (!result) return;
// 删除数据
await ${classLowercaseName}Store.delete${classUppercaseName}([id]);
await ${classLowercaseName}Store.batchDelete${classUppercaseName}([id]);
await onSearch();
};
@ -99,7 +107,7 @@ export const onDeleteBatch = async () => {
const formDeletedBatchRef = ref();
addDialog({
title: $t('deleteBatchTip'),
title: "批量删除${comment}",
width: '30%',
props: {formInline: {confirmText: ''}},
draggable: true,
@ -113,11 +121,11 @@ export const onDeleteBatch = async () => {
const text = options.props.formInline.confirmText.toLowerCase();
if (text === 'yes' || text === 'y') {
// 删除数据
await ${classLowercaseName}Store.delete${classUppercaseName}(ids);
await ${classLowercaseName}Store.batchDelete${classUppercaseName}(ids);
await onSearch();
done();
} else message($t('deleteBatchTip'), {type: 'warning'});
} else message("批量删除失败", {type: 'warning'});
});
},
});

View File

@ -3,13 +3,12 @@ package com.auth.service.base.controller;
import com.auth.common.model.common.result.PageResult;
import com.auth.common.model.common.result.Result;
import com.auth.common.model.common.result.ResultCodeEnum;
import com.auth.dao.base.entity.DictEntity;
import com.auth.model.base.dto.DictDto;
import com.auth.model.base.vo.DictVo;
import com.auth.dao.base.entity.DictEntity;
import com.auth.service.base.service.DictService;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
@ -34,14 +33,9 @@ public class DictController {
private final DictService dictService;
@Operation(summary = "分页查询系统数据字典", description = "分页查询系统数据字典")
@GetMapping("{page}/{limit}")
public Result<PageResult<DictVo>> getDictPage(
@Parameter(name = "page", description = "当前页", required = true)
@PathVariable("page") Integer page,
@Parameter(name = "limit", description = "每页记录数", required = true)
@PathVariable("limit") Integer limit,
DictDto dto) {
Page<DictEntity> pageParams = new Page<>(page, limit);
@GetMapping()
public Result<PageResult<DictVo>> getDictPage(DictDto dto) {
Page<DictEntity> pageParams = new Page<>(dto.getPageIndex(), dto.getPageSize());
PageResult<DictVo> pageResult = dictService.getDictPage(pageParams, dto);
return Result.success(pageResult);
}