Compare commits

...

4 Commits

40 changed files with 494 additions and 540 deletions

View File

@ -0,0 +1,130 @@
package com.zsc.edu.gateway.common.util;
import java.util.*;
import java.util.function.*;
import java.util.stream.Collectors;
import java.util.function.BiConsumer;
import java.util.function.BiFunction;
import java.util.function.Consumer;
import java.util.function.Function;
/**
* @Description: 树操作方法工具类
* @Copyright: Copyright (c) 赵侠客
* @Date: 2024-07-22 10:42
* @Version: 1.0
*/
public class TreeUtil {
/**
* 将list合成树
*
* @param list 需要合成树的List
* @param rootCheck 判断E中为根节点的条件x->x.getPId()==-1L , x->x.getParentId()==null,x->x.getParentMenuId()==0
* @param parentCheck 判断E中为父节点条件(x,y)->x.getId().equals(y.getPId())
* @param setSubChildren E中设置下级数据方法Menu::setSubMenus
* @param <E> 泛型实体对象
* @return 合成好的树
*/
public static <E> List<E> makeTree(List<E> list, Predicate<E> rootCheck, BiFunction<E, E, Boolean> parentCheck, BiConsumer<E, List<E>> setSubChildren) {
return list.stream().filter(rootCheck).peek(x -> setSubChildren.accept(x, makeChildren(x, list, parentCheck, setSubChildren))).collect(Collectors.toList());
}
/**
* 将树打平成tree
*
* @param tree 需要打平的树
* @param getSubChildren 设置下级数据方法Menu::getSubMenus,x->x.setSubMenus(null)
* @param setSubChildren 将下级数据置空方法x->x.setSubMenus(null)
* @param <E> 泛型实体对象
* @return 打平后的数据
*/
public static <E> List<E> flat(List<E> tree, Function<E, List<E>> getSubChildren, Consumer<E> setSubChildren) {
List<E> res = new ArrayList<>();
forPostOrder(tree, item -> {
setSubChildren.accept(item);
res.add(item);
}, getSubChildren);
return res;
}
/**
* 前序遍历
*
* @param tree 需要遍历的树
* @param consumer 遍历后对单个元素的处理方法x-> System.out.println(x) System.out::println打印元素
* @param setSubChildren 设置下级数据方法Menu::getSubMenus,x->x.setSubMenus(null)
* @param <E> 泛型实体对象
*/
public static <E> void forPreOrder(List<E> tree, Consumer<E> consumer, Function<E, List<E>> setSubChildren) {
for (E l : tree) {
consumer.accept(l);
List<E> es = setSubChildren.apply(l);
if (es != null && es.size() > 0) {
forPreOrder(es, consumer, setSubChildren);
}
}
}
/**
* 层序遍历
*
* @param tree 需要遍历的树
* @param consumer 遍历后对单个元素的处理方法x-> System.out.println(x) System.out::println打印元素
* @param setSubChildren 设置下级数据方法Menu::getSubMenus,x->x.setSubMenus(null)
* @param <E> 泛型实体对象
*/
public static <E> void forLevelOrder(List<E> tree, Consumer<E> consumer, Function<E, List<E>> setSubChildren) {
Queue<E> queue = new LinkedList<>(tree);
while (!queue.isEmpty()) {
E item = queue.poll();
consumer.accept(item);
List<E> childList = setSubChildren.apply(item);
if (childList != null && !childList.isEmpty()) {
queue.addAll(childList);
}
}
}
/**
* 后序遍历
*
* @param tree 需要遍历的树
* @param consumer 遍历后对单个元素的处理方法x-> System.out.println(x) System.out::println打印元素
* @param setSubChildren 设置下级数据方法Menu::getSubMenus,x->x.setSubMenus(null)
* @param <E> 泛型实体对象
*/
public static <E> void forPostOrder(List<E> tree, Consumer<E> consumer, Function<E, List<E>> setSubChildren) {
for (E item : tree) {
List<E> childList = setSubChildren.apply(item);
if (childList != null && !childList.isEmpty()) {
forPostOrder(childList, consumer, setSubChildren);
}
consumer.accept(item);
}
}
/**
* 对树所有子节点按comparator排序
*
* @param tree 需要排序的树
* @param comparator 排序规则ComparatorComparator.comparing(MenuVo::getRank)按Rank正序 ,(x,y)->y.getRank().compareTo(x.getRank())按Rank倒序
* @param getChildren 获取下级数据方法MenuVo::getSubMenus
* @param <E> 泛型实体对象
* @return 排序好的树
*/
public static <E> List<E> sort(List<E> tree, Comparator<? super E> comparator, Function<E, List<E>> getChildren) {
for (E item : tree) {
List<E> childList = getChildren.apply(item);
if (childList != null && !childList.isEmpty()) {
sort(childList, comparator, getChildren);
}
}
tree.sort(comparator);
return tree;
}
private static <E> List<E> makeChildren(E parent, List<E> allData, BiFunction<E, E, Boolean> parentCheck, BiConsumer<E, List<E>> children) {
return allData.stream().filter(x -> parentCheck.apply(parent, x)).peek(x -> children.accept(x, makeChildren(x, allData, parentCheck, children))).collect(Collectors.toList());
}
}

View File

@ -65,10 +65,11 @@ public class ApiExceptionHandler {
return new ResponseEntity<>(objectMapper.writeValueAsString(Map.of("msg", ex.getMessage())), HttpStatus.INTERNAL_SERVER_ERROR); return new ResponseEntity<>(objectMapper.writeValueAsString(Map.of("msg", ex.getMessage())), HttpStatus.INTERNAL_SERVER_ERROR);
} }
@ExceptionHandler(value = {Exception.class}) //TODO 跟全局security 冲突
public ResponseEntity<Object> handleException(Exception ex) throws JsonProcessingException { // @ExceptionHandler(value = {Exception.class})
log.error("Exception: {}", objectMapper.writeValueAsString(Map.of("msg", ex.getMessage()))); // public ResponseEntity<Object> handleException(Exception ex) throws JsonProcessingException {
return new ResponseEntity<>(objectMapper.writeValueAsString(Map.of("msg", ex.getMessage())), HttpStatus.INTERNAL_SERVER_ERROR); // log.error("Exception: {}", objectMapper.writeValueAsString(Map.of("msg", ex.getMessage())));
} // return new ResponseEntity<>(objectMapper.writeValueAsString(Map.of("msg", ex.getMessage())), HttpStatus.INTERNAL_SERVER_ERROR);
// }
} }

View File

@ -1,69 +0,0 @@
package com.zsc.edu.gateway.framework;
import com.zsc.edu.gateway.modules.system.entity.Dept;
import com.zsc.edu.gateway.modules.system.entity.User;
import com.zsc.edu.gateway.modules.system.vo.DeptTree;
import com.zsc.edu.gateway.modules.system.vo.UserTree;
import org.springframework.stereotype.Component;
import java.util.*;
import java.util.function.BiConsumer;
import java.util.function.BiFunction;
import java.util.function.Predicate;
import java.util.stream.Collectors;
/**
* @author zhuang
*/
@Component
public class DeptTreeUtil {
public static <E> List<E> makeTree(List<E> list, Predicate<E> rootCheck, BiFunction<E, E, Boolean> parentCheck, BiConsumer<E, List<E>> setSubChildren) {
return list.stream()
.filter(rootCheck)
.peek(x -> setSubChildren.accept(x, makeChildren(x, list, parentCheck, setSubChildren)))
.collect(Collectors.toList());
}
private static <E> List<E> makeChildren(E parent, List<E> allData, BiFunction<E, E, Boolean> parentCheck, BiConsumer<E, List<E>> setSubChildren) {
return allData.stream()
.filter(x -> parentCheck.apply(parent, x))
.peek(x -> setSubChildren.accept(x, makeChildren(x, allData, parentCheck, setSubChildren)))
.collect(Collectors.toList());
}
public static List<DeptTree> buildDeptTree(List<Dept> depots, Map<Long, List<User>> userMap) {
List<DeptTree> deptTrees = depots.stream()
.map(DeptTreeUtil::convertToDeptTree)
.collect(Collectors.toList());
deptTrees.forEach(deptTree -> {
List<User> users = userMap.getOrDefault(deptTree.getId(), Collections.emptyList());
deptTree.setMembers(users.stream()
.map(DeptTreeUtil::convertToUserTree)
.collect(Collectors.toList()));
});
return makeTree(
deptTrees,
deptTree -> deptTree.getPid() == null || deptTree.getPid() == 0L,
(parent, child) -> parent.getId().equals(child.getPid()),
DeptTree::setChildren
);
}
private static DeptTree convertToDeptTree(Dept dept) {
DeptTree deptTree = new DeptTree();
deptTree.setId(dept.getId());
deptTree.setPid(dept.getPid());
deptTree.setName(dept.getName());
return deptTree;
}
private static UserTree convertToUserTree(User user) {
UserTree userTree = new UserTree();
userTree.setId(user.getId());
userTree.setName(user.getName());
return userTree;
}
}

