From 6c7cc367b59d21f2a2a0add66037c8f61b88c2c5 Mon Sep 17 00:00:00 2001 From: ziin Date: Thu, 25 Dec 2025 13:46:02 +0800 Subject: [PATCH] =?UTF-8?q?feat(userthemes):=20=E6=96=B0=E5=A2=9E=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E4=B8=BB=E9=A2=98=E7=AE=A1=E7=90=86=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增用户主题完整CRUD模块,含控制器、DO、Mapper、Service及VO定义,并补充错误码。 --- .../KeyboardUserThemesController.java | 104 ++++++++++++++++++ .../vo/KeyboardUserThemesPageReqVO.java | 31 ++++++ .../vo/KeyboardUserThemesRespVO.java | 39 +++++++ .../vo/KeyboardUserThemesSaveReqVO.java | 32 ++++++ .../userthemes/KeyboardUserThemesDO.java | 52 +++++++++ .../userthemes/KeyboardUserThemesMapper.java | 30 +++++ .../userthemes/KeyboardUserThemesService.java | 62 +++++++++++ .../KeyboardUserThemesServiceImpl.java | 83 ++++++++++++++ .../userthemes/KeyboardUserThemesMapper.xml | 12 ++ .../infra/enums/ErrorCodeConstants.java | 1 + 10 files changed, 446 insertions(+) create mode 100644 keyboard-server/src/main/java/com/yolo/keyboard/controller/admin/userthemes/KeyboardUserThemesController.java create mode 100644 keyboard-server/src/main/java/com/yolo/keyboard/controller/admin/userthemes/vo/KeyboardUserThemesPageReqVO.java create mode 100644 keyboard-server/src/main/java/com/yolo/keyboard/controller/admin/userthemes/vo/KeyboardUserThemesRespVO.java create mode 100644 keyboard-server/src/main/java/com/yolo/keyboard/controller/admin/userthemes/vo/KeyboardUserThemesSaveReqVO.java create mode 100644 keyboard-server/src/main/java/com/yolo/keyboard/dal/dataobject/userthemes/KeyboardUserThemesDO.java create mode 100644 keyboard-server/src/main/java/com/yolo/keyboard/dal/mysql/userthemes/KeyboardUserThemesMapper.java create mode 100644 keyboard-server/src/main/java/com/yolo/keyboard/service/userthemes/KeyboardUserThemesService.java create mode 100644 keyboard-server/src/main/java/com/yolo/keyboard/service/userthemes/KeyboardUserThemesServiceImpl.java create mode 100644 keyboard-server/src/main/resources/mapper/userthemes/KeyboardUserThemesMapper.xml diff --git a/keyboard-server/src/main/java/com/yolo/keyboard/controller/admin/userthemes/KeyboardUserThemesController.java b/keyboard-server/src/main/java/com/yolo/keyboard/controller/admin/userthemes/KeyboardUserThemesController.java new file mode 100644 index 0000000..e4f7b5e --- /dev/null +++ b/keyboard-server/src/main/java/com/yolo/keyboard/controller/admin/userthemes/KeyboardUserThemesController.java @@ -0,0 +1,104 @@ +package com.yolo.keyboard.controller.admin.userthemes; + +import org.springframework.web.bind.annotation.*; +import jakarta.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Operation; + +import jakarta.validation.constraints.*; +import jakarta.validation.*; +import jakarta.servlet.http.*; +import java.util.*; +import java.io.IOException; + +import com.yolo.keyboard.framework.common.pojo.PageParam; +import com.yolo.keyboard.framework.common.pojo.PageResult; +import com.yolo.keyboard.framework.common.pojo.CommonResult; +import com.yolo.keyboard.framework.common.util.object.BeanUtils; +import static com.yolo.keyboard.framework.common.pojo.CommonResult.success; + +import com.yolo.keyboard.framework.excel.core.util.ExcelUtils; + +import com.yolo.keyboard.framework.apilog.core.annotation.ApiAccessLog; +import static com.yolo.keyboard.framework.apilog.core.enums.OperateTypeEnum.*; + +import com.yolo.keyboard.controller.admin.userthemes.vo.*; +import com.yolo.keyboard.dal.dataobject.userthemes.KeyboardUserThemesDO; +import com.yolo.keyboard.service.userthemes.KeyboardUserThemesService; + +@Tag(name = "管理后台 - 用户主题") +@RestController +@RequestMapping("/keyboard/user-themes") +@Validated +public class KeyboardUserThemesController { + + @Resource + private KeyboardUserThemesService userThemesService; + + @PostMapping("/create") + @Operation(summary = "创建用户主题") + @PreAuthorize("@ss.hasPermission('keyboard:user-themes:create')") + public CommonResult createUserThemes(@Valid @RequestBody KeyboardUserThemesSaveReqVO createReqVO) { + return success(userThemesService.createUserThemes(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新用户主题") + @PreAuthorize("@ss.hasPermission('keyboard:user-themes:update')") + public CommonResult updateUserThemes(@Valid @RequestBody KeyboardUserThemesSaveReqVO updateReqVO) { + userThemesService.updateUserThemes(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除用户主题") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('keyboard:user-themes:delete')") + public CommonResult deleteUserThemes(@RequestParam("id") Long id) { + userThemesService.deleteUserThemes(id); + return success(true); + } + + @DeleteMapping("/delete-list") + @Parameter(name = "ids", description = "编号", required = true) + @Operation(summary = "批量删除用户主题") + @PreAuthorize("@ss.hasPermission('keyboard:user-themes:delete')") + public CommonResult deleteUserThemesList(@RequestParam("ids") List ids) { + userThemesService.deleteUserThemesListByIds(ids); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得用户主题") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('keyboard:user-themes:query')") + public CommonResult getUserThemes(@RequestParam("id") Long id) { + KeyboardUserThemesDO userThemes = userThemesService.getUserThemes(id); + return success(BeanUtils.toBean(userThemes, KeyboardUserThemesRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得用户主题分页") + @PreAuthorize("@ss.hasPermission('keyboard:user-themes:query')") + public CommonResult> getUserThemesPage(@Valid KeyboardUserThemesPageReqVO pageReqVO) { + PageResult pageResult = userThemesService.getUserThemesPage(pageReqVO); + return success(BeanUtils.toBean(pageResult, KeyboardUserThemesRespVO.class)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出用户主题 Excel") + @PreAuthorize("@ss.hasPermission('keyboard:user-themes:export')") + @ApiAccessLog(operateType = EXPORT) + public void exportUserThemesExcel(@Valid KeyboardUserThemesPageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = userThemesService.getUserThemesPage(pageReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "用户主题.xls", "数据", KeyboardUserThemesRespVO.class, + BeanUtils.toBean(list, KeyboardUserThemesRespVO.class)); + } + +} \ No newline at end of file diff --git a/keyboard-server/src/main/java/com/yolo/keyboard/controller/admin/userthemes/vo/KeyboardUserThemesPageReqVO.java b/keyboard-server/src/main/java/com/yolo/keyboard/controller/admin/userthemes/vo/KeyboardUserThemesPageReqVO.java new file mode 100644 index 0000000..786cd05 --- /dev/null +++ b/keyboard-server/src/main/java/com/yolo/keyboard/controller/admin/userthemes/vo/KeyboardUserThemesPageReqVO.java @@ -0,0 +1,31 @@ +package com.yolo.keyboard.controller.admin.userthemes.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import com.yolo.keyboard.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; + +import static com.yolo.keyboard.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 用户主题分页 Request VO") +@Data +public class KeyboardUserThemesPageReqVO extends PageParam { + + @Schema(description = "主题主键", example = "21647") + private Long themeId; + + @Schema(description = "用户 Id", example = "9884") + private Long userId; + + @Schema(description = "创建时间") + private LocalDateTime createdAt; + + @Schema(description = "是否从显示移除") + private Boolean viewDeleted; + + @Schema(description = "更新时间") + private Boolean updatedAt; + +} \ No newline at end of file diff --git a/keyboard-server/src/main/java/com/yolo/keyboard/controller/admin/userthemes/vo/KeyboardUserThemesRespVO.java b/keyboard-server/src/main/java/com/yolo/keyboard/controller/admin/userthemes/vo/KeyboardUserThemesRespVO.java new file mode 100644 index 0000000..2cd95d1 --- /dev/null +++ b/keyboard-server/src/main/java/com/yolo/keyboard/controller/admin/userthemes/vo/KeyboardUserThemesRespVO.java @@ -0,0 +1,39 @@ +package com.yolo.keyboard.controller.admin.userthemes.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; +import cn.idev.excel.annotation.*; + +@Schema(description = "管理后台 - 用户主题 Response VO") +@Data +@ExcelIgnoreUnannotated +public class KeyboardUserThemesRespVO { + + @Schema(description = "主键 id", requiredMode = Schema.RequiredMode.REQUIRED, example = "746") + @ExcelProperty("主键 id") + private Long id; + + @Schema(description = "主题主键", example = "21647") + @ExcelProperty("主题主键") + private Long themeId; + + @Schema(description = "用户 Id", example = "9884") + @ExcelProperty("用户 Id") + private Long userId; + + @Schema(description = "创建时间") + @ExcelProperty("创建时间") + private LocalDateTime createdAt; + + @Schema(description = "是否从显示移除") + @ExcelProperty("是否从显示移除") + private Boolean viewDeleted; + + @Schema(description = "更新时间") + @ExcelProperty("更新时间") + private Boolean updatedAt; + +} \ No newline at end of file diff --git a/keyboard-server/src/main/java/com/yolo/keyboard/controller/admin/userthemes/vo/KeyboardUserThemesSaveReqVO.java b/keyboard-server/src/main/java/com/yolo/keyboard/controller/admin/userthemes/vo/KeyboardUserThemesSaveReqVO.java new file mode 100644 index 0000000..5e3ff7a --- /dev/null +++ b/keyboard-server/src/main/java/com/yolo/keyboard/controller/admin/userthemes/vo/KeyboardUserThemesSaveReqVO.java @@ -0,0 +1,32 @@ +package com.yolo.keyboard.controller.admin.userthemes.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import jakarta.validation.constraints.*; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 用户主题新增/修改 Request VO") +@Data +public class KeyboardUserThemesSaveReqVO { + + @Schema(description = "主键 id", requiredMode = Schema.RequiredMode.REQUIRED, example = "746") + private Long id; + + @Schema(description = "主题主键", example = "21647") + private Long themeId; + + @Schema(description = "用户 Id", example = "9884") + private Long userId; + + @Schema(description = "创建时间") + private LocalDateTime createdAt; + + @Schema(description = "是否从显示移除") + private Boolean viewDeleted; + + @Schema(description = "更新时间") + private Boolean updatedAt; + +} \ No newline at end of file diff --git a/keyboard-server/src/main/java/com/yolo/keyboard/dal/dataobject/userthemes/KeyboardUserThemesDO.java b/keyboard-server/src/main/java/com/yolo/keyboard/dal/dataobject/userthemes/KeyboardUserThemesDO.java new file mode 100644 index 0000000..1d7984f --- /dev/null +++ b/keyboard-server/src/main/java/com/yolo/keyboard/dal/dataobject/userthemes/KeyboardUserThemesDO.java @@ -0,0 +1,52 @@ +package com.yolo.keyboard.dal.dataobject.userthemes; + +import com.yolo.keyboard.framework.tenant.core.aop.TenantIgnore; +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.*; +import com.yolo.keyboard.framework.mybatis.core.dataobject.BaseDO; + +/** + * 用户主题 DO + * + * @author 芋道源码 + */ +@TableName("keyboard_user_themes") +@KeySequence("keyboard_user_themes_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +@TenantIgnore +public class KeyboardUserThemesDO{ + + /** + * 主键 id + */ + @TableId + private Long id; + /** + * 主题主键 + */ + private Long themeId; + /** + * 用户 Id + */ + private Long userId; + /** + * 创建时间 + */ + private LocalDateTime createdAt; + /** + * 是否从显示移除 + */ + private Boolean viewDeleted; + /** + * 更新时间 + */ + private Boolean updatedAt; + + +} \ No newline at end of file diff --git a/keyboard-server/src/main/java/com/yolo/keyboard/dal/mysql/userthemes/KeyboardUserThemesMapper.java b/keyboard-server/src/main/java/com/yolo/keyboard/dal/mysql/userthemes/KeyboardUserThemesMapper.java new file mode 100644 index 0000000..9967e74 --- /dev/null +++ b/keyboard-server/src/main/java/com/yolo/keyboard/dal/mysql/userthemes/KeyboardUserThemesMapper.java @@ -0,0 +1,30 @@ +package com.yolo.keyboard.dal.mysql.userthemes; + +import java.util.*; + +import com.yolo.keyboard.framework.common.pojo.PageResult; +import com.yolo.keyboard.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.yolo.keyboard.framework.mybatis.core.mapper.BaseMapperX; +import com.yolo.keyboard.dal.dataobject.userthemes.KeyboardUserThemesDO; +import org.apache.ibatis.annotations.Mapper; +import com.yolo.keyboard.controller.admin.userthemes.vo.*; + +/** + * 用户主题 Mapper + * + * @author 芋道源码 + */ +@Mapper +public interface KeyboardUserThemesMapper extends BaseMapperX { + + default PageResult selectPage(KeyboardUserThemesPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(KeyboardUserThemesDO::getThemeId, reqVO.getThemeId()) + .eqIfPresent(KeyboardUserThemesDO::getUserId, reqVO.getUserId()) + .eqIfPresent(KeyboardUserThemesDO::getCreatedAt, reqVO.getCreatedAt()) + .eqIfPresent(KeyboardUserThemesDO::getViewDeleted, reqVO.getViewDeleted()) + .eqIfPresent(KeyboardUserThemesDO::getUpdatedAt, reqVO.getUpdatedAt()) + .orderByDesc(KeyboardUserThemesDO::getId)); + } + +} \ No newline at end of file diff --git a/keyboard-server/src/main/java/com/yolo/keyboard/service/userthemes/KeyboardUserThemesService.java b/keyboard-server/src/main/java/com/yolo/keyboard/service/userthemes/KeyboardUserThemesService.java new file mode 100644 index 0000000..042bb9f --- /dev/null +++ b/keyboard-server/src/main/java/com/yolo/keyboard/service/userthemes/KeyboardUserThemesService.java @@ -0,0 +1,62 @@ +package com.yolo.keyboard.service.userthemes; + +import java.util.*; +import jakarta.validation.*; +import com.yolo.keyboard.controller.admin.userthemes.vo.*; +import com.yolo.keyboard.dal.dataobject.userthemes.KeyboardUserThemesDO; +import com.yolo.keyboard.framework.common.pojo.PageResult; +import com.yolo.keyboard.framework.common.pojo.PageParam; + +/** + * 用户主题 Service 接口 + * + * @author 芋道源码 + */ +public interface KeyboardUserThemesService { + + /** + * 创建用户主题 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createUserThemes(@Valid KeyboardUserThemesSaveReqVO createReqVO); + + /** + * 更新用户主题 + * + * @param updateReqVO 更新信息 + */ + void updateUserThemes(@Valid KeyboardUserThemesSaveReqVO updateReqVO); + + /** + * 删除用户主题 + * + * @param id 编号 + */ + void deleteUserThemes(Long id); + + /** + * 批量删除用户主题 + * + * @param ids 编号 + */ + void deleteUserThemesListByIds(List ids); + + /** + * 获得用户主题 + * + * @param id 编号 + * @return 用户主题 + */ + KeyboardUserThemesDO getUserThemes(Long id); + + /** + * 获得用户主题分页 + * + * @param pageReqVO 分页查询 + * @return 用户主题分页 + */ + PageResult getUserThemesPage(KeyboardUserThemesPageReqVO pageReqVO); + +} \ No newline at end of file diff --git a/keyboard-server/src/main/java/com/yolo/keyboard/service/userthemes/KeyboardUserThemesServiceImpl.java b/keyboard-server/src/main/java/com/yolo/keyboard/service/userthemes/KeyboardUserThemesServiceImpl.java new file mode 100644 index 0000000..5f92ebb --- /dev/null +++ b/keyboard-server/src/main/java/com/yolo/keyboard/service/userthemes/KeyboardUserThemesServiceImpl.java @@ -0,0 +1,83 @@ +package com.yolo.keyboard.service.userthemes; + +import cn.hutool.core.collection.CollUtil; +import org.springframework.stereotype.Service; +import jakarta.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import com.yolo.keyboard.controller.admin.userthemes.vo.*; +import com.yolo.keyboard.dal.dataobject.userthemes.KeyboardUserThemesDO; +import com.yolo.keyboard.framework.common.pojo.PageResult; +import com.yolo.keyboard.framework.common.pojo.PageParam; +import com.yolo.keyboard.framework.common.util.object.BeanUtils; + +import com.yolo.keyboard.dal.mysql.userthemes.KeyboardUserThemesMapper; + +import static com.yolo.keyboard.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.yolo.keyboard.module.infra.enums.ErrorCodeConstants.USER_THEMES_NOT_EXISTS; + +/** + * 用户主题 Service 实现类 + * + * @author 芋道源码 + */ +@Service +@Validated +public class KeyboardUserThemesServiceImpl implements KeyboardUserThemesService { + + @Resource + private KeyboardUserThemesMapper userThemesMapper; + + @Override + public Long createUserThemes(KeyboardUserThemesSaveReqVO createReqVO) { + // 插入 + KeyboardUserThemesDO userThemes = BeanUtils.toBean(createReqVO, KeyboardUserThemesDO.class); + userThemesMapper.insert(userThemes); + + // 返回 + return userThemes.getId(); + } + + @Override + public void updateUserThemes(KeyboardUserThemesSaveReqVO updateReqVO) { + // 校验存在 + validateUserThemesExists(updateReqVO.getId()); + // 更新 + KeyboardUserThemesDO updateObj = BeanUtils.toBean(updateReqVO, KeyboardUserThemesDO.class); + userThemesMapper.updateById(updateObj); + } + + @Override + public void deleteUserThemes(Long id) { + // 校验存在 + validateUserThemesExists(id); + // 删除 + userThemesMapper.deleteById(id); + } + + @Override + public void deleteUserThemesListByIds(List ids) { + // 删除 + userThemesMapper.deleteByIds(ids); + } + + + private void validateUserThemesExists(Long id) { + if (userThemesMapper.selectById(id) == null) { + throw exception(USER_THEMES_NOT_EXISTS); + } + } + + @Override + public KeyboardUserThemesDO getUserThemes(Long id) { + return userThemesMapper.selectById(id); + } + + @Override + public PageResult getUserThemesPage(KeyboardUserThemesPageReqVO pageReqVO) { + return userThemesMapper.selectPage(pageReqVO); + } + +} \ No newline at end of file diff --git a/keyboard-server/src/main/resources/mapper/userthemes/KeyboardUserThemesMapper.xml b/keyboard-server/src/main/resources/mapper/userthemes/KeyboardUserThemesMapper.xml new file mode 100644 index 0000000..fbbe4fb --- /dev/null +++ b/keyboard-server/src/main/resources/mapper/userthemes/KeyboardUserThemesMapper.xml @@ -0,0 +1,12 @@ + + + + + + + \ No newline at end of file diff --git a/yolo-module-infra/src/main/java/com/yolo/keyboard/module/infra/enums/ErrorCodeConstants.java b/yolo-module-infra/src/main/java/com/yolo/keyboard/module/infra/enums/ErrorCodeConstants.java index f236ba8..8113dd9 100644 --- a/yolo-module-infra/src/main/java/com/yolo/keyboard/module/infra/enums/ErrorCodeConstants.java +++ b/yolo-module-infra/src/main/java/com/yolo/keyboard/module/infra/enums/ErrorCodeConstants.java @@ -84,6 +84,7 @@ public interface ErrorCodeConstants { ErrorCode TAG_NOT_EXISTS = new ErrorCode(1_001_202_010, "人设标签不存在"); ErrorCode USER_QUOTA_TOTAL_NOT_EXISTS = new ErrorCode(1_001_202_011, "用户免费功能永久总次数额度表(所有功能共用)不存在"); ErrorCode USER_CHARACTER_NOT_EXISTS = new ErrorCode(1_001_202_012, "用户人设管理不存在"); + ErrorCode USER_THEMES_NOT_EXISTS = new ErrorCode(1_001_202_013, "用户主题不存在"); }