TRX 1 rok temu
rodzic
commit
05dc47d132

+ 2 - 1
FullCardClient/src/main/java/com/zhongshu/card/client/model/org/OrganizationUserModel.java

@@ -3,6 +3,7 @@ package com.zhongshu.card.client.model.org;
 import com.github.microservice.auth.security.type.AuthType;
 import com.zhongshu.card.client.model.base.SuperModel;
 import com.zhongshu.card.client.model.org.role.RoleModel;
+import com.zhongshu.card.client.model.org.role.RoleSimpleModel;
 import com.zhongshu.card.client.model.school.DictInfoSimpleModel;
 import com.zhongshu.card.client.type.CertificateType;
 import com.zhongshu.card.client.type.OrganizationUserType;
@@ -170,7 +171,7 @@ public class OrganizationUserModel extends SuperModel {
     private List<String> faceImages;
 
     @Schema(description = "角色信息")
-    private List<RoleModel> roles = new ArrayList<>();
+    private List<RoleSimpleModel> roles = new ArrayList<>();
 
     @Schema(description = "角色-人员类型名称")
     private String roleNames;

+ 3 - 3
FullCardClient/src/main/java/com/zhongshu/card/client/model/org/register/UserCountRegisterParam.java

@@ -15,7 +15,7 @@ import java.util.List;
  * @date 2024/5/31
  */
 @Data
-public class UserCountRegisterParam  extends ProjectOidParam {
+public class UserCountRegisterParam extends ProjectOidParam {
 
     @Schema(description = "用户手机号")
     private String phone;
@@ -26,7 +26,8 @@ public class UserCountRegisterParam  extends ProjectOidParam {
     @Schema(description = "密码")
     private String passWord;
 
-
+    @Schema(description = "验证密码")
+    private String rePassWord;
 
     @Schema(description = "编码")
     private String code;
@@ -62,7 +63,6 @@ public class UserCountRegisterParam  extends ProjectOidParam {
     private String departmentId;
 
 
-
     @Schema(description = "是否是管理员")
     private Boolean isAdmin = Boolean.FALSE;
 

+ 4 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/service/org/UserAccountService.java

@@ -22,6 +22,10 @@ public interface UserAccountService {
     // 查询机构用户列表
     ResultContent<Page<OrganizationUserModel>> projectUserPage(OrganizationUserSearch param, Pageable pageable);
 
+    // 查询机构用户列表
+    ResultContent<Page<OrganizationUserModel>> projectUserOpenPage(OrganizationUserSearch param, Pageable pageable);
+
+
     /**
      * 得到机构用户详情
      *

+ 8 - 4
FullCardClient/src/main/java/com/zhongshu/card/client/type/PassWordType.java

@@ -6,15 +6,19 @@ import lombok.Getter;
  * 密码限制类型强度
  */
 public enum PassWordType {
-    Weak("弱(6位以上)"),
-    Medium("中(8位+数字)"),
-    Strong("强(8位+大小写+符号)"),
+    Weak("弱(6位以上)", 6),
+    Medium("中(8位+数字)", 8),
+    Strong("强(8位+大小写+符号)", 8),
     ;
 
     @Getter
     private String remark;
 
-    PassWordType(String remark) {
+    @Getter
+    private Integer minLength;
+
+    PassWordType(String remark, Integer minLength) {
         this.remark = remark;
+        this.minLength = minLength;
     }
 }

+ 16 - 3
FullCardServer/src/main/java/com/zhongshu/card/server/core/controller/org/OrganizationUserController.java

@@ -20,6 +20,7 @@ import io.swagger.v3.oas.annotations.Parameter;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import jakarta.servlet.http.HttpServletRequest;
 import jakarta.servlet.http.HttpServletResponse;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
@@ -80,9 +81,7 @@ public class OrganizationUserController {
     @ResourceAuth(value = "user", type = AuthType.User)
     @Operation(summary = "项目用户列表-分页查询", description = "项目用户列表-分页查询")
     @RequestMapping(value = {"projectUserPage"}, method = {RequestMethod.POST})
-    public ResultContent<Page<OrganizationUserModel>> projectUserPage(
-            @Parameter(hidden = true) @PageableDefault(page = 0, size = 10) Pageable pageable,
-            @Parameter(required = false) OrganizationUserSearch param) {
+    public ResultContent<Page<OrganizationUserModel>> projectUserPage(@Parameter(hidden = true) @PageableDefault(page = 0, size = 10) Pageable pageable, @Parameter(required = false) OrganizationUserSearch param) {
         Assert.hasText(param.getProjectOid(), "projectOid不能为空");
         // 项目用户 包括项目下所有的机构的用户
         param.setIsSearchProject(Boolean.TRUE);
@@ -90,6 +89,20 @@ public class OrganizationUserController {
         return userAccountService.projectUserPage(param, pageable);
     }
 
+    @Operation(summary = "项目用户列表-分页查询", description = "项目用户列表-分页查询")
+    @RequestMapping(value = {"projectUserPageFree"}, method = {RequestMethod.POST})
+    public ResultContent<Page<OrganizationUserModel>> projectUserPageFree(@Parameter(hidden = true) @PageableDefault(page = 0, size = 10) Pageable pageable, @Parameter(required = false) OrganizationUserSearch param) {
+        Assert.hasText(param.getProjectOid(), "projectOid不能为空");
+        String phone = param.getPhone();
+        if (StringUtils.isEmpty(phone) || phone.length() < 4) {
+            return ResultContent.buildFail("phone不能为空或小于4位");
+        }
+        // 项目用户 包括项目下所有的机构的用户
+        param.setIsSearchProject(Boolean.TRUE);
+        param.setIsOrg(Boolean.TRUE);
+        return userAccountService.projectUserOpenPage(param, pageable);
+    }
+
     @ResourceAuth(value = "user", type = AuthType.User)
     @Operation(summary = "机构用户列表-分页查询", description = "机构用户列表-分页查询")
     @RequestMapping(value = {"orgUserPage"}, method = {RequestMethod.POST})

+ 27 - 7
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/org/OrganizationUserServiceImpl.java

@@ -38,6 +38,8 @@ import com.zhongshu.card.server.core.service.user.RoleServiceImpl;
 import com.zhongshu.card.server.core.service.user.UserAccountServiceImpl;
 import com.zhongshu.card.server.core.util.CommonUtil;
 import com.zhongshu.card.server.core.util.ExcelUtils;
+import com.zhongshu.card.server.core.util.ValidateResult;
+import com.zhongshu.card.server.core.util.ValidateUtils;
 import com.zhongshu.card.server.core.util.excel.CommonExeclParam;
 import com.zhongshu.card.server.core.util.excel.CommonExeclTd;
 import jakarta.servlet.http.HttpServletRequest;
@@ -227,7 +229,7 @@ public class OrganizationUserServiceImpl extends SuperService {
     }
 
     /**
-     * 注册用户
+     * 小程序项目注册用户
      *
      * @param param
      * @return
@@ -245,23 +247,41 @@ public class OrganizationUserServiceImpl extends SuperService {
             return ResultContent.buildFail("项目的通用配置未配置");
         }
         if (projectCommonConfig.getIsAllowRegister() == null || !projectCommonConfig.getIsAllowRegister()) {
-            return ResultContent.buildFail("项目允许注册用户");
+            return ResultContent.buildFail("项目允许注册用户");
         }
         if (ObjectUtils.isEmpty(param.getRoleIds())) {
             return ResultContent.buildFail("roleIds 不能为空");
         }
-
-
         String phone = param.getPhone();
+        if (!ValidateUtils.isPhoneNumber(phone)) {
+            return ResultContent.buildFail("手机号格式错误");
+        }
+        if (StringUtils.isEmpty(param.getPassWord())) {
+            return ResultContent.buildFail("密码不能为空");
+        }
+        if (!param.getPassWord().equals(param.getRePassWord())) {
+            return ResultContent.buildFail("密码和确认密码不一致");
+        }
+        // 验证密码强度
+        ValidateResult passResult = ValidateUtils.validatePassWord(param.getPassWord(), projectCommonConfig.getPassWordType());
+        if (!passResult.isSuccess()) {
+            return ResultContent.buildFail(passResult.getMsg());
+        }
+
         String loginName = phone;
         UserAccount userAccount = userCountDao.findTopByLoginName(loginName);
 
         if (ObjectUtils.isEmpty(userAccount)) {
             String password = param.getPassWord();
-            String name = "游客";
-            if (phone != null && phone.length() == 11) {
-                name = "游客" + loginName.substring(8, 11);
+            String name = param.getName();
+            if (StringUtils.isEmpty(name)) {
+                name = "游客";
+                if (phone != null && phone.length() == 11) {
+                    name = "游客" + loginName.substring(8, 11);
+                }
             }
+            // 密码验证
+
             // 用户基本信息维护 电话号码为登录名
             RegisterUserAccountParam userAccountParam = new RegisterUserAccountParam();
             userAccountParam.setLoginName(loginName);

+ 63 - 3
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/user/UserAccountServiceImpl.java

@@ -8,11 +8,12 @@ import com.github.microservice.auth.client.type.LoginType;
 import com.github.microservice.components.data.base.util.PageEntityUtil;
 import com.github.microservice.net.ResultContent;
 import com.github.microservice.net.ResultMessage;
+import com.github.microservice.utils.DesenUtil;
 import com.google.common.collect.Lists;
 import com.zhongshu.card.client.model.base.AuthTypeParam;
 import com.zhongshu.card.client.model.base.UserIdModel;
 import com.zhongshu.card.client.model.org.*;
-import com.zhongshu.card.client.model.org.role.RoleModel;
+import com.zhongshu.card.client.model.org.role.RoleSimpleModel;
 import com.zhongshu.card.client.model.orgModel.OrgBindUserAllParam;
 import com.zhongshu.card.client.model.school.DictInfoSimpleModel;
 import com.zhongshu.card.client.service.org.UserAccountService;
@@ -164,7 +165,7 @@ public class UserAccountServiceImpl extends SuperService implements UserAccountS
             userCountDao.save(userAccount);
         } else {
             // 编辑
-             BeanUtils.copyPropertiesWithoutNull(param, userAccount);
+            BeanUtils.copyPropertiesWithoutNull(param, userAccount);
             String realName = param.getRealName();
             if (StringUtils.isEmpty(realName)) {
                 realName = param.getName();
@@ -462,6 +463,12 @@ public class UserAccountServiceImpl extends SuperService implements UserAccountS
         return ResultContent.buildSuccess(PageEntityUtil.concurrent2PageModel(page, this::toOrgUserModel));
     }
 
+    @Override
+    public ResultContent<Page<OrganizationUserModel>> projectUserOpenPage(OrganizationUserSearch param, Pageable pageable) {
+        Page<OrganizationUser> page = organizationUserDao.page(pageable, param);
+        return ResultContent.buildSuccess(PageEntityUtil.concurrent2PageModel(page, this::toOrgUserDesenModel));
+    }
+
     /**
      * 查询机构用户列表
      *
@@ -685,6 +692,17 @@ public class UserAccountServiceImpl extends SuperService implements UserAccountS
         return model;
     }
 
+    public UserCountSimpleModel toSimpleDesenModel(UserAccount entity) {
+        UserCountSimpleModel model = null;
+        if (ObjectUtils.isNotEmpty(entity)) {
+            model = new UserCountSimpleModel();
+            BeanUtils.copyProperties(entity, model);
+            model.setLoginName("***");
+            model.setPhone(DesenUtil.turnPhoneDesen(model.getPhone()));
+        }
+        return model;
+    }
+
     /**
      * 用户在机构的数据模型(用户信息、职位、部门、角色等)
      *
@@ -710,7 +728,49 @@ public class UserAccountServiceImpl extends SuperService implements UserAccountS
 
             // 角色信息
             if (ObjectUtils.isNotEmpty(entity.getRoles())) {
-                List<RoleModel> roleModels = entity.getRoles().stream().map(roleServiceImpl::toModel).collect(Collectors.toList());
+                List<RoleSimpleModel> roleModels = entity.getRoles().stream().map(roleServiceImpl::toSimpleModel).collect(Collectors.toList());
+                model.setRoles(roleModels);
+            }
+
+            // 部门信息
+            if (ObjectUtils.isNotEmpty(entity.getDepartment())) {
+                DepartmentModel departmentModel = departmentService.toModel(entity.getDepartment());
+                model.setDepartment(departmentModel);
+                List<DepartmentModel> departmentModels = departmentService.getParents(entity.getDepartment().getId());
+                model.setDepartments(departmentModels);
+            }
+        }
+        return model;
+    }
+
+    /**
+     * 脱敏模型
+     *
+     * @param entity
+     * @return
+     */
+    public OrganizationUserModel toOrgUserDesenModel(OrganizationUser entity) {
+        OrganizationUserModel model = new OrganizationUserModel();
+        if (ObjectUtils.isNotEmpty(entity)) {
+            BeanUtils.copyProperties(entity, model);
+            model.setPhone(DesenUtil.turnPhoneDesen(model.getPhone()));
+            model.setCardNumber(DesenUtil.turnIDCardDesen(model.getCardNumber()));
+
+            // 机构信息
+            OrganizationMiniModel miniModel = organizationManagerService.toMiniModel(entity.getOrganization());
+            model.setOrganization(miniModel);
+
+            // 用户信息
+            UserCountSimpleModel userCountModel = toSimpleDesenModel(entity.getUser());
+            model.setUser(userCountModel);
+
+            // 职务 职位
+            DictInfoSimpleModel position = dictInfoService.toSimpleModel(entity.getPosition());
+            model.setPosition(position);
+
+            // 角色信息
+            if (ObjectUtils.isNotEmpty(entity.getRoles())) {
+                List<RoleSimpleModel> roleModels = entity.getRoles().stream().map(roleServiceImpl::toSimpleModel).collect(Collectors.toList());
                 model.setRoles(roleModels);
             }
 

+ 6 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/util/ValidateResult.java

@@ -16,4 +16,10 @@ public class ValidateResult {
      * 匹配找出的字符串
      */
     private String msg = "";
+
+    public ValidateResult setFailed(String msg) {
+        this.msg = msg;
+        this.isSuccess = false;
+        return this;
+    }
 }

+ 62 - 2
FullCardServer/src/main/java/com/zhongshu/card/server/core/util/ValidateUtils.java

@@ -1,5 +1,6 @@
 package com.zhongshu.card.server.core.util;
 
+import com.zhongshu.card.client.type.PassWordType;
 import com.zhongshu.card.server.core.dataConfig.PasswordCheckConf;
 import org.apache.commons.lang3.StringUtils;
 
@@ -131,8 +132,7 @@ public class ValidateUtils {
             result.setSuccess(false);
             result.setMsg("密码不能为空");
         } else {
-            if (passWord.length() < Integer.parseInt(PasswordCheckConf.MIN_LENGTH)
-                    || passWord.length() > Integer.parseInt(PasswordCheckConf.MAX_LENGTH)) {
+            if (passWord.length() < Integer.parseInt(PasswordCheckConf.MIN_LENGTH) || passWord.length() > Integer.parseInt(PasswordCheckConf.MAX_LENGTH)) {
                 result.setSuccess(false);
                 result.setMsg(String.format("密码长度必须大于%s位,小于%s位", PasswordCheckConf.MIN_LENGTH, PasswordCheckConf.MAX_LENGTH));
             }
@@ -148,4 +148,64 @@ public class ValidateUtils {
         return result;
     }
 
+    public static ValidateResult validatePassWord(String passWord, PassWordType passWordType) {
+        ValidateResult result = new ValidateResult();
+        result.setSuccess(true);
+        if (StringUtils.isEmpty(passWord)) {
+            return result.setFailed("密码不能为空");
+        }
+        int length = passWord.length();
+        if (passWordType == PassWordType.Weak) {
+            if (length < passWordType.getMinLength()) {
+                return result.setFailed(String.format("密码长度不能小于%d位", passWordType.getMinLength()));
+            }
+        } else if (passWordType == PassWordType.Medium) {
+            if (length < passWordType.getMinLength()) {
+                return result.setFailed(String.format("密码长度不能小于%d位", passWordType.getMinLength()));
+            }
+            if (!isContainNumber(passWord)) {
+                return result.setFailed(String.format("密码不符合规范:%s", passWordType.getRemark()));
+            }
+        } else if (passWordType == PassWordType.Strong) {
+            if (length < passWordType.getMinLength()) {
+                return result.setFailed(String.format("密码长度不能小于%d位", passWordType.getMinLength()));
+            }
+            if (!isContainsUppercaseAndLowercase(passWord)) {
+                return result.setFailed(String.format("密码不符合规范:%s", passWordType.getRemark()));
+            }
+        }
+        return result;
+    }
+
+    /**
+     * 包含至少一个数字
+     *
+     * @param str
+     * @return
+     */
+    public static boolean isContainNumber(String str) {
+        if (StringUtils.isEmpty(str)) {
+            return false;
+        }
+        String regex = "\\d+";
+        // 创建Pattern对象
+        Pattern pattern = Pattern.compile(regex);
+        // 创建matcher对象
+        Matcher matcher = pattern.matcher(str);
+        if (matcher.find()) {
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * 必须包含一个大写字母  一个小写字母
+     *
+     * @param str
+     * @return
+     */
+    public static boolean isContainsUppercaseAndLowercase(String str) {
+        String regex = "(?=.*[A-Z])(?=.*[a-z])";
+        return str.matches(regex);
+    }
 }