From 75a4829a6128f1e37e0ee7b02e645e0590f8c1d9 Mon Sep 17 00:00:00 2001 From: wangcl <15217009762@163.com> Date: Fri, 26 Jul 2024 16:42:29 +0800 Subject: [PATCH 1/9] =?UTF-8?q?fix:=201.=20=E5=8E=BB=E9=99=A4jwt=E5=AD=98?= =?UTF-8?q?=E5=82=A8password=E5=85=B3=E9=94=AE=E4=BF=A1=E6=81=AF=EF=BC=9Bt?= =?UTF-8?q?oken=E5=88=9B=E5=BB=BA=E9=80=BB=E8=BE=91=E5=90=8Cnode=EF=BC=8Cj?= =?UTF-8?q?wt=E4=BF=A1=E6=81=AF=E5=AE=9E=E7=8E=B0node=E5=92=8Cjava?= =?UTF-8?q?=E4=BA=92=E9=80=9A=202.=20=E6=96=B0=E5=A2=9Ehash256=E6=96=B9?= =?UTF-8?q?=E6=B3=95=EF=BC=8C=E7=94=A8=E6=88=B7=E6=B3=A8=E5=86=8Cpassword?= =?UTF-8?q?=E5=8A=A0=E5=AF=86=E9=80=BB=E8=BE=91=E5=90=8Cnode,=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0java=E7=AB=AF=E6=B3=A8=E5=86=8C=E7=9A=84=E8=B4=A6?= =?UTF-8?q?=E5=8F=B7=E7=99=BB=E5=BD=95=E5=92=8Cnode=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E4=BA=92=E9=80=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/auth/impl/AuthServiceImpl.java | 2 +- .../engine/core/auth/util/AuthUtil.java | 25 +++++++++++++++++++ .../engine/core/auth/util/JwtTokenUtil.java | 2 +- .../engine/core/user/UserService.java | 2 ++ .../core/user/impl/UserServiceImpl.java | 7 +++++- .../engine/interceptor/LoginInterceptor.java | 8 +++--- 6 files changed, 39 insertions(+), 7 deletions(-) diff --git a/survey-core/src/main/java/com/xiaojusurvey/engine/core/auth/impl/AuthServiceImpl.java b/survey-core/src/main/java/com/xiaojusurvey/engine/core/auth/impl/AuthServiceImpl.java index 60422eaa..e5bfd75e 100644 --- a/survey-core/src/main/java/com/xiaojusurvey/engine/core/auth/impl/AuthServiceImpl.java +++ b/survey-core/src/main/java/com/xiaojusurvey/engine/core/auth/impl/AuthServiceImpl.java @@ -61,7 +61,7 @@ public UserVo register(UserParam userParam) { //保存 User user = new User(); user.setUsername(userParam.getUsername()); - user.setPassword(AuthUtil.encryptPassword(userParam.getPassword(), userParam.getUsername())); + user.setPassword(AuthUtil.hash256(userParam.getPassword())); mongoRepository.save(user); return createTokenAndDeleteCaptcha(userParam); } diff --git a/survey-core/src/main/java/com/xiaojusurvey/engine/core/auth/util/AuthUtil.java b/survey-core/src/main/java/com/xiaojusurvey/engine/core/auth/util/AuthUtil.java index 8370e59a..df8ec72f 100644 --- a/survey-core/src/main/java/com/xiaojusurvey/engine/core/auth/util/AuthUtil.java +++ b/survey-core/src/main/java/com/xiaojusurvey/engine/core/auth/util/AuthUtil.java @@ -31,5 +31,30 @@ public static String encryptPassword(String password, String username) { } } + /** + * SHA-256 + * @param password + * @return + */ + public static String hash256(String password) { + try { + MessageDigest digest = MessageDigest.getInstance("SHA-256"); + byte[] hash = digest.digest(password.getBytes()); + // 将 byte 数组转换为十六进制字符串 + StringBuilder hexString = new StringBuilder(); + for (byte b : hash) { + String hex = Integer.toHexString(0xff & b); + if (hex.length() == 1) { + hexString.append('0'); + } + hexString.append(hex); + } + return hexString.toString(); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + return null; + } + } + } diff --git a/survey-core/src/main/java/com/xiaojusurvey/engine/core/auth/util/JwtTokenUtil.java b/survey-core/src/main/java/com/xiaojusurvey/engine/core/auth/util/JwtTokenUtil.java index 4123b9f3..67cf7531 100644 --- a/survey-core/src/main/java/com/xiaojusurvey/engine/core/auth/util/JwtTokenUtil.java +++ b/survey-core/src/main/java/com/xiaojusurvey/engine/core/auth/util/JwtTokenUtil.java @@ -59,7 +59,7 @@ public Token generateToken(User user) { Date expiryDate = new Date(now.getTime() + expirationTime * HOUR_MILLISECOND); String token = JWT.create() .withClaim("username", user.getUsername()) - .withClaim("password", user.getPassword()) + .withClaim("_id", user.getId()) .withExpiresAt(expiryDate) .withJWTId(UUID.randomUUID().toString()) .sign(Algorithm.HMAC256(secret)); diff --git a/survey-core/src/main/java/com/xiaojusurvey/engine/core/user/UserService.java b/survey-core/src/main/java/com/xiaojusurvey/engine/core/user/UserService.java index db5cce95..e5e7f721 100644 --- a/survey-core/src/main/java/com/xiaojusurvey/engine/core/user/UserService.java +++ b/survey-core/src/main/java/com/xiaojusurvey/engine/core/user/UserService.java @@ -9,4 +9,6 @@ public interface UserService { List findAllUser(); User loadUserByUsernameAndPassword(String username, String password); + + User getUserById(String userId); } diff --git a/survey-core/src/main/java/com/xiaojusurvey/engine/core/user/impl/UserServiceImpl.java b/survey-core/src/main/java/com/xiaojusurvey/engine/core/user/impl/UserServiceImpl.java index 011846e4..6011529c 100644 --- a/survey-core/src/main/java/com/xiaojusurvey/engine/core/user/impl/UserServiceImpl.java +++ b/survey-core/src/main/java/com/xiaojusurvey/engine/core/user/impl/UserServiceImpl.java @@ -35,7 +35,7 @@ public List findAllUser() { @Override public User loadUserByUsernameAndPassword(String username, String password) { Query query = new Query(); - String encryptPassword = AuthUtil.encryptPassword(password, username); + String encryptPassword = AuthUtil.hash256(password); query.addCriteria(Criteria.where("username").is(username).and("password").is(encryptPassword)); //查询用户并返回 User user = mongoRepository.findOne(query, User.class); @@ -44,4 +44,9 @@ public User loadUserByUsernameAndPassword(String username, String password) { } return user; } + + @Override + public User getUserById(String userId) { + return mongoRepository.findOne(new Query(Criteria.where("_id").is(userId)), User.class); + } } diff --git a/survey-server/src/main/java/com/xiaojusurvey/engine/interceptor/LoginInterceptor.java b/survey-server/src/main/java/com/xiaojusurvey/engine/interceptor/LoginInterceptor.java index b09e7565..3a08cbef 100644 --- a/survey-server/src/main/java/com/xiaojusurvey/engine/interceptor/LoginInterceptor.java +++ b/survey-server/src/main/java/com/xiaojusurvey/engine/interceptor/LoginInterceptor.java @@ -39,14 +39,14 @@ public boolean preHandle(HttpServletRequest request, HttpServletResponse respons //查询用户信息 Map claims = jwt.getClaims(); //获取用户名,密码 - String username = claims.get("username").asString(); - String password = claims.get("password").asString(); + String username = String.valueOf(claims.get("username")); + String userId = String.valueOf(claims.get("_id")); //判空 - if (ObjectUtils.isEmpty(username) || ObjectUtils.isEmpty(password)) { + if (ObjectUtils.isEmpty(username) || ObjectUtils.isEmpty(userId)) { //token超时 throw new ServiceException(RespErrorCode.USER_CREDENTIALS_ERROR.getMessage(), RespErrorCode.USER_CREDENTIALS_ERROR.getCode()); } - User user = userService.loadUserByUsernameAndPassword(username, password); + User user = userService.getUserById(userId); request.setAttribute("user", user); return HandlerInterceptor.super.preHandle(request, response, handler); } From 544c01140c5ef93df9623a26b1bf47bd0a739e06 Mon Sep 17 00:00:00 2001 From: wangcl <15217009762@163.com> Date: Fri, 26 Jul 2024 19:19:10 +0800 Subject: [PATCH 2/9] add Workspace,WorkspaceMember,ConvertorConfig --- lombok.config | 4 + .../common/entity/workspace/Workspace.java | 22 +++ .../entity/workspace/WorkspaceMember.java | 24 ++++ .../engine/common/enums/RoleEmum.java | 31 +++++ survey-core/pom.xml | 5 + .../engine/bean/ConvertorConfig.java | 18 +++ .../engine/bean/GeneralConvertor.java | 114 +++++++++++++++ .../workspace/WorkspaceMemberService.java | 19 +++ .../core/workspace/WorkspaceService.java | 26 ++++ .../impl/WorkspaceMemberServiceImpl.java | 53 +++++++ .../workspace/impl/WorkspaceServiceImpl.java | 131 ++++++++++++++++++ .../core/workspace/param/MemberParam.java | 16 +++ .../core/workspace/param/WorkspaceParam.java | 29 ++++ .../core/workspace/vo/WorkspaceInfoVO.java | 56 ++++++++ .../core/workspace/vo/WorkspaceMemberVO.java | 30 ++++ .../engine/core/workspace/vo/WorkspaceVO.java | 17 +++ .../engine/repository/MongoRepository.java | 9 ++ .../repository/impl/MongoRepositoryImpl.java | 5 + .../controller/WorkspaceController.java | 68 +++++++++ .../engine/interceptor/LoginInterceptor.java | 4 +- .../main/resources/application-dev.properties | 10 +- 21 files changed, 685 insertions(+), 6 deletions(-) create mode 100644 lombok.config create mode 100644 survey-common/src/main/java/com/xiaojusurvey/engine/common/entity/workspace/Workspace.java create mode 100644 survey-common/src/main/java/com/xiaojusurvey/engine/common/entity/workspace/WorkspaceMember.java create mode 100644 survey-common/src/main/java/com/xiaojusurvey/engine/common/enums/RoleEmum.java create mode 100644 survey-core/src/main/java/com/xiaojusurvey/engine/bean/ConvertorConfig.java create mode 100644 survey-core/src/main/java/com/xiaojusurvey/engine/bean/GeneralConvertor.java create mode 100644 survey-core/src/main/java/com/xiaojusurvey/engine/core/workspace/WorkspaceMemberService.java create mode 100644 survey-core/src/main/java/com/xiaojusurvey/engine/core/workspace/WorkspaceService.java create mode 100644 survey-core/src/main/java/com/xiaojusurvey/engine/core/workspace/impl/WorkspaceMemberServiceImpl.java create mode 100644 survey-core/src/main/java/com/xiaojusurvey/engine/core/workspace/impl/WorkspaceServiceImpl.java create mode 100644 survey-core/src/main/java/com/xiaojusurvey/engine/core/workspace/param/MemberParam.java create mode 100644 survey-core/src/main/java/com/xiaojusurvey/engine/core/workspace/param/WorkspaceParam.java create mode 100644 survey-core/src/main/java/com/xiaojusurvey/engine/core/workspace/vo/WorkspaceInfoVO.java create mode 100644 survey-core/src/main/java/com/xiaojusurvey/engine/core/workspace/vo/WorkspaceMemberVO.java create mode 100644 survey-core/src/main/java/com/xiaojusurvey/engine/core/workspace/vo/WorkspaceVO.java create mode 100644 survey-server/src/main/java/com/xiaojusurvey/engine/controller/WorkspaceController.java diff --git a/lombok.config b/lombok.config new file mode 100644 index 00000000..c31ba6bc --- /dev/null +++ b/lombok.config @@ -0,0 +1,4 @@ +lombok.accessors.chain=true +lombok.equalsAndHashCode.doNotUseGetters=true +lombok.toString.doNotUseGetters=true +lombok.equalsAndHashCode.callSuper=SKIP diff --git a/survey-common/src/main/java/com/xiaojusurvey/engine/common/entity/workspace/Workspace.java b/survey-common/src/main/java/com/xiaojusurvey/engine/common/entity/workspace/Workspace.java new file mode 100644 index 00000000..ebbe2755 --- /dev/null +++ b/survey-common/src/main/java/com/xiaojusurvey/engine/common/entity/workspace/Workspace.java @@ -0,0 +1,22 @@ +package com.xiaojusurvey.engine.common.entity.workspace; + +import com.xiaojusurvey.engine.common.entity.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.data.mongodb.core.mapping.Document; + +/** + * @description: 空间 + * @author: wangchenglong + * @time: 2024/7/24 10:50 + */ +@Document("workspace") +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Data +public class Workspace extends BaseEntity { + private String ownerId; + private String name; + private String description; +} diff --git a/survey-common/src/main/java/com/xiaojusurvey/engine/common/entity/workspace/WorkspaceMember.java b/survey-common/src/main/java/com/xiaojusurvey/engine/common/entity/workspace/WorkspaceMember.java new file mode 100644 index 00000000..a4b77653 --- /dev/null +++ b/survey-common/src/main/java/com/xiaojusurvey/engine/common/entity/workspace/WorkspaceMember.java @@ -0,0 +1,24 @@ +package com.xiaojusurvey.engine.common.entity.workspace; + +import com.xiaojusurvey.engine.common.entity.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.data.mongodb.core.mapping.Document; + +/** + * @description: 空间成员 + * @author: wangchenglong + * @time: 2024/7/24 10:51 + */ +@Document("workspaceMember") +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Data +public class WorkspaceMember extends BaseEntity { + private String userId; + + private String workspaceId; + + private String role; +} diff --git a/survey-common/src/main/java/com/xiaojusurvey/engine/common/enums/RoleEmum.java b/survey-common/src/main/java/com/xiaojusurvey/engine/common/enums/RoleEmum.java new file mode 100644 index 00000000..bdf916e3 --- /dev/null +++ b/survey-common/src/main/java/com/xiaojusurvey/engine/common/enums/RoleEmum.java @@ -0,0 +1,31 @@ +package com.xiaojusurvey.engine.common.enums; + +/** + * @description: 用户角色枚举 + * @author: wangchenglong + * @time: 2024/7/24 14:47 + */ +public enum RoleEmum { + + USER(0, "user"), + + ADMIN(1, "admin"); + + private final Integer state; + + private final String value; + + RoleEmum(Integer state, String value) { + this.state = state; + this.value = value; + } + + public Integer getState() { + return this.state; + } + + public String getValue(){ + return this.value; + } + +} diff --git a/survey-core/pom.xml b/survey-core/pom.xml index 5aa4dbd9..72e040b2 100644 --- a/survey-core/pom.xml +++ b/survey-core/pom.xml @@ -33,6 +33,11 @@ org.springframework.boot spring-boot-starter-web + + net.sf.dozer + dozer + 5.5.1 + diff --git a/survey-core/src/main/java/com/xiaojusurvey/engine/bean/ConvertorConfig.java b/survey-core/src/main/java/com/xiaojusurvey/engine/bean/ConvertorConfig.java new file mode 100644 index 00000000..be582f95 --- /dev/null +++ b/survey-core/src/main/java/com/xiaojusurvey/engine/bean/ConvertorConfig.java @@ -0,0 +1,18 @@ +package com.xiaojusurvey.engine.bean; + +import org.dozer.DozerBeanMapper; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * @description: net.sf.dozer + * @author: wangchenglong + * @time: 2024/7/24 22:25 + */ +@Configuration +public class ConvertorConfig { + @Bean + public DozerBeanMapper dozerBeanMapper() { + return new DozerBeanMapper(); + } +} diff --git a/survey-core/src/main/java/com/xiaojusurvey/engine/bean/GeneralConvertor.java b/survey-core/src/main/java/com/xiaojusurvey/engine/bean/GeneralConvertor.java new file mode 100644 index 00000000..4dc3e550 --- /dev/null +++ b/survey-core/src/main/java/com/xiaojusurvey/engine/bean/GeneralConvertor.java @@ -0,0 +1,114 @@ +package com.xiaojusurvey.engine.bean; + + +import org.dozer.DozerBeanMapper; +import org.dozer.Mapper; +import org.dozer.loader.api.BeanMappingBuilder; +import org.dozer.loader.api.FieldsMappingOptions; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; +import java.util.TreeSet; + +/** + * @description: 对象转换 + * @author: wangchenglong + * @time: 2024/7/24 14:23 + */ +@Component +public class GeneralConvertor { + + @Resource + private Mapper mapper; + + /** + * List 实体类 转换器 + * + * @param source 原数据 + * @param clz 转换类型 + * @param + * @param + * @return + */ + public List convertor(List source, Class clz){ + if (source == null) return null; + List map = new ArrayList<>(); + for (S s : source) { + map.add(mapper.map(s, clz)); + } + return map; + } + + + /** + * Set 实体类 深度转换器 + * + * @param source 原数据 + * @param clz 目标对象 + * @param + * @param + * @return + */ + public Set convertor(Set source, Class clz) { + if (source == null) return null; + Set set = new TreeSet<>(); + for (S s : source) { + set.add(mapper.map(s, clz)); + } + return set; + } + + /** + * 实体类 深度转换器 + * + * @param source + * @param clz + * @param + * @param + * @return + */ + public T convertor(S source, Class clz) { + if (source == null) return null; + return mapper.map(source, clz); + } + + /** + * 针对mongodb中的_id及id字段的转换 + * @param source + * @param destinationClass + * @param + * @return + */ + public T convertor_id(Object source, Class destinationClass) { + Mapper mapper = new DozerBeanMapper(); + ((DozerBeanMapper) mapper).addMapping(new BeanMappingBuilder() { + @Override + protected void configure() { + mapping(source.getClass(), destinationClass) + .fields("id", "_id", FieldsMappingOptions.copyByReference()); + } + }); + return mapper.map(source, destinationClass); + } + + public List convertor_ids(List sourceList, Class destinationClass) { + List destinationList = new ArrayList<>(); + for (S source : sourceList) { + destinationList.add(convertor_id(source, destinationClass)); + } + return destinationList; + } + + + public void convertor(Object source, Object object) { + mapper.map(source, object); + } + + public void copyConvertor(T source, Object object) { + mapper.map(source, object); + } + +} diff --git a/survey-core/src/main/java/com/xiaojusurvey/engine/core/workspace/WorkspaceMemberService.java b/survey-core/src/main/java/com/xiaojusurvey/engine/core/workspace/WorkspaceMemberService.java new file mode 100644 index 00000000..5cc19ac1 --- /dev/null +++ b/survey-core/src/main/java/com/xiaojusurvey/engine/core/workspace/WorkspaceMemberService.java @@ -0,0 +1,19 @@ +package com.xiaojusurvey.engine.core.workspace; + +import com.xiaojusurvey.engine.common.entity.workspace.WorkspaceMember; + +import java.util.List; + +/** + * @description: + * @author: wangchenglong + * @time: 2024/7/24 14:23 + */ +public interface WorkspaceMemberService { + + List getWorkspaceMembers(String workspaceId, List userId); + + List getWorkspaceMembers(String userId, Integer pageSize, Integer curPage); + + List getWorkspaceMembers(String workspaceId); +} diff --git a/survey-core/src/main/java/com/xiaojusurvey/engine/core/workspace/WorkspaceService.java b/survey-core/src/main/java/com/xiaojusurvey/engine/core/workspace/WorkspaceService.java new file mode 100644 index 00000000..9cfda916 --- /dev/null +++ b/survey-core/src/main/java/com/xiaojusurvey/engine/core/workspace/WorkspaceService.java @@ -0,0 +1,26 @@ +package com.xiaojusurvey.engine.core.workspace; + +import com.xiaojusurvey.engine.core.workspace.param.WorkspaceParam; +import com.xiaojusurvey.engine.core.workspace.vo.WorkspaceInfoVO; +import com.xiaojusurvey.engine.core.workspace.vo.WorkspaceMemberVO; +import org.springframework.web.bind.annotation.RequestBody; + +import javax.servlet.http.HttpServletRequest; +import java.util.List; + +/** + * @description: + * @author: wangchenglong + * @time: 2024/7/24 14:23 + */ +public interface WorkspaceService { + + String createWorkspace(HttpServletRequest request, @RequestBody WorkspaceParam workspaceParam); + + List findAll(HttpServletRequest request, Integer pageSize, Integer curPage, String name); + + WorkspaceMemberVO getWorkspaceInfo(HttpServletRequest request, String workspaceId); + + String update(HttpServletRequest request, @RequestBody WorkspaceParam workspaceParam, String workspaceId); + +} diff --git a/survey-core/src/main/java/com/xiaojusurvey/engine/core/workspace/impl/WorkspaceMemberServiceImpl.java b/survey-core/src/main/java/com/xiaojusurvey/engine/core/workspace/impl/WorkspaceMemberServiceImpl.java new file mode 100644 index 00000000..b29ee87f --- /dev/null +++ b/survey-core/src/main/java/com/xiaojusurvey/engine/core/workspace/impl/WorkspaceMemberServiceImpl.java @@ -0,0 +1,53 @@ +package com.xiaojusurvey.engine.core.workspace.impl; + +import com.xiaojusurvey.engine.common.entity.workspace.WorkspaceMember; +import com.xiaojusurvey.engine.core.workspace.WorkspaceMemberService; +import com.xiaojusurvey.engine.repository.MongoRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Sort; +import org.springframework.data.mongodb.core.query.Criteria; +import org.springframework.data.mongodb.core.query.Query; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @description: 空间成员 + * @author: wangchenglong + * @time: 2024/7/24 14:23 + */ +@Service +public class WorkspaceMemberServiceImpl implements WorkspaceMemberService { + + @Autowired + private MongoRepository mongoRepository; + + @Override + public List getWorkspaceMembers(String workspaceId, List userId) { + return mongoRepository.findList(new Query().addCriteria(Criteria.where("workspaceId").is(workspaceId)) + .addCriteria(Criteria.where("userId").in(userId)), WorkspaceMember.class); + } + + public WorkspaceMember getWorkspaceMember(String workspaceId, String userId) { + return mongoRepository.findOne(new Query().addCriteria(Criteria.where("workspaceId").is(workspaceId)) + .addCriteria(Criteria.where("userId").is(userId)), WorkspaceMember.class); + } + + /** + * 查询当前用户参与的空间 + * @param userId + * @return + */ + @Override + public List getWorkspaceMembers(String userId, Integer pageSize, Integer curPage) { + List workspaceMembers = mongoRepository.page(new Query().addCriteria(Criteria.where("userId").is(userId)) + .with(Sort.by(Sort.Direction.DESC, "createDate")), + curPage, pageSize, WorkspaceMember.class); + return workspaceMembers; + } + + @Override + public List getWorkspaceMembers(String workspaceId) { + return mongoRepository.findList(new Query().addCriteria(Criteria.where("workspaceId").is(workspaceId)), WorkspaceMember.class); + } +} diff --git a/survey-core/src/main/java/com/xiaojusurvey/engine/core/workspace/impl/WorkspaceServiceImpl.java b/survey-core/src/main/java/com/xiaojusurvey/engine/core/workspace/impl/WorkspaceServiceImpl.java new file mode 100644 index 00000000..dedfa3d1 --- /dev/null +++ b/survey-core/src/main/java/com/xiaojusurvey/engine/core/workspace/impl/WorkspaceServiceImpl.java @@ -0,0 +1,131 @@ +package com.xiaojusurvey.engine.core.workspace.impl; + +import com.xiaojusurvey.engine.bean.GeneralConvertor; +import com.xiaojusurvey.engine.common.constants.RespErrorCode; +import com.xiaojusurvey.engine.common.entity.user.User; +import com.xiaojusurvey.engine.common.entity.workspace.Workspace; +import com.xiaojusurvey.engine.common.entity.workspace.WorkspaceMember; +import com.xiaojusurvey.engine.common.enums.RoleEmum; +import com.xiaojusurvey.engine.common.exception.ServiceException; +import com.xiaojusurvey.engine.core.reslut.IdResult; +import com.xiaojusurvey.engine.core.workspace.WorkspaceMemberService; +import com.xiaojusurvey.engine.core.workspace.WorkspaceService; +import com.xiaojusurvey.engine.core.workspace.param.MemberParam; +import com.xiaojusurvey.engine.core.workspace.param.WorkspaceParam; +import com.xiaojusurvey.engine.core.workspace.vo.WorkspaceInfoVO; +import com.xiaojusurvey.engine.core.workspace.vo.WorkspaceMemberVO; +import com.xiaojusurvey.engine.repository.MongoRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.mongodb.core.query.Criteria; +import org.springframework.data.mongodb.core.query.Query; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; +import org.springframework.util.ObjectUtils; + +import javax.servlet.http.HttpServletRequest; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @description: 空间 + * @author: wangchenglong + * @time: 2024/7/24 14:23 + */ +@Service +public class WorkspaceServiceImpl implements WorkspaceService { + @Autowired + private MongoRepository mongoRepository; + + @Autowired + private GeneralConvertor convertor; + + @Autowired + private WorkspaceMemberService memberService; + + /** + * 创建空间 + * @param request + * @param param + * @return + */ + @Override + public String createWorkspace(HttpServletRequest request, WorkspaceParam param) { + Workspace workspace = this.convertor.convertor(param, Workspace.class); + User user = (User) request.getAttribute("user"); + IdResult idResult = new IdResult(); + idResult.setId(mongoRepository.save(workspace.setOwnerId(user.getId())).getId()); + if (!CollectionUtils.isEmpty(param.getMembers())) { + // 不能重复添加用户 + List userIds = param.getMembers().stream().map(MemberParam::getUserId).collect(Collectors.toList()); + List workspaceMembers = memberService.getWorkspaceMembers(idResult.getId(), userIds); + if (!CollectionUtils.isEmpty(workspaceMembers)) { + throw new ServiceException("不能重复添加用户", RespErrorCode.PARAMETER_ERROR.getCode()); + } + // 用户不存在 + param.getMembers().stream().forEach(member -> { + User memberUser = mongoRepository.findOne(new Query().addCriteria(Criteria.where("_id").is(member.getUserId())), User.class); + if (ObjectUtils.isEmpty(memberUser)) { + throw new ServiceException("用户id:" + member.getUserId() + "不存在", RespErrorCode.USER_NOT_EXISTS.getCode()); + } + }); + List members = this.convertor.convertor(param.getMembers(), WorkspaceMember.class); + members = members.stream().map(member -> member.setWorkspaceId(idResult.getId())).collect(Collectors.toList()); + members.add(new WorkspaceMember().setUserId(user.getId()).setWorkspaceId(idResult.getId()).setRole(RoleEmum.ADMIN.getValue())); + mongoRepository.batchSave(members, WorkspaceMember.class); + } + return idResult.getId(); + } + + /** + * 获取空间列表 + * @param request + * @param pageSize + * @param curPage + * @param name + * @return + */ + @Override + public List findAll(HttpServletRequest request, Integer pageSize, Integer curPage, String name) { + User user = (User) request.getAttribute("user"); + // 查询当前用户参与的空间 + List workspaceMembers = memberService.getWorkspaceMembers(user.getId(), pageSize, curPage); + List workspaceInfos = new ArrayList<>(); + workspaceMembers.stream().forEach(workspaceMember -> { + // 成员数量 + Long count = mongoRepository.count(new Query().addCriteria(Criteria.where("workspaceId").is(workspaceMember.getWorkspaceId())), WorkspaceMember.class); + Workspace workspace = mongoRepository.findOne(new Query().addCriteria(Criteria.where("_id").is(workspaceMember.getWorkspaceId())), Workspace.class); + WorkspaceInfoVO convertor = this.convertor.convertor(workspace, WorkspaceInfoVO.class); + workspaceInfos.add(convertor.setCurrentUserId(user.getId()) + .setCurrentUserRole(workspaceMembers.stream().filter(member -> member.getWorkspaceId().equals(workspaceMember.getWorkspaceId())).findFirst().get().getRole()) + .setMemberTotal(count) + .setSurveyTotal(0L) + .setOwner(workspace.getOwnerId().equals(user.getId()) ? user.getUsername() : mongoRepository.findOne(new Query().addCriteria(Criteria.where("_id").is(workspace.getOwnerId())), User.class).getUsername()) + .setOwnerId(workspace.getOwnerId())); + }); + return workspaceInfos; + } + + @Override + public WorkspaceMemberVO getWorkspaceInfo(HttpServletRequest request, String workspaceId) { + User user = (User) request.getAttribute("user"); + Workspace workspace = mongoRepository.findOne(new Query().addCriteria(Criteria.where("_id").is(workspaceId)), Workspace.class); + WorkspaceMemberVO workspaceMember = this.convertor.convertor_id(workspace, WorkspaceMemberVO.class); + List workspaceMembers = memberService.getWorkspaceMembers(workspaceId); + List members = this.convertor.convertor_ids(workspaceMembers, WorkspaceMemberVO.MembersVO.class); + workspaceMember.setCurrentUserId(user.getId()).setMembers(members); + workspaceMember.getMembers().forEach(member -> member.setUsername(member.getUserId().equals(user.getId()) ? user.getUsername() : + mongoRepository.findOne(new Query().addCriteria(Criteria.where("_id").is(member.getUserId())), User.class).getUsername())); + return workspaceMember; + } + + @Override + public String update(HttpServletRequest request, WorkspaceParam workspaceParam, String workspaceId) { + if (CollectionUtils.isEmpty(workspaceParam.getMembers())){ + throw new ServiceException("成员不能为空", RespErrorCode.PARAMETER_ERROR.getCode()); + } + return null; + } + + +} diff --git a/survey-core/src/main/java/com/xiaojusurvey/engine/core/workspace/param/MemberParam.java b/survey-core/src/main/java/com/xiaojusurvey/engine/core/workspace/param/MemberParam.java new file mode 100644 index 00000000..4cec3150 --- /dev/null +++ b/survey-core/src/main/java/com/xiaojusurvey/engine/core/workspace/param/MemberParam.java @@ -0,0 +1,16 @@ +package com.xiaojusurvey.engine.core.workspace.param; + +import lombok.Data; + +/** + * @description: + * @author: wangchenglong + * @time: 2024/7/24 14:44 + */ +@Data +public class MemberParam { + + private String userId; + + private String role; +} diff --git a/survey-core/src/main/java/com/xiaojusurvey/engine/core/workspace/param/WorkspaceParam.java b/survey-core/src/main/java/com/xiaojusurvey/engine/core/workspace/param/WorkspaceParam.java new file mode 100644 index 00000000..0294d68d --- /dev/null +++ b/survey-core/src/main/java/com/xiaojusurvey/engine/core/workspace/param/WorkspaceParam.java @@ -0,0 +1,29 @@ +package com.xiaojusurvey.engine.core.workspace.param; + +import com.xiaojusurvey.engine.common.entity.BaseEntity; +import lombok.Data; + +import java.util.List; + +/** + * @description: 空间VO + * @author: wangchenglong + * @time: 2024/7/24 14:37 + */ +@Data +public class WorkspaceParam extends BaseEntity { + /** + * 空间名称 + */ + private String name; + + /** + * 空间描述 + */ + private String description; + + /** + * 空间创建者 + */ + private List members; +} diff --git a/survey-core/src/main/java/com/xiaojusurvey/engine/core/workspace/vo/WorkspaceInfoVO.java b/survey-core/src/main/java/com/xiaojusurvey/engine/core/workspace/vo/WorkspaceInfoVO.java new file mode 100644 index 00000000..5b9521df --- /dev/null +++ b/survey-core/src/main/java/com/xiaojusurvey/engine/core/workspace/vo/WorkspaceInfoVO.java @@ -0,0 +1,56 @@ +package com.xiaojusurvey.engine.core.workspace.vo; + +import lombok.Data; + +/** + * @description: 空间信息VO + * @author: wangchenglong + * @time: 2024/7/25 14:23 + */ +@Data +public class WorkspaceInfoVO { + /** + * 空间 id + */ + private String _id; + + /** + * 所有者id + */ + private String ownerId; + + /** + * 所有者用户名 + */ + private String owner; + + /** + * 空间名称 + */ + private String name; + + /** + * 空间描述 + */ + private String description; + + /** + * 当前用户的 + */ + private String currentUserId; + + /** + * 当前用户的角色,枚举:admin、user + */ + private String currentUserRole; + + /** + * 包含的问卷总数 + */ + private Long surveyTotal; + + /** + * 包含的成员总数 + */ + private Long memberTotal; +} diff --git a/survey-core/src/main/java/com/xiaojusurvey/engine/core/workspace/vo/WorkspaceMemberVO.java b/survey-core/src/main/java/com/xiaojusurvey/engine/core/workspace/vo/WorkspaceMemberVO.java new file mode 100644 index 00000000..d18269c4 --- /dev/null +++ b/survey-core/src/main/java/com/xiaojusurvey/engine/core/workspace/vo/WorkspaceMemberVO.java @@ -0,0 +1,30 @@ +package com.xiaojusurvey.engine.core.workspace.vo; + +import lombok.Data; + +import java.util.List; + +/** + * @description: + * @author: wangchenglong + * @time: 2024/7/25 19:38 + */ +@Data +public class WorkspaceMemberVO { + private String name; + private String description; + private String currentUserId; + private String _id; + private List members; + + + @Data + public static class MembersVO { + private String _id; + private String userId; + private String username; + private String role; +// private String currentUserId; +// private String currentUserRole; + } +} diff --git a/survey-core/src/main/java/com/xiaojusurvey/engine/core/workspace/vo/WorkspaceVO.java b/survey-core/src/main/java/com/xiaojusurvey/engine/core/workspace/vo/WorkspaceVO.java new file mode 100644 index 00000000..22f4a1d8 --- /dev/null +++ b/survey-core/src/main/java/com/xiaojusurvey/engine/core/workspace/vo/WorkspaceVO.java @@ -0,0 +1,17 @@ +package com.xiaojusurvey.engine.core.workspace.vo; + +import lombok.Data; + +/** + * @description: 空间VO + * @author: wangchenglong + * @time: 2024/7/24 14:37 + */ +@Data +public class WorkspaceVO { + /** + * 新建的空间 id + */ + private String workspaceId; + +} diff --git a/survey-dal/src/main/java/com/xiaojusurvey/engine/repository/MongoRepository.java b/survey-dal/src/main/java/com/xiaojusurvey/engine/repository/MongoRepository.java index cc585519..f79738b1 100644 --- a/survey-dal/src/main/java/com/xiaojusurvey/engine/repository/MongoRepository.java +++ b/survey-dal/src/main/java/com/xiaojusurvey/engine/repository/MongoRepository.java @@ -90,4 +90,13 @@ public interface MongoRepository { * 多条件分页查询 */ List page(Query query, int pageIndex, int pageSize, Class entityClass); + + /** + * 多条件查询 + * @param query + * @param entityClass + * @param + * @return + */ + List findList(Query query, Class entityClass); } diff --git a/survey-dal/src/main/java/com/xiaojusurvey/engine/repository/impl/MongoRepositoryImpl.java b/survey-dal/src/main/java/com/xiaojusurvey/engine/repository/impl/MongoRepositoryImpl.java index 576b09ae..c2bc586d 100644 --- a/survey-dal/src/main/java/com/xiaojusurvey/engine/repository/impl/MongoRepositoryImpl.java +++ b/survey-dal/src/main/java/com/xiaojusurvey/engine/repository/impl/MongoRepositoryImpl.java @@ -113,4 +113,9 @@ public List page(Query query, int pageIndex, int pageS return mongoTemplate.find(query, entityClass); } + @Override + public List findList(Query query, Class entityClass) { + return mongoTemplate.find(query, entityClass); + } + } diff --git a/survey-server/src/main/java/com/xiaojusurvey/engine/controller/WorkspaceController.java b/survey-server/src/main/java/com/xiaojusurvey/engine/controller/WorkspaceController.java new file mode 100644 index 00000000..f9eeb1e0 --- /dev/null +++ b/survey-server/src/main/java/com/xiaojusurvey/engine/controller/WorkspaceController.java @@ -0,0 +1,68 @@ +package com.xiaojusurvey.engine.controller; + +import com.xiaojusurvey.engine.common.rpc.RpcResult; +import com.xiaojusurvey.engine.common.util.RpcResultUtil; +import com.xiaojusurvey.engine.core.workspace.WorkspaceService; +import com.xiaojusurvey.engine.core.workspace.param.WorkspaceParam; +import com.xiaojusurvey.engine.core.workspace.vo.WorkspaceInfoVO; +import com.xiaojusurvey.engine.core.workspace.vo.WorkspaceMemberVO; +import com.xiaojusurvey.engine.core.workspace.vo.WorkspaceVO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletRequest; +import java.util.List; + +/** + * @description: 空间、空间成员 + * @author: wangchenglong + * @time: 2024/7/24 14:33 + */ +@RequestMapping("/api/workspace") +@RestController +public class WorkspaceController { + + @Autowired + private WorkspaceService workspaceService; + + /** + * 创建空间 + * @param request + * @param workspaceParam + * @return + */ + @PostMapping + public RpcResult create(HttpServletRequest request, @RequestBody WorkspaceParam workspaceParam) { + return RpcResultUtil.createSuccessResult(new WorkspaceVO().setWorkspaceId(workspaceService.createWorkspace(request, workspaceParam))); + } + + /** + * 获取空间列表 + * @param request + * @param pageSize + * @param curPage + * @param name + * @return + */ + @GetMapping + public RpcResult> findAll(HttpServletRequest request, @RequestParam(defaultValue = "10") Integer pageSize, + @RequestParam(defaultValue = "0") Integer curPage, String name) { + return RpcResultUtil.createSuccessResult(workspaceService.findAll(request, pageSize, curPage, name)); + } + + /** + * 获取空间详情 + * @param request + * @param workspaceId + * @return + */ + @GetMapping("/{workspaceId}") + public RpcResult getWorkspaceInfo(HttpServletRequest request, @PathVariable String workspaceId) { + return RpcResultUtil.createSuccessResult(workspaceService.getWorkspaceInfo(request, workspaceId)); + } + + @PostMapping("/{workspaceId}") + public RpcResult update(HttpServletRequest request, @PathVariable String workspaceId, @RequestBody WorkspaceParam workspaceParam) { + return RpcResultUtil.createSuccessResult(workspaceService.getWorkspaceInfo(request, workspaceId)); + } +} diff --git a/survey-server/src/main/java/com/xiaojusurvey/engine/interceptor/LoginInterceptor.java b/survey-server/src/main/java/com/xiaojusurvey/engine/interceptor/LoginInterceptor.java index 3a08cbef..db5091e3 100644 --- a/survey-server/src/main/java/com/xiaojusurvey/engine/interceptor/LoginInterceptor.java +++ b/survey-server/src/main/java/com/xiaojusurvey/engine/interceptor/LoginInterceptor.java @@ -39,8 +39,8 @@ public boolean preHandle(HttpServletRequest request, HttpServletResponse respons //查询用户信息 Map claims = jwt.getClaims(); //获取用户名,密码 - String username = String.valueOf(claims.get("username")); - String userId = String.valueOf(claims.get("_id")); + String username = claims.get("username").asString(); + String userId = claims.get("_id").asString(); //判空 if (ObjectUtils.isEmpty(username) || ObjectUtils.isEmpty(userId)) { //token超时 diff --git a/survey-server/src/main/resources/application-dev.properties b/survey-server/src/main/resources/application-dev.properties index ba656c3b..97053d15 100644 --- a/survey-server/src/main/resources/application-dev.properties +++ b/survey-server/src/main/resources/application-dev.properties @@ -1,8 +1,10 @@ -server.port=8080 +server.port=8081 -spring.data.mongodb.host=localhost -spring.data.mongodb.port=27017 -spring.data.mongodb.database=testdb +#spring.data.mongodb.host=localhost +#spring.data.mongodb.port=27017 +#spring.data.mongodb.database=testdb + +spring.data.mongodb.uri=mongodb://adminUser:adminPassword@106.55.8.91:28018/admin XIAOJU_SURVEY_JWT_EXPIRES_IN=8 XIAOJU_SURVEY_JWT_SECRET=xiaojuSurveyJwtSecret From f8fa26d9121c91b5898cad53b41075f19fc98710 Mon Sep 17 00:00:00 2001 From: wangcl <15217009762@163.com> Date: Fri, 26 Jul 2024 19:29:08 +0800 Subject: [PATCH 3/9] =?UTF-8?q?=E5=88=A0=E9=99=A4=E8=8E=B7=E5=8F=96?= =?UTF-8?q?=E8=8E=B7=E5=8F=96jwt=E4=BF=A1=E6=81=AF=E4=B8=AD=E7=9A=84?= =?UTF-8?q?=E9=AD=94=E6=B3=95=E5=80=BC=EF=BC=9B=E5=A4=84=E7=90=86=E7=A9=BA?= =?UTF-8?q?=E6=8C=87=E9=92=88=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../engine/interceptor/LoginInterceptor.java | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/survey-server/src/main/java/com/xiaojusurvey/engine/interceptor/LoginInterceptor.java b/survey-server/src/main/java/com/xiaojusurvey/engine/interceptor/LoginInterceptor.java index 3a08cbef..12a26c1f 100644 --- a/survey-server/src/main/java/com/xiaojusurvey/engine/interceptor/LoginInterceptor.java +++ b/survey-server/src/main/java/com/xiaojusurvey/engine/interceptor/LoginInterceptor.java @@ -17,8 +17,12 @@ public class LoginInterceptor implements HandlerInterceptor { + public static final String USERNAME = "username"; + public static final String _ID = "_id"; + @Resource private JwtTokenUtil jwtTokenUtil; + @Resource private UserService userService; @@ -39,8 +43,13 @@ public boolean preHandle(HttpServletRequest request, HttpServletResponse respons //查询用户信息 Map claims = jwt.getClaims(); //获取用户名,密码 - String username = String.valueOf(claims.get("username")); - String userId = String.valueOf(claims.get("_id")); + String username = null, userId = null; + if (!ObjectUtils.isEmpty(claims.get(USERNAME))) { + username = claims.get(USERNAME).asString(); + } + if (!ObjectUtils.isEmpty(claims.get(_ID))) { + userId = claims.get(_ID).asString(); + } //判空 if (ObjectUtils.isEmpty(username) || ObjectUtils.isEmpty(userId)) { //token超时 From 61146d439c2423c7b56c08f54acb564242e49b42 Mon Sep 17 00:00:00 2001 From: wangcl <15217009762@163.com> Date: Sat, 27 Jul 2024 11:09:08 +0800 Subject: [PATCH 4/9] add error code --- .../xiaojusurvey/engine/common/constants/RespErrorCode.java | 1 + .../com/xiaojusurvey/engine/core/auth/util/AuthUtil.java | 6 ++++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/survey-common/src/main/java/com/xiaojusurvey/engine/common/constants/RespErrorCode.java b/survey-common/src/main/java/com/xiaojusurvey/engine/common/constants/RespErrorCode.java index 917010dc..836d0b1b 100644 --- a/survey-common/src/main/java/com/xiaojusurvey/engine/common/constants/RespErrorCode.java +++ b/survey-common/src/main/java/com/xiaojusurvey/engine/common/constants/RespErrorCode.java @@ -6,6 +6,7 @@ public enum RespErrorCode { AUTHENTICATION_FAILED(1001, "没有权限"), PARAMETER_ERROR(1002, "参数有误"), + ENCRYPTION_ERROR(1003, "加密异常"), USER_EXISTS(2001, "用户已存在"), USER_NOT_EXISTS(2002, "用户不存在"), USER_PASSWORD_ERROR(2003, "用户名或密码错误"), diff --git a/survey-core/src/main/java/com/xiaojusurvey/engine/core/auth/util/AuthUtil.java b/survey-core/src/main/java/com/xiaojusurvey/engine/core/auth/util/AuthUtil.java index df8ec72f..a46d3a7e 100644 --- a/survey-core/src/main/java/com/xiaojusurvey/engine/core/auth/util/AuthUtil.java +++ b/survey-core/src/main/java/com/xiaojusurvey/engine/core/auth/util/AuthUtil.java @@ -1,6 +1,9 @@ package com.xiaojusurvey.engine.core.auth.util; +import com.xiaojusurvey.engine.common.constants.RespErrorCode; +import com.xiaojusurvey.engine.common.exception.ServiceException; + import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; @@ -51,8 +54,7 @@ public static String hash256(String password) { } return hexString.toString(); } catch (NoSuchAlgorithmException e) { - e.printStackTrace(); - return null; + throw new ServiceException(RespErrorCode.ENCRYPTION_ERROR.getMessage(), RespErrorCode.ENCRYPTION_ERROR.getCode()); } } From 4c8c45f61fa8cb70892f228c7d97b250c02469da Mon Sep 17 00:00:00 2001 From: wangcl <15217009762@163.com> Date: Sat, 27 Jul 2024 13:34:40 +0800 Subject: [PATCH 5/9] =?UTF-8?q?=E5=B8=B8=E9=87=8F=E5=91=BD=E5=90=8D?= =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../engine/interceptor/LoginInterceptor.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/survey-server/src/main/java/com/xiaojusurvey/engine/interceptor/LoginInterceptor.java b/survey-server/src/main/java/com/xiaojusurvey/engine/interceptor/LoginInterceptor.java index 12a26c1f..56b5f6fe 100644 --- a/survey-server/src/main/java/com/xiaojusurvey/engine/interceptor/LoginInterceptor.java +++ b/survey-server/src/main/java/com/xiaojusurvey/engine/interceptor/LoginInterceptor.java @@ -17,8 +17,8 @@ public class LoginInterceptor implements HandlerInterceptor { - public static final String USERNAME = "username"; - public static final String _ID = "_id"; + public static final String USER_NAME = "username"; + public static final String USER_ID = "_id"; @Resource private JwtTokenUtil jwtTokenUtil; @@ -44,11 +44,11 @@ public boolean preHandle(HttpServletRequest request, HttpServletResponse respons Map claims = jwt.getClaims(); //获取用户名,密码 String username = null, userId = null; - if (!ObjectUtils.isEmpty(claims.get(USERNAME))) { - username = claims.get(USERNAME).asString(); + if (!ObjectUtils.isEmpty(claims.get(USER_NAME))) { + username = claims.get(USER_NAME).asString(); } - if (!ObjectUtils.isEmpty(claims.get(_ID))) { - userId = claims.get(_ID).asString(); + if (!ObjectUtils.isEmpty(claims.get(USER_ID))) { + userId = claims.get(USER_ID).asString(); } //判空 if (ObjectUtils.isEmpty(username) || ObjectUtils.isEmpty(userId)) { From 49bcca814b15a782bb1f101b90c4b6321299fd2d Mon Sep 17 00:00:00 2001 From: wangcl <15217009762@163.com> Date: Thu, 1 Aug 2024 17:34:02 +0800 Subject: [PATCH 6/9] =?UTF-8?q?1.=E6=96=B0=E5=A2=9Emongodb=E4=BA=8B?= =?UTF-8?q?=E4=BB=B6=E6=8B=A6=E6=88=AA=E5=99=A8=20MongoEntityInterceptor?= =?UTF-8?q?=202.=E6=96=B0=E5=A2=9E=E5=AF=B9=E8=B1=A1=E8=BD=AC=E6=8D=A2?= =?UTF-8?q?=E5=99=A8=20GeneralConvertor=203.=E6=96=B0=E5=A2=9E=E7=A9=BA?= =?UTF-8?q?=E9=97=B4Workspace=E6=8E=A5=E5=8F=A3=204.=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E7=A9=BA=E9=97=B4=E6=88=90=E5=91=98WorkspaceMember=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../engine/common/entity/InitBaseEntity.java | 13 ++ .../engine/common/enums/RecordStatusEnum.java | 38 ++++++ .../engine/common/enums/RoleEmum.java | 2 +- .../engine/bean/GeneralConvertor.java | 45 ++----- .../workspace/WorkspaceMemberService.java | 10 ++ .../core/workspace/WorkspaceService.java | 9 +- .../impl/WorkspaceMemberServiceImpl.java | 35 ++++- .../workspace/impl/WorkspaceServiceImpl.java | 111 ++++++++++++--- .../param/CreateWorkspaceMemberParam.java | 18 +++ .../core/workspace/param/WorkspaceParam.java | 2 +- .../core/workspace/vo/WorkspaceInfoVO.java | 4 +- .../core/workspace/vo/WorkspaceListVO.java | 16 +++ .../workspace/vo/WorkspaceMemberIdVO.java | 15 +++ .../core/workspace/vo/WorkspaceMemberVO.java | 10 +- .../repository/interceptor/MongoConfig.java | 20 +++ .../interceptor/MongoEntityInterceptor.java | 53 ++++++++ .../controller/WorkspaceController.java | 43 +++++- .../controller/WorkspaceMemberController.java | 59 ++++++++ .../controller/WorkspaceControllerTest.java | 127 ++++++++++++++++++ .../WorkspaceMemberControllerTest.java | 71 ++++++++++ 20 files changed, 628 insertions(+), 73 deletions(-) create mode 100644 survey-common/src/main/java/com/xiaojusurvey/engine/common/entity/InitBaseEntity.java create mode 100644 survey-common/src/main/java/com/xiaojusurvey/engine/common/enums/RecordStatusEnum.java create mode 100644 survey-core/src/main/java/com/xiaojusurvey/engine/core/workspace/param/CreateWorkspaceMemberParam.java create mode 100644 survey-core/src/main/java/com/xiaojusurvey/engine/core/workspace/vo/WorkspaceListVO.java create mode 100644 survey-core/src/main/java/com/xiaojusurvey/engine/core/workspace/vo/WorkspaceMemberIdVO.java create mode 100644 survey-dal/src/main/java/com/xiaojusurvey/engine/repository/interceptor/MongoConfig.java create mode 100644 survey-dal/src/main/java/com/xiaojusurvey/engine/repository/interceptor/MongoEntityInterceptor.java create mode 100644 survey-server/src/main/java/com/xiaojusurvey/engine/controller/WorkspaceMemberController.java create mode 100644 survey-server/src/test/java/com/xiaojusurvey/engine/controller/WorkspaceControllerTest.java create mode 100644 survey-server/src/test/java/com/xiaojusurvey/engine/controller/WorkspaceMemberControllerTest.java diff --git a/survey-common/src/main/java/com/xiaojusurvey/engine/common/entity/InitBaseEntity.java b/survey-common/src/main/java/com/xiaojusurvey/engine/common/entity/InitBaseEntity.java new file mode 100644 index 00000000..cd646d5a --- /dev/null +++ b/survey-common/src/main/java/com/xiaojusurvey/engine/common/entity/InitBaseEntity.java @@ -0,0 +1,13 @@ +package com.xiaojusurvey.engine.common.entity; + +import lombok.Data; + +/** + * @description: InitBaseEntity + * @author: wangchenglong + * @time: 2024/7/31 17:12 + */ +@Data +public class InitBaseEntity extends BaseEntity { + +} diff --git a/survey-common/src/main/java/com/xiaojusurvey/engine/common/enums/RecordStatusEnum.java b/survey-common/src/main/java/com/xiaojusurvey/engine/common/enums/RecordStatusEnum.java new file mode 100644 index 00000000..c9ce487a --- /dev/null +++ b/survey-common/src/main/java/com/xiaojusurvey/engine/common/enums/RecordStatusEnum.java @@ -0,0 +1,38 @@ +package com.xiaojusurvey.engine.common.enums; + +/** + * @description: 状态类型 + * @author: wangchenglong + * @time: 2024/7/30 16:08 + */ +public enum RecordStatusEnum { + + // 新建 + NEW("new"), + + // 编辑 + EDITING("editing"), + + // 暂停 + PAUSING("pausing"), + + // 发布 + PUBLISHED("published"), + + // 删除 + REMOVED("removed"), + + // 从回收站删除 + FORCE_REMOVED("forceRemoved"); + + private final String statusType; + + RecordStatusEnum(String statusType) { + this.statusType = statusType; + } + + public String getStatusType() { + return this.statusType; + } + +} diff --git a/survey-common/src/main/java/com/xiaojusurvey/engine/common/enums/RoleEmum.java b/survey-common/src/main/java/com/xiaojusurvey/engine/common/enums/RoleEmum.java index bdf916e3..7d710d1c 100644 --- a/survey-common/src/main/java/com/xiaojusurvey/engine/common/enums/RoleEmum.java +++ b/survey-common/src/main/java/com/xiaojusurvey/engine/common/enums/RoleEmum.java @@ -24,7 +24,7 @@ public Integer getState() { return this.state; } - public String getValue(){ + public String getValue() { return this.value; } diff --git a/survey-core/src/main/java/com/xiaojusurvey/engine/bean/GeneralConvertor.java b/survey-core/src/main/java/com/xiaojusurvey/engine/bean/GeneralConvertor.java index 4dc3e550..2af53f6b 100644 --- a/survey-core/src/main/java/com/xiaojusurvey/engine/bean/GeneralConvertor.java +++ b/survey-core/src/main/java/com/xiaojusurvey/engine/bean/GeneralConvertor.java @@ -1,10 +1,7 @@ package com.xiaojusurvey.engine.bean; -import org.dozer.DozerBeanMapper; import org.dozer.Mapper; -import org.dozer.loader.api.BeanMappingBuilder; -import org.dozer.loader.api.FieldsMappingOptions; import org.springframework.stereotype.Component; import javax.annotation.Resource; @@ -33,8 +30,10 @@ public class GeneralConvertor { * @param * @return */ - public List convertor(List source, Class clz){ - if (source == null) return null; + public List convertor(List source, Class clz) { + if (source == null) { + return null; + } List map = new ArrayList<>(); for (S s : source) { map.add(mapper.map(s, clz)); @@ -53,7 +52,9 @@ public List convertor(List source, Class clz){ * @return */ public Set convertor(Set source, Class clz) { - if (source == null) return null; + if (source == null) { + return null; + } Set set = new TreeSet<>(); for (S s : source) { set.add(mapper.map(s, clz)); @@ -71,38 +72,12 @@ public Set convertor(Set source, Class clz) { * @return */ public T convertor(S source, Class clz) { - if (source == null) return null; - return mapper.map(source, clz); - } - - /** - * 针对mongodb中的_id及id字段的转换 - * @param source - * @param destinationClass - * @param - * @return - */ - public T convertor_id(Object source, Class destinationClass) { - Mapper mapper = new DozerBeanMapper(); - ((DozerBeanMapper) mapper).addMapping(new BeanMappingBuilder() { - @Override - protected void configure() { - mapping(source.getClass(), destinationClass) - .fields("id", "_id", FieldsMappingOptions.copyByReference()); - } - }); - return mapper.map(source, destinationClass); - } - - public List convertor_ids(List sourceList, Class destinationClass) { - List destinationList = new ArrayList<>(); - for (S source : sourceList) { - destinationList.add(convertor_id(source, destinationClass)); + if (source == null) { + return null; } - return destinationList; + return mapper.map(source, clz); } - public void convertor(Object source, Object object) { mapper.map(source, object); } diff --git a/survey-core/src/main/java/com/xiaojusurvey/engine/core/workspace/WorkspaceMemberService.java b/survey-core/src/main/java/com/xiaojusurvey/engine/core/workspace/WorkspaceMemberService.java index 5cc19ac1..65a9a452 100644 --- a/survey-core/src/main/java/com/xiaojusurvey/engine/core/workspace/WorkspaceMemberService.java +++ b/survey-core/src/main/java/com/xiaojusurvey/engine/core/workspace/WorkspaceMemberService.java @@ -1,6 +1,8 @@ package com.xiaojusurvey.engine.core.workspace; import com.xiaojusurvey.engine.common.entity.workspace.WorkspaceMember; +import com.xiaojusurvey.engine.core.workspace.param.CreateWorkspaceMemberParam; +import org.springframework.web.bind.annotation.RequestBody; import java.util.List; @@ -16,4 +18,12 @@ public interface WorkspaceMemberService { List getWorkspaceMembers(String userId, Integer pageSize, Integer curPage); List getWorkspaceMembers(String workspaceId); + + WorkspaceMember getWorkspaceMember(String workspaceId, String userId); + + String create(CreateWorkspaceMemberParam createWorkspaceMemberParam); + + void delete(CreateWorkspaceMemberParam workspaceMemberParam); + + void updateRole(@RequestBody CreateWorkspaceMemberParam createWorkspaceMemberParam); } diff --git a/survey-core/src/main/java/com/xiaojusurvey/engine/core/workspace/WorkspaceService.java b/survey-core/src/main/java/com/xiaojusurvey/engine/core/workspace/WorkspaceService.java index 9cfda916..7279e455 100644 --- a/survey-core/src/main/java/com/xiaojusurvey/engine/core/workspace/WorkspaceService.java +++ b/survey-core/src/main/java/com/xiaojusurvey/engine/core/workspace/WorkspaceService.java @@ -1,7 +1,7 @@ package com.xiaojusurvey.engine.core.workspace; import com.xiaojusurvey.engine.core.workspace.param.WorkspaceParam; -import com.xiaojusurvey.engine.core.workspace.vo.WorkspaceInfoVO; +import com.xiaojusurvey.engine.core.workspace.vo.WorkspaceListVO; import com.xiaojusurvey.engine.core.workspace.vo.WorkspaceMemberVO; import org.springframework.web.bind.annotation.RequestBody; @@ -17,10 +17,13 @@ public interface WorkspaceService { String createWorkspace(HttpServletRequest request, @RequestBody WorkspaceParam workspaceParam); - List findAll(HttpServletRequest request, Integer pageSize, Integer curPage, String name); + WorkspaceListVO findAll(HttpServletRequest request, Integer pageSize, Integer curPage, String name); WorkspaceMemberVO getWorkspaceInfo(HttpServletRequest request, String workspaceId); - String update(HttpServletRequest request, @RequestBody WorkspaceParam workspaceParam, String workspaceId); + void update(HttpServletRequest request, @RequestBody WorkspaceParam workspaceParam, String workspaceId); + void delete(HttpServletRequest request, String workspaceId); + + List findAllByUserId(HttpServletRequest request); } diff --git a/survey-core/src/main/java/com/xiaojusurvey/engine/core/workspace/impl/WorkspaceMemberServiceImpl.java b/survey-core/src/main/java/com/xiaojusurvey/engine/core/workspace/impl/WorkspaceMemberServiceImpl.java index b29ee87f..9787690c 100644 --- a/survey-core/src/main/java/com/xiaojusurvey/engine/core/workspace/impl/WorkspaceMemberServiceImpl.java +++ b/survey-core/src/main/java/com/xiaojusurvey/engine/core/workspace/impl/WorkspaceMemberServiceImpl.java @@ -1,13 +1,18 @@ package com.xiaojusurvey.engine.core.workspace.impl; +import com.xiaojusurvey.engine.bean.GeneralConvertor; import com.xiaojusurvey.engine.common.entity.workspace.WorkspaceMember; +import com.xiaojusurvey.engine.common.enums.RecordStatusEnum; import com.xiaojusurvey.engine.core.workspace.WorkspaceMemberService; +import com.xiaojusurvey.engine.core.workspace.param.CreateWorkspaceMemberParam; import com.xiaojusurvey.engine.repository.MongoRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Sort; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; +import org.springframework.data.mongodb.core.query.Update; import org.springframework.stereotype.Service; +import org.springframework.web.bind.annotation.RequestBody; import java.util.List; @@ -22,17 +27,28 @@ public class WorkspaceMemberServiceImpl implements WorkspaceMemberService { @Autowired private MongoRepository mongoRepository; + @Autowired + private GeneralConvertor convertors; + @Override public List getWorkspaceMembers(String workspaceId, List userId) { return mongoRepository.findList(new Query().addCriteria(Criteria.where("workspaceId").is(workspaceId)) .addCriteria(Criteria.where("userId").in(userId)), WorkspaceMember.class); } + @Override public WorkspaceMember getWorkspaceMember(String workspaceId, String userId) { return mongoRepository.findOne(new Query().addCriteria(Criteria.where("workspaceId").is(workspaceId)) .addCriteria(Criteria.where("userId").is(userId)), WorkspaceMember.class); } + @Override + public String create(CreateWorkspaceMemberParam createWorkspaceMemberParam) { + WorkspaceMember workspaceMemberDto = convertors.convertor(createWorkspaceMemberParam, WorkspaceMember.class); + WorkspaceMember workspaceMember = mongoRepository.save(workspaceMemberDto); + return workspaceMember.getId(); + } + /** * 查询当前用户参与的空间 * @param userId @@ -41,13 +57,28 @@ public WorkspaceMember getWorkspaceMember(String workspaceId, String userId) { @Override public List getWorkspaceMembers(String userId, Integer pageSize, Integer curPage) { List workspaceMembers = mongoRepository.page(new Query().addCriteria(Criteria.where("userId").is(userId)) - .with(Sort.by(Sort.Direction.DESC, "createDate")), + .addCriteria(Criteria.where("curStatus.status").ne(RecordStatusEnum.REMOVED.getStatusType())) + .with(Sort.by(Sort.Direction.ASC, "createDate")), curPage, pageSize, WorkspaceMember.class); return workspaceMembers; } @Override public List getWorkspaceMembers(String workspaceId) { - return mongoRepository.findList(new Query().addCriteria(Criteria.where("workspaceId").is(workspaceId)), WorkspaceMember.class); + return mongoRepository.findList(new Query().addCriteria(Criteria.where("workspaceId").is(workspaceId)) + .with(Sort.by(Sort.Direction.ASC, "createDate")), WorkspaceMember.class); + } + + @Override + public void delete(CreateWorkspaceMemberParam workspaceMemberParam) { + mongoRepository.delete(new Query().addCriteria(Criteria.where("workspaceId").is(workspaceMemberParam.getWorkspaceId())) + .addCriteria(Criteria.where("userId").is(workspaceMemberParam.getUserId())), WorkspaceMember.class); + } + + @Override + public void updateRole(@RequestBody CreateWorkspaceMemberParam createWorkspaceMemberParam) { + mongoRepository.updateFirst(new Query().addCriteria(Criteria.where("workspaceId").is(createWorkspaceMemberParam.getWorkspaceId())) + .addCriteria(Criteria.where("_id").is(createWorkspaceMemberParam.getUserId())), + new Update().set("role", createWorkspaceMemberParam.getRole()), WorkspaceMember.class); } } diff --git a/survey-core/src/main/java/com/xiaojusurvey/engine/core/workspace/impl/WorkspaceServiceImpl.java b/survey-core/src/main/java/com/xiaojusurvey/engine/core/workspace/impl/WorkspaceServiceImpl.java index dedfa3d1..447cefd2 100644 --- a/survey-core/src/main/java/com/xiaojusurvey/engine/core/workspace/impl/WorkspaceServiceImpl.java +++ b/survey-core/src/main/java/com/xiaojusurvey/engine/core/workspace/impl/WorkspaceServiceImpl.java @@ -2,9 +2,12 @@ import com.xiaojusurvey.engine.bean.GeneralConvertor; import com.xiaojusurvey.engine.common.constants.RespErrorCode; +import com.xiaojusurvey.engine.common.entity.InitBaseEntity; +import com.xiaojusurvey.engine.common.entity.survey.SurveyMeta; import com.xiaojusurvey.engine.common.entity.user.User; import com.xiaojusurvey.engine.common.entity.workspace.Workspace; import com.xiaojusurvey.engine.common.entity.workspace.WorkspaceMember; +import com.xiaojusurvey.engine.common.enums.RecordStatusEnum; import com.xiaojusurvey.engine.common.enums.RoleEmum; import com.xiaojusurvey.engine.common.exception.ServiceException; import com.xiaojusurvey.engine.core.reslut.IdResult; @@ -13,11 +16,16 @@ import com.xiaojusurvey.engine.core.workspace.param.MemberParam; import com.xiaojusurvey.engine.core.workspace.param.WorkspaceParam; import com.xiaojusurvey.engine.core.workspace.vo.WorkspaceInfoVO; +import com.xiaojusurvey.engine.core.workspace.vo.WorkspaceListVO; import com.xiaojusurvey.engine.core.workspace.vo.WorkspaceMemberVO; import com.xiaojusurvey.engine.repository.MongoRepository; +import com.xiaojusurvey.engine.repository.interceptor.MongoEntityInterceptor; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Sort; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; +import org.springframework.data.mongodb.core.query.Update; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import org.springframework.util.ObjectUtils; @@ -32,13 +40,15 @@ * @author: wangchenglong * @time: 2024/7/24 14:23 */ +@Slf4j @Service public class WorkspaceServiceImpl implements WorkspaceService { + @Autowired private MongoRepository mongoRepository; @Autowired - private GeneralConvertor convertor; + private GeneralConvertor convertors; @Autowired private WorkspaceMemberService memberService; @@ -51,7 +61,7 @@ public class WorkspaceServiceImpl implements WorkspaceService { */ @Override public String createWorkspace(HttpServletRequest request, WorkspaceParam param) { - Workspace workspace = this.convertor.convertor(param, Workspace.class); + Workspace workspace = this.convertors.convertor(param, Workspace.class); User user = (User) request.getAttribute("user"); IdResult idResult = new IdResult(); idResult.setId(mongoRepository.save(workspace.setOwnerId(user.getId())).getId()); @@ -69,7 +79,7 @@ public String createWorkspace(HttpServletRequest request, WorkspaceParam param) throw new ServiceException("用户id:" + member.getUserId() + "不存在", RespErrorCode.USER_NOT_EXISTS.getCode()); } }); - List members = this.convertor.convertor(param.getMembers(), WorkspaceMember.class); + List members = this.convertors.convertor(param.getMembers(), WorkspaceMember.class); members = members.stream().map(member -> member.setWorkspaceId(idResult.getId())).collect(Collectors.toList()); members.add(new WorkspaceMember().setUserId(user.getId()).setWorkspaceId(idResult.getId()).setRole(RoleEmum.ADMIN.getValue())); mongoRepository.batchSave(members, WorkspaceMember.class); @@ -86,7 +96,8 @@ public String createWorkspace(HttpServletRequest request, WorkspaceParam param) * @return */ @Override - public List findAll(HttpServletRequest request, Integer pageSize, Integer curPage, String name) { + public WorkspaceListVO findAll(HttpServletRequest request, Integer pageSize, Integer curPage, String name) { + curPage -= 1; User user = (User) request.getAttribute("user"); // 查询当前用户参与的空间 List workspaceMembers = memberService.getWorkspaceMembers(user.getId(), pageSize, curPage); @@ -94,38 +105,98 @@ public List findAll(HttpServletRequest request, Integer pageSiz workspaceMembers.stream().forEach(workspaceMember -> { // 成员数量 Long count = mongoRepository.count(new Query().addCriteria(Criteria.where("workspaceId").is(workspaceMember.getWorkspaceId())), WorkspaceMember.class); - Workspace workspace = mongoRepository.findOne(new Query().addCriteria(Criteria.where("_id").is(workspaceMember.getWorkspaceId())), Workspace.class); - WorkspaceInfoVO convertor = this.convertor.convertor(workspace, WorkspaceInfoVO.class); - workspaceInfos.add(convertor.setCurrentUserId(user.getId()) - .setCurrentUserRole(workspaceMembers.stream().filter(member -> member.getWorkspaceId().equals(workspaceMember.getWorkspaceId())).findFirst().get().getRole()) - .setMemberTotal(count) - .setSurveyTotal(0L) - .setOwner(workspace.getOwnerId().equals(user.getId()) ? user.getUsername() : mongoRepository.findOne(new Query().addCriteria(Criteria.where("_id").is(workspace.getOwnerId())), User.class).getUsername()) - .setOwnerId(workspace.getOwnerId())); + Workspace workspace = mongoRepository.findOne(new Query().addCriteria(Criteria.where("_id").is(workspaceMember.getWorkspaceId())).addCriteria(Criteria.where("curStatus.status").ne(RecordStatusEnum.REMOVED.getStatusType())), Workspace.class); + // 问卷数量 + Long surveyCount = mongoRepository.count(new Query().addCriteria(Criteria.where("workspaceId").is(workspaceMember.getWorkspaceId())), SurveyMeta.class); + if (!ObjectUtils.isEmpty(workspace)) { + WorkspaceInfoVO convertor = this.convertors.convertor(workspace, WorkspaceInfoVO.class); + workspaceInfos.add(convertor.setCurrentUserId(user.getId()) + .setCurrentUserRole(workspaceMembers.stream().filter(member -> member.getWorkspaceId().equals(workspaceMember.getWorkspaceId())).findFirst().get().getRole()) + .setMemberTotal(count) + .setSurveyTotal(surveyCount) + .setOwner(workspace.getOwnerId().equals(user.getId()) ? user.getUsername() : mongoRepository.findOne(new Query().addCriteria(Criteria.where("_id").is(workspace.getOwnerId())), User.class).getUsername()) + .setOwnerId(workspace.getOwnerId())); + } }); - return workspaceInfos; + return new WorkspaceListVO().setData(workspaceInfos).setCount(workspaceMembers.size()); } @Override public WorkspaceMemberVO getWorkspaceInfo(HttpServletRequest request, String workspaceId) { User user = (User) request.getAttribute("user"); Workspace workspace = mongoRepository.findOne(new Query().addCriteria(Criteria.where("_id").is(workspaceId)), Workspace.class); - WorkspaceMemberVO workspaceMember = this.convertor.convertor_id(workspace, WorkspaceMemberVO.class); + WorkspaceMemberVO workspaceMember = this.convertors.convertor(workspace, WorkspaceMemberVO.class); List workspaceMembers = memberService.getWorkspaceMembers(workspaceId); - List members = this.convertor.convertor_ids(workspaceMembers, WorkspaceMemberVO.MembersVO.class); + List members = this.convertors.convertor(workspaceMembers, WorkspaceMemberVO.MembersVO.class); workspaceMember.setCurrentUserId(user.getId()).setMembers(members); - workspaceMember.getMembers().forEach(member -> member.setUsername(member.getUserId().equals(user.getId()) ? user.getUsername() : - mongoRepository.findOne(new Query().addCriteria(Criteria.where("_id").is(member.getUserId())), User.class).getUsername())); + workspaceMember.getMembers().forEach(member -> member.setWorkspaceId(workspaceId).setUsername(member.getUserId().equals(user.getId()) ? user.getUsername() : mongoRepository.findOne(new Query().addCriteria(Criteria.where("_id").is(member.getUserId())), User.class).getUsername())); return workspaceMember; } @Override - public String update(HttpServletRequest request, WorkspaceParam workspaceParam, String workspaceId) { - if (CollectionUtils.isEmpty(workspaceParam.getMembers())){ + public void update(HttpServletRequest request, WorkspaceParam workspaceParam, String workspaceId) { + if (CollectionUtils.isEmpty(workspaceParam.getMembers())) { throw new ServiceException("成员不能为空", RespErrorCode.PARAMETER_ERROR.getCode()); } - return null; + // 更新空间信息 + Workspace convertor = convertors.convertor(workspaceParam, Workspace.class); + mongoRepository.updateFirst(new Query().addCriteria(Criteria.where("_id").is(workspaceId)), + new Update().set("name", convertor.getName()).set("description", convertor.getDescription()), Workspace.class); + // 空间不能没有管理员 + boolean flag = workspaceParam.getMembers().stream().map(member -> member.getRole()).collect(Collectors.toList()).contains(RoleEmum.ADMIN.getValue()); + if (!flag) { + throw new ServiceException("空间不能没有管理员", RespErrorCode.PARAMETER_ERROR.getCode()); + } + // 不能有重复的userId + List userIds = workspaceParam.getMembers().stream().map(member -> member.getUserId()).distinct().collect(Collectors.toList()); + if (userIds.size() != workspaceParam.getMembers().size()) { + throw new ServiceException("不能重复添加用户", RespErrorCode.PARAMETER_ERROR.getCode()); + } + // 删除历史成员 + List oldWorkspaceUserId = mongoRepository.findList(new Query().addCriteria(Criteria.where("workspaceId").is(workspaceId)), WorkspaceMember.class).stream().map(WorkspaceMember::getUserId).collect(Collectors.toList()); + oldWorkspaceUserId.removeAll(userIds); + mongoRepository.delete(new Query().addCriteria(Criteria.where("workspaceId").is(workspaceId)) + .addCriteria(Criteria.where("userId").in(oldWorkspaceUserId)), WorkspaceMember.class); + // 检查所有成员是否真实存在 + workspaceParam.getMembers().stream().forEach(member -> { + User memberUser = mongoRepository.findOne(new Query().addCriteria(Criteria.where("_id").is(member.getUserId())), User.class); + if (ObjectUtils.isEmpty(memberUser)) { + throw new ServiceException("用户id:" + member.getUserId() + "不存在", RespErrorCode.USER_NOT_EXISTS.getCode()); + } + // 修改成员信息 + WorkspaceMember workspaceMember = memberService.getWorkspaceMember(workspaceId, memberUser.getId()); + if (ObjectUtils.isEmpty(workspaceMember)) { + mongoRepository.save(new WorkspaceMember().setUserId(memberUser.getId()).setWorkspaceId(workspaceId).setRole(member.getRole())); + } else { + if (workspaceMember.getRole() != member.getRole()) { + mongoRepository.updateFirst(new Query().addCriteria(Criteria.where("_id").is(workspaceMember.getId())) + .addCriteria(Criteria.where("workspaceId").is(workspaceId)), new Update().set("role", member.getRole()), WorkspaceMember.class); + } + } + }); } + @Override + public void delete(HttpServletRequest request, String workspaceId) { + Workspace workspace = mongoRepository.findOne(new Query().addCriteria(Criteria.where("_id").is(workspaceId)), Workspace.class); + // 更新空间状态 + InitBaseEntity initBaseEntity = MongoEntityInterceptor.updateDocument(workspace.getStatusList()); + mongoRepository.updateMulti(new Query().addCriteria(Criteria.where("_id").is(workspaceId)), + new Update().set("curStatus", initBaseEntity.getCurStatus()) + .set("statusList", initBaseEntity.getStatusList()), Workspace.class); + // 更新空间下的问卷状态 + mongoRepository.updateMulti(new Query().addCriteria(Criteria.where("workspaceId").is(workspaceId)), + new Update().set("curStatus", initBaseEntity.getCurStatus()) + .set("statusList", initBaseEntity.getStatusList()), SurveyMeta.class); + } + + @Override + public List findAllByUserId(HttpServletRequest request) { + List workspaceMembers = new ArrayList<>(); + User user = (User) request.getAttribute("user"); + List workspaces = mongoRepository.findList(new Query().addCriteria(Criteria.where("ownerId").is(user.getId())).with(Sort.by(Sort.Direction.DESC, "createDate")), Workspace.class); + workspaces.stream().forEach(workspace -> workspaceMembers.add(this.getWorkspaceInfo(request, workspace.getId()))); + return workspaceMembers; + } } diff --git a/survey-core/src/main/java/com/xiaojusurvey/engine/core/workspace/param/CreateWorkspaceMemberParam.java b/survey-core/src/main/java/com/xiaojusurvey/engine/core/workspace/param/CreateWorkspaceMemberParam.java new file mode 100644 index 00000000..2aff512c --- /dev/null +++ b/survey-core/src/main/java/com/xiaojusurvey/engine/core/workspace/param/CreateWorkspaceMemberParam.java @@ -0,0 +1,18 @@ +package com.xiaojusurvey.engine.core.workspace.param; + +import lombok.Data; + +/** + * @description: + * @author: wangchenglong + * @time: 2024/8/1 11:17 + */ +@Data +public class CreateWorkspaceMemberParam { + + private String userId; + + private String role; + + private String workspaceId; +} diff --git a/survey-core/src/main/java/com/xiaojusurvey/engine/core/workspace/param/WorkspaceParam.java b/survey-core/src/main/java/com/xiaojusurvey/engine/core/workspace/param/WorkspaceParam.java index 0294d68d..211cbea9 100644 --- a/survey-core/src/main/java/com/xiaojusurvey/engine/core/workspace/param/WorkspaceParam.java +++ b/survey-core/src/main/java/com/xiaojusurvey/engine/core/workspace/param/WorkspaceParam.java @@ -6,7 +6,7 @@ import java.util.List; /** - * @description: 空间VO + * @description: 空间Dto * @author: wangchenglong * @time: 2024/7/24 14:37 */ diff --git a/survey-core/src/main/java/com/xiaojusurvey/engine/core/workspace/vo/WorkspaceInfoVO.java b/survey-core/src/main/java/com/xiaojusurvey/engine/core/workspace/vo/WorkspaceInfoVO.java index 5b9521df..2ec15856 100644 --- a/survey-core/src/main/java/com/xiaojusurvey/engine/core/workspace/vo/WorkspaceInfoVO.java +++ b/survey-core/src/main/java/com/xiaojusurvey/engine/core/workspace/vo/WorkspaceInfoVO.java @@ -1,5 +1,6 @@ package com.xiaojusurvey.engine.core.workspace.vo; +import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Data; /** @@ -12,7 +13,8 @@ public class WorkspaceInfoVO { /** * 空间 id */ - private String _id; + @JsonProperty("_id") + private String id; /** * 所有者id diff --git a/survey-core/src/main/java/com/xiaojusurvey/engine/core/workspace/vo/WorkspaceListVO.java b/survey-core/src/main/java/com/xiaojusurvey/engine/core/workspace/vo/WorkspaceListVO.java new file mode 100644 index 00000000..1d786b3d --- /dev/null +++ b/survey-core/src/main/java/com/xiaojusurvey/engine/core/workspace/vo/WorkspaceListVO.java @@ -0,0 +1,16 @@ +package com.xiaojusurvey.engine.core.workspace.vo; + +import lombok.Data; + +import java.util.List; + +/** + * @description: 空间信息VO + * @author: wangchenglong + * @time: 2024/7/25 14:23 + */ +@Data +public class WorkspaceListVO { + private List data; + private Integer count; +} diff --git a/survey-core/src/main/java/com/xiaojusurvey/engine/core/workspace/vo/WorkspaceMemberIdVO.java b/survey-core/src/main/java/com/xiaojusurvey/engine/core/workspace/vo/WorkspaceMemberIdVO.java new file mode 100644 index 00000000..583e8578 --- /dev/null +++ b/survey-core/src/main/java/com/xiaojusurvey/engine/core/workspace/vo/WorkspaceMemberIdVO.java @@ -0,0 +1,15 @@ +package com.xiaojusurvey.engine.core.workspace.vo; + +import lombok.Data; + +/** + * @description: + * @author: wangchenglong + * @time: 2024/8/1 14:28 + */ +@Data +public class WorkspaceMemberIdVO { + + private String memberId; + +} diff --git a/survey-core/src/main/java/com/xiaojusurvey/engine/core/workspace/vo/WorkspaceMemberVO.java b/survey-core/src/main/java/com/xiaojusurvey/engine/core/workspace/vo/WorkspaceMemberVO.java index d18269c4..41d17b87 100644 --- a/survey-core/src/main/java/com/xiaojusurvey/engine/core/workspace/vo/WorkspaceMemberVO.java +++ b/survey-core/src/main/java/com/xiaojusurvey/engine/core/workspace/vo/WorkspaceMemberVO.java @@ -1,5 +1,6 @@ package com.xiaojusurvey.engine.core.workspace.vo; +import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Data; import java.util.List; @@ -14,17 +15,18 @@ public class WorkspaceMemberVO { private String name; private String description; private String currentUserId; - private String _id; + @JsonProperty("_id") + private String id; private List members; @Data public static class MembersVO { - private String _id; + @JsonProperty("_id") + private String id; private String userId; private String username; private String role; -// private String currentUserId; -// private String currentUserRole; + private String workspaceId; } } diff --git a/survey-dal/src/main/java/com/xiaojusurvey/engine/repository/interceptor/MongoConfig.java b/survey-dal/src/main/java/com/xiaojusurvey/engine/repository/interceptor/MongoConfig.java new file mode 100644 index 00000000..73718298 --- /dev/null +++ b/survey-dal/src/main/java/com/xiaojusurvey/engine/repository/interceptor/MongoConfig.java @@ -0,0 +1,20 @@ +package com.xiaojusurvey.engine.repository.interceptor; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.mongodb.config.EnableMongoAuditing; + +/** + * @description: MongoEntityInterceptor + * @author: wangchenglong + * @time: 2024/7/30 17:36 + */ +@Configuration +@EnableMongoAuditing +public class MongoConfig { + @Bean + public MongoEntityInterceptor auditEntityMongoListener() { + return new MongoEntityInterceptor(); + } + +} diff --git a/survey-dal/src/main/java/com/xiaojusurvey/engine/repository/interceptor/MongoEntityInterceptor.java b/survey-dal/src/main/java/com/xiaojusurvey/engine/repository/interceptor/MongoEntityInterceptor.java new file mode 100644 index 00000000..227085f6 --- /dev/null +++ b/survey-dal/src/main/java/com/xiaojusurvey/engine/repository/interceptor/MongoEntityInterceptor.java @@ -0,0 +1,53 @@ +package com.xiaojusurvey.engine.repository.interceptor; + +import com.xiaojusurvey.engine.common.entity.BaseEntity; +import com.xiaojusurvey.engine.common.entity.InitBaseEntity; +import com.xiaojusurvey.engine.common.entity.Status; +import com.xiaojusurvey.engine.common.enums.RecordStatusEnum; +import org.springframework.data.mongodb.core.mapping.event.AbstractMongoEventListener; +import org.springframework.data.mongodb.core.mapping.event.BeforeConvertEvent; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; + +import java.util.Arrays; +import java.util.List; + +/** + * @description: mongodb事件拦截器 + * @author: wangchenglong + * @time: 2024/7/30 16:37 + * @param + */ +@Component +public class MongoEntityInterceptor extends AbstractMongoEventListener { + + @Override + public void onBeforeConvert(BeforeConvertEvent event) { + Object entity = event.getSource(); + long time = System.currentTimeMillis(); + if (entity instanceof BaseEntity) { + String id = ((BaseEntity) entity).getId(); + if (ObjectUtils.isEmpty(id)) { + Status status = new Status().setStatus(RecordStatusEnum.NEW.getStatusType()).setDate(time); + ((BaseEntity) entity).setCurStatus(status) + .setCreateDate(time).setUpdateDate(time) + .setStatusList(Arrays.asList(status)); + } + } + } + + /** + * 更新操作维护公共字段 + * @param statusList + * @return + */ + public static InitBaseEntity updateDocument(List statusList) { + long time = System.currentTimeMillis(); + Status status = new Status().setStatus(RecordStatusEnum.REMOVED.getStatusType()).setDate(time); + statusList.add(status); + return (InitBaseEntity) new InitBaseEntity().setUpdateDate(time) + .setCurStatus(status) + .setStatusList(statusList); + } + +} diff --git a/survey-server/src/main/java/com/xiaojusurvey/engine/controller/WorkspaceController.java b/survey-server/src/main/java/com/xiaojusurvey/engine/controller/WorkspaceController.java index f9eeb1e0..6888a70a 100644 --- a/survey-server/src/main/java/com/xiaojusurvey/engine/controller/WorkspaceController.java +++ b/survey-server/src/main/java/com/xiaojusurvey/engine/controller/WorkspaceController.java @@ -4,7 +4,7 @@ import com.xiaojusurvey.engine.common.util.RpcResultUtil; import com.xiaojusurvey.engine.core.workspace.WorkspaceService; import com.xiaojusurvey.engine.core.workspace.param.WorkspaceParam; -import com.xiaojusurvey.engine.core.workspace.vo.WorkspaceInfoVO; +import com.xiaojusurvey.engine.core.workspace.vo.WorkspaceListVO; import com.xiaojusurvey.engine.core.workspace.vo.WorkspaceMemberVO; import com.xiaojusurvey.engine.core.workspace.vo.WorkspaceVO; import org.springframework.beans.factory.annotation.Autowired; @@ -14,7 +14,7 @@ import java.util.List; /** - * @description: 空间、空间成员 + * @description: 空间 * @author: wangchenglong * @time: 2024/7/24 14:33 */ @@ -45,8 +45,8 @@ public RpcResult create(HttpServletRequest request, @RequestBody Wo * @return */ @GetMapping - public RpcResult> findAll(HttpServletRequest request, @RequestParam(defaultValue = "10") Integer pageSize, - @RequestParam(defaultValue = "0") Integer curPage, String name) { + public RpcResult findAll(HttpServletRequest request, @RequestParam(defaultValue = "10") Integer pageSize, + @RequestParam(defaultValue = "1") Integer curPage, String name) { return RpcResultUtil.createSuccessResult(workspaceService.findAll(request, pageSize, curPage, name)); } @@ -61,8 +61,39 @@ public RpcResult getWorkspaceInfo(HttpServletRequest request, return RpcResultUtil.createSuccessResult(workspaceService.getWorkspaceInfo(request, workspaceId)); } + /** + * 更新空间详情 + * @param request + * @param workspaceId + * @param workspaceParam + * @return + */ @PostMapping("/{workspaceId}") - public RpcResult update(HttpServletRequest request, @PathVariable String workspaceId, @RequestBody WorkspaceParam workspaceParam) { - return RpcResultUtil.createSuccessResult(workspaceService.getWorkspaceInfo(request, workspaceId)); + public RpcResult update(HttpServletRequest request, @PathVariable String workspaceId, @RequestBody WorkspaceParam workspaceParam) { + workspaceService.update(request, workspaceParam, workspaceId); + return RpcResultUtil.createSuccessResult(true); } + + /** + * 删除空间 + * @param request + * @param workspaceId + * @return + */ + @DeleteMapping("/{workspaceId}") + public RpcResult delete(HttpServletRequest request, @PathVariable String workspaceId) { + workspaceService.delete(request, workspaceId); + return RpcResultUtil.createSuccessResult(true); + } + + /** + * 获取空间成员列表 + * @param request + * @return + */ + @GetMapping("/member/list") + public RpcResult> getWorkspaceAndMember(HttpServletRequest request) { + return RpcResultUtil.createSuccessResult(workspaceService.findAllByUserId(request)); + } + } diff --git a/survey-server/src/main/java/com/xiaojusurvey/engine/controller/WorkspaceMemberController.java b/survey-server/src/main/java/com/xiaojusurvey/engine/controller/WorkspaceMemberController.java new file mode 100644 index 00000000..0e32ef01 --- /dev/null +++ b/survey-server/src/main/java/com/xiaojusurvey/engine/controller/WorkspaceMemberController.java @@ -0,0 +1,59 @@ +package com.xiaojusurvey.engine.controller; + +import com.xiaojusurvey.engine.common.rpc.RpcResult; +import com.xiaojusurvey.engine.common.util.RpcResultUtil; +import com.xiaojusurvey.engine.core.workspace.WorkspaceMemberService; +import com.xiaojusurvey.engine.core.workspace.param.CreateWorkspaceMemberParam; +import com.xiaojusurvey.engine.core.workspace.vo.WorkspaceMemberIdVO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * @description: 空间空间成员 + * @author: wangchenglong + * @time: 2024/8/1 14:33 + */ +@RequestMapping("/api/workspaceMember") +@RestController +public class WorkspaceMemberController { + + @Autowired + private WorkspaceMemberService workspaceMemberService; + + /** + * 添加空间成员 + * @param createWorkspaceMemberParam + * @return + */ + @PostMapping + public RpcResult create(@RequestBody CreateWorkspaceMemberParam createWorkspaceMemberParam) { + return RpcResultUtil.createSuccessResult(new WorkspaceMemberIdVO().setMemberId(workspaceMemberService.create(createWorkspaceMemberParam))); + } + + /** + * 更新空间成员角色 + * @param createWorkspaceMemberParam + * @return + */ + @PostMapping("/updateRole") + public RpcResult updateRole(@RequestBody CreateWorkspaceMemberParam createWorkspaceMemberParam) { + workspaceMemberService.updateRole(createWorkspaceMemberParam); + return RpcResultUtil.createSuccessResult(true); + } + + + /** + * 删除空间成员 + * @param workspaceMemberParam + * @return + */ + @PostMapping("/deleteMember") + public RpcResult delete(@RequestBody CreateWorkspaceMemberParam workspaceMemberParam) { + workspaceMemberService.delete(workspaceMemberParam); + return RpcResultUtil.createSuccessResult(true); + } + +} diff --git a/survey-server/src/test/java/com/xiaojusurvey/engine/controller/WorkspaceControllerTest.java b/survey-server/src/test/java/com/xiaojusurvey/engine/controller/WorkspaceControllerTest.java new file mode 100644 index 00000000..5880f2af --- /dev/null +++ b/survey-server/src/test/java/com/xiaojusurvey/engine/controller/WorkspaceControllerTest.java @@ -0,0 +1,127 @@ +package com.xiaojusurvey.engine.controller; + +import com.xiaojusurvey.engine.common.rpc.RpcResult; +import com.xiaojusurvey.engine.core.workspace.WorkspaceService; +import com.xiaojusurvey.engine.core.workspace.param.WorkspaceParam; +import com.xiaojusurvey.engine.core.workspace.vo.WorkspaceListVO; +import com.xiaojusurvey.engine.core.workspace.vo.WorkspaceMemberVO; +import com.xiaojusurvey.engine.core.workspace.vo.WorkspaceVO; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.springframework.mock.web.MockHttpServletRequest; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +import javax.servlet.http.HttpServletRequest; +import java.util.ArrayList; +import java.util.List; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.*; +/** + * @description: WorkspaceController测试 + * @author: wangchenglong + * @time: 2024/8/1 16:52 + */ +@RunWith(SpringJUnit4ClassRunner.class) +public class WorkspaceControllerTest { + + @InjectMocks + private WorkspaceController workspaceController; + + @Mock + private WorkspaceService workspaceService; + + private MockHttpServletRequest mockRequest; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + mockRequest = new MockHttpServletRequest(); + } + + @Test + public void testCreateWorkspace() { + WorkspaceParam mockWorkspaceParam = new WorkspaceParam(); + String workspaceId = "123456"; + + when(workspaceService.createWorkspace(any(HttpServletRequest.class), any(WorkspaceParam.class))) + .thenReturn(workspaceId); + + RpcResult result = workspaceController.create(mockRequest, mockWorkspaceParam); + + assertEquals(true, result.getSuccess()); + assertEquals(workspaceId, result.getData().getWorkspaceId()); + } + + @Test + public void testFindAllWorkspaces() { + int pageSize = 10; + int curPage = 1; + String name = "TestWorkspace"; + WorkspaceListVO mockListVO = new WorkspaceListVO(); + + when(workspaceService.findAll(any(HttpServletRequest.class), eq(pageSize), eq(curPage), eq(name))) + .thenReturn(mockListVO); + + RpcResult result = workspaceController.findAll(mockRequest, pageSize, curPage, name); + + assertEquals(true, result.getSuccess()); + assertNotNull(result.getData()); + } + + @Test + public void testGetWorkspaceInfo() { + String workspaceId = "123456"; + WorkspaceMemberVO mockMemberVO = new WorkspaceMemberVO(); + + when(workspaceService.getWorkspaceInfo(any(HttpServletRequest.class), eq(workspaceId))) + .thenReturn(mockMemberVO); + + RpcResult result = workspaceController.getWorkspaceInfo(mockRequest, workspaceId); + + assertEquals(true, result.getSuccess()); + assertNotNull(result.getData()); + } + + @Test + public void testUpdateWorkspace() { + String workspaceId = "123456"; + WorkspaceParam mockWorkspaceParam = new WorkspaceParam(); + + RpcResult result = workspaceController.update(mockRequest, workspaceId, mockWorkspaceParam); + + assertEquals(true, result.getSuccess()); + verify(workspaceService, times(1)).update(any(HttpServletRequest.class), eq(mockWorkspaceParam), eq(workspaceId)); + } + + @Test + public void testDeleteWorkspace() { + String workspaceId = "123456"; + + RpcResult result = workspaceController.delete(mockRequest, workspaceId); + + assertEquals(true, result.getSuccess()); + verify(workspaceService, times(1)).delete(any(HttpServletRequest.class), eq(workspaceId)); + } + + @Test + public void testGetWorkspaceAndMemberList() { + List mockMemberList = new ArrayList<>(); + + when(workspaceService.findAllByUserId(any(HttpServletRequest.class))) + .thenReturn(mockMemberList); + + RpcResult> result = workspaceController.getWorkspaceAndMember(mockRequest); + + assertEquals(true, result.getSuccess()); + assertEquals(mockMemberList, result.getData()); + } + +} diff --git a/survey-server/src/test/java/com/xiaojusurvey/engine/controller/WorkspaceMemberControllerTest.java b/survey-server/src/test/java/com/xiaojusurvey/engine/controller/WorkspaceMemberControllerTest.java new file mode 100644 index 00000000..6ebb6f2d --- /dev/null +++ b/survey-server/src/test/java/com/xiaojusurvey/engine/controller/WorkspaceMemberControllerTest.java @@ -0,0 +1,71 @@ +package com.xiaojusurvey.engine.controller; + +import com.xiaojusurvey.engine.common.rpc.RpcResult; +import com.xiaojusurvey.engine.core.workspace.WorkspaceMemberService; +import com.xiaojusurvey.engine.core.workspace.param.CreateWorkspaceMemberParam; +import com.xiaojusurvey.engine.core.workspace.vo.WorkspaceMemberIdVO; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.springframework.mock.web.MockHttpServletRequest; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +import static org.junit.Assert.assertEquals; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.when; +/** + * @description: WorkspaceMemberController 测试 + * @author: wangchenglong + * @time: 2024/8/1 17:23 + */ +@RunWith(SpringJUnit4ClassRunner.class) +public class WorkspaceMemberControllerTest { + @InjectMocks + private WorkspaceMemberController workspaceMemberController; + + @Mock + private WorkspaceMemberService workspaceMemberService; + + private MockHttpServletRequest mockRequest; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + mockRequest = new MockHttpServletRequest(); + } + + @Test + public void testCreateWorkspaceMember() { + CreateWorkspaceMemberParam mockParam = new CreateWorkspaceMemberParam(); + String memberId = "123456"; + + when(workspaceMemberService.create(any(CreateWorkspaceMemberParam.class))) + .thenReturn(memberId); + + RpcResult result = workspaceMemberController.create(mockParam); + + assertEquals(true, result.getSuccess()); + assertEquals(memberId, result.getData().getMemberId()); + } + + @Test + public void testUpdateWorkspaceMemberRole() { + CreateWorkspaceMemberParam mockParam = new CreateWorkspaceMemberParam(); + + RpcResult result = workspaceMemberController.updateRole(mockParam); + + assertEquals(true, result.getSuccess()); + } + + @Test + public void testDeleteWorkspaceMember() { + CreateWorkspaceMemberParam mockParam = new CreateWorkspaceMemberParam(); + + RpcResult result = workspaceMemberController.delete(mockParam); + + assertEquals(true, result.getSuccess()); + } +} From b3e9dab0523568f7ef90ca3c644bdd749ac5260a Mon Sep 17 00:00:00 2001 From: wangcl <15217009762@163.com> Date: Thu, 1 Aug 2024 17:59:21 +0800 Subject: [PATCH 7/9] init application-dev.properties --- .../src/main/resources/application-dev.properties | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/survey-server/src/main/resources/application-dev.properties b/survey-server/src/main/resources/application-dev.properties index 97053d15..ba656c3b 100644 --- a/survey-server/src/main/resources/application-dev.properties +++ b/survey-server/src/main/resources/application-dev.properties @@ -1,10 +1,8 @@ -server.port=8081 +server.port=8080 -#spring.data.mongodb.host=localhost -#spring.data.mongodb.port=27017 -#spring.data.mongodb.database=testdb - -spring.data.mongodb.uri=mongodb://adminUser:adminPassword@106.55.8.91:28018/admin +spring.data.mongodb.host=localhost +spring.data.mongodb.port=27017 +spring.data.mongodb.database=testdb XIAOJU_SURVEY_JWT_EXPIRES_IN=8 XIAOJU_SURVEY_JWT_SECRET=xiaojuSurveyJwtSecret From 3756000429d3a3c329ebdedbbeb7a78d8021565d Mon Sep 17 00:00:00 2001 From: wangcl <15217009762@163.com> Date: Thu, 1 Aug 2024 20:53:15 +0800 Subject: [PATCH 8/9] =?UTF-8?q?=E5=88=A0=E9=99=A4Status=E7=9A=84get=20set?= =?UTF-8?q?=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../engine/common/entity/Status.java | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/survey-common/src/main/java/com/xiaojusurvey/engine/common/entity/Status.java b/survey-common/src/main/java/com/xiaojusurvey/engine/common/entity/Status.java index aa5c332e..39fad896 100644 --- a/survey-common/src/main/java/com/xiaojusurvey/engine/common/entity/Status.java +++ b/survey-common/src/main/java/com/xiaojusurvey/engine/common/entity/Status.java @@ -12,20 +12,4 @@ public class Status implements Serializable { private String status; - - public Long getDate() { - return date; - } - - public void setDate(Long date) { - this.date = date; - } - - public String getStatus() { - return status; - } - - public void setStatus(String status) { - this.status = status; - } } From a5972422fe7027ccf9500540835f9402410d6589 Mon Sep 17 00:00:00 2001 From: wangcl <15217009762@163.com> Date: Tue, 6 Aug 2024 10:54:39 +0800 Subject: [PATCH 9/9] =?UTF-8?q?pom=E4=BE=9D=E8=B5=96=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 6 ++++++ survey-core/pom.xml | 1 - .../engine/core/workspace/impl/WorkspaceServiceImpl.java | 5 ++++- .../repository/interceptor/MongoEntityInterceptor.java | 2 +- 4 files changed, 11 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index 9c93b1fd..c38fb1c3 100644 --- a/pom.xml +++ b/pom.xml @@ -34,6 +34,7 @@ 3.14.0 1.2.83 4.4.0 + 5.5.1 @@ -83,6 +84,11 @@ commons-lang3 ${lang3.version} + + net.sf.dozer + dozer + ${dozer.version} + diff --git a/survey-core/pom.xml b/survey-core/pom.xml index 76d3b3d3..7cee87af 100644 --- a/survey-core/pom.xml +++ b/survey-core/pom.xml @@ -36,7 +36,6 @@ net.sf.dozer dozer - 5.5.1 org.springframework.boot diff --git a/survey-core/src/main/java/com/xiaojusurvey/engine/core/workspace/impl/WorkspaceServiceImpl.java b/survey-core/src/main/java/com/xiaojusurvey/engine/core/workspace/impl/WorkspaceServiceImpl.java index 447cefd2..3f041b2c 100644 --- a/survey-core/src/main/java/com/xiaojusurvey/engine/core/workspace/impl/WorkspaceServiceImpl.java +++ b/survey-core/src/main/java/com/xiaojusurvey/engine/core/workspace/impl/WorkspaceServiceImpl.java @@ -53,6 +53,9 @@ public class WorkspaceServiceImpl implements WorkspaceService { @Autowired private WorkspaceMemberService memberService; + @Autowired + private MongoEntityInterceptor mongoEntityInterceptor; + /** * 创建空间 * @param request @@ -180,7 +183,7 @@ public void update(HttpServletRequest request, WorkspaceParam workspaceParam, St public void delete(HttpServletRequest request, String workspaceId) { Workspace workspace = mongoRepository.findOne(new Query().addCriteria(Criteria.where("_id").is(workspaceId)), Workspace.class); // 更新空间状态 - InitBaseEntity initBaseEntity = MongoEntityInterceptor.updateDocument(workspace.getStatusList()); + InitBaseEntity initBaseEntity = mongoEntityInterceptor.updateDocument(workspace.getStatusList()); mongoRepository.updateMulti(new Query().addCriteria(Criteria.where("_id").is(workspaceId)), new Update().set("curStatus", initBaseEntity.getCurStatus()) .set("statusList", initBaseEntity.getStatusList()), Workspace.class); diff --git a/survey-dal/src/main/java/com/xiaojusurvey/engine/repository/interceptor/MongoEntityInterceptor.java b/survey-dal/src/main/java/com/xiaojusurvey/engine/repository/interceptor/MongoEntityInterceptor.java index 227085f6..8c4ec19b 100644 --- a/survey-dal/src/main/java/com/xiaojusurvey/engine/repository/interceptor/MongoEntityInterceptor.java +++ b/survey-dal/src/main/java/com/xiaojusurvey/engine/repository/interceptor/MongoEntityInterceptor.java @@ -41,7 +41,7 @@ public void onBeforeConvert(BeforeConvertEvent event) { * @param statusList * @return */ - public static InitBaseEntity updateDocument(List statusList) { + public InitBaseEntity updateDocument(List statusList) { long time = System.currentTimeMillis(); Status status = new Status().setStatus(RecordStatusEnum.REMOVED.getStatusType()).setDate(time); statusList.add(status);