yangdamao před 10 měsíci
rodič
revize
53b8761e0d
16 změnil soubory, kde provedl 266 přidání a 7 odebrání
  1. 39 0
      run-prod.sh
  2. 2 2
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/common/CommonController.java
  3. 61 0
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/monitor/SysLoginForController.java
  4. 9 0
      zhongzheng-api/src/main/java/com/zhongzheng/controller/user/LoginController.java
  5. 13 0
      zhongzheng-api/src/main/java/com/zhongzheng/controller/user/UserController.java
  6. 1 1
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/SysLoginService.java
  7. 44 1
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/UserServiceImpl.java
  8. 1 1
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/WxTokenService.java
  9. 3 2
      zhongzheng-system/src/main/java/com/zhongzheng/modules/system/service/impl/SysLogininforServiceImpl.java
  10. 29 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/bo/UserAppAccountLoginOutBo.java
  11. 6 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/bo/UserAppUpdatePwdBo.java
  12. 7 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/bo/UserEditBo.java
  13. 40 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/bo/UserRecordQueryBo.java
  14. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/domain/UserVisitLog.java
  15. 4 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/IUserService.java
  16. 5 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/impl/UserLoginErrorServiceImpl.java

+ 39 - 0
run-prod.sh

@@ -1,3 +1,42 @@
+#!/usr/bin/env bash
+# 定义应用组名
+group_name='zhongzheng'
+# 定义应用名称
+app_name='zhongzheng-saas-api'
+# 定义应用版本
+app_version='1.0-SNAPSHOT'
+# 定义应用环境
+profile_active='prod'
+echo '----copy jar----'
+docker stop ${app_name}
+echo '----stop container----'
+docker rm ${app_name}
+echo '----rm container----'
+docker rmi ${group_name}/${app_name}:${app_version}
+echo '----rm image----'
+# 打包编译docker镜像
+docker build -f /mydata/maven/build/Dockerfile -t ${group_name}/${app_name}:${app_version} .
+echo '----build image----'
+docker run -p 5055:5055 --name ${app_name} \
+--restart=always \
+-e 'spring.profiles.active'=${profile_active} \
+-e TZ="Asia/Shanghai" \
+-m 10240m \
+--cpus=3 \
+--log-opt max-size=50m \
+--log-opt max-file=3 \
+-v /etc/localtime:/etc/localtime \
+-v /usr/share/fonts:/usr/share/fonts \
+-v /data/logs/prod_api:/logs \
+-v /mydata/app/${app_name}/logs:/var/logs \
+-d ${group_name}/${app_name}:${app_version}
+echo '----start container----'
+
+echo "开始等待20秒..."
+# 1-10秒内随机
+sleep 5
+echo "等待后继续"
+
 #!/usr/bin/env bash
 # 定义应用组名
 group_admin_name='zhongzheng'

+ 2 - 2
zhongzheng-admin/src/main/java/com/zhongzheng/controller/common/CommonController.java

