|
@@ -9,16 +9,23 @@ import com.citu.framework.common.enums.TerminalEnum;
|
|
import com.citu.framework.common.enums.UserTypeEnum;
|
|
import com.citu.framework.common.enums.UserTypeEnum;
|
|
import com.citu.framework.common.pojo.PageResult;
|
|
import com.citu.framework.common.pojo.PageResult;
|
|
import com.citu.framework.common.util.object.BeanUtils;
|
|
import com.citu.framework.common.util.object.BeanUtils;
|
|
|
|
+import com.citu.framework.datapermission.core.util.DataPermissionUtils;
|
|
import com.citu.module.menduner.system.controller.admin.user.vo.*;
|
|
import com.citu.module.menduner.system.controller.admin.user.vo.*;
|
|
import com.citu.module.menduner.system.convert.MdeAuthConvert;
|
|
import com.citu.module.menduner.system.convert.MdeAuthConvert;
|
|
import com.citu.module.menduner.system.dal.dataobject.user.MdeUserDO;
|
|
import com.citu.module.menduner.system.dal.dataobject.user.MdeUserDO;
|
|
import com.citu.module.menduner.system.dal.mysql.user.MdeUserMapper;
|
|
import com.citu.module.menduner.system.dal.mysql.user.MdeUserMapper;
|
|
|
|
+import com.citu.module.menduner.system.service.permission.MdePermissionService;
|
|
|
|
+import com.citu.module.menduner.system.service.permission.MdePermissionServiceImpl;
|
|
import com.citu.module.system.api.sms.SmsCodeApi;
|
|
import com.citu.module.system.api.sms.SmsCodeApi;
|
|
import com.citu.module.system.api.sms.dto.code.SmsCodeUseReqDTO;
|
|
import com.citu.module.system.api.sms.dto.code.SmsCodeUseReqDTO;
|
|
import com.citu.module.system.api.social.SocialClientApi;
|
|
import com.citu.module.system.api.social.SocialClientApi;
|
|
import com.citu.module.system.api.social.dto.SocialWxPhoneNumberInfoRespDTO;
|
|
import com.citu.module.system.api.social.dto.SocialWxPhoneNumberInfoRespDTO;
|
|
import com.citu.module.system.enums.sms.SmsSceneEnum;
|
|
import com.citu.module.system.enums.sms.SmsSceneEnum;
|
|
import com.google.common.annotations.VisibleForTesting;
|
|
import com.google.common.annotations.VisibleForTesting;
|
|
|
|
+import com.mzt.logapi.context.LogRecordContext;
|
|
|
|
+import com.mzt.logapi.service.impl.DiffParseFunction;
|
|
|
|
+import com.mzt.logapi.starter.annotation.LogRecord;
|
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
import org.springframework.security.crypto.password.PasswordEncoder;
|
|
import org.springframework.security.crypto.password.PasswordEncoder;
|
|
import org.springframework.stereotype.Service;
|
|
import org.springframework.stereotype.Service;
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
@@ -30,6 +37,8 @@ import java.time.LocalDateTime;
|
|
import static com.citu.framework.common.exception.util.ServiceExceptionUtil.exception;
|
|
import static com.citu.framework.common.exception.util.ServiceExceptionUtil.exception;
|
|
import static com.citu.framework.common.util.servlet.ServletUtils.getClientIP;
|
|
import static com.citu.framework.common.util.servlet.ServletUtils.getClientIP;
|
|
import static com.citu.module.menduner.system.enums.ErrorCodeConstants.*;
|
|
import static com.citu.module.menduner.system.enums.ErrorCodeConstants.*;
|
|
|
|
+import static com.citu.module.menduner.system.enums.MdeLogRecordConstants.*;
|
|
|
|
+import static com.citu.module.system.enums.ErrorCodeConstants.USER_USERNAME_EXISTS;
|
|
|
|
|
|
/**
|
|
/**
|
|
* 门墩儿-用户登录 Service 实现类
|
|
* 门墩儿-用户登录 Service 实现类
|
|
@@ -43,6 +52,9 @@ public class MdeUserServiceImpl implements MdeUserService {
|
|
@Resource
|
|
@Resource
|
|
private MdeUserMapper mdeUserMapper;
|
|
private MdeUserMapper mdeUserMapper;
|
|
|
|
|
|
|
|
+ @Resource
|
|
|
|
+ private MdePermissionService mdePermissionService;
|
|
|
|
+
|
|
@Resource
|
|
@Resource
|
|
private PasswordEncoder passwordEncoder;
|
|
private PasswordEncoder passwordEncoder;
|
|
|
|
|
|
@@ -52,39 +64,123 @@ public class MdeUserServiceImpl implements MdeUserService {
|
|
@Resource
|
|
@Resource
|
|
private SocialClientApi socialClientApi;
|
|
private SocialClientApi socialClientApi;
|
|
|
|
|
|
|
|
+
|
|
@Override
|
|
@Override
|
|
@Transactional(rollbackFor = Exception.class)
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
|
+ @LogRecord(type = MDE_USER_TYPE, subType = MDE_USER_CREATE_SUB_TYPE, bizNo = "{{#user.id}}",
|
|
|
|
+ success = MDE_USER_CREATE_SUCCESS)
|
|
public Long createMdeUser(MdeUserSaveReqVO createReqVO) {
|
|
public Long createMdeUser(MdeUserSaveReqVO createReqVO) {
|
|
- // 插入
|
|
|
|
- MdeUserDO mdeUser = BeanUtils.toBean(createReqVO, MdeUserDO.class);
|
|
|
|
- mdeUserMapper.insert(mdeUser);
|
|
|
|
- // 返回
|
|
|
|
- return mdeUser.getId();
|
|
|
|
|
|
+ // 1.2 校验正确性
|
|
|
|
+ validateUserForCreateOrUpdate(null, createReqVO.getUsername(),
|
|
|
|
+ createReqVO.getPhone(), createReqVO.getEmail());
|
|
|
|
+ // 2.1 插入用户
|
|
|
|
+ MdeUserDO user = BeanUtils.toBean(createReqVO, MdeUserDO.class);
|
|
|
|
+ user.setStatus(CommonStatusEnum.ENABLE.getStatus()); // 默认开启
|
|
|
|
+ user.setPassword(encodePassword(createReqVO.getPassword())); // 加密密码
|
|
|
|
+ mdeUserMapper.insert(user);
|
|
|
|
+ // 2.2 绑定默认角色
|
|
|
|
+ mdePermissionService.assignUserRoleByDefault(user.getId());
|
|
|
|
+ // 3. 记录操作日志上下文
|
|
|
|
+ LogRecordContext.putVariable("mde-user", user);
|
|
|
|
+ return user.getId();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private MdeUserDO validateUserForCreateOrUpdate(Long id, String username, String mobile, String email) {
|
|
|
|
+ // 关闭数据权限,避免因为没有数据权限,查询不到数据,进而导致唯一校验不正确
|
|
|
|
+ return DataPermissionUtils.executeIgnore(() -> {
|
|
|
|
+ // 校验用户存在
|
|
|
|
+ MdeUserDO user = validateUserExists(id);
|
|
|
|
+ // 校验用户名唯一
|
|
|
|
+ validateUsernameUnique(id, username);
|
|
|
|
+ // 校验手机号唯一
|
|
|
|
+ validatePhoneUnique(id, mobile);
|
|
|
|
+ // 校验邮箱唯一
|
|
|
|
+ validateEmailUnique(id, email);
|
|
|
|
+ return user;
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @VisibleForTesting
|
|
|
|
+ void validateEmailUnique(Long id, String email) {
|
|
|
|
+ if (StrUtil.isBlank(email)) {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ MdeUserDO user = mdeUserMapper.selectByEmail(email);
|
|
|
|
+ if (user == null) {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ // 如果 id 为空,说明不用比较是否为相同 id 的用户
|
|
|
|
+ if (id == null) {
|
|
|
|
+ throw exception(MDE_USER_EMAIL_EXISTS);
|
|
|
|
+ }
|
|
|
|
+ if (!user.getId().equals(id)) {
|
|
|
|
+ throw exception(MDE_USER_EMAIL_EXISTS);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @VisibleForTesting
|
|
|
|
+ void validateUsernameUnique(Long id, String username) {
|
|
|
|
+ if (StrUtil.isBlank(username)) {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ MdeUserDO user = mdeUserMapper.selectByUsername(username);
|
|
|
|
+ if (user == null) {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ // 如果 id 为空,说明不用比较是否为相同 id 的用户
|
|
|
|
+ if (id == null) {
|
|
|
|
+ throw exception(USER_USERNAME_EXISTS);
|
|
|
|
+ }
|
|
|
|
+ if (!user.getId().equals(id)) {
|
|
|
|
+ throw exception(USER_USERNAME_EXISTS);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
@Override
|
|
@Override
|
|
@Transactional(rollbackFor = Exception.class)
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
|
+ @LogRecord(type = MDE_USER_TYPE, subType = MDE_USER_UPDATE_SUB_TYPE, bizNo = "{{#updateReqVO.id}}",
|
|
|
|
+ success = MDE_USER_UPDATE_SUCCESS)
|
|
public void updateMdeUser(MdeUserSaveReqVO updateReqVO) {
|
|
public void updateMdeUser(MdeUserSaveReqVO updateReqVO) {
|
|
- // 校验存在
|
|
|
|
- validateMdeUserExists(updateReqVO.getId());
|
|
|
|
- // 更新
|
|
|
|
|
|
+ updateReqVO.setPassword(null); // 特殊:此处不更新密码
|
|
|
|
+ // 1. 校验正确性
|
|
|
|
+ MdeUserDO oldUser = validateUserForCreateOrUpdate(updateReqVO.getId(), updateReqVO.getUsername(),
|
|
|
|
+ updateReqVO.getPhone(), updateReqVO.getEmail());
|
|
|
|
+
|
|
|
|
+ // 2.1 更新用户
|
|
MdeUserDO updateObj = BeanUtils.toBean(updateReqVO, MdeUserDO.class);
|
|
MdeUserDO updateObj = BeanUtils.toBean(updateReqVO, MdeUserDO.class);
|
|
mdeUserMapper.updateById(updateObj);
|
|
mdeUserMapper.updateById(updateObj);
|
|
|
|
+
|
|
|
|
+ // 3. 记录操作日志上下文
|
|
|
|
+ LogRecordContext.putVariable(DiffParseFunction.OLD_OBJECT, BeanUtils.toBean(oldUser, MdeUserSaveReqVO.class));
|
|
|
|
+ LogRecordContext.putVariable("user", oldUser);
|
|
}
|
|
}
|
|
|
|
|
|
@Override
|
|
@Override
|
|
@Transactional(rollbackFor = Exception.class)
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
|
+ @LogRecord(type = MDE_USER_TYPE, subType = MDE_USER_DELETE_SUB_TYPE, bizNo = "{{#id}}",
|
|
|
|
+ success = MDE_USER_DELETE_SUCCESS)
|
|
public void deleteMdeUser(Long id) {
|
|
public void deleteMdeUser(Long id) {
|
|
// 校验存在
|
|
// 校验存在
|
|
- validateMdeUserExists(id);
|
|
|
|
|
|
+ MdeUserDO user = validateMdeUserExists(id);
|
|
|
|
+ // 2.2 删除用户关联数据
|
|
|
|
+ mdePermissionService.processUserDeleted(id);
|
|
// 删除
|
|
// 删除
|
|
mdeUserMapper.deleteById(id);
|
|
mdeUserMapper.deleteById(id);
|
|
|
|
+
|
|
|
|
+ // 3. 记录操作日志上下文
|
|
|
|
+ LogRecordContext.putVariable("mde-user", user);
|
|
}
|
|
}
|
|
|
|
|
|
- private void validateMdeUserExists(Long id) {
|
|
|
|
- if (mdeUserMapper.selectById(id) == null) {
|
|
|
|
|
|
+ @VisibleForTesting
|
|
|
|
+ private MdeUserDO validateMdeUserExists(Long id) {
|
|
|
|
+ if (id == null) {
|
|
|
|
+ return null;
|
|
|
|
+ }
|
|
|
|
+ MdeUserDO user = mdeUserMapper.selectById(id);
|
|
|
|
+ if (user == null) {
|
|
throw exception(MDE_USER_NOT_EXISTS);
|
|
throw exception(MDE_USER_NOT_EXISTS);
|
|
}
|
|
}
|
|
|
|
+ return user;
|
|
}
|
|
}
|
|
|
|
|
|
@Override
|
|
@Override
|
|
@@ -143,7 +239,8 @@ public class MdeUserServiceImpl implements MdeUserService {
|
|
user.setAvatar(avtar); // 基础信息
|
|
user.setAvatar(avtar); // 基础信息
|
|
|
|
|
|
mdeUserMapper.insert(user);
|
|
mdeUserMapper.insert(user);
|
|
-
|
|
|
|
|
|
+ // 绑定默认角色
|
|
|
|
+ mdePermissionService.assignUserRoleByDefault(user.getId());
|
|
return user;
|
|
return user;
|
|
}
|
|
}
|
|
|
|
|