소스 검색

1、增加用户登录日志

rayson 7 달 전
부모
커밋
c995423081
23개의 변경된 파일640개의 추가작업 그리고 96개의 파일을 삭제
  1. 2 2
      citu-module-system/citu-module-system-api/src/main/java/com/citu/module/system/api/logger/dto/LoginLogCreateReqDTO.java
  2. 21 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/analysis/AnalysisController.java
  3. 0 3
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/analysis/HomeController.java
  4. 10 8
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/enterprise/bind/EnterpriseUserBindDetailRespVO.java
  5. 57 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/logger/LoginLogCreateReqDTO.java
  6. 44 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/logger/LoginLogPageReqVO.java
  7. 66 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/logger/LoginLogRespVO.java
  8. 28 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/userenterprise/UserBindEnterpriseRespVO.java
  9. 4 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/userperson/UserPersonRespVO.java
  10. 89 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/dataobject/logger/LoginLogDO.java
  11. 73 16
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/mysql/enterprise/EnterpriseUserBindMapper.java
  12. 31 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/mysql/logger/LoginLogMapper.java
  13. 28 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/mysql/user/MdeUserMapper.java
  14. 0 2
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/framework/rpc/config/RpcConfiguration.java
  15. 32 23
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/auth/MdeAuthServiceImpl.java
  16. 57 40
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/auth/MdeEnterpriseAuthServiceImpl.java
  17. 2 2
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/enterprise/EnterpriseServiceImpl.java
  18. 9 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/enterprise/bind/EnterpriseUserBindService.java
  19. 8 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/enterprise/bind/EnterpriseUserBindServiceImpl.java
  20. 31 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/logger/LoginLogService.java
  21. 35 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/logger/LoginLogServiceImpl.java
  22. 6 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/user/MdeUserService.java
  23. 7 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/user/MdeUserServiceImpl.java

+ 2 - 2
citu-module-system/citu-module-system-api/src/main/java/com/citu/module/system/api/logger/dto/LoginLogCreateReqDTO.java

@@ -12,7 +12,7 @@ import javax.validation.constraints.Size;
 @Data
 public class LoginLogCreateReqDTO {
 
-    @Schema(description = "日志类型,参见 LoginLogTypeEnum 枚举类", requiredMode = Schema.RequiredMode.REQUIRED, example = "1" )
+    @Schema(description = "日志类型,参见 LoginLogTypeEnum 枚举类", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
     @NotNull(message = "日志类型不能为空")
     private Integer logType;
 
@@ -21,7 +21,7 @@ public class LoginLogCreateReqDTO {
 
     @Schema(description = "用户编号", example = "666")
     private Long userId;
-    @Schema(description = "用户类型,参见 UserTypeEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "2" )
+    @Schema(description = "用户类型,参见 UserTypeEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
     @NotNull(message = "用户类型不能为空")
     private Integer userType;
     @Schema(description = "用户账号", requiredMode = Schema.RequiredMode.REQUIRED, example = "citu")

+ 21 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/analysis/AnalysisController.java

@@ -18,10 +18,13 @@ import com.citu.module.menduner.system.controller.base.analysis.excel.RecruitInt
 import com.citu.module.menduner.system.controller.base.analysis.excel.RecruitJobAnalysisExcelRespVO;
 import com.citu.module.menduner.system.controller.base.analysis.excel.RecruitJobCvRelAnalysisExcelRespVO;
 import com.citu.module.menduner.system.controller.base.user.MdeUserSimpleRespVO;
+import com.citu.module.menduner.system.controller.base.userenterprise.UserBindEnterpriseRespVO;
+import com.citu.module.menduner.system.controller.base.userperson.UserPersonRespVO;
 import com.citu.module.menduner.system.convert.InterviewInviteConvert;
 import com.citu.module.menduner.system.convert.JobAdvertisedConvert;
 import com.citu.module.menduner.system.convert.JobCvRelConvert;
 import com.citu.module.menduner.system.enums.job.JobStatusEnum;
+import com.citu.module.menduner.system.service.enterprise.bind.EnterpriseUserBindService;
 import com.citu.module.menduner.system.service.interview.InterviewInviteService;
 import com.citu.module.menduner.system.service.job.JobAdvertisedService;
 import com.citu.module.menduner.system.service.job.JobCvRelService;
@@ -64,6 +67,9 @@ public class AnalysisController {
     @Resource
     private MdeUserService mdeUserService;
 
+    @Resource
+    private EnterpriseUserBindService enterpriseUserBindService;
+
     @GetMapping("/get/job/cv/sex/count")
     @Operation(summary = "获取投递简历的性别分布")
     @PreAuthenticated
@@ -175,6 +181,21 @@ public class AnalysisController {
         return success(mdeUserService.getUserByUnFillResume(reqVO));
     }
 
+    @GetMapping("/get/login-user/page")
+    @Operation(summary = "获取登录的用户记录")
+    @PreAuthenticated
+    public CommonResult<PageResult<UserPersonRespVO>> getLoginUserPage(RecruitAnalysisPageReqVO reqVO) {
+        return success(mdeUserService.getLoginUserPage(reqVO));
+    }
+
+    @GetMapping("/get/login-enterprise-user/page")
+    @Operation(summary = "获取登录的企业用户记录")
+    @PreAuthenticated
+    public CommonResult<PageResult<UserBindEnterpriseRespVO>> getLoginEnterpriseUserPage
+            (RecruitAnalysisPageReqVO reqVO) {
+        return success(enterpriseUserBindService.getLoginUserPage(reqVO));
+    }
+
 
     @GetMapping("/export")
     @Operation(summary = "导出统计分析 Excel")

+ 0 - 3
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/analysis/HomeController.java

@@ -5,7 +5,6 @@ import com.citu.framework.security.core.annotations.PreAuthenticated;
 import com.citu.module.menduner.common.dto.TimeRangeBaseReqVO;
 import com.citu.module.menduner.system.service.enterprise.EnterpriseService;
 import com.citu.module.menduner.system.service.enterprise.bind.EnterpriseUserBindService;
-import com.citu.module.menduner.system.service.job.JobAdvertisedService;
 import com.citu.module.menduner.system.service.person.info.PersonInfoService;
 import com.citu.module.menduner.system.service.user.MdeUserService;
 import io.swagger.v3.oas.annotations.Operation;
@@ -41,8 +40,6 @@ public class HomeController {
     @Resource
     private EnterpriseUserBindService enterpriseUserBindService;
 
-    @Resource
-    private JobAdvertisedService jobAdvertisedService;
 
     @GetMapping("/get/person/count")
     @Operation(summary = "统计新增加人才简历数量")

+ 10 - 8
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/enterprise/bind/EnterpriseUserBindDetailRespVO.java

@@ -2,24 +2,26 @@ package com.citu.module.menduner.system.controller.base.enterprise.bind;
 
 import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
 import com.alibaba.excel.annotation.ExcelProperty;
-import com.citu.framework.excel.core.annotations.DictFormat;
-import com.citu.framework.excel.core.convert.DictConvert;
+import com.citu.module.menduner.system.controller.base.enterprise.vo.EnterpriseRespVO;
+import com.citu.module.menduner.system.controller.base.logger.LoginLogRespVO;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
-import java.time.LocalDateTime;
-
-import static com.citu.module.menduner.system.enums.DictTypeConstants.MENDUNER_STATUS;
-import static com.citu.module.menduner.system.enums.DictTypeConstants.USER_TYPE;
-
 @Schema(description = "企业登录用户详情 Response VO")
 @Data
 @ExcelIgnoreUnannotated
-public class EnterpriseUserBindDetailRespVO extends EnterpriseUserBindRespVO{
+public class EnterpriseUserBindDetailRespVO extends EnterpriseUserBindRespVO {
 
     @ExcelProperty("企业名称")
     @Schema(description = "企业名称", example = "616")
     private String enterpriseName;
 
+    @Schema(description = "企业信息")
+    @ExcelProperty("企业信息")
+    private EnterpriseRespVO enterprise;
+
+    @Schema(description = "登录日志")
+    private LoginLogRespVO loginLog;
+
 
 }

+ 57 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/logger/LoginLogCreateReqDTO.java

@@ -0,0 +1,57 @@
+package com.citu.module.menduner.system.controller.base.logger;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Size;
+
+@Schema(description = "RPC 服务 - 登录日志创建 Request DTO")
+@Data
+public class LoginLogCreateReqDTO {
+
+    public static final String TYPE_USER = "0";
+    public static final String TYPE_ENTERPRISE_USER = "1";
+
+    @Schema(description = "日志类型,参见 LoginLogTypeEnum 枚举类", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    @NotNull(message = "日志类型不能为空")
+    private Integer logType;
+
+    @Schema(description = "链路追踪编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "89aca178-a370-411c-ae02-3f0d672be4ab")
+    private String traceId;
+
+    @Schema(description = "用户编号", example = "666")
+    private Long userId;
+
+    @Schema(description = "企业编号", example = "666")
+    private Long enterpriseId;
+
+    @Schema(description = "用户类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
+    @NotNull(message = "用户类型不能为空")
+    private String type;
+
+    @Schema(description = "用户账号", requiredMode = Schema.RequiredMode.REQUIRED, example = "citu")
+    @NotBlank(message = "用户账号不能为空")
+    @Size(max = 30, message = "用户账号长度不能超过30个字符")
+    private String username;
+
+    @Schema(description = "是否首次登录")
+    private Boolean first;
+
+    @Schema(description = "是否企业首次登录")
+    private Boolean enterpriseFirst;
+
+    @Schema(description = "登录结果,参见 LoginResultEnum 枚举类", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    @NotNull(message = "登录结果不能为空")
+    private Integer result;
+
+    @Schema(description = "用户 IP", requiredMode = Schema.RequiredMode.REQUIRED, example = "127.0.0.1")
+    @NotEmpty(message = "用户 IP 不能为空")
+    private String userIp;
+
+    @Schema(description = "浏览器 UserAgent", requiredMode = Schema.RequiredMode.REQUIRED, example = "Mozilla/5.0")
+    private String userAgent;
+
+}

+ 44 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/logger/LoginLogPageReqVO.java

@@ -0,0 +1,44 @@
+package com.citu.module.menduner.system.controller.base.logger;
+
+import com.citu.framework.common.pojo.PageParam;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.time.LocalDateTime;
+
+import static com.citu.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 登录日志分页列表 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class LoginLogPageReqVO extends PageParam {
+
+
+    @Schema(description = "用户编号", example = "666")
+    private Long userId;
+
+    @Schema(description = "企业编号", example = "666")
+    private Long enterpriseId;
+
+    @Schema(description = "用户 IP,模拟匹配", example = "127.0.0.1")
+    private String userIp;
+
+    @Schema(description = "用户账号,模拟匹配", example = "芋道")
+    private String username;
+
+    @Schema(description = "是否首次登录")
+    private Boolean first;
+
+    @Schema(description = "是否企业首次登录")
+    private Boolean enterpriseFirst;
+
+    @Schema(description = "操作状态", example = "true")
+    private Boolean status;
+
+    @Schema(description = "登录时间", example = "[2022-07-01 00:00:00,2022-07-01 23:59:59]")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] createTime;
+
+}

+ 66 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/logger/LoginLogRespVO.java

@@ -0,0 +1,66 @@
+package com.citu.module.menduner.system.controller.base.logger;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.citu.framework.excel.core.annotations.DictFormat;
+import com.citu.framework.excel.core.convert.DictConvert;
+import com.citu.module.system.enums.DictTypeConstants;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Schema(description = "管理后台 - 登录日志 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class LoginLogRespVO {
+
+    @Schema(description = "日志编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
+    @ExcelProperty("日志主键")
+    private Long id;
+
+    @Schema(description = "日志类型,参见 LoginLogTypeEnum 枚举类", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    @ExcelProperty(value = "日志类型", converter = DictConvert.class)
+    @DictFormat(DictTypeConstants.LOGIN_TYPE)
+    private Integer logType;
+
+    @Schema(description = "用户编号", example = "666")
+    private Long userId;
+
+    @Schema(description = "企业编号", example = "666")
+    private Long enterpriseId;
+
+    @Schema(description = "用户类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
+    private Integer type;
+
+    @Schema(description = "链路追踪编号", example = "89aca178-a370-411c-ae02-3f0d672be4ab")
+    private String traceId;
+
+    @Schema(description = "用户账号", requiredMode = Schema.RequiredMode.REQUIRED, example = "citu")
+    @ExcelProperty("用户账号")
+    private String username;
+
+    @Schema(description = "是否首次登录")
+    private Boolean first;
+
+    @Schema(description = "是否企业首次登录")
+    private Boolean enterpriseFirst;
+
+    @Schema(description = "登录结果,参见 LoginResultEnum 枚举类", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    @ExcelProperty(value = "登录结果", converter = DictConvert.class)
+    @DictFormat(DictTypeConstants.LOGIN_RESULT)
+    private Integer result;
+
+    @Schema(description = "用户 IP", requiredMode = Schema.RequiredMode.REQUIRED, example = "127.0.0.1")
+    @ExcelProperty("登录 IP")
+    private String userIp;
+
+    @Schema(description = "浏览器 UserAgent", example = "Mozilla/5.0")
+    @ExcelProperty("浏览器 UA")
+    private String userAgent;
+
+    @Schema(description = "登录时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("登录时间")
+    private LocalDateTime createTime;
+
+}

+ 28 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/userenterprise/UserBindEnterpriseRespVO.java

@@ -0,0 +1,28 @@
+package com.citu.module.menduner.system.controller.base.userenterprise;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.citu.module.menduner.system.controller.base.enterprise.bind.EnterpriseUserBindRespVO;
+import com.citu.module.menduner.system.controller.base.enterprise.vo.EnterpriseRespVO;
+import com.citu.module.menduner.system.controller.base.logger.LoginLogRespVO;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Schema(description = "企业用户信息 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class UserBindEnterpriseRespVO  {
+
+    @ExcelProperty("企业用户信息")
+    @Schema(description = "企业用户信息", example = "616")
+    private EnterpriseUserBindRespVO userBind;
+
+    @Schema(description = "企业信息")
+    @ExcelProperty("企业信息")
+    private EnterpriseRespVO enterprise;
+
+    @Schema(description = "登录日志")
+    private LoginLogRespVO loginLog;
+
+
+}

+ 4 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/userperson/UserPersonRespVO.java

@@ -3,6 +3,7 @@ package com.citu.module.menduner.system.controller.base.userperson;
 
 import com.citu.module.menduner.system.controller.base.eduexp.EduExpRespVO;
 import com.citu.module.menduner.system.controller.base.job.interested.JobInterestedRespVO;
+import com.citu.module.menduner.system.controller.base.logger.LoginLogRespVO;
 import com.citu.module.menduner.system.controller.base.person.info.PersonInfoRespVO;
 import com.citu.module.menduner.system.controller.base.trainexp.TrainExpRespVO;
 import com.citu.module.menduner.system.controller.base.user.MdeUserRespVO;
@@ -39,4 +40,7 @@ public class UserPersonRespVO {
 
     @Schema(description = "邀请用户,如果邀请方填写了简历就是名字,否则就是登录手机号")
     private String inviteUserStr;
+
+    @Schema(description = "登录日志")
+    private LoginLogRespVO loginLog;
 }

+ 89 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/dataobject/logger/LoginLogDO.java

@@ -0,0 +1,89 @@
+package com.citu.module.menduner.system.dal.dataobject.logger;
+
+import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.citu.framework.common.enums.UserTypeEnum;
+import com.citu.framework.mybatis.core.dataobject.BaseDO;
+import com.citu.framework.tenant.core.db.TenantBaseDO;
+import com.citu.module.system.enums.logger.LoginLogTypeEnum;
+import com.citu.module.system.enums.logger.LoginResultEnum;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
+/**
+ * 登录日志表
+ *
+ * 注意,包括登录和登出两种行为
+ *
+ * @author Rayson
+ */
+@TableName("mde_login_log")
+@KeySequence("mde_login_log_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class LoginLogDO extends TenantBaseDO {
+
+    /**
+     * 日志主键
+     */
+    private Long id;
+    /**
+     * 日志类型
+     *
+     * 枚举 {@link LoginLogTypeEnum}
+     */
+    private Integer logType;
+    /**
+     * 链路追踪编号
+     */
+    private String traceId;
+    /**
+     * 用户编号
+     */
+    private Long userId;
+    /**
+     * 企业编号
+     */
+    private Long enterpriseId;
+    /**
+     * 用户类型
+     *
+     * 0 普通用户 | 1企业用户
+     */
+    private Integer type;
+    /**
+     * 用户账号
+     *
+     * 冗余,因为账号可以变更
+     */
+    private String username;
+    /**
+     * 是否首次登录,登录用户时间为null时本次才为true,否则false
+     * 冗余,用于统计数据
+     */
+    private Boolean first;
+    /**
+     * 是否企业首次登录,企业表first为null或者未true时该字段为true,否则false
+     * (用于统计) 该字段还有个目的,记录是否是该用户第一次登录企业(一个企业有多个账号)
+     * 冗余,用于统计数据
+     */
+    private Boolean enterpriseFirst;
+    /**
+     * 登录结果
+     *
+     * 枚举 {@link LoginResultEnum}
+     */
+    private Integer result;
+    /**
+     * 用户 IP
+     */
+    private String userIp;
+    /**
+     * 浏览器 UA
+     */
+    private String userAgent;
+
+}

+ 73 - 16
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/mysql/enterprise/EnterpriseUserBindMapper.java

@@ -12,12 +12,17 @@ import com.citu.module.menduner.system.controller.app.recruit.user.vo.AppRecruit
 import com.citu.module.menduner.system.controller.app.recruit.user.vo.AppRecruitUserPageReqVO;
 import com.citu.module.menduner.system.controller.app.recruit.user.vo.AppRecruitUserRespVO;
 import com.citu.module.menduner.system.controller.base.CommonRespVO;
+import com.citu.module.menduner.system.controller.base.analysis.RecruitAnalysisPageReqVO;
 import com.citu.module.menduner.system.controller.base.contact.EnterpriseUserSummaryRespVO;
 import com.citu.module.menduner.system.controller.base.enterprise.bind.EnterpriseUserBindDetailRespVO;
 import com.citu.module.menduner.system.controller.base.enterprise.bind.EnterpriseUserBindPageReqVO;
 import com.citu.module.menduner.system.controller.base.enterprise.bind.EnterpriseUserBindReqVO;
+import com.citu.module.menduner.system.controller.base.userenterprise.UserBindEnterpriseRespVO;
+import com.citu.module.menduner.system.controller.base.userperson.UserPersonRespVO;
 import com.citu.module.menduner.system.dal.dataobject.enterprise.EnterpriseDO;
 import com.citu.module.menduner.system.dal.dataobject.enterprise.EnterpriseUserBindDO;
+import com.citu.module.menduner.system.dal.dataobject.logger.LoginLogDO;
+import com.citu.module.menduner.system.dal.dataobject.user.MdeUserDO;
 import com.citu.module.menduner.system.enums.MendunerStatusEnum;
 import com.citu.module.menduner.system.enums.enterprise.EnterpriseUserTypeEnum;
 import com.citu.module.menduner.system.util.RecruitAnalysisUtils;
@@ -54,14 +59,16 @@ public interface EnterpriseUserBindMapper extends BaseMapperX<EnterpriseUserBind
                 .eq(EnterpriseUserBindDO::getEmail, email));
     }
 
-   default List<EnterpriseUserBindDO> getByEnterpriseIdList(List<Long> enterpriseIdList){
+    default List<EnterpriseUserBindDO> getByEnterpriseIdList(List<Long> enterpriseIdList) {
         return selectList(new LambdaQueryWrapperX<EnterpriseUserBindDO>()
                 .in(EnterpriseUserBindDO::getEnterpriseId, enterpriseIdList)
                 .eq(EnterpriseUserBindDO::getStatus, MendunerStatusEnum.ENABLE.getStatus())
         );
     }
 
-    /** 根据查询条件查询企业用户列表 **/
+    /**
+     * 根据查询条件查询企业用户列表
+     **/
     default List<EnterpriseUserBindDO> list(EnterpriseUserBindReqVO reqVO) {
         return selectList(new LambdaQueryWrapperX<EnterpriseUserBindDO>()
                 .eqIfPresent(EnterpriseUserBindDO::getEnterpriseId, reqVO.getEnterpriseId())
@@ -75,7 +82,9 @@ public interface EnterpriseUserBindMapper extends BaseMapperX<EnterpriseUserBind
 
     }
 
-    /** 根据查询条件分页查询企业用户列表,返回企业用户详情信息 **/
+    /**
+     * 根据查询条件分页查询企业用户列表,返回企业用户详情信息
+     **/
     default PageResult<EnterpriseUserBindDetailRespVO> page(EnterpriseUserBindPageReqVO reqVO) {
         MPJLambdaWrapperX<EnterpriseUserBindDO> wrapper = new MPJLambdaWrapperX<>();
         wrapper.selectAll(EnterpriseUserBindDO.class);
@@ -95,7 +104,9 @@ public interface EnterpriseUserBindMapper extends BaseMapperX<EnterpriseUserBind
 
     }
 
-    /** 根据id查询企业用户 **/
+    /**
+     * 根据id查询企业用户
+     **/
     default EnterpriseUserBindDetailRespVO get(Long id) {
         MPJLambdaWrapperX<EnterpriseUserBindDO> wrapper = new MPJLambdaWrapperX<>();
         wrapper.selectAll(EnterpriseUserBindDO.class);
@@ -106,7 +117,9 @@ public interface EnterpriseUserBindMapper extends BaseMapperX<EnterpriseUserBind
 
     }
 
-    /** 根据用户id查询企业用户集合 **/
+    /**
+     * 根据用户id查询企业用户集合
+     **/
     default List<EnterpriseUserBindDO> selectListByUserId(Long userId) {
         return selectList(new LambdaQueryWrapperX<EnterpriseUserBindDO>()
                 .eqIfPresent(EnterpriseUserBindDO::getUserId, userId)
@@ -115,14 +128,19 @@ public interface EnterpriseUserBindMapper extends BaseMapperX<EnterpriseUserBind
     }
 
 
-    /** 根据企业id和用户id查询企业用户信息 **/
+    /**
+     * 根据企业id和用户id查询企业用户信息
+     **/
     default EnterpriseUserBindDO selectByEnterpriseIdAndUserId(Long enterpriseId, Long userId) {
         return selectOne(new LambdaQueryWrapperX<EnterpriseUserBindDO>()
                 .eqIfPresent(EnterpriseUserBindDO::getEnterpriseId, enterpriseId)
                 .eqIfPresent(EnterpriseUserBindDO::getUserId, userId)
         );
     }
-    /** 根据企业id获取企业管理员 **/
+
+    /**
+     * 根据企业id获取企业管理员
+     **/
     default EnterpriseUserBindDO selectByEnterpriseAdmin(Long enterpriseId) {
         return selectOne(new LambdaQueryWrapperX<EnterpriseUserBindDO>()
                 .eqIfPresent(EnterpriseUserBindDO::getEnterpriseId, enterpriseId)
@@ -131,8 +149,9 @@ public interface EnterpriseUserBindMapper extends BaseMapperX<EnterpriseUserBind
     }
 
 
-
-    /** 根据企业id和id查询企业用户信息 **/
+    /**
+     * 根据企业id和id查询企业用户信息
+     **/
     default EnterpriseUserBindDO selectByEnterpriseIdAndId(Long enterpriseId, Long id) {
         return selectOne(new LambdaQueryWrapperX<EnterpriseUserBindDO>()
                 .eqIfPresent(EnterpriseUserBindDO::getEnterpriseId, enterpriseId)
@@ -140,7 +159,9 @@ public interface EnterpriseUserBindMapper extends BaseMapperX<EnterpriseUserBind
         );
     }
 
-    /** 根据企业id和岗位id查询企业用户信息 **/
+    /**
+     * 根据企业id和岗位id查询企业用户信息
+     **/
     default List<EnterpriseUserBindDO> selectByEnterpriseIdAndPostId(Long enterpriseId, Long postId) {
         return selectList(new LambdaQueryWrapperX<EnterpriseUserBindDO>()
                 .eqIfPresent(EnterpriseUserBindDO::getEnterpriseId, enterpriseId)
@@ -149,7 +170,9 @@ public interface EnterpriseUserBindMapper extends BaseMapperX<EnterpriseUserBind
     }
 
 
-    /** 招聘端 - 根据企业id和查询条件查询企业用户信息 **/
+    /**
+     * 招聘端 - 根据企业id和查询条件查询企业用户信息
+     **/
     default PageResult<AppRecruitUserRespVO> selectPage(AppRecruitUserPageReqVO reqVO, Long enterpriseId) {
         MPJLambdaWrapperX<EnterpriseUserBindDO> wrapper = new MPJLambdaWrapperX<>();
         wrapper.selectAll(EnterpriseUserBindDO.class);
@@ -171,7 +194,9 @@ public interface EnterpriseUserBindMapper extends BaseMapperX<EnterpriseUserBind
         return selectJoinPage(reqVO, AppRecruitUserRespVO.class, wrapper);
     }
 
-    /** 招聘端 - 根据企业id和用户id查询企业用户信息 **/
+    /**
+     * 招聘端 - 根据企业id和用户id查询企业用户信息
+     **/
     default AppRecruitEnterpriseUserRespVO selectEnterpriseUser(Long enterpriseId, Long userId) {
         MPJLambdaWrapperX<EnterpriseUserBindDO> wrapper = new MPJLambdaWrapperX<>();
         wrapper.selectAll(EnterpriseUserBindDO.class);
@@ -189,8 +214,9 @@ public interface EnterpriseUserBindMapper extends BaseMapperX<EnterpriseUserBind
     }
 
 
-
-    /** 根据企业id和用户id查询企业用户概要信息 **/
+    /**
+     * 根据企业id和用户id查询企业用户概要信息
+     **/
     default EnterpriseUserSummaryRespVO selectUserSummary(Long enterpriseId, Long userId) {
         MPJLambdaWrapperX<EnterpriseUserBindDO> wrapper = new MPJLambdaWrapperX<>();
         wrapper.selectAssociation(EnterpriseUserBindDO.class, EnterpriseUserSummaryRespVO::getContact);
@@ -206,7 +232,9 @@ public interface EnterpriseUserBindMapper extends BaseMapperX<EnterpriseUserBind
     }
 
 
-    /** 根据企业id和用户id查询企业用户信息 **/
+    /**
+     * 根据企业id和用户id查询企业用户信息
+     **/
     default UserInfoRespDTO selectUserInfo(Long enterpriseId, Long userId) {
         MPJLambdaWrapperX<EnterpriseUserBindDO> wrapper = new MPJLambdaWrapperX<>();
         wrapper.selectAsClass(EnterpriseUserBindDO.class, UserInfoRespDTO.class);
@@ -230,7 +258,7 @@ public interface EnterpriseUserBindMapper extends BaseMapperX<EnterpriseUserBind
      * 企业用户的统计
      **/
     default List<CommonRespVO> getEnterpriseUserCount(TimeRangeBaseReqVO reqVO,
-                                                  LocalDateTime startTime, LocalDateTime endTime) {
+                                                      LocalDateTime startTime, LocalDateTime endTime) {
 
         MPJLambdaWrapperX<EnterpriseUserBindDO> wrapper = new MPJLambdaWrapperX<>();
         wrapper.selectCount(EnterpriseUserBindDO::getId, CommonRespVO::getValue);
@@ -243,5 +271,34 @@ public interface EnterpriseUserBindMapper extends BaseMapperX<EnterpriseUserBind
         return selectJoinList(CommonRespVO.class, wrapper);
     }
 
+    /**
+     * 查询登录的企业用户记录
+     *
+     * @param reqVO     公共条件
+     * @param startTime 开始时间
+     * @param endTime   结束时间
+     **/
+    default PageResult<UserBindEnterpriseRespVO> getLoginUserPage(RecruitAnalysisPageReqVO reqVO,
+                                                                  LocalDateTime startTime, LocalDateTime endTime) {
+        MPJLambdaWrapperX<EnterpriseUserBindDO> wrapper = new MPJLambdaWrapperX<>();
+        wrapper.selectAssociation(EnterpriseUserBindDO.class, UserBindEnterpriseRespVO::getUserBind);
+        wrapper.selectAssociation(EnterpriseDO.class, UserBindEnterpriseRespVO::getEnterprise);
+        wrapper.selectAssociation(LoginLogDO.class, UserBindEnterpriseRespVO::getLoginLog);
+        wrapper.innerJoin(EnterpriseDO.class, EnterpriseDO::getId, EnterpriseUserBindDO::getEnterpriseId);
+        wrapper.innerJoin(LoginLogDO.class, on-> on
+                .eq(LoginLogDO::getEnterpriseId, EnterpriseUserBindDO::getEnterpriseId)
+                .eq(LoginLogDO::getUserId, EnterpriseUserBindDO::getUserId)
+        );
+
+        wrapper.inIfPresent(EnterpriseUserBindDO::getUserId, reqVO.getUserId());
+        wrapper.eqIfPresent(EnterpriseUserBindDO::getEnterpriseId, reqVO.getEnterpriseId());
+
+        if(null != startTime && null != endTime) {
+            wrapper.between(LoginLogDO::getCreateTime, startTime, endTime);
+        }
+        wrapper.orderByDesc(LoginLogDO::getCreateTime);
+        return selectJoinPage(reqVO, UserBindEnterpriseRespVO.class, wrapper);
+    }
+
 
 }

+ 31 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/mysql/logger/LoginLogMapper.java

@@ -0,0 +1,31 @@
+package com.citu.module.menduner.system.dal.mysql.logger;
+
+import com.citu.framework.common.pojo.PageResult;
+import com.citu.framework.mybatis.core.mapper.BaseMapperX;
+import com.citu.framework.mybatis.core.query.LambdaQueryWrapperX;
+import com.citu.module.menduner.system.controller.base.logger.LoginLogPageReqVO;
+import com.citu.module.menduner.system.dal.dataobject.logger.LoginLogDO;
+import com.citu.module.system.enums.logger.LoginResultEnum;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface LoginLogMapper extends BaseMapperX<LoginLogDO> {
+
+    default PageResult<LoginLogDO> selectPage(LoginLogPageReqVO reqVO) {
+        LambdaQueryWrapperX<LoginLogDO> query = new LambdaQueryWrapperX<LoginLogDO>()
+                .eqIfPresent(LoginLogDO::getUserId, reqVO.getUserId())
+                .eqIfPresent(LoginLogDO::getEnterpriseId, reqVO.getEnterpriseId())
+                .eqIfPresent(LoginLogDO::getFirst, reqVO.getFirst())
+                .likeIfPresent(LoginLogDO::getUserIp, reqVO.getUserIp())
+                .likeIfPresent(LoginLogDO::getUsername, reqVO.getUsername())
+                .betweenIfPresent(LoginLogDO::getCreateTime, reqVO.getCreateTime());
+        if (Boolean.TRUE.equals(reqVO.getStatus())) {
+            query.eq(LoginLogDO::getResult, LoginResultEnum.SUCCESS.getResult());
+        } else if (Boolean.FALSE.equals(reqVO.getStatus())) {
+            query.gt(LoginLogDO::getResult, LoginResultEnum.SUCCESS.getResult());
+        }
+        query.orderByDesc(LoginLogDO::getCreateTime);
+        return selectPage(reqVO, query);
+    }
+
+}

+ 28 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/mysql/user/MdeUserMapper.java

@@ -14,7 +14,9 @@ import com.citu.module.menduner.system.controller.base.user.MdeUserSimpleRespVO;
 import com.citu.module.menduner.system.controller.base.userperson.UserPersonPageReqVO;
 import com.citu.module.menduner.system.controller.base.userperson.UserPersonRespVO;
 import com.citu.module.menduner.system.dal.dataobject.enterprise.EnterpriseDO;
+import com.citu.module.menduner.system.dal.dataobject.interview.InterviewInviteDO;
 import com.citu.module.menduner.system.dal.dataobject.job.JobAdvertisedDO;
+import com.citu.module.menduner.system.dal.dataobject.logger.LoginLogDO;
 import com.citu.module.menduner.system.dal.dataobject.person.PersonInfoDO;
 import com.citu.module.menduner.system.dal.dataobject.user.MdeUserDO;
 import com.citu.module.menduner.system.util.RecruitAnalysisUtils;
@@ -145,4 +147,30 @@ public interface MdeUserMapper extends BaseMapperX<MdeUserDO> {
         return selectJoinPage(reqVO, MdeUserSimpleRespVO.class, query);
 
     }
+
+
+    /**
+     * 查询登录的用户记录
+     *
+     * @param reqVO     公共条件
+     * @param startTime 开始时间
+     * @param endTime   结束时间
+     **/
+    default PageResult<UserPersonRespVO> getLoginUserPage(RecruitAnalysisPageReqVO reqVO,
+                                                          LocalDateTime startTime, LocalDateTime endTime) {
+        MPJLambdaWrapperX<MdeUserDO> query = new MPJLambdaWrapperX<>();
+        query.selectAssociation(MdeUserDO.class, UserPersonRespVO::getUser);
+        query.selectAssociation(PersonInfoDO.class, UserPersonRespVO::getPerson);
+        query.selectAssociation(LoginLogDO.class, UserPersonRespVO::getLoginLog);
+        query.leftJoin(PersonInfoDO.class, on -> on.eq(PersonInfoDO::getUserId, MdeUserDO::getId));
+        query.innerJoin(LoginLogDO.class, LoginLogDO::getUserId, MdeUserDO::getId);
+
+        query.inIfPresent(MdeUserDO::getId, reqVO.getUserId());
+
+        if(null != startTime && null != endTime) {
+            query.between(LoginLogDO::getCreateTime, startTime, endTime);
+        }
+        query.orderByDesc(LoginLogDO::getCreateTime);
+        return selectJoinPage(reqVO, UserPersonRespVO.class, query);
+    }
 }

+ 0 - 2
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/framework/rpc/config/RpcConfiguration.java

@@ -6,7 +6,6 @@ import com.citu.module.menduner.system.api.python.GraphApi;
 import com.citu.module.pay.api.order.PayOrderApi;
 import com.citu.module.pay.api.refund.PayRefundApi;
 import com.citu.module.pay.api.wallet.PayWalletApi;
-import com.citu.module.system.api.logger.LoginLogApi;
 import com.citu.module.system.api.mail.MailSendApi;
 import com.citu.module.system.api.notify.NotifyMessageSendApi;
 import com.citu.module.system.api.sms.SmsCodeApi;
@@ -19,7 +18,6 @@ import org.springframework.context.annotation.Configuration;
 @EnableFeignClients(clients = {
         SmsCodeApi.class,
         FileApi.class,
-        LoginLogApi.class,
         SocialUserApi.class,
         SocialClientApi.class,
         MailSendApi.class,

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

@@ -14,13 +14,13 @@ import com.citu.module.menduner.common.enums.PointBizTypeEnum;
 import com.citu.module.menduner.common.message.EventAsyncConfirmMessage;
 import com.citu.module.menduner.system.controller.app.common.auth.vo.*;
 import com.citu.module.menduner.system.controller.app.jobhunt.user.vo.AppMdeUserResetPasswordReqVO;
+import com.citu.module.menduner.system.controller.base.logger.LoginLogCreateReqDTO;
 import com.citu.module.menduner.system.convert.MdeAuthConvert;
 import com.citu.module.menduner.system.dal.dataobject.user.MdeUserDO;
 import com.citu.module.menduner.system.enums.MendunerStatusEnum;
 import com.citu.module.menduner.system.mq.producer.PointOperateProducer;
+import com.citu.module.menduner.system.service.logger.LoginLogService;
 import com.citu.module.menduner.system.service.user.MdeUserService;
-import com.citu.module.system.api.logger.LoginLogApi;
-import com.citu.module.system.api.logger.dto.LoginLogCreateReqDTO;
 import com.citu.module.system.api.oauth2.OAuth2TokenApi;
 import com.citu.module.system.api.oauth2.dto.OAuth2AccessTokenCreateReqDTO;
 import com.citu.module.system.api.oauth2.dto.OAuth2AccessTokenRespDTO;
@@ -54,6 +54,7 @@ import java.util.concurrent.TimeUnit;
 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.web.core.util.WebFrameworkUtils.getTerminal;
+import static com.citu.module.menduner.system.controller.base.logger.LoginLogCreateReqDTO.TYPE_USER;
 import static com.citu.module.menduner.system.dal.redis.RedisKeyConstants.*;
 import static com.citu.module.menduner.system.enums.ErrorCodeConstants.*;
 
@@ -71,7 +72,7 @@ public class MdeAuthServiceImpl implements MdeAuthService {
     @Resource
     protected SmsCodeApi smsCodeApi;
     @Resource
-    protected LoginLogApi loginLogApi;
+    protected LoginLogService loginLogService;
     @Resource
     protected SocialUserApi socialUserApi;
     @Resource
@@ -117,12 +118,13 @@ public class MdeAuthServiceImpl implements MdeAuthService {
     @Override
     public AppMdeAuthLoginRespVO login(AppMdeAuthLoginReqVO reqVO) {
         // 校验验证码
-       String userAgent = ServletUtils.getUserAgent().toLowerCase();
-       if(!userAgent.contains("micromessenger")
-               && !userAgent.contains("wechatdevtools")
-               && !userAgent.contains("miniprogram")) {
-           validateCaptcha(reqVO);
-       }
+        String userAgent = ServletUtils.getUserAgent().toLowerCase();
+        if (!userAgent.contains("micromessenger")
+                && !userAgent.contains("wechatdevtools")
+                && !userAgent.contains("miniprogram")) {
+            // 不是小程序登录要验证图形
+            validateCaptcha(reqVO);
+        }
         LoginLogTypeEnum logTypeEnum = LoginLogTypeEnum.LOGIN_MOBILE;
         // TODO 求职端用户 手机号+密码,招聘端用户 邮箱+密码
         if (ValidationUtils.isMobile(reqVO.getAccount())) {
@@ -167,7 +169,7 @@ public class MdeAuthServiceImpl implements MdeAuthService {
         }
         // 校验是否禁用
         if (ObjectUtil.notEqual(user.getStatus(), MendunerStatusEnum.ENABLE.getStatus())) {
-            createLoginLog(user.getId(), account, logTypeEnum, LoginResultEnum.USER_DISABLED);
+            createLoginLog(user, account, logTypeEnum, LoginResultEnum.USER_DISABLED);
             throw exception(MDE_AUTH_LOGIN_USER_DISABLED);
         }
 
@@ -188,11 +190,11 @@ public class MdeAuthServiceImpl implements MdeAuthService {
                 if (numInt >= 5) {
                     // 8个小时内输错5次 锁定
                     userService.disable(Collections.singletonList(user.getId()));
-                    createLoginLog(user.getId(), account, logTypeEnum, LoginResultEnum.USER_DISABLED);
+                    createLoginLog(user, account, logTypeEnum, LoginResultEnum.USER_DISABLED);
                     throw exception(MDE_AUTH_LOGIN_USER_DISABLED);
                 } else {
                     // 提示账户密码错误
-                    createLoginLog(user.getId(), account, logTypeEnum, LoginResultEnum.BAD_CREDENTIALS);
+                    createLoginLog(user, account, logTypeEnum, LoginResultEnum.BAD_CREDENTIALS);
                     throw exception(MDE_AUTH_LOGIN_BAD_CREDENTIALS);
                 }
             }
@@ -220,12 +222,14 @@ public class MdeAuthServiceImpl implements MdeAuthService {
         reqDTO.setLogType(LoginLogTypeEnum.LOGOUT_SELF.getType());
         reqDTO.setTraceId(TracerUtils.getTraceId());
         reqDTO.setUserId(userId);
-        reqDTO.setUserType(getUserType().getValue());
+        reqDTO.setEnterpriseId(null);
+        reqDTO.setType(TYPE_USER);
         reqDTO.setUsername(getPhone(userId));
+        reqDTO.setFirst(false);
         reqDTO.setUserAgent(ServletUtils.getUserAgent());
         reqDTO.setUserIp(getClientIP());
         reqDTO.setResult(LoginResultEnum.SUCCESS.getResult());
-        loginLogApi.createLoginLog(reqDTO);
+        loginLogService.createLoginLog(reqDTO);
     }
 
     @Override
@@ -251,7 +255,7 @@ public class MdeAuthServiceImpl implements MdeAuthService {
 
         // 是否禁用
         if (ObjectUtil.notEqual(user.getStatus(), MendunerStatusEnum.ENABLE.getStatus())) {
-            createLoginLog(user.getId(), user.getPhone(), LoginLogTypeEnum.LOGIN_SMS, LoginResultEnum.USER_DISABLED);
+            createLoginLog(user, user.getPhone(), LoginLogTypeEnum.LOGIN_SMS, LoginResultEnum.USER_DISABLED);
             throw exception(MDE_AUTH_LOGIN_USER_DISABLED);
         }
 
@@ -268,7 +272,7 @@ public class MdeAuthServiceImpl implements MdeAuthService {
             if (numInt >= 5) {
                 // 8个小时内输错5次 锁定
                 userService.disable(Collections.singletonList(user.getId()));
-                createLoginLog(user.getId(), user.getPhone(), LoginLogTypeEnum.LOGIN_SMS, LoginResultEnum.USER_DISABLED);
+                createLoginLog(user, user.getPhone(), LoginLogTypeEnum.LOGIN_SMS, LoginResultEnum.USER_DISABLED);
                 throw exception(MDE_AUTH_LOGIN_USER_DISABLED);
             } else {
                 // 提示验证码错误
@@ -452,21 +456,26 @@ public class MdeAuthServiceImpl implements MdeAuthService {
         return user != null ? user.getPhone() : null;
     }
 
-    protected void createLoginLog(Long userId, String account, LoginLogTypeEnum logType, LoginResultEnum loginResult) {
+    protected void createLoginLog(MdeUserDO user,
+                                  String account,
+                                  LoginLogTypeEnum logType,
+                                  LoginResultEnum loginResult) {
         // 插入登录日志
         LoginLogCreateReqDTO reqDTO = new LoginLogCreateReqDTO();
         reqDTO.setLogType(logType.getType());
         reqDTO.setTraceId(TracerUtils.getTraceId());
-        reqDTO.setUserId(userId);
-        reqDTO.setUserType(getUserType().getValue());
+        reqDTO.setUserId(null != user ? user.getId() : null);
+        reqDTO.setEnterpriseId(null);
+        reqDTO.setType(TYPE_USER);
         reqDTO.setUsername(account);
+        reqDTO.setFirst(null != user && null == user.getLoginDate());
         reqDTO.setUserAgent(ServletUtils.getUserAgent());
         reqDTO.setUserIp(getClientIP());
         reqDTO.setResult(loginResult.getResult());
-        loginLogApi.createLoginLog(reqDTO);
+        loginLogService.createLoginLog(reqDTO);
         // 更新最后登录时间
-        if (userId != null && Objects.equals(LoginResultEnum.SUCCESS.getResult(), loginResult.getResult())) {
-            userService.updateUserLogin(userId, getClientIP());
+        if (user != null && Objects.equals(LoginResultEnum.SUCCESS.getResult(), loginResult.getResult())) {
+            userService.updateUserLogin(user.getId(), getClientIP());
         }
     }
 
@@ -477,7 +486,7 @@ public class MdeAuthServiceImpl implements MdeAuthService {
     protected AppMdeAuthLoginRespVO createTokenAfterLoginSuccess(MdeUserDO user, String userName,
                                                                  LoginLogTypeEnum logType, String openid) {
         // 插入登陆日志
-        createLoginLog(user.getId(), userName, logType, LoginResultEnum.SUCCESS);
+        createLoginLog(user, userName, logType, LoginResultEnum.SUCCESS);
         // 创建 Token 令牌
         OAuth2AccessTokenRespDTO accessTokenRespDTO = oauth2TokenApi.createAccessToken(
                         new OAuth2AccessTokenCreateReqDTO()

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

@@ -9,20 +9,20 @@ 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.common.CommonConstants;
 import com.citu.module.menduner.common.util.LoginUserContext;
 import com.citu.module.menduner.system.controller.app.common.auth.enterprise.AppEnterpriseAuthSwitchLoginReqVO;
 import com.citu.module.menduner.system.controller.app.common.auth.enterprise.AppEnterpriseResetPasswordReqVO;
 import com.citu.module.menduner.system.controller.app.common.auth.vo.AppMdeAuthLoginRespVO;
+import com.citu.module.menduner.system.controller.base.logger.LoginLogCreateReqDTO;
 import com.citu.module.menduner.system.convert.MdeAuthConvert;
+import com.citu.module.menduner.system.dal.dataobject.enterprise.EnterpriseDO;
 import com.citu.module.menduner.system.dal.dataobject.enterprise.EnterpriseUserBindDO;
-import com.citu.module.menduner.system.dal.dataobject.user.MdeUserDO;
-import com.citu.module.menduner.common.CommonConstants;
 import com.citu.module.menduner.system.enums.MendunerStatusEnum;
+import com.citu.module.menduner.system.service.enterprise.EnterpriseService;
 import com.citu.module.menduner.system.service.enterprise.bind.EnterpriseUserBindService;
 import com.citu.module.menduner.system.service.enterprise.register.EnterpriseRegisterService;
-import com.citu.module.menduner.system.service.user.MdeUserService;
-import com.citu.module.system.api.logger.LoginLogApi;
-import com.citu.module.system.api.logger.dto.LoginLogCreateReqDTO;
+import com.citu.module.menduner.system.service.logger.LoginLogService;
 import com.citu.module.system.api.mail.MailSendApi;
 import com.citu.module.system.api.mail.dto.MailSendSingleToUserReqDTO;
 import com.citu.module.system.api.oauth2.OAuth2TokenApi;
@@ -48,6 +48,7 @@ import java.util.concurrent.TimeUnit;
 
 import static com.citu.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static com.citu.framework.common.util.servlet.ServletUtils.getClientIP;
+import static com.citu.module.menduner.system.controller.base.logger.LoginLogCreateReqDTO.TYPE_ENTERPRISE_USER;
 import static com.citu.module.menduner.system.dal.redis.RedisKeyConstants.MDE_AUTH_ENTERPRISE_USER_PWD_LOCK;
 import static com.citu.module.menduner.system.enums.ErrorCodeConstants.*;
 
@@ -60,11 +61,8 @@ import static com.citu.module.menduner.system.enums.ErrorCodeConstants.*;
 @Validated
 public class MdeEnterpriseAuthServiceImpl implements MdeEnterpriseAuthService {
 
-
-    @Resource
-    protected MdeUserService userService;
     @Resource
-    protected LoginLogApi loginLogApi;
+    protected LoginLogService loginLogService;
     @Resource
     protected OAuth2TokenApi oauth2TokenApi;
     /**
@@ -79,6 +77,8 @@ public class MdeEnterpriseAuthServiceImpl implements MdeEnterpriseAuthService {
     @Resource
     private EnterpriseUserBindService userBindService;
     @Resource
+    private EnterpriseService enterpriseService;
+    @Resource
     private EnterpriseRegisterService registerService;
     @Resource
     private MailSendApi mailSendApi;
@@ -94,7 +94,6 @@ public class MdeEnterpriseAuthServiceImpl implements MdeEnterpriseAuthService {
         // 创建 Token 令牌,记录登录日志
         return createTokenAfterLoginSuccess(
                 bindUser,
-                bindUser.getUserId(),
                 email,
                 LoginLogTypeEnum.LOGIN_EMAIL,
                 null,
@@ -105,23 +104,19 @@ public class MdeEnterpriseAuthServiceImpl implements MdeEnterpriseAuthService {
     @Override
     @DSTransactional
     public AppMdeAuthLoginRespVO switchLogin(AppEnterpriseAuthSwitchLoginReqVO reqVO) {
-        LoginUser loginUser = LoginUserContext.get();
+        Long userId = LoginUserContext.getUserId();
         // 查询用户
-        MdeUserDO user = userService.getMdeUser(loginUser.getId());
-        EnterpriseUserBindDO bindUser = check2(reqVO.getEnterpriseId(), user.getId(), user.getPhone(),
+        EnterpriseUserBindDO bindUser = check2(reqVO.getEnterpriseId(), userId,
                 LoginLogTypeEnum.LOGIN_SWITCH);
 
         // 创建 Token 令牌,记录登录日志
-        AppMdeAuthLoginRespVO resp = createTokenAfterLoginSuccess(
+        return createTokenAfterLoginSuccess(
                 bindUser,
-                user.getId(),
-                user.getPhone(),
+                bindUser.getPhone(),
                 LoginLogTypeEnum.LOGIN_SWITCH,
                 null,
                 reqVO.getEnterpriseId()
         );
-
-        return resp;
     }
 
     protected EnterpriseUserBindDO check(String email, String password) {
@@ -138,7 +133,7 @@ public class MdeEnterpriseAuthServiceImpl implements MdeEnterpriseAuthService {
         }
         // 校验是否禁用
         if (ObjectUtil.notEqual(user.getStatus(), MendunerStatusEnum.ENABLE.getStatus())) {
-            createLoginLog(user.getId(), email, logTypeEnum, LoginResultEnum.USER_DISABLED);
+            createLoginLog(user, email, logTypeEnum, LoginResultEnum.USER_DISABLED);
             throw exception(MDE_ENTERPRISE_USER_BIND_IS_DISABLE);
         }
         if (!userBindService.isPasswordMatch(password, user.getPassword())) {
@@ -164,10 +159,10 @@ public class MdeEnterpriseAuthServiceImpl implements MdeEnterpriseAuthService {
                 if (numInt >= 5) {
                     // 8个小时内输错5次 锁定
                     userBindService.disable(user.getId());
-                    createLoginLog(user.getId(), email, logTypeEnum, LoginResultEnum.USER_DISABLED);
+                    createLoginLog(user, email, logTypeEnum, LoginResultEnum.USER_DISABLED);
                     throw exception(MDE_ENTERPRISE_USER_BIND_IS_DISABLE);
                 } else {
-                    createLoginLog(user.getId(), email, logTypeEnum, LoginResultEnum.BAD_CREDENTIALS);
+                    createLoginLog(user, email, logTypeEnum, LoginResultEnum.BAD_CREDENTIALS);
                     throw exception(MDE_AUTH_LOGIN_BAD_CREDENTIALS);
                 }
             }
@@ -180,7 +175,6 @@ public class MdeEnterpriseAuthServiceImpl implements MdeEnterpriseAuthService {
 
     protected EnterpriseUserBindDO check2(Long enterpriseId,
                                           Long userId,
-                                          String phone,
                                           LoginLogTypeEnum logTypeEnum) {
         // 查询绑定用户
         EnterpriseUserBindDO bind = userBindService.selectByEnterpriseIdAndUserId(
@@ -188,12 +182,12 @@ public class MdeEnterpriseAuthServiceImpl implements MdeEnterpriseAuthService {
                 userId
         );
         if (null == bind) {
-            createLoginLog(bind.getId(), phone, logTypeEnum, LoginResultEnum.BAD_CREDENTIALS);
+            createLoginLog(null, null, logTypeEnum, LoginResultEnum.BAD_CREDENTIALS);
             throw exception(MDE_USER_ENTERPRISE_NOT_USER_NULL);
         }
         // 校验是否禁用
         if (ObjectUtil.notEqual(bind.getStatus(), MendunerStatusEnum.ENABLE.getStatus())) {
-            createLoginLog(bind.getId(), phone, logTypeEnum, LoginResultEnum.USER_DISABLED);
+            createLoginLog(bind, bind.getPhone(), logTypeEnum, LoginResultEnum.USER_DISABLED);
             throw exception(MDE_AUTH_LOGIN_USER_DISABLED);
         }
         return bind;
@@ -206,15 +200,14 @@ public class MdeEnterpriseAuthServiceImpl implements MdeEnterpriseAuthService {
 
 
     protected AppMdeAuthLoginRespVO createTokenAfterLoginSuccess(EnterpriseUserBindDO bindUser,
-                                                                 Long userId,
                                                                  String account,
                                                                  LoginLogTypeEnum logType,
                                                                  String openid, Long enterpriseId) {
         // 插入登陆日志
-        createLoginLog(bindUser.getId(), account, logType, LoginResultEnum.SUCCESS);
+        createLoginLog(bindUser, account, logType, LoginResultEnum.SUCCESS);
         // 创建 Token 令牌
         OAuth2AccessTokenRespDTO accessTokenRespDTO = oauth2TokenApi.createAccessToken(new OAuth2AccessTokenCreateReqDTO()
-                .setUserId(userId).setUserType(getUserType().getValue())
+                .setUserId(bindUser.getUserId()).setUserType(getUserType().getValue())
                 .setClientId(OAuth2ClientConstants.CLIENT_ID_MENDUNER_ADMIN)
                 .setUserInfo(MapUtil.builder(LoginUser.INFO_KEY_DATA_ID, enterpriseId.toString()).build())
         ).getCheckedData();
@@ -222,49 +215,73 @@ public class MdeEnterpriseAuthServiceImpl implements MdeEnterpriseAuthService {
         return MdeAuthConvert.INSTANCE.convert(accessTokenRespDTO, openid);
     }
 
-    protected void createLoginLog(Long bindUserId, String account, LoginLogTypeEnum logType, LoginResultEnum loginResult) {
+    protected void createLoginLog(EnterpriseUserBindDO bindUser,
+                                  String account,
+                                  LoginLogTypeEnum logType,
+                                  LoginResultEnum loginResult) {
         // 插入登录日志
         LoginLogCreateReqDTO reqDTO = new LoginLogCreateReqDTO();
         reqDTO.setLogType(logType.getType());
         reqDTO.setTraceId(TracerUtils.getTraceId());
-        reqDTO.setUserId(bindUserId);
-        reqDTO.setUserType(getUserType().getValue());
+        reqDTO.setUserId(null != bindUser ? bindUser.getUserId() : null);
+        reqDTO.setEnterpriseId(null != bindUser ? bindUser.getEnterpriseId() : null);
+        reqDTO.setType(TYPE_ENTERPRISE_USER);
         reqDTO.setUsername(account);
+        // 该企业账户是否首次登录(一个企业可以有多个账号的情况)
+        reqDTO.setFirst(null != bindUser && null == bindUser.getLoginDate());
+        if(null != bindUser) {
+            EnterpriseDO enterprise = enterpriseService.getEnterprise(bindUser.getEnterpriseId());
+            if(null != enterprise && (null == enterprise.getFirst() || !enterprise.getFirst())) {
+                // 企业首次登录
+                reqDTO.setEnterpriseFirst(true);
+            }else {
+                // 企业非首次登录
+                reqDTO.setEnterpriseFirst(false);
+            }
+        }else {
+            // 企业非首次登录
+            reqDTO.setEnterpriseFirst(false);
+        }
         reqDTO.setUserAgent(ServletUtils.getUserAgent());
         reqDTO.setUserIp(getClientIP());
         reqDTO.setResult(loginResult.getResult());
-        loginLogApi.createLoginLog(reqDTO);
+        loginLogService.createLoginLog(reqDTO);
         // 更新最后登录时间
-        if (null != bindUserId && Objects.equals(LoginResultEnum.SUCCESS.getResult(), loginResult.getResult())) {
-            userBindService.updateUserLogin(bindUserId, getClientIP());
+        if (null != bindUser && Objects.equals(LoginResultEnum.SUCCESS.getResult(), loginResult.getResult())) {
+            userBindService.updateUserLogin(bindUser.getId(), getClientIP());
         }
     }
 
 
     @Override
     public void logout(String token) {
+        Long enterpriseId = LoginUserContext.getEnterpriseId();
         // 删除访问令牌
         OAuth2AccessTokenRespDTO accessTokenRespDTO = oauth2TokenApi.removeAccessToken(token).getCheckedData();
         if (accessTokenRespDTO == null) {
             return;
         }
         // 删除成功,则记录登出日志
-        createLogoutLog(accessTokenRespDTO.getUserId());
+        createLogoutLog(enterpriseId, accessTokenRespDTO.getUserId());
     }
 
-    private void createLogoutLog(Long userId) {
-        LoginUser loginUser = LoginUserContext.get();
-        MdeUserDO user = userService.getMdeUser(loginUser.getId());
+    private void createLogoutLog(Long enterpriseId, Long userId) {
+        EnterpriseUserBindDO bind = userBindService.selectByEnterpriseIdAndUserId(
+                enterpriseId,
+                userId
+        );
         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.setEnterpriseId(enterpriseId);
+        reqDTO.setType(TYPE_ENTERPRISE_USER);
+        reqDTO.setUsername(null != bind ? bind.getPhone() : null);
+        reqDTO.setFirst(false);
         reqDTO.setUserAgent(ServletUtils.getUserAgent());
         reqDTO.setUserIp(getClientIP());
         reqDTO.setResult(LoginResultEnum.SUCCESS.getResult());
-        loginLogApi.createLoginLog(reqDTO);
+        loginLogService.createLoginLog(reqDTO);
     }
 
     @Override

+ 2 - 2
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/enterprise/EnterpriseServiceImpl.java

@@ -460,8 +460,8 @@ public class EnterpriseServiceImpl implements EnterpriseService {
         if (null == resp) {
             return null;
         }
-        if (null == enterpriseDO.getFirst() || enterpriseDO.getFirst()) {
-            enterpriseDO.setFirst(false);
+        if (null == enterpriseDO.getFirst() || !enterpriseDO.getFirst()) {
+            enterpriseDO.setFirst(true);
             enterpriseMapper.updateById(enterpriseDO);
         }
         if (null == enterpriseDO.getBizFlag() || !enterpriseDO.getBizFlag()) {

+ 9 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/enterprise/bind/EnterpriseUserBindService.java

@@ -4,9 +4,12 @@ import com.citu.framework.common.pojo.PageResult;
 import com.citu.module.menduner.common.dto.TimeRangeBaseReqVO;
 import com.citu.module.menduner.system.controller.app.jobhunt.enterprise.vo.AppEnterpriseUserBindRespVO;
 import com.citu.module.menduner.system.controller.app.recruit.user.vo.*;
+import com.citu.module.menduner.system.controller.base.analysis.RecruitAnalysisPageReqVO;
 import com.citu.module.menduner.system.controller.base.contact.EnterpriseUserContactRespVO;
 import com.citu.module.menduner.system.controller.base.contact.EnterpriseUserSummaryRespVO;
 import com.citu.module.menduner.system.controller.base.enterprise.bind.*;
+import com.citu.module.menduner.system.controller.base.userenterprise.UserBindEnterpriseRespVO;
+import com.citu.module.menduner.system.controller.base.userperson.UserPersonRespVO;
 import com.citu.module.menduner.system.dal.dataobject.enterprise.EnterpriseUserBindDO;
 
 import javax.validation.Valid;
@@ -277,4 +280,10 @@ public interface EnterpriseUserBindService {
      * 效验当前登录企业用户是否需要更改密码
      **/
     boolean checkNeedUpdatePassword(Long enterpriseId, Long userId);
+
+    /**
+     * 获取企业登录用户记录
+     **/
+    PageResult<UserBindEnterpriseRespVO> getLoginUserPage(RecruitAnalysisPageReqVO reqVO);
+
 }

+ 8 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/enterprise/bind/EnterpriseUserBindServiceImpl.java

@@ -14,9 +14,11 @@ import com.citu.module.menduner.system.controller.app.recruit.user.vo.AppRecruit
 import com.citu.module.menduner.system.controller.app.recruit.user.vo.AppRecruitUserRespVO;
 import com.citu.module.menduner.system.controller.app.recruit.user.vo.AppRecruitUserSaveReqVO;
 import com.citu.module.menduner.system.controller.base.CommonRespVO;
+import com.citu.module.menduner.system.controller.base.analysis.RecruitAnalysisPageReqVO;
 import com.citu.module.menduner.system.controller.base.contact.EnterpriseUserContactRespVO;
 import com.citu.module.menduner.system.controller.base.contact.EnterpriseUserSummaryRespVO;
 import com.citu.module.menduner.system.controller.base.enterprise.bind.*;
+import com.citu.module.menduner.system.controller.base.userenterprise.UserBindEnterpriseRespVO;
 import com.citu.module.menduner.system.convert.EnterpriseConvert;
 import com.citu.module.menduner.system.dal.dataobject.enterprise.EnterpriseDO;
 import com.citu.module.menduner.system.dal.dataobject.enterprise.EnterpriseUserBindDO;
@@ -497,4 +499,10 @@ public class EnterpriseUserBindServiceImpl implements EnterpriseUserBindService
         }
         return false;
     }
+
+    @Override
+    public PageResult<UserBindEnterpriseRespVO> getLoginUserPage(RecruitAnalysisPageReqVO reqVO) {
+        LocalDateTime[] timeRange = generateDateTimeRange(reqVO);
+        return mapper.getLoginUserPage(reqVO, timeRange[0], timeRange[1]);
+    }
 }

+ 31 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/logger/LoginLogService.java

@@ -0,0 +1,31 @@
+package com.citu.module.menduner.system.service.logger;
+
+import com.citu.framework.common.pojo.PageResult;
+import com.citu.module.menduner.system.controller.base.logger.LoginLogCreateReqDTO;
+import com.citu.module.menduner.system.controller.base.logger.LoginLogPageReqVO;
+import com.citu.module.menduner.system.dal.dataobject.logger.LoginLogDO;
+
+
+import javax.validation.Valid;
+
+/**
+ * 登录日志 Service 接口
+ */
+public interface LoginLogService {
+
+    /**
+     * 获得登录日志分页
+     *
+     * @param pageReqVO 分页条件
+     * @return 登录日志分页
+     */
+    PageResult<LoginLogDO> getLoginLogPage(LoginLogPageReqVO pageReqVO);
+
+    /**
+     * 创建登录日志
+     *
+     * @param reqDTO 日志信息
+     */
+    void createLoginLog(@Valid LoginLogCreateReqDTO reqDTO);
+
+}

+ 35 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/logger/LoginLogServiceImpl.java

@@ -0,0 +1,35 @@
+package com.citu.module.menduner.system.service.logger;
+
+import com.citu.framework.common.pojo.PageResult;
+import com.citu.framework.common.util.object.BeanUtils;
+import com.citu.module.menduner.system.controller.base.logger.LoginLogCreateReqDTO;
+import com.citu.module.menduner.system.controller.base.logger.LoginLogPageReqVO;
+import com.citu.module.menduner.system.dal.dataobject.logger.LoginLogDO;
+import com.citu.module.menduner.system.dal.mysql.logger.LoginLogMapper;
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+
+import javax.annotation.Resource;
+
+/**
+ * 登录日志 Service 实现
+ */
+@Service
+@Validated
+public class LoginLogServiceImpl implements LoginLogService {
+
+    @Resource
+    private LoginLogMapper loginLogMapper;
+
+    @Override
+    public PageResult<LoginLogDO> getLoginLogPage(LoginLogPageReqVO pageReqVO) {
+        return loginLogMapper.selectPage(pageReqVO);
+    }
+
+    @Override
+    public void createLoginLog(LoginLogCreateReqDTO reqDTO) {
+        LoginLogDO loginLog = BeanUtils.toBean(reqDTO, LoginLogDO.class);
+        loginLogMapper.insert(loginLog);
+    }
+
+}

+ 6 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/user/MdeUserService.java

@@ -14,6 +14,7 @@ import com.citu.module.menduner.system.controller.base.analysis.RecruitAnalysisP
 import com.citu.module.menduner.system.controller.base.user.MdeUserPageReqVO;
 import com.citu.module.menduner.system.controller.base.user.MdeUserSaveReqVO;
 import com.citu.module.menduner.system.controller.base.user.MdeUserSimpleRespVO;
+import com.citu.module.menduner.system.controller.base.userperson.UserPersonRespVO;
 import com.citu.module.menduner.system.dal.dataobject.user.MdeUserDO;
 
 import javax.validation.Valid;
@@ -207,4 +208,9 @@ public interface MdeUserService {
      * 获取注册但未填写简历的用户
      **/
     PageResult<MdeUserSimpleRespVO> getUserByUnFillResume(TimeRangeBasePageReqVO reqVO);
+
+    /**
+     * 查询登录的用户记录
+     **/
+    PageResult<UserPersonRespVO> getLoginUserPage(RecruitAnalysisPageReqVO reqVO);
 }

+ 7 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/user/MdeUserServiceImpl.java

@@ -18,6 +18,7 @@ import com.citu.module.menduner.system.controller.base.analysis.RecruitAnalysisP
 import com.citu.module.menduner.system.controller.base.user.MdeUserPageReqVO;
 import com.citu.module.menduner.system.controller.base.user.MdeUserSaveReqVO;
 import com.citu.module.menduner.system.controller.base.user.MdeUserSimpleRespVO;
+import com.citu.module.menduner.system.controller.base.userperson.UserPersonRespVO;
 import com.citu.module.menduner.system.dal.dataobject.user.MdeUserDO;
 import com.citu.module.menduner.system.dal.mysql.user.MdeUserMapper;
 import com.citu.module.menduner.system.enums.MendunerStatusEnum;
@@ -457,4 +458,10 @@ public class MdeUserServiceImpl implements MdeUserService {
         LocalDateTime[] timeRange = generateDateTimeRange(reqVO);
         return mdeUserMapper.getUserByUnFillResume(reqVO, timeRange[0], timeRange[1]);
     }
+
+    @Override
+    public PageResult<UserPersonRespVO> getLoginUserPage(RecruitAnalysisPageReqVO reqVO) {
+        LocalDateTime[] timeRange = generateDateTimeRange(reqVO);
+        return mdeUserMapper.getLoginUserPage(reqVO, timeRange[0], timeRange[1]);
+    }
 }