From a492aee703a84270ffd747f3724437b65d20c7a0 Mon Sep 17 00:00:00 2001 From: Bunny <1319900154@qq.com> Date: Sat, 2 Nov 2024 17:03:38 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B6=88=E6=81=AF=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/service/config/Knife4jConfig.java | 6 +- .../dto/system/message/MessageUserDto.java | 4 ++ .../router/AssignRolesToRoutersDto.java | 1 + .../dto/system/router/RouterUpdateDto.java | 1 - .../dao/vo/system/message/MessageUserVo.java | 25 +++++-- .../controller/MessageController.java | 14 ++++ .../controller/MessageReceivedController.java | 2 + .../controller/RouterRoleController.java | 7 ++ .../services/controller/UserController.java | 2 +- .../bunny/services/mapper/MessageMapper.java | 1 + .../mapper/MessageReceivedMapper.java | 8 +++ .../services/mapper/RouterRoleMapper.java | 7 ++ .../services/service/MessageService.java | 14 ++++ .../services/service/RouterRoleService.java | 7 ++ .../impl/MessageReceivedServiceImpl.java | 3 +- .../service/impl/MessageServiceImpl.java | 66 +++++++++++++++++++ .../service/impl/RouterRoleServiceImpl.java | 39 +++++++++++ .../main/resources/mapper/MessageMapper.xml | 23 +++++-- .../mapper/MessageReceivedMapper.xml | 10 +++ .../resources/mapper/RouterRoleMapper.xml | 10 +++ 20 files changed, 232 insertions(+), 18 deletions(-) diff --git a/common/service-utils/src/main/java/cn/bunny/common/service/config/Knife4jConfig.java b/common/service-utils/src/main/java/cn/bunny/common/service/config/Knife4jConfig.java index 1ccb12d..c06abee 100644 --- a/common/service-utils/src/main/java/cn/bunny/common/service/config/Knife4jConfig.java +++ b/common/service-utils/src/main/java/cn/bunny/common/service/config/Knife4jConfig.java @@ -18,9 +18,9 @@ public class Knife4jConfig { // 作者等信息 Contact contact = new Contact().name("Bunny").email("1319900154@qq.com").url("http://z-bunny.cn"); // 使用协议 - License license = new License().name("MIT").url("http://MUT.com"); + License license = new License().name("MIT").url("https://MUT.com"); // 相关信息 - Info info = new Info().title("Bunny-Java-Template").description("Bunny的Java模板").version("v1.0.0").contact(contact).license(license).termsOfService("维护不易~求个start"); + Info info = new Info().title("Bunny-Admin").description("权限管理模板").version("v1.0.0").contact(contact).license(license).termsOfService("MIT"); return new OpenAPI().info(info).externalDocs(new ExternalDocumentation()); } @@ -28,6 +28,6 @@ public class Knife4jConfig { // 管理员相关分类接口 @Bean public GroupedOpenApi groupedOpenAdminApi() { - return GroupedOpenApi.builder().group("admin管理员接口请求").pathsToMatch("/admin/**").build(); + return GroupedOpenApi.builder().group("默认请求接口").pathsToMatch("/admin/**").build(); } } diff --git a/dao/src/main/java/cn/bunny/dao/dto/system/message/MessageUserDto.java b/dao/src/main/java/cn/bunny/dao/dto/system/message/MessageUserDto.java index b419702..eac5747 100644 --- a/dao/src/main/java/cn/bunny/dao/dto/system/message/MessageUserDto.java +++ b/dao/src/main/java/cn/bunny/dao/dto/system/message/MessageUserDto.java @@ -13,9 +13,13 @@ import lombok.NoArgsConstructor; @Schema(name = "MessageUserDto对象", title = "用户消息查询内容", description = "用户消息查询内容") public class MessageUserDto { + @Schema(name = "title", title = "消息标题") + private String title; + @Schema(name = "messageType", title = "消息类型") private String messageType; @Schema(name = "status", title = "0:未读 1:已读") private Boolean status; + } diff --git a/dao/src/main/java/cn/bunny/dao/dto/system/router/AssignRolesToRoutersDto.java b/dao/src/main/java/cn/bunny/dao/dto/system/router/AssignRolesToRoutersDto.java index aff4b03..8becf99 100644 --- a/dao/src/main/java/cn/bunny/dao/dto/system/router/AssignRolesToRoutersDto.java +++ b/dao/src/main/java/cn/bunny/dao/dto/system/router/AssignRolesToRoutersDto.java @@ -19,6 +19,7 @@ public class AssignRolesToRoutersDto { @Schema(name = "routerId", title = "路由id") @NotNull(message = "路由id不能为空") + @NotEmpty(message = "路由id不能为空") private List routerIds; @Schema(name = "roleIds", title = "角色id列表") diff --git a/dao/src/main/java/cn/bunny/dao/dto/system/router/RouterUpdateDto.java b/dao/src/main/java/cn/bunny/dao/dto/system/router/RouterUpdateDto.java index 0da9e79..e2c9133 100644 --- a/dao/src/main/java/cn/bunny/dao/dto/system/router/RouterUpdateDto.java +++ b/dao/src/main/java/cn/bunny/dao/dto/system/router/RouterUpdateDto.java @@ -49,7 +49,6 @@ public class RouterUpdateDto { @Schema(name = "routerRank", title = "等级") @JsonProperty("rank") - @NotNull(message = "菜单排序不能为空") @Max(value = 999, message = "不能超过999") private Integer routerRank; diff --git a/dao/src/main/java/cn/bunny/dao/vo/system/message/MessageUserVo.java b/dao/src/main/java/cn/bunny/dao/vo/system/message/MessageUserVo.java index f73937c..22605de 100644 --- a/dao/src/main/java/cn/bunny/dao/vo/system/message/MessageUserVo.java +++ b/dao/src/main/java/cn/bunny/dao/vo/system/message/MessageUserVo.java @@ -1,21 +1,26 @@ package cn.bunny.dao.vo.system.message; +import cn.bunny.dao.common.vo.BaseVo; import com.alibaba.fastjson2.annotation.JSONField; import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; +import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; import io.swagger.v3.oas.annotations.media.Schema; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; +import lombok.*; +import java.time.LocalDateTime; + +@EqualsAndHashCode(callSuper = true) @Data @AllArgsConstructor @NoArgsConstructor @Builder @Schema(name = "MessageVo对象", title = "系统消息返回内容", description = "系统消息返回内容") -public class MessageUserVo { +public class MessageUserVo extends BaseVo { @Schema(name = "id", title = "主键") @JsonProperty("id") @@ -41,4 +46,14 @@ public class MessageUserVo { @Schema(name = "extra", title = "消息等级详情") private String extra; + @Schema(name = "status", title = "消息状态") + private Boolean status; + + @Schema(name = "updateTime", title = "更新时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonSerialize(using = LocalDateTimeSerializer.class) + @JsonDeserialize(using = LocalDateTimeDeserializer.class) + @JsonProperty("acceptanceTime") + private LocalDateTime updateTime; + } diff --git a/service/src/main/java/cn/bunny/services/controller/MessageController.java b/service/src/main/java/cn/bunny/services/controller/MessageController.java index 742026b..0412d09 100644 --- a/service/src/main/java/cn/bunny/services/controller/MessageController.java +++ b/service/src/main/java/cn/bunny/services/controller/MessageController.java @@ -85,10 +85,24 @@ public class MessageController { return Mono.just(Result.success(ResultCodeEnum.UPDATE_SUCCESS)); } + @Operation(summary = "用户将消息标为已读", description = "用户将消息标为已读") + @PutMapping("/noManage/updateUserMarkAsRead") + public Mono> updateUserMarkAsRead(@Valid @RequestBody List ids) { + messageService.updateUserMarkAsRead(ids); + return Mono.just(Result.success(ResultCodeEnum.UPDATE_SUCCESS)); + } + @Operation(summary = "删除系统消息", description = "删除系统消息") @DeleteMapping("deleteMessage") public Mono> deleteMessage(@RequestBody List ids) { messageService.deleteMessage(ids); return Mono.just(Result.success(ResultCodeEnum.DELETE_SUCCESS)); } + + @Operation(summary = "用户删除消息", description = "用户删除消息") + @DeleteMapping("/noManage/deleteUserMessageByIds") + public Mono> deleteUserMessageByIds(@RequestBody List ids) { + messageService.deleteUserMessageByIds(ids); + return Mono.just(Result.success(ResultCodeEnum.DELETE_SUCCESS)); + } } diff --git a/service/src/main/java/cn/bunny/services/controller/MessageReceivedController.java b/service/src/main/java/cn/bunny/services/controller/MessageReceivedController.java index 5e9ca1d..9cc09d3 100644 --- a/service/src/main/java/cn/bunny/services/controller/MessageReceivedController.java +++ b/service/src/main/java/cn/bunny/services/controller/MessageReceivedController.java @@ -4,6 +4,7 @@ import cn.bunny.dao.pojo.result.Result; import cn.bunny.dao.vo.system.message.MessageReceivedWithUserVo; import cn.bunny.services.service.MessageReceivedService; import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; @@ -20,6 +21,7 @@ import java.util.List; * @author Bunny * @since 2024-10-31 */ +@Tag(name = "消息接受关系", description = "消息接受关系相关接口") @RestController @RequestMapping("/admin/messageReceived") public class MessageReceivedController { diff --git a/service/src/main/java/cn/bunny/services/controller/RouterRoleController.java b/service/src/main/java/cn/bunny/services/controller/RouterRoleController.java index 4ed522b..ce5e658 100644 --- a/service/src/main/java/cn/bunny/services/controller/RouterRoleController.java +++ b/service/src/main/java/cn/bunny/services/controller/RouterRoleController.java @@ -41,6 +41,13 @@ public class RouterRoleController { return Mono.just(Result.success()); } + @Operation(summary = "批量为菜单添加角色", description = "批量为菜单添加角色") + @PostMapping("assignAddBatchRolesToRouter") + public Mono> assignAddBatchRolesToRouter(@RequestBody AssignRolesToRoutersDto dto) { + routerRoleService.assignAddBatchRolesToRouter(dto); + return Mono.just(Result.success()); + } + @Operation(summary = "清除选中菜单所有角色", description = "清除选中菜单所有角色") @DeleteMapping("clearAllRolesSelect") public Mono> clearAllRolesSelect(@RequestBody List routerIds) { diff --git a/service/src/main/java/cn/bunny/services/controller/UserController.java b/service/src/main/java/cn/bunny/services/controller/UserController.java index 780de7f..38fad43 100644 --- a/service/src/main/java/cn/bunny/services/controller/UserController.java +++ b/service/src/main/java/cn/bunny/services/controller/UserController.java @@ -61,7 +61,7 @@ public class UserController { return Mono.just(Result.success(voList)); } - @Operation(summary = "更新用户信息", description = "更新用户信息后需要更新Redis中的内容") + @Operation(summary = "更新用户信息", description = "更新用户信息,需要更新Redis中的内容") @PutMapping("updateAdminUser") public Result updateAdminUser(@Valid @RequestBody AdminUserUpdateDto dto) { userService.updateAdminUser(dto); diff --git a/service/src/main/java/cn/bunny/services/mapper/MessageMapper.java b/service/src/main/java/cn/bunny/services/mapper/MessageMapper.java index 4596198..873e179 100644 --- a/service/src/main/java/cn/bunny/services/mapper/MessageMapper.java +++ b/service/src/main/java/cn/bunny/services/mapper/MessageMapper.java @@ -55,4 +55,5 @@ public interface MessageMapper extends BaseMapper { * @return 消息返回对象 */ MessageVo selectMessageVoById(Long id); + } diff --git a/service/src/main/java/cn/bunny/services/mapper/MessageReceivedMapper.java b/service/src/main/java/cn/bunny/services/mapper/MessageReceivedMapper.java index 398068c..37bcbb3 100644 --- a/service/src/main/java/cn/bunny/services/mapper/MessageReceivedMapper.java +++ b/service/src/main/java/cn/bunny/services/mapper/MessageReceivedMapper.java @@ -39,4 +39,12 @@ public interface MessageReceivedMapper extends BaseMapper { * @return 消息接收人用户名等信息 */ List selectUserinfoListByMessageId(Long messageId); + + /** + * 根据当前用户id删除消息接受表中数据 + * + * @param ids 消息列表 + * @param userId 用户id + */ + void deleteBatchIdsByMessageIdsAndUserIdWithPhysics(List ids, Long userId); } diff --git a/service/src/main/java/cn/bunny/services/mapper/RouterRoleMapper.java b/service/src/main/java/cn/bunny/services/mapper/RouterRoleMapper.java index a541e06..13d429e 100644 --- a/service/src/main/java/cn/bunny/services/mapper/RouterRoleMapper.java +++ b/service/src/main/java/cn/bunny/services/mapper/RouterRoleMapper.java @@ -38,4 +38,11 @@ public interface RouterRoleMapper extends BaseMapper { * @return 路由角色关系视图列表 */ List viewRouterRolesWithAll(); + + /** + * 根据Id列表物理删除路由角色关系表 + * + * @param ids 路由角色关系表ids + */ + void deleteBatchIdsWithPhysics(List ids); } diff --git a/service/src/main/java/cn/bunny/services/service/MessageService.java b/service/src/main/java/cn/bunny/services/service/MessageService.java index 0018e14..32fb4e4 100644 --- a/service/src/main/java/cn/bunny/services/service/MessageService.java +++ b/service/src/main/java/cn/bunny/services/service/MessageService.java @@ -68,4 +68,18 @@ public interface MessageService extends IService { * @return 消息详情 */ MessageVo getMessageDetailById(Long id); + + /** + * 用户将消息标为已读 + * + * @param ids 消息id列表 + */ + void updateUserMarkAsRead(List ids); + + /** + * 用户删除消息 + * + * @param ids 消息Id列表 + */ + void deleteUserMessageByIds(List ids); } diff --git a/service/src/main/java/cn/bunny/services/service/RouterRoleService.java b/service/src/main/java/cn/bunny/services/service/RouterRoleService.java index 4155480..d34ed19 100644 --- a/service/src/main/java/cn/bunny/services/service/RouterRoleService.java +++ b/service/src/main/java/cn/bunny/services/service/RouterRoleService.java @@ -37,4 +37,11 @@ public interface RouterRoleService extends IService { * @param routerIds 路由id */ void clearAllRolesSelect(List routerIds); + + /** + * 批量为菜单添加角色 + * + * @param dto 路由分配角色 + */ + void assignAddBatchRolesToRouter(AssignRolesToRoutersDto dto); } diff --git a/service/src/main/java/cn/bunny/services/service/impl/MessageReceivedServiceImpl.java b/service/src/main/java/cn/bunny/services/service/impl/MessageReceivedServiceImpl.java index bfb6e00..01b3382 100644 --- a/service/src/main/java/cn/bunny/services/service/impl/MessageReceivedServiceImpl.java +++ b/service/src/main/java/cn/bunny/services/service/impl/MessageReceivedServiceImpl.java @@ -8,6 +8,7 @@ import cn.bunny.services.mapper.MessageReceivedMapper; import cn.bunny.services.service.MessageReceivedService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.util.List; @@ -20,6 +21,7 @@ import java.util.List; * @since 2024-10-31 */ @Service +@Transactional public class MessageReceivedServiceImpl extends ServiceImpl implements MessageReceivedService { /** @@ -45,5 +47,4 @@ public class MessageReceivedServiceImpl extends ServiceImpl impl List messageReceivedList = messageReceivedMapper.selectList(Wrappers.lambdaQuery().eq(MessageReceived::getReceivedUserId, BaseContext.getUserId())); List messageIds = messageReceivedList.stream().map(MessageReceived::getMessageId).toList(); + // 消息为空直接返回 + if (messageIds.isEmpty()) { + return PageResult.builder() + .list(new ArrayList<>()) + .pageNo(pageParams.getCurrent()) + .pageSize(pageParams.getSize()) + .total(pageParams.getTotal()) + .build(); + } + // 根据消息所有包含匹配当前消息Id的列表 IPage page = baseMapper.selectListByPageWithMessageUserDto(pageParams, dto, messageIds); List voList = page.getRecords().stream().map(messageVo -> { @@ -111,6 +124,7 @@ public class MessageServiceImpl extends ServiceImpl impl vo.setCover(cover); return vo; }).toList(); + return PageResult.builder() .list(voList) .pageNo(page.getCurrent()) @@ -121,15 +135,67 @@ public class MessageServiceImpl extends ServiceImpl impl /** * 根据消息id查询消息详情 + * 请求消息内容后标为已读 * * @param id 消息id * @return 消息详情 */ @Override public MessageVo getMessageDetailById(Long id) { + // 将消息设为已读 + Message message = new Message(); + message.setId(id); + message.setStatus(true); + updateById(message); + + // 返回详情内容给前端 return baseMapper.selectMessageVoById(id); } + /** + * 用户将消息标为已读 + * 将消息表中满足id条件全部标为已读 + * + * @param ids 消息id列表 + */ + @Override + public void updateUserMarkAsRead(List ids) { + // 判断ids是否为空 + if (ids.isEmpty()) { + throw new BunnyException(ResultCodeEnum.REQUEST_IS_EMPTY); + } + + // 更新表中消息状态 + List messageList = ids.stream().map(id -> { + Message message = new Message(); + message.setId(id); + message.setStatus(true); + return message; + }).toList(); + + updateBatchById(messageList); + } + + /** + * 用户删除消息 + * + * @param ids 消息Id列表 + */ + @Override + public void deleteUserMessageByIds(List ids) { + // 判断ids是否为空 + if (ids.isEmpty()) { + throw new BunnyException(ResultCodeEnum.REQUEST_IS_EMPTY); + } + + // 删除消息表中数据 + baseMapper.deleteBatchIdsWithPhysics(ids); + + // 根据当前用户id删除消息接受表中数据 + Long userId = BaseContext.getUserId(); + messageReceivedMapper.deleteBatchIdsByMessageIdsAndUserIdWithPhysics(ids, userId); + } + /** * 添加系统消息 * 判断发送消息的接收人是否为空,如果为空默认是所有用户都是接受者 diff --git a/service/src/main/java/cn/bunny/services/service/impl/RouterRoleServiceImpl.java b/service/src/main/java/cn/bunny/services/service/impl/RouterRoleServiceImpl.java index f3880ee..61b9a67 100644 --- a/service/src/main/java/cn/bunny/services/service/impl/RouterRoleServiceImpl.java +++ b/service/src/main/java/cn/bunny/services/service/impl/RouterRoleServiceImpl.java @@ -6,6 +6,7 @@ import cn.bunny.dao.entity.system.RouterRole; import cn.bunny.dao.pojo.result.ResultCodeEnum; import cn.bunny.services.mapper.RouterRoleMapper; import cn.bunny.services.service.RouterRoleService; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.stereotype.Service; @@ -79,4 +80,42 @@ public class RouterRoleServiceImpl extends ServiceImpl wrapper = new LambdaQueryWrapper<>(); + wrapper.in(RouterRole::getRoleId, dto.getRoleIds()) + .and(qw -> qw.in(RouterRole::getRouterId, dto.getRouterIds())); + List routerRoleList = list(wrapper); + + // 根据Id列表物理删除路由角色关系表 + List ids = routerRoleList.stream().map(RouterRole::getId).toList(); + if (!ids.isEmpty()) { + baseMapper.deleteBatchIdsWithPhysics(ids); + } + + // 保存分配好的角色信息 + List roleList = new ArrayList<>(); + for (Long roleId : dto.getRoleIds()) { + List list = dto.getRouterIds().stream().map(routerId -> { + RouterRole routerRole = new RouterRole(); + routerRole.setRouterId(routerId); + routerRole.setRoleId(roleId); + return routerRole; + }).toList(); + + roleList.addAll(list); + } + + saveBatch(roleList); + } } diff --git a/service/src/main/resources/mapper/MessageMapper.xml b/service/src/main/resources/mapper/MessageMapper.xml index 31c64e5..9fe8fff 100644 --- a/service/src/main/resources/mapper/MessageMapper.xml +++ b/service/src/main/resources/mapper/MessageMapper.xml @@ -74,20 +74,28 @@ @@ -100,13 +108,14 @@ LEFT JOIN sys_user update_user ON update_user.id = message.update_user LEFT JOIN sys_user send_user ON send_user.id = message.send_user_id WHERE message.id = #{id} + and message.is_deleted = 0 delete from sys_message - where id in + where is_deleted=0 and id in #{id} diff --git a/service/src/main/resources/mapper/MessageReceivedMapper.xml b/service/src/main/resources/mapper/MessageReceivedMapper.xml index 097a174..5d0083d 100644 --- a/service/src/main/resources/mapper/MessageReceivedMapper.xml +++ b/service/src/main/resources/mapper/MessageReceivedMapper.xml @@ -34,6 +34,16 @@ + + + delete + from sys_message_received where + received_user_id = #{userId} and received_user_id in + + #{id} + + + SELECT rr.router_id,