TRX 1 anno fa
parent
commit
24257a3f31
16 ha cambiato i file con 321 aggiunte e 8 eliminazioni
  1. 21 0
      FullCardClient/src/main/java/com/zhongshu/card/client/model/org/LoginPlatformTokenModel.java
  2. 39 0
      FullCardClient/src/main/java/com/zhongshu/card/client/model/org/RegisterUserAccountParam.java
  3. 26 0
      FullCardClient/src/main/java/com/zhongshu/card/client/model/school/RegisterUserParam.java
  4. 4 0
      FullCardClient/src/main/java/com/zhongshu/card/client/service/org/UserAccountService.java
  5. 3 0
      FullCardClient/src/main/java/com/zhongshu/card/client/service/school/CardInfoService.java
  6. 3 0
      FullCardClient/src/main/java/com/zhongshu/card/client/service/school/SchoolUserService.java
  7. 1 0
      FullCardClient/src/main/java/com/zhongshu/card/client/utils/type/UserType.java
  8. 18 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/controller/org/IndexController.java
  9. 1 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/controller/org/OrganizationController.java
  10. 7 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/controller/school/CardController.java
  11. 7 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/controller/school/SchoolUserController.java
  12. 53 1
      FullCardServer/src/main/java/com/zhongshu/card/server/core/service/org/IndexService.java
  13. 40 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/service/org/UserAccountServiceImpl.java
  14. 30 3
      FullCardServer/src/main/java/com/zhongshu/card/server/core/service/school/CardInfoServiceImpl.java
  15. 50 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/service/school/SchoolUserServiceImpl.java
  16. 18 4
      FullCardServer/src/main/java/com/zhongshu/card/server/core/util/ValidateUtils.java

+ 21 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/model/org/LoginPlatformTokenModel.java

@@ -0,0 +1,21 @@
+package com.zhongshu.card.client.model.org;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * @author TRX
+ * @date 2024/6/17
+ */
+@Data
+public class LoginPlatformTokenModel {
+    @Schema(description = "token")
+    private String access_token;
+    private String token_type;
+    @Schema(description = "刷新token的token")
+    private String refresh_token;
+    private Integer expires_in;
+    private String scope;
+    private String platformOid;
+    OrganizationUserModel userInfo;
+}

+ 39 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/model/org/RegisterUserAccountParam.java

@@ -0,0 +1,39 @@
+package com.zhongshu.card.client.model.org;
+
+import com.zhongshu.card.client.model.school.CardInfoParam;
+import com.zhongshu.card.client.utils.type.Sex;
+import com.zhongshu.card.client.utils.type.UserType;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.hibernate.internal.build.AllowPrintStacktrace;
+
+import java.util.List;
+
+/**
+ * 注册用户
+ *
+ * @author TRX
+ * @date 2024/6/17
+ */
+@Data
+@AllowPrintStacktrace
+@NoArgsConstructor
+public class RegisterUserAccountParam {
+
+    @Schema(description = "用户手机号")
+    private String phone;
+
+    @Schema(description = "姓名")
+    private String name;
+
+    @Schema(description = "证件号码")
+    private String cardNumber;
+
+    @Schema(description = "性别")
+    private Sex sex;
+
+    @Schema(description = "用户类型", hidden = true)
+    private UserType userType;
+
+}

+ 26 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/model/school/RegisterUserParam.java

@@ -0,0 +1,26 @@
+package com.zhongshu.card.client.model.school;
+
+import com.zhongshu.card.client.model.org.RegisterUserAccountParam;
+import com.zhongshu.card.client.utils.type.Sex;
+import com.zhongshu.card.client.utils.type.UserType;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.hibernate.internal.build.AllowPrintStacktrace;
+
+import java.util.List;
+
+/**
+ * 注册用户
+ *
+ * @author TRX
+ * @date 2024/6/17
+ */
+@Data
+@AllowPrintStacktrace
+@NoArgsConstructor
+public class RegisterUserParam extends RegisterUserAccountParam {
+
+    @Schema(description = "卡片信息")
+    private List<CardInfoParam> cardInfos;
+}

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

@@ -3,6 +3,7 @@ package com.zhongshu.card.client.service.org;
 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.school.RegisterUserParam;
 import com.zhongshu.card.client.ret.ResultContent;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Parameter;