View File

@ -1,21 +0,0 @@
package com.zsc.edu.gateway.framework;
import org.springframework.http.HttpStatus;
import java.util.Calendar;
import java.util.LinkedHashMap;
import java.util.Map;
/**
* @author harry yao
*/
public class JsonExceptionUtil {
public static Map<String, Object> jsonExceptionResult(HttpStatus code, String message, String path) {
Map<String, Object> exceptionMap = new LinkedHashMap<>();
exceptionMap.put("timestamp", Calendar.getInstance().getTime());
exceptionMap.put("message", message);
exceptionMap.put("path", path);
exceptionMap.put("code", code.value());
return exceptionMap;
}
}

View File

@ -95,11 +95,11 @@ public class EmailSender {
} else { } else {
helper.setText(message.content); helper.setText(message.content);
} }
if (Objects.nonNull(message.attachments)) { // if (Objects.nonNull(message.attachments)) {
for (Attachment attachment : message.attachments) { // for (Attachment attachment : message.attachments) {
helper.addAttachment(attachment.fileName, attachmentService.loadAsResource(attachment.id), attachment.mimeType); // helper.addAttachment(attachment.fileName, attachmentService.loadAsResource(attachment.id), attachment.mimeType);
} // }
} // }
sender.send(mimeMessage); sender.send(mimeMessage);
} catch (MessagingException | IOException | TemplateException e) { } catch (MessagingException | IOException | TemplateException e) {
e.printStackTrace(); e.printStackTrace();

View File

@ -8,6 +8,7 @@ import org.springframework.http.HttpMethod;
import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.ProviderManager; import org.springframework.security.authentication.ProviderManager;
import org.springframework.security.authentication.dao.DaoAuthenticationProvider; import org.springframework.security.authentication.dao.DaoAuthenticationProvider;
import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.core.session.SessionRegistry; import org.springframework.security.core.session.SessionRegistry;
import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.core.userdetails.UserDetailsService;
@ -23,6 +24,8 @@ import javax.sql.DataSource;
* @author harry_yao * @author harry_yao
*/ */
@AllArgsConstructor @AllArgsConstructor
@EnableMethodSecurity
//TODO 加入全局注解会报错
@Configuration @Configuration
public class SpringSecurityConfig { public class SpringSecurityConfig {

View File

@ -6,7 +6,6 @@ import com.zsc.edu.gateway.modules.attachment.entity.Attachment;
/** /**
* @author ftz * @author ftz
* 创建时间:29/1/2024 上午9:55 * 创建时间:29/1/2024 上午9:55
* 描述: TODO
*/ */
public interface AttachmentRepository extends BaseMapper<Attachment>{ public interface AttachmentRepository extends BaseMapper<Attachment>{
} }

View File

@ -7,6 +7,7 @@ import lombok.Data;
*/ */
@Data @Data
public class AttachmentVo { public class AttachmentVo {
public Long attachmentId;
public String fileName; public String fileName;
public String url; public String url;
} }

View File

@ -34,7 +34,7 @@ public class BulletinController {
* @return 公告 * @return 公告
*/ */
@GetMapping("/self/{id}") @GetMapping("/self/{id}")
public List<BulletinVo> selfDetail(@AuthenticationPrincipal UserDetailsImpl userDetails, @PathVariable("id") Long id) { public BulletinVo selfDetail(@AuthenticationPrincipal UserDetailsImpl userDetails, @PathVariable("id") Long id) {
return service.detail(userDetails,id, Bulletin.State.publish); return service.detail(userDetails,id, Bulletin.State.publish);
} }
@ -45,10 +45,9 @@ public class BulletinController {
* @return 分页数据 * @return 分页数据
*/ */
@GetMapping("/self") @GetMapping("/self")
public IPage<BulletinVo> getBulletins( BulletinQuery query) { public IPage<BulletinVo> getBulletins(Page<BulletinVo> pageParam, BulletinQuery query) {
query.setState(Bulletin.State.publish); query.setState(Bulletin.State.publish);
Page<BulletinVo> page = new Page<>(query.getPageNum(), query.getPageSize()); return service.selectPageByConditions(pageParam, query);
return service.selectPageByConditions(page, query);
} }
/** /**
@ -59,7 +58,7 @@ public class BulletinController {
*/ */
@GetMapping("/{id}") @GetMapping("/{id}")
@PreAuthorize("hasAuthority('BULLETIN_QUERY')") @PreAuthorize("hasAuthority('BULLETIN_QUERY')")
public List<BulletinVo> detail(@AuthenticationPrincipal UserDetailsImpl userDetails, @PathVariable("id") Long id) { public BulletinVo detail(@AuthenticationPrincipal UserDetailsImpl userDetails, @PathVariable("id") Long id) {
return service.detail(userDetails,id, null); return service.detail(userDetails,id, null);
} }
@ -153,12 +152,4 @@ public class BulletinController {
return service.removeById(id); return service.removeById(id);
} }
/**
*为公告添加附件
*/
@PostMapping("/{id}/add")
@PreAuthorize("hasAuthority('BULLETIN_CREATE')")
public Boolean insertInto(@PathVariable Long id,@RequestBody Set<String> attachments){
return service.insertInto(id, attachments);
}
} }

View File

@ -4,9 +4,10 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.zsc.edu.gateway.framework.security.UserDetailsImpl; import com.zsc.edu.gateway.framework.security.UserDetailsImpl;
import com.zsc.edu.gateway.modules.notice.dto.UserMessageDto; import com.zsc.edu.gateway.modules.notice.dto.UserMessageDto;
import com.zsc.edu.gateway.modules.notice.entity.MessageSetting; import com.zsc.edu.gateway.modules.notice.query.AdminMessageQuery;
import com.zsc.edu.gateway.modules.notice.query.UserMessageQuery; import com.zsc.edu.gateway.modules.notice.query.UserMessageQuery;
import com.zsc.edu.gateway.modules.notice.service.UserMessageService; import com.zsc.edu.gateway.modules.notice.service.UserMessageService;
import com.zsc.edu.gateway.modules.notice.vo.AdminMessageVo;
import com.zsc.edu.gateway.modules.notice.vo.UserMessageVo; import com.zsc.edu.gateway.modules.notice.vo.UserMessageVo;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.access.prepost.PreAuthorize;
@ -47,11 +48,10 @@ public class UserMessageController {
* @return 分页数据 * @return 分页数据
*/ */
@GetMapping("/self") @GetMapping("/self")
public IPage<UserMessageVo> selfPage(@AuthenticationPrincipal UserDetailsImpl userDetails, UserMessageQuery query) { public IPage<UserMessageVo> selfPage(Page<UserMessageVo> pageParam, @AuthenticationPrincipal UserDetailsImpl userDetails, UserMessageQuery query) {
query.userId = userDetails.id; query.userId = userDetails.id;
query.name = null; query.name = null;
Page<UserMessageVo> page = new Page<>(query.getPageNum(), query.getPageSize()); return service.page(pageParam, query);
return service.page(page, query);
} }
/** /**
@ -80,14 +80,13 @@ public class UserMessageController {
/** /**
* 管理查询消息详情 * 管理查询消息详情
* *
* @param userId 用户ID
* @param messageId 消息ID * @param messageId 消息ID
* @return 用户消息详情 * @return 用户消息详情
*/ */
@GetMapping("/{userId}/{messageId}") @GetMapping("/{userId}/{messageId}")
@PreAuthorize("hasAuthority('MESSAGE_QUERY')") @PreAuthorize("hasAuthority('MESSAGE_QUERY')")
public UserMessageVo detail(@PathVariable("userId") Long userId, @PathVariable("messageId") Long messageId) { public UserMessageVo detail(@PathVariable("userId") Long userId, @PathVariable("messageId") Long messageId) {
return service.detail(messageId, userId); return service.detail(userId, messageId);
} }
/** /**
@ -98,9 +97,8 @@ public class UserMessageController {
*/ */
@GetMapping @GetMapping
@PreAuthorize("hasAuthority('MESSAGE_QUERY')") @PreAuthorize("hasAuthority('MESSAGE_QUERY')")
public IPage<UserMessageVo> page(UserMessageQuery query) { public IPage<AdminMessageVo> page(Page<UserMessageVo> page, AdminMessageQuery query) {
Page<UserMessageVo> page = new Page<>(query.getPageNum(), query.getPageSize()); return service.getAdminMessagePage(page, query);
return service.page(page, query);
} }
/** /**
@ -114,41 +112,4 @@ public class UserMessageController {
public Boolean create(@RequestBody UserMessageDto dto) { public Boolean create(@RequestBody UserMessageDto dto) {
return service.createByAdmin(dto); return service.createByAdmin(dto);
} }
/**
* 管理员为消息添加附件
*
* @param messageId 消息ID
* @param attachmentIds 附件ID集合
* @return 消息列表
*/
@PostMapping("/attachment/{messageId}")
@PreAuthorize("hasAuthority('MESSAGE_CREATE')")
public Boolean insertInto(@PathVariable("messageId") Long messageId, @RequestBody List<String> attachmentIds) {
return service.insertInto(messageId, attachmentIds);
}
/**
* 获取消息推送方式
*
* @return 消息推送方式列表
*/
@GetMapping("/setting")
@PreAuthorize("hasAuthority('MESSAGE_SETTING')")
public List<MessageSetting> getSetting() {
return service.getSetting();
}
/**
* 设置消息推送方式
*
* @param settings 表单数据
* @return 消息设置
*/
@PatchMapping("/setting")
@PreAuthorize("hasAuthority('MESSAGE_SETTING')")
public List<MessageSetting> saveSetting(@RequestBody List<MessageSetting> settings) {
return service.saveSetting(settings);
}
} }

View File

@ -25,7 +25,7 @@ public class BulletinDto {
/** /**
* 是否置顶 * 是否置顶
*/ */
public boolean top; public Boolean top;
/** /**
* 内容 * 内容
@ -36,9 +36,9 @@ public class BulletinDto {
* 备注 * 备注
*/ */
public String remark; public String remark;
//
// /** /**
// * 附件ID集合 * 附件ID集合
// */ */
// private List<String> attachmentIds; private List<String> attachmentIds;
} }

