TRX преди 1 година
родител
ревизия
d23cea3676

+ 4 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/model/org/OrganizationAddParam.java

@@ -2,6 +2,7 @@ package com.zhongshu.card.client.model.org;
 
 import com.github.microservice.auth.security.type.AuthType;
 import com.zhongshu.card.client.model.base.SuperParam;
+import com.zhongshu.card.client.utils.type.OrganizationState;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
@@ -50,4 +51,7 @@ public class OrganizationAddParam extends SuperParam {
 
     @Schema(description = "密码")
     private String password;
+
+    @Schema(description = "")
+    OrganizationState state;
 }

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

@@ -9,7 +9,7 @@ import lombok.Data;
  */
 @Data
 public class SchoolAddParam extends OrganizationAddParam{
-    @Schema(description = "项目ID")
+    @Schema(description = "项目ID 取oid")
     private String projectId;
 
 }

+ 3 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/service/org/OrganizationService.java

@@ -32,6 +32,9 @@ public interface OrganizationService {
 
     public ResultContent<Page<OrganizationModel>> pageProject(OrganizationSearchParam param, Pageable pageable);
 
+    // 查询可用的项目列表
+    ResultContent<List<OrganizationModel>> getProjectList();
+
     public ResultContent<List<OrganizationModel>> getUserOrgList(OrganizationUserSearch param);
 
     public ResultContent buildCode(AuthType authType);

+ 9 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/controller/org/OrganizationController.java

@@ -21,6 +21,8 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.util.List;
+
 @RestController
 @RequestMapping("organization")
 @Tag(name = "机构管理")
@@ -97,4 +99,11 @@ public class OrganizationController {
         return this.organizationService.buildCode(AuthType.Project);
     }
 
+    @ResourceAuth(value = "user",type = AuthType.User)
+    @Operation(summary = "查询所有可用的项目列表", description = "查询所有可用的项目列表")
+    @RequestMapping(value = "getProjectList", method = {RequestMethod.GET})
+    public ResultContent<List<OrganizationModel>> getProjectList() {
+        return this.organizationService.getProjectList();
+    }
+
 }

+ 6 - 1
FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/org/OrganizationDao.java

@@ -2,9 +2,12 @@ package com.zhongshu.card.server.core.dao.org;
 
 import com.github.microservice.auth.security.type.AuthType;
 import com.github.microservice.components.data.mongo.mongo.dao.MongoDao;
+import com.zhongshu.card.client.utils.type.OrganizationState;
 import com.zhongshu.card.server.core.dao.org.extend.OrganizationDaoExtend;
 import com.zhongshu.card.server.core.domain.org.Organization;
 
+import java.util.List;
+
 /**
  * @author TRX
  * @date 2024/3/21
@@ -17,7 +20,9 @@ public interface OrganizationDao extends MongoDao<Organization>, OrganizationDao
 
     Organization findTopByName(String name);
 
-    Organization findByAuthType(AuthType authType);
+    Organization findTopByAuthType(AuthType authType);
 
     Organization findTopByCode(String code);
+
+    List<Organization> findByAuthTypeAndStateOrderByCreateTimeDesc(AuthType authType, OrganizationState state);
 }

+ 2 - 2
FullCardServer/src/main/java/com/zhongshu/card/server/core/dataConfig/PasswordCheckConf.java

@@ -15,7 +15,7 @@ public class PasswordCheckConf {
     /**
      * 密码最大长度,默认为20
      */
-    public static String MAX_LENGTH = "8";
+    public static String MAX_LENGTH = "20";
 
     /**
      * 是否包含数字
@@ -50,7 +50,7 @@ public class PasswordCheckConf {
     /**
      * 特殊符号集合
      */
-    public static String SPECIAL_CHAR = "!\\\"#$%&'()*+,-./:;<=>?@[\\\\]^_`{|}~";
+    public static String SPECIAL_CHAR = "!\\\"#$%&'()*+,-./:;<=>?@[\\\\]^_`{}~";
 
     /**
      * 是否检测键盘按键横向连续

+ 52 - 11
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/org/OrganizationServiceImpl.java

@@ -17,13 +17,11 @@ import com.zhongshu.card.client.model.org.*;
 import com.zhongshu.card.client.ret.ResultContent;
 import com.zhongshu.card.client.ret.ResultMessage;
 import com.zhongshu.card.client.service.org.OrganizationService;
+import com.zhongshu.card.client.utils.type.OrganizationState;
 import com.zhongshu.card.client.utils.type.UserState;
 import com.zhongshu.card.server.core.dao.org.*;
 import com.zhongshu.card.server.core.dataConfig.CardDefault;
-import com.zhongshu.card.server.core.domain.org.Organization;
-import com.zhongshu.card.server.core.domain.org.OrganizationUser;
-import com.zhongshu.card.server.core.domain.org.Role;
-import com.zhongshu.card.server.core.domain.org.UserAccount;
+import com.zhongshu.card.server.core.domain.org.*;
 import com.zhongshu.card.server.core.service.base.SuperService;
 import com.zhongshu.card.server.core.util.BeanUtils;
 import com.zhongshu.card.server.core.util.DateUtils;
@@ -155,7 +153,7 @@ public class OrganizationServiceImpl extends SuperService implements Organizatio
         // 不为项目的时候,要初始数据
         if (authType != AuthType.Project) {
             // 初始机构数据
-            initOrganization(organization);
+            initOrganization(organization, param.getPassword());
         }
 
         return ResultContent.buildSuccess(organization);
@@ -163,13 +161,39 @@ public class OrganizationServiceImpl extends SuperService implements Organizatio
 
     /**
      * 添加学校
+     *
      * @param param
      * @return
      */
     @Override
-    public ResultContent addSchool(SchoolAddParam param){
+    public ResultContent addSchool(SchoolAddParam param) {
+        Assert.hasText(param.getProjectId(), "projectId 项目ID不能为空");
+        Assert.hasText(param.getPassword(), "密码不能为空");
+        Assert.hasText(param.getContactPhone(), "手机号不能为空");
 
+        String projectId = param.getProjectId();
+        Organization organization = organizationDao.findTopByOid(projectId);
+        if (ObjectUtils.isEmpty(organization)) {
+            return ResultContent.buildSuccess(String.format("项目不存在:%s", projectId));
+        }
+        // 验证密码是否符合格式
 
+
+        OrganizationAddParam addParam = new SchoolAddParam();
+        BeanUtils.copyProperties(param, addParam);
+        ResultContent<Organization> resultContent = addOrganization(addParam);
+        if (resultContent.isSuccess()) {
+            Organization main = resultContent.getContent();
+            OrganizationRelation organizationRelation = organizationRelationDao.findTopByMainOrganization(main);
+            if (ObjectUtils.isEmpty(organizationRelation)) {
+                organizationRelation = new OrganizationRelation();
+            }
+            organizationRelation.setMainOrganization(main);
+            organizationRelation.setRelOrganization(organization);
+            organizationRelationDao.save(organizationRelation);
+        } else {
+            return ResultContent.buildFail(resultContent.getMsg());
+        }
         return ResultContent.buildSuccess();
     }
 
@@ -231,7 +255,7 @@ public class OrganizationServiceImpl extends SuperService implements Organizatio
         return ResultContent.buildSuccess();
     }
 
-    public ResultContent<OrganizationModel> getDetail(String oid){
+    public ResultContent<OrganizationModel> getDetail(String oid) {
         Organization organization = organizationDao.findTopByOid(oid);
         if (ObjectUtils.isEmpty(organization)) {
             return ResultContent.buildFail(String.format(ResultMessage.DATA_NOT_EXIST, oid));
@@ -284,6 +308,20 @@ public class OrganizationServiceImpl extends SuperService implements Organizatio
         return ResultContent.buildSuccess(PageEntityUtil.toPageModel(page, this::toProjectModel));
     }
 
+    /**
+     * 查询所有可用的项目
+     *
+     * @return
+     */
+    public ResultContent<List<OrganizationModel>> getProjectList() {
+        List<Organization> list = organizationDao.findByAuthTypeAndStateOrderByCreateTimeDesc(AuthType.Project, OrganizationState.Normal);
+        List<OrganizationModel> models = new ArrayList<>();
+        if (ObjectUtils.isNotEmpty(list)) {
+            models = list.stream().map(this::toModel).collect(Collectors.toList());
+        }
+        return ResultContent.buildSuccess(models);
+    }
+
     /**
      * 查询用户加入的机构列表
      *
@@ -328,7 +366,7 @@ public class OrganizationServiceImpl extends SuperService implements Organizatio
         String oid = "";
 
         AuthType authType = AuthType.Platform;
-        Organization organization = organizationDao.findByAuthType(authType);
+        Organization organization = organizationDao.findTopByAuthType(authType);
         if (ObjectUtils.isEmpty(organization)) {
             log.info("initSuperOrganization 开始初始平台结构信息");
             com.github.microservice.auth.client.model.OrganizationModel organizationModel = new com.github.microservice.auth.client.model.OrganizationModel();
@@ -360,7 +398,7 @@ public class OrganizationServiceImpl extends SuperService implements Organizatio
             organization.setContactPhone(CardDefault.SUPER_ADMIN_NAME);
             organizationDao.save(organization);
             // 初始用户信息
-            initOrganization(organization);
+            initOrganization(organization, "");
         } else {
             oid = organization.getOid();
             log.info("平台管理员账号已存在...");
@@ -374,7 +412,7 @@ public class OrganizationServiceImpl extends SuperService implements Organizatio
      * @param organization
      * @return
      */
-    public ResultContent initOrganization(Organization organization) {
+    public ResultContent initOrganization(Organization organization, String password) {
         String userId = "";
         // 查询用户是否存在
         com.github.microservice.auth.client.content.ResultContent<UserModel> userModelResult =
@@ -382,9 +420,12 @@ public class OrganizationServiceImpl extends SuperService implements Organizatio
         if (userModelResult.getState() != ResultState.Success) {
             //未注册
             //TODO 权限中心: 注册用户
+            if (StringUtils.isEmpty(password)) {
+                password = CardDefault.DEFAULT_PASSWORD;
+            }
             com.github.microservice.auth.client.content.ResultContent<String> addModelResult = userService.add(
                     UserAuthModel.builder().loginType(LoginType.Phone).loginValue(organization.getContactPhone())
-                            .passWord(CardDefault.DEFAULT_PASSWORD).build());
+                            .passWord(password).build());
             userId = addModelResult.getContent();
             log.info("初始权限中心 用户成功:{}", userId);
         } else {

+ 7 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/test/Test.java

@@ -1,6 +1,8 @@
 package com.zhongshu.card.server.core.test;
 
 import cn.hutool.core.lang.Snowflake;
+import com.zhongshu.card.server.core.util.ValidateResult;
+import com.zhongshu.card.server.core.util.ValidateUtils;
 
 /**
  * @author TRX
@@ -11,5 +13,10 @@ public class Test {
         Snowflake snowflake = new Snowflake();
         String orderNo = String.valueOf(snowflake.nextId());
         System.out.println(orderNo + " = " + orderNo.length());
+
+        String str = "@$我是";
+        ValidateResult result = ValidateUtils.isContainsChinese(str);
+        System .out.println("结果:" + result.isSuccess() + " = " + result.getMsg()
+         + " == " + ValidateUtils.isPhoneNumber("18723497166"));
     }
 }

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

@@ -0,0 +1,13 @@
+package com.zhongshu.card.server.core.util;
+
+import lombok.Data;
+
+/**
+ * @author TRX
+ * @date 2024/6/4
+ */
+@Data
+public class ValidateResult {
+    private boolean isSuccess = true;
+    private String msg = "";
+}

+ 72 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/util/ValidateUtils.java

@@ -0,0 +1,72 @@
+package com.zhongshu.card.server.core.util;
+
+import com.zhongshu.card.server.core.dataConfig.PasswordCheckConf;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * 验证工具类
+ *
+ * @author TRX
+ * @date 2024/6/4
+ */
+public class ValidateUtils {
+
+    /**
+     * 验证是否是手机号码
+     *
+     * @param phoneNumber
+     * @return
+     */
+    public static boolean isPhoneNumber(String phoneNumber) {
+        Pattern pattern = Pattern.compile("^1[0-9]{10}$");
+        // 使用模式匹配手机号码
+        Matcher matcher = pattern.matcher(phoneNumber);
+        return matcher.matches();
+    }
+
+    /**
+     * 验证是否有特殊支付
+     *
+     * @param str
+     * @return
+     */
+    public static ValidateResult hasSpecial(String str) {
+        ValidateResult result = new ValidateResult();
+        String validPattern = "[`~!@#$%^&*()+=|{}':;',\\[\\].<>/?~!@#¥%……&*()——+|{}【】‘;:”“’。,、?\\s]";
+        Pattern pattern = Pattern.compile(validPattern);
+        Matcher matcher = pattern.matcher(str);
+        result.setSuccess(!matcher.matches());
+        StringBuilder specialChars = new StringBuilder();
+        if (result.isSuccess()) {
+            while (matcher.find()) {
+                specialChars.append(matcher.group());
+            }
+            result.setMsg("包含特殊支付:" + specialChars);
+        }
+        return result;
+    }
+
+    /**
+     * 是否包含汉字
+     *
+     * @param str
+     * @return
+     */
+    public static ValidateResult isContainsChinese(String str) {
+        ValidateResult result = new ValidateResult();
+        Pattern pattern = Pattern.compile("[\u4E00-\u9FA5]");
+        Matcher matcher = pattern.matcher(str);
+        result.setSuccess(!matcher.matches());
+        StringBuilder specialChars = new StringBuilder();
+        if (result.isSuccess()) {
+            while (matcher.find()) {
+                specialChars.append(matcher.group());
+            }
+            result.setMsg("包含汉字:" + specialChars);
+        }
+        return result;
+    }
+
+}