From c1d4eb235e7c96427063af81286c79f467258eb6 Mon Sep 17 00:00:00 2001 From: Bunny <1319900154@qq.com> Date: Sun, 29 Sep 2024 23:46:44 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E4=BF=AE=E6=94=B9):=20=E5=A4=9A=E8=AF=AD?= =?UTF-8?q?=E8=A8=80=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../exception/GlobalExceptionHandler.java | 2 +- .../cn/bunny/dao/dto/i18n/I18nAddDto.java | 29 +++++++++ .../java/cn/bunny/dao/dto/i18n/I18nDto.java | 5 +- .../cn/bunny/dao/dto/i18n/I18nUpdateDto.java | 33 ++++++++++ .../java/cn/bunny/dao/vo/i18n/I18nVo.java | 11 ++-- .../services/controller/I18nController.java | 14 +++-- .../controller/I18nTypeController.java | 9 +-- .../cn/bunny/services/mapper/I18nMapper.java | 7 +++ .../bunny/services/service/I18nService.java | 11 ++-- .../service/impl/I18nServiceImpl.java | 62 +++++++++++++++++-- .../service/impl/I18nTypeServiceImpl.java | 15 ++--- .../src/main/resources/mapper/I18nMapper.xml | 10 +++ 12 files changed, 172 insertions(+), 36 deletions(-) create mode 100644 dao/src/main/java/cn/bunny/dao/dto/i18n/I18nAddDto.java create mode 100644 dao/src/main/java/cn/bunny/dao/dto/i18n/I18nUpdateDto.java diff --git a/common/service-utils/src/main/java/cn/bunny/common/service/exception/GlobalExceptionHandler.java b/common/service-utils/src/main/java/cn/bunny/common/service/exception/GlobalExceptionHandler.java index 63ef585..2fa39fe 100644 --- a/common/service-utils/src/main/java/cn/bunny/common/service/exception/GlobalExceptionHandler.java +++ b/common/service-utils/src/main/java/cn/bunny/common/service/exception/GlobalExceptionHandler.java @@ -52,7 +52,7 @@ public class GlobalExceptionHandler { // 匹配到内容 String patternString = "Request method '(\\w+)' is not supported"; Matcher matcher = Pattern.compile(patternString).matcher(message); - if (matcher.find()) return Result.error(null, 500, "请求方法错误,不是 " + matcher.group(1)); + if (matcher.find()) return Result.error(null, 500, "请求方法错误,不是 " + matcher.group(1) + "类型请求"); // 请求API不存在 String noStaticResource = "No static resource (.*)\\."; diff --git a/dao/src/main/java/cn/bunny/dao/dto/i18n/I18nAddDto.java b/dao/src/main/java/cn/bunny/dao/dto/i18n/I18nAddDto.java new file mode 100644 index 0000000..0e25697 --- /dev/null +++ b/dao/src/main/java/cn/bunny/dao/dto/i18n/I18nAddDto.java @@ -0,0 +1,29 @@ +package cn.bunny.dao.dto.i18n; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +@Schema(name = "I18nAddDto对象", title = "多语言添加", description = "多语言添加") +public class I18nAddDto { + + @Schema(name = "keyName", title = "多语言key") + @NotBlank(message = "多语言key不能为空") + private String keyName; + + @Schema(name = "translation", title = "多语言翻译名称") + @NotBlank(message = "多语言翻译名称不能为空") + private String translation; + + @Schema(name = "typeId", title = "多语言类型id") + private Long typeId; + +} + diff --git a/dao/src/main/java/cn/bunny/dao/dto/i18n/I18nDto.java b/dao/src/main/java/cn/bunny/dao/dto/i18n/I18nDto.java index 4bbea7d..2c932a8 100644 --- a/dao/src/main/java/cn/bunny/dao/dto/i18n/I18nDto.java +++ b/dao/src/main/java/cn/bunny/dao/dto/i18n/I18nDto.java @@ -14,9 +14,10 @@ import lombok.NoArgsConstructor; public class I18nDto { @Schema(name = "keyName", title = "多语言key") - private Integer keyName; + private String keyName; @Schema(name = "translation", title = "多语言翻译名称") private String translation; -} \ No newline at end of file +} + diff --git a/dao/src/main/java/cn/bunny/dao/dto/i18n/I18nUpdateDto.java b/dao/src/main/java/cn/bunny/dao/dto/i18n/I18nUpdateDto.java new file mode 100644 index 0000000..0cfa3ef --- /dev/null +++ b/dao/src/main/java/cn/bunny/dao/dto/i18n/I18nUpdateDto.java @@ -0,0 +1,33 @@ +package cn.bunny.dao.dto.i18n; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +@Schema(name = "I18nUpdateDto对象", title = "多语言更新", description = "多语言更新") +public class I18nUpdateDto { + + @Schema(name = "id", title = "主键") + @NotBlank(message = "id不能为空") + private Long id; + + @Schema(name = "keyName", title = "多语言key") + @NotBlank(message = "多语言key不能为空") + private String keyName; + + @Schema(name = "translation", title = "多语言翻译名称") + @NotBlank(message = "多语言翻译名称不能为空") + private String translation; + + + @Schema(name = "typeId", title = "多语言类型id") + private Long typeId; + +} \ No newline at end of file diff --git a/dao/src/main/java/cn/bunny/dao/vo/i18n/I18nVo.java b/dao/src/main/java/cn/bunny/dao/vo/i18n/I18nVo.java index ecefbde..432bc68 100644 --- a/dao/src/main/java/cn/bunny/dao/vo/i18n/I18nVo.java +++ b/dao/src/main/java/cn/bunny/dao/vo/i18n/I18nVo.java @@ -1,20 +1,19 @@ package cn.bunny.dao.vo.i18n; +import cn.bunny.dao.vo.BaseVo; 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 = "I18nVo对象", title = "多语言返回内容", description = "多语言返回内容") -public class I18nVo { +public class I18nVo extends BaseVo { @Schema(name = "keyName", title = "多语言key") - private Integer keyName; + private String keyName; @Schema(name = "translation", title = "多语言翻译名称") private String translation; diff --git a/service/src/main/java/cn/bunny/services/controller/I18nController.java b/service/src/main/java/cn/bunny/services/controller/I18nController.java index 424b246..dcbb6c1 100644 --- a/service/src/main/java/cn/bunny/services/controller/I18nController.java +++ b/service/src/main/java/cn/bunny/services/controller/I18nController.java @@ -1,6 +1,8 @@ package cn.bunny.services.controller; +import cn.bunny.dao.dto.i18n.I18nAddDto; import cn.bunny.dao.dto.i18n.I18nDto; +import cn.bunny.dao.dto.i18n.I18nUpdateDto; import cn.bunny.dao.entity.system.MenuIcon; import cn.bunny.dao.pojo.result.PageResult; import cn.bunny.dao.pojo.result.Result; @@ -37,8 +39,8 @@ public class I18nController { @Operation(summary = "获取多语言内容", description = "获取多语言内容") @GetMapping("getI18n") - public Mono>>> getI18n() { - Map> vo = i18nService.getI18n(); + public Mono>> getI18n() { + Map vo = i18nService.getI18n(); return Mono.just(Result.success(vo)); } @@ -57,20 +59,20 @@ public class I18nController { @Operation(summary = "添加多语言", description = "添加多语言") @PostMapping("addI18n") - public Mono> addI18n(@Valid @RequestBody I18nDto dto) { + public Mono> addI18n(@Valid @RequestBody I18nAddDto dto) { i18nService.addI18n(dto); return Mono.just(Result.success(ResultCodeEnum.ADD_SUCCESS)); } @Operation(summary = "更新多语言", description = "更新多语言") - @PostMapping("updateI18n") - public Mono> updateI18n(@Valid @RequestBody I18nDto dto) { + @PutMapping("updateI18n") + public Mono> updateI18n(@Valid @RequestBody I18nUpdateDto dto) { i18nService.updateI18n(dto); return Mono.just(Result.success(ResultCodeEnum.UPDATE_SUCCESS)); } @Operation(summary = "删除多语言类型", description = "删除多语言类型") - @PostMapping("deleteI18n") + @DeleteMapping("deleteI18n") public Mono> deleteI18n(@RequestBody List ids) { i18nService.deleteI18n(ids); return Mono.just(Result.success(ResultCodeEnum.DELETE_SUCCESS)); diff --git a/service/src/main/java/cn/bunny/services/controller/I18nTypeController.java b/service/src/main/java/cn/bunny/services/controller/I18nTypeController.java index 0098254..12249eb 100644 --- a/service/src/main/java/cn/bunny/services/controller/I18nTypeController.java +++ b/service/src/main/java/cn/bunny/services/controller/I18nTypeController.java @@ -8,6 +8,7 @@ import cn.bunny.dao.vo.i18n.I18nTypeVo; import cn.bunny.services.service.I18nTypeService; 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; @@ -39,20 +40,20 @@ public class I18nTypeController { @Operation(summary = "添加多语言类型", description = "添加多语言类型") @PostMapping("addI18nType") - public Mono> addI18nType(@RequestBody I18nTypeAddDto dto) { + public Mono> addI18nType(@Valid @RequestBody I18nTypeAddDto dto) { i18nTypeService.addI18nType(dto); return Mono.just(Result.success(ResultCodeEnum.ADD_SUCCESS)); } @Operation(summary = "更新多语言类型", description = "更新多语言类型") - @PostMapping("updateI18nType") - public Mono> updateI18nType(@RequestBody I18nTypeUpdateDto dto) { + @PutMapping("updateI18nType") + public Mono> updateI18nType(@Valid @RequestBody I18nTypeUpdateDto dto) { i18nTypeService.updateI18nType(dto); return Mono.just(Result.success(ResultCodeEnum.UPDATE_SUCCESS)); } @Operation(summary = "删除多语言类型", description = "删除多语言类型") - @PostMapping("deleteI18nType") + @DeleteMapping("deleteI18nType") public Mono> deleteI18nType(@RequestBody List ids) { i18nTypeService.deleteI18nType(ids); return Mono.just(Result.success(ResultCodeEnum.DELETE_SUCCESS)); diff --git a/service/src/main/java/cn/bunny/services/mapper/I18nMapper.java b/service/src/main/java/cn/bunny/services/mapper/I18nMapper.java index 5d48301..fd7b9e6 100644 --- a/service/src/main/java/cn/bunny/services/mapper/I18nMapper.java +++ b/service/src/main/java/cn/bunny/services/mapper/I18nMapper.java @@ -38,4 +38,11 @@ public interface I18nMapper extends BaseMapper { * @return 分页结果 */ IPage selectListByPage(@Param("page") Page pageParams, @Param("dto") I18nDto dto); + + /** + * 物理删除多语言 + * + * @param ids 删除 id 列表 + */ + void deleteBatchIdsWithPhysics(List ids); } diff --git a/service/src/main/java/cn/bunny/services/service/I18nService.java b/service/src/main/java/cn/bunny/services/service/I18nService.java index bc912cb..45df3b8 100644 --- a/service/src/main/java/cn/bunny/services/service/I18nService.java +++ b/service/src/main/java/cn/bunny/services/service/I18nService.java @@ -1,15 +1,18 @@ package cn.bunny.services.service; +import cn.bunny.dao.dto.i18n.I18nAddDto; import cn.bunny.dao.dto.i18n.I18nDto; +import cn.bunny.dao.dto.i18n.I18nUpdateDto; import cn.bunny.dao.entity.i18n.I18n; import cn.bunny.dao.entity.system.MenuIcon; import cn.bunny.dao.pojo.result.PageResult; import cn.bunny.dao.vo.i18n.I18nVo; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; +import jakarta.validation.Valid; +import java.util.HashMap; import java.util.List; -import java.util.Map; /** *

@@ -26,7 +29,7 @@ public interface I18nService extends IService { * * @return 多语言返回内容 */ - Map> getI18n(); + HashMap getI18n(); /** * * 获取管理多语言列表 @@ -40,14 +43,14 @@ public interface I18nService extends IService { * * @param dto 添加表单 */ - void addI18n(I18nDto dto); + void addI18n(@Valid I18nAddDto dto); /** * * 更新多语言 * * @param dto 更新表单 */ - void updateI18n(I18nDto dto); + void updateI18n(@Valid I18nUpdateDto dto); /** * * 删除多语言类型 diff --git a/service/src/main/java/cn/bunny/services/service/impl/I18nServiceImpl.java b/service/src/main/java/cn/bunny/services/service/impl/I18nServiceImpl.java index acde34f..116d0ad 100644 --- a/service/src/main/java/cn/bunny/services/service/impl/I18nServiceImpl.java +++ b/service/src/main/java/cn/bunny/services/service/impl/I18nServiceImpl.java @@ -1,21 +1,33 @@ package cn.bunny.services.service.impl; +import cn.bunny.common.service.exception.BunnyException; +import cn.bunny.dao.dto.i18n.I18nAddDto; import cn.bunny.dao.dto.i18n.I18nDto; +import cn.bunny.dao.dto.i18n.I18nUpdateDto; import cn.bunny.dao.entity.i18n.I18n; +import cn.bunny.dao.entity.i18n.I18nType; import cn.bunny.dao.entity.i18n.I18nWithI18nType; import cn.bunny.dao.entity.system.MenuIcon; import cn.bunny.dao.pojo.result.PageResult; +import cn.bunny.dao.pojo.result.ResultCodeEnum; import cn.bunny.dao.vo.i18n.I18nVo; import cn.bunny.services.mapper.I18nMapper; +import cn.bunny.services.mapper.I18nTypeMapper; import cn.bunny.services.service.I18nService; import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import jakarta.validation.Valid; import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.stream.Collectors; /** @@ -27,18 +39,37 @@ import java.util.stream.Collectors; * @since 2024-09-28 */ @Service +@Transactional public class I18nServiceImpl extends ServiceImpl implements I18nService { + @Autowired + private I18nTypeMapper i18nTypeMapper; + /** * * 获取多语言内容 * * @return 多语言返回内容 */ @Override - public Map> getI18n() { + public HashMap getI18n() { + // 查找默认语言内容 + I18nType i18nType = i18nTypeMapper.selectOne(Wrappers.lambdaQuery().eq(I18nType::getIsDefault, true)); List i18nWithI18nTypes = baseMapper.selectListWithI18nType(); - return i18nWithI18nTypes.stream() - .collect(Collectors.groupingBy(I18nWithI18nType::getTypeName, Collectors.toMap(I18nWithI18nType::getKeyName, I18nWithI18nType::getSummary))); + + // 整理集合 + Map> map = i18nWithI18nTypes.stream() + .collect(Collectors.groupingBy( + I18nWithI18nType::getTypeName, + Collectors.toMap( + I18nWithI18nType::getKeyName, + I18nWithI18nType::getTranslation + ) + )); + + // 返回集合 + HashMap hashMap = new HashMap<>(map); + hashMap.put("local", Objects.requireNonNull(i18nType.getTypeName(), "zh")); + return hashMap; } /** @@ -69,8 +100,18 @@ public class I18nServiceImpl extends ServiceImpl implements I1 * @param dto 添加表单 */ @Override - public void addI18n(I18nDto dto) { + public void addI18n(@Valid I18nAddDto dto) { + String keyName = dto.getKeyName(); + Long typeId = dto.getTypeId(); + // 查询数据是否存在 + List i18nList = list(Wrappers.lambdaQuery().eq(I18n::getKeyName, keyName).eq(I18n::getTypeId, typeId)); + if (!i18nList.isEmpty()) throw new BunnyException(ResultCodeEnum.DATA_EXIST); + + // 保存内容 + I18n i18n = new I18n(); + BeanUtils.copyProperties(dto, i18n); + save(i18n); } /** @@ -79,8 +120,17 @@ public class I18nServiceImpl extends ServiceImpl implements I1 * @param dto 更新表单 */ @Override - public void updateI18n(I18nDto dto) { + public void updateI18n(@Valid I18nUpdateDto dto) { + Long id = dto.getId(); + // 查询数据是否存在 + List i18nList = list(Wrappers.lambdaQuery().eq(I18n::getId, id)); + if (i18nList.isEmpty()) throw new BunnyException(ResultCodeEnum.DATA_NOT_EXIST); + + // 保存内容 + I18n i18n = new I18n(); + BeanUtils.copyProperties(dto, i18n); + updateById(i18n); } /** @@ -90,6 +140,6 @@ public class I18nServiceImpl extends ServiceImpl implements I1 */ @Override public void deleteI18n(List ids) { - + baseMapper.deleteBatchIdsWithPhysics(ids); } } diff --git a/service/src/main/java/cn/bunny/services/service/impl/I18nTypeServiceImpl.java b/service/src/main/java/cn/bunny/services/service/impl/I18nTypeServiceImpl.java index ab17347..2a1d4d9 100644 --- a/service/src/main/java/cn/bunny/services/service/impl/I18nTypeServiceImpl.java +++ b/service/src/main/java/cn/bunny/services/service/impl/I18nTypeServiceImpl.java @@ -8,7 +8,6 @@ import cn.bunny.dao.pojo.result.ResultCodeEnum; import cn.bunny.dao.vo.i18n.I18nTypeVo; import cn.bunny.services.mapper.I18nTypeMapper; import cn.bunny.services.service.I18nTypeService; -import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.beans.BeanUtils; @@ -52,6 +51,7 @@ public class I18nTypeServiceImpl extends ServiceImpl i public void addI18nType(I18nTypeAddDto dto) { String typeName = dto.getTypeName(); Boolean isDefault = dto.getIsDefault(); + I18nType i18nType = new I18nType(); // 查询添加的数据是否之前添加过 List i18nTypeList = list(Wrappers.lambdaQuery().eq(I18nType::getTypeName, typeName)); @@ -59,12 +59,12 @@ public class I18nTypeServiceImpl extends ServiceImpl i // 如果是默认,将其它内容设为false if (isDefault) { - LambdaUpdateWrapper lambdaUpdateWrapper = Wrappers.update().lambda().set(I18nType::getIsDefault, false); - update(null, lambdaUpdateWrapper); + i18nType.setIsDefault(false); + update(i18nType, Wrappers.lambdaUpdate().eq(I18nType::getIsDefault, true)); } // 保存数据 - I18nType i18nType = new I18nType(); + i18nType = new I18nType(); BeanUtils.copyProperties(dto, i18nType); save(i18nType); } @@ -78,6 +78,7 @@ public class I18nTypeServiceImpl extends ServiceImpl i public void updateI18nType(I18nTypeUpdateDto dto) { Long id = dto.getId(); Boolean isDefault = dto.getIsDefault(); + I18nType i18nType = new I18nType(); // 查询更新的内容是否存在 List i18nTypeList = list(Wrappers.lambdaQuery().eq(I18nType::getId, id)); @@ -85,12 +86,12 @@ public class I18nTypeServiceImpl extends ServiceImpl i // 如果是默认,将其它内容设为false if (isDefault) { - LambdaUpdateWrapper lambdaUpdateWrapper = Wrappers.update().lambda().set(I18nType::getIsDefault, false); - update(null, lambdaUpdateWrapper); + i18nType.setIsDefault(false); + update(i18nType, Wrappers.lambdaUpdate().eq(I18nType::getIsDefault, true)); } // 更新内容 - I18nType i18nType = new I18nType(); + i18nType = new I18nType(); BeanUtils.copyProperties(dto, i18nType); updateById(i18nType); } diff --git a/service/src/main/resources/mapper/I18nMapper.xml b/service/src/main/resources/mapper/I18nMapper.xml index c68500d..0ace840 100644 --- a/service/src/main/resources/mapper/I18nMapper.xml +++ b/service/src/main/resources/mapper/I18nMapper.xml @@ -20,6 +20,16 @@ id, key_name, translation, type_id, create_user, update_user, update_time, create_time, is_deleted + + + delete + from sys_i18n + where id in + + #{id} + + +