浏览代码

Merge branch 'system-165' of uskycloud/usky-cloud into master

gez 8 月之前
父节点
当前提交
565fbb38e0
共有 13 个文件被更改,包括 570 次插入107 次删除
  1. 11 0
      base-modules/service-system/service-system-biz/pom.xml
  2. 4 4
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/controller/web/SysUserController.java
  3. 42 0
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/domain/SysLogininfor.java
  4. 131 0
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/domain/WjConfig.java
  5. 9 0
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/ISysUserService.java
  6. 48 56
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/SysLoginService.java
  7. 59 29
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/impl/SysUserServiceImpl.java
  8. 45 0
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/util/AddressUtils.java
  9. 82 0
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/util/AsyncFactory.java
  10. 45 0
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/util/AsyncManager.java
  11. 16 0
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/vo/SysLoginExportVO.java
  12. 43 0
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/vo/SysUserNewVO.java
  13. 35 18
      base-modules/service-system/service-system-biz/src/main/resources/mapper/system/SysLogininforMapper.xml

+ 11 - 0
base-modules/service-system/service-system-biz/pom.xml

@@ -48,6 +48,17 @@
             <artifactId>ruoyi-common-swagger</artifactId>
         </dependency>
 
+        <!-- 解析客户端操作系统、浏览器等 -->
+        <dependency>
+            <groupId>eu.bitwalker</groupId>
+            <artifactId>UserAgentUtils</artifactId>
+            <version>1.21</version>
+        </dependency>
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-all</artifactId>
+        </dependency>
+
     </dependencies>
 
     <build>

+ 4 - 4
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/controller/web/SysUserController.java

@@ -13,6 +13,7 @@ import com.usky.system.service.ISysDeptService;
 import com.usky.system.service.ISysPostService;
 import com.usky.system.service.ISysRoleService;
 import com.usky.system.service.ISysUserService;
+import com.usky.system.service.vo.SysUserNewVO;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.validation.annotation.Validated;
@@ -62,11 +63,10 @@ public class SysUserController extends BaseController
      */
 //    @Log(title = "用户管理", businessType = BusinessType.OTHER)
     @GetMapping("/dUserList")
-    public ApiResult<TableDataInfo> DUserList(SysUser user)
+    public ApiResult<List<SysUserNewVO>> dUserList(SysUser user)
     {
-        startPage();
-        List<SysUser> list = userService.selectDUserList(user);
-        return ApiResult.success(getDataTable(list));
+        List<SysUserNewVO> list = userService.dUserList(user);
+        return ApiResult.success(list);
     }
 
     /**

+ 42 - 0
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/domain/SysLogininfor.java

@@ -51,6 +51,27 @@ public class SysLogininfor extends BaseEntity
      */
     private String createBy;
 
+    /**
+     * 登陆地点
+     */
+    private String loginLocation;
+
+    /**
+     * 浏览器类型
+     */
+    private String browser;
+
+    /**
+     * 操作系统
+     */
+    private String os;
+
+    /**
+     * 部门名称
+     */
+    @TableField(exist = false)
+    private String deptName;
+
     public String getSearchValue() {
         return searchValue;
     }
@@ -168,4 +189,25 @@ public class SysLogininfor extends BaseEntity
     {
         this.createBy = createBy;
     }
+
+    public String getLoginLocation() {return loginLocation;}
+
+    public void setLoginLocation(String loginLocation) {this.loginLocation = loginLocation;}
+
+    public String getBrowser() {return browser;}
+
+    public void setBrowser(String browser) {this.browser = browser;}
+
+    public String getOs() {return os;}
+
+    public void setOs(String os) {this.os = os;}
+    public String getDeptName()
+    {
+        return deptName;
+    }
+
+    public void setDeptName(String deptName)
+    {
+        this.deptName = deptName;
+    }
 }

+ 131 - 0
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/domain/WjConfig.java

