From 2d3cb2261238f5b283f63b8052672bc43ece749a Mon Sep 17 00:00:00 2001 From: Bunny <1319900154@qq.com> Date: Fri, 4 Jul 2025 14:35:41 +0800 Subject: [PATCH] =?UTF-8?q?:heavy=5Fplus=5Fsign:=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E4=BB=A3=E7=A2=BC=E7=94=9F=E6=88=90=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 +- .../bunny/controller/GeneratorController.java | 14 +- .../template/VmsTBaseTemplateGenerator.java | 16 +- .../cn/bunny/domain/entity/TableMetaData.java | 7 +- .../helper/VmsGeneratorPathHelper.java | 34 ++-- .../service/impl/GeneratorServiceImpl.java | 22 ++- .../src/main/resources/application-prod.yml | 7 + .../static/src/components/AppGeneratorPage.js | 9 + .../static/src/config/axios-config.js | 2 + .../static/src/views/database/DatabaseForm.js | 3 +- .../main/resources/templates/database.html | 33 ++-- .../vms/server/controller/controller.java.vm | 38 ++-- .../vms/server/domain/dto/dto.java.vm | 8 + .../vms/server/domain/entity/entity.java.vm | 20 +- .../resources/vms/server/domain/vo/vo.java.vm | 16 +- .../vms/server/mapper/mapper.java.vm | 7 +- .../mapper/{ => mapper}/resourceMapper.xml.vm | 4 +- .../server/service/impl/serviceImpl.java.vm | 11 +- .../vms/server/service/service.java.vm | 15 +- .../common/domain/vo/result/PageResult.java | 34 ++++ .../mall/common/domain/vo/result/Result.java | 173 ++++++++++++++++++ .../domain/vo/result/ResultCodeEnum.java | 90 +++++++++ 22 files changed, 470 insertions(+), 95 deletions(-) create mode 100644 generator-code-server/src/main/resources/application-prod.yml rename generator-code-server/src/main/resources/vms/server/mapper/{ => mapper}/resourceMapper.xml.vm (87%) create mode 100644 mall-common/src/main/java/com/mall/common/domain/vo/result/PageResult.java create mode 100644 mall-common/src/main/java/com/mall/common/domain/vo/result/Result.java create mode 100644 mall-common/src/main/java/com/mall/common/domain/vo/result/ResultCodeEnum.java diff --git a/.gitignore b/.gitignore index 657310b..a0e2170 100644 --- a/.gitignore +++ b/.gitignore @@ -12,7 +12,7 @@ dist-ssr .eslintcache report.html vite.config.*.timestamp* -application-prod.yml + bunny-web.site.csr bunny-web.site.key bunny-web.site_bundle.crt diff --git a/generator-code-server/src/main/java/cn/bunny/controller/GeneratorController.java b/generator-code-server/src/main/java/cn/bunny/controller/GeneratorController.java index 9db9683..83075ec 100644 --- a/generator-code-server/src/main/java/cn/bunny/controller/GeneratorController.java +++ b/generator-code-server/src/main/java/cn/bunny/controller/GeneratorController.java @@ -30,12 +30,6 @@ public class GeneratorController { private final GeneratorService generatorService; - /** - * 生成代码 - * - * @param dto 生成参数DTO - * @return 生成的代码结果,按表名分组 - */ @Operation(summary = "生成代码", description = "根据SQL或数据库表生成代码") @PostMapping public Result>> generator(@Valid @RequestBody VmsArgumentDto dto) { @@ -48,18 +42,12 @@ public class GeneratorController { return Result.success(result); } - /** - * 打包代码为ZIP下载 - * - * @param dto 生成参数DTO - * @return ZIP文件响应实体 - */ @Operation(summary = "打包下载", description = "将生成的代码打包为ZIP文件下载") @PostMapping("downloadByZip") public ResponseEntity downloadByZip(@Valid @RequestBody VmsArgumentDto dto) { // 判断当前是使用 SQL语句 生成还是 数据库生成 String sql = dto.getSql(); - + return Strings.isEmpty(sql) ? generatorService.downloadByZipByDatabase(dto) : generatorService.downloadByZipBySqL(dto); diff --git a/generator-code-server/src/main/java/cn/bunny/core/template/VmsTBaseTemplateGenerator.java b/generator-code-server/src/main/java/cn/bunny/core/template/VmsTBaseTemplateGenerator.java index a274501..28284d5 100644 --- a/generator-code-server/src/main/java/cn/bunny/core/template/VmsTBaseTemplateGenerator.java +++ b/generator-code-server/src/main/java/cn/bunny/core/template/VmsTBaseTemplateGenerator.java @@ -30,6 +30,16 @@ public class VmsTBaseTemplateGenerator extends AbstractTemplateGenerator { this.dto = dto; this.path = path; this.tableMetaData = tableMetaData; + + // 处理表名称,替换前缀 + String tableName = tableMetaData.getTableName(); + String[] prefixes = dto.getTablePrefixes().split("[,,]"); + for (String prefix : prefixes) { + if (tableName.startsWith(prefix)) { + String handlerTableName = tableName.replace(prefix, ""); + tableMetaData.setCleanTableName(handlerTableName); + } + } } /** @@ -40,7 +50,7 @@ public class VmsTBaseTemplateGenerator extends AbstractTemplateGenerator { @Override public void addContext(VelocityContext context) { // 当前的表名 - String tableName = tableMetaData.getTableName(); + String handlerTableName = tableMetaData.getCleanTableName(); // 表的注释内容 String comment = tableMetaData.getComment(); @@ -61,11 +71,11 @@ public class VmsTBaseTemplateGenerator extends AbstractTemplateGenerator { context.put("package", dto.getPackageName()); // 将类名称转成小驼峰 - String lowerCamelCase = MysqlTypeConvertUtil.convertToCamelCase(tableName, false); + String lowerCamelCase = MysqlTypeConvertUtil.convertToCamelCase(handlerTableName, false); context.put("classLowercaseName", lowerCamelCase); // 将类名称转成大驼峰 - String upperCameCase = MysqlTypeConvertUtil.convertToCamelCase(tableName, true); + String upperCameCase = MysqlTypeConvertUtil.convertToCamelCase(handlerTableName, true); context.put("classUppercaseName", upperCameCase); } diff --git a/generator-code-server/src/main/java/cn/bunny/domain/entity/TableMetaData.java b/generator-code-server/src/main/java/cn/bunny/domain/entity/TableMetaData.java index c571c16..4683f10 100644 --- a/generator-code-server/src/main/java/cn/bunny/domain/entity/TableMetaData.java +++ b/generator-code-server/src/main/java/cn/bunny/domain/entity/TableMetaData.java @@ -6,6 +6,7 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import java.io.Serializable; import java.util.List; @Data @@ -13,11 +14,14 @@ import java.util.List; @AllArgsConstructor @NoArgsConstructor @Schema(name = "TableMetaData", description = "表信息数据") -public class TableMetaData { +public class TableMetaData implements Serializable { @Schema(name = "tableName", description = "表名") private String tableName; + @Schema(name = "handlerTableName", description = "处理后的表名称") + private String cleanTableName; + @Schema(name = "comment", description = "注释内容") private String comment; @@ -33,4 +37,5 @@ public class TableMetaData { @Schema(name = "columns", description = "列名称") private List columns = List.of(); + } \ No newline at end of file diff --git a/generator-code-server/src/main/java/cn/bunny/service/helper/VmsGeneratorPathHelper.java b/generator-code-server/src/main/java/cn/bunny/service/helper/VmsGeneratorPathHelper.java index 4354019..c5f8ce5 100644 --- a/generator-code-server/src/main/java/cn/bunny/service/helper/VmsGeneratorPathHelper.java +++ b/generator-code-server/src/main/java/cn/bunny/service/helper/VmsGeneratorPathHelper.java @@ -1,6 +1,5 @@ package cn.bunny.service.helper; -import cn.bunny.domain.dto.VmsArgumentDto; import cn.bunny.utils.MysqlTypeConvertUtil; import com.google.common.base.CaseFormat; @@ -23,36 +22,25 @@ public class VmsGeneratorPathHelper { /** * 处理模板文件路径和命名 * - * @param dto 生成参数 * @param path 原始模板路径 * @param tableName 数据库表名 * @return 处理后的文件路径 */ - public static String processVmPath(VmsArgumentDto dto, String path, String tableName) { - String className = removeTablePrefixes(dto, tableName); + public static String processVmPath(String path, String tableName) { String lowerCamelCase = MysqlTypeConvertUtil.convertToCamelCase(tableName, false); - String[] pathParts = path.replace("$className", lowerCamelCase).split("/"); - // 处理文件名 - pathParts[pathParts.length - 1] = processFilename( - pathParts[pathParts.length - 1], - className - ); + if (lowerCamelCase != null) { + String[] pathParts = path.replace("$className", lowerCamelCase).split("/"); + // 处理文件名 + pathParts[pathParts.length - 1] = processFilename( + pathParts[pathParts.length - 1], + lowerCamelCase + ); - return String.join("/", pathParts); - } - - /** - * 移除表前缀 - */ - private static String removeTablePrefixes(VmsArgumentDto dto, String tableName) { - String[] prefixes = dto.getTablePrefixes().split("[,,]"); - for (String prefix : prefixes) { - if (tableName.startsWith(prefix)) { - return tableName.substring(prefix.length()); - } + return String.join("/", pathParts); } - return tableName; + + return path; } /** diff --git a/generator-code-server/src/main/java/cn/bunny/service/impl/GeneratorServiceImpl.java b/generator-code-server/src/main/java/cn/bunny/service/impl/GeneratorServiceImpl.java index 2329598..b1ae57b 100644 --- a/generator-code-server/src/main/java/cn/bunny/service/impl/GeneratorServiceImpl.java +++ b/generator-code-server/src/main/java/cn/bunny/service/impl/GeneratorServiceImpl.java @@ -56,10 +56,12 @@ public class GeneratorServiceImpl implements GeneratorService { */ @Override public Map> generateCodeBySql(VmsArgumentDto dto) { + // 根据Sql语句进行分析表的属性和表列字段 String sql = dto.getSql(); TableMetaData tableMeta = sqlMetadataProvider.getTableMetadata(sql); List columns = sqlMetadataProvider.getColumnInfoList(sql); + // 生成代码 List generatorVoList = getGeneratorStream(dto, tableMeta, columns).toList(); Map> map = new HashMap<>(); @@ -68,11 +70,23 @@ public class GeneratorServiceImpl implements GeneratorService { return map; } + /** + * 根据数据库进行生成 + * + * @param dto 生成参数 + * @return 生成的ZIP文件 + */ @Override public ResponseEntity downloadByZipByDatabase(VmsArgumentDto dto) { return downloadByZip(dto, this::generateCodeByDatabase); } + /** + * 根据Sql语句及逆行生成 + * + * @param dto 生成参数 + * @return 生成的ZIP文件 + */ @Override public ResponseEntity downloadByZipBySqL(VmsArgumentDto dto) { return downloadByZip(dto, this::generateCodeBySql); @@ -117,16 +131,22 @@ public class GeneratorServiceImpl implements GeneratorService { * @return 生成器流 */ public Stream getGeneratorStream(VmsArgumentDto dto, TableMetaData tableMeta, List columns) { + // 因为这里使用到了并行流,对 tableMeta 操作正常是会拿到修改后的值,但是在并行流会有线程安全问题,所以直接要手动实现深拷贝 + return dto.getPath().parallelStream().map(path -> { + // 创建生成模板 VmsTBaseTemplateGenerator generator = new VmsTBaseTemplateGenerator(dto, path, tableMeta); + + // 生成好的模板 String code = generator.generateCode(tableMeta, columns).toString(); + String processVmPath = VmsGeneratorPathHelper.processVmPath(path, tableMeta.getCleanTableName()); return GeneratorVo.builder() .id(UUID.randomUUID().toString()) .code(code) .comment(tableMeta.getComment()) .tableName(tableMeta.getTableName()) - .path(VmsGeneratorPathHelper.processVmPath(dto, path, tableMeta.getTableName())) + .path(processVmPath) .build(); }); } diff --git a/generator-code-server/src/main/resources/application-prod.yml b/generator-code-server/src/main/resources/application-prod.yml new file mode 100644 index 0000000..53196f1 --- /dev/null +++ b/generator-code-server/src/main/resources/application-prod.yml @@ -0,0 +1,7 @@ +bunny: + master: + host: rm-bp12z6hlv46vi6g8mro.mysql.rds.aliyuncs.com + port: 3306 + database: gulimall_pms + username: gulimall + password: "0212Gulimall" diff --git a/generator-code-server/src/main/resources/static/src/components/AppGeneratorPage.js b/generator-code-server/src/main/resources/static/src/components/AppGeneratorPage.js index b4304a9..b5a79b5 100644 --- a/generator-code-server/src/main/resources/static/src/components/AppGeneratorPage.js +++ b/generator-code-server/src/main/resources/static/src/components/AppGeneratorPage.js @@ -95,6 +95,8 @@ const AppGeneratorPage = defineComponent({ * 几秒后恢复原状 */ async onCopyToClipboard(code) { + this.copied = true; + try { await navigator.clipboard.writeText(code); antd.notification.open({ @@ -119,6 +121,13 @@ const AppGeneratorPage = defineComponent({ document.execCommand('copy'); document.body.removeChild(textarea); } + + // 显示已复制图标时长 + if (this.copied) { + setTimeout(() => { + this.copied = false; + }, 2000) + } }, /* 下载全部文件 */ diff --git a/generator-code-server/src/main/resources/static/src/config/axios-config.js b/generator-code-server/src/main/resources/static/src/config/axios-config.js index bf994d6..6234e1a 100644 --- a/generator-code-server/src/main/resources/static/src/config/axios-config.js +++ b/generator-code-server/src/main/resources/static/src/config/axios-config.js @@ -34,6 +34,8 @@ axiosInstance.interceptors.response.use( } else { antd.message.error(message || '系统出错'); } + + return error.response.data; } return Promise.reject(error.message); } diff --git a/generator-code-server/src/main/resources/static/src/views/database/DatabaseForm.js b/generator-code-server/src/main/resources/static/src/views/database/DatabaseForm.js index 7749112..fd84bb1 100644 --- a/generator-code-server/src/main/resources/static/src/views/database/DatabaseForm.js +++ b/generator-code-server/src/main/resources/static/src/views/database/DatabaseForm.js @@ -288,11 +288,12 @@ const DatabaseForm = { async onDownloadZip() { this.downloadLoading = true; try { + // 重要:指定响应类型为blob const response = await axiosInstance({ url: "/generator/downloadByZip", method: "POST", data: this.form, - responseType: 'blob' // 重要:指定响应类型为blob + responseType: 'blob' }); // 从响应头中获取文件名 diff --git a/generator-code-server/src/main/resources/templates/database.html b/generator-code-server/src/main/resources/templates/database.html index 0d12bb3..240ad21 100644 --- a/generator-code-server/src/main/resources/templates/database.html +++ b/generator-code-server/src/main/resources/templates/database.html @@ -169,21 +169,32 @@ }, watch: { /* 数据表选择 */ - dbSelect: { - handler() { - this.getDatabaseTableList(); - } - }, + dbSelect: "getDatabaseTableList", /* 过滤数据表 */ - tableSelect: { - handler(val) { - this.tableList = this.rawTableList; - // 根据表名进行过滤筛选或者根据注释内容进行筛选 - this.tableList = this.tableList.filter(table => table.tableName.includes(val) || table.comment.includes(val)); - } + tableSelect(val) { + this.tableList = this.rawTableList; + // 根据表名进行过滤筛选或者根据注释内容进行筛选 + this.tableList = this.tableList.filter(table => table.tableName.includes(val) || table.comment.includes(val)); }, + + /** + * 监听form表单放到 localStorage + * 不要使用 immediate 否则初始话加载的时候会将 localStorage 改成 原始表单 + */ + form: { + deep: true, + handler(val) { + localStorage.setItem("form", JSON.stringify(val)); + }, + } }, + mounted() { + const form = localStorage.getItem("form"); + if (form !== null) { + this.form = JSON.parse(form); + } + } }); // 注册组件 diff --git a/generator-code-server/src/main/resources/vms/server/controller/controller.java.vm b/generator-code-server/src/main/resources/vms/server/controller/controller.java.vm index 0824fe6..8db4846 100644 --- a/generator-code-server/src/main/resources/vms/server/controller/controller.java.vm +++ b/generator-code-server/src/main/resources/vms/server/controller/controller.java.vm @@ -1,15 +1,17 @@ package ${package}.controller; -import cn.bunny.domain.pojo.result.Result; -import cn.bunny.domain.pojo.result.ResultCodeEnum; +import ${package}.domain.dto.${classUppercaseName}Dto; +import ${package}.domain.entity.${classUppercaseName}; +import ${package}.domain.vo.${classUppercaseName}Vo; +import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; -import reactor.core.publisher.Mono; -import cn.bunny.domain.pojo.result.PageResult; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; +import ${package}.service.${classUppercaseName}Service; import java.util.List; @@ -21,42 +23,42 @@ import java.util.List; * @author ${author} * @since ${date} */ -@Tag(name = "${comment}" , description = "${comment}相关接口" ) +@Tag(name = "${comment}", description = "${comment}相关接口") @RestController -@RequestMapping("${requestMapping}/${classLowercaseName}" ) +@RequestMapping("${requestMapping}/${classLowercaseName}") +@RequiredArgsConstructor public class ${classUppercaseName}Controller { - @Resource - private ${classUppercaseName}Service ${classLowercaseName}Service; + private final ${classUppercaseName}Service ${classLowercaseName}Service; - @Operation(summary = "分页查询${comment}" , description = "分页${comment}" ) - @GetMapping("{page}/{limit}" ) + @Operation(summary = "分页查询${comment}", description = "分页${comment}") + @GetMapping("{page}/{limit}") public Result> get${classUppercaseName}Page( - @Parameter(name = "page" , description = "当前页" , required = true) - @PathVariable("page" ) Integer page, - @Parameter(name = "limit" , description = "每页记录数" , required = true) - @PathVariable("limit" ) Integer limit, + @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}> pageParams = new Page<>(page, limit); PageResult<${classUppercaseName}Vo> pageResult = ${classLowercaseName}Service.get${classUppercaseName}Page(pageParams, dto); return Result.success(pageResult); } - @Operation(summary = "添加${comment}" , description = "添加${comment}" ) + @Operation(summary = "添加${comment}", description = "添加${comment}") @PostMapping() - public Result add${classUppercaseName}(@Valid @RequestBody ${classUppercaseName}to dto) { + public Result add${classUppercaseName}(@Valid @RequestBody ${classUppercaseName}Dto dto) { ${classLowercaseName}Service.add${classUppercaseName}(dto); return Result.success(ResultCodeEnum.ADD_SUCCESS); } - @Operation(summary = "更新${comment}" , description = "更新${comment}" ) + @Operation(summary = "更新${comment}", description = "更新${comment}") @PutMapping() public Result update${classUppercaseName}(@Valid @RequestBody ${classUppercaseName}Dto dto) { ${classLowercaseName}Service.update${classUppercaseName}(dto); return Result.success(ResultCodeEnum.UPDATE_SUCCESS); } - @Operation(summary = "删除${comment}" , description = "删除${comment}" ) + @Operation(summary = "删除${comment}", description = "删除${comment}") @DeleteMapping() public Result delete${classUppercaseName}(@RequestBody List ids) { ${classLowercaseName}Service.delete${classUppercaseName}(ids); diff --git a/generator-code-server/src/main/resources/vms/server/domain/dto/dto.java.vm b/generator-code-server/src/main/resources/vms/server/domain/dto/dto.java.vm index 49a3f5e..4de4590 100644 --- a/generator-code-server/src/main/resources/vms/server/domain/dto/dto.java.vm +++ b/generator-code-server/src/main/resources/vms/server/domain/dto/dto.java.vm @@ -1,3 +1,11 @@ +package ${package}.domain.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + @Data @AllArgsConstructor @NoArgsConstructor diff --git a/generator-code-server/src/main/resources/vms/server/domain/entity/entity.java.vm b/generator-code-server/src/main/resources/vms/server/domain/entity/entity.java.vm index 4c09e14..cf229a2 100644 --- a/generator-code-server/src/main/resources/vms/server/domain/entity/entity.java.vm +++ b/generator-code-server/src/main/resources/vms/server/domain/entity/entity.java.vm @@ -1,14 +1,22 @@ -@EqualsAndHashCode(callSuper = true) +package ${package}.domain.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Setter; +import lombok.experimental.Accessors; + @Getter @Setter @Accessors(chain = true) @TableName("${tableName}") @Schema(name = "${classUppercaseName}对象", title = "${comment}", description = "${comment}的实体类对象") -public class ${classUppercaseName} extends BaseEntity { +public class ${classUppercaseName} { - #foreach($field in ${columnInfoList}) - @Schema(name = "${field.lowercaseName}", title = "${field.comment}") - private ${field.javaType} ${field.lowercaseName}; +#foreach($field in ${columnInfoList}) +@Schema(name = "${field.lowercaseName}", title = "${field.comment}") +private ${field.javaType} ${field.lowercaseName}; - #end +#end } \ No newline at end of file diff --git a/generator-code-server/src/main/resources/vms/server/domain/vo/vo.java.vm b/generator-code-server/src/main/resources/vms/server/domain/vo/vo.java.vm index 2a13624..fc1d185 100644 --- a/generator-code-server/src/main/resources/vms/server/domain/vo/vo.java.vm +++ b/generator-code-server/src/main/resources/vms/server/domain/vo/vo.java.vm @@ -1,13 +1,21 @@ +package ${package}.domain.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + @Data @AllArgsConstructor @NoArgsConstructor @Schema(name = "${classUppercaseName}VO对象", title = "${comment}", description = "${comment}的VO对象") public class ${classUppercaseName}Vo { - #foreach($field in ${columnInfoList}) - @Schema(name = "${field.lowercaseName}", title = "${field.comment}") - private ${field.javaType} ${field.lowercaseName}; +#foreach($field in ${columnInfoList}) + @Schema(name = "${field.lowercaseName}", title = "${field.comment}") + private ${field.javaType} ${field.lowercaseName}; - #end +#end } diff --git a/generator-code-server/src/main/resources/vms/server/mapper/mapper.java.vm b/generator-code-server/src/main/resources/vms/server/mapper/mapper.java.vm index 72ac003..5ef9e61 100644 --- a/generator-code-server/src/main/resources/vms/server/mapper/mapper.java.vm +++ b/generator-code-server/src/main/resources/vms/server/mapper/mapper.java.vm @@ -4,6 +4,11 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import org.apache.ibatis.annotations.Param; +import ${package}.domain.dto.${classUppercaseName}Dto; +import ${package}.domain.entity.${classUppercaseName}; +import ${package}.domain.vo.${classUppercaseName}Vo; +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.apache.ibatis.annotations.Param; import java.util.List; @@ -25,6 +30,6 @@ public interface ${classUppercaseName}Mapper extends BaseMapper<${classUppercase * @param dto ${comment}查询表单 * @return ${comment}分页结果 */ - IPage<${classUppercaseName}Vo> selectListByPage(@Param("page" ) Page<${classUppercaseName}> pageParams, @Param("dto" ) ${classUppercaseName}Dto dto); + IPage<${classUppercaseName}Vo> selectListByPage(@Param("page") Page<${classUppercaseName}> pageParams, @Param("dto") ${classUppercaseName}Dto dto); } diff --git a/generator-code-server/src/main/resources/vms/server/mapper/resourceMapper.xml.vm b/generator-code-server/src/main/resources/vms/server/mapper/mapper/resourceMapper.xml.vm similarity index 87% rename from generator-code-server/src/main/resources/vms/server/mapper/resourceMapper.xml.vm rename to generator-code-server/src/main/resources/vms/server/mapper/mapper/resourceMapper.xml.vm index 6f9fef6..0471987 100644 --- a/generator-code-server/src/main/resources/vms/server/mapper/resourceMapper.xml.vm +++ b/generator-code-server/src/main/resources/vms/server/mapper/mapper/resourceMapper.xml.vm @@ -3,7 +3,7 @@ - + #foreach($field in ${columnInfoList}) #end @@ -15,7 +15,7 @@ - select base.*, create_user.username as create_username, diff --git a/generator-code-server/src/main/resources/vms/server/service/impl/serviceImpl.java.vm b/generator-code-server/src/main/resources/vms/server/service/impl/serviceImpl.java.vm index 19cdbe2..ae1d9a3 100644 --- a/generator-code-server/src/main/resources/vms/server/service/impl/serviceImpl.java.vm +++ b/generator-code-server/src/main/resources/vms/server/service/impl/serviceImpl.java.vm @@ -1,6 +1,5 @@ package ${package}.service.impl; -import cn.bunny.domain.pojo.result.PageResult; import ${package}.mapper.${classUppercaseName}Mapper; import ${package}.service.${classUppercaseName}Service; import com.baomidou.mybatisplus.core.metadata.IPage; @@ -8,6 +7,11 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import ${package}.service.${classUppercaseName}Service; +import ${package}.domain.dto.${classUppercaseName}Dto; +import ${package}.domain.entity.${classUppercaseName}; +import ${package}.domain.vo.${classUppercaseName}Vo; import java.util.List; @@ -20,6 +24,7 @@ import java.util.List; * @since ${date} */ @Service +@Transactional public class ${classUppercaseName}ServiceImpl extends ServiceImpl<${classUppercaseName}Mapper, ${classUppercaseName}> implements ${classUppercaseName}Service { /** @@ -47,7 +52,7 @@ public class ${classUppercaseName}ServiceImpl extends ServiceImpl<${classUpperca * @param dto ${comment}添加 */ @Override - public void add${classUppercaseName}(@Valid ${classUppercaseName}AddDto dto) { + public void add${classUppercaseName}(${classUppercaseName}Dto dto) { ${classUppercaseName} ${classLowercaseName} =new ${classUppercaseName}(); BeanUtils.copyProperties(dto, ${classLowercaseName}); save(${classLowercaseName}); @@ -59,7 +64,7 @@ public class ${classUppercaseName}ServiceImpl extends ServiceImpl<${classUpperca * @param dto ${comment}更新 */ @Override - public void update${classUppercaseName}(@Valid ${classUppercaseName}UpdateDto dto) { + public void update${classUppercaseName}(${classUppercaseName}Dto dto) { ${classUppercaseName} ${classLowercaseName} =new ${classUppercaseName}(); BeanUtils.copyProperties(dto, ${classLowercaseName}); updateById(${classLowercaseName}); diff --git a/generator-code-server/src/main/resources/vms/server/service/service.java.vm b/generator-code-server/src/main/resources/vms/server/service/service.java.vm index 4607111..84a3999 100644 --- a/generator-code-server/src/main/resources/vms/server/service/service.java.vm +++ b/generator-code-server/src/main/resources/vms/server/service/service.java.vm @@ -1,10 +1,11 @@ package ${package}.service; -import cn.bunny.domain.entity.system.MenuIcon; -import cn.bunny.domain.pojo.result.PageResult; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; -import jakarta.validation.Valid; +import ${package}.domain.dto.${classUppercaseName}Dto; +import ${package}.domain.entity.${classUppercaseName}; +import ${package}.domain.vo.${classUppercaseName}Vo; import java.util.List; @@ -28,16 +29,16 @@ public interface ${classUppercaseName}Service extends IService<${classUppercaseN /** * 添加${comment} * - * @param dto 添加表单 + * @param dto {@link ${classUppercaseName}Dto} 添加表单 */ - void add${classUppercaseName}(${classUppercaseName}AddDto dto); + void add${classUppercaseName}(${classUppercaseName}Dto dto); /** * 更新${comment} * - * @param dto {@link ${classUppercaseName}UpdateDto} + * @param dto {@link ${classUppercaseName}Dto} 更新表单 */ - void update${classUppercaseName}(${classUppercaseName}UpdateDto dto); + void update${classUppercaseName}(${classUppercaseName}Dto dto); /** * 删除|批量删除${comment}类型 diff --git a/mall-common/src/main/java/com/mall/common/domain/vo/result/PageResult.java b/mall-common/src/main/java/com/mall/common/domain/vo/result/PageResult.java new file mode 100644 index 0000000..18fbcd3 --- /dev/null +++ b/mall-common/src/main/java/com/mall/common/domain/vo/result/PageResult.java @@ -0,0 +1,34 @@ +package com.mall.common.domain.vo.result; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.List; + +/** + * 封装分页查询结果 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +@Schema(name = "PageResult 对象", title = "分页返回结果", description = "分页返回结果") +public class PageResult implements Serializable { + + @Schema(name = "pageNo", title = "当前页") + private Long pageNo; + + @Schema(name = "pageSize", title = "每页记录数") + private Long pageSize; + + @Schema(name = "total", title = "总记录数") + private Long total; + + @Schema(name = "list", title = "当前页数据集合") + private List list; + +} \ No newline at end of file diff --git a/mall-common/src/main/java/com/mall/common/domain/vo/result/Result.java b/mall-common/src/main/java/com/mall/common/domain/vo/result/Result.java new file mode 100644 index 0000000..b41e0ee --- /dev/null +++ b/mall-common/src/main/java/com/mall/common/domain/vo/result/Result.java @@ -0,0 +1,173 @@ +package com.mall.common.domain.vo.result; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class Result { + // 状态码 + private Integer code; + // 返回消息 + private String message; + // 返回数据 + private T data; + + /** + * * 自定义返回体 + * + * @param data 返回体 + * @return Result + */ + protected static Result build(T data) { + Result result = new Result<>(); + result.setData(data); + return result; + } + + /** + * * 自定义返回体,使用ResultCodeEnum构建 + * + * @param body 返回体 + * @param codeEnum 返回状态码 + * @return Result + */ + public static Result build(T body, ResultCodeEnum codeEnum) { + Result result = build(body); + result.setCode(codeEnum.getCode()); + result.setMessage(codeEnum.getMessage()); + return result; + } + + /** + * * 自定义返回体 + * + * @param body 返回体 + * @param code 返回状态码 + * @param message 返回消息 + * @return Result + */ + public static Result build(T body, Integer code, String message) { + Result result = build(body); + result.setCode(code); + result.setMessage(message); + result.setData(null); + return result; + } + + /** + * * 操作成功 + * + * @return Result + */ + public static Result success() { + return success(null, ResultCodeEnum.SUCCESS); + } + + /** + * * 操作成功 + * + * @param data baseCategory1List + */ + public static Result success(T data) { + return build(data, ResultCodeEnum.SUCCESS); + } + + /** + * * 操作成功-状态码 + * + * @param codeEnum 状态码 + */ + public static Result success(ResultCodeEnum codeEnum) { + return success(null, codeEnum); + } + + /** + * * 操作成功-自定义返回数据和状态码 + * + * @param data 返回体 + * @param codeEnum 状态码 + */ + public static Result success(T data, ResultCodeEnum codeEnum) { + return build(data, codeEnum); + } + + /** + * * 操作失败-自定义返回数据和状态码 + * + * @param data 返回体 + * @param message 错误信息 + */ + public static Result success(T data, String message) { + return build(data, 200, message); + } + + /** + * * 操作失败-自定义返回数据和状态码 + * + * @param data 返回体 + * @param code 状态码 + * @param message 错误信息 + */ + public static Result success(T data, Integer code, String message) { + return build(data, code, message); + } + + /** + * * 操作失败 + */ + public static Result error() { + return Result.build(null); + } + + /** + * * 操作失败-自定义返回数据 + * + * @param data 返回体 + */ + public static Result error(T data) { + return build(data, ResultCodeEnum.FAIL); + } + + /** + * * 操作失败-状态码 + * + * @param codeEnum 状态码 + */ + public static Result error(ResultCodeEnum codeEnum) { + return build(null, codeEnum); + } + + /** + * * 操作失败-自定义返回数据和状态码 + * + * @param data 返回体 + * @param codeEnum 状态码 + */ + public static Result error(T data, ResultCodeEnum codeEnum) { + return build(data, codeEnum); + } + + /** + * * 操作失败-自定义返回数据和状态码 + * + * @param data 返回体 + * @param code 状态码 + * @param message 错误信息 + */ + public static Result error(T data, Integer code, String message) { + return build(data, code, message); + } + + /** + * * 操作失败-自定义返回数据和状态码 + * + * @param data 返回体 + * @param message 错误信息 + */ + public static Result error(T data, String message) { + return build(null, 500, message); + } +} diff --git a/mall-common/src/main/java/com/mall/common/domain/vo/result/ResultCodeEnum.java b/mall-common/src/main/java/com/mall/common/domain/vo/result/ResultCodeEnum.java new file mode 100644 index 0000000..78c3153 --- /dev/null +++ b/mall-common/src/main/java/com/mall/common/domain/vo/result/ResultCodeEnum.java @@ -0,0 +1,90 @@ +package com.mall.common.domain.vo.result; + +import lombok.Getter; + +/** + * 统一返回结果状态信息类 + */ +@Getter +public enum ResultCodeEnum { + // 成功操作 200 + SUCCESS(200, "操作成功"), + LOAD_FINISHED(200, "加载完成"), + ADD_SUCCESS(200, "添加成功"), + UPDATE_SUCCESS(200, "修改成功"), + DELETE_SUCCESS(200, "删除成功"), + SORT_SUCCESS(200, "排序成功"), + SUCCESS_UPLOAD(200, "上传成功"), + SUCCESS_LOGOUT(200, "退出成功"), + EMAIL_CODE_REFRESH(200, "邮箱验证码已刷新"), + EMAIL_CODE_SEND_SUCCESS(200, "邮箱验证码已发送"), + + // 验证错误 201 + USERNAME_OR_PASSWORD_NOT_EMPTY(201, "用户名或密码不能为空"), + EMAIL_CODE_NOT_EMPTY(201, "邮箱验证码不能为空"), + SEND_EMAIL_CODE_NOT_EMPTY(201, "请先发送邮箱验证码"), + EMAIL_CODE_NOT_MATCHING(201, "邮箱验证码不匹配"), + LOGIN_ERROR(500, "账号或密码错误"), + LOGIN_ERROR_USERNAME_PASSWORD_NOT_EMPTY(201, "登录信息不能为空"), + GET_BUCKET_EXCEPTION(201, "获取文件信息失败"), + SEND_MAIL_CODE_ERROR(201, "邮件发送失败"), + EMAIL_CODE_EMPTY(201, "邮箱验证码过期或不存在"), + EMAIL_EXIST(201, "邮箱已存在"), + REQUEST_IS_EMPTY(201, "请求数据为空"), + DATA_TOO_LARGE(201, "请求数据为空"), + UPDATE_NEW_PASSWORD_SAME_AS_OLD_PASSWORD(201, "新密码与密码相同"), + + // 数据相关 206 + ILLEGAL_REQUEST(206, "非法请求"), + REPEAT_SUBMIT(206, "重复提交"), + DATA_ERROR(206, "数据异常"), + EMAIL_USER_TEMPLATE_IS_EMPTY(206, "邮件模板为空"), + EMAIL_TEMPLATE_IS_EMPTY(206, "邮件模板为空"), + EMAIL_USER_IS_EMPTY(206, "关联邮件用户配置为空"), + DATA_EXIST(206, "数据已存在"), + DATA_NOT_EXIST(206, "数据不存在"), + ALREADY_USER_EXCEPTION(206, "用户已存在"), + USER_IS_EMPTY(206, "用户不存在"), + FILE_NOT_EXIST(206, "文件不存在"), + NEW_PASSWORD_SAME_OLD_PASSWORD(206, "新密码不能和旧密码相同"), + MISSING_TEMPLATE_FILES(206, "缺少模板文件"), + + // 身份过期 208 + LOGIN_AUTH(208, "请先登陆"), + AUTHENTICATION_EXPIRED(208, "身份验证过期"), + SESSION_EXPIRATION(208, "会话过期"), + + // 209 + THE_SAME_USER_HAS_LOGGED_IN(209, "相同用户已登录"), + + // 提示错误 + UPDATE_ERROR(216, "修改失败"), + URL_ENCODE_ERROR(216, "URL编码失败"), + ILLEGAL_CALLBACK_REQUEST_ERROR(217, "非法回调请求"), + FETCH_USERINFO_ERROR(219, "获取用户信息失败"), + ILLEGAL_DATA_REQUEST(219, "非法数据请求"), + CLASS_NOT_FOUND(219, "类名不存在"), + ADMIN_ROLE_CAN_NOT_DELETED(219, "无法删除admin角色"), + ROUTER_RANK_NEED_LARGER_THAN_THE_PARENT(219, "设置路由等级需要大于或等于父级的路由等级"), + + // 无权访问 403 + FAIL_NO_ACCESS_DENIED(403, "无权访问"), + FAIL_NO_ACCESS_DENIED_USER_OFFLINE(403, "用户强制下线"), + TOKEN_PARSING_FAILED(403, "token解析失败"), + FAIL_NO_ACCESS_DENIED_USER_LOCKED(403, "该账户已封禁"), + + // 系统错误 500 + UNKNOWN_EXCEPTION(500, "服务异常"), + SERVICE_ERROR(500, "服务异常"), + UPLOAD_ERROR(500, "上传失败"), + FAIL(500, "失败"), + ; + + private final Integer code; + private final String message; + + ResultCodeEnum(Integer code, String message) { + this.code = code; + this.message = message; + } +} \ No newline at end of file