Răsfoiți Sursa

学校功能

TRX 1 an în urmă
părinte
comite
e6e1151f94

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

@@ -2,7 +2,7 @@ package com.zhongshu.card.client.model.org;
 
 import com.github.microservice.auth.client.type.DeviceType;
 import com.github.microservice.auth.client.type.LoginType;
-import com.zhongshu.card.client.utils.type.WxxcxType;
+import com.zhongshu.card.client.utils.type.LoginFromType;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.AllArgsConstructor;
 import lombok.Builder;
@@ -48,6 +48,6 @@ public class LoginParam {
     @Schema(name = "refreshTokenTimeOut", required = false, example = "31536000")
     private Long refreshTokenTimeOut;
 
-    @Schema(description = "")
-    WxxcxType wxxcxType;
+    @Schema(description = "登录端类型 平台  学校  c端  商家小程序 ", required = true)
+    private LoginFromType loginFromType;
 }

+ 5 - 3
FullCardClient/src/main/java/com/zhongshu/card/client/utils/type/WxxcxType.java → FullCardClient/src/main/java/com/zhongshu/card/client/utils/type/LoginFromType.java

@@ -3,17 +3,19 @@ package com.zhongshu.card.client.utils.type;
 import lombok.Getter;
 
 /**
- * 微信小程序端使用的类型
+ * 登录端的类型
  */