@@ -20,6 +21,9 @@ public interface UserAccountService {
     @RequestMapping(value = "update", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
     ResultContent update(@RequestBody UserCountAddParam param);
 
+    // 注册基本用户
+    ResultContent<String> registerUserAccount(RegisterUserAccountParam param);
+
     // 得到平台用户详情
     ResultContent<OrganizationUserModel> getOrgUserDetail(OrgUserDetailParam param);
 

+ 3 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/service/school/CardInfoService.java

@@ -32,6 +32,9 @@ public interface CardInfoService {
     // 卡片启用
     ResultContent cardEnableById(CardLossParam param);
 
+    // 启用别人的卡片
+    ResultContent cardEnableByIccId(CardLossParam param);
+
     // 查询卡片详情
     ResultContent<CardInfoModel> getCardDetail(String id);
 

+ 3 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/service/school/SchoolUserService.java

@@ -5,6 +5,7 @@ import com.zhongshu.card.client.model.org.OrganizationUserSearch;
 import com.zhongshu.card.client.model.org.SchoolUserCountParam;
 import com.zhongshu.card.client.model.school.CardInfoModel;
 import com.zhongshu.card.client.model.school.ImportUserModel;
+import com.zhongshu.card.client.model.school.RegisterUserParam;
 import com.zhongshu.card.client.model.school.SchoolUserModel;
 import com.zhongshu.card.client.ret.ResultContent;
 import jakarta.servlet.http.HttpServletRequest;
@@ -27,6 +28,8 @@ public interface SchoolUserService {
 
     ResultContent addOrUpdateSchoolUser(SchoolUserCountParam param);
 
+    ResultContent register(RegisterUserParam param);
+
     ResultContent<SchoolUserModel> getSchoolUserDetail(OrgUserDetailParam param);
 
     ResultContent<List<CardInfoModel>> getUserOrgAllCard(OrgUserDetailParam param);

+ 1 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/utils/type/UserType.java

@@ -10,6 +10,7 @@ public enum UserType {
     Platform("平台用户"),
     Student("学生"),
     Teacher("老师"),
+    ConsumerUser("c端用户"),
     SuperAdmin("超级管理员用户"),
     ;
 

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

@@ -77,6 +77,24 @@ public class IndexController {
         return result;
     }
 
+    @Operation(summary = "登录-用户名密码登录平台端", description = "登录--用户名密码登录平台端")
+    @RequestMapping(value = "loginPlatform", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
+    public ResultContent loginPlatform(@RequestBody LoginParam param, HttpServletRequest request, HttpServletResponse response) {
+        if (param.getLoginFromType() == null) {
+            return ResultContent.buildFail("loginFromType 不能为空");
+        }
+        ResultContent result = indexService.loginPlatform(param);
+        if (result.isSuccess()) {
+            LoginPlatformTokenModel tokenModel = (LoginPlatformTokenModel) result.getContent();
+            response.setHeader("accessToken", tokenModel.getAccess_token());
+            Cookie cookie = new Cookie("accessToken", tokenModel.getAccess_token());
+            cookie.setMaxAge(60 * 60 * 24 * 30);
+            cookie.setPath("/");
+            response.addCookie(cookie);
+        }
+        return result;
+    }
+
     @Operation(summary = "登录某个机构 + 用户名密码登录", description = "登录某个机构 + 用户名密码登录")
     @RequestMapping(value = "loginToOid", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
     public ResultContent loginToOid(@RequestBody LoginParam param, HttpServletRequest request, HttpServletResponse response) {

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

@@ -49,6 +49,7 @@ public class OrganizationController {
         return organizationService.pageProject(param, pageable);
     }
 
+    @ResourceAuth(value = "user", type = AuthType.User)
     @Operation(summary = "得到平台管理端的机构数据", description = "得到平台管理端的机构数据")
     @RequestMapping(value = "getPlatformInfo", method = {RequestMethod.GET})
     public ResultContent<OrganizationModel> getPlatformInfo() {

+ 7 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/controller/school/CardController.java

@@ -93,6 +93,13 @@ public class CardController {
         return cardInfoService.cardEnableById(param);
     }
 
+    @ResourceAuth(value = "user", type = AuthType.User)
+    @Operation(summary = "卡片启用(帮别人启用)", description = "卡片启用")
+    @RequestMapping(value = {"cardEnableByIccId"}, method = {RequestMethod.POST})
+    public ResultContent cardEnableByIccId(@RequestBody CardLossParam param) {
+        return cardInfoService.cardEnableByIccId(param);
+    }
+
     @ResourceAuth(value = "user", type = AuthType.User)
     @Operation(summary = "卡片详情", description = "卡片详情")
     @RequestMapping(value = {"getCardDetail"}, method = {RequestMethod.POST})

+ 7 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/controller/school/SchoolUserController.java

@@ -9,6 +9,7 @@ import com.zhongshu.card.client.model.org.OrganizationUserSearch;
 import com.zhongshu.card.client.model.org.SchoolUserCountParam;
 import com.zhongshu.card.client.model.school.FileParam;
 import com.zhongshu.card.client.model.school.ImportUserModel;
+import com.zhongshu.card.client.model.school.RegisterUserParam;
 import com.zhongshu.card.client.model.school.SchoolUserModel;
 import com.zhongshu.card.client.ret.ResultContent;
 import com.zhongshu.card.client.service.org.UserAccountService;
@@ -90,6 +91,12 @@ public class SchoolUserController {
         return schoolUserService.deleteUser(param.getId());
     }
 
+    @Operation(summary = "注册用户c端用户(包含卡片信息)", description = "注册用户c端用户")
+    @RequestMapping(value = {"registerUser"}, method = {RequestMethod.POST})
+    public ResultContent<SchoolUserModel> registerUser(@RequestBody RegisterUserParam param) {
+        return schoolUserService.register(param);
+    }
+
     @ResourceAuth(value = "user", type = AuthType.User)
     @Operation(summary = "得到校园用户详情(包含卡片信息)", description = "得到用户详情")
     @RequestMapping(value = {"getSchoolUserDetail"}, method = {RequestMethod.POST})

+ 53 - 1
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/org/IndexService.java

@@ -11,6 +11,8 @@ import com.github.microservice.components.data.mongo.mongo.helper.DBHelper;
 import com.github.microservice.core.util.net.IPUtil;
 import com.zhongshu.card.client.model.org.GetPhoneModel;
 import com.zhongshu.card.client.model.org.LoginParam;
+import com.zhongshu.card.client.model.org.LoginPlatformTokenModel;
+import com.zhongshu.card.client.model.org.OrganizationUserModel;
 import com.zhongshu.card.client.model.wechat.PhoneModel;
 import com.zhongshu.card.client.model.wechat.WechatPhoneNumber;
 import com.zhongshu.card.client.ret.ResultContent;
@@ -74,11 +76,16 @@ public class IndexService {
 
     @Autowired
     OrganizationUserDao organizationUserDao;
+
+    @Autowired
     private OrganizationDao organizationDao;
 
     @Autowired
     WechatCUtil wechatCUtil;
 
+    @Autowired
+    UserAccountServiceImpl userAccountService;
+
     /**
      * 登录 只验证 用户名 和密码
      *
@@ -96,6 +103,45 @@ public class IndexService {
         return resultContent;
     }
 
+    /**
+     * 平台端用户登录
+     *
+     * @param param
+     * @return
+     */
+    public ResultContent loginPlatform(LoginParam param) {
+        String phone = param.getLoginValue();
+        UserAuthLoginModel userAuthLoginModel = new UserAuthLoginModel();
+        BeanUtils.copyProperties(param, userAuthLoginModel);
+        ResultContent<LoginTokenModel> resultContent = commonLogin(userAuthLoginModel);
+        if (resultContent.isFailed()) {
+            return resultContent;
+        }
+        Organization organization = organizationDao.findTopByAuthType(AuthType.Platform);
+        if (ObjectUtils.isEmpty(organization)) {
+            return ResultContent.buildFail(String.format("平台未初始化,请联系管理员"));
+        }
+        if (organization.getState() == OrganizationState.Locked ||
+                organization.getState() == OrganizationState.Frozen) {
+            return ResultContent.buildFail(String.format("平台已被锁定,不能登录"));
+        }
+        UserAccount userAccount = userCountDao.findTopByLoginName(phone);
+        OrganizationUser organizationUser = organizationUserDao.findTopByOrganizationAndUser(organization, userAccount);
+        if (ObjectUtils.isEmpty(organizationUser)) {
+            return ResultContent.buildFail(String.format("该用户不属于平台端用户:%s", phone));
+        }
+        LoginTokenModel loginTokenModel = resultContent.getContent();
+        LoginPlatformTokenModel tokenModel = new LoginPlatformTokenModel();
+        com.zhongshu.card.server.core.util.BeanUtils.copyProperties(loginTokenModel, tokenModel);
+
+        tokenModel.setPlatformOid(organization.getOid());
+
+        OrganizationUserModel userModel = userAccountService.toOrgUserModel(organizationUser);
+        tokenModel.setUserInfo(userModel);
+
+        return ResultContent.buildSuccess(tokenModel);
+    }
+
     /**
      * 登录--验证用户名和密码 + 是否在指定的机构
      *
@@ -155,12 +201,18 @@ public class IndexService {
         return resultContent;
     }
 
-    public ResultContent commonLogin(UserAuthLoginModel userAuthLoginModel) {
+    public ResultContent<LoginTokenModel> commonLogin(UserAuthLoginModel userAuthLoginModel) {
         String phone = userAuthLoginModel.getLoginValue();
         userAuthLoginModel.setDeviceIp(IPUtil.getRemoteIp(request));
         userAuthLoginModel.setClientId(clientId);
         userAuthLoginModel.setClientSecret(clientSecret);
         userAuthLoginModel.setDeviceUserAgent(request.getHeader("user-agent"));
+        if (userAuthLoginModel.getAccessTokenTimeOut() == null) {
+            userAuthLoginModel.setAccessTokenTimeOut(259200l);
+        }
+        if (userAuthLoginModel.getRefreshTokenTimeOut() == null) {
+            userAuthLoginModel.setRefreshTokenTimeOut(31536000L);
+        }
 
         com.github.microservice.auth.client.content.ResultContent<LoginTokenModel> resultContent = userService.login(userAuthLoginModel);
         if (resultContent.getState() == com.github.microservice.auth.client.content.ResultState.Success) {

+ 40 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/org/UserAccountServiceImpl.java

@@ -12,6 +12,7 @@ import com.zhongshu.card.client.model.base.UserIdModel;
 import com.zhongshu.card.client.model.org.*;
 import com.zhongshu.card.client.model.school.DictInfoParam;
 import com.zhongshu.card.client.model.school.DictInfoSimpleModel;
+import com.zhongshu.card.client.model.school.RegisterUserParam;
 import com.zhongshu.card.client.ret.ResultContent;
 import com.zhongshu.card.client.ret.ResultMessage;
 import com.zhongshu.card.client.service.org.DepartmentService;
@@ -29,6 +30,7 @@ import com.zhongshu.card.server.core.service.school.DictInfoServiceImpl;
 import com.zhongshu.card.server.core.util.BeanUtils;
 import com.zhongshu.card.server.core.util.CommonUtil;
 import com.zhongshu.card.server.core.util.DateUtils;
+import com.zhongshu.card.server.core.util.ValidateUtils;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.ObjectUtils;
 import org.apache.commons.lang3.StringUtils;
@@ -227,6 +229,44 @@ public class UserAccountServiceImpl extends SuperService implements UserAccountS
         return ResultContent.buildSuccess(organizationUser);
     }
 
+
+    /**
+     * 注册基本用户
+     *
+     * @param param
+     * @return
+     */
+    public ResultContent<String> registerUserAccount(RegisterUserAccountParam param) {
+        String loginName = param.getPhone();
+        UserAccount userAccount = userCountDao.findTopByLoginName(loginName);
+        if (ObjectUtils.isEmpty(userAccount)) {
+            String cardNumber = param.getCardNumber();
+            String passWord = CardDefault.DEFAULT_PASSWORD;
+            if (ValidateUtils.isIDCard(cardNumber)) {
+                passWord = cardNumber.substring(12, 18);
+                passWord = passWord.toLowerCase().replace("x", "0");
+            }
+            //权限中心:添加用户
+            com.github.microservice.auth.client.content.ResultContent<String> addModelResult = userService.add(UserAuthModel.builder().loginType(LoginType.Phone)
+                    .loginValue(loginName).passWord(passWord).build());
+            if (addModelResult.getState() != ResultState.Success) {
+                return ResultContent.buildFail(String.format("权限中心添加用户出错:%s", addModelResult.getMsg()));
+            }
+            String userId = addModelResult.getContent();
+            userAccount = new UserAccount();
+
+            BeanUtils.copyProperties(param, userAccount);
+            userAccount.setUserId(userId);
+            userAccount.setLoginType(UserLoginType.All);
+            userAccount.setOid(null);
+            userAccount.setLoginName(loginName);
+            userAccount.setIsLogined(Boolean.FALSE);
+            userAccount.setSpellCode(CommonUtil.getPinyin(param.getName()));
+            userAccount.setIsUpdatedPsw(Boolean.FALSE);
+        }
+        return ResultContent.buildSuccess(userAccount.getUserId());
+    }
+
     public ResultContent<OrganizationUserModel> getOrgUserDetail(OrgUserDetailParam param) {
         String userId = param.getUserId();
         String oid = param.getOid();

+ 30 - 3
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/school/CardInfoServiceImpl.java

@@ -58,7 +58,8 @@ public class CardInfoServiceImpl extends SuperService implements CardInfoService
      */
     @Override
     public ResultContent addCardInfo(CardInfoParam param) {
-        initDefaultUserAndOid(param);
+        initDefaultUserParam(param);
+        String oid = param.getOid();
 
         CardInfo cardInfo = null;
         if (StringUtils.isNotEmpty(param.getId())) {
@@ -69,10 +70,12 @@ public class CardInfoServiceImpl extends SuperService implements CardInfoService
             cardInfo = new CardInfo();
         }
         BeanUtils.copyProperties(param, cardInfo);
-        Organization organization = organizationDao.findTopByOid(param.getOid());
+        if (StringUtils.isNotEmpty(oid)) {
+            Organization organization = organizationDao.findTopByOid(oid);
+            cardInfo.setOrganization(organization);
+        }
         UserAccount account = userCountDao.findTopByUserId(param.getUserId());
         cardInfo.setUserAccount(account);
-        cardInfo.setOrganization(organization);
         cardInfoDao.save(cardInfo);
         return ResultContent.buildSuccess();
     }
@@ -187,6 +190,30 @@ public class CardInfoServiceImpl extends SuperService implements CardInfoService
         return ResultContent.buildSuccess();
     }
 
+    /**
+     * 通过卡片的iccid启用 (帮别人启用)
+     *
+     * @param param
+     * @return
+     */
+    @Override
+    public ResultContent cardEnableByIccId(CardLossParam param) {
+        Assert.hasText(param.getPassWord(), "密码不能为空");
+        Assert.hasText(param.getIccid(), "iccid不能为空");
+        String userId = getCurrentUserId();
+        com.github.microservice.auth.client.content.ResultContent<Void> resultContent = userService.checkLoginPassword(userId, param.getPassWord());
+        if (resultContent.getState() != ResultState.Success) {
+            return ResultContent.buildFail("密码错误");
+        }
+        CardInfo cardInfo = cardInfoDao.findTopByIccid(param.getIccid());
+        if (ObjectUtils.isEmpty(cardInfo)) {
+            return ResultContent.buildFail(String.format("iccid不存在:%s", param.getIccid()));
+        }
+        cardInfo.setCardState(CardState.Enable);
+        cardInfoDao.save(cardInfo);
+        return ResultContent.buildSuccess();
+    }
+
     /**
      * 通过ID查询卡片详情
      *

+ 50 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/school/SchoolUserServiceImpl.java

@@ -10,15 +10,19 @@ import com.zhongshu.card.client.ret.ResultMessage;
 import com.zhongshu.card.client.service.org.UserAccountService;
 import com.zhongshu.card.client.service.school.SchoolUserService;
 import com.zhongshu.card.client.utils.type.Sex;
+import com.zhongshu.card.client.utils.type.UserType;
 import com.zhongshu.card.server.core.dao.CardInfoDao;
 import com.zhongshu.card.server.core.dao.org.OrganizationDao;
 import com.zhongshu.card.server.core.dao.org.OrganizationUserDao;
+import com.zhongshu.card.server.core.dao.org.UserCountDao;
 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.UserAccount;
 import com.zhongshu.card.server.core.service.base.SuperService;
 import com.zhongshu.card.server.core.util.BeanUtils;
 import com.zhongshu.card.server.core.util.CommonUtil;
 import com.zhongshu.card.server.core.util.ExcelUtils;
+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;
@@ -63,6 +67,9 @@ public class SchoolUserServiceImpl extends SuperService implements SchoolUserSer
     @Autowired
     CardInfoDao cardInfoDao;
 
+    @Autowired
+    UserCountDao userCountDao;
+
     /**
      * 导入 学校用户excel
      *
@@ -229,6 +236,49 @@ public class SchoolUserServiceImpl extends SuperService implements SchoolUserSer
         return ResultContent.buildSuccess();
     }
 
+    /**
+     * 注册用户
+     *
+     * @param param
+     * @return
+     */
+    @Override
+    public ResultContent register(RegisterUserParam param) {
+        Assert.hasText(param.getPhone(), "phone不能为空");
+        Assert.hasText(param.getCardNumber(), "证件号码不能为空");
+        Assert.hasText(param.getName(), "姓名不能为空");
+        String phone = param.getPhone();
+        if (!ValidateUtils.isPhoneNumber(phone)) {
+            return ResultContent.buildFail("电话号码格式不正确");
+        }
+        UserAccount userAccount = userCountDao.findTopByLoginName(phone);
+        if (ObjectUtils.isNotEmpty(userAccount)) {
+            return ResultContent.buildFail(String.format("登录名已存在:%s", phone));
+        }
+        String cardNumber = param.getCardNumber();
+        if (!ValidateUtils.isIDCard(cardNumber)) {
+            return ResultContent.buildFail("身份证号码格式不正确");
+        }
+        RegisterUserAccountParam addParam = new RegisterUserAccountParam();
+        BeanUtils.copyProperties(param, addParam);
+        addParam.setUserType(UserType.ConsumerUser);
+        ResultContent<String> resultContent = userAccountService.registerUserAccount(addParam);
+        if (resultContent.isFailed()) {
+            return ResultContent.buildFail(resultContent.getMsg());
+        }
+        String userId = resultContent.getContent();
+        // 保存卡片信息
+        List<CardInfoParam> cardInfos = param.getCardInfos();
+        if (ObjectUtils.isNotEmpty(cardInfos)) {
+            for (CardInfoParam cardInfo : cardInfos) {
+                cardInfo.setUserId(userId);
+                cardInfo.setOid("");
+                cardInfoService.addCardInfo(cardInfo);
+            }
+        }
+        return ResultContent.buildSuccess();
+    }
+
     /**
      * 查询校园端用户详情
      *

+ 18 - 4
FullCardServer/src/main/java/com/zhongshu/card/server/core/util/ValidateUtils.java

@@ -27,6 +27,19 @@ public class ValidateUtils {
         return matcher.matches();
     }
 
+    /**
+     * 判断是否是身份证号码
+     *
+     * @param idCard
+     * @return
+     */
+    public static boolean isIDCard(String idCard) {
+        if (StringUtils.isNotEmpty(idCard) && idCard.trim().length() == 18) {
+            return true;
+        }
+        return false;
+    }
+
     /**
      * 验证是否有特殊支付 (有一个就是true)
      *
@@ -68,18 +81,19 @@ public class ValidateUtils {
 
     /**
      * 验证密码是否符合要求
+     *
      * @param passWord
      * @return
      */
     public static ValidateResult validatePassWord(String passWord) {
         ValidateResult result = new ValidateResult();
         result.setSuccess(true);
-        if(StringUtils.isEmpty(passWord)) {
+        if (StringUtils.isEmpty(passWord)) {
             result.setSuccess(false);
             result.setMsg("密码不能为空");
-        }else {
-            if(passWord.length() < Integer.parseInt(PasswordCheckConf.MIN_LENGTH)
-                || passWord.length() > Integer.parseInt(PasswordCheckConf.MAX_LENGTH)) {
+        } else {
+            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));
             }