Pārlūkot izejas kodu

1、增加企业端的登出、刷新接口

rayson 1 gadu atpakaļ
vecāks
revīzija
9aaee49fd4
13 mainītis faili ar 224 papildinājumiem un 40 dzēšanām
  1. 4 2
      citu-framework/citu-spring-boot-starter-es/src/main/java/com/citu/framework/es/core/dataobject/ESBaseDO.java
  2. 2 1
      citu-module-crm/citu-module-crm-biz/src/main/java/com/citu/module/crm/dal/mysql/statistics/CrmStatisticsCustomerMapper.java
  3. 16 4
      citu-module-system/citu-module-system-api/src/main/java/com/citu/module/system/api/oauth2/OAuth2TokenApi.java
  4. 9 0
      citu-module-system/citu-module-system-biz/src/main/java/com/citu/module/system/api/oauth2/OAuth2TokenApiImpl.java
  5. 12 0
      citu-module-system/citu-module-system-biz/src/main/java/com/citu/module/system/service/oauth2/OAuth2TokenService.java
  6. 34 1
      citu-module-system/citu-module-system-biz/src/main/java/com/citu/module/system/service/oauth2/OAuth2TokenServiceImpl.java
  7. 0 15
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/auth/AppMdeAuthController.java
  8. 34 4
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/appadmin/auth/AppAdminEnterpriseAuthController.java
  9. 17 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/es/job/ESJobAdvertisedMergeDO.java
  10. 10 3
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/auth/MdeAuthServiceImpl.java
  11. 16 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/auth/MdeEnterpriseAuthService.java
  12. 50 10
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/auth/MdeEnterpriseAuthServiceImpl.java
  13. 20 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/util/ESQueryBuildUtils.java

+ 4 - 2
citu-framework/citu-spring-boot-starter-es/src/main/java/com/citu/framework/es/core/dataobject/ESBaseDO.java

@@ -7,6 +7,8 @@ import org.springframework.data.elasticsearch.annotations.FieldType;
 
 import java.time.LocalDateTime;
 
+import static com.citu.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
 /**
  * ES 基础 DO
  *
@@ -24,12 +26,12 @@ public class ESBaseDO {
      * 创建时间
      */
 