View File

@ -30,7 +30,7 @@ public class Message extends BaseEntity {
/** /**
* 是否系统生成 * 是否系统生成
*/ */
public Boolean system; public Boolean system = false;
/** /**
* 是否需要发送邮件 * 是否需要发送邮件
@ -57,9 +57,4 @@ public class Message extends BaseEntity {
*/ */
public String content; public String content;
/**
* 附件
*/
public List<Attachment> attachments;
} }

View File

@ -1,57 +0,0 @@
package com.zsc.edu.gateway.modules.notice.entity;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import java.util.Objects;
/**
* 消息设置
*
* @author harry_yao
*/
@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
@TableName("sys_message_setting")
public class MessageSetting {
/**
* 消息类型
*/
@TableId
public Long id;
/**
* 是否发送邮件
*/
public Boolean email;
/**
* 是否发送短信
*/
public Boolean sms;
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
MessageSetting that = (MessageSetting) o;
return Objects.equals(id, that.id);
}
@Override
public int hashCode() {
return id.hashCode();
}
}

View File

@ -1,15 +0,0 @@
package com.zsc.edu.gateway.modules.notice.mapper;
import com.zsc.edu.gateway.common.mapstruct.BaseMapper;
import com.zsc.edu.gateway.modules.notice.dto.BulletinAttachmentDto;
import com.zsc.edu.gateway.modules.notice.entity.BulletinAttachment;
import org.mapstruct.Mapper;
import org.mapstruct.ReportingPolicy;
/**
* @author zhuang
*/
@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface BulletinAttachmentMapper extends BaseMapper<BulletinAttachmentDto, BulletinAttachment> {
}

View File

@ -57,16 +57,13 @@ public class UserMessageQuery {
/** /**
* 消息创建时间区间起始 * 消息创建时间区间起始
*/ */
@DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
public LocalDateTime createAtBegin; public LocalDateTime createAtBegin;
/** /**
* 消息创建时间区间终止 * 消息创建时间区间终止
*/ */
@DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
public LocalDateTime createAtEnd; public LocalDateTime createAtEnd;
private Integer pageNum = 1;
private Integer pageSize = 10;
} }

View File

@ -21,7 +21,7 @@ import java.util.List;
public interface BulletinRepository extends BaseMapper<Bulletin> { public interface BulletinRepository extends BaseMapper<Bulletin> {
List<BulletinVo> selectByBulletinId(@Param("bulletinId") Long bulletinId); BulletinVo selectByBulletinId(@Param("bulletinId") Long bulletinId);
IPage<BulletinVo> selectPageByConditions(Page<BulletinVo> page, @Param("query") BulletinQuery query); IPage<BulletinVo> selectPageByConditions(Page<BulletinVo> page, @Param("query") BulletinQuery query);
} }

View File

@ -1,18 +0,0 @@
package com.zsc.edu.gateway.modules.notice.repo;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.zsc.edu.gateway.modules.notice.entity.MessageSetting;
import org.apache.ibatis.annotations.Select;
import java.util.List;
/**
* 消息设置Repo
*
* @author harry_yao
*/
public interface MessageSettingRepository extends BaseMapper<MessageSetting> {
@Select("select * from sys_message_setting")
List<MessageSetting> findAll();
}

View File

@ -4,9 +4,9 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.zsc.edu.gateway.modules.notice.entity.UserMessage; import com.zsc.edu.gateway.modules.notice.entity.UserMessage;
import com.zsc.edu.gateway.modules.notice.query.BulletinQuery; import com.zsc.edu.gateway.modules.notice.query.AdminMessageQuery;
import com.zsc.edu.gateway.modules.notice.query.UserMessageQuery; import com.zsc.edu.gateway.modules.notice.query.UserMessageQuery;
import com.zsc.edu.gateway.modules.notice.vo.BulletinVo; import com.zsc.edu.gateway.modules.notice.vo.AdminMessageVo;
import com.zsc.edu.gateway.modules.notice.vo.UserMessageVo; import com.zsc.edu.gateway.modules.notice.vo.UserMessageVo;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
@ -19,5 +19,7 @@ public interface UserMessageRepository extends BaseMapper<UserMessage> {
UserMessageVo selectByMessageIdAndUserId(@Param("messageId") Long messageId, @Param("userId") Long userId); UserMessageVo selectByMessageIdAndUserId(@Param("messageId") Long messageId, @Param("userId") Long userId);
IPage<UserMessageVo> query(Page<UserMessageVo> page, @Param("query") UserMessageQuery query); IPage<UserMessageVo> page(Page<UserMessageVo> page, @Param("query") UserMessageQuery query);
IPage<AdminMessageVo> pageAdmin(Page<UserMessageVo> page, @Param("query") AdminMessageQuery query);
} }

View File

