From 2ec2eb91b50913361b9d20388c0ad688eaede1f8 Mon Sep 17 00:00:00 2001 From: Theo <971366405@qq.com> Date: Mon, 2 Sep 2024 00:01:07 +0800 Subject: [PATCH] =?UTF-8?q?wip:=20=E9=80=9A=E7=9F=A5=E5=85=AC=E5=91=8A?= =?UTF-8?q?=E5=BC=80=E5=8F=91=E4=B8=B4=E6=97=B6=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 通知公告开发临时提交 --- .../boot/common/enums/NoticeTypeEnum.java | 31 +++++++++ .../youlai/boot/common/util/CommonUtil.java | 63 +++++++++++++++++++ .../core/security/model/SysUserDetails.java | 2 +- .../system/controller/UserController.java | 38 ++++++----- .../system/converter/NoticeConverter.java | 18 ++++++ .../boot/system/mapper/NoticeMapper.java | 3 +- .../youlai/boot/system/model/bo/NoticeBO.java | 46 ++++++++++++++ .../boot/system/model/entity/Notice.java | 4 -- .../boot/system/model/form/NoticeForm.java | 2 +- .../youlai/boot/system/model/vo/NoticeVO.java | 6 +- .../boot/system/service/UserService.java | 10 ++- .../service/impl/NoticeServiceImpl.java | 10 ++- .../system/service/impl/UserServiceImpl.java | 16 +++++ src/main/resources/mapper/NoticeMapper.xml | 2 +- 14 files changed, 222 insertions(+), 29 deletions(-) create mode 100644 src/main/java/com/youlai/boot/common/enums/NoticeTypeEnum.java create mode 100644 src/main/java/com/youlai/boot/common/util/CommonUtil.java create mode 100644 src/main/java/com/youlai/boot/system/model/bo/NoticeBO.java diff --git a/src/main/java/com/youlai/boot/common/enums/NoticeTypeEnum.java b/src/main/java/com/youlai/boot/common/enums/NoticeTypeEnum.java new file mode 100644 index 00000000..30b41f10 --- /dev/null +++ b/src/main/java/com/youlai/boot/common/enums/NoticeTypeEnum.java @@ -0,0 +1,31 @@ +package com.youlai.boot.common.enums; + +import com.youlai.boot.common.base.IBaseEnum; +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +/** + * 通知类型枚举 + * 1-系统通知 0-系统消息 + * + * @since 2024-9-1 17:33:06 + * @author Theo + */ +@Getter +@RequiredArgsConstructor +public enum NoticeTypeEnum implements IBaseEnum { + + SYSTEM_NOTICE(1, "系统通知"), + SYSTEM_MESSAGE (0, "系统消息"); + + @Getter + private Integer value; + + @Getter + private String label; + + NoticeTypeEnum(Integer value, String label) { + this.value = value; + this.label = label; + } +} diff --git a/src/main/java/com/youlai/boot/common/util/CommonUtil.java b/src/main/java/com/youlai/boot/common/util/CommonUtil.java new file mode 100644 index 00000000..055da5ae --- /dev/null +++ b/src/main/java/com/youlai/boot/common/util/CommonUtil.java @@ -0,0 +1,63 @@ +package com.youlai.boot.common.util; + +import com.youlai.boot.common.constant.SymbolConstant; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * 通用工具类 + * + * @author Theo + * @since 2024-9-1 23:42:33 + * @version 1.0.0 + */ +public class CommonUtil { + + private CommonUtil(){} + + + + /** + * 将List转换为字符串 + * + * @param list List + * @param separator 分隔符 + * @return 字符串 + */ + public static String listToStr(List list, String separator) { + return list.stream().collect(Collectors.joining(separator)); + } + + /** + * 将字符串转换为List + * + * @param list List + * @return List + */ + public static String listToStr(List list) { + return listToStr(list, SymbolConstant.COMMA); + } + + /** + * 将字符串转换为List + * + * @param str 字符串 + * @return List + */ + public static List strToList(String str) { + return strToList(str, SymbolConstant.COMMA); + } + + /** + * 将字符串转换为List + * + * @param str 字符串 + * @param separator 分隔符 + * @return List + */ + public static List strToList(String str, String separator) { + return List.of(str.split(separator)); + } + +} diff --git a/src/main/java/com/youlai/boot/core/security/model/SysUserDetails.java b/src/main/java/com/youlai/boot/core/security/model/SysUserDetails.java index 64ae9353..5fbf1f6c 100644 --- a/src/main/java/com/youlai/boot/core/security/model/SysUserDetails.java +++ b/src/main/java/com/youlai/boot/core/security/model/SysUserDetails.java @@ -51,7 +51,7 @@ public class SysUserDetails implements UserDetails { .map(role -> new SimpleGrantedAuthority("ROLE_" + role)) // 标识角色 .collect(Collectors.toSet()); } else { - authorities = Collections.EMPTY_SET; + authorities = Collections.emptySet(); } this.authorities = authorities; this.username = user.getUsername(); diff --git a/src/main/java/com/youlai/boot/system/controller/UserController.java b/src/main/java/com/youlai/boot/system/controller/UserController.java index 90586df2..0f2d2427 100644 --- a/src/main/java/com/youlai/boot/system/controller/UserController.java +++ b/src/main/java/com/youlai/boot/system/controller/UserController.java @@ -4,35 +4,35 @@ import com.alibaba.excel.EasyExcel; import com.alibaba.excel.ExcelWriter; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; -import com.youlai.boot.system.model.entity.User; -import com.youlai.boot.system.model.form.*; +import com.youlai.boot.common.annotation.Log; +import com.youlai.boot.common.annotation.RepeatSubmit; +import com.youlai.boot.common.enums.ContactType; +import com.youlai.boot.common.enums.LogModuleEnum; +import com.youlai.boot.common.model.Option; import com.youlai.boot.common.result.PageResult; import com.youlai.boot.common.result.Result; -import com.youlai.boot.common.enums.ContactType; -import com.youlai.boot.system.model.vo.UserProfileVO; -import com.youlai.boot.core.security.util.SecurityUtils; import com.youlai.boot.common.util.ExcelUtils; -import com.youlai.boot.common.enums.LogModuleEnum; -import com.youlai.boot.system.model.dto.UserImportDTO; -import com.youlai.boot.common.annotation.RepeatSubmit; +import com.youlai.boot.core.security.util.SecurityUtils; import com.youlai.boot.system.listener.UserImportListener; -import com.youlai.boot.system.model.query.UserPageQuery; import com.youlai.boot.system.model.dto.UserExportDTO; +import com.youlai.boot.system.model.dto.UserImportDTO; +import com.youlai.boot.system.model.entity.User; +import com.youlai.boot.system.model.form.*; +import com.youlai.boot.system.model.query.UserPageQuery; import com.youlai.boot.system.model.vo.UserInfoVO; import com.youlai.boot.system.model.vo.UserPageVO; -import com.youlai.boot.common.annotation.Log; +import com.youlai.boot.system.model.vo.UserProfileVO; import com.youlai.boot.system.service.UserService; +import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; -import io.swagger.v3.oas.annotations.Operation; +import jakarta.servlet.ServletOutputStream; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; - -import jakarta.servlet.ServletOutputStream; -import jakarta.servlet.http.HttpServletResponse; -import jakarta.validation.Valid; import org.springframework.web.multipart.MultipartFile; import java.io.File; @@ -228,6 +228,10 @@ public class UserController { } - - + @Operation(summary = "用户下拉选项") + @GetMapping("/options") + public Result>> listUserOptions() { + List> list = userService.listUserOptions(); + return Result.success(list); + } } diff --git a/src/main/java/com/youlai/boot/system/converter/NoticeConverter.java b/src/main/java/com/youlai/boot/system/converter/NoticeConverter.java index 605fd55a..ae493c0e 100644 --- a/src/main/java/com/youlai/boot/system/converter/NoticeConverter.java +++ b/src/main/java/com/youlai/boot/system/converter/NoticeConverter.java @@ -1,9 +1,13 @@ package com.youlai.boot.system.converter; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.youlai.boot.system.model.bo.NoticeBO; import com.youlai.boot.system.model.entity.Notice; import com.youlai.boot.system.model.form.NoticeForm; import com.youlai.boot.system.model.vo.NoticeVO; import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.Mappings; /** * 通知公告对象转换器 @@ -14,9 +18,23 @@ import org.mapstruct.Mapper; @Mapper(componentModel = "spring") public interface NoticeConverter{ + @Mappings({ + @Mapping(target = "tarIds", expression = "java(com.youlai.boot.common.util.CommonUtil.strToList(entity.getTarIds()))") + }) NoticeForm toForm(Notice entity); + @Mappings({ + @Mapping(target = "tarIds", expression = "java(com.youlai.boot.common.util.CommonUtil.listToStr(formData.getTarIds()))") + }) Notice toEntity(NoticeForm formData); NoticeVO toVO(Notice notice); + + Page toPageVo(Page noticePage); + + @Mappings({ + @Mapping(target = "noticeTypeLabel", expression = "java(com.youlai.boot.common.base.IBaseEnum.getLabelByValue(bo.getNoticeType(), com.youlai.boot.common.enums.NoticeTypeEnum.class))") + }) + NoticeVO toPageVo(NoticeBO bo); + } \ No newline at end of file diff --git a/src/main/java/com/youlai/boot/system/mapper/NoticeMapper.java b/src/main/java/com/youlai/boot/system/mapper/NoticeMapper.java index 5f61bff4..db146013 100644 --- a/src/main/java/com/youlai/boot/system/mapper/NoticeMapper.java +++ b/src/main/java/com/youlai/boot/system/mapper/NoticeMapper.java @@ -2,6 +2,7 @@ package com.youlai.boot.system.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.youlai.boot.system.model.bo.NoticeBO; import com.youlai.boot.system.model.entity.Notice; import com.youlai.boot.system.model.query.NoticeQuery; import com.youlai.boot.system.model.vo.NoticeVO; @@ -24,6 +25,6 @@ public interface NoticeMapper extends BaseMapper { * @param queryParams 查询参数 * @return 通知公告分页数据 */ - Page getNoticePage(Page page, @Param("queryParams") NoticeQuery queryParams); + Page getNoticePage(Page page, @Param("queryParams") NoticeQuery queryParams); } diff --git a/src/main/java/com/youlai/boot/system/model/bo/NoticeBO.java b/src/main/java/com/youlai/boot/system/model/bo/NoticeBO.java new file mode 100644 index 00000000..e6f9fbc8 --- /dev/null +++ b/src/main/java/com/youlai/boot/system/model/bo/NoticeBO.java @@ -0,0 +1,46 @@ +package com.youlai.boot.system.model.bo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serial; +import java.time.LocalDateTime; + +/** + * 通知公告业务对象 + * + * @author Theo + * @since 2024-09-01 10:31 + * @version 1.0.0 + */ +@Data +public class NoticeBO { + + @Serial + private static final long serialVersionUID = 1L; + + private Long id; + @Schema(description = "通知标题") + private String title; + + @Schema(description = "通知类型") + private Integer noticeType; + + @Schema(description = "发布人") + private String releaseBy; + + @Schema(description = "优先级(0-低 1-中 2-高)") + private Integer priority; + + @Schema(description = "目标类型(0-全体 1-指定)") + private Integer tarType; + + @Schema(description = "发布状态(0-未发布 1已发布 2已撤回)") + private Integer releaseStatus; + + @Schema(description = "发布时间") + private LocalDateTime releaseTime; + + @Schema(description = "撤回时间") + private LocalDateTime recallTime; +} diff --git a/src/main/java/com/youlai/boot/system/model/entity/Notice.java b/src/main/java/com/youlai/boot/system/model/entity/Notice.java index 2290dc96..d8f6a2d9 100644 --- a/src/main/java/com/youlai/boot/system/model/entity/Notice.java +++ b/src/main/java/com/youlai/boot/system/model/entity/Notice.java @@ -1,7 +1,5 @@ package com.youlai.boot.system.model.entity; -import com.baomidou.mybatisplus.annotation.FieldFill; -import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableLogic; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; @@ -68,12 +66,10 @@ public class Notice extends BaseEntity { /** * 创建人ID */ - @TableField(fill = FieldFill.INSERT) private Long createBy; /** * 更新人ID */ - @TableField(fill = FieldFill.UPDATE) private Long updateBy; /** * 逻辑删除标识(0-未删除 1-已删除) diff --git a/src/main/java/com/youlai/boot/system/model/form/NoticeForm.java b/src/main/java/com/youlai/boot/system/model/form/NoticeForm.java index e1560437..980517bd 100644 --- a/src/main/java/com/youlai/boot/system/model/form/NoticeForm.java +++ b/src/main/java/com/youlai/boot/system/model/form/NoticeForm.java @@ -50,6 +50,6 @@ public class NoticeForm implements Serializable { private Integer tarType; @Schema(description = "接收人ID集合") - private List userIds; + private List tarIds; } diff --git a/src/main/java/com/youlai/boot/system/model/vo/NoticeVO.java b/src/main/java/com/youlai/boot/system/model/vo/NoticeVO.java index 488c254b..12269e3e 100644 --- a/src/main/java/com/youlai/boot/system/model/vo/NoticeVO.java +++ b/src/main/java/com/youlai/boot/system/model/vo/NoticeVO.java @@ -28,7 +28,7 @@ public class NoticeVO implements Serializable { private String title; @Schema(description = "通知类型") - private Integer noticeType; + private String noticeTypeLabel; @Schema(description = "发布人") private String releaseBy; @@ -45,4 +45,8 @@ public class NoticeVO implements Serializable { @Schema(description = "发布时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime releaseTime; + + @Schema(description = "撤回时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime recallTime; } diff --git a/src/main/java/com/youlai/boot/system/service/UserService.java b/src/main/java/com/youlai/boot/system/service/UserService.java index 45eadd78..0cecd5a2 100644 --- a/src/main/java/com/youlai/boot/system/service/UserService.java +++ b/src/main/java/com/youlai/boot/system/service/UserService.java @@ -4,6 +4,7 @@ package com.youlai.boot.system.service; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; import com.youlai.boot.common.enums.ContactType; +import com.youlai.boot.common.model.Option; import com.youlai.boot.system.model.dto.UserAuthInfo; import com.youlai.boot.system.model.dto.UserExportDTO; import com.youlai.boot.system.model.entity.User; @@ -147,7 +148,14 @@ public interface UserService extends IService { * 修改当前用户邮箱 * * @param data 表单数据 - * @return + * @return {@link Boolean} 是否绑定成功 */ boolean bindEmail(EmailChangeForm data); + + /** + * 获取用户选项列表 + * + * @return {@link List>} 用户选项列表 + */ + List> listUserOptions(); } diff --git a/src/main/java/com/youlai/boot/system/service/impl/NoticeServiceImpl.java b/src/main/java/com/youlai/boot/system/service/impl/NoticeServiceImpl.java index 7ef81cf4..f13e1f33 100644 --- a/src/main/java/com/youlai/boot/system/service/impl/NoticeServiceImpl.java +++ b/src/main/java/com/youlai/boot/system/service/impl/NoticeServiceImpl.java @@ -12,6 +12,7 @@ import com.youlai.boot.core.security.util.SecurityUtils; import com.youlai.boot.platform.websocket.service.WebsocketService; import com.youlai.boot.system.converter.NoticeConverter; import com.youlai.boot.system.mapper.NoticeMapper; +import com.youlai.boot.system.model.bo.NoticeBO; import com.youlai.boot.system.model.entity.Notice; import com.youlai.boot.system.model.entity.NoticeStatus; import com.youlai.boot.system.model.entity.User; @@ -68,10 +69,11 @@ public class NoticeServiceImpl extends ServiceImpl impleme */ @Override public IPage getNoticePage(NoticeQuery queryParams) { - return this.baseMapper.getNoticePage( + Page noticePage = this.baseMapper.getNoticePage( new Page<>(queryParams.getPageNum(), queryParams.getPageSize()), queryParams ); + return noticeConverter.toPageVo(noticePage); } /** @@ -95,6 +97,8 @@ public class NoticeServiceImpl extends ServiceImpl impleme @Override public boolean saveNotice(NoticeForm formData) { Notice entity = noticeConverter.toEntity(formData); + entity.setReleaseStatus(0); + entity.setCreateBy(SecurityUtils.getUserId()); if (entity.getTarType() == 1) { Assert.notBlank(entity.getTarIds(), "指定用户不能为空"); } @@ -111,6 +115,7 @@ public class NoticeServiceImpl extends ServiceImpl impleme @Override public boolean updateNotice(Long id, NoticeForm formData) { Notice entity = noticeConverter.toEntity(formData); + entity.setUpdateBy(SecurityUtils.getUserId()); if (entity.getTarType() == 1) { Assert.notBlank(entity.getTarIds(), "指定用户不能为空"); } @@ -150,8 +155,9 @@ public class NoticeServiceImpl extends ServiceImpl impleme public boolean releaseNotice(Long id) { Notice notice = this.getById(id); Assert.notNull(notice, "通知公告不存在"); - Assert.isTrue(notice.getReleaseStatus() == 0, "通知公告已发布"); + Assert.isTrue(notice.getReleaseStatus() != 1, "通知公告已发布"); notice.setReleaseStatus(1); + notice.setReleaseBy(SecurityUtils.getUserId()); notice.setReleaseTime(LocalDateTime.now()); this.updateById(notice); //发布通知公告的同时,需要将通知公告发送给目标用户 diff --git a/src/main/java/com/youlai/boot/system/service/impl/UserServiceImpl.java b/src/main/java/com/youlai/boot/system/service/impl/UserServiceImpl.java index 7cc5f3c2..e9642a50 100644 --- a/src/main/java/com/youlai/boot/system/service/impl/UserServiceImpl.java +++ b/src/main/java/com/youlai/boot/system/service/impl/UserServiceImpl.java @@ -11,6 +11,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.youlai.boot.common.constant.RedisConstants; import com.youlai.boot.common.constant.SystemConstants; import com.youlai.boot.common.enums.ContactType; +import com.youlai.boot.common.model.Option; import com.youlai.boot.platform.mail.service.MailService; import com.youlai.boot.platform.sms.service.SmsService; import com.youlai.boot.system.model.entity.User; @@ -39,6 +40,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.Arrays; +import java.util.Collections; import java.util.List; import java.util.Set; import java.util.concurrent.TimeUnit; @@ -419,4 +421,18 @@ public class UserServiceImpl extends ServiceImpl implements Us .set(User::getEmail, email) ); } + + /** + * 获取用户选项列表 + * + * @return {@link List>} 用户选项列表 + */ + @Override + public List> listUserOptions() { + List list = this.list(); + if (CollectionUtil.isNotEmpty(list)) { + return list.stream().map(user -> new Option<>(user.getId().toString(), user.getNickname())).collect(Collectors.toList()); + } + return Collections.emptyList(); + } } diff --git a/src/main/resources/mapper/NoticeMapper.xml b/src/main/resources/mapper/NoticeMapper.xml index e82544e1..08fec56f 100644 --- a/src/main/resources/mapper/NoticeMapper.xml +++ b/src/main/resources/mapper/NoticeMapper.xml @@ -3,7 +3,7 @@ - SELECT sn.id, sn.title,