-    @Field(type = FieldType.Date, format = DateFormat.custom, pattern = "yyyy-MM-dd HH:mm:ss")
+    @Field(type = FieldType.Date, format = DateFormat.custom, pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
     private LocalDateTime createTime;
     /**
      * 最后更新时间
      */
-    @Field(type = FieldType.Date, format = DateFormat.custom, pattern = "yyyy-MM-dd HH:mm:ss")
+    @Field(type = FieldType.Date, format = DateFormat.custom, pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
     private LocalDateTime updateTime;
     /**
      * 创建者,目前使用 SysUser 的 id 编号

+ 2 - 1
citu-module-crm/citu-module-crm-biz/src/main/java/com/citu/module/crm/dal/mysql/statistics/CrmStatisticsCustomerMapper.java

@@ -10,6 +10,7 @@ import java.util.ArrayList;
 import java.util.List;
 
 import static com.citu.framework.common.util.collection.CollectionUtils.convertList;
+import static com.citu.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY;
 
 /**
  * CRM 客户分析 Mapper
@@ -130,7 +131,7 @@ public interface CrmStatisticsCustomerMapper {
         List<CrmStatisticsPoolSummaryByDateRespVO> voList = new ArrayList<>();
         while (currrentDate.isBefore(endDate)) {
             voList.add(new CrmStatisticsPoolSummaryByDateRespVO()
-                    .setTime(LocalDateTimeUtil.format(currrentDate, "yyyy-MM-dd"))
+                    .setTime(LocalDateTimeUtil.format(currrentDate, FORMAT_YEAR_MONTH_DAY))
                     .setCustomerPutCount(RandomUtil.randomInt(0, 10))
                     .setCustomerTakeCount(RandomUtil.randomInt(0, 10)));
             currrentDate = currrentDate.plusDays(1);

+ 16 - 4
citu-module-system/citu-module-system-api/src/main/java/com/citu/module/system/api/oauth2/OAuth2TokenApi.java

@@ -5,14 +5,15 @@ import com.citu.module.system.api.oauth2.dto.OAuth2AccessTokenCheckRespDTO;
 import com.citu.module.system.api.oauth2.dto.OAuth2AccessTokenCreateReqDTO;
 import com.citu.module.system.api.oauth2.dto.OAuth2AccessTokenRespDTO;
 import com.citu.module.system.enums.ApiConstants;
-import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Parameter;
 import io.swagger.v3.oas.annotations.Parameters;
-import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.*;
 
 import javax.validation.Valid;
+import java.util.Map;
 
 @FeignClient(name = ApiConstants.NAME) // TODO 芋艿:fallbackFactory =
 @Tag(name = "RPC 服务 - OAuth2.0 令牌")
@@ -43,10 +44,21 @@ public interface OAuth2TokenApi {
     @PutMapping(PREFIX + "/refresh")
     @Operation(summary = "刷新访问令牌")
     @Parameters({
-        @Parameter(name = "refreshToken", description = "刷新令牌", required = true, example = "haha"),
-        @Parameter(name = "clientId", description = "客户端编号", required = true, example = "cituyuanma")
+            @Parameter(name = "refreshToken", description = "刷新令牌", required = true, example = "haha"),
+            @Parameter(name = "clientId", description = "客户端编号", required = true, example = "cituyuanma")
     })
     CommonResult<OAuth2AccessTokenRespDTO> refreshAccessToken(@RequestParam("refreshToken") String refreshToken,
                                                               @RequestParam("clientId") String clientId);
 
+    @PutMapping(PREFIX + "/refresh2")
+    @Operation(summary = "刷新访问令牌")
+    @Parameters({
+            @Parameter(name = "refreshToken", description = "刷新令牌", required = true, example = "haha"),
+            @Parameter(name = "clientId", description = "客户端编号", required = true, example = "cituyuanma"),
+            @Parameter(name = "userInfo", description = "用户信息", required = true, example = "{}")
+    })
+    CommonResult<OAuth2AccessTokenRespDTO> refreshAccessToken2(@RequestParam("refreshToken") String refreshToken,
+                                                               @RequestParam("clientId") String clientId,
+                                                               @RequestParam(value = "userInfo", required = false) Map<String, String> userInfo);
+
 }

+ 9 - 0
citu-module-system/citu-module-system-biz/src/main/java/com/citu/module/system/api/oauth2/OAuth2TokenApiImpl.java

@@ -14,6 +14,8 @@ import org.springframework.web.bind.annotation.RestController;
 
 import javax.annotation.Resource;
 
+import java.util.Map;
+
 import static com.citu.framework.common.pojo.CommonResult.success;
 
 @RestController // 提供 RESTful API 接口,给 Feign 调用
@@ -55,4 +57,11 @@ public class OAuth2TokenApiImpl implements OAuth2TokenApi {
         return success(BeanUtils.toBean(accessTokenDO, OAuth2AccessTokenRespDTO.class));
     }
 
+    @Override
+    public CommonResult<OAuth2AccessTokenRespDTO> refreshAccessToken2(String refreshToken,
+                                                                      String clientId,
+                                                                      Map<String, String> userInfo) {
+        OAuth2AccessTokenDO accessTokenDO = oauth2TokenService.refreshAccessToken2(refreshToken, clientId, userInfo);
+        return success(BeanUtils.toBean(accessTokenDO, OAuth2AccessTokenRespDTO.class));
+    }
 }

+ 12 - 0
citu-module-system/citu-module-system-biz/src/main/java/com/citu/module/system/service/oauth2/OAuth2TokenService.java

@@ -6,6 +6,7 @@ import com.citu.module.system.controller.admin.oauth2.vo.token.OAuth2AccessToken
 import com.citu.module.system.dal.dataobject.oauth2.OAuth2AccessTokenDO;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * OAuth2.0 Token Service 接口
@@ -48,6 +49,17 @@ public interface OAuth2TokenService {
      * @return 访问令牌的信息
      */
     OAuth2AccessTokenDO refreshAccessToken(String refreshToken, String clientId);
+    /**
+     * 刷新访问令牌
+     *
+     * 参考 DefaultTokenServices 的 refreshAccessToken 方法
+     *
+     * @param refreshToken 刷新令牌
+     * @param clientId 客户端编号
+     * @param userInfo 用户信息
+     * @return 访问令牌的信息
+     */
+    OAuth2AccessTokenDO refreshAccessToken2(String refreshToken, String clientId, Map<String, String> userInfo);
 
     /**
      * 获得访问令牌

+ 34 - 1
citu-module-system/citu-module-system-biz/src/main/java/com/citu/module/system/service/oauth2/OAuth2TokenServiceImpl.java

@@ -116,6 +116,37 @@ public class OAuth2TokenServiceImpl implements OAuth2TokenService {
         return createOAuth2AccessToken(refreshTokenDO, clientDO);
     }
 
+    @Override
+    public OAuth2AccessTokenDO refreshAccessToken2(String refreshToken, String clientId, Map<String, String> userInfo) {
+        // 查询访问令牌
+        OAuth2RefreshTokenDO refreshTokenDO = oauth2RefreshTokenMapper.selectByRefreshToken(refreshToken);
+        if (refreshTokenDO == null) {
+            throw exception0(GlobalErrorCodeConstants.BAD_REQUEST.getCode(), "无效的刷新令牌");
+        }
+
+        // 校验 Client 匹配
+        OAuth2ClientDO clientDO = oauth2ClientService.validOAuthClientFromCache(clientId);
+        if (ObjectUtil.notEqual(clientId, refreshTokenDO.getClientId())) {
+            throw exception0(GlobalErrorCodeConstants.BAD_REQUEST.getCode(), "刷新令牌的客户端编号不正确");
+        }
+
+        // 移除相关的访问令牌
+        List<OAuth2AccessTokenDO> accessTokenDOs = oauth2AccessTokenMapper.selectListByRefreshToken(refreshToken);
+        if (CollUtil.isNotEmpty(accessTokenDOs)) {
+            oauth2AccessTokenMapper.deleteBatchIds(convertSet(accessTokenDOs, OAuth2AccessTokenDO::getId));
+            oauth2AccessTokenRedisDAO.deleteList(convertSet(accessTokenDOs, OAuth2AccessTokenDO::getAccessToken));
+        }
+
+        // 已过期的情况下,删除刷新令牌
+        if (DateUtils.isExpired(refreshTokenDO.getExpiresTime())) {
+            oauth2RefreshTokenMapper.deleteById(refreshTokenDO.getId());
+            throw exception0(GlobalErrorCodeConstants.UNAUTHORIZED.getCode(), "刷新令牌已过期");
+        }
+
+        // 创建访问令牌
+        return createOAuth2AccessToken2(refreshTokenDO, clientDO,userInfo);
+    }
+
     @Override
     public OAuth2AccessTokenDO getAccessToken(String accessToken) {
         // 优先从 Redis 中获取
@@ -164,7 +195,9 @@ public class OAuth2TokenServiceImpl implements OAuth2TokenService {
         return oauth2AccessTokenMapper.selectPage(reqVO);
     }
 
-    private OAuth2AccessTokenDO createOAuth2AccessToken(OAuth2RefreshTokenDO refreshTokenDO, OAuth2ClientDO clientDO) {
+    private OAuth2AccessTokenDO createOAuth2AccessToken(OAuth2RefreshTokenDO refreshTokenDO,
+                                                        OAuth2ClientDO clientDO
+                                                        ) {
         OAuth2AccessTokenDO accessTokenDO = new OAuth2AccessTokenDO().setAccessToken(generateAccessToken())
                 .setUserId(refreshTokenDO.getUserId()).setUserType(refreshTokenDO.getUserType())
                 .setUserInfo(buildUserInfo(refreshTokenDO.getUserId(), refreshTokenDO.getUserType(),null))

+ 0 - 15
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/auth/AppMdeAuthController.java

@@ -62,21 +62,6 @@ public class AppMdeAuthController {
         return success(true);
     }
 
-    @PreAuthenticated
-    @PostMapping("/logout-token")
-    @Operation(summary = "根据令牌登出系统")
-    public CommonResult<Boolean> logout(HttpServletRequest request, @RequestParam("token") String token) {
-        String currentToken = SecurityFrameworkUtils.obtainAuthorization(request,
-                securityProperties.getTokenHeader(), securityProperties.getTokenParameter());
-        if(!Objects.equals(currentToken, token)) {
-            // 无法登出不是自己的令牌
-            return success(false);
-        }
-        if (StrUtil.isNotBlank(token)) {
-            authService.logout(token);
-        }
-        return success(true);
-    }
 
     @PostMapping("/refresh-token")
     @Operation(summary = "刷新令牌")

+ 34 - 4
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/appadmin/auth/AppAdminEnterpriseAuthController.java

@@ -1,25 +1,30 @@
 package com.citu.module.menduner.system.controller.appadmin.auth;
 
+import cn.hutool.core.util.StrUtil;
 import com.citu.framework.common.pojo.CommonResult;
+import com.citu.framework.security.config.SecurityProperties;
 import com.citu.framework.security.core.annotations.PreAuthenticated;
+import com.citu.framework.security.core.util.SecurityFrameworkUtils;
 import com.citu.module.menduner.system.controller.app.auth.enterprise.AppEnterpriseAuthSwitchLoginReqVO;
 import com.citu.module.menduner.system.controller.app.auth.enterprise.AppEnterpriseAuthLoginReqVO;
 import com.citu.module.menduner.system.controller.app.auth.enterprise.AppEnterpriseAuthSmsLoginReqVO;
 import com.citu.module.menduner.system.controller.app.auth.vo.AppMdeAuthLoginRespVO;
+import com.citu.module.menduner.system.service.auth.MdeAuthService;
 import com.citu.module.menduner.system.service.auth.MdeEnterpriseAuthService;
 import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.validation.annotation.Validated;
-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;
+import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
 import javax.annotation.security.PermitAll;
+import javax.servlet.http.HttpServletRequest;
 import javax.validation.Valid;
 
+import java.util.Objects;
+
 import static com.citu.framework.common.pojo.CommonResult.success;
 
 @Tag(name = "招聘端 - 企业用户登录")
@@ -32,6 +37,31 @@ public class AppAdminEnterpriseAuthController {
     @Resource
     private MdeEnterpriseAuthService enterpriseAuthService;
 
+    @Resource
+    private SecurityProperties securityProperties;
+
+    @PreAuthenticated
+    @PostMapping("/logout-token")
+    @Operation(summary = "根据令牌登出系统")
+    public CommonResult<Boolean> logout(HttpServletRequest request, @RequestParam("token") String token) {
+        String currentToken = SecurityFrameworkUtils.obtainAuthorization(request,
+                securityProperties.getTokenHeader(), securityProperties.getTokenParameter());
+        if(!Objects.equals(currentToken, token)) {
+            // 无法登出不是自己的令牌
+            return success(false);
+        }
+        if (StrUtil.isNotBlank(token)) {
+            enterpriseAuthService.logout(token);
+        }
+        return success(true);
+    }
+
+    @PostMapping("/refresh-token")
+    @Operation(summary = "刷新令牌")
+    @Parameter(name = "refreshToken", description = "刷新令牌", required = true)
+    public CommonResult<AppMdeAuthLoginRespVO> refreshToken(@RequestParam("refreshToken") String refreshToken) {
+        return success(enterpriseAuthService.refreshToken(refreshToken));
+    }
 
     // ========== 企业登录相关 ==========
     @PermitAll

+ 17 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/es/job/ESJobAdvertisedMergeDO.java

@@ -39,6 +39,7 @@ public class ESJobAdvertisedMergeDO extends ESBaseDO {
     /**
      * 工作地区
      */
+    @Field(type = FieldType.Long)
     private Long areaId;
     /**
      * 职位名称
@@ -48,20 +49,24 @@ public class ESJobAdvertisedMergeDO extends ESBaseDO {
     /**
      * 职位类型id
      */
+    @Field(type = FieldType.Long)
     private Long positionId;
     /**
      * 招聘类型
      * <p>
      * 枚举 {@link TODO menduner_job_type 对应的类}
      */
+    @Field(type = FieldType.Auto)
     private String type;
     /**
      * 工作经验
      */
+    @Field(type = FieldType.Auto)
     private String expType;
     /**
      * 学历要求
      */
+    @Field(type = FieldType.Auto)
     private String eduType;
     /**
      * 薪酬from
@@ -74,10 +79,12 @@ public class ESJobAdvertisedMergeDO extends ESBaseDO {
     /**
      * 薪酬单位
      */
+    @Field(type = FieldType.Auto)
     private String payUnit;
     /**
      * 职位标签
      */
+    @Field(type = FieldType.Auto)
     private List<String> tagList;
     /**
      * 职位内容
@@ -97,6 +104,7 @@ public class ESJobAdvertisedMergeDO extends ESBaseDO {
     /**
      * 是否置顶
      */
+    @Field(type = FieldType.Boolean)
     private Boolean top;
     /**
      * 工作地址
@@ -106,16 +114,19 @@ public class ESJobAdvertisedMergeDO extends ESBaseDO {
     /**
      * 经度
      */
+    @Field(type = FieldType.Auto)
     private String longitude;
     /**
      * 维度
      */
+    @Field(type = FieldType.Auto)
     private String latitude;
     /**
      * 职位状态
      * <p>
      * 枚举 {@link TODO menduner_status 对应的类}
      */
+    @Field(type = FieldType.Auto)
     private String status;
 
     // ========== 企业信息 ==========
@@ -146,6 +157,7 @@ public class ESJobAdvertisedMergeDO extends ESBaseDO {
     /**
      * 联系电话
      */
+    @Field(type = FieldType.Auto)
     private String phone;
     /**
      * logo图片地址
@@ -154,26 +166,31 @@ public class ESJobAdvertisedMergeDO extends ESBaseDO {
     /**
      * 所在行业
      */
+    @Field(type = FieldType.Long)
     private Long industryId;
     /**
      * 融资阶段(未融资,天使轮,A轮,B轮,C轮,D轮以上,已上市,不需要融资)
      * <p>
      * 枚举 {@link TODO menduner_financing_status 对应的类}
      */
+    @Field(type = FieldType.Auto)
     private String financingStatus;
     /**
      * 人员规模(0-20人,20-99人,100-499人,500-999人,1000-9999人,9999人以上)
      * <p>
      * 枚举 {@link TODO menduner_scale 对应的类}
      */
+    @Field(type = FieldType.Auto)
     private String scale;
     /**
      * 公司福利
      */
+    @Field(type = FieldType.Auto)
     private List<String> welfareList;
     /**
      * 公司相册
      */
+    @Field(type = FieldType.Auto)
     private List<String> albumList;
     /**
      * 上班时间

+ 10 - 3
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/auth/MdeAuthServiceImpl.java

@@ -8,6 +8,7 @@ import com.citu.framework.common.enums.UserTypeEnum;
 import com.citu.framework.common.util.monitor.TracerUtils;
 import com.citu.framework.common.util.servlet.ServletUtils;
 import com.citu.framework.common.util.validation.ValidationUtils;
+import com.citu.framework.security.core.LoginUser;
 import com.citu.module.menduner.system.controller.app.auth.vo.*;
 import com.citu.module.menduner.system.convert.MdeAuthConvert;
 import com.citu.module.menduner.system.dal.dataobject.user.MdeUserDO;
@@ -35,13 +36,16 @@ import com.xingyuv.captcha.service.CaptchaService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
 
 import javax.annotation.Resource;
 import javax.validation.Validator;
+import java.util.Map;
 import java.util.Objects;
 
 import static com.citu.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static com.citu.framework.common.util.servlet.ServletUtils.getClientIP;
+import static com.citu.framework.security.core.util.SecurityFrameworkUtils.getLoginUser;
 import static com.citu.framework.web.core.util.WebFrameworkUtils.getTerminal;
 import static com.citu.module.menduner.system.enums.ErrorCodeConstants.*;
 
@@ -309,9 +313,12 @@ public class MdeAuthServiceImpl implements MdeAuthService {
         // 插入登陆日志
         createLoginLog(user.getId(), phone, logType, LoginResultEnum.SUCCESS);
         // 创建 Token 令牌
-        OAuth2AccessTokenRespDTO accessTokenRespDTO = oauth2TokenApi.createAccessToken(new OAuth2AccessTokenCreateReqDTO()
-                .setUserId(user.getId()).setUserType(getUserType().getValue())
-                .setClientId(OAuth2ClientConstants.CLIENT_ID_MENDUNER)).getCheckedData();
+        OAuth2AccessTokenRespDTO accessTokenRespDTO = oauth2TokenApi.createAccessToken(
+                        new OAuth2AccessTokenCreateReqDTO()
+                                .setUserId(user.getId())
+                                .setUserType(getUserType().getValue())
+                                .setClientId(OAuth2ClientConstants.CLIENT_ID_MENDUNER))
+                .getCheckedData();
         // 构建返回结果
         return MdeAuthConvert.INSTANCE.convert(accessTokenRespDTO, openid);
     }

+ 16 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/auth/MdeEnterpriseAuthService.java

@@ -39,4 +39,20 @@ public interface MdeEnterpriseAuthService {
      */
     AppMdeAuthLoginRespVO switchLogin(@Valid AppEnterpriseAuthSwitchLoginReqVO reqVO);
 
+    /**
+     * 基于 token 退出登录
+     *
+     * @param token token
+     */
+    void logout(String token);
+
+    /**
+     * 刷新访问令牌
+     *
+     * @param refreshToken 刷新令牌
+     * @return 登录结果
+     */
+    AppMdeAuthLoginRespVO refreshToken(String refreshToken);
+
+
 }

+ 50 - 10
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/auth/MdeEnterpriseAuthServiceImpl.java

@@ -130,7 +130,7 @@ public class MdeEnterpriseAuthServiceImpl implements MdeEnterpriseAuthService {
     public AppMdeAuthLoginRespVO smsLogin(AppEnterpriseAuthSmsLoginReqVO reqVO) {
         // 校验验证码
         String userIp = getClientIP();
-//        smsCodeApi.useSmsCode(MdeAuthConvert.INSTANCE.convert(reqVO, SmsSceneEnum.MENDUNER_LOGIN.getScene(), userIp).setMobile(reqVO.getPhone())).getCheckedData();
+//        smsCodeApi.useSmsCode(MdeAuthConvert.INSTANCE.convert(reqVO, SmsSceneEnum.MENDUNER_LOGIN.getScene(), userIp).setphone(reqVO.getPhone())).getCheckedData();
 
         // 获得获得注册用户
         MdeUserDO user = userService.createUserIfAbsent(reqVO.getPhone(), userIp, getTerminal().toString());
@@ -173,16 +173,16 @@ public class MdeEnterpriseAuthServiceImpl implements MdeEnterpriseAuthService {
         return resp;
     }
 
-    protected MdeUserDO check(String mobile, String password) {
+    protected MdeUserDO check(String phone, String password) {
         final LoginLogTypeEnum logTypeEnum = LoginLogTypeEnum.LOGIN_MOBILE;
         // 校验账号是否存在
-        MdeUserDO user = userService.getUserByPhone(mobile);
+        MdeUserDO user = userService.getUserByPhone(phone);
         if (null == user) {
-            createLoginLog(null, mobile, logTypeEnum, LoginResultEnum.BAD_CREDENTIALS);
+            createLoginLog(null, phone, logTypeEnum, LoginResultEnum.BAD_CREDENTIALS);
             throw exception(MDE_AUTH_LOGIN_BAD_CREDENTIALS);
         }
         if (!userService.isPasswordMatch(password, user.getPassword())) {
-            createLoginLog(user.getId(), mobile, logTypeEnum, LoginResultEnum.BAD_CREDENTIALS);
+            createLoginLog(user.getId(), phone, logTypeEnum, LoginResultEnum.BAD_CREDENTIALS);
             throw exception(MDE_AUTH_LOGIN_BAD_CREDENTIALS);
         }
 
@@ -191,7 +191,7 @@ public class MdeEnterpriseAuthServiceImpl implements MdeEnterpriseAuthService {
 
     protected EnterpriseUserBindDO check2(Long enterpriseId,
                                           Long userId,
-                                          String mobile,
+                                          String phone,
                                           LoginLogTypeEnum logTypeEnum) {
         // 查询绑定用户
         EnterpriseUserBindDO bind = userBindService.selectByEnterpriseIdAndUserId(
@@ -199,12 +199,12 @@ public class MdeEnterpriseAuthServiceImpl implements MdeEnterpriseAuthService {
                 userId
         );
         if (null == bind) {
-            createLoginLog(bind.getId(), mobile, logTypeEnum, LoginResultEnum.BAD_CREDENTIALS);
+            createLoginLog(bind.getId(), phone, logTypeEnum, LoginResultEnum.BAD_CREDENTIALS);
             throw exception(MDE_USER_ENTERPRISE_NOT_USER_NULL);
         }
         // 校验是否禁用
         if (ObjectUtil.notEqual(bind.getStatus(), MendunerStatusEnum.ENABLE.getStatus())) {
-            createLoginLog(bind.getId(), mobile, logTypeEnum, LoginResultEnum.USER_DISABLED);
+            createLoginLog(bind.getId(), phone, logTypeEnum, LoginResultEnum.USER_DISABLED);
             throw exception(MDE_AUTH_LOGIN_USER_DISABLED);
         }
         return bind;
@@ -233,14 +233,14 @@ public class MdeEnterpriseAuthServiceImpl implements MdeEnterpriseAuthService {
         return MdeAuthConvert.INSTANCE.convert(accessTokenRespDTO, openid);
     }
 
-    protected void createLoginLog(Long bindUserId, String mobile, LoginLogTypeEnum logType, LoginResultEnum loginResult) {
+    protected void createLoginLog(Long bindUserId, String phone, LoginLogTypeEnum logType, LoginResultEnum loginResult) {
         // 插入登录日志
         LoginLogCreateReqDTO reqDTO = new LoginLogCreateReqDTO();
         reqDTO.setLogType(logType.getType());
         reqDTO.setTraceId(TracerUtils.getTraceId());
         reqDTO.setUserId(bindUserId);
         reqDTO.setUserType(getUserType().getValue());
-        reqDTO.setUsername(mobile);
+        reqDTO.setUsername(phone);
         reqDTO.setUserAgent(ServletUtils.getUserAgent());
         reqDTO.setUserIp(getClientIP());
         reqDTO.setResult(loginResult.getResult());
@@ -250,4 +250,44 @@ public class MdeEnterpriseAuthServiceImpl implements MdeEnterpriseAuthService {
             userBindService.updateUserLogin(bindUserId, getClientIP());
         }
     }
+
+
+    @Override
+    public void logout(String token) {
+        // 删除访问令牌
+        OAuth2AccessTokenRespDTO accessTokenRespDTO = oauth2TokenApi.removeAccessToken(token).getCheckedData();
+        if (accessTokenRespDTO == null) {
+            return;
+        }
+        // 删除成功,则记录登出日志
+        createLogoutLog(accessTokenRespDTO.getUserId());
+    }
+
+    private void createLogoutLog(Long userId) {
+        LoginUser loginUser = getLoginUser();
+        MdeUserDO user = userService.getMdeUser(loginUser.getId());
+        LoginLogCreateReqDTO reqDTO = new LoginLogCreateReqDTO();
+        reqDTO.setLogType(LoginLogTypeEnum.LOGOUT_SELF.getType());
+        reqDTO.setTraceId(TracerUtils.getTraceId());
+        reqDTO.setUserId(userId);
+        reqDTO.setUserType(getUserType().getValue());
+        reqDTO.setUsername(user.getPhone());
+        reqDTO.setUserAgent(ServletUtils.getUserAgent());
+        reqDTO.setUserIp(getClientIP());
+        reqDTO.setResult(LoginResultEnum.SUCCESS.getResult());
+        loginLogApi.createLoginLog(reqDTO);
+    }
+    
+    @Override
+    public AppMdeAuthLoginRespVO refreshToken(String refreshToken) {
+        LoginUser loginUser = getLoginUser();
+
+        OAuth2AccessTokenRespDTO accessTokenDO = oauth2TokenApi.refreshAccessToken2(
+                refreshToken,
+                OAuth2ClientConstants.CLIENT_ID_MENDUNER,
+                loginUser.getInfo()
+        ).getCheckedData();
+
+        return MdeAuthConvert.INSTANCE.convert(accessTokenDO, null);
+    }
 }

+ 20 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/util/ESQueryBuildUtils.java

@@ -5,8 +5,14 @@ import com.citu.module.menduner.system.controller.app.job.vo.AppJobAdvertisedSea
 import com.citu.module.menduner.system.enums.MendunerStatusEnum;
 import org.elasticsearch.index.query.BoolQueryBuilder;
 import org.elasticsearch.index.query.QueryBuilders;
+import org.elasticsearch.index.query.RangeQueryBuilder;
 import org.springframework.util.StringUtils;
 
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+
+import static com.citu.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
 /**
  * es 查询条件构造工具
  **/
@@ -85,6 +91,20 @@ public class ESQueryBuildUtils {
                     (QueryBuilders.termsQuery("areaId", reqVO.getAreaIds()));
         }
 
+        // 获取当前时间并格式化为字符串
+        String formattedNow = LocalDateTime.now()
+                .format(DateTimeFormatter.ofPattern(FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND));
+
+        // 创建一个范围查询,expireTime >= 当前时间
+        RangeQueryBuilder rangeQuery = QueryBuilders.rangeQuery("expireTime").gte(formattedNow);
+
+        // 构建 should 子句,包含范围查询和 exists 查询
+        BoolQueryBuilder expireTimeQuery = QueryBuilders.boolQuery();
+        expireTimeQuery.should(rangeQuery);
+        expireTimeQuery.should(QueryBuilders.boolQuery().mustNot(QueryBuilders.existsQuery("expireTime")));
+
+        boolQuery.filter(expireTimeQuery);
+
         // 状态
         boolQuery.must(QueryBuilders.termQuery("status", MendunerStatusEnum.ENABLE.getStatus()));
         boolQuery.must(QueryBuilders.termQuery("tenantId", TenantContextHolder.getTenantId()));