xuhy
2025-09-28 0a4e55b1cbeb7b81dfa51ebcee2ce83f303dad91
app用户登录,后台用户登录
1个文件已删除
13个文件已修改
2个文件已添加
766 ■■■■■ 已修改文件
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TMajorController.java 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java 38 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TAppUserController.java 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-applet/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java 68 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-applet/src/main/java/com/ruoyi/web/controller/tool/MsgUtils.java 108 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-applet/src/main/resources/application-test.yml 54 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/TAppUserResp.java 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/TTenantResp.java 70 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginAppBody.java 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginUserApplet.java 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java 82 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysPasswordService.java 49 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/UserDetailsServiceImpl.java 92 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/model/TAppUser.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml 41 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TMajorController.java
@@ -43,7 +43,7 @@
     */
    //@PreAuthorize("@ss.hasPermi('system:major:list')")
    @ApiOperation(value = "专业管理分页列表", response = TMajorQuery.class)
    @PostMapping(value = "/api/t-division-team/pageList")
    @PostMapping(value = "/api/t-major/pageList")
    public R<PageInfo<TMajor>> pageList(@RequestBody String param) {
        TMajorQuery query = JSON.parseObject(param, TMajorQuery.class);
        return R.ok(majorService.pageList(query));
@@ -55,7 +55,7 @@
    //@PreAuthorize("@ss.hasPermi('system:major:add')")
    @Log(title = "专业管理信息-新增专业管理", businessType = BusinessType.INSERT)
    @ApiOperation(value = "添加专业管理",response = TMajor.class)
    @PostMapping(value = "/api/t-division-team/add")
    @PostMapping(value = "/api/t-major/add")
    public R<Boolean> add(@RequestBody String param) {
        TMajor dto = JSON.parseObject(param,TMajor.class);
        if(majorService.isExit(dto)){
@@ -71,7 +71,7 @@
    //@PreAuthorize("@ss.hasPermi('system:major:edit')")
    @Log(title = "专业管理信息-修改专业管理", businessType = BusinessType.UPDATE)
    @ApiOperation(value = "修改专业管理")
    @PostMapping(value = "/api/t-division-team/update")
    @PostMapping(value = "/api/t-major/update")
    public R<Boolean> update(@RequestBody String param) {
        TMajor dto = JSON.parseObject(param,TMajor.class);
        if(majorService.isExit(dto)){
@@ -86,7 +86,7 @@
     */
    //@PreAuthorize("@ss.hasPermi('system:major:detail')")
    @ApiOperation(value = "查看专业管理详情")
    @GetMapping(value = "/open/t-division-team/getDetailById")
    @GetMapping(value = "/open/t-major/getDetailById")
    public R<TMajor> getDetailById(@RequestParam String id) {
        TMajor equipment = majorService.getById(id);
        return R.ok(equipment);
@@ -98,7 +98,7 @@
    //@PreAuthorize("@ss.hasPermi('system:major:delete')")
    @Log(title = "专业管理信息-删除专业管理", businessType = BusinessType.DELETE)
    @ApiOperation(value = "删除专业管理")
    @DeleteMapping(value = "/open/t-division-team/deleteById")
    @DeleteMapping(value = "/open/t-major/deleteById")
    public R<Boolean> deleteById(@RequestParam String id) {
        return R.ok(majorService.removeById(id));
    }
@@ -109,7 +109,7 @@
    //@PreAuthorize("@ss.hasPermi('system:major:delete')")
    @Log(title = "专业管理信息-删除专业管理", businessType = BusinessType.DELETE)
    @ApiOperation(value = "批量删除专业管理")
    @DeleteMapping(value = "/open/t-division-team/deleteByIds")
    @DeleteMapping(value = "/open/t-major/deleteByIds")
    public R<Boolean> deleteByIds(@RequestBody List<String> ids) {
        return R.ok(majorService.removeByIds(ids));
    }
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java
@@ -88,25 +88,25 @@
     * @param loginBody 登录信息
     * @return 结果
     */
    @ApiOperation(value = "短信登录",notes = "短信登录")
    @PostMapping("/loginCode")
    public AjaxResult loginCode(@RequestBody LoginBody loginBody)
    {
        AjaxResult ajax = AjaxResult.success();
        // 生成令牌
        LoginUser loginUser = loginService.loginCode(loginBody.getUsername(), loginBody.getCode());
        ajax.put(Constants.TOKEN, tokenService.createToken(loginUser));
        List<SysRole> roles = loginUser.getUser().getRoles();
        if(CollectionUtils.isEmpty(roles)){
            return AjaxResult.error("请关联角色!");
        }
        List<SysMenu> menus = roleService.roleInfoFromUserId(loginUser.getUserId());
        ajax.put("menus",menus);
        ajax.put("roleName",roles.get(0).getRoleName());
        ajax.put("userInfo",loginUser);
        return ajax;
    }
//    @ApiOperation(value = "短信登录",notes = "短信登录")
//    @PostMapping("/loginCode")
//    public AjaxResult loginCode(@RequestBody LoginBody loginBody)
//    {
//        AjaxResult ajax = AjaxResult.success();
//        // 生成令牌
//        LoginUser loginUser = loginService.loginCode(loginBody.getUsername(), loginBody.getCode());
//        ajax.put(Constants.TOKEN, tokenService.createToken(loginUser));
//        List<SysRole> roles = loginUser.getUser().getRoles();
//        if(CollectionUtils.isEmpty(roles)){
//            return AjaxResult.error("请关联角色!");
//        }
//        List<SysMenu> menus = roleService.roleInfoFromUserId(loginUser.getUserId());
//
//        ajax.put("menus",menus);
//        ajax.put("roleName",roles.get(0).getRoleName());
//        ajax.put("userInfo",loginUser);
//        return ajax;
//    }
    /**
     * 获取验证码
ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TAppUserController.java
@@ -2,6 +2,7 @@
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.framework.web.service.TokenService;
import com.ruoyi.system.model.TAppUser;
@@ -9,6 +10,7 @@
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.web.bind.annotation.*;
/**
@@ -26,19 +28,28 @@
    private final TAppUserService appUserService;
    private final TokenService tokenService;
    private final PasswordEncoder passwordEncoder;
    @Autowired
    public TAppUserController(TAppUserService appUserService, TokenService tokenService) {
    public TAppUserController(TAppUserService appUserService, TokenService tokenService, PasswordEncoder passwordEncoder) {
        this.appUserService = appUserService;
        this.tokenService = tokenService;
        this.passwordEncoder = passwordEncoder;
    }
    /**
     * 添加人员管理管理管理
     */
    @ApiOperation(value = "添加人员管理",response = TAppUser.class)
    @ApiOperation(value = "注册人员管理",response = TAppUser.class)
    @PostMapping(value = "/api/t-equipment/add")
    public R<Boolean> add(@RequestBody String param) {
        TAppUser dto = JSON.parseObject(param,TAppUser.class);
        long count = appUserService.count(Wrappers.lambdaQuery(TAppUser.class).eq(TAppUser::getAccount, dto.getAccount()));
        if (count>0) {
            return R.fail("该账号已存在");
        }
        dto.setState(0);
        dto.setStatus(1);
        passwordEncoder.encode(dto.getPassword());
        appUserService.save(dto);
        return R.ok();
    }
ruoyi-applet/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java
@@ -1,12 +1,12 @@
package com.ruoyi.web.controller.system;
import com.alibaba.fastjson.JSON;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.entity.SysMenu;
import com.ruoyi.common.core.domain.entity.SysRole;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.domain.model.LoginBody;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.core.domain.model.LoginAppBody;
import com.ruoyi.common.core.domain.model.LoginUserApplet;
import com.ruoyi.common.core.redis.RedisCache;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.framework.web.service.SysLoginService;
@@ -18,7 +18,6 @@
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
@@ -56,71 +55,22 @@
    /**
     * 账号密码登录
     * 
     * @param loginBody 登录信息
     * @param param 登录信息
     * @return 结果
     */
    @ApiOperation(value = "账号密码登录",notes = "账号密码登录")
        @PostMapping("/login")
    public AjaxResult login(@RequestBody LoginBody loginBody)
    @PostMapping("/api/loginApp")
    public AjaxResult login(@RequestBody String param)
    {
        LoginAppBody loginAppBody = JSON.parseObject(param, LoginAppBody.class);
        AjaxResult ajax = AjaxResult.success();
        // 生成令牌
        LoginUser loginUser = loginService.login(loginBody.getUsername(), loginBody.getPassword(), loginBody.getCode(),
                loginBody.getUuid());
        ajax.put(Constants.TOKEN, tokenService.createToken(loginUser));
        List<SysRole> roles = loginUser.getUser().getRoles();
        if(CollectionUtils.isEmpty(roles)){
            return AjaxResult.error("请关联角色!");
        }
        if(roles.get(0).getStatus() == 1){
            return AjaxResult.error("该账号角色已被禁用!");
        }
        List<SysMenu> menus = roleService.roleInfoFromUserId(loginUser.getUserId());
        ajax.put("menus",menus);
        ajax.put("roleName",roles.get(0).getRoleName());
        LoginUserApplet loginUser = loginService.loginCodeApplet(loginAppBody.getAccount(), loginAppBody.getPassword());
        ajax.put(Constants.TOKEN, tokenService.createTokenApplet(loginUser));
        ajax.put("userInfo",loginUser);
        return ajax;
    }
    /**
     * 账号密码登录
     *
     * @param loginBody 登录信息
     * @return 结果
     */
    @ApiOperation(value = "短信登录",notes = "短信登录")
    @PostMapping("/loginCode")
    public AjaxResult loginCode(@RequestBody LoginBody loginBody)
    {
        AjaxResult ajax = AjaxResult.success();
        return ajax;
    }
    /**
     * 获取验证码
     *
     * @param phone 手机号
     * @return 结果
     */
//    @ApiOperation(value = "获取验证码",notes = "获取验证码")
//    @GetMapping("/getCode")
//    public AjaxResult getCode(@RequestParam String phone)
//    {
//        // 发送验证码并存储到redis
//        if (StringUtils.hasLength(phone)) {
//            String code = String.valueOf((int) (Math.random() * 1000000));
//            redisCache.setCacheObject(phone, code,5*60,TimeUnit.SECONDS);
//            try {
//                smsUtil.sendSms(phone, "2369926", new String[]{code});
//            } catch (Exception e) {
//                throw new RuntimeException(e);
//            }
//            return AjaxResult.success("发送短信验证码成功!5分钟内有效");
//        }
//        return AjaxResult.error(500, "发送短信验证码失败,请确认手机号码!");
//    }
    /**
     * 获取用户信息
ruoyi-applet/src/main/java/com/ruoyi/web/controller/tool/MsgUtils.java
@@ -13,58 +13,58 @@
@Slf4j
public class MsgUtils {
    @Value("${code.config.accessKeyId}")
    private  String accessKeyId;
    @Value("${code.config.accessKeySecret}")
    private  String accessKeySecret;
    @Value("${code.config.signName}")
    private  String signName;
    @Value("${code.config.templateCode}")
    private  String templateCode;
    @Value("${code.config.signNameTest}")
    private  String signNameTest;
    @Value("${code.config.templateCodeTest}")
    private  String templateCodeTest;
    /**
     * 使用AK&SK初始化账号Client
     * @param accessKeyId
     * @param accessKeySecret
     * @return Client
     * @throws Exception
     */
    public static com.aliyun.dysmsapi20170525.Client createClient(String accessKeyId, String accessKeySecret) throws Exception {
        Config config = new Config()
                // 您的 AccessKey ID
                .setAccessKeyId(accessKeyId)
                // 您的 AccessKey Secret
                .setAccessKeySecret(accessKeySecret);
        // 访问的域名
        config.endpoint = "dysmsapi.aliyuncs.com";
        return new com.aliyun.dysmsapi20170525.Client(config);
    }
    public void sendMsg(String phone,String code) throws Exception {
        com.aliyun.dysmsapi20170525.Client client = MsgUtils.createClient(accessKeyId,accessKeySecret);
        SendSmsRequest sendSmsRequest = new SendSmsRequest()
                .setSignName(signName)
                .setTemplateCode(templateCode)
                .setPhoneNumbers(phone)
                .setTemplateParam("{\"code\":\""+code+"\"}");
        RuntimeOptions runtime = new RuntimeOptions();
        try {
            // 复制代码运行请自行打印 API 的返回值
            SendSmsResponse sendSmsResponse = client.sendSmsWithOptions(sendSmsRequest, runtime);
            log.info("短信发送成功:{},{}",sendSmsResponse.getBody().getMessage(),sendSmsResponse.getStatusCode());
        } catch (TeaException error) {
            // 如有需要,请打印 error
            com.aliyun.teautil.Common.assertAsString(error.message);
            log.info("短信发送失败:{}",error.message);
        } catch (Exception _error) {
            TeaException error = new TeaException(_error.getMessage(), _error);
            // 如有需要,请打印 error
            com.aliyun.teautil.Common.assertAsString(error.message);
            log.info("短信发送失败:{}",error.message);
        }
    }
//    @Value("${code.config.accessKeyId}")
//    private  String accessKeyId;
//    @Value("${code.config.accessKeySecret}")
//    private  String accessKeySecret;
//    @Value("${code.config.signName}")
//    private  String signName;
//    @Value("${code.config.templateCode}")
//    private  String templateCode;
//    @Value("${code.config.signNameTest}")
//    private  String signNameTest;
//    @Value("${code.config.templateCodeTest}")
//    private  String templateCodeTest;
//
//    /**
//     * 使用AK&SK初始化账号Client
//     * @param accessKeyId
//     * @param accessKeySecret
//     * @return Client
//     * @throws Exception
//     */
//    public static com.aliyun.dysmsapi20170525.Client createClient(String accessKeyId, String accessKeySecret) throws Exception {
//        Config config = new Config()
//                // 您的 AccessKey ID
//                .setAccessKeyId(accessKeyId)
//                // 您的 AccessKey Secret
//                .setAccessKeySecret(accessKeySecret);
//        // 访问的域名
//        config.endpoint = "dysmsapi.aliyuncs.com";
//        return new com.aliyun.dysmsapi20170525.Client(config);
//    }
//
//    public void sendMsg(String phone,String code) throws Exception {
//        com.aliyun.dysmsapi20170525.Client client = MsgUtils.createClient(accessKeyId,accessKeySecret);
//        SendSmsRequest sendSmsRequest = new SendSmsRequest()
//                .setSignName(signName)
//                .setTemplateCode(templateCode)
//                .setPhoneNumbers(phone)
//                .setTemplateParam("{\"code\":\""+code+"\"}");
//        RuntimeOptions runtime = new RuntimeOptions();
//        try {
//            // 复制代码运行请自行打印 API 的返回值
//            SendSmsResponse sendSmsResponse = client.sendSmsWithOptions(sendSmsRequest, runtime);
//            log.info("短信发送成功:{},{}",sendSmsResponse.getBody().getMessage(),sendSmsResponse.getStatusCode());
//        } catch (TeaException error) {
//            // 如有需要,请打印 error
//            com.aliyun.teautil.Common.assertAsString(error.message);
//            log.info("短信发送失败:{}",error.message);
//        } catch (Exception _error) {
//            TeaException error = new TeaException(_error.getMessage(), _error);
//            // 如有需要,请打印 error
//            com.aliyun.teautil.Common.assertAsString(error.message);
//            log.info("短信发送失败:{}",error.message);
//        }
//    }
}
ruoyi-applet/src/main/resources/application-test.yml
@@ -14,11 +14,10 @@
  addressEnabled: false
  # 验证码类型 math 数字计算 char 字符验证
  captchaType: math
# 开发环境配置
server:
  # 服务器的HTTP端口,默认为8080
  port: 8082
  port: 9099
  servlet:
    # 应用的访问路径
    context-path: /
@@ -70,20 +69,13 @@
  # redis 配置
  redis:
    # 地址
#    host: 127.0.0.1
#    # 端口,默认为6379
#    port: 6379
#    # 数据库索引
#    database: 0
#    # 密码
#    password: 123456
    host: xzgt.test.591taxi.cn
    host: 127.0.0.1
    # 端口,默认为6379
    port: 16379
    port: 6379
    # 数据库索引
    database: 0
    # 密码
    password: 8f5z9g52gx4bg
    password: 123456
    # 连接超时时间
    timeout: 10s
    lettuce:
@@ -96,16 +88,16 @@
        max-active: 8
        # #连接池最大阻塞等待时间(使用负值表示没有限制)
        max-wait: -1ms
# 数据源配置
  # 数据源配置
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driverClassName: com.mysql.cj.jdbc.Driver
    druid:
      # 主库数据源
      master:
        url: jdbc:mysql://xzgt.test.591taxi.cn:13306/xizang?autoReconnect=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=Asia/Shanghai
        url: jdbc:mysql://127.0.0.1:3306/intelligent_dispatching?autoReconnect=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&allowPublicKeyRetrieval=true&useSSL=false&serverTimezone=Asia/Shanghai
        username: root
        password: 8f5z9g52gx4bg
        password: 123456
      # 从库数据源
      slave:
        # 从数据源开关/默认关闭
@@ -198,34 +190,8 @@
    location: /file/
    qrLocation: /file/qrCode/
    accessPath: /file/
    allowExt: .jpg|.png|.gif|.jpeg|.doc|.docx|.apk|.MP4|.mp4|.pdf|.PDF
  url:
#    prefix: http://localhost:${server.port}${server.servlet.context-path}
    prefix: https://xzgt.test.591taxi.cn:${server.port}${server.servlet.context-path}
    allowExt: .jpg|.png|.gif|.jpeg|.doc|.docx|.apk|.MP4|.mp4|.pdf|.PDF|.xls|.xlsx|.rar|.zip|.rar
wx:
  conf:
    appId: wxe91f1af7638aa5dd
    secretId: a787e1a462715604e0c9528b6d8960d1
#OSS及短信配置
code:
  config:
    templateCodeTest: "SMS_154950909"
    signNameTest: "阿里云短信测试"
    accessKeyId: LTAI5tAdba8HtT1C6UqtSxBt
    accessKeySecret: 0SRb6XGkciQDPWn2rYqbJtq2qRMDY8
    signName: "四川金达通信工程"
    templateCode: "SMS_293985284"
cos:
  client:
    accessKey: AKIDCF5EF2c0DE1e5JK8r4EGJF4mNsMgp26x
    secretKey: lLl184rUyFOOE0d5KNGC3kmfNsCWk4GU
    bucket: xzgttest-1305134071
    bucketAddr: ap-chengdu
    rootSrc: https://xzgttest-1305134071.cos.ap-chengdu.myqcloud.com/
    location: xizang
sms:
  enable: true
  appId: 1400957506
  secretid: AKIDCF5EF2c0DE1e5JK8r4EGJF4mNsMgp26x
  secretkey: lLl184rUyFOOE0d5KNGC3kmfNsCWk4GU
  sign: 畅云出行
    appId:
    secretId:
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/TAppUserResp.java
New file
@@ -0,0 +1,57 @@
package com.ruoyi.common.core.domain.entity;
import com.baomidou.mybatisplus.annotation.TableId;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
 * <p>
 * 租户
 * </p>
 *
 * @author xiaochen
 * @since 2025-01-20
 */
@Data
@EqualsAndHashCode(callSuper = false)
@ApiModel(value="TAppUser对象", description="登录返回")
public class TAppUserResp {
    private static final long serialVersionUID = 1L;
    @TableId(value = "id")
    private String id;
    @ApiModelProperty(value = "姓名")
    private String nickName;
    @ApiModelProperty(value = "手机号")
    private String phone;
    @ApiModelProperty(value = "登录账号")
    private String account;
    @ApiModelProperty(value = "密码")
    private String password;
    @ApiModelProperty(value = "分队名称 注册提交时使用")
    private String teamName;
    @ApiModelProperty(value = "分队id")
    private String teamId;
    @ApiModelProperty(value = "状态 1=启用 2=禁用")
    private Integer status;
    @ApiModelProperty(value = "实训次数")
    private Integer practicalTrainCount;
    @ApiModelProperty(value = "其他次数")
    private Integer otherCount;
    @ApiModelProperty(value = "审核状态 0=待审核 1=通过 2=拒绝")
    private Integer state;
}
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/TTenantResp.java
File was deleted
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginAppBody.java
New file
@@ -0,0 +1,61 @@
package com.ruoyi.common.core.domain.model;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
/**
 * 用户登录对象
 *
 * @author ruoyi
 */
@ApiModel(value = "App登录对象Body")
public class LoginAppBody
{
    /**
     * 用户名
     */
    @ApiModelProperty(value = "账号",notes = "账号")
    private String account;
    /**
     * 用户密码
     */
    @ApiModelProperty(value = "用户密码")
    private String password;
    /**
     * 唯一标识
     */
    private String uuid;
    public String getAccount()
    {
        return account;
    }
    public void setAccount(String account)
    {
        this.account = account;
    }
    public String getPassword()
    {
        return password;
    }
    public void setPassword(String password)
    {
        this.password = password;
    }
    public String getUuid()
    {
        return uuid;
    }
    public void setUuid(String uuid)
    {
        this.uuid = uuid;
    }
}
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginUserApplet.java
@@ -1,8 +1,7 @@
package com.ruoyi.common.core.domain.model;
import com.alibaba.fastjson2.annotation.JSONField;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.domain.entity.TTenantResp;
import com.ruoyi.common.core.domain.entity.TAppUserResp;
import lombok.Data;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
@@ -73,20 +72,20 @@
    /**
     * 用户信息
     */
    private TTenantResp user;
    private TAppUserResp user;
    public LoginUserApplet()
    {
    }
    public LoginUserApplet(TTenantResp user, Set<String> permissions)
    public LoginUserApplet(TAppUserResp user, Set<String> permissions)
    {
        this.user = user;
        this.permissions = permissions;
    }
    public LoginUserApplet(String userId, Long deptId, TTenantResp user, Set<String> permissions)
    public LoginUserApplet(String userId, Long deptId, TAppUserResp user, Set<String> permissions)
    {
        this.userId = userId;
        this.deptId = deptId;
@@ -134,7 +133,7 @@
    @Override
    public String getUsername()
    {
        return user.getResidentName();
        return user.getNickName();
    }
    /**
ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java
@@ -112,7 +112,7 @@
                .authorizeRequests()
                // 对于登录login 注册register 验证码captchaImage 允许匿名访问
                .antMatchers("/getPrivacyAgreement/{agreementType}",
                        "/applet/queryProtocolConfigByType","/applet/login",
                        "/applet/queryProtocolConfigByType","/api/loginApp",
                        "/api/login","/applet/queryProtocolConfigByType",
                        "/register","/applet/getCode","/applet/loginCode",
                        "/applet/changepwd", "/captchaImage","/getCode","/loginCode",
ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java
@@ -1,10 +1,12 @@
package com.ruoyi.framework.web.service;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.ruoyi.common.constant.CacheConstants;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.constant.UserConstants;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.core.domain.model.LoginUserApplet;
import com.ruoyi.common.core.redis.RedisCache;
import com.ruoyi.common.enums.UserStatus;
import com.ruoyi.common.exception.ServiceException;
@@ -16,8 +18,10 @@
import com.ruoyi.framework.manager.AsyncManager;
import com.ruoyi.framework.manager.factory.AsyncFactory;
import com.ruoyi.framework.security.context.AuthenticationContextHolder;
import com.ruoyi.system.model.TAppUser;
import com.ruoyi.system.service.ISysConfigService;
import com.ruoyi.system.service.ISysUserService;
import com.ruoyi.system.service.TAppUserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.AuthenticationManager;
@@ -53,6 +57,8 @@
    private ISysConfigService configService;
    @Autowired
    private SysPermissionService permissionService;
    @Autowired
    private TAppUserService appUserService;
    /**
     * 登录验证
@@ -85,7 +91,8 @@
        }
        try
        {
            UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(username, password);
            String userName = username + "_1";
            UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(userName, password);
            AuthenticationContextHolder.setContext(authenticationToken);
            // 该方法会去调用UserDetailsServiceImpl.loadUserByUsername
            authentication = authenticationManager.authenticate(authenticationToken);
@@ -110,6 +117,66 @@
        AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success")));
        LoginUser loginUser = (LoginUser) authentication.getPrincipal();
        recordLoginInfo(loginUser.getUserId());
        // 生成token
        return loginUser;
    }
    /**
     * 登录验证
     *
     * @param account 用户名
     * @param password 密码
     * @return 结果
     */
    public LoginUserApplet loginCodeApplet(String account, String password)
    {
        // 登录前置校验
        if (StringUtils.isEmpty(account)){
            AsyncManager.me().execute(AsyncFactory.recordLogininfor(account, Constants.LOGIN_FAIL, MessageUtils.message("not.null")));
            throw new UserNotExistsException();
        }
        // 用户验证
        Authentication authentication = null;
        // 用户验证
        TAppUser appUser = appUserService.getOne(Wrappers.<TAppUser>lambdaQuery().eq(TAppUser::getAccount,account));
        if (StringUtils.isNull(appUser)){
            log.info("登录用户:{} 不存在.", account);
            throw new ServiceException(MessageUtils.message("user.not.exists"));
        } else if (appUser.getDisabled()) {
            log.info("登录用户:{} 已被删除.", account);
            throw new ServiceException(MessageUtils.message("user.password.delete"));
        } else if (2 == appUser.getStatus()) {
            log.info("登录用户:{} 已被停用.", account);
            throw new ServiceException(MessageUtils.message("user.blocked"));
        }
        try
        {
            String userName = account + "_2";
            UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(userName, password);
            AuthenticationContextHolder.setContext(authenticationToken);
            // 该方法会去调用UserDetailsServiceImpl.loadUserByUsername
            authentication = authenticationManager.authenticate(authenticationToken);
        }
        catch (Exception e)
        {
            if (e instanceof BadCredentialsException)
            {
                AsyncManager.me().execute(AsyncFactory.recordLogininfor(account, Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match")));
                throw new UserPasswordNotMatchException();
            }
            else
            {
                AsyncManager.me().execute(AsyncFactory.recordLogininfor(account, Constants.LOGIN_FAIL, e.getMessage()));
                throw new ServiceException(e.getMessage());
            }
        }
        finally
        {
            AuthenticationContextHolder.clearContext();
        }
        AsyncManager.me().execute(AsyncFactory.recordLogininfor(account, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success")));
        LoginUserApplet loginUser = (LoginUserApplet) authentication.getPrincipal();
        recordAppLoginInfo(loginUser.getUserId());
        // 生成token
        return loginUser;
    }
@@ -236,4 +303,17 @@
        sysUser.setLoginDate(DateUtils.getNowDate());
        userService.updateUserProfile(sysUser);
    }
    /**
     * 记录登录信息
     *
     * @param userId 用户ID
     */
    public void recordAppLoginInfo(String userId)
    {
        TAppUser appUser = new TAppUser();
        appUser.setId(userId);
//        sysUser.setLoginIp(IpUtils.getIpAddr());
//        sysUser.setLoginDate(DateUtils.getNowDate());
//        userService.updateUserProfile(sysUser);
    }
}
ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysPasswordService.java
@@ -1,10 +1,5 @@
package com.ruoyi.framework.web.service;
import java.util.concurrent.TimeUnit;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.security.core.Authentication;
import org.springframework.stereotype.Component;
import com.ruoyi.common.constant.CacheConstants;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.domain.entity.SysUser;
@@ -16,6 +11,13 @@
import com.ruoyi.framework.manager.AsyncManager;
import com.ruoyi.framework.manager.factory.AsyncFactory;
import com.ruoyi.framework.security.context.AuthenticationContextHolder;
import com.ruoyi.system.model.TAppUser;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.security.core.Authentication;
import org.springframework.stereotype.Component;
import java.util.concurrent.TimeUnit;
/**
 * 登录密码方法
@@ -78,11 +80,48 @@
            clearLoginRecordCache(username);
        }
    }
    public void validateApp(TAppUser user)
    {
        Authentication usernamePasswordAuthenticationToken = AuthenticationContextHolder.getContext();
        String username = usernamePasswordAuthenticationToken.getName();
        String password = usernamePasswordAuthenticationToken.getCredentials().toString();
        Integer retryCount = redisCache.getCacheObject(getCacheKey(username));
        if (retryCount == null)
        {
            retryCount = 0;
        }
        if (retryCount >= Integer.valueOf(maxRetryCount).intValue())
        {
            AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL,
                    MessageUtils.message("user.password.retry.limit.exceed", maxRetryCount, lockTime)));
            throw new UserPasswordRetryLimitExceedException(maxRetryCount, lockTime);
        }
        if (!matchesApp(user, password))
        {
            retryCount = retryCount + 1;
            AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL,
                    MessageUtils.message("user.password.retry.limit.count", retryCount)));
            redisCache.setCacheObject(getCacheKey(username), retryCount, lockTime, TimeUnit.MINUTES);
            throw new UserPasswordNotMatchException();
        }
        else
        {
            clearLoginRecordCache(username);
        }
    }
    public boolean matches(SysUser user, String rawPassword)
    {
        return SecurityUtils.matchesPassword(rawPassword, user.getPassword());
    }
    public boolean matchesApp(TAppUser user, String rawPassword)
    {
        return SecurityUtils.matchesPassword(rawPassword, user.getPassword());
    }
    public void clearLoginRecordCache(String loginName)
    {
ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/UserDetailsServiceImpl.java
@@ -1,19 +1,25 @@
package com.ruoyi.framework.web.service;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.domain.entity.TAppUserResp;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.core.domain.model.LoginUserApplet;
import com.ruoyi.common.enums.UserStatus;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.MessageUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.model.TAppUser;
import com.ruoyi.system.service.ISysUserService;
import com.ruoyi.system.service.TAppUserService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.enums.UserStatus;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.MessageUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.service.ISysUserService;
/**
 * 用户验证处理
@@ -27,7 +33,9 @@
    @Autowired
    private ISysUserService userService;
    @Autowired
    private TAppUserService appUserService;
    @Autowired
    private SysPasswordService passwordService;
@@ -37,30 +45,62 @@
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException
    {
        SysUser user = userService.selectUserByUserName(username);
        if (StringUtils.isNull(user))
        {
            log.info("登录用户:{} 不存在.", username);
            throw new ServiceException(MessageUtils.message("user.not.exists"));
        }
        else if (UserStatus.DELETED.getCode().equals(user.getDelFlag()))
        {
            log.info("登录用户:{} 已被删除.", username);
            throw new ServiceException(MessageUtils.message("user.password.delete"));
        }
        else if (UserStatus.DISABLE.getCode().equals(user.getStatus()))
        {
            log.info("登录用户:{} 已被停用.", username);
            throw new ServiceException(MessageUtils.message("user.blocked"));
        }
        String[] split = username.split("_");
        username = split[0];
        String type = split[1];
        if("1".equals(type)){
            SysUser user = userService.selectUserByUserName(username);
            if (StringUtils.isNull(user))
            {
                log.info("登录用户:{} 不存在.", username);
                throw new ServiceException(MessageUtils.message("user.not.exists"));
            }
            else if (UserStatus.DELETED.getCode().equals(user.getDelFlag()))
            {
                log.info("登录用户:{} 已被删除.", username);
                throw new ServiceException(MessageUtils.message("user.password.delete"));
            }
            else if (UserStatus.DISABLE.getCode().equals(user.getStatus()))
            {
                log.info("登录用户:{} 已被停用.", username);
                throw new ServiceException(MessageUtils.message("user.blocked"));
            }
        passwordService.validate(user);
            passwordService.validate(user);
        return createLoginUser(user);
            return createLoginUser(user);
        }else {
            TAppUser user = appUserService.getOne(Wrappers.<TAppUser>lambdaQuery().eq(TAppUser::getAccount,username));
            if (StringUtils.isNull(user))
            {
                log.info("登录用户:{} 不存在.", username);
                throw new ServiceException(MessageUtils.message("user.not.exists"));
            }
            else if (user.getDisabled())
            {
                log.info("登录用户:{} 已被删除.", username);
                throw new ServiceException(MessageUtils.message("user.password.delete"));
            }
            else if (UserStatus.DISABLE.getCode().equals(user.getStatus()))
            {
                log.info("登录用户:{} 已被停用.", username);
                throw new ServiceException(MessageUtils.message("user.blocked"));
            }
            passwordService.validateApp(user);
            TAppUserResp appUserResp = new TAppUserResp();
            BeanUtils.copyProperties(user,appUserResp);
            return createLoginUserApp(appUserResp);
        }
    }
    public UserDetails createLoginUser(SysUser user)
    {
        return new LoginUser(user.getUserId(), user.getDeptId(), user, permissionService.getMenuPermission(user));
    }
    public UserDetails createLoginUserApp(TAppUserResp user)
    {
        return new LoginUserApplet(user.getId(), null, user, null);
    }
}
ruoyi-system/src/main/java/com/ruoyi/system/model/TAppUser.java
@@ -53,7 +53,7 @@
    @TableField("team_id")
    private String teamId;
    @ApiModelProperty(value = "状态 1=启用 0=禁用")
    @ApiModelProperty(value = "状态 1=启用 2=禁用")
    @TableField("status")
    private Integer status;
@@ -65,5 +65,9 @@
    @TableField("other_count")
    private Integer otherCount;
    @ApiModelProperty(value = "审核状态 0=待审核 1=通过 2=拒绝")
    @TableField("state")
    private Integer state;
}
ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml
@@ -23,11 +23,6 @@
        <result property="updateBy"     column="update_by"    />
        <result property="updateTime"   column="update_time"  />
        <result property="remark"       column="remark"       />
        <result property="ifBlack"       column="ifBlack"       />
        <result property="districtId"       column="districtId"       />
        <result property="roleType"       column="role_type"       />
        <result property="signPicture"       column="sign_picture"       />
        <result property="allocateIp"       column="allocateIp"       />
        <association property="dept"    javaType="SysDept"         resultMap="deptResult" />
        <collection  property="roles"   javaType="java.util.List"  resultMap="RoleResult" />
    </resultMap>
@@ -52,8 +47,8 @@
    </resultMap>
    
    <sql id="selectUserVo">
        select u.user_id, u.dept_id, u.user_name, u.nick_name, u.email, u.avatar, u.phonenumber, u.password,u.sign_picture AS signPicture,
               u.sex, u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark,u.role_type,u.allocateIp,
        select u.user_id, u.dept_id, u.user_name, u.nick_name, u.email, u.avatar, u.phonenumber, u.password,
               u.sex, u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark,
        d.dept_id, d.parent_id, d.ancestors, d.dept_name, d.order_num, d.leader, d.status as dept_status,
        r.role_id, r.role_name, r.role_key, r.role_sort, r.data_scope, r.status as role_status
        from sys_user u
@@ -135,9 +130,7 @@
    <select id="selectUserById" parameterType="Long" resultType="com.ruoyi.common.core.domain.entity.SysUser">
        select u.user_id AS userId, u.dept_id AS deptId, u.user_name AS userName, u.nick_name AS nickName, u.email AS email, u.avatar AS avatar,
               u.phonenumber AS phonenumber, u.sex AS sex, u.status AS status, u.del_flag AS delFlag, u.login_ip AS loginIp,
               u.login_date AS loginDate, u.create_by AS createBy, u.create_time AS createTime, u.remark AS remark,u.ifBlack AS ifBlack,
               u.districtId AS districtId,u.sign_picture AS signPicture,
               u.role_type AS roleType,u.allocateIp AS allocateIp,
               u.login_date AS loginDate, u.create_by AS createBy, u.create_time AS createTime, u.remark AS remark,
               ur.role_id AS roleId,sr.role_name AS roleName,u.deptName as deptName
        from sys_user u
        left join sys_user_role ur on u.user_id = ur.user_id
@@ -168,7 +161,7 @@
    <select id="selectList" resultType="com.ruoyi.common.core.domain.entity.SysUser">
        select u.user_id AS userId, u.dept_id AS deptId, u.user_name AS userName, u.nick_name AS nickName, u.email AS email, u.avatar AS avatar,
               u.phonenumber AS phonenumber, u.sex AS sex, u.status AS status, u.del_flag AS delFlag, u.login_ip AS loginIp,
               u.login_date AS loginDate, u.create_by AS createBy, u.create_time AS createTime, u.remark AS remark,u.ifBlack AS ifBlack, u.districtId AS districtId
               u.login_date AS loginDate, u.create_by AS createBy, u.create_time AS createTime, u.remark AS remark
        from sys_user u
        WHERE u.del_flag = 0
    </select>
@@ -184,7 +177,7 @@
    <select id="selectListByNamePhone" resultType="com.ruoyi.common.core.domain.entity.SysUser">
        select u.user_id AS userId, u.dept_id AS deptId, u.user_name AS userName, u.nick_name AS nickName, u.email AS email, u.avatar AS avatar,
        u.phonenumber AS phonenumber, u.sex AS sex, u.status AS status, u.del_flag AS delFlag, u.login_ip AS loginIp,
        u.login_date AS loginDate, u.create_by AS createBy, u.create_time AS createTime, u.remark AS remark,u.ifBlack AS ifBlack, u.districtId AS districtId
        u.login_date AS loginDate, u.create_by AS createBy, u.create_time AS createTime, u.remark AS remark
        from sys_user u
        WHERE u.del_flag = 0
        <if test="name != null and name != ''">
@@ -231,9 +224,8 @@
        select u.user_id AS userId, u.dept_id AS deptId, u.user_name AS userName, u.nick_name AS nickName, u.email AS email,
               u.avatar AS avatar,u.disable_remark AS disableRemark,u.phonenumber AS phonenumber, u.sex AS sex, u.status AS status,
               u.del_flag AS delFlag, u.login_ip AS loginIp,u.operating_time AS operatingTime,u.operating_person AS operatingPerson,
               u.login_date AS loginDate, u.create_by AS createBy, u.create_time AS createTime, u.remark AS remark,u.ifBlack AS ifBlack,
               u.districtId AS districtId,u.role_type AS roleType,u.allocateIp AS allocateIp,r.role_id AS roleId, r.role_name AS roleName,
               r.role_key AS roleKey, r.role_sort AS roleSort, r.data_scope AS dataScope, r.status as role_status,u.deptName as deptName
               u.login_date AS loginDate, u.create_by AS createBy, u.create_time AS createTime, u.remark AS remark,r.role_id AS roleId, r.role_name AS roleName,
               r.role_key AS roleKey, r.role_sort AS roleSort, r.data_scope AS dataScope, r.status as role_status
        from sys_user u
        left join sys_user_role ur on u.user_id = ur.user_id
        left join sys_role r on r.role_id = ur.role_id
@@ -265,8 +257,7 @@
    <select id="listByRole" resultType="com.ruoyi.common.core.domain.entity.SysUser">
        select u.user_id AS userId, u.dept_id AS deptId, u.user_name AS userName, u.nick_name AS nickName, u.email AS email, u.avatar AS avatar,
               u.phonenumber AS phonenumber, u.sex AS sex, u.status AS status, u.del_flag AS delFlag, u.login_ip AS loginIp,
               u.login_date AS loginDate, u.create_by AS createBy, u.create_time AS createTime, u.remark AS remark,u.ifBlack AS ifBlack,
               u.districtId AS districtId, u.role_type AS roleType,r.role_id AS roleId
               u.login_date AS loginDate, u.create_by AS createBy, u.create_time AS createTime, u.remark AS remark,r.role_id AS roleId
        from sys_user u
        left join sys_user_role ur on u.user_id = ur.user_id
        left join sys_role r on r.role_id = ur.role_id
@@ -282,7 +273,7 @@
    <select id="selectListByNameAndUserIds" resultType="com.ruoyi.common.core.domain.entity.SysUser">
        select u.user_id AS userId, u.dept_id AS deptId, u.user_name AS userName, u.nick_name AS nickName, u.email AS email, u.avatar AS avatar,
               u.phonenumber AS phonenumber, u.sex AS sex, u.status AS status, u.del_flag AS delFlag, u.login_ip AS loginIp,
               u.login_date AS loginDate, u.create_by AS createBy, u.create_time AS createTime, u.remark AS remark,u.ifBlack AS ifBlack, u.districtId AS districtId
               u.login_date AS loginDate, u.create_by AS createBy, u.create_time AS createTime, u.remark AS remark
        from sys_user u
        WHERE u.del_flag = 0
        <if test="userIds != null and userIds.size()>0">
@@ -317,10 +308,6 @@
             <if test="status != null and status != ''">status,</if>
             <if test="createBy != null and createBy != ''">create_by,</if>
             <if test="remark != null and remark != ''">remark,</if>
             <if test="ifBlack != null">ifBlack,</if>
             <if test="districtId != null">districtId,</if>
             <if test="roleType != null">role_type,</if>
             <if test="allocateIp != null">allocateIp,</if>
        <if test="userIdentification != null and userIdentification != ''">userIdentification,</if>
             create_time
         )values(
@@ -337,10 +324,6 @@
             <if test="status != null and status != ''">#{status},</if>
             <if test="createBy != null and createBy != ''">#{createBy},</if>
             <if test="remark != null and remark != ''">#{remark},</if>
            <if test="ifBlack != null">#{ifBlack},</if>
            <if test="districtId != null">#{districtId},</if>
            <if test="roleType != null">#{roleType},</if>
            <if test="allocateIp != null">#{allocateIp},</if>
            <if test="userIdentification != null and userIdentification != ''">#{userIdentification},</if>
             sysdate()
         )
@@ -363,13 +346,7 @@
             <if test="loginDate != null">login_date = #{loginDate},</if>
             <if test="updateBy != null and updateBy != ''">update_by = #{updateBy},</if>
             <if test="remark != null">remark = #{remark},</if>
            <if test="ifBlack != null">ifBlack = #{ifBlack},</if>
            <if test="districtId != null">districtId = #{districtId},</if>
            <if test="disableRemark != null">disable_remark = #{disableRemark},</if>
            <if test="operatingTime != null">operating_time = #{operatingTime},</if>
            <if test="operatingPerson != null">operating_person = #{operatingPerson},</if>
            <if test="roleType != null">role_type = #{roleType},</if>
            <if test="allocateIp != null">allocateIp = #{allocateIp},</if>
             update_time = sysdate()
         </set>
         where user_id = #{userId}