-public enum WxxcxType {
+public enum LoginFromType {
     Student("学生"),
     Shop("商家"),
+    School("学校端"),
+    Platform("平台端"),
     ;
 
     @Getter
     private String remark;
 
-    WxxcxType(String remark) {
+    LoginFromType(String remark) {
         this.remark = remark;
     }
 }

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

@@ -65,11 +65,31 @@ public class IndexController {
     @Operation(summary = "登录-用户名密码登录", description = "登录--用户名密码登录")
     @RequestMapping(value = "login", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
     public ResultContent login(@RequestBody LoginParam param, HttpServletRequest request, HttpServletResponse response) {
+        if (param.getLoginFromType() == null) {
+            return ResultContent.buildFail("loginFromType 不能为空");
+        }
         ResultContent result = indexService.login(param);
-        if (result != null && result.getState() == ResultState.Success) {
+        if (result.isSuccess()) {
             LoginTokenModel tokenModel = (LoginTokenModel) 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 = "xcxLogin", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
+    public ResultContent xcxLogin(@RequestBody LoginParam param, HttpServletRequest request, HttpServletResponse response) {
+        if (param.getLoginFromType() == null) {
+            return ResultContent.buildFail("loginFromType 不能为空");
+        }
+        ResultContent result = indexService.xcxLogin(param);
+        if (result.isSuccess()) {
+            LoginTokenModel tokenModel = (LoginTokenModel) result.getContent();
+            response.setHeader("accessToken", tokenModel.getAccess_token());
             Cookie cookie = new Cookie("accessToken", tokenModel.getAccess_token());
             cookie.setMaxAge(60 * 60 * 24 * 30);
             cookie.setPath("/");

+ 5 - 3
FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/org/OrganizationUserDao.java

@@ -25,11 +25,13 @@ public interface OrganizationUserDao extends MongoDao<OrganizationUser>, Organiz
     // 用户是否存在
     Boolean existsByOrganizationAndUser(Organization organization, UserAccount user);
 
-    // 统计用户所在的结构数量
-    long countByUserAndState(UserAccount user, OrganizationState state);
+    // 统计用户所在的机构数量
+    long countByUserAndState(UserAccount user, UserState state);
+
+    long countByUserAndStateAndAuthType(UserAccount user, UserState state, AuthType authType);
 
     void deleteByOrganization(Organization organization);
 
-    // 查询用户所在
+    // 查询用户所在
     List<OrganizationUser> findByUserAndAuthTypeAndState(UserAccount userAccount, AuthType authType, UserState state);
 }

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

@@ -6,16 +6,16 @@ import com.github.microservice.auth.client.model.UserAuthLoginModel;
 import com.github.microservice.auth.client.model.UserTokenModel;
 import com.github.microservice.auth.client.service.UserService;
 import com.github.microservice.auth.security.helper.AuthHelper;
+import com.github.microservice.auth.security.type.AuthType;
 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.LoginParam;
 import com.zhongshu.card.client.ret.ResultContent;
+import com.zhongshu.card.client.utils.type.LoginFromType;
 import com.zhongshu.card.client.utils.type.OrganizationState;
 import com.zhongshu.card.client.utils.type.UserState;
-import com.zhongshu.card.server.core.dao.org.OrganizationUserDao;
-import com.zhongshu.card.server.core.dao.org.UserCountDao;
-import com.zhongshu.card.server.core.dao.org.UserLoginFailRecordDao;
-import com.zhongshu.card.server.core.dao.org.UserLoginRecordDao;
+import com.zhongshu.card.server.core.dao.org.*;
+import com.zhongshu.card.server.core.domain.org.Organization;
 import com.zhongshu.card.server.core.domain.org.UserAccount;
 import com.zhongshu.card.server.core.domain.org.UserLoginFailRecord;
 import com.zhongshu.card.server.core.domain.org.UserLoginRecord;
@@ -71,6 +71,7 @@ public class IndexService {
 
     @Autowired
     OrganizationUserDao organizationUserDao;
+    private OrganizationDao organizationDao;
 
     /**
      * 登录--web
@@ -80,9 +81,62 @@ public class IndexService {
      */
     public ResultContent login(LoginParam param) {
         String phone = param.getLoginValue();
+        UserAuthLoginModel userAuthLoginModel = new UserAuthLoginModel();
+        BeanUtils.copyProperties(param, userAuthLoginModel);
+        ResultContent resultContent = commonLogin(userAuthLoginModel);
+        if (resultContent.isFailed()) {
+            return resultContent;
+        }
+        // web 端的登录用户数据验证
+        UserAccount userAccount = userCountDao.findTopByLoginName(phone);
+        if (param.getLoginFromType() == LoginFromType.Platform) {
+            // web平台端登录
+            // 判断用户是否加入了平台端
+            Organization platformOrg = organizationDao.findTopByAuthType(AuthType.Platform);
+            if (ObjectUtils.isEmpty(platformOrg)) {
+                return ResultContent.buildFail("平台端数据未初始化,登录失败");
+            }
+            long number = organizationUserDao.countByUserAndStateAndAuthType(userAccount, UserState.Normal, AuthType.Platform);
+            if (number <= 0) {
+                return ResultContent.buildFail(String.format("用户不属于平台端用户,登录失败:%s", phone));
+            }
+        } else if (param.getLoginFromType() == LoginFromType.School) {
+            // 校园端web登录
+            long number = organizationUserDao.countByUserAndStateAndAuthType(userAccount, UserState.Normal, AuthType.School);
+            if (number <= 0) {
+                return ResultContent.buildFail(String.format("用户未加入学校,登录失败:%s", phone));
+            }
+        }
+        return resultContent;
+    }
 
+    /**
+     * 小程序端账号密码登录
+     *
+     * @param param
+     * @return
+     */
+    public ResultContent xcxLogin(LoginParam param) {
+        String phone = param.getLoginValue();
         UserAuthLoginModel userAuthLoginModel = new UserAuthLoginModel();
         BeanUtils.copyProperties(param, userAuthLoginModel);
+        ResultContent resultContent = commonLogin(userAuthLoginModel);
+        if (resultContent.isFailed()) {
+            return resultContent;
+        }
+        // 商户端
+        if (param.getLoginFromType() == LoginFromType.Shop) {
+            UserAccount userAccount = userCountDao.findTopByLoginName(phone);
+            long number = organizationUserDao.countByUserAndStateAndAuthType(userAccount, UserState.Normal, AuthType.Shop);
+            if (number <= 0) {
+                return ResultContent.buildFail(String.format("用户不属于任何商户,登录失败:%s", phone));
+            }
+        }
+        return resultContent;
+    }
+
+    public ResultContent commonLogin(UserAuthLoginModel userAuthLoginModel) {
+        String phone = userAuthLoginModel.getLoginValue();
         userAuthLoginModel.setDeviceIp(IPUtil.getRemoteIp(request));
         userAuthLoginModel.setClientId(clientId);
         userAuthLoginModel.setClientSecret(clientSecret);
@@ -103,17 +157,11 @@ public class IndexService {
                 return ResultContent.buildFail("用户已被注销,登录失败");
             }
 
-            if (param.getLoginValue() == null) {
-                long orgNumber = organizationUserDao.countByUserAndState(userAccount, OrganizationState.Normal);
-                if (orgNumber <= 0) {
-                    return ResultContent.buildFail("用户未加入任何机构,不能登录");
-                }
-            }
-
             // 记录已登录过
             userAccount.setIsLogined(Boolean.TRUE);
             userCountDao.save(userAccount);
 
+            // 用户登录日志
             UserLoginRecord record = new UserLoginRecord();
             record.setPhone(userAccount.getPhone());
             record.setUid(userAccount.getUserId());
@@ -122,17 +170,17 @@ public class IndexService {
             userLoginRecordDao.save(record);
 
             // 删除失败记录
-            userLoginFailRecordDao.deleteByUserName(param.getLoginValue());
+            userLoginFailRecordDao.deleteByUserName(phone);
             return ResultContent.buildSuccess(resultContent.getContent());
+        } else {
+            // 记录登录失败信息
+            userLoginFailRecordDao.save(UserLoginFailRecord.builder().userName(phone).ttl(new Date(dbHelper.getTime() + 2 * 24L * 60 * 60 * 1000L)).build());
+            String msg = resultContent.getMsg();
+            if (StringUtils.isEmpty(msg)) {
+                msg = "账号或密码不正确.";
+            }
+            return ResultContent.buildFail(msg);
         }
-        // 记录登录失败信息
-        userLoginFailRecordDao.save(UserLoginFailRecord.builder().userName(param.getLoginValue())
-                .ttl(new Date(dbHelper.getTime() + 2 * 24L * 60 * 60 * 1000L)).build());
-        String msg = resultContent.getMsg();
-        if (StringUtils.isEmpty(msg)) {
-            msg = "账号或密码不正确.";
-        }
-        return ResultContent.buildFail(msg);
     }
 
     /**