chore: 合并 master 分支

This commit is contained in:
Ray.Hao
2025-03-06 20:43:05 +08:00
41 changed files with 633 additions and 1037 deletions

View File

@@ -21,7 +21,7 @@ import java.util.List;
/**
* 日志控制层
*
* @author Ray
* @author Ray.Hao
* @since 2.10.0
*/
@Tag(name = "13.日志接口")

View File

@@ -25,11 +25,11 @@ public interface UserMapper extends BaseMapper<User> {
/**
* 获取用户分页列表
*
* @param page 分页参数
* @param page 分页参数
* @param queryParams 查询参数
* @return 用户分页列表
*/
@DataPermission(deptAlias = "u")
@DataPermission(deptAlias = "u", userAlias = "u")
Page<UserBO> getUserPage(Page<UserBO> page, UserPageQuery queryParams);
/**
@@ -70,7 +70,7 @@ public interface UserMapper extends BaseMapper<User> {
* @param queryParams 查询参数
* @return 导出用户列表
*/
@DataPermission(deptAlias = "u")
@DataPermission(deptAlias = "u", userAlias = "u")
List<UserExportDTO> listExportUsers(UserPageQuery queryParams);
/**

View File

@@ -1,9 +1,8 @@
package com.youlai.boot.system.model.bo;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.util.Date;
import java.time.LocalDateTime;
/**
* 用户持久化对象
@@ -67,6 +66,5 @@ public class UserBO {
/**
* 创建时间
*/
@JsonFormat(pattern = "yyyy-MM-dd")
private Date createTime;
private LocalDateTime createTime;
}

View File

@@ -2,7 +2,6 @@ package com.youlai.boot.system.model.entity;
import com.baomidou.mybatisplus.annotation.*;
import com.youlai.boot.common.enums.LogModuleEnum;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serializable;

View File

