diff --git a/service/src/main/java/cn/bunny/services/controller/configuration/I18nController.java b/service/src/main/java/cn/bunny/services/controller/configuration/I18nController.java index 2af3159..fb66fab 100644 --- a/service/src/main/java/cn/bunny/services/controller/configuration/I18nController.java +++ b/service/src/main/java/cn/bunny/services/controller/configuration/I18nController.java @@ -15,6 +15,7 @@ import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import reactor.core.publisher.Mono; @@ -46,7 +47,7 @@ public class I18nController { @Operation(summary = "获取管理多语言列", description = "获取管理多语言列") @GetMapping("getI18nList/{page}/{limit}") - public Mono>> getI18nList( + public Result> getI18nList( @Parameter(name = "page", description = "当前页", required = true) @PathVariable("page") Integer page, @Parameter(name = "limit", description = "每页记录数", required = true) @@ -54,27 +55,33 @@ public class I18nController { I18nDto dto) { Page pageParams = new Page<>(page, limit); PageResult vo = i18nService.getI18nList(pageParams, dto); - return Mono.just(Result.success(vo)); + return Result.success(vo); + } + + @Operation(summary = "下载多语言配置", description = "下载多语言配置") + @GetMapping("downloadI18n") + public ResponseEntity downloadI18n() { + return i18nService.downloadI18n(); } @Operation(summary = "添加多语言", description = "添加多语言") @PostMapping("addI18n") - public Mono> addI18n(@Valid @RequestBody I18nAddDto dto) { + public Result addI18n(@Valid @RequestBody I18nAddDto dto) { i18nService.addI18n(dto); - return Mono.just(Result.success(ResultCodeEnum.ADD_SUCCESS)); + return Result.success(ResultCodeEnum.ADD_SUCCESS); } @Operation(summary = "更新多语言", description = "更新多语言") @PutMapping("updateI18n") - public Mono> updateI18n(@Valid @RequestBody I18nUpdateDto dto) { + public Result updateI18n(@Valid @RequestBody I18nUpdateDto dto) { i18nService.updateI18n(dto); - return Mono.just(Result.success(ResultCodeEnum.UPDATE_SUCCESS)); + return Result.success(ResultCodeEnum.UPDATE_SUCCESS); } @Operation(summary = "删除多语言", description = "删除多语言") @DeleteMapping("deleteI18n") - public Mono> deleteI18n(@RequestBody List ids) { + public Result deleteI18n(@RequestBody List ids) { i18nService.deleteI18n(ids); - return Mono.just(Result.success(ResultCodeEnum.DELETE_SUCCESS)); + return Result.success(ResultCodeEnum.DELETE_SUCCESS); } } diff --git a/service/src/main/java/cn/bunny/services/controller/configuration/I18nTypeController.java b/service/src/main/java/cn/bunny/services/controller/configuration/I18nTypeController.java index 0e2a000..b7e4061 100644 --- a/service/src/main/java/cn/bunny/services/controller/configuration/I18nTypeController.java +++ b/service/src/main/java/cn/bunny/services/controller/configuration/I18nTypeController.java @@ -12,7 +12,6 @@ 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 java.util.List; @@ -34,29 +33,29 @@ public class I18nTypeController { @Operation(summary = "获取多语言类型", description = "获取多语言类型") @GetMapping("/noAuth/getI18nTypeList") - public Mono>> getI18nTypeList(I18nTypeDto dto) { + public Result> getI18nTypeList(I18nTypeDto dto) { List voList = i18nTypeService.getI18nTypeList(dto); - return Mono.just(Result.success(voList)); + return Result.success(voList); } @Operation(summary = "添加多语言类型", description = "添加多语言类型") @PostMapping("addI18nType") - public Mono> addI18nType(@Valid @RequestBody I18nTypeAddDto dto) { + public Result addI18nType(@Valid @RequestBody I18nTypeAddDto dto) { i18nTypeService.addI18nType(dto); - return Mono.just(Result.success(ResultCodeEnum.ADD_SUCCESS)); + return Result.success(ResultCodeEnum.ADD_SUCCESS); } @Operation(summary = "更新多语言类型", description = "更新多语言类型") @PutMapping("updateI18nType") - public Mono> updateI18nType(@Valid @RequestBody I18nTypeUpdateDto dto) { + public Result updateI18nType(@Valid @RequestBody I18nTypeUpdateDto dto) { i18nTypeService.updateI18nType(dto); - return Mono.just(Result.success(ResultCodeEnum.UPDATE_SUCCESS)); + return Result.success(ResultCodeEnum.UPDATE_SUCCESS); } @Operation(summary = "删除多语言类型", description = "删除多语言类型") @DeleteMapping("deleteI18nType") - public Mono> deleteI18nType(@RequestBody List ids) { + public Result deleteI18nType(@RequestBody List ids) { i18nTypeService.deleteI18nType(ids); - return Mono.just(Result.success(ResultCodeEnum.DELETE_SUCCESS)); + return Result.success(ResultCodeEnum.DELETE_SUCCESS); } } diff --git a/service/src/main/java/cn/bunny/services/service/configuration/I18nService.java b/service/src/main/java/cn/bunny/services/service/configuration/I18nService.java index 6ae7bed..df4e418 100644 --- a/service/src/main/java/cn/bunny/services/service/configuration/I18nService.java +++ b/service/src/main/java/cn/bunny/services/service/configuration/I18nService.java @@ -9,6 +9,7 @@ import cn.bunny.dao.vo.result.PageResult; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import jakarta.validation.Valid; +import org.springframework.http.ResponseEntity; import java.util.HashMap; import java.util.List; @@ -57,4 +58,11 @@ public interface I18nService extends IService { * @param ids 删除id列表 */ void deleteI18n(List ids); -} + + /** + * 下载多语言配置 + * + * @return 文件内容 + */ + ResponseEntity downloadI18n(); +} \ No newline at end of file diff --git a/service/src/main/java/cn/bunny/services/service/configuration/impl/I18nServiceImpl.java b/service/src/main/java/cn/bunny/services/service/configuration/impl/I18nServiceImpl.java index ef51a16..660438a 100644 --- a/service/src/main/java/cn/bunny/services/service/configuration/impl/I18nServiceImpl.java +++ b/service/src/main/java/cn/bunny/services/service/configuration/impl/I18nServiceImpl.java @@ -12,23 +12,31 @@ import cn.bunny.services.exception.AuthCustomerException; import cn.bunny.services.mapper.configuration.I18nMapper; import cn.bunny.services.mapper.configuration.I18nTypeMapper; import cn.bunny.services.service.configuration.I18nService; +import cn.bunny.services.utils.system.I18nUtil; +import com.alibaba.fastjson2.JSON; 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.cache.annotation.CacheEvict; import org.springframework.cache.annotation.Cacheable; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.nio.charset.StandardCharsets; import java.util.HashMap; import java.util.List; -import java.util.Map; import java.util.Objects; -import java.util.stream.Collectors; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; /** *

@@ -42,8 +50,11 @@ import java.util.stream.Collectors; @Transactional public class I18nServiceImpl extends ServiceImpl implements I18nService { - @Autowired - private I18nTypeMapper i18nTypeMapper; + private final I18nTypeMapper i18nTypeMapper; + + public I18nServiceImpl(I18nTypeMapper i18nTypeMapper) { + this.i18nTypeMapper = i18nTypeMapper; + } /** * * 获取多语言内容 @@ -57,18 +68,13 @@ public class I18nServiceImpl extends ServiceImpl implements I1 I18nType i18nType = i18nTypeMapper.selectOne(Wrappers.lambdaQuery().eq(I18nType::getIsDefault, true)); List i18nList = list(); - // 整理集合 - Map> map = i18nList.stream() - .collect(Collectors.groupingBy( - I18n::getTypeName, - Collectors.toMap(I18n::getKeyName, I18n::getTranslation))); - - // 返回集合 - HashMap hashMap = new HashMap<>(map); + HashMap hashMap = I18nUtil.getMap(i18nList); hashMap.put("local", Objects.requireNonNull(i18nType.getTypeName(), "zh")); + return hashMap; } + /** * * 获取管理多语言列表 * @@ -140,4 +146,47 @@ public class I18nServiceImpl extends ServiceImpl implements I1 baseMapper.deleteBatchIdsWithPhysics(ids); } + + /** + * 下载多语言配置 + * + * @return 文件内容 + */ + @Override + public ResponseEntity downloadI18n() { + ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); + ZipOutputStream zipOutputStream = new ZipOutputStream(byteArrayOutputStream); + + // 查找默认语言内容 + List i18nList = list(); + HashMap hashMap = I18nUtil.getMap(i18nList); + + hashMap.forEach((k, v) -> { + try { + ZipEntry zipEntry = new ZipEntry(k + ".json"); + zipOutputStream.putNextEntry(zipEntry); + + zipOutputStream.write(JSON.toJSONString(v).getBytes(StandardCharsets.UTF_8)); + zipOutputStream.closeEntry(); + } catch (IOException e) { + throw new RuntimeException(e); + } + }); + + try { + zipOutputStream.close(); + } catch (IOException e) { + throw new RuntimeException(e); + } + + // 设置响应头 + HttpHeaders headers = new HttpHeaders(); + headers.add("Content-Disposition", "attachment; filename=i18n.zip"); + headers.add("Cache-Control", "no-cache, no-store, must-revalidate"); + headers.add("Pragma", "no-cache"); + headers.add("Expires", "0"); + + ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray()); + return new ResponseEntity<>(byteArrayInputStream.readAllBytes(), headers, HttpStatus.OK); + } } diff --git a/service/src/main/java/cn/bunny/services/utils/system/I18nUtil.java b/service/src/main/java/cn/bunny/services/utils/system/I18nUtil.java new file mode 100644 index 0000000..1b60d02 --- /dev/null +++ b/service/src/main/java/cn/bunny/services/utils/system/I18nUtil.java @@ -0,0 +1,23 @@ +package cn.bunny.services.utils.system; + +import cn.bunny.dao.entity.i18n.I18n; +import org.jetbrains.annotations.NotNull; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class I18nUtil { + @NotNull + public static HashMap getMap(List i18nList) { + // 整理集合 + Map> map = i18nList.stream() + .collect(Collectors.groupingBy( + I18n::getTypeName, + Collectors.toMap(I18n::getKeyName, I18n::getTranslation))); + + // 返回集合 + return new HashMap<>(map); + } +} diff --git a/service/src/main/resources/application-dev.yml b/service/src/main/resources/application-dev.yml index a7ae042..026ded5 100644 --- a/service/src/main/resources/application-dev.yml +++ b/service/src/main/resources/application-dev.yml @@ -13,26 +13,26 @@ logging: path: "logs/${spring.application.name}" name: "logs/${spring.application.name}" -#mybatis-plus: +# mybatis-plus: # configuration: # log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 查看日志 bunny: master: - host: localhost + host: 192.168.3.137 port: 3306 database: auth_admin username: root password: "123456" redis: - host: localhost + host: 192.168.3.137 port: 6379 database: 0 password: "123456" minio: - endpointUrl: "http://localhost:9000" # 连接地址 + endpointUrl: "http://192.168.3.137:9000" # 连接地址 accessKey: bunny # 用户名 secretKey: "12345678" # 登录密码 bucket-name: auth-admin # 指定哪个桶 diff --git a/service/src/test/java/cn/bunny/services/service/configuration/impl/I18nServiceImplTest.java b/service/src/test/java/cn/bunny/services/service/configuration/impl/I18nServiceImplTest.java new file mode 100644 index 0000000..f663cf2 --- /dev/null +++ b/service/src/test/java/cn/bunny/services/service/configuration/impl/I18nServiceImplTest.java @@ -0,0 +1,49 @@ +package cn.bunny.services.service.configuration.impl; + +import cn.bunny.dao.entity.i18n.I18n; +import cn.bunny.services.mapper.configuration.I18nMapper; +import cn.bunny.services.utils.system.I18nUtil; +import com.alibaba.fastjson2.JSON; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.util.HashMap; +import java.util.List; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; + +@SpringBootTest +class I18nServiceImplTest extends ServiceImpl { + + @Test + void downloadI18n() { + ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); + ZipOutputStream zipOutputStream = new ZipOutputStream(byteArrayOutputStream); + + // 查找默认语言内容 + List i18nList = list(); + HashMap hashMap = I18nUtil.getMap(i18nList); + + hashMap.forEach((k, v) -> { + try { + ZipEntry zipEntry = new ZipEntry(k + ".json"); + zipOutputStream.putNextEntry(zipEntry); + + zipOutputStream.write(JSON.toJSONString(v).getBytes(StandardCharsets.UTF_8)); + zipOutputStream.closeEntry(); + } catch (IOException e) { + throw new RuntimeException(e); + } + }); + + try { + zipOutputStream.close(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } +} \ No newline at end of file