@ -5,7 +5,6 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import com.zsc.edu.gateway.framework.security.UserDetailsImpl; import com.zsc.edu.gateway.framework.security.UserDetailsImpl;
import com.zsc.edu.gateway.modules.notice.dto.BulletinDto; import com.zsc.edu.gateway.modules.notice.dto.BulletinDto;
import com.zsc.edu.gateway.modules.notice.dto.PageDto;
import com.zsc.edu.gateway.modules.notice.entity.Bulletin; import com.zsc.edu.gateway.modules.notice.entity.Bulletin;
import com.zsc.edu.gateway.modules.notice.query.BulletinQuery; import com.zsc.edu.gateway.modules.notice.query.BulletinQuery;
import com.zsc.edu.gateway.modules.notice.vo.BulletinVo; import com.zsc.edu.gateway.modules.notice.vo.BulletinVo;
@ -21,7 +20,7 @@ import java.util.Set;
public interface BulletinService extends IService<Bulletin> { public interface BulletinService extends IService<Bulletin> {
List<BulletinVo> detail(UserDetailsImpl userDetails, Long id, Bulletin.State state); BulletinVo detail(UserDetailsImpl userDetails, Long id, Bulletin.State state);
Bulletin create(UserDetailsImpl userDetails, BulletinDto dto); Bulletin create(UserDetailsImpl userDetails, BulletinDto dto);
@ -33,7 +32,5 @@ public interface BulletinService extends IService<Bulletin> {
Boolean close(UserDetailsImpl userDetails,Long id); Boolean close(UserDetailsImpl userDetails,Long id);
Boolean insertInto(Long bulletinId, Set<String> attachmentIds);
IPage<BulletinVo> selectPageByConditions(Page<BulletinVo> page, BulletinQuery query); IPage<BulletinVo> selectPageByConditions(Page<BulletinVo> page, BulletinQuery query);
} }

View File

@ -5,18 +5,13 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import com.zsc.edu.gateway.framework.security.UserDetailsImpl; import com.zsc.edu.gateway.framework.security.UserDetailsImpl;
import com.zsc.edu.gateway.modules.notice.dto.UserMessageDto; import com.zsc.edu.gateway.modules.notice.dto.UserMessageDto;
import com.zsc.edu.gateway.modules.notice.entity.MessagePayload;
import com.zsc.edu.gateway.modules.notice.entity.MessageSetting;
import com.zsc.edu.gateway.modules.notice.entity.UserMessage; import com.zsc.edu.gateway.modules.notice.entity.UserMessage;
import com.zsc.edu.gateway.modules.notice.query.BulletinQuery; import com.zsc.edu.gateway.modules.notice.query.AdminMessageQuery;
import com.zsc.edu.gateway.modules.notice.query.UserMessageQuery; import com.zsc.edu.gateway.modules.notice.query.UserMessageQuery;
import com.zsc.edu.gateway.modules.notice.vo.BulletinVo; import com.zsc.edu.gateway.modules.notice.vo.AdminMessageVo;
import com.zsc.edu.gateway.modules.notice.vo.UserMessageVo; import com.zsc.edu.gateway.modules.notice.vo.UserMessageVo;
import com.zsc.edu.gateway.modules.system.entity.User;
import org.springframework.transaction.annotation.Transactional;
import java.util.List; import java.util.List;
import java.util.Set;
/** /**
* 用户消息Service * 用户消息Service
@ -29,17 +24,12 @@ public interface UserMessageService extends IService<UserMessage> {
UserMessageVo detail(Long messageId, Long userId); UserMessageVo detail(Long messageId, Long userId);
Boolean insertInto(Long messageId, List<String> attachmentIds);
List<MessageSetting> getSetting();
IPage<UserMessageVo> page(Page<UserMessageVo> page, UserMessageQuery query); IPage<UserMessageVo> page(Page<UserMessageVo> page, UserMessageQuery query);
Integer countUnread(UserDetailsImpl userDetails); Integer countUnread(UserDetailsImpl userDetails);
Integer markAsRead(UserDetailsImpl userDetails, List<Long> messageIds); Integer markAsRead(UserDetailsImpl userDetails, List<Long> messageIds);
@Transactional
List<MessageSetting> saveSetting(List<MessageSetting> settings);
IPage<AdminMessageVo> getAdminMessagePage(Page<UserMessageVo> page, AdminMessageQuery query);
} }

View File

@ -47,21 +47,29 @@ public class BulletinServiceImpl extends ServiceImpl<BulletinRepository, Bulleti
* @return 公告详情 * @return 公告详情
*/ */
@Override @Override
public List<BulletinVo> detail(UserDetailsImpl userDetails, Long id, Bulletin.State state) { public BulletinVo detail(UserDetailsImpl userDetails, Long id, Bulletin.State state) {
List<BulletinVo> bulletins = repo.selectByBulletinId(id); // List<BulletinVo> bulletins = repo.selectByBulletinId(id);
if (bulletins.isEmpty()) { // if (bulletins.isEmpty()) {
return Collections.emptyList(); // return Collections.emptyList();
// }
// for (BulletinVo bulletin : bulletins) {
// if (state != null) {
// bulletin.getState().checkStatus(state);
// }
// bulletin.setEditUsername(userRepository.selectNameById(bulletin.getEditUserId()));
// bulletin.setPublishUsername(userRepository.selectNameById(bulletin.getPublishUserId()));
// bulletin.setCloseUsername(userRepository.selectNameById(bulletin.getCloseUserId()));
// }
//
// return bulletins;
BulletinVo bulletinVo = repo.selectByBulletinId(id);
if (state != null) {
bulletinVo.getState().checkStatus(state);
} }
for (BulletinVo bulletin : bulletins) { bulletinVo.setEditUsername(userRepository.selectNameById(bulletinVo.getEditUserId()));
if (state != null) { bulletinVo.setPublishUsername(userRepository.selectNameById(bulletinVo.getPublishUserId()));
bulletin.getState().checkStatus(state); bulletinVo.setCloseUsername(userRepository.selectNameById(bulletinVo.getCloseUserId()));
} return bulletinVo;
bulletin.setEditUsername(userRepository.selectNameById(bulletin.getEditUserId()));
bulletin.setPublishUsername(userRepository.selectNameById(bulletin.getPublishUserId()));
bulletin.setCloseUsername(userRepository.selectNameById(bulletin.getCloseUserId()));
}
return bulletins;
} }
/** /**
* 新建公告 * 新建公告
@ -82,6 +90,9 @@ public class BulletinServiceImpl extends ServiceImpl<BulletinRepository, Bulleti
bulletin.setCreateBy(userDetails.getName()); bulletin.setCreateBy(userDetails.getName());
bulletin.setEditUserId(userDetails.getId()); bulletin.setEditUserId(userDetails.getId());
save(bulletin); save(bulletin);
if (dto.getAttachmentIds() != null) {
insertInto(bulletin.getId(), dto.getAttachmentIds());
}
return bulletin; return bulletin;
} }
/** /**
@ -183,15 +194,13 @@ public class BulletinServiceImpl extends ServiceImpl<BulletinRepository, Bulleti
* @param attachmentIds attachments * @param attachmentIds attachments
* @return true * @return true
*/ */
@Override public Boolean insertInto(Long bulletinId, List<String> attachmentIds) {
public Boolean insertInto(Long bulletinId, Set<String> attachmentIds) {
List<BulletinAttachment> bulletinAttachments = attachmentIds.stream() List<BulletinAttachment> bulletinAttachments = attachmentIds.stream()
.map(attachmentId -> new BulletinAttachment(bulletinId, attachmentId)) .map(attachmentId -> new BulletinAttachment(bulletinId, attachmentId))
.collect(Collectors.toList()); .collect(Collectors.toList());
return bulletinAttachmentService.saveBatch(bulletinAttachments); return bulletinAttachmentService.saveBatch(bulletinAttachments);
} }
private List<Bulletin> getBulletinsByIds(List<Long> ids) { private List<Bulletin> getBulletinsByIds(List<Long> ids) {
if (ids == null || ids.isEmpty()) { if (ids == null || ids.isEmpty()) {
return Collections.emptyList(); return Collections.emptyList();

View File

@ -1,5 +1,6 @@
package com.zsc.edu.gateway.modules.notice.service.impl; package com.zsc.edu.gateway.modules.notice.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
@ -9,18 +10,19 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.zsc.edu.gateway.framework.message.email.EmailSender; import com.zsc.edu.gateway.framework.message.email.EmailSender;
import com.zsc.edu.gateway.framework.message.sms.SmsSender; import com.zsc.edu.gateway.framework.message.sms.SmsSender;
import com.zsc.edu.gateway.framework.security.UserDetailsImpl; import com.zsc.edu.gateway.framework.security.UserDetailsImpl;
import com.zsc.edu.gateway.modules.attachment.service.AttachmentService;
import com.zsc.edu.gateway.modules.notice.dto.UserMessageDto; import com.zsc.edu.gateway.modules.notice.dto.UserMessageDto;
import com.zsc.edu.gateway.modules.notice.entity.*; import com.zsc.edu.gateway.modules.notice.entity.*;
import com.zsc.edu.gateway.modules.notice.mapper.MessageMapper;
import com.zsc.edu.gateway.modules.notice.query.AdminMessageQuery;
import com.zsc.edu.gateway.modules.notice.query.UserMessageQuery; import com.zsc.edu.gateway.modules.notice.query.UserMessageQuery;
import com.zsc.edu.gateway.modules.notice.repo.MessageRepository; import com.zsc.edu.gateway.modules.notice.repo.MessageRepository;
import com.zsc.edu.gateway.modules.notice.repo.MessageSettingRepository;
import com.zsc.edu.gateway.modules.notice.repo.UserMessageRepository; import com.zsc.edu.gateway.modules.notice.repo.UserMessageRepository;
import com.zsc.edu.gateway.modules.notice.service.MessageAttachmentService; import com.zsc.edu.gateway.modules.notice.service.MessageAttachmentService;
import com.zsc.edu.gateway.modules.notice.service.UserMessageService; import com.zsc.edu.gateway.modules.notice.service.UserMessageService;
import com.zsc.edu.gateway.modules.notice.vo.AdminMessageVo;
import com.zsc.edu.gateway.modules.notice.vo.UserMessageVo; import com.zsc.edu.gateway.modules.notice.vo.UserMessageVo;
import com.zsc.edu.gateway.modules.system.entity.User; import com.zsc.edu.gateway.modules.system.entity.User;
import com.zsc.edu.gateway.modules.system.service.UserService; import com.zsc.edu.gateway.modules.system.repo.UserRepository;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import org.springframework.scheduling.annotation.Async; import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@ -42,13 +44,12 @@ import java.util.stream.Collectors;
public class UserMessageServiceImpl extends ServiceImpl<UserMessageRepository, UserMessage> implements UserMessageService { public class UserMessageServiceImpl extends ServiceImpl<UserMessageRepository, UserMessage> implements UserMessageService {
private final MessageRepository messageRepo; private final MessageRepository messageRepo;
private final MessageSettingRepository messageSettingRepo;
private final UserService userService;
private final EmailSender emailSender; private final EmailSender emailSender;
private final SmsSender smsSender; private final SmsSender smsSender;
private final UserMessageRepository userMessageRepository; private final UserMessageRepository userMessageRepository;
private final MessageAttachmentService messageAttachmentService; private final MessageAttachmentService messageAttachmentService;
private final UserRepository userRepository;
private final MessageMapper messageMapper;
/** /**
* 查询消息详情 * 查询消息详情
* *
@ -63,7 +64,7 @@ public class UserMessageServiceImpl extends ServiceImpl<UserMessageRepository, U
UserMessage userMessage = new UserMessage(); UserMessage userMessage = new UserMessage();
userMessage.setUserId(userId); userMessage.setUserId(userId);
userMessage.setMessageId(messageId); userMessage.setMessageId(messageId);
userMessage.setIsRead(false); userMessage.setIsRead(true);
userMessage.setReadTime(LocalDateTime.now()); userMessage.setReadTime(LocalDateTime.now());
save(userMessage); save(userMessage);
} }
@ -79,7 +80,7 @@ public class UserMessageServiceImpl extends ServiceImpl<UserMessageRepository, U
*/ */
@Override @Override
public IPage<UserMessageVo> page(Page<UserMessageVo> page, UserMessageQuery query) { public IPage<UserMessageVo> page(Page<UserMessageVo> page, UserMessageQuery query) {
return userMessageRepository.query(page, query); return userMessageRepository.page(page, query);
} }
/** /**
@ -109,12 +110,23 @@ public class UserMessageServiceImpl extends ServiceImpl<UserMessageRepository, U
} }
UpdateWrapper<UserMessage> updateWrapper = new UpdateWrapper<>(); UpdateWrapper<UserMessage> updateWrapper = new UpdateWrapper<>();
updateWrapper.eq("user_id", userDetails.getId()).in("message_id", messageIds); updateWrapper.eq("user_id", userDetails.getId()).in("message_id", messageIds);
updateWrapper.set("is_read", false); updateWrapper.set("is_read", true);
updateWrapper.set("read_time", LocalDateTime.now()); updateWrapper.set("read_time", LocalDateTime.now());
return userMessageRepository.update(updateWrapper); return userMessageRepository.update(updateWrapper);
} }
/**
* 管理员查询消息列表
*
* @return 消息设置列表
*/
@Override
public IPage<AdminMessageVo> getAdminMessagePage(Page<UserMessageVo> page, AdminMessageQuery query) {
return userMessageRepository.pageAdmin(page, query);
}
/** /**
* 管理员手动创建用户消息并发送 * 管理员手动创建用户消息并发送
* *
@ -124,72 +136,17 @@ public class UserMessageServiceImpl extends ServiceImpl<UserMessageRepository, U
@Transactional @Transactional
@Override @Override
public Boolean createByAdmin(UserMessageDto dto) { public Boolean createByAdmin(UserMessageDto dto) {
Set<User> users = dto.userIds.stream() Set<User> users = new HashSet<>(userRepository.selectList(new LambdaQueryWrapper<User>().in(User::getId, dto.userIds)));
.map(userService::getById) Message message = messageMapper.toEntity(dto);
.filter(Objects::nonNull)
.collect(Collectors.toSet());
if (users.isEmpty()) {
throw new RuntimeException("No valid users found for the provided userIds.");
}
Message message = new Message(dto.type, false, dto.email, dto.sms, dto.html,
dto.title, dto.content, null);
messageRepo.insert(message); messageRepo.insert(message);
Set<UserMessage> userMessages = users.stream() Set<UserMessage> userMessages = users.stream()
.map(user -> new UserMessage(null, user.getId(), message.getId(), false, null)) .map(user -> new UserMessage(null, user.getId(), message.getId(), true, null))
.collect(Collectors.toSet()); .collect(Collectors.toSet());
send(users, message); send(users, message);
return saveBatch(userMessages); return saveBatch(userMessages);
} }
/**
* 将附件关联信息插入数据库
*
* @param messageId 消息ID用于关联消息和附件
* @param attachmentIds 附件ID列表表示需要插入的附件
* @return 返回一个布尔值表示批量插入是否成功
*/
@Override
public Boolean insertInto(Long messageId, List<String> attachmentIds) {
List<MessageAttachment> messageAttachments = attachmentIds.stream()
.map(attachmentId -> new MessageAttachment(messageId, attachmentId))
.collect(Collectors.toList());
return messageAttachmentService.saveBatch(messageAttachments);
}
/**
* 获取所有消息推送方式
*
* @return 消息设置列表
*/
@Override
public List<MessageSetting> getSetting() {
return messageSettingRepo.findAll();
}
/**
* 设置消息推送方式
*
* @param settings 消息设置集合
* @return 消息设置列表
*/
@Transactional
@Override
public List<MessageSetting> saveSetting(List<MessageSetting> settings) {
if (CollectionUtils.isEmpty(settings)) {
throw new RuntimeException("settings is NULL!");
}
for (MessageSetting setting : settings) {
try {
messageSettingRepo.insert(setting);
} catch (Exception e) {
throw new RuntimeException("设置失败" + e.getMessage());
}
}
return settings;
}
/** /**
* 以邮件短信等形式发送消息只有非html格式的消息才能以短信方式发送 * 以邮件短信等形式发送消息只有非html格式的消息才能以短信方式发送
* *
@ -217,15 +174,15 @@ public class UserMessageServiceImpl extends ServiceImpl<UserMessageRepository, U
public Boolean createBySystem(Set<User> receivers, MessagePayload payload) { public Boolean createBySystem(Set<User> receivers, MessagePayload payload) {
AtomicBoolean email = new AtomicBoolean(false); AtomicBoolean email = new AtomicBoolean(false);
AtomicBoolean sms = new AtomicBoolean(false); AtomicBoolean sms = new AtomicBoolean(false);
Optional.of(messageSettingRepo.selectById(payload.type)).ifPresent(messageSetting -> { Optional.of(messageRepo.selectById(payload.type)).ifPresent(message -> {
email.set(messageSetting.email); email.set(message.email);
sms.set(messageSetting.sms); sms.set(message.sms);
}); });
Message message = new Message(payload.type, true, email.get(), sms.get(), Message message = new Message(payload.type, true, email.get(), sms.get(),
payload.html, payload.type.name(), payload.content, null); payload.html, payload.type.name(), payload.content);
messageRepo.insert(message); messageRepo.insert(message);
Set<UserMessage> userMessages = receivers.stream().map(user -> Set<UserMessage> userMessages = receivers.stream().map(user ->
new UserMessage(null, user.getId(), message.getId(), false, null)).collect(Collectors.toSet()); new UserMessage(null, user.getId(), message.getId(), true, null)).collect(Collectors.toSet());
send(receivers, message); send(receivers, message);
return saveBatch(userMessages); return saveBatch(userMessages);
} }

View File

@ -11,35 +11,92 @@ import lombok.NoArgsConstructor;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.List; import java.util.List;
import java.util.Set;
/** /**
* @author zhuang * @author zhuang
*/ */
@Data @Data
public class BulletinVo { public class BulletinVo {
/**
* 公告id
*/
private Long id; private Long id;
/**
* 公告标题
*/
private String title; private String title;
/**
* 公告属性
*/
private Bulletin.State state = Bulletin.State.edit; private Bulletin.State state = Bulletin.State.edit;
/**
* 公告置顶状态
*/
private Boolean top; private Boolean top;
/**
* 公告编辑者ID
*/
private Long editUserId; private Long editUserId;
/**
* 公告编辑者名称
*/
private String editUsername; private String editUsername;
/**
* 公告编辑时间
*/
private LocalDateTime editTime; private LocalDateTime editTime;
/**
* 公告发布者ID
*/
private Long publishUserId; private Long publishUserId;
/**
* 公告发布者名称
*/
private String publishUsername; private String publishUsername;
/**
* 公告发布时间
*/
private LocalDateTime publishTime; private LocalDateTime publishTime;
/**
* 公告关闭者ID
*/
private Long closeUserId; private Long closeUserId;
/**
* 公告关闭者名称
*/
private String closeUsername; private String closeUsername;
/**
* 公告关闭时间
*/
private LocalDateTime closeTime; private LocalDateTime closeTime;
/**
* 公告内容
*/
private String content; private String content;
@TableField(value = "create_time", fill = FieldFill.INSERT) /**
* 创建时间
*/
private LocalDateTime createTime; private LocalDateTime createTime;
@TableField(value = "create_by", fill = FieldFill.INSERT) /**
* 创建者
*/
private String createBy; private String createBy;
@TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE) /**
* 更新时间
*/
private LocalDateTime updateTime; private LocalDateTime updateTime;
@TableField(value = "update_by", fill = FieldFill.INSERT_UPDATE) /**
* 更新者
*/
private String updateBy; private String updateBy;
/**
* 备注
*/
private String remark;
/**
* 附件
*/
List<AttachmentVo> attachmentVos; List<AttachmentVo> attachmentVos;
} }

View File

@ -18,31 +18,71 @@ import java.util.List;
*/ */
@Data @Data
public class UserMessageVo { public class UserMessageVo {
private Long id; /**
* 用户消息id
*/
private Long messageId;
/**
* 是否已读
*/
public Boolean isRead; public Boolean isRead;
/**
* 阅读时间
*/
public LocalDateTime readTime; public LocalDateTime readTime;
/**
* 用户名
*/
public String username; public String username;
public String name;
public String avatar;
public String address;
/**
* 消息类型
*/
public MessageType type = MessageType.other; public MessageType type = MessageType.other;
/**
* 是否系统消息
*/
public Boolean system; public Boolean system;
/**
* 是否邮件
*/
public Boolean email; public Boolean email;
/**
* 是否短信
*/
public Boolean sms; public Boolean sms;
/**
* 是否html
*/
public Boolean html; public Boolean html;
/**
* 标题
*/
public String title; public String title;
/**
* 内容
*/
public String content; public String content;
/**
* 备注
*/
private String remark; private String remark;
@TableField(value = "create_time", fill = FieldFill.INSERT) /**
* 创建时间
*/
private LocalDateTime createTime; private LocalDateTime createTime;
@TableField(value = "create_by", fill = FieldFill.INSERT) /**
* 创建人
*/
private String createBy; private String createBy;
@TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE) /**
* 更新时间
*/
private LocalDateTime updateTime; private LocalDateTime updateTime;
@TableField(value = "update_by", fill = FieldFill.INSERT_UPDATE) /**
* 更新人
*/
private String updateBy; private String updateBy;
public List<AttachmentVo> attachments;
} }

View File

@ -1,15 +1,12 @@
package com.zsc.edu.gateway.modules.system.controller; package com.zsc.edu.gateway.modules.system.controller;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.zsc.edu.gateway.exception.ConstraintException; import com.zsc.edu.gateway.exception.ConstraintException;
import com.zsc.edu.gateway.modules.system.dto.DeptDto; import com.zsc.edu.gateway.modules.system.dto.DeptDto;
import com.zsc.edu.gateway.modules.system.entity.Dept; import com.zsc.edu.gateway.modules.system.entity.Dept;
import com.zsc.edu.gateway.modules.system.entity.User; import com.zsc.edu.gateway.modules.system.entity.User;
import com.zsc.edu.gateway.modules.system.query.DeptQuery;
import com.zsc.edu.gateway.modules.system.service.DeptService; import com.zsc.edu.gateway.modules.system.service.DeptService;
import com.zsc.edu.gateway.modules.system.service.UserService; import com.zsc.edu.gateway.modules.system.service.UserService;
import com.zsc.edu.gateway.modules.system.vo.DeptTree;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
@ -31,12 +28,12 @@ public class DeptController {
/** /**
* 返回管理部门列表 hasAuthority('DEPT_QUERY') * 返回管理部门列表 hasAuthority('DEPT_QUERY')
* * @param deptId 部门ID
* @return 部门列表 * @return 部门列表
*/ */
@GetMapping() @GetMapping("/{deptId}")
public List<DeptTree> getDeptTree() { public List<Dept> getDeptTree(@PathVariable Long deptId) {
return service.getDeptTree(); return service.getDeptTree(deptId);
} }
/** /**

View File

@ -2,6 +2,7 @@ package com.zsc.edu.gateway.modules.system.entity;
import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import com.zsc.edu.gateway.modules.system.vo.UserVo;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
@ -47,9 +48,9 @@ public class Dept extends BaseEntity {
private Boolean enabled = true; private Boolean enabled = true;
@TableField(exist = false) @TableField(exist = false)
public List<Dept> children = new ArrayList<>(0); public List<Dept> children = null;
@TableField(exist = false) @TableField(exist = false)
public List<User> members = new ArrayList<>(0); public List<UserVo> members = null;
} }

View File

@ -2,11 +2,6 @@ package com.zsc.edu.gateway.modules.system.repo;
import com.zsc.edu.gateway.modules.system.entity.Dept; import com.zsc.edu.gateway.modules.system.entity.Dept;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.zsc.edu.gateway.modules.system.entity.User;
import org.apache.ibatis.annotations.Many;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
import java.util.List; import java.util.List;
@ -19,6 +14,5 @@ import java.util.List;
* @since 2023-04-06 * @since 2023-04-06
*/ */
public interface DeptRepository extends BaseMapper<Dept> { public interface DeptRepository extends BaseMapper<Dept> {
@Select("SELECT d.*, u.* FROM sys_dept d LEFT JOIN sys_user u ON d.id = u.dept_id") List<Dept> selectDeptTree();
List<Dept> selectAllWithMembers();
} }

View File

@ -3,7 +3,6 @@ package com.zsc.edu.gateway.modules.system.service;
import com.zsc.edu.gateway.modules.system.dto.DeptDto; import com.zsc.edu.gateway.modules.system.dto.DeptDto;
import com.zsc.edu.gateway.modules.system.entity.Dept; import com.zsc.edu.gateway.modules.system.entity.Dept;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import com.zsc.edu.gateway.modules.system.vo.DeptTree;
import java.util.List; import java.util.List;
@ -31,13 +30,11 @@ public interface DeptService extends IService<Dept> {
Boolean edit(DeptDto dto, Long id); Boolean edit(DeptDto dto, Long id);
Boolean toggle(Long id); Boolean toggle(Long id);
//
// /**
// * 生成部门树结构
// * @param id
// * @return
// */
//// Dept listTree(Long id);
List<DeptTree> getDeptTree(); /**
* 生成部门树结构
*
* @return Dept
*/
List<Dept> getDeptTree(Long deptId);
} }

View File

@ -2,10 +2,12 @@ package com.zsc.edu.gateway.modules.system.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.zsc.edu.gateway.common.util.TreeUtil;
import com.zsc.edu.gateway.exception.ConstraintException; import com.zsc.edu.gateway.exception.ConstraintException;
import com.zsc.edu.gateway.modules.system.dto.AuthorityDto; import com.zsc.edu.gateway.modules.system.dto.AuthorityDto;
//import com.zsc.edu.gateway.modules.system.dto.RoleAuthorityDto; //import com.zsc.edu.gateway.modules.system.dto.RoleAuthorityDto;
import com.zsc.edu.gateway.modules.system.entity.Authority; import com.zsc.edu.gateway.modules.system.entity.Authority;
import com.zsc.edu.gateway.modules.system.entity.Dept;
import com.zsc.edu.gateway.modules.system.entity.Role; import com.zsc.edu.gateway.modules.system.entity.Role;
import com.zsc.edu.gateway.modules.system.mapper.AuthorityMapper; import com.zsc.edu.gateway.modules.system.mapper.AuthorityMapper;
import com.zsc.edu.gateway.modules.system.repo.AuthorityRepository; import com.zsc.edu.gateway.modules.system.repo.AuthorityRepository;
@ -13,6 +15,8 @@ import com.zsc.edu.gateway.modules.system.service.AuthorityService;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Objects;
import java.util.Set; import java.util.Set;
/** /**

View File

@ -2,23 +2,19 @@ package com.zsc.edu.gateway.modules.system.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.zsc.edu.gateway.exception.ConstraintException; import com.zsc.edu.gateway.exception.ConstraintException;
import com.zsc.edu.gateway.framework.DeptTreeUtil; import com.zsc.edu.gateway.common.util.TreeUtil;
import com.zsc.edu.gateway.modules.system.dto.DeptDto; import com.zsc.edu.gateway.modules.system.dto.DeptDto;
import com.zsc.edu.gateway.modules.system.entity.Dept; import com.zsc.edu.gateway.modules.system.entity.Dept;
import com.zsc.edu.gateway.modules.system.entity.User;
import com.zsc.edu.gateway.modules.system.mapper.DeptMapper; import com.zsc.edu.gateway.modules.system.mapper.DeptMapper;
import com.zsc.edu.gateway.modules.system.repo.DeptRepository; import com.zsc.edu.gateway.modules.system.repo.DeptRepository;
import com.zsc.edu.gateway.modules.system.repo.UserRepository;
import com.zsc.edu.gateway.modules.system.service.DeptService; import com.zsc.edu.gateway.modules.system.service.DeptService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.zsc.edu.gateway.modules.system.vo.DeptTree;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Objects;
/** /**
* <p> * <p>
@ -34,7 +30,6 @@ public class DeptServiceImpl extends ServiceImpl<DeptRepository, Dept> implement
private final DeptMapper mapper; private final DeptMapper mapper;
private final DeptRepository repo; private final DeptRepository repo;
private final UserRepository userRepository;
@Override @Override
public Dept create(DeptDto dto) { public Dept create(DeptDto dto) {
@ -64,14 +59,25 @@ public class DeptServiceImpl extends ServiceImpl<DeptRepository, Dept> implement
} }
@Override @Override
public List<DeptTree> getDeptTree() { public List<Dept> getDeptTree(Long deptId) {
List<Dept> depots = repo.selectList(null); List<Dept> deptTrees = repo.selectDeptTree();
List<User> users = userRepository.selectList(null); List<Dept> deptTree = TreeUtil.makeTree(
Map<Long, List<User>> userMap = new HashMap<>(); deptTrees,
for (User user : users) { department -> department.getPid() == null || department.getPid() == -1L,
userMap.computeIfAbsent(user.getDeptId(), k -> new ArrayList<>()).add(user); (parent, child) -> parent.getId().equals(child.getPid()),
Dept::setChildren
);
if (Objects.nonNull(deptId)) {
List<Dept> deptChildrenTree = new ArrayList<>();
TreeUtil.forLevelOrder(deptTree, node -> {
if (node.getId().equals(deptId)) {
deptChildrenTree.add(node);
}
}, Dept::getChildren);
return deptChildrenTree;
} }
return DeptTreeUtil.buildDeptTree(depots, userMap); return deptTree;
} }
} }

View File

@ -102,7 +102,6 @@ public class RoleServiceImpl extends ServiceImpl<RoleRepository, Role> implement
@Override @Override
public RoleVo detail(Long id) { public RoleVo detail(Long id) {
// Role role = getById(id); // Role role = getById(id);
// // TODO 联表查询
// // List<RoleAuthority> roleAuthorities = roleAuthService.list(new LambdaQueryWrapper<RoleAuthority>().eq(RoleAuthority::getRoleId, role.id)); // // List<RoleAuthority> roleAuthorities = roleAuthService.list(new LambdaQueryWrapper<RoleAuthority>().eq(RoleAuthority::getRoleId, role.id));
// role.authorities = authorityRepository.selectAuthoritiesByRoleId(role.id); // role.authorities = authorityRepository.selectAuthoritiesByRoleId(role.id);
return roleRepository.selectRoleById(id); return roleRepository.selectRoleById(id);

View File

@ -1,26 +0,0 @@
package com.zsc.edu.gateway.modules.system.vo;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.zsc.edu.gateway.modules.system.entity.User;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.ArrayList;
import java.util.List;
/**
* @author zhuang
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class DeptTree {
private Long id;
@JsonIgnore
private Long pid;
private String name;
List<DeptTree> children = new ArrayList<>();
List<UserTree> members = new ArrayList<>();
}

View File

@ -10,7 +10,6 @@ import java.util.List;
/** /**
* @author ftz * @author ftz
* 创建时间:16/2/2024 下午6:20 * 创建时间:16/2/2024 下午6:20
* 描述: TODO
*/ */
@Getter @Getter
@Setter @Setter

View File

@ -1,16 +0,0 @@
package com.zsc.edu.gateway.modules.system.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author zhuang
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class UserTree {
private Long id;
private String name;
}

View File

@ -1,18 +1,19 @@
package com.zsc.edu.gateway.modules.system.vo; package com.zsc.edu.gateway.modules.system.vo;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data; import lombok.Data;
import java.time.LocalDateTime; import java.time.LocalDateTime;
/**
* @author zhuang
*/
@Data @Data
public class UserVo { public class UserVo {
/** /**
* 自增主键 * 自增主键
*/ */
@TableId(type = IdType.AUTO) public Long userId;
public Long id;
/** /**
* 用户名 * 用户名
*/ */

View File

@ -18,29 +18,21 @@
<result column="edit_user_name" jdbcType="VARCHAR" property="editUsername"/> <result column="edit_user_name" jdbcType="VARCHAR" property="editUsername"/>
<result column="publish_user_name" jdbcType="VARCHAR" property="publishUsername"/> <result column="publish_user_name" jdbcType="VARCHAR" property="publishUsername"/>
<result column="close_user_name" jdbcType="VARCHAR" property="closeUsername"/> <result column="close_user_name" jdbcType="VARCHAR" property="closeUsername"/>
<collection property="attachmentVos" ofType="com.zsc.edu.gateway.modules.attachment.vo.AttachmentVo"> <result column="create_by" jdbcType="VARCHAR" property="createBy"/>
<result column="update_by" jdbcType="VARCHAR" property="updateBy"/>
<result column="create_time" jdbcType="DATE" property="createTime"/>
<result column="update_time" jdbcType="DATE" property="updateTime"/>
<result column="remark" jdbcType="VARCHAR" property="remark"/>
<collection property="attachmentVos" ofType="com.zsc.edu.gateway.modules.attachment.vo.AttachmentVo"
autoMapping="true" columnPrefix="attachment_">
<id column="id" property="attachmentId"/>
<result column="file_name" jdbcType="VARCHAR" property="fileName"/> <result column="file_name" jdbcType="VARCHAR" property="fileName"/>
<result column="url" jdbcType="VARCHAR" property="url"/> <result column="url" jdbcType="VARCHAR" property="url"/>
</collection> </collection>
</resultMap> </resultMap>
<select id="selectByBulletinId" resultMap="BulletinMap"> <select id="selectByBulletinId" resultMap="BulletinMap">
SELECT sb.id AS id, //TODO 查询数据问题已经修改
sb.state AS state, SELECT sb.*, a.id as attachment_id, a.file_name as attachment_file_name, a.url as attachment_url
sb.content AS content,
sb.title AS title,
sb.top AS top,
sb.remark AS remark,
sb.close_time AS close_time,
sb.close_user_id AS close_user_id,
sb.create_by AS create_by,
sb.create_time AS create_time,
sb.edit_user_id AS edit_user_id,
sb.publish_time AS publish_time,
sb.publish_user_id AS publish_user_id,
sb.update_by AS update_by,
sb.update_time AS update_time,
a.file_name AS file_name,
a.url AS url
FROM sys_bulletin sb FROM sys_bulletin sb
LEFT JOIN LEFT JOIN
sys_bulletin_attach sba ON sb.id = sba.bulletin_id sys_bulletin_attach sba ON sb.id = sba.bulletin_id
@ -67,6 +59,7 @@
sb.publish_user_id AS publish_user_id, sb.publish_user_id AS publish_user_id,
sb.update_by AS update_by, sb.update_by AS update_by,
sb.update_time AS update_time, sb.update_time AS update_time,
a.id AS id,
a.file_name AS file_name, a.file_name AS file_name,
a.url AS url a.url AS url
FROM FROM

View File

@ -4,13 +4,10 @@
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"> "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zsc.edu.gateway.modules.notice.repo.UserMessageRepository"> <mapper namespace="com.zsc.edu.gateway.modules.notice.repo.UserMessageRepository">
<resultMap id="userMessageMap" type="com.zsc.edu.gateway.modules.notice.vo.UserMessageVo"> <resultMap id="userMessageMap" type="com.zsc.edu.gateway.modules.notice.vo.UserMessageVo">
<id column="id" jdbcType="BIGINT" property="id"/> <id column="message_id" jdbcType="BIGINT" property="messageId"/>
<result column="is_read" jdbcType="BOOLEAN" property="isRead"/> <result column="is_read" jdbcType="BOOLEAN" property="isRead"/>
<result column="read_time" jdbcType="TIMESTAMP" property="readTime"/> <result column="read_time" jdbcType="TIMESTAMP" property="readTime"/>
<result column="username" jdbcType="VARCHAR" property="username"/> <result column="username" jdbcType="VARCHAR" property="username"/>
<result column="address" jdbcType="VARCHAR" property="address"/>
<result column="avatar" jdbcType="VARCHAR" property="avatar"/>
<result column="name" jdbcType="VARCHAR" property="name"/>
<result column="type" jdbcType="INTEGER" property="type"/> <result column="type" jdbcType="INTEGER" property="type"/>
<result column="system" jdbcType="BOOLEAN" property="system"/> <result column="system" jdbcType="BOOLEAN" property="system"/>
<result column="email" jdbcType="BOOLEAN" property="email"/> <result column="email" jdbcType="BOOLEAN" property="email"/>
@ -23,55 +20,90 @@
<result column="create_time" jdbcType="DATE" property="createTime"/> <result column="create_time" jdbcType="DATE" property="createTime"/>
<result column="update_time" jdbcType="DATE" property="updateTime"/> <result column="update_time" jdbcType="DATE" property="updateTime"/>
<result column="remark" jdbcType="VARCHAR" property="remark"/> <result column="remark" jdbcType="VARCHAR" property="remark"/>
<collection property="attachments" ofType="com.zsc.edu.gateway.modules.attachment.vo.AttachmentVo"> </resultMap>
<result column="file_name" jdbcType="VARCHAR" property="fileName"/>
<result column="url" jdbcType="VARCHAR" property="url"/> <resultMap id="userMessageAdminMap" type="com.zsc.edu.gateway.modules.notice.vo.AdminMessageVo">
</collection> <id column="id" jdbcType="BIGINT" property="id"/>
<result column="type" jdbcType="INTEGER" property="type"/>
<result column="system" jdbcType="BOOLEAN" property="system"/>
<result column="email" jdbcType="BOOLEAN" property="email"/>
<result column="sms" jdbcType="BOOLEAN" property="sms"/>
<result column="html" jdbcType="BOOLEAN" property="html"/>
<result column="title" jdbcType="VARCHAR" property="title"/>
<result column="content" jdbcType="VARCHAR" property="content"/>
<result column="remark" jdbcType="VARCHAR" property="remark"/>
<result column="user_count" jdbcType="INTEGER" property="userCount"/>
<result column="read_count" jdbcType="INTEGER" property="readCount"/>
</resultMap> </resultMap>
<select id="selectByMessageIdAndUserId" resultType="com.zsc.edu.gateway.modules.notice.vo.UserMessageVo" <select id="selectByMessageIdAndUserId" resultType="com.zsc.edu.gateway.modules.notice.vo.UserMessageVo"
resultMap="userMessageMap"> resultMap="userMessageMap">
select sum.*,sm.*,su.username,su.address,su.avatar,su.name,a.* select sum.*,sm.*,su.username,su.address,su.avatar,su.name
from sys_user_message sum from sys_user_message sum
left join sys_user su on sum.user_id = su.id left join sys_user su on sum.user_id = su.id
left join sys_message sm on sm.id = sum.message_id left join sys_message sm on sm.id = sum.message_id
left join sys_message_attachment sma on sm.id = sma.message_id
left join attachment a on sma.attachment_id = a.id
<where> <where>
sm.id=#{messageId} sm.id=#{messageId}
and su.id=#{userId} and su.id=#{userId}
</where> </where>
</select> </select>
<select id="query" resultType="com.zsc.edu.gateway.modules.notice.vo.UserMessageVo" resultMap="userMessageMap"> <select id="page" resultType="com.zsc.edu.gateway.modules.notice.vo.UserMessageVo" resultMap="userMessageMap">
select sum.*,sm.*,su.username,su.address,su.avatar,su.name,a.* select sum.*,sm.*,su.username,su.address,su.avatar,su.name
from sys_user_message sum from sys_user_message sum
left join sys_user su on sum.user_id = su.id left join sys_user su on sum.user_id = su.id
left join sys_message sm on sm.id = sum.message_id left join sys_message sm on sm.id = sum.message_id
left join sys_message_attachment sma on sm.id = sma.message_id <where>
left join attachment a on sma.attachment_id = a.id <if test="query.userId != null">
where 1=1 AND sum.user_id = #{query.userId}
<if test="query.userId != null"> </if>
AND sum.user_id = #{query.userId} <if test="query.title != null and query.title != ''">
</if> AND sm.title LIKE CONCAT('%', #{query.title}, '%')
<if test="query.title != null and query.title != ''"> </if>
AND sm.title LIKE CONCAT('%', #{query.title}, '%') <if test="query.type != null">
</if> AND sm.type = #{query.type}
<if test="query.type != null"> </if>
AND sm.type = #{query.type} <if test="query.name != null and query.name != ''">
</if> AND su.username LIKE CONCAT('%', #{query.name}, '%')
<if test="query.name != null and query.name != ''"> </if>
AND su.username LIKE CONCAT('%', #{query.name}, '%') <if test="query.system != null">
</if> AND sm.system = #{query.system}
<if test="query.system != null"> </if>
AND sm.system = #{query.system} <if test="query.isRead != null">
</if> AND sum.is_read = #{query.isRead}
<if test="query.isRead != null"> </if>
AND sum.is_read = #{query.isRead} <if test="query.createAtBegin != null and query.createAtEnd != null">
</if> AND sm.create_time BETWEEN #{query.createAtBegin} AND #{query.createAtEnd}
<if test="query.createAtBegin != null and query.createAtEnd != null"> </if>
AND sm.create_time BETWEEN #{query.createAtBegin} AND #{query.createAtEnd} </where>
</if>
ORDER BY ORDER BY
sm.create_time DESC sm.create_time DESC
</select> </select>
<select id="pageAdmin" resultMap="userMessageAdminMap">
SELECT
sm.*, -- 获取消息详情
COUNT(DISTINCT sum.user_id) AS user_count, -- 统计用户的关联数量
SUM(CASE WHEN sum.is_read = true THEN 1 ELSE 0 END) AS read_count -- 统计已读数量
FROM
sys_user_message sum
LEFT JOIN
sys_user su ON sum.user_id = su.id
LEFT JOIN
sys_message sm ON sm.id = sum.message_id
GROUP BY
sm.id
<where>
<if test="query.userId != null">
AND sum.user_id = #{query.userId}
</if>
<if test="query.title != null and query.title != ''">
AND sm.title LIKE CONCAT('%', #{query.title}, '%')
</if>
<if test="query.createAtBegin != null and query.createAtEnd != null">
AND sm.create_time BETWEEN #{query.createAtBegin} AND #{query.createAtEnd}
</if>
</where>
</select>
</mapper> </mapper>

View File

@ -1,9 +1,33 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zsc.edu.gateway.modules.system.repo.DeptRepository"> <mapper namespace="com.zsc.edu.gateway.modules.system.repo.DeptRepository">
<select id="selectAllWithMembers" resultType="com.zsc.edu.gateway.modules.system.entity.Dept">
SELECT d.*, u.* <resultMap id="deptMap" type="com.zsc.edu.gateway.modules.system.entity.Dept">
FROM sys_dept d <id column="id" property="id"/>
LEFT JOIN sys_user u ON d.id = u.dept_id <result column="sub_count" property="subCount"/>
<result column="pid" property="pid"/>
<result column="name" property="name"/>
<result column="dept_sort" property="deptSort"/>
<collection
property="members"
ofType="com.zsc.edu.gateway.modules.system.vo.UserVo"
autoMapping="true"
columnPrefix="members_"
>
<id column="id" jdbcType="BIGINT" property="userId"/>
<result column="username" jdbcType="VARCHAR" property="username"/>
<result column="email" jdbcType="VARCHAR" property="email"/>
<result column="phone" jdbcType="VARCHAR" property="phone"/>
</collection>
</resultMap>
<select id="selectDeptTree" resultMap="deptMap">
SELECT sd.*,
su.id as members_id,
su.username as members_username,
su.email as members_email,
su.phone as members_phone
FROM sys_dept sd
left join sys_user su on sd.id = su.dept_id
</select> </select>
</mapper> </mapper>

View File

@ -78,8 +78,8 @@ public class BulletinServiceTest {
assertEquals(bulletin.getTitle(), dto.getTitle()); assertEquals(bulletin.getTitle(), dto.getTitle());
assertEquals(bulletin.getId(), bulletin2.id); assertEquals(bulletin.getId(), bulletin2.id);
// 不能改为其他已存在的同名同代码部门 // 不能改为其他已存在的同名同代码部门
assertThrows(ConstraintException.class, // assertThrows(ConstraintException.class,
() -> service.update(userDetails, new BulletinDto(bulletin1.getTitle(), true, null, null), bulletin2.id)); // () -> service.update(userDetails, new BulletinDto(bulletin1.getTitle(), true, null, null), bulletin2.id));
} }
@AfterEach @AfterEach

View File

@ -14,7 +14,6 @@ import java.util.Set;
/** /**
* @author ftz * @author ftz
* 创建时间:29/12/2023 上午11:21 * 创建时间:29/12/2023 上午11:21
* 描述: TODO
*/ */
@SpringBootTest @SpringBootTest
public class UserServiceTest { public class UserServiceTest {