@@ -28,6 +28,9 @@ public class DictForm {
@Schema(description = "字典编码", example ="gender")
private String dictCode;
@Schema(description = "备注")
private String remark;
@Schema(description = "字典状态1-启用0-禁用)", example = "1")
@Range(min = 0, max = 1, message = "字典状态不正确")
private Integer status;

View File

@@ -1,6 +1,7 @@
package com.youlai.boot.system.model.form;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import lombok.Data;
/**
@@ -14,9 +15,11 @@ import lombok.Data;
public class EmailUpdateForm {
@Schema(description = "邮箱")
@NotBlank(message = "邮箱不能为空")
private String email;
@Schema(description = "验证码")
@NotBlank(message = "验证码不能为空")
private String code;
}

View File

@@ -1,6 +1,7 @@
package com.youlai.boot.system.model.form;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import lombok.Data;
/**
@@ -14,9 +15,11 @@ import lombok.Data;
public class MobileUpdateForm {
@Schema(description = "手机号码")
@NotBlank(message = "手机号码不能为空")
private String mobile;
@Schema(description = "验证码")
@NotBlank(message = "验证码不能为空")
private String code;
}

View File

@@ -1,23 +0,0 @@
package com.youlai.boot.system.model.form;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
/**
* 重置密码表单
*
* @author Ray
* @since 2024/8/13
*/
@Schema(description = "重置密码表单")
@Data
public class PasswordResetForm {
@Schema(description = "用户ID")
private Long userId;
@Schema(description = "密码")
private String password;
}

View File

@@ -4,7 +4,7 @@ import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.util.Date;
import java.time.LocalDateTime;
/**
* 用户分页视图对象
@@ -48,6 +48,6 @@ public class UserPageVO {
@Schema(description="创建时间")
@JsonFormat(pattern = "yyyy/MM/dd HH:mm")
private Date createTime;
private LocalDateTime createTime;
}

View File

@@ -10,7 +10,7 @@ import java.util.List;
/**
* 访问趋势VO
*
* @author Ray
* @author Ray.Hao
* @since 2.3.0
*/
@Schema(description = "访问趋势VO")
@@ -24,9 +24,6 @@ public class VisitTrendVO {
@Schema(description = "浏览量(PV)")
private List<Integer> pvList;
@Schema(description = "访客数(UV)")
private List<Integer> uvList;
@Schema(description = "IP数")
private List<Integer> ipList;

View File

@@ -241,13 +241,13 @@ public class MenuServiceImpl extends ServiceImpl<MenuMapper, Menu> implements Me
MenuTypeEnum menuType = menuForm.getType();
if (menuType == MenuTypeEnum.CATALOG) { // 如果是外链
if (menuType == MenuTypeEnum.CATALOG) { // 如果是目录
String path = menuForm.getRoutePath();
if (menuForm.getParentId() == 0 && !path.startsWith("/")) {
menuForm.setRoutePath("/" + path); // 一级目录需以 / 开头
}
menuForm.setComponent("Layout");
} else if (menuType == MenuTypeEnum.EXTLINK) { // 如果是目录
} else if (menuType == MenuTypeEnum.EXTLINK) { // 如果是外链
menuForm.setComponent(null);
}

View File

@@ -50,11 +50,8 @@ import java.util.stream.Collectors;
public class NoticeServiceImpl extends ServiceImpl<NoticeMapper, Notice> implements NoticeService {
private final NoticeConverter noticeConverter;
private final UserNoticeService userNoticeService;
private final UserService userService;
private final SimpMessagingTemplate messagingTemplate;
private final OnlineUserService onlineUserService;
@@ -266,10 +263,9 @@ public class NoticeServiceImpl extends ServiceImpl<NoticeMapper, Notice> impleme
}
/**
* 阅读获取通知公告详情
*
* @param id 通知公告ID
* @return
* @return NoticeDetailVO 通知公告详情
*/
@Override
public NoticeDetailVO getNoticeDetail(Long id) {

View File

@@ -67,7 +67,7 @@ public class RoleServiceImpl extends ServiceImpl<RoleMapper, Role> implements Ro
.like(Role::getCode, keywords)
)
.ne(!SecurityUtils.isRoot(), Role::getCode, SystemConstants.ROOT_ROLE_CODE) // 非超级管理员不显示超级管理员角色
.orderByDesc(Role::getCreateTime).orderByDesc(Role::getUpdateTime)
.orderByAsc(Role::getSort).orderByDesc(Role::getCreateTime).orderByDesc(Role::getUpdateTime)
);
// 实体转换

View File

@@ -10,29 +10,29 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.youlai.boot.common.constant.RedisConstants;
import com.youlai.boot.common.constant.SystemConstants;
import com.youlai.boot.core.security.manager.TokenManager;
import com.youlai.boot.common.exception.BusinessException;
import com.youlai.boot.common.model.Option;
import com.youlai.boot.core.security.manager.TokenManager;
import com.youlai.boot.core.security.service.PermissionService;
import com.youlai.boot.core.security.util.SecurityUtils;
import com.youlai.boot.shared.mail.service.MailService;
import com.youlai.boot.shared.sms.enums.SmsTypeEnum;
import com.youlai.boot.shared.sms.service.SmsService;
import com.youlai.boot.system.converter.UserConverter;
import com.youlai.boot.system.enums.DictCodeEnum;
import com.youlai.boot.system.mapper.UserMapper;
import com.youlai.boot.system.model.bo.UserBO;
import com.youlai.boot.system.model.dto.UserAuthInfo;
import com.youlai.boot.system.model.dto.UserExportDTO;
import com.youlai.boot.system.model.entity.DictData;
import com.youlai.boot.system.model.entity.User;
import com.youlai.boot.system.model.entity.UserRole;
import com.youlai.boot.system.model.form.*;
import com.youlai.boot.system.converter.UserConverter;
import com.youlai.boot.common.exception.BusinessException;
import com.youlai.boot.system.model.vo.UserProfileVO;
import com.youlai.boot.core.security.util.SecurityUtils;
import com.youlai.boot.system.mapper.UserMapper;
import com.youlai.boot.system.model.dto.UserAuthInfo;
import com.youlai.boot.system.model.bo.UserBO;
import com.youlai.boot.system.model.query.UserPageQuery;
import com.youlai.boot.system.model.dto.UserExportDTO;
import com.youlai.boot.system.model.vo.UserInfoVO;
import com.youlai.boot.system.model.vo.UserPageVO;
import com.youlai.boot.core.security.service.PermissionService;
import com.youlai.boot.system.service.RoleService;
import com.youlai.boot.system.service.UserRoleService;
import com.youlai.boot.system.service.UserService;
import com.youlai.boot.system.model.vo.UserProfileVO;
import com.youlai.boot.system.service.*;
import lombok.RequiredArgsConstructor;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.security.crypto.password.PasswordEncoder;
@@ -69,6 +69,8 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
private final TokenManager tokenManager;
private final DictDataService dictDataService;
private final UserConverter userConverter;
/**
@@ -274,7 +276,15 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
*/
@Override
public List<UserExportDTO> listExportUsers(UserPageQuery queryParams) {
return this.baseMapper.listExportUsers(queryParams);
List<UserExportDTO> userExportDTOS = this.baseMapper.listExportUsers(queryParams);
//获取角色的字典数据
List<DictData> list = dictDataService.list(new LambdaQueryWrapper<DictData>().eq(DictData::getDictCode, DictCodeEnum.GENDER.getValue()));
Map<String, String> genderMap = list.stream().collect(Collectors.toMap(DictData::getValue, DictData::getLabel));
userExportDTOS.forEach(userExportDTO -> {
String genderLabel = genderMap.get(userExportDTO.getGender());
userExportDTO.setGender(genderLabel);
});
return null;
}
/**
@@ -441,9 +451,14 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
String redisCacheKey = RedisConstants.SMS_CHANGE_CODE_PREFIX + mobile;
String cachedVerifyCode = redisTemplate.opsForValue().get(redisCacheKey);
if (StrUtil.isBlank(cachedVerifyCode)) {
throw new BusinessException("验证码已过期");
}
if (!inputVerifyCode.equals(cachedVerifyCode)) {
throw new BusinessException("验证码错误");
}
// 验证完成删除验证码
redisTemplate.delete(redisCacheKey);
// 更新手机号码
return this.update(
@@ -495,9 +510,15 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
String redisCacheKey = RedisConstants.EMAIL_CHANGE_CODE_PREFIX + email;
String cachedVerifyCode = redisTemplate.opsForValue().get(redisCacheKey);
if (StrUtil.isBlank(cachedVerifyCode)) {
throw new BusinessException("验证码已过期");
}
if (!inputVerifyCode.equals(cachedVerifyCode)) {
throw new BusinessException("验证码错误");
}
// 验证完成删除验证码
redisTemplate.delete(redisCacheKey);
// 更新邮箱地址
return this.update(