提交 d32ebd37 authored 作者: hzh's avatar hzh

Merge branch 'dev'

package org.dromara.server.api;
import org.dromara.server.api.domain.RemoteUserProfileAdd;
/**
* 远程用户配置服务
*
* @author wenhe
*/
public interface RemoteUserProfileService {
/**
* 创建小程序用户
*
* @param vo 新增相关数据
* @return boolean 是否成功
*/
boolean createUser(RemoteUserProfileAdd vo);
}
package org.dromara.server.api.domain;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serial;
import java.io.Serializable;
/**
* @author hzh
* @date 2024-11-14
* @desc 新增用户
**/
@Data
@Accessors(chain = true)
public class RemoteUserProfileAdd implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 租户编码
*/
@NotEmpty(message = "租户编码不能为空")
private String tenantId;
/**
* 系统用户id
*/
@NotNull(message = "系统用户id不能为空")
private Long systemUserId;
/**
* 用户名
*/
@NotEmpty(message = "用户名不能为空")
private String name;
/**
* 手机号
*/
@NotEmpty(message = "手机号不能为空")
private String phoneNumber;
}
...@@ -68,7 +68,7 @@ public interface RemoteUserService { ...@@ -68,7 +68,7 @@ public interface RemoteUserService {
* @param remoteUserBo 用户信息 * @param remoteUserBo 用户信息
* @return 结果 * @return 结果
*/ */
Boolean registerUserInfo(RemoteUserBo remoteUserBo) throws UserException, ServiceException; Long registerUserInfo(RemoteUserBo remoteUserBo) throws UserException, ServiceException;
/** /**
* 注册用户信息 * 注册用户信息
......
...@@ -28,6 +28,11 @@ public class RemoteTenantVo implements Serializable { ...@@ -28,6 +28,11 @@ public class RemoteTenantVo implements Serializable {
*/ */
private String tenantId; private String tenantId;
/**
* 企业码
*/
private String companyCode;
/** /**
* 联系人 * 联系人
*/ */
...@@ -98,4 +103,9 @@ public class RemoteTenantVo implements Serializable { ...@@ -98,4 +103,9 @@ public class RemoteTenantVo implements Serializable {
*/ */
private String status; private String status;
/**
* 是否虚拟租户(0否 1是)
*/
private Boolean virtual;
} }
...@@ -25,6 +25,11 @@ public class LoginUser implements Serializable { ...@@ -25,6 +25,11 @@ public class LoginUser implements Serializable {
*/ */
private String tenantId; private String tenantId;
/**
* 是否是虚拟租户
*/
private Boolean tenantVirtual;
/** /**
* 用户ID * 用户ID
*/ */
......
...@@ -191,10 +191,15 @@ public class TokenController { ...@@ -191,10 +191,15 @@ public class TokenController {
/** /**
* 登录页面租户下拉框 * 登录页面租户下拉框
* *
* @param request 请求
* @param virtual 是否虚拟租户,默认为false
* @param phone 手机号
* @return 租户列表 * @return 租户列表
*/ */
@GetMapping("/tenant/list") @GetMapping("/tenant/list")
public R<LoginTenantVo> tenantList(HttpServletRequest request, @RequestParam(value = "phone", required = false) String phone) throws Exception { public R<LoginTenantVo> tenantList(HttpServletRequest request,
@RequestParam(value = "virtual", defaultValue = "false") Boolean virtual,
@RequestParam(value = "phone", required = false) String phone) throws Exception {
// 返回对象 // 返回对象
LoginTenantVo result = new LoginTenantVo(); LoginTenantVo result = new LoginTenantVo();
boolean enable = TenantHelper.isEnable(); boolean enable = TenantHelper.isEnable();
...@@ -233,7 +238,8 @@ public class TokenController { ...@@ -233,7 +238,8 @@ public class TokenController {
} }
// 根据域名进行筛选 // 根据域名进行筛选
List<TenantListVo> list = StreamUtils.filter(voList, vo -> List<TenantListVo> list = StreamUtils.filter(voList, vo ->
StringUtils.equals(vo.getDomain(), host)); StringUtils.equals(vo.getDomain(), host)&&
virtual.equals(vo.getVirtual()));
result.setVoList(CollUtil.isNotEmpty(list) ? list : voList); result.setVoList(CollUtil.isNotEmpty(list) ? list : voList);
return R.ok(result); return R.ok(result);
} }
......
...@@ -15,6 +15,11 @@ public class TenantListVo { ...@@ -15,6 +15,11 @@ public class TenantListVo {
*/ */
private String tenantId; private String tenantId;
/**
* 企业码
*/
private String companyCode;
/** /**
* 企业名称 * 企业名称
*/ */
...@@ -30,4 +35,9 @@ public class TenantListVo { ...@@ -30,4 +35,9 @@ public class TenantListVo {
*/ */
private Boolean showed; private Boolean showed;
/**
* 是否虚拟租户(0否 1是)
*/
private Boolean virtual;
} }
package org.dromara.auth.form; package org.dromara.auth.form;
import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Pattern;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import org.dromara.common.core.constant.RegexConstants;
import org.dromara.common.core.domain.model.LoginBody; import org.dromara.common.core.domain.model.LoginBody;
import org.hibernate.validator.constraints.Length; import org.hibernate.validator.constraints.Length;
...@@ -27,10 +29,15 @@ public class RegisterBody extends LoginBody { ...@@ -27,10 +29,15 @@ public class RegisterBody extends LoginBody {
/** /**
* 用户密码 * 用户密码
*/ */
@NotBlank(message = "{user.password.not.blank}")
@Length(min = PASSWORD_MIN_LENGTH, max = PASSWORD_MAX_LENGTH, message = "{user.password.length.valid}")
private String password; private String password;
/**
* 用户手机号
*/
@NotBlank(message = "{user.phone.not.blank}")
@Pattern(regexp = RegexConstants.MOBILE, message = "{user.phone.length.valid}")
private String phone;
/** /**
* 用户类型 * 用户类型
*/ */
......
package org.dromara.auth.service; package org.dromara.auth.service;
import cn.dev33.satoken.exception.NotLoginException; import cn.dev33.satoken.exception.NotLoginException;
import cn.dev33.satoken.secure.BCrypt;
import cn.dev33.satoken.stp.StpUtil; import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import com.baomidou.lock.annotation.Lock4j; import com.baomidou.lock.annotation.Lock4j;
import io.seata.spring.annotation.GlobalTransactional;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import me.zhyd.oauth.model.AuthUser; import me.zhyd.oauth.model.AuthUser;
...@@ -33,6 +33,8 @@ import org.dromara.common.redis.utils.RedisUtils; ...@@ -33,6 +33,8 @@ import org.dromara.common.redis.utils.RedisUtils;
import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.common.tenant.exception.TenantException; import org.dromara.common.tenant.exception.TenantException;
import org.dromara.common.tenant.helper.TenantHelper; import org.dromara.common.tenant.helper.TenantHelper;
import org.dromara.server.api.RemoteUserProfileService;
import org.dromara.server.api.domain.RemoteUserProfileAdd;
import org.dromara.system.api.RemoteSocialService; import org.dromara.system.api.RemoteSocialService;
import org.dromara.system.api.RemoteTenantService; import org.dromara.system.api.RemoteTenantService;
import org.dromara.system.api.RemoteUserService; import org.dromara.system.api.RemoteUserService;
...@@ -65,6 +67,8 @@ public class SysLoginService { ...@@ -65,6 +67,8 @@ public class SysLoginService {
private RemoteTenantService remoteTenantService; private RemoteTenantService remoteTenantService;
@DubboReference @DubboReference
private RemoteSocialService remoteSocialService; private RemoteSocialService remoteSocialService;
@DubboReference
private RemoteUserProfileService remoteUserProfileService;
@Autowired @Autowired
private UserPasswordProperties userPasswordProperties; private UserPasswordProperties userPasswordProperties;
...@@ -135,10 +139,13 @@ public class SysLoginService { ...@@ -135,10 +139,13 @@ public class SysLoginService {
/** /**
* 注册 * 注册
*/ */
@GlobalTransactional(rollbackFor = Exception.class)
public void register(RegisterBody registerBody) { public void register(RegisterBody registerBody) {
String tenantId = registerBody.getTenantId(); String tenantId = registerBody.getTenantId();
String username = registerBody.getUsername(); String username = registerBody.getUsername();
String password = registerBody.getPassword(); String password = registerBody.getPassword();
String phone = registerBody.getPhone();
// 校验用户类型是否存在 // 校验用户类型是否存在
String userType = UserType.getUserType(registerBody.getUserType()).getUserType(); String userType = UserType.getUserType(registerBody.getUserType()).getUserType();
...@@ -151,15 +158,26 @@ public class SysLoginService { ...@@ -151,15 +158,26 @@ public class SysLoginService {
// 注册用户信息 // 注册用户信息
RemoteUserBo remoteUserBo = new RemoteUserBo(); RemoteUserBo remoteUserBo = new RemoteUserBo();
remoteUserBo.setTenantId(tenantId); remoteUserBo.setTenantId(tenantId);
remoteUserBo.setUserName(username); remoteUserBo.setUserName(StringUtils.isNotEmpty(phone) ? phone : username);
remoteUserBo.setNickName(username); remoteUserBo.setNickName(username);
remoteUserBo.setPassword(BCrypt.hashpw(password)); remoteUserBo.setPassword(password);
remoteUserBo.setUserType(userType); remoteUserBo.setUserType(userType);
remoteUserBo.setPhonenumber(phone);
boolean regFlag = remoteUserService.registerUserInfo(remoteUserBo); Long userId = remoteUserService.registerUserInfo(remoteUserBo);
if (!regFlag) { if (userId==null) {
throw new UserException("user.register.error"); throw new UserException("user.register.error");
} }
//创建用户信息
remoteUserProfileService.createUser(
new RemoteUserProfileAdd()
.setTenantId(tenantId)
.setName(username)
.setPhoneNumber(phone)
.setSystemUserId(userId)
);
recordLogininfor(tenantId, username, Constants.REGISTER, MessageUtils.message("user.register.success")); recordLogininfor(tenantId, username, Constants.REGISTER, MessageUtils.message("user.register.success"));
} }
......
...@@ -13,6 +13,7 @@ import org.dromara.common.core.constant.UserConstants; ...@@ -13,6 +13,7 @@ import org.dromara.common.core.constant.UserConstants;
import org.dromara.common.core.enums.UserType; import org.dromara.common.core.enums.UserType;
import org.dromara.system.api.model.LoginUser; import org.dromara.system.api.model.LoginUser;
import java.util.Optional;
import java.util.Set; import java.util.Set;
/** /**
...@@ -132,6 +133,13 @@ public class LoginHelper { ...@@ -132,6 +133,13 @@ public class LoginHelper {
return Convert.toStr(getExtra(DEPT_NAME_KEY)); return Convert.toStr(getExtra(DEPT_NAME_KEY));
} }
/**
* 获取是否是虚拟租户
*/
public static Boolean isVirtual() {
return Optional.ofNullable(getLoginUser()).map(LoginUser::getTenantVirtual).orElse(false);
}
/** /**
* 获取部门类别编码 * 获取部门类别编码
*/ */
......
...@@ -4,7 +4,7 @@ import ${packageName}.domain.${ClassName}; ...@@ -4,7 +4,7 @@ import ${packageName}.domain.${ClassName};
import ${packageName}.domain.vo.${ClassName}Vo; import ${packageName}.domain.vo.${ClassName}Vo;
import ${packageName}.domain.bo.${ClassName}Bo; import ${packageName}.domain.bo.${ClassName}Bo;
import ${packageName}.domain.${ClassName}; import ${packageName}.domain.${ClassName};
import org.dromara.server.base.IBaseService; import org.dromara.common.mybatis.service.IBaseService;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
......
...@@ -16,7 +16,7 @@ import ${packageName}.domain.vo.${ClassName}Vo; ...@@ -16,7 +16,7 @@ import ${packageName}.domain.vo.${ClassName}Vo;
import ${packageName}.domain.${ClassName}; import ${packageName}.domain.${ClassName};
import ${packageName}.mapper.${ClassName}Mapper; import ${packageName}.mapper.${ClassName}Mapper;
import ${packageName}.service.I${ClassName}Service; import ${packageName}.service.I${ClassName}Service;
import org.dromara.server.base.AbstractBaseService; import org.dromara.common.mybatis.service.AbstractBaseService;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
import java.util.List; import java.util.List;
......
package org.dromara.server.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.bean.BeanUtil;
import lombok.RequiredArgsConstructor;
import org.dromara.common.core.domain.R;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.common.web.core.BaseController;
import org.dromara.server.domain.bo.UserProfileBo;
import org.dromara.server.domain.vo.UserProfileUpdateTrainInfo;
import org.dromara.server.domain.vo.UserProfileVo;
import org.dromara.server.service.IUserProfileService;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
/**
* 用户信息
* 前端访问路由地址为:/server/profile
*
* @author hzh
* @date 2025-01-13
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/profile")
public class UserProfileController extends BaseController {
private final IUserProfileService userProfileService;
/**
* 查询用户信息列表
*/
@SaCheckPermission("server:profile:list")
@GetMapping("/list")
public TableDataInfo<UserProfileVo> list(UserProfileBo bo, PageQuery pageQuery) {
return userProfileService.queryPageList(bo, pageQuery);
}
/**
* 获取个人信息
*/
@GetMapping("/userInfo")
public R<UserProfileVo> getUserInfo() {
return R.ok(userProfileService.getOne(new UserProfileBo().setSystemUserId(LoginHelper.getUserId())));
}
/**
* 跟新12306账号信息
*/
@PostMapping("/updateTrainInfo")
public R<Boolean> updateTrainInfo(@Validated @RequestBody UserProfileUpdateTrainInfo bo) {
UserProfileVo up = userProfileService.getOne(new UserProfileBo().setSystemUserId(LoginHelper.getUserId()));
up.setTrainAccount(bo.getTrainAccount());
up.setTrainPassword(bo.getTrainPassword());
return R.ok(userProfileService.updateByBo(BeanUtil.copyProperties(up, UserProfileBo.class)));
}
}
package org.dromara.server.domain;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.dromara.common.tenant.core.TenantEntity;
import java.io.Serial;
/**
* 用户信息对象 user_profile
*
* @author hzh
* @date 2025-01-13
*/
@Data
@Accessors(chain = true)
@EqualsAndHashCode(callSuper = true)
@TableName("user_profile")
public class UserProfile extends TenantEntity {
@Serial
private static final long serialVersionUID = 1L;
/**
* 用户ID
*/
@TableId(value = "id")
private Long id;
/**
* 系统用户id
*/
private Long systemUserId;
/**
* 姓名
*/
private String name;
/**
* 手机号码
*/
private String phonenumber;
/**
* 分享人id
*/
private Long shareUserId;
/**
* 分享人租户编码
*/
private String shareTenantId;
/**
* 火车票账号
*/
private String trainAccount;
/**
* 火车票密码
*/
private String trainPassword;
/**
* 删除标志(0代表存在 2代表删除)
*/
@TableLogic
private String delFlag;
/**
* 备注
*/
private String remark;
}
package org.dromara.server.domain.bo;
import io.github.linpeilie.annotations.AutoMapper;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import org.dromara.server.domain.UserProfile;
/**
* 用户信息业务对象 user_profile
*
* @author hzh
* @date 2025-01-13
*/
@Data
@Accessors(chain = true)
@EqualsAndHashCode(callSuper = true)
@AutoMapper(target = UserProfile.class, reverseConvertGenerate = false)
public class UserProfileBo extends BaseEntity {
/**
* 用户ID
*/
@NotNull(message = "用户ID不能为空", groups = {EditGroup.class})
private Long id;
/**
* 租户编码
*/
private String tenantId;
/**
* 系统用户id
*/
@NotNull(message = "系统用户id不能为空", groups = {AddGroup.class, EditGroup.class})
private Long systemUserId;
/**
* 姓名
*/
@NotBlank(message = "姓名不能为空", groups = {AddGroup.class, EditGroup.class})
private String name;
/**
* 手机号码
*/
@NotBlank(message = "手机号码不能为空", groups = {AddGroup.class, EditGroup.class})
private String phonenumber;
/**
* 分享人id
*/
@NotNull(message = "分享人id不能为空", groups = {AddGroup.class, EditGroup.class})
private Long shareUserId;
/**
* 分享人租户编码
*/
private String shareTenantId;
/**
* 火车票账号
*/
private String trainAccount;
/**
* 火车票密码
*/
private String trainPassword;
/**
* 备注
*/
@NotBlank(message = "备注不能为空", groups = {AddGroup.class, EditGroup.class})
private String remark;
}
package org.dromara.server.domain.vo;
import jakarta.validation.constraints.NotEmpty;
import lombok.Data;
/**
* @author hzh
* @date 2025-01-14
**/
@Data
public class UserProfileUpdateTrainInfo {
/**
* 火车票账号
*/
@NotEmpty(message = "12306账号不能为空")
private String trainAccount;
/**
* 火车票密码
*/
@NotEmpty(message = "12306密码不能为空")
private String trainPassword;
}
package org.dromara.server.domain.vo;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import org.dromara.server.domain.UserProfile;
import java.io.Serial;
import java.io.Serializable;
/**
* 用户信息视图对象 user_profile
*
* @author hzh
* @date 2025-01-13
*/
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = UserProfile.class)
public class UserProfileVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 用户ID
*/
@ExcelProperty(value = "用户ID")
private Long id;
/**
* 系统用户id
*/
@ExcelProperty(value = "系统用户id")
private Long systemUserId;
/**
* 姓名
*/
@ExcelProperty(value = "姓名")
private String name;
/**
* 手机号码
*/
@ExcelProperty(value = "手机号码")
private String phonenumber;
/**
* 分享人id
*/
@ExcelProperty(value = "分享人id")
private Long shareUserId;
/**
* 分享人租户编码
*/
@ExcelProperty(value = "分享人租户编码")
private String shareTenantId;
/**
* 火车票账号
*/
@ExcelProperty(value = "火车票账号")
private String trainAccount;
/**
* 火车票密码
*/
@ExcelProperty(value = "火车票密码")
private String trainPassword;
/**
* 备注
*/
@ExcelProperty(value = "备注")
private String remark;
}
package org.dromara.server.dubbo;
import cn.hutool.core.bean.BeanUtil;
import io.github.linpeilie.utils.CollectionUtils;
import lombok.RequiredArgsConstructor;
import org.apache.dubbo.config.annotation.DubboService;
import org.dromara.common.core.utils.ValidatorUtils;
import org.dromara.server.api.RemoteUserProfileService;
import org.dromara.server.api.domain.RemoteUserProfileAdd;
import org.dromara.server.domain.bo.UserProfileBo;
import org.dromara.server.domain.vo.UserProfileVo;
import org.dromara.server.service.IUserProfileService;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @author hzh
* @date 2025-01-13
* @desc 用户服务实现类
**/
@RequiredArgsConstructor
@Service
@DubboService
public class RemoteUserProfileServiceImpl implements RemoteUserProfileService {
private final IUserProfileService userService;
@Override
public boolean createUser(RemoteUserProfileAdd vo) {
ValidatorUtils.validate(vo);
UserProfileBo up = new UserProfileBo()
.setName(vo.getName())
.setPhonenumber(vo.getPhoneNumber());
up.setTenantId(vo.getTenantId());
List<UserProfileVo> list = userService.queryList(up);
if (CollectionUtils.isNotEmpty(list)) {
return true;
}
//创建用户信息
UserProfileBo profile = BeanUtil.copyProperties(vo, UserProfileBo.class);
profile.setPhonenumber(vo.getPhoneNumber());
userService.insertByBo(profile);
return true;
}
}
package org.dromara.server.mapper;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
import org.dromara.server.domain.UserProfile;
import org.dromara.server.domain.vo.UserProfileVo;
/**
* 用户信息Mapper接口
*
* @author hzh
* @date 2025-01-13
*/
public interface UserProfileMapper extends BaseMapperPlus<UserProfile, UserProfileVo> {
}
package org.dromara.server.service;
import org.dromara.common.mybatis.service.IBaseService;
import org.dromara.server.domain.UserProfile;
import org.dromara.server.domain.bo.UserProfileBo;
import org.dromara.server.domain.vo.UserProfileVo;
/**
* 用户信息Service接口
*
* @author hzh
* @date 2025-01-13
*/
public interface IUserProfileService extends IBaseService<UserProfileVo, UserProfileBo, UserProfile> {
}
package org.dromara.server.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
import org.dromara.common.mybatis.service.AbstractBaseService;
import org.dromara.server.domain.UserProfile;
import org.dromara.server.domain.bo.UserProfileBo;
import org.dromara.server.domain.vo.UserProfileVo;
import org.dromara.server.mapper.UserProfileMapper;
import org.dromara.server.service.IUserProfileService;
import org.springframework.stereotype.Service;
import java.util.Map;
/**
* 用户信息Service业务层处理
*
* @author hzh
* @date 2025-01-13
*/
@RequiredArgsConstructor
@Service
public class UserProfileServiceImpl extends AbstractBaseService<UserProfileVo, UserProfileBo, UserProfile> implements IUserProfileService {
private final UserProfileMapper baseMapper;
@Override
public BaseMapperPlus<UserProfile, UserProfileVo> mapper() {
return baseMapper;
}
@Override
public LambdaQueryWrapper<UserProfile> buildQueryWrapper(UserProfileBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<UserProfile> lqw = Wrappers.lambdaQuery();
lqw.eq(bo.getSystemUserId() != null, UserProfile::getSystemUserId, bo.getSystemUserId());
lqw.like(StringUtils.isNotBlank(bo.getName()), UserProfile::getName, bo.getName());
lqw.eq(StringUtils.isNotBlank(bo.getPhonenumber()), UserProfile::getPhonenumber, bo.getPhonenumber());
lqw.eq(bo.getShareUserId() != null, UserProfile::getShareUserId, bo.getShareUserId());
lqw.eq(StringUtils.isNotBlank(bo.getShareTenantId()), UserProfile::getShareTenantId, bo.getShareTenantId());
lqw.eq(StringUtils.isNotBlank(bo.getTrainAccount()), UserProfile::getTrainAccount, bo.getTrainAccount());
lqw.eq(StringUtils.isNotBlank(bo.getTrainPassword()), UserProfile::getTrainPassword, bo.getTrainPassword());
return lqw;
}
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.dromara.server.mapper.UserProfileMapper">
</mapper>
...@@ -61,6 +61,9 @@ public class SysUserController extends BaseController { ...@@ -61,6 +61,9 @@ public class SysUserController extends BaseController {
@SaCheckPermission("system:user:list") @SaCheckPermission("system:user:list")
@GetMapping("/list") @GetMapping("/list")
public TableDataInfo<SysUserVo> list(SysUserBo user, PageQuery pageQuery) { public TableDataInfo<SysUserVo> list(SysUserBo user, PageQuery pageQuery) {
if (LoginHelper.isVirtual()) {
user.setUserId(-1L);
}
return userService.selectPageUserList(user, pageQuery); return userService.selectPageUserList(user, pageQuery);
} }
...@@ -115,6 +118,7 @@ public class SysUserController extends BaseController { ...@@ -115,6 +118,7 @@ public class SysUserController extends BaseController {
return R.fail("没有权限访问用户数据!"); return R.fail("没有权限访问用户数据!");
} }
user.setRoles(roleService.selectRolesByUserId(user.getUserId())); user.setRoles(roleService.selectRolesByUserId(user.getUserId()));
user.setVirtual(LoginHelper.isVirtual());
userInfoVo.setUser(user); userInfoVo.setUser(user);
userInfoVo.setPermissions(loginUser.getMenuPermission()); userInfoVo.setPermissions(loginUser.getMenuPermission());
userInfoVo.setRoles(loginUser.getRolePermission()); userInfoVo.setRoles(loginUser.getRolePermission());
......
package org.dromara.system.domain; package org.dromara.system.domain;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic; import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
...@@ -34,6 +35,11 @@ public class SysTenant extends BaseEntity { ...@@ -34,6 +35,11 @@ public class SysTenant extends BaseEntity {
*/ */
private String tenantId; private String tenantId;
/**
* 企业码
*/
private String companyCode;
/** /**
* 联系人 * 联系人
*/ */
...@@ -99,6 +105,12 @@ public class SysTenant extends BaseEntity { ...@@ -99,6 +105,12 @@ public class SysTenant extends BaseEntity {
*/ */
private Long accountCount; private Long accountCount;
/**
* 是否虚拟租户(0否 1是)
*/
@TableField(value = "`virtual`")
private Boolean virtual;
/** /**
* 租户状态(0正常 1停用) * 租户状态(0正常 1停用)
*/ */
......
...@@ -34,6 +34,11 @@ public class SysTenantBo extends BaseEntity { ...@@ -34,6 +34,11 @@ public class SysTenantBo extends BaseEntity {
*/ */
private String tenantId; private String tenantId;
/**
* 企业码
*/
private String companyCode;
/** /**
* 联系人 * 联系人
*/ */
...@@ -99,6 +104,12 @@ public class SysTenantBo extends BaseEntity { ...@@ -99,6 +104,12 @@ public class SysTenantBo extends BaseEntity {
*/ */
private String remark; private String remark;
/**
* 是否虚拟租户(0否 1是)
*/
@NotNull(message = "是否虚拟租户不能为空", groups = { AddGroup.class })
private Boolean virtual;
/** /**
* 租户套餐编号 * 租户套餐编号
*/ */
......
...@@ -50,6 +50,12 @@ public class SysTenantVo implements Serializable { ...@@ -50,6 +50,12 @@ public class SysTenantVo implements Serializable {
@ExcelProperty(value = "联系电话") @ExcelProperty(value = "联系电话")
private String contactPhone; private String contactPhone;
/**
* 企业码
*/
@ExcelProperty(value = "企业码")
private String companyCode;
/** /**
* 企业名称 * 企业名称
*/ */
...@@ -125,5 +131,11 @@ public class SysTenantVo implements Serializable { ...@@ -125,5 +131,11 @@ public class SysTenantVo implements Serializable {
@ExcelDictFormat(readConverterExp = "0=正常,1=停用") @ExcelDictFormat(readConverterExp = "0=正常,1=停用")
private String status; private String status;
/**
* 是否虚拟租户(0否 1是)
*/
@ExcelProperty(value = "是否虚拟租户", converter = ExcelDictConvert.class)
@ExcelDictFormat(readConverterExp = "false=否,true=是")
private Boolean virtual;
} }
...@@ -38,6 +38,11 @@ public class SysUserVo implements Serializable { ...@@ -38,6 +38,11 @@ public class SysUserVo implements Serializable {
*/ */
private String tenantId; private String tenantId;
/**
* 是否是虚拟用户
*/
private Boolean virtual;
/** /**
* 部门ID * 部门ID
*/ */
......
package org.dromara.system.dubbo; package org.dromara.system.dubbo;
import cn.dev33.satoken.secure.BCrypt;
import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.lang.Opt; import cn.hutool.core.lang.Opt;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
...@@ -15,6 +16,7 @@ import org.dromara.common.core.exception.ServiceException; ...@@ -15,6 +16,7 @@ import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.core.exception.user.UserException; import org.dromara.common.core.exception.user.UserException;
import org.dromara.common.core.utils.DateUtils; import org.dromara.common.core.utils.DateUtils;
import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.SpringUtils;
import org.dromara.common.core.utils.StringUtils; import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.helper.DataPermissionHelper; import org.dromara.common.mybatis.helper.DataPermissionHelper;
import org.dromara.common.tenant.helper.TenantHelper; import org.dromara.common.tenant.helper.TenantHelper;
...@@ -30,15 +32,13 @@ import org.dromara.system.api.model.XcxLoginUser; ...@@ -30,15 +32,13 @@ import org.dromara.system.api.model.XcxLoginUser;
import org.dromara.system.domain.SysUser; import org.dromara.system.domain.SysUser;
import org.dromara.system.domain.bo.SysUserBo; import org.dromara.system.domain.bo.SysUserBo;
import org.dromara.system.domain.bo.WxUserBo; import org.dromara.system.domain.bo.WxUserBo;
import org.dromara.system.domain.vo.SysDeptVo; import org.dromara.system.domain.vo.*;
import org.dromara.system.domain.vo.SysRoleVo;
import org.dromara.system.domain.vo.SysUserVo;
import org.dromara.system.domain.vo.WxUserVo;
import org.dromara.system.mapper.SysUserMapper; import org.dromara.system.mapper.SysUserMapper;
import org.dromara.system.service.*; import org.dromara.system.service.*;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.List; import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
...@@ -59,6 +59,7 @@ public class RemoteUserServiceImpl implements RemoteUserService { ...@@ -59,6 +59,7 @@ public class RemoteUserServiceImpl implements RemoteUserService {
private final ISysDeptService deptService; private final ISysDeptService deptService;
private final IWxUserService wxUserService; private final IWxUserService wxUserService;
private final SysUserMapper userMapper; private final SysUserMapper userMapper;
private final ISysTenantService tenantService;
@DubboReference @DubboReference
private RemoteServerService remoteServerService; private RemoteServerService remoteServerService;
...@@ -193,7 +194,12 @@ public class RemoteUserServiceImpl implements RemoteUserService { ...@@ -193,7 +194,12 @@ public class RemoteUserServiceImpl implements RemoteUserService {
* @return 结果 * @return 结果
*/ */
@Override @Override
public Boolean registerUserInfo(RemoteUserBo remoteUserBo) throws UserException, ServiceException { public Long registerUserInfo(RemoteUserBo remoteUserBo) throws UserException, ServiceException {
//密码为空使用初始化密码
String initPassword =TenantHelper.dynamic(remoteUserBo.getTenantId(),()-> SpringUtils.getBean(ISysConfigService.class).selectConfigByKey("sys.user.initPassword"));
String password = StringUtils.isEmpty(remoteUserBo.getPassword()) ? initPassword : remoteUserBo.getPassword();
remoteUserBo.setPassword(BCrypt.hashpw(password));
SysUserBo sysUserBo = MapstructUtils.convert(remoteUserBo, SysUserBo.class); SysUserBo sysUserBo = MapstructUtils.convert(remoteUserBo, SysUserBo.class);
String username = sysUserBo.getUserName(); String username = sysUserBo.getUserName();
boolean exist = TenantHelper.dynamic(remoteUserBo.getTenantId(), () -> { boolean exist = TenantHelper.dynamic(remoteUserBo.getTenantId(), () -> {
...@@ -206,7 +212,8 @@ public class RemoteUserServiceImpl implements RemoteUserService { ...@@ -206,7 +212,8 @@ public class RemoteUserServiceImpl implements RemoteUserService {
if (exist) { if (exist) {
throw new UserException("user.register.save.error", username); throw new UserException("user.register.save.error", username);
} }
return userService.registerUser(sysUserBo, remoteUserBo.getTenantId()); userService.registerUser(sysUserBo, remoteUserBo.getTenantId());
return sysUserBo.getUserId();
} }
@Override @Override
...@@ -282,6 +289,7 @@ public class RemoteUserServiceImpl implements RemoteUserService { ...@@ -282,6 +289,7 @@ public class RemoteUserServiceImpl implements RemoteUserService {
private LoginUser buildLoginUser(SysUserVo userVo) { private LoginUser buildLoginUser(SysUserVo userVo) {
LoginUser loginUser = new LoginUser(); LoginUser loginUser = new LoginUser();
loginUser.setTenantId(userVo.getTenantId()); loginUser.setTenantId(userVo.getTenantId());
loginUser.setTenantVirtual(Optional.ofNullable(tenantService.queryByTenantId(loginUser.getTenantId())).map(SysTenantVo::getVirtual).orElse(false));
loginUser.setUserId(userVo.getUserId()); loginUser.setUserId(userVo.getUserId());
loginUser.setDeptId(userVo.getDeptId()); loginUser.setDeptId(userVo.getDeptId());
loginUser.setUsername(userVo.getUserName()); loginUser.setUsername(userVo.getUserName());
......
...@@ -112,6 +112,7 @@ public class SysTenantServiceImpl implements ISysTenantService { ...@@ -112,6 +112,7 @@ public class SysTenantServiceImpl implements ISysTenantService {
lqw.eq(StringUtils.isNotBlank(bo.getAddress()), SysTenant::getAddress, bo.getAddress()); lqw.eq(StringUtils.isNotBlank(bo.getAddress()), SysTenant::getAddress, bo.getAddress());
lqw.eq(StringUtils.isNotBlank(bo.getIntro()), SysTenant::getIntro, bo.getIntro()); lqw.eq(StringUtils.isNotBlank(bo.getIntro()), SysTenant::getIntro, bo.getIntro());
lqw.like(StringUtils.isNotBlank(bo.getDomain()), SysTenant::getDomain, bo.getDomain()); lqw.like(StringUtils.isNotBlank(bo.getDomain()), SysTenant::getDomain, bo.getDomain());
lqw.eq(bo.getVirtual() != null, SysTenant::getVirtual, bo.getVirtual());
lqw.eq(bo.getPackageId() != null, SysTenant::getPackageId, bo.getPackageId()); lqw.eq(bo.getPackageId() != null, SysTenant::getPackageId, bo.getPackageId());
lqw.eq(bo.getExpireTime() != null, SysTenant::getExpireTime, bo.getExpireTime()); lqw.eq(bo.getExpireTime() != null, SysTenant::getExpireTime, bo.getExpireTime());
lqw.eq(bo.getAccountCount() != null, SysTenant::getAccountCount, bo.getAccountCount()); lqw.eq(bo.getAccountCount() != null, SysTenant::getAccountCount, bo.getAccountCount());
...@@ -130,9 +131,18 @@ public class SysTenantServiceImpl implements ISysTenantService { ...@@ -130,9 +131,18 @@ public class SysTenantServiceImpl implements ISysTenantService {
// 获取所有租户编号 // 获取所有租户编号
List<String> tenantIds = baseMapper.selectObjs( List<String> tenantIds = baseMapper.selectObjs(
new LambdaQueryWrapper<SysTenant>().select(SysTenant::getTenantId), x -> {return Convert.toStr(x);}); new LambdaQueryWrapper<SysTenant>().select(SysTenant::getTenantId), x -> {
return Convert.toStr(x);
});
//获取所有租户公司码
List<String> companyCodes = baseMapper.selectObjs(
new LambdaQueryWrapper<SysTenant>().select(SysTenant::getCompanyCode), x -> {
return Convert.toStr(x);
});
String tenantId = generateTenantId(tenantIds); String tenantId = generateTenantId(tenantIds);
String companyCode = generateTenantId(companyCodes);
add.setTenantId(tenantId); add.setTenantId(tenantId);
add.setCompanyCode(companyCode);
boolean flag = baseMapper.insert(add) > 0; boolean flag = baseMapper.insert(add) > 0;
if (!flag) { if (!flag) {
throw new ServiceException("创建租户失败"); throw new ServiceException("创建租户失败");
...@@ -278,6 +288,8 @@ public class SysTenantServiceImpl implements ISysTenantService { ...@@ -278,6 +288,8 @@ public class SysTenantServiceImpl implements ISysTenantService {
SysTenant tenant = MapstructUtils.convert(bo, SysTenant.class); SysTenant tenant = MapstructUtils.convert(bo, SysTenant.class);
tenant.setTenantId(null); tenant.setTenantId(null);
tenant.setPackageId(null); tenant.setPackageId(null);
tenant.setCompanyCode(null);
tenant.setVirtual(null);
return baseMapper.updateById(tenant) > 0; return baseMapper.updateById(tenant) > 0;
} }
......
...@@ -337,6 +337,7 @@ public class SysUserServiceImpl implements ISysUserService { ...@@ -337,6 +337,7 @@ public class SysUserServiceImpl implements ISysUserService {
if (result) { if (result) {
saveOrUpdateYsUser(sysUser); saveOrUpdateYsUser(sysUser);
} }
user.setUserId(sysUser.getUserId());
return result; return result;
} }
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论