@@ -0,0 +1,131 @@
+package com.usky.system.domain;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+/**
+ * 读取项目相关配置
+ *
+ * @author yq
+ */
+@Data
+@Component
+@ConfigurationProperties(prefix = "wj")
+public class WjConfig {
+    /** 项目名称 */
+    private String name;
+
+    /** 版本 */
+    private String version;
+
+    /** 版权年份 */
+    private String copyrightYear;
+
+    /** 实例演示开关 */
+    private boolean demoEnabled;
+
+    /** 上传路径 */
+    private static String profile;
+
+    /** 获取地址开关 */
+    private static boolean addressEnabled;
+    /** 验证码开关 */
+    private boolean codeEnabled;
+
+    public String getName()
+    {
+        return name;
+    }
+
+    public void setName(String name)
+    {
+        this.name = name;
+    }
+
+    public String getVersion()
+    {
+        return version;
+    }
+
+    public void setVersion(String version)
+    {
+        this.version = version;
+    }
+
+    public String getCopyrightYear()
+    {
+        return copyrightYear;
+    }
+
+    public void setCopyrightYear(String copyrightYear)
+    {
+        this.copyrightYear = copyrightYear;
+    }
+
+    public boolean isDemoEnabled()
+    {
+        return demoEnabled;
+    }
+
+    public void setDemoEnabled(boolean demoEnabled)
+    {
+        this.demoEnabled = demoEnabled;
+    }
+
+
+    public boolean isCodeEnabled()
+    {
+        return codeEnabled;
+    }
+
+    public void setCodeEnabled(boolean codeEnabled)
+    {
+        this.codeEnabled = codeEnabled;
+    }
+
+    public static String getProfile()
+    {
+        return profile;
+    }
+
+    public void setProfile(String profile)
+    {
+        WjConfig.profile = profile;
+    }
+
+    public static boolean isAddressEnabled()
+    {
+        return addressEnabled;
+    }
+
+    public void setAddressEnabled(boolean addressEnabled)
+    {
+        WjConfig.addressEnabled = addressEnabled;
+    }
+
+    /**
+     * 获取头像上传路径
+     */
+    public static String getAvatarPath()
+    {
+        return getProfile() + "/avatar";
+    }
+
+    /**
+     * 获取下载路径
+     */
+    public static String getDownloadPath()
+    {
+        return getProfile() + "/download/";
+    }
+
+    /**
+     * 获取上传路径
+     */
+    public static String getUploadPath()
+    {
+        return getProfile() + "/upload";
+    }
+}
+

+ 9 - 0
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/ISysUserService.java

@@ -4,6 +4,7 @@ import com.usky.common.core.bean.CommonPage;
 import com.usky.common.mybatis.core.CrudService;
 import com.usky.system.domain.SysUser;
 import com.usky.system.model.LoginUser;
+import com.usky.system.service.vo.SysUserNewVO;
 
 import java.util.List;
 
@@ -29,6 +30,14 @@ public interface ISysUserService extends CrudService<SysUser> {
      */
     public List<SysUser> selectDUserList(SysUser user);
 
+    /**
+     * 查询用户列表 - new
+     *
+     * @param user 用户信息
+     * @return 用户信息集合信息
+     */
+    List<SysUserNewVO> dUserList(SysUser user);
+
     /**
      * 根据条件分页查询已分配用户角色列表
      *

+ 48 - 56
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/SysLoginService.java

@@ -8,11 +8,11 @@ import com.usky.common.core.util.*;
 import com.usky.common.redis.core.RedisHelper;
 import com.usky.common.security.utils.SecurityUtils;
 import com.usky.common.core.exception.BusinessException;
-import com.usky.system.RuoYiSystemApplication;
 import com.usky.system.domain.*;
 import com.usky.system.domain.constants.UserConstants;
 import com.usky.system.model.LoginUser;
 import com.usky.system.service.enums.UserStatus;
+import com.usky.system.service.util.AsyncManager;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -47,6 +47,9 @@ public class SysLoginService {
     @Autowired
     private  SysTenantService sysTenantService;
 
+    @Autowired
+    AsyncManager asyncManager;
+
 
     public final String LOGIN_QRCODE_VERIFY ="login_qrcode_verify";
 
@@ -56,21 +59,22 @@ public class SysLoginService {
      * 登录
      */
     public LoginUser login(String username, String password, Integer tenantId) {
+
         // 用户名或密码为空 错误
         if (StringUtils.isAnyBlank(username, password)) {
-            recordLogininfor(tenantId,username, Constants.LOGIN_FAIL, "用户/密码必须填写");
+            asyncManager.insertLog(tenantId,username,Constants.LOGIN_FAIL, "用户/密码必须填写", null);
             throw new BusinessException("用户/密码必须填写");
         }
         // 密码如果不在指定范围内 错误
         if (password.length() < UserConstants.PASSWORD_MIN_LENGTH
                 || password.length() > UserConstants.PASSWORD_MAX_LENGTH) {
-            recordLogininfor(tenantId,username, Constants.LOGIN_FAIL, "用户密码不在指定范围");
+            asyncManager.insertLog(tenantId,username, Constants.LOGIN_FAIL, "用户密码不在指定范围", null);
             throw new BusinessException("用户密码不在指定范围");
         }
         // 用户名不在指定范围内 错误
         if (username.length() < UserConstants.USERNAME_MIN_LENGTH
                 || username.length() > UserConstants.USERNAME_MAX_LENGTH) {
-            recordLogininfor(tenantId,username, Constants.LOGIN_FAIL, "用户名不在指定范围");
+            asyncManager.insertLog(tenantId,username, Constants.LOGIN_FAIL, "用户名不在指定范围", null);
             throw new BusinessException("用户名不在指定范围");
         }
 
@@ -84,17 +88,18 @@ public class SysLoginService {
 
         SysUserVO user = loginUser.getSysUser();
         if (UserStatus.DELETED.getCode().equals(user.getDelFlag())) {
-            recordLogininfor(tenantId,username, Constants.LOGIN_FAIL, "对不起,您的账号已被删除");
+            asyncManager.insertLog(tenantId,username, Constants.LOGIN_FAIL, "对不起,您的账号已被删除", null);
             throw new BusinessException("对不起,您的账号:" + username + " 已被删除");
         }
         if (UserStatus.DISABLE.getCode().equals(user.getStatus())) {
-            recordLogininfor(tenantId,username, Constants.LOGIN_FAIL, "用户已停用,请联系管理员");
+            asyncManager.insertLog(tenantId,username, Constants.LOGIN_FAIL, "用户已停用,请联系管理员", null);
             throw new BusinessException("对不起,您的账号:" + username + " 已停用");
         }
         if (!SecurityUtils.matchesPassword(password, user.getPassword())) {
-            recordLogininfor(tenantId,username, Constants.LOGIN_FAIL, "用户密码错误");
+            asyncManager.insertLog(tenantId,username, Constants.LOGIN_FAIL, "用户密码错误", null);
             throw new BusinessException("用户不存在/密码错误");
         }
+
         //判断租户状态是否停用
         LambdaQueryWrapper<SysTenant> queryWrapper = Wrappers.lambdaQuery();
         queryWrapper.select(SysTenant::getStatus, SysTenant::getDomain)
@@ -104,14 +109,26 @@ public class SysLoginService {
             String status = list.get(0).getStatus();
             String domain = list.get(0).getDomain();
             if(status.equals("1")){
-                recordLogininfor(tenantId,username, Constants.LOGIN_FAIL, "系统已停用,请联系管理员");
+                asyncManager.insertLog(tenantId,username, Constants.LOGIN_FAIL, "系统已停用,请联系管理员", null);
                 throw new BusinessException("对不起,系统已停用,请联系管理员");
             }
         }
 
+        // 获取部门ID
+        LambdaQueryWrapper<SysUser> deptQueryWrapper = Wrappers.lambdaQuery();
+        deptQueryWrapper.select(SysUser::getDeptId)
+                .eq(SysUser::getDelFlag, 0)
+                .eq(SysUser::getTenantId, tenantId)
+                .and(w -> w.eq(SysUser::getUserName, username).or().eq(SysUser::getPhonenumber, username));
+        SysUser sysUser = sysUserService.getOne(deptQueryWrapper);
+        Integer deptId = 0; // 默认值为0,假设0表示没有部门ID
+        if (sysUser != null) {
+            deptId = sysUser.getDeptId().intValue(); // 将Long转换为Integer
+        }
+
         SysPerson sysPerson = sysPersonService.getsysPerson(user.getUserId());
         loginUser.setSysPerson(sysPerson);
-        recordLogininfor(tenantId,username, Constants.LOGIN_SUCCESS, "登录成功");
+        asyncManager.insertLog(tenantId,username, Constants.LOGIN_SUCCESS, "登录成功", deptId);
         return loginUser;
     }
 
@@ -123,32 +140,32 @@ public class SysLoginService {
         if (!StringUtils.isBlank(username) && !StringUtils.isBlank(password)) {
             // 用户名或密码为空 错误
             if (StringUtils.isAnyBlank(username, password)) {
-                recordLogininfor(tenantId,loginUser.getUserName(), Constants.LOGIN_FAIL, "用户/密码必须填写");
+                asyncManager.insertLog(tenantId,loginUser.getUserName(), Constants.LOGIN_FAIL, "用户/密码必须填写", null);
                 throw new BusinessException("用户/密码必须填写");
             }
 
             // 密码如果不在指定范围内 错误
             if (password.length() < UserConstants.PASSWORD_MIN_LENGTH
                     || password.length() > UserConstants.PASSWORD_MAX_LENGTH) {
-                recordLogininfor(tenantId,loginUser.getUserName(), Constants.LOGIN_FAIL, "用户密码不在指定范围");
+                asyncManager.insertLog(tenantId,loginUser.getUserName(), Constants.LOGIN_FAIL, "用户密码不在指定范围", null);
                 throw new BusinessException("用户密码不在指定范围");
             }
 
             // 用户名不在指定范围内 错误
             if (username.length() < UserConstants.USERNAME_MIN_LENGTH
                     || username.length() > UserConstants.USERNAME_MAX_LENGTH) {
-                recordLogininfor(tenantId,loginUser.getUserName(), Constants.LOGIN_FAIL, "用户名不在指定范围");
+                asyncManager.insertLog(tenantId,loginUser.getUserName(), Constants.LOGIN_FAIL, "用户名不在指定范围", null);
                 throw new BusinessException("用户名不在指定范围");
             }
 
 
             if (Objects.isNull(loginUser)) {
-                recordLogininfor(tenantId,loginUser.getUserName(), Constants.LOGIN_FAIL, "用户不存在");
+                asyncManager.insertLog(tenantId,loginUser.getUserName(), Constants.LOGIN_FAIL, "用户不存在", null);
                 throw new BusinessException("用户不存在");
             }
 
             if (!SecurityUtils.matchesPassword(password, loginUser.getPassword())) {
-                recordLogininfor(tenantId,loginUser.getUserName(), Constants.LOGIN_FAIL, "用户密码错误");
+                asyncManager.insertLog(tenantId,loginUser.getUserName(), Constants.LOGIN_FAIL, "用户密码错误", null);
                 throw new BusinessException("用户不存在/密码错误");
             }
         } else if(!StringUtils.isBlank(phone) && !StringUtils.isBlank(verify)) {
@@ -176,21 +193,32 @@ public class SysLoginService {
         }
 
         if (UserStatus.DELETED.getCode().equals(loginUser.getDelFlag())) {
-            recordLogininfor(tenantId,loginUser.getUserName(), Constants.LOGIN_FAIL, "对不起,您的账号已被删除");
+            asyncManager.insertLog(tenantId,loginUser.getUserName(), Constants.LOGIN_FAIL, "对不起,您的账号已被删除", null);
             throw new BusinessException("对不起,您的账号:" + username + " 已被删除");
         }
         if (UserStatus.DISABLE.getCode().equals(loginUser.getStatus())) {
-            recordLogininfor(tenantId,loginUser.getUserName(), Constants.LOGIN_FAIL, "用户已停用,请联系管理员");
+            asyncManager.insertLog(tenantId,loginUser.getUserName(), Constants.LOGIN_FAIL, "用户已停用,请联系管理员", null);
             throw new BusinessException("对不起,您的账号:" + loginUser.getUserName() + " 已停用");
         }
 
-        recordLogininfor(tenantId,loginUser.getUserName(), Constants.LOGIN_SUCCESS, "登录成功");
+        // 获取部门ID
+        LambdaQueryWrapper<SysUser> deptQueryWrapper = Wrappers.lambdaQuery();
+        deptQueryWrapper.select(SysUser::getDeptId)
+                .eq(SysUser::getDelFlag, 0)
+                .eq(SysUser::getTenantId, tenantId)
+                .and(w -> w.eq(SysUser::getUserName, username).or().eq(SysUser::getPhonenumber, username));
+        SysUser sysUser = sysUserService.getOne(deptQueryWrapper);
+        Integer deptId = 0; // 默认值为0,假设0表示没有部门ID
+        if (sysUser != null) {
+            deptId = sysUser.getDeptId().intValue(); // 将Long转换为Integer
+        }
+        asyncManager.insertLog(tenantId,loginUser.getUserName(), Constants.LOGIN_SUCCESS, "登录成功", deptId);
         return loginUser;
     }
 
 
     public void logout(Integer tenantId,String loginName) {
-        recordLogininfor(tenantId,loginName, Constants.LOGOUT, "退出成功");
+        asyncManager.insertLog(tenantId,loginName, Constants.LOGOUT, "退出成功", null);
     }
 
     /**
@@ -216,43 +244,7 @@ public class SysLoginService {
         sysUser.setNickName(username);
         sysUser.setPassword(SecurityUtils.encryptPassword(password));
         sysUserService.register(BeanMapperUtils.map(sysUser, SysUser.class));
-        recordLogininfor(SecurityUtils.getTenantId(),username, Constants.REGISTER, "注册成功");
-    }
-
-    /**
-     * 记录登录信息
-     *
-     * @param username 用户名
-     * @param status   状态
-     * @param message  消息内容
-     * @return
-     */
-    public void recordLogininfor(Integer tenantId,String username, String status, String message) {
-        SysLogininforVO logininfor = new SysLogininforVO();
-        logininfor.setUserName(username);
-        logininfor.setIpaddr(IpUtils.getIpAddr(ServletUtils.getRequest()));
-        logininfor.setMsg(message);
-        logininfor.setCreateBy(username);
-
-        LambdaQueryWrapper<SysUser> queryWrapper = Wrappers.lambdaQuery();
-        queryWrapper.select(SysUser::getDeptId)
-                .eq(SysUser::getDelFlag,0)
-                .eq(SysUser::getUserName,username)
-                .eq(SysUser::getTenantId,tenantId);
-        SysUser one = sysUserService.getOne(queryWrapper);
-        if(one != null){
-            logininfor.setDeptId(one.getDeptId().intValue());
-        }
-        logininfor.setTenantId(tenantId);
-
-        // 日志状态
-        if (StringUtils.equalsAny(status, Constants.LOGIN_SUCCESS, Constants.LOGOUT, Constants.REGISTER)) {
-            logininfor.setStatus(Constants.LOGIN_SUCCESS_STATUS);
-        } else if (Constants.LOGIN_FAIL.equals(status)) {
-            logininfor.setStatus(Constants.LOGIN_FAIL_STATUS);
-        }
-        LOGGER.debug(JsonUtils.toJson(logininfor));
-        sysLogininforService.insertLogininfor(BeanMapperUtils.map(logininfor, SysLogininfor.class));
+        asyncManager.insertLog(SecurityUtils.getTenantId(),username, Constants.REGISTER, "注册成功", null);
     }
 
 
@@ -262,7 +254,7 @@ public class SysLoginService {
             String result = String.valueOf(o);
             return result;
         }
-       return null;
+        return null;
     }
 
 

+ 59 - 29
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/impl/SysUserServiceImpl.java

@@ -2,7 +2,6 @@ package com.usky.system.service.impl;
 
 
 import com.ruoyi.common.datascope.annotation.DataScope;
-import com.usky.common.core.constants.Constants;
 import com.usky.common.security.utils.SecurityUtils;
 import com.usky.common.core.bean.CommonPage;
 import com.usky.common.core.exception.BusinessException;
@@ -15,17 +14,17 @@ import com.usky.system.mapper.*;
 import com.usky.system.model.LoginUser;
 import com.usky.system.service.ISysConfigService;
 import com.usky.system.service.ISysUserService;
+import com.usky.system.service.vo.SysUserNewVO;
+import com.usky.system.service.vo.UserPostVo;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.BeanUtils;
+import org.springframework.beans.BeansException;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Objects;
-import java.util.Set;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -86,6 +85,37 @@ public class SysUserServiceImpl extends AbstractCrudService<SysUserMapper, SysUs
         return userMapper.selectUserList(user);
     }
 
+    /**
+     * 用户列表-新
+     *
+     * @param user 用户信息
+     * @return 用户信息集合信息
+     */
+    @Override
+    public List<SysUserNewVO> dUserList(SysUser user) {
+        user.setTenantId(SecurityUtils.getTenantId());
+        user.setUserType("00");
+        List<SysUserNewVO> sysUserNewVOS = new ArrayList<>();
+        List<SysUser> sysUsers = userMapper.selectUserList(user);
+        List<Long> userIds = new ArrayList<>();
+        if (!sysUsers.isEmpty()) {
+            for (SysUser sysUser : sysUsers) {
+                SysUserNewVO sysUserNewVO = new SysUserNewVO();
+                try {
+                    BeanUtils.copyProperties(sysUser, sysUserNewVO);
+                } catch (BeansException e) {
+                    throw new BusinessException("dUserList方法,获取用户列表信息异常" + e);
+                }
+                userIds.add(sysUser.getUserId());
+                sysUserNewVOS.add(sysUserNewVO);
+            }
+            Map<Long, String> userIdToPostMap = userPostMapper.getUserPost(userIds).stream()
+                    .collect(Collectors.toMap(UserPostVo::getUserId, UserPostVo::getPostName));
+            sysUserNewVOS.forEach(sysUserNewVO -> sysUserNewVO.setPost(userIdToPostMap.get(sysUserNewVO.getUserId())));
+        }
+        return sysUserNewVOS;
+    }
+
     /**
      * 根据条件分页查询已分配用户角色列表
      *
@@ -218,7 +248,7 @@ public class SysUserServiceImpl extends AbstractCrudService<SysUserMapper, SysUs
     }
 
     @Override
-    public String checkPhoneUnique1(String phone, Integer tenantId){
+    public String checkPhoneUnique1(String phone, Integer tenantId) {
         int count = userMapper.checkPhoneUnique1(phone, tenantId);
         if (count > 0) {
             return UserConstants.NOT_UNIQUE;
@@ -493,16 +523,16 @@ public class SysUserServiceImpl extends AbstractCrudService<SysUserMapper, SysUs
 
     @Override
     @Transactional
-    public int deleteUserByPwd(Long userId,String password) {
+    public int deleteUserByPwd(Long userId, String password) {
         checkUserAllowed(new SysUser(userId));
         SysUser user = this.selectUserById(userId);
-        if (user.getPassword().equals(password)){
+        if (user.getPassword().equals(password)) {
             // 删除用户与角色关联
             userRoleMapper.deleteUserRoleByUserId(userId);
             // 删除用户与岗位表
             userPostMapper.deleteUserPostByUserId(userId);
             return userMapper.deleteUserById(userId);
-        }else {
+        } else {
             throw new BusinessException("密码错误");
         }
     }
@@ -546,26 +576,26 @@ public class SysUserServiceImpl extends AbstractCrudService<SysUserMapper, SysUs
 
     @Override
     public SysUser getAppUserInfo(String username, Integer tenantId, String phone) {
-       SysUser sysUser = new SysUser();
-       if (!StringUtils.isBlank(username)) {
-           sysUser = userMapper.selectUserData(username, tenantId);
-       } else if (!StringUtils.isBlank(phone)) {
-           sysUser = userMapper.selectUserDataOne(tenantId,phone);
-       }
-       if(Objects.isNull(sysUser)){
-           sysUser = userMapper.selectUserDataOne(tenantId,username);
-           if (Objects.isNull(sysUser)){
-               throw new BusinessException("用户信息未注册");
-           }
-       }
-       List<SysRole> sysRoles = roleMapper.selectRolePermissionByUserId(sysUser.getUserId());
-       List<SysRoleVO> collect = sysRoles.stream().map(sysRole -> {
-           SysRoleVO sysRoleVO = new SysRoleVO();
-           BeanUtils.copyProperties(sysRole, sysRoleVO);
-           return sysRoleVO;
-       }).collect(Collectors.toList());
-       sysUser.setRoles(collect);
-       return sysUser;
+        SysUser sysUser = new SysUser();
+        if (!StringUtils.isBlank(username)) {
+            sysUser = userMapper.selectUserData(username, tenantId);
+        } else if (!StringUtils.isBlank(phone)) {
+            sysUser = userMapper.selectUserDataOne(tenantId, phone);
+        }
+        if (Objects.isNull(sysUser)) {
+            sysUser = userMapper.selectUserDataOne(tenantId, username);
+            if (Objects.isNull(sysUser)) {
+                throw new BusinessException("用户信息未注册");
+            }
+        }
+        List<SysRole> sysRoles = roleMapper.selectRolePermissionByUserId(sysUser.getUserId());
+        List<SysRoleVO> collect = sysRoles.stream().map(sysRole -> {
+            SysRoleVO sysRoleVO = new SysRoleVO();
+            BeanUtils.copyProperties(sysRole, sysRoleVO);
+            return sysRoleVO;
+        }).collect(Collectors.toList());
+        sysUser.setRoles(collect);
+        return sysUser;
     }
 
 

+ 45 - 0
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/util/AddressUtils.java

@@ -0,0 +1,45 @@
+package com.usky.system.service.util;
+
+import cn.hutool.http.HttpUtil;
+import com.ruoyi.common.core.utils.ip.IpUtils;
+import com.usky.system.domain.WjConfig;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.util.StringUtils;
+
+/**
+ * 获取地址类
+ *
+ * @author xy
+ */
+public class AddressUtils {
+    private static final Logger log = LoggerFactory.getLogger(AddressUtils.class);
+
+    // IP地址查询
+    public static  String IP_URL = "http://whois.pconline.com.cn/ip.jsp?ip=";
+
+    // 未知地址
+    public static final String UNKNOWN = "未知地址";
+
+    public static String getRealAddressByIP(String ip) {
+        // 内网不查询
+        if (IpUtils.internalIp(ip)) {
+            return "内网IP";
+        }
+        if (WjConfig.isAddressEnabled()) {
+            try {
+                String url = IP_URL + ip;
+                String rspStr = HttpUtil.get(url);
+                log.info("ip is {}, repStr is {}, url is {}", ip, rspStr, url);
+                if (StringUtils.isEmpty(rspStr.trim())) {
+                    log.error("获取地理位置异常 {}, {}", ip, rspStr);
+                    return UNKNOWN;
+                }
+                return rspStr.trim();
+            } catch (Exception e) {
+                log.error("获取地理位置异常 {}", ip);
+            }
+        }
+        return UNKNOWN;
+    }
+}

+ 82 - 0
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/util/AsyncFactory.java

@@ -0,0 +1,82 @@
+package com.usky.system.service.util;
+
+
+import com.alibaba.fastjson.JSON;
+import com.ruoyi.common.core.constant.Constants;
+import com.ruoyi.common.core.utils.ServletUtils;
+import com.ruoyi.common.core.utils.StringUtils;
+import com.ruoyi.common.core.utils.ip.IpUtils;
+import com.usky.common.core.util.SpringContextUtils;
+import com.usky.system.domain.SysLogininfor;
+import com.usky.system.service.ISysLogininforService;
+import eu.bitwalker.useragentutils.UserAgent;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+/**
+ * @description: 异步工厂(产生任务用)
+ * @author: XiaoYu
+ * @date: 2024/08/20 13:58
+ */
+public class AsyncFactory
+{
+    private static final Logger sys_user_logger = LoggerFactory.getLogger("sys-user");
+
+    /**
+     * 记录登录信息
+     *
+     * @param username 用户名
+     * @param status 状态
+     * @param message 消息
+     * @param args 列表
+     * @return 任务task
+     */
+    public static void recordLoginInfo(final Integer tenantId,final String username,final String status, final String message, final Integer deptId,
+                                       final Object... args) {
+        final eu.bitwalker.useragentutils.UserAgent userAgent = UserAgent.parseUserAgentString(ServletUtils.getRequest().getHeader("User-Agent"));
+        final String ip = IpUtils.getIpAddr(ServletUtils.getRequest());
+        String address = AddressUtils.getRealAddressByIP(ip);
+        StringBuilder s = new StringBuilder();
+        s.append(getBlock(ip));
+        s.append(address);
+        s.append(getBlock(username));
+        s.append(getBlock(status));
+        s.append(getBlock(message));
+        // 打印信息到日志
+        sys_user_logger.info(s.toString(), args);
+        // 获取客户端操作系统
+        String os = userAgent.getOperatingSystem().getName();
+        // 获取客户端浏览器
+        String browser = userAgent.getBrowser().getName();
+        // 封装对象
+        SysLogininfor logininfor = new SysLogininfor();
+        logininfor.setUserName(username);
+        logininfor.setIpaddr(ip);
+        logininfor.setLoginLocation(address);
+        logininfor.setBrowser(browser);
+        logininfor.setOs(os);
+        logininfor.setMsg(message);
+        logininfor.setCreateBy(username);
+        logininfor.setTenantId(tenantId);
+        logininfor.setDeptId(deptId);
+        // 日志状态
+        if (StringUtils.equalsAny(status, Constants.LOGIN_SUCCESS, Constants.LOGOUT, Constants.REGISTER)) {
+            logininfor.setStatus(String.valueOf(Constants.LOGIN_SUCCESS_STATUS)); // 使用String.valueOf进行转换
+        } else if (Constants.LOGIN_FAIL.equals(status)) {
+            logininfor.setStatus(String.valueOf(Constants.LOGIN_FAIL_STATUS)); // 使用String.valueOf进行转换
+        }
+        sys_user_logger.info("log is {}", JSON.toJSONString(logininfor));
+        // 插入数据
+        SpringContextUtils.getBean(ISysLogininforService.class).insertLogininfor(logininfor);
+    }
+
+    public static String getBlock(Object msg)
+    {
+        if (msg == null)
+        {
+            msg = "";
+        }
+        return "[" + msg.toString() + "]";
+    }
+}

+ 45 - 0
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/util/AsyncManager.java

@@ -0,0 +1,45 @@
+package com.usky.system.service.util;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import java.util.concurrent.ArrayBlockingQueue;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * @description: 异步任务管理器
+ * @author: XiaoYu
+ * @date: 2024/08/20 13:58
+ */
+@Component
+public class AsyncManager {
+
+    private static final Logger logger = LoggerFactory.getLogger(AsyncManager.class);
+
+    /**
+     * 异步操作任务调度线程池
+     */
+
+    private static final ThreadPoolExecutor executorEvent = new ThreadPoolExecutor(
+            20, 30, 0L, TimeUnit.MILLISECONDS,
+            new ArrayBlockingQueue<Runnable>(1024),
+            new ThreadPoolExecutor.AbortPolicy()
+    );
+
+
+    public void insertLog(Integer tenantId, final String username, final String status, final String message, final Integer deptId) {
+        ServletRequestAttributes sra = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
+        RequestContextHolder.setRequestAttributes(sra, true);
+        executorEvent.execute(() -> {
+            logger.info("new Log is {} , {}", username, message);
+            AsyncFactory.recordLoginInfo(tenantId, username, status, message, deptId);
+        });
+    }
+
+
+}
+

+ 16 - 0
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/vo/SysLoginExportVO.java

@@ -40,6 +40,10 @@ public class SysLoginExportVO {
     @Excel(name = "用户名称")
     private String userName;
 
+    /** 组织机构 */
+    @Excel(name = "组织机构")
+    private String deptName;
+
     /** 登录状态 0成功 1失败 */
     @Excel(name = "登录状态")
     private String status;
@@ -51,4 +55,16 @@ public class SysLoginExportVO {
     /** 访问时间 */
     @Excel(name = "访问时间")
     private LocalDateTime accessTime;
+
+    /** 登陆地点 */
+    @Excel(name = "登陆地点")
+    private String loginLocation;
+
+    /** 浏览器类型 */
+    @Excel(name = "浏览器类型")
+    private String browser;
+
+    /** 操作系统 */
+    @Excel(name = "操作系统")
+    private String os;
 }

+ 43 - 0
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/vo/SysUserNewVO.java

@@ -0,0 +1,43 @@
+package com.usky.system.service.vo;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import lombok.Data;
+
+/**
+ *
+ * @author fu
+ * @date 2024/8/23
+ */
+@Data
+public class SysUserNewVO {
+    /** 用户ID */
+    private Long userId;
+
+    /** 部门ID */
+    private Long deptId;
+
+    /** 用户账号 */
+    private String userName;
+
+    /** 用户昵称 */
+    private String nickName;
+
+    /** 用户邮箱 */
+    private String email;
+
+    /** 手机号码 */
+    private String phonenumber;
+
+    /** 用户性别 */
+    private String sex;
+
+    /** 用户头像 */
+    private String avatar;
+
+    /** 地址 */
+    private String address;
+
+    /** 岗位 */
+    @TableField(exist = false)
+    private String post;
+}

+ 35 - 18
base-modules/service-system/service-system-biz/src/main/resources/mapper/system/SysLogininforMapper.xml

@@ -12,8 +12,12 @@
 		<result property="msg"           column="msg"               />
 		<result property="accessTime"    column="access_time"       />
 		<result property="deptId"        column="dept_id"           />
+		<result property="deptName"      column="dept_name"         />
 		<result property="tenantId"      column="tenant_id"         />
 		<result property="createBy"      column="create_by"         />
+		<result property="loginLocation"    column="login_location"       />
+		<result property="browser"    column="browser"       />
+		<result property="os"    column="os"       />
 	</resultMap>
 
 	<insert id="insertLogininfor" parameterType="com.usky.system.domain.SysLogininfor">
@@ -27,6 +31,9 @@
 			<if test="deptId != null"> dept_id, </if>
 			<if test="tenantId != null"> tenant_id, </if>
 			<if test="createBy != null"> create_by, </if>
+			<if test="loginLocation != null"> login_location, </if>
+			<if test="browser != null"> browser, </if>
+			<if test="os != null"> os, </if>
 		</trim>
 		values
 		<trim prefix="(" suffix=")" suffixOverrides=",">
@@ -38,60 +45,70 @@
 			<if test="deptId != null"> #{deptId},</if>
 			<if test="tenantId != null"> #{tenantId},</if>
 			<if test="createBy != null"> #{createBy},</if>
+			<if test="loginLocation != null"> #{loginLocation},</if>
+			<if test="browser != null"> #{browser},</if>
+			<if test="os != null"> #{os},</if>
 		</trim>
 	</insert>
 
 	<select id="selectLogininforList" parameterType="com.usky.system.domain.SysLogininfor" resultMap="SysLogininforResult">
-		select info_id, user_name, ipaddr, status, msg, access_time from sys_logininfor d
+		select d.info_id, d.user_name, d.ipaddr, d.status, d.msg, d.access_time, d.login_location, d.browser, d.os, sd.dept_name
+		from sys_logininfor d
+		left join sys_dept sd on d.dept_id = sd.dept_id
 		<where>
 			<if test="ipaddr != null and ipaddr != ''">
-				AND ipaddr like concat('%', #{ipaddr}, '%')
+				AND d.ipaddr like concat('%', #{ipaddr}, '%')
 			</if>
 			<if test="status != null and status != ''">
-				AND status = #{status}
+				AND d.status = #{status}
 			</if>
 			<if test="userName != null and userName != ''">
-				AND user_name like concat('%', #{userName}, '%')
+				AND d.user_name like concat('%', #{userName}, '%')
 			</if>
 			<if test="params.beginTime != null and params.beginTime != ''"><!-- 开始时间检索 -->
-				and date_format(access_time,'%y%m%d') &gt;= date_format(#{params.beginTime},'%y%m%d')
+				and date_format(d.access_time,'%y%m%d') >= date_format(#{params.beginTime},'%y%m%d')
 			</if>
 			<if test="params.endTime != null and params.endTime != ''"><!-- 结束时间检索 -->
-				and date_format(access_time,'%y%m%d') &lt;= date_format(#{params.endTime},'%y%m%d')
+				and date_format(d.access_time,'%y%m%d') &lt;= date_format(#{params.endTime},'%y%m%d')
 			</if>
 			<if test="1 == 1">
-				and tenant_id = #{tenantId}
+				and d.tenant_id = #{tenantId}
 			</if>
 			<!-- 数据范围过滤 -->
 			${params.dataScope}
 		</where>
-		order by info_id desc
+		order by d.info_id desc
 	</select>
 
 	<select id="selectLogininforListExport" parameterType="com.usky.system.domain.SysLogininfor" resultType="com.usky.system.service.vo.SysLoginExportVO">
-		select info_id, ipaddr, user_name, (case status when '0' then '成功' else '失败' end) as status, msg, access_time from sys_logininfor d
+		select d.info_id, d.ipaddr, d.user_name,
+		(case when d.status = '0' then '成功' else '失败' end) as status,
+		d.msg, d.access_time, d.login_location, d.browser, d.os,
+		sd.dept_name
+		from sys_logininfor d
+		left join sys_dept sd on d.dept_id = sd.dept_id
 		<where>
 			<if test="ipaddr != null and ipaddr != ''">
-				AND ipaddr like concat('%', #{ipaddr}, '%')
+				AND d.ipaddr like concat('%', #{ipaddr}, '%')
 			</if>
 			<if test="status != null and status != ''">
-				AND status = #{status}
+				AND d.status = #{status}
 			</if>
 			<if test="userName != null and userName != ''">
-				AND user_name like concat('%', #{userName}, '%')
+				AND d.user_name like concat('%', #{userName}, '%')
 			</if>
 			<if test="params.beginTime != null and params.beginTime != ''"><!-- 开始时间检索 -->
-				and date_format(access_time,'%y%m%d') &gt;= date_format(#{params.beginTime},'%y%m%d')
+				and date_format(d.access_time,'%y%m%d') >= date_format(#{params.beginTime},'%y%m%d')
 			</if>
 			<if test="params.endTime != null and params.endTime != ''"><!-- 结束时间检索 -->
-				and date_format(access_time,'%y%m%d') &lt;= date_format(#{params.endTime},'%y%m%d')
+				and date_format(d.access_time,'%y%m%d') &lt;= date_format(#{params.endTime},'%y%m%d')
 			</if>
 			<if test="1 == 1">
-				and tenant_id = #{tenantId}
+				and d.tenant_id = #{tenantId}
 			</if>
 			${params.dataScope}
 		</where>
-		order by info_id desc
+		order by d.info_id desc
 	</select>
 
 	<delete id="deleteLogininforByIds" parameterType="Long">
@@ -102,7 +119,7 @@
 	</delete>
 
 	<update id="cleanLogininfor">
-        truncate table sys_logininfor
-    </update>
+	truncate table sys_logininfor
+	</update>
 
 </mapper>