@@ -642,8 +642,8 @@ public class CommonController extends BaseController {
     @ApiOperation("登录双重验证")
     @GetMapping("common/free/dual_auth")
     public AjaxResult<String> dual_auth() {
-//        String dualAuth = configService.selectConfigByKey("login.dual.auth");
-        String dualAuth = "0";
+        String dualAuth = configService.selectConfigByKey("login.dual.auth");
+//        String dualAuth = "0";
         return AjaxResult.success("成功", dualAuth);
     }
 

+ 61 - 0
zhongzheng-admin/src/main/java/com/zhongzheng/controller/monitor/SysLoginForController.java

@@ -0,0 +1,61 @@
+package com.zhongzheng.controller.monitor;
+
+import com.zhongzheng.common.core.controller.BaseController;
+import com.zhongzheng.common.core.domain.AjaxResult;
+import com.zhongzheng.common.core.page.TableDataInfo;
+import com.zhongzheng.common.utils.poi.ExcelUtil;
+import com.zhongzheng.modules.system.domain.SysLogininfor;
+import com.zhongzheng.modules.system.service.ISysLogininforService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 操作日志记录
+ *
+ * @author zhongzheng
+ */
+@Api(tags ="操作日志记录")
+@RestController
+@RequestMapping("/monitor/logininfor")
+public class SysLoginForController extends BaseController
+{
+    @Autowired
+    private ISysLogininforService sysLogininforService;
+
+    @ApiOperation("登录日志列表")
+    @GetMapping("/list")
+    public TableDataInfo list(SysLogininfor logininfor)
+    {
+        startPage();
+        List<SysLogininfor> list = sysLogininforService.selectLogininforList(logininfor);
+        return getDataTable(list);
+    }
+
+    @ApiOperation("登录日志到处")
+    @GetMapping("/export")
+    public AjaxResult export(SysLogininfor logininfor)
+    {
+        List<SysLogininfor> list = sysLogininforService.selectLogininforList(logininfor);
+        ExcelUtil<SysLogininfor> util = new ExcelUtil<SysLogininfor>(SysLogininfor.class);
+        return util.exportExcel(list, "登录日志");
+    }
+
+    @ApiOperation("批量删除")
+    @DeleteMapping("/{infoIds}")
+    public AjaxResult remove(@PathVariable Long[] infoIds)
+    {
+        return toAjax(sysLogininforService.deleteLogininforByIds(infoIds));
+    }
+
+    @ApiOperation("清空日志")
+    @DeleteMapping("/clean")
+    public AjaxResult clean()
+    {
+        sysLogininforService.cleanLogininfor();
+        return AjaxResult.success();
+    }
+}

+ 9 - 0
zhongzheng-api/src/main/java/com/zhongzheng/controller/user/LoginController.java

@@ -2,6 +2,7 @@ package com.zhongzheng.controller.user;
 
 import com.zhongzheng.common.core.controller.BaseController;
 import com.zhongzheng.common.core.domain.AjaxResult;
+import com.zhongzheng.common.utils.ServletUtils;
 import com.zhongzheng.modules.user.bo.*;
 import com.zhongzheng.modules.user.service.IUserService;
 import io.swagger.annotations.Api;
@@ -71,4 +72,12 @@ public class LoginController extends BaseController {
         Map<String,Object> map = iUserService.automaticAccountLogin(bo);
         return AjaxResult.success(map);
     }
+
+    @ApiOperation("登出日志记录")
+    @PostMapping("/account_login/out/record")
+    public AjaxResult account_loginOutRecord(@RequestBody UserAppAccountLoginOutBo bo) {
+        ServletUtils.getResponse().setHeader("TenantId",bo.getTenantId().toString());
+        iUserService.account_loginOutRecord(bo);
+        return AjaxResult.success();
+    }
 }

+ 13 - 0
zhongzheng-api/src/main/java/com/zhongzheng/controller/user/UserController.java

@@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.zhongzheng.common.annotation.Log;
 import com.zhongzheng.common.core.controller.BaseController;
 import com.zhongzheng.common.core.domain.AjaxResult;
+import com.zhongzheng.common.core.page.TableDataInfo;
 import com.zhongzheng.common.enums.BusinessType;
 import com.zhongzheng.common.exception.CustomException;
 import com.zhongzheng.common.utils.DateUtils;
@@ -14,9 +15,12 @@ import com.zhongzheng.common.utils.ServletUtils;
 import com.zhongzheng.common.utils.ToolsUtils;
 import com.zhongzheng.framework.web.service.WxLoginService;
 import com.zhongzheng.framework.web.service.WxTokenService;
+import com.zhongzheng.modules.order.bo.OrderQueryBo;
+import com.zhongzheng.modules.order.vo.OrderListVo;
 import com.zhongzheng.modules.system.domain.SysTenant;
 import com.zhongzheng.modules.system.service.ISysTenantService;
 import com.zhongzheng.modules.user.bo.*;
+import com.zhongzheng.modules.user.domain.UserVisitLog;
 import com.zhongzheng.modules.user.domain.UserWxFollow;
 import com.zhongzheng.modules.user.entity.ClientLoginUser;
 import com.zhongzheng.modules.user.service.IUserLoginKeyService;
@@ -234,4 +238,13 @@ public class UserController extends BaseController {
         return toAjax(iUserLoginKeyService.offline(editBo) ? 1 : 0);
     }
 
+    @ApiOperation("获取用户登录信息")
+    @GetMapping("/controls/record")
+    public TableDataInfo<UserVisitLog> getControlsRecord(UserRecordQueryBo bo) {
+        ClientLoginUser loginUser = wxTokenService.getLoginUser(ServletUtils.getRequest());
+        bo.setUserId(loginUser.getUser().getUserId());
+        startPage();
+        List<UserVisitLog> list = iUserService.getControlsRecord(bo);
+        return getDataTable(list);
+    }
 }

+ 1 - 1
zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/SysLoginService.java

@@ -107,7 +107,7 @@ public class SysLoginService
             throw new CaptchaException();
         }
 
-//        iUserLoginErrorService.checkLimit(username);
+        iUserLoginErrorService.checkLimit(username);
         // 用户验证
         Authentication authentication = null;
         try

+ 44 - 1
zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/UserServiceImpl.java

@@ -553,6 +553,15 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
         if (Validator.isNotEmpty(userUpdateAddBo.getUserId())) {
             userUpdateService.insertByAddBo(userUpdateAddBo);
         }
+        //修改个人信息记录日志
+        UserVisitLog visitLog = new UserVisitLog();
+        visitLog.setUserId(bo.getUserId());
+        visitLog.setType(4);
+        visitLog.setCreateTime(DateUtils.getNowTime());
+        visitLog.setUpdateTime(DateUtils.getNowTime());
+        visitLog.setFromPlat(bo.getFromPlat());
+        visitLog.setIp(bo.getIp());
+        iUserVisitLogService.save(visitLog);
         return this.updateById(update);
     }
 
@@ -1096,6 +1105,15 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
         user.setPwdTime(DateUtils.getNowTime());
         user.setUpdateTime(DateUtils.getNowTime());
         updateById(user);
+        //修改密码记录日志
+        UserVisitLog visitLog = new UserVisitLog();
+        visitLog.setUserId(user.getUserId());
+        visitLog.setType(3);
+        visitLog.setCreateTime(DateUtils.getNowTime());
+        visitLog.setUpdateTime(DateUtils.getNowTime());
+        visitLog.setFromPlat(bo.getFromPlat());
+        visitLog.setIp(bo.getIp());
+        iUserVisitLogService.save(visitLog);
         return true;
     }
 
@@ -2266,6 +2284,31 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
         updateBatchById(userList);
     }
 
+    @Override
+    public void account_loginOutRecord(UserAppAccountLoginOutBo bo) {
+        User user = getById(bo.getUserId());
+        if (ObjectUtils.isNull(user)){
+            throw new CustomException("用户信息获取失败");
+        }
+        //修改密码记录日志
+        UserVisitLog visitLog = new UserVisitLog();
+        visitLog.setUserId(user.getUserId());
+        visitLog.setType(2);
+        visitLog.setCreateTime(DateUtils.getNowTime());
+        visitLog.setUpdateTime(DateUtils.getNowTime());
+        visitLog.setFromPlat(bo.getFromPlat());
+        visitLog.setIp(bo.getIp());
+        iUserVisitLogService.save(visitLog);
+    }
+
+    @Override
+    public List<UserVisitLog> getControlsRecord(UserRecordQueryBo bo) {
+        return  iUserVisitLogService.list(new LambdaQueryWrapper<UserVisitLog>()
+                .eq(UserVisitLog::getUserId,bo.getUserId())
+                .eq(ObjectUtils.isNotNull(bo.getType()),UserVisitLog::getType,bo.getType())
+                .orderByDesc(UserVisitLog::getCreateTime));
+    }
+
     private String getTelPhone(){
         String mobile = TelPhoneUtils.createMobile();
         int count = count(new LambdaQueryWrapper<User>().eq(User::getIdCard, EncryptHandler.encrypt(mobile)));
@@ -2359,7 +2402,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
         map.put(Constants.TOKEN,wxTokenService.createToken(loginUser));
         map.put("user_account",user.getUserAccount());
         if (ObjectUtils.isNotNull(tenant.getPwdCheckTime()) && tenant.getPwdCheckTime() > 0){
-            //判斷用戶是否需要修改密碼
+            //判斷用戶是否需要修改密碼(90天)
             Long time = ObjectUtils.isNotNull(user.getPwdTime())?user.getPwdTime():user.getCreateTime();
             Long dayAfter = DateUtils.getDayAfter(time, tenant.getPwdCheckTime());
             if (dayAfter < DateUtils.getNowTime()){

+ 1 - 1
zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/WxTokenService.java

@@ -171,7 +171,7 @@ public class WxTokenService
     }
 
     /**
-     * 刷新令牌有效期
+     * 刷新令牌有效期 (锁定两个小时)
      *
      * @param loginUser 登录信息
      */

+ 3 - 2
zhongzheng-system/src/main/java/com/zhongzheng/modules/system/service/impl/SysLogininforServiceImpl.java

@@ -10,6 +10,7 @@ import com.zhongzheng.modules.system.service.ISysLogininforService;
 import org.springframework.stereotype.Service;
 
 import java.util.Arrays;
+import java.util.Date;
 import java.util.List;
 import java.util.Map;
 
@@ -28,8 +29,8 @@ public class SysLogininforServiceImpl extends ServiceImpl<SysLogininforMapper, S
      */
     @Override
     public void insertLogininfor(SysLogininfor logininfor) {
-//        logininfor.setLoginTime(new Date());
-//        save(logininfor);
+        logininfor.setLoginTime(new Date());
+        save(logininfor);
     }
 
     /**

+ 29 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/bo/UserAppAccountLoginOutBo.java

@@ -0,0 +1,29 @@
+package com.zhongzheng.modules.user.bo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+
+/**
+ * 客户端用户编辑对象 user
+ *
+ * @author ruoyi
+ * @date 2021-06-08
+ */
+@Data
+@ApiModel("")
+public class UserAppAccountLoginOutBo {
+    @ApiModelProperty("用户ID")
+    private Long userId;
+
+    @ApiModelProperty("ip")
+    private String ip;
+
+    /** 来源平台 1小程序 2PC网站 */
+    private String fromPlat;
+
+    private String tenantId;
+}

+ 6 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/bo/UserAppUpdatePwdBo.java

@@ -28,5 +28,11 @@ public class UserAppUpdatePwdBo {
     @ApiModelProperty("用户ID")
     private Long userId;
 
+    @ApiModelProperty("ip")
+    private String ip;
+
+    /** 来源平台 1小程序 2PC网站 */
+    private String fromPlat;
+
 
 }

+ 7 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/bo/UserEditBo.java

@@ -203,4 +203,11 @@ public class UserEditBo {
     /** 密码最后修改时间 */
     @ApiModelProperty("密码最后修改时间")
     private Long pwdTime;
+
+    @ApiModelProperty("ip")
+    private String ip;
+
+    /** 来源平台 1小程序 2PC网站 */
+    private String fromPlat;
+
 }

+ 40 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/bo/UserRecordQueryBo.java

@@ -0,0 +1,40 @@
+package com.zhongzheng.modules.user.bo;
+
+import com.zhongzheng.common.core.domain.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * 订单分页查询对象 order
+ *
+ * @author ruoyi
+ * @date 2021-11-08
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ApiModel("订单分页查询对象")
+public class UserRecordQueryBo extends BaseEntity {
+
+	/** 分页大小 */
+	@ApiModelProperty("分页大小")
+	private Integer pageSize;
+	/** 当前页数 */
+	@ApiModelProperty("当前页数")
+	private Integer pageNum;
+	/** 排序列 */
+	@ApiModelProperty("排序列")
+	private String orderByColumn;
+	/** 排序的方向desc或者asc */
+	@ApiModelProperty(value = "排序的方向", example = "asc,desc")
+	private String isAsc;
+
+	private Integer type;
+
+	private Long userId;
+
+}

+ 2 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/domain/UserVisitLog.java

@@ -42,4 +42,6 @@ private static final long serialVersionUID=1L;
     private Long dateTime;
 
     private String browser;
+    /** 类型:1登入 2登出 3修改密码 4修改个人信息 */
+    private Integer type;
 }

+ 4 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/IUserService.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import com.zhongzheng.common.core.domain.model.LoginUser;
 import com.zhongzheng.modules.user.bo.*;
 import com.zhongzheng.modules.user.domain.User;
+import com.zhongzheng.modules.user.domain.UserVisitLog;
 import com.zhongzheng.modules.user.vo.*;
 import org.springframework.web.multipart.MultipartFile;
 
@@ -181,4 +182,7 @@ public interface IUserService extends IService<User> {
 
 	void exporResetData(List<UserTelImportExportBo> bos);
 
+	void account_loginOutRecord(UserAppAccountLoginOutBo bo);
+
+	List<UserVisitLog> getControlsRecord(UserRecordQueryBo bo);
 }

+ 5 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/impl/UserLoginErrorServiceImpl.java

@@ -101,6 +101,11 @@ public class UserLoginErrorServiceImpl extends ServiceImpl<UserLoginErrorMapper,
         return insertByAddBo(errorAddBo);
     }
 
+    /**
+     *  密码错误5次锁定用户
+     * @param loginAccount
+     * @return
+     */
     @Override
     public Boolean checkLimit(String loginAccount) {
         LambdaQueryWrapper<UserLoginError> lqwExam = Wrappers.lambdaQuery();