feat: 编码规范、新增组件

This commit is contained in:
2025-03-28 19:10:50 +08:00
parent 0cf3f99222
commit 7d57dbca27
310 changed files with 990 additions and 432 deletions
@@ -5,8 +5,6 @@ import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* 结果封装类
*/
@@ -1,8 +1,8 @@
package cn.odboy.base;
import com.alibaba.fastjson2.annotation.JSONField;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.EqualsAndHashCode;
import lombok.Getter;
@@ -32,16 +32,12 @@ public class MyEntity extends MyObject {
@TableField(fill = FieldFill.INSERT)
@ApiModelProperty(value = "创建时间: yyyy-MM-dd HH:mm:ss", hidden = true)
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
// @JSONField(format = "yyyy-MM-dd HH:mm:ss")
// @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
private Timestamp createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
@ApiModelProperty(value = "更新时间: yyyy-MM-dd HH:mm:ss", hidden = true)
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
// @JSONField(format = "yyyy-MM-dd HH:mm:ss")
// @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
private Timestamp updateTime;
/* 分组校验 */
@@ -23,4 +23,15 @@ public class SystemConst {
* Token前缀
*/
public static final String TOKEN_PREFIX = "Bearer";
/**
* 小数点
*/
public static final String SYMBOL_DOT = ".";
public static final String SYMBOL_EQUAL = "=";
public static final String SYMBOL_ADD = "+";
public static final String SYMBOL_SUBTRACT = "-";
public static final String SYMBOL_AT = "@";
public static final String PROPERTY_OS_NAME = "os.name";
public static final String OS_NAME_WINDOWS = "Windows";
}
@@ -56,4 +56,9 @@ public interface SystemRedisKey {
* 登录验证码
*/
String CAPTCHA_LOGIN = "captcha::login:";
/**
* 用户信息
*/
String USER_INFO = "user::info:";
}
@@ -89,11 +89,11 @@ public interface EasyMapper<E> extends BaseMapper<E> {
Map<String, Object> result = new ConcurrentHashMap<>(1);
List<E> list = this.selectList(wrapper);
if (CollUtil.isEmpty(list)) {
return new HashMap<>();
return new HashMap<>(3);
}
E tempObj = list.stream().findFirst().orElse(null);
if (tempObj == null) {
return new HashMap<>();
return new HashMap<>(3);
}
Field[] fields = ReflectUtil.getFields(tempObj.getClass());
for (E e : list) {
@@ -109,10 +109,7 @@ public class CmdGenHelper {
// 5.2.Controller策略配置
// 开启生成@RestController控制器
fastAutoGenerator.strategyConfig(strategyConfigBuilder -> strategyConfigBuilder.controllerBuilder().enableRestStyle());
// 如果不需要生成Controller
// fastAutoGenerator.templateConfig(templateConfig -> templateConfig.controller(""));
// 5.3.Service策略配置
// 格式化service接口和实现类的文件名称, 去掉默认的ServiceName前面的I
// 如果不需要生成Controller,fastAutoGenerator.templateConfig(templateConfig -> templateConfig.controller(""))。5.3.Service策略配置:格式化service接口和实现类的文件名称, 去掉默认的ServiceName前面的I
fastAutoGenerator.strategyConfig(strategyConfigBuilder -> strategyConfigBuilder
.serviceBuilder()
.formatServiceFileName("%sService")
@@ -110,10 +110,11 @@ public class MybatisHelper {
if (fieldVal instanceof List) {
List<Object> between = new ArrayList<>((List<?>) fieldVal);
if (CollectionUtil.isNotEmpty(between)) {
if (between.size() >= 2) {
int minSize = 2;
if (between.size() >= minSize) {
queryWrapper.between(finalAttributeName, between.get(0), between.get(1));
} else {
throw new BadRequestException("BETWEEN类型的对象列表长度必须 >= 2");
throw new BadRequestException("BETWEEN类型的对象列表长度必须 >= " + minSize);
}
}
} else {
@@ -215,16 +216,9 @@ public class MybatisHelper {
public static void main(String[] args) {
QueryWrapper<TestDomain> query = new QueryWrapper<TestDomain>();
//query.or();
query.or(wrapper -> wrapper.eq("username", 1).or().eq("nickname", 2));
//query.like("a",1);
//query.or();
//query.like("b",2);
//query.and(wrapper->wrapper.eq("c",1));
query.eq("id", 1);
query.orderByDesc("id");
// query.apply("left join student t1 on t1.id = t1.id");
// query.last("left join student t1 on t1.id = t1.id");
System.err.println("getSqlSelect=================================");
System.err.println(query.getSqlSelect());
System.err.println("getSqlSegment=================================");
@@ -181,8 +181,8 @@ public class RedisConfiguration extends CachingConfigurerSupport {
return null;
}
String str = new String(bytes, StandardCharsets.UTF_8);
// 支持AutoType
return JSON.parseObject(str, clazz, JSONReader.Feature.SupportAutoType);
// 移除对 SupportAutoType 的使用
return JSON.parseObject(str, clazz);
}
}
}
@@ -2,7 +2,6 @@ package cn.odboy.server;
import cn.odboy.constant.SystemConst;
import cn.odboy.util.AnonTagUtil;
import cn.odboy.util.SecurityUtil;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Value;
@@ -85,7 +84,7 @@ public class SwaggerConfig {
private SecurityContext getContextByPath() {
Set<String> urls = AnonTagUtil.getAllAnonymousUrl(applicationContext);
urls = urls.stream().filter(url -> !url.equals("/")).collect(Collectors.toSet());
urls = urls.stream().filter(url -> !"/".equals(url)).collect(Collectors.toSet());
String regExp = "^(?!" + apiPath + String.join("|" + apiPath, urls) + ").*$";
return SecurityContext.builder()
.securityReferences(defaultAuth())
@@ -63,10 +63,10 @@ public class AsyncExecutor implements AsyncConfigurer {
/**
* 自定义线程池,用法,注入到类中使用
* private ThreadPoolTaskExecutor taskExecutor;
*/
@Bean("taskAsync")
public ThreadPoolTaskExecutor taskAsync() {
// 用法 private ThreadPoolTaskExecutor taskExecutor
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(AsyncExecutor.corePoolSize);
executor.setMaxPoolSize(AsyncExecutor.maxPoolSize);
@@ -17,9 +17,6 @@ package cn.odboy.util;
import cn.odboy.base.MyMetaOption;
import com.alibaba.fastjson2.JSON;
import com.google.common.base.Joiner;
import com.google.common.base.Splitter;
import com.google.common.collect.Lists;
import java.lang.reflect.Field;
import java.math.BigDecimal;
@@ -37,7 +34,7 @@ import java.util.stream.Collectors;
*/
public class CollUtil extends cn.hutool.core.collection.CollUtil {
private static <T, K> Predicate<T> distinctPredicate(Function<? super T, ? extends K> keyMapper) {
Map<Object, Boolean> map = new HashMap<>();
Map<Object, Boolean> map = new HashMap<>(3);
return (t) -> null == map.putIfAbsent(keyMapper.apply(t), true);
}
@@ -10,7 +10,7 @@ import java.nio.charset.StandardCharsets;
/**
* DES加密
*/
public class DESEncryptUtil {
public class DesEncryptUtil {
private static final String STR_PARAM = "Passw0rd";
private static final IvParameterSpec IV = new IvParameterSpec(STR_PARAM.getBytes(StandardCharsets.UTF_8));
@@ -5,6 +5,7 @@ import cn.hutool.core.util.IdUtil;
import cn.hutool.poi.excel.BigExcelWriter;
import cn.hutool.poi.excel.ExcelUtil;
import cn.odboy.constant.FileTypeEnum;
import cn.odboy.constant.SystemConst;
import cn.odboy.exception.BadRequestException;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.util.IOUtils;
@@ -25,6 +26,8 @@ import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import static cn.odboy.constant.SystemConst.*;
/**
* File工具类,扩展 hutool 工具包
*/
@@ -175,8 +178,10 @@ public class FileUtil extends cn.hutool.core.io.FileUtil {
if (value instanceof String) {
String strValue = (String) value;
// 检查并处理以特殊字符开头的值
if (strValue.startsWith("=") || strValue.startsWith("+") || strValue.startsWith("-") || strValue.startsWith("@")) {
strValue = "'" + strValue; // 添加单引号前缀
if (strValue.startsWith(SYMBOL_EQUAL) || strValue.startsWith(SYMBOL_ADD)
|| strValue.startsWith(SYMBOL_SUBTRACT) || strValue.startsWith(SYMBOL_AT)) {
// 添加单引号前缀
strValue = "'" + strValue;
}
sanitizedMap.put(key, strValue);
} else {
@@ -346,7 +351,7 @@ public class FileUtil extends cn.hutool.core.io.FileUtil {
// 不允许文件名超过255(在Mac和Linux中)或260(在Windows中)个字符
int maxFileNameLength = 255;
if (System.getProperty("os.name").startsWith("Windows")) {
if (System.getProperty(SystemConst.PROPERTY_OS_NAME).startsWith(SystemConst.OS_NAME_WINDOWS)) {
maxFileNameLength = 260;
}
if (fileName.length() > maxFileNameLength) {
@@ -11,7 +11,7 @@ import java.util.Enumeration;
/**
* IP地址 相关
*/
public class IPUtil {
public class IpUtil {
/**
* 注入bean
*/
@@ -50,7 +50,8 @@ public class ListUtil {
*/
public static void main(String[] args) {
List<MyEntity> entities = new ArrayList<>();
for (int i = 0; i < 50; i++) {
int total = 50;
for (int i = 0; i < total; i++) {
MyEntity entity = new MyEntity();
if (i % 2 == 0) {
entity.setCreateBy("odboy");
@@ -13,7 +13,7 @@ import java.security.spec.X509EncodedKeySpec;
/**
* Rsa 工具类,公钥私钥生成,加解密
*/
public class RSAEncryptUtil {
public class RsaEncryptUtil {
private static final String SRC = "123456";
@@ -34,12 +34,12 @@ public class RSAEncryptUtil {
*/
private static void test1(RsaKeyPair keyPair) throws Exception {
System.out.println("***************** 公钥加密私钥解密开始 *****************");
String text1 = encryptByPublicKey(keyPair.getPublicKey(), RSAEncryptUtil.SRC);
String text1 = encryptByPublicKey(keyPair.getPublicKey(), RsaEncryptUtil.SRC);
String text2 = decryptByPrivateKey(keyPair.getPrivateKey(), text1);
System.out.println("加密前:" + RSAEncryptUtil.SRC);
System.out.println("加密前:" + RsaEncryptUtil.SRC);
System.out.println("加密后:" + text1);
System.out.println("解密后:" + text2);
if (RSAEncryptUtil.SRC.equals(text2)) {
if (RsaEncryptUtil.SRC.equals(text2)) {
System.out.println("解密字符串和原始字符串一致,解密成功");
} else {
System.out.println("解密字符串和原始字符串不一致,解密失败");
@@ -54,12 +54,12 @@ public class RSAEncryptUtil {
*/
private static void test2(RsaKeyPair keyPair) throws Exception {
System.out.println("***************** 私钥加密公钥解密开始 *****************");
String text1 = encryptByPrivateKey(keyPair.getPrivateKey(), RSAEncryptUtil.SRC);
String text1 = encryptByPrivateKey(keyPair.getPrivateKey(), RsaEncryptUtil.SRC);
String text2 = decryptByPublicKey(keyPair.getPublicKey(), text1);
System.out.println("加密前:" + RSAEncryptUtil.SRC);
System.out.println("加密前:" + RsaEncryptUtil.SRC);
System.out.println("加密后:" + text1);
System.out.println("解密后:" + text2);
if (RSAEncryptUtil.SRC.equals(text2)) {
if (RsaEncryptUtil.SRC.equals(text2)) {
System.out.println("解密字符串和原始字符串一致,解密成功");
} else {
System.out.println("解密字符串和原始字符串不一致,解密失败");
@@ -50,7 +50,7 @@ public class ScriptUtil {
ScriptContext newContext = new SimpleScriptContext();
if (compareObj != null) {
Field[] fields = ReflectUtil.getFields(compareObj.getClass());
Map<String, Object> filedNameValueMap = new HashMap<>();
Map<String, Object> filedNameValueMap = new HashMap<>(3);
Arrays.stream(fields).parallel().forEach(f -> filedNameValueMap.put(f.getName(), ReflectUtil.getFieldValue(compareObj, f)));
Set<Map.Entry<String, Object>> entries = filedNameValueMap.entrySet();
long count = entries.stream().filter(f -> f.getValue() != null).count();
@@ -64,12 +64,6 @@ public class ScriptUtil {
});
newContext.setBindings(engineScope, ScriptContext.ENGINE_SCOPE);
}
// if (script.contains(FUNCTION_TAG)) {
// // 由ScriptEngines实现的接口, 其方法允许调用以前已执行的脚本中的过程
// Invocable inv = (Invocable) engine;
// // 调用全局函数, 并传入参数
// inv.invokeFunction("hello", "测试");
// }
// 执行脚本, 注意这里指定新的执行作用域上下文
return engine.eval(script, newContext);
} catch (ScriptException e) {
@@ -10,7 +10,6 @@ import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.stereotype.Component;
@@ -18,9 +18,6 @@ import java.sql.SQLException;
import java.sql.Statement;
import java.util.List;
/**
* @author /
*/
@Slf4j
public class SqlUtil {
/**
@@ -1,4 +1,5 @@
package cn.odboy.websocket.context;
import java.util.Collection;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
@@ -3,16 +3,13 @@ package cn.odboy.websocket.context;
import cn.odboy.websocket.dto.WebSocketMsgDto;
import com.alibaba.fastjson2.JSON;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.ConcurrentHashMap;
@Slf4j
@@ -1,4 +1,4 @@
package cn.odboy.model.job.dto;
package cn.odboy.model.job.request;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@@ -0,0 +1,21 @@
package cn.odboy.model.system.request;
import cn.odboy.base.MyObject;
import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
@Data
@EqualsAndHashCode(callSuper = false)
public class CreateDeptRequest extends MyObject {
@NotBlank(message = "部门名称必填")
private String name;
@NotNull(message = "部门排序必填")
private Integer deptSort;
private Boolean enabled;
private String isTop;
private Long pid;
private Integer subCount = 0;
}
@@ -0,0 +1,22 @@
package cn.odboy.model.system.request;
import cn.odboy.base.MyObject;
import cn.odboy.model.system.domain.Dict;
import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
@Data
@EqualsAndHashCode(callSuper = false)
public class CreateDictDetailRequest extends MyObject {
@NotBlank(message = "参数dict必填")
private Dict dict;
@NotBlank(message = "字典标签必填")
private String label;
@NotBlank(message = "字典值必填")
private String value;
@NotNull(message = "字典排序必填")
private Integer dictSort;
}
@@ -0,0 +1,15 @@
package cn.odboy.model.system.request;
import cn.odboy.base.MyObject;
import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.validation.constraints.NotBlank;
@Data
@EqualsAndHashCode(callSuper = false)
public class CreateDictRequest extends MyObject {
@NotBlank(message = "字典名称必填")
private String name;
private String description;
}
@@ -0,0 +1,18 @@
package cn.odboy.model.system.request;
import cn.odboy.base.MyObject;
import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
@Data
@EqualsAndHashCode(callSuper = false)
public class CreateJobRequest extends MyObject {
@NotBlank(message = "职位名称必填")
private String name;
@NotNull(message = "职位排序必填")
private Integer jobSort;
private Boolean enabled;
}
@@ -0,0 +1,27 @@
package cn.odboy.model.system.request;
import cn.odboy.base.MyObject;
import cn.odboy.model.system.domain.Dept;
import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.util.Set;
@Data
@EqualsAndHashCode(callSuper = false)
public class CreateRoleRequest extends MyObject {
@NotBlank(message = "角色名称必填")
private String name;
@NotNull(message = "角色级别必填")
private Integer level;
@NotBlank(message = "数据范围必填")
private String dataScope;
private String description;
/**
* 关联的部门
*/
private Long id;
private Set<Dept> depts;
}
@@ -1,4 +1,4 @@
package cn.odboy.model.system.dto;
package cn.odboy.model.system.request;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@@ -1,4 +1,4 @@
package cn.odboy.model.system.dto;
package cn.odboy.model.system.request;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@@ -1,4 +1,4 @@
package cn.odboy.model.system.dto;
package cn.odboy.model.system.request;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@@ -1,4 +1,4 @@
package cn.odboy.model.system.dto;
package cn.odboy.model.system.request;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@@ -1,4 +1,4 @@
package cn.odboy.model.system.dto;
package cn.odboy.model.system.request;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@@ -1,4 +1,4 @@
package cn.odboy.model.system.dto;
package cn.odboy.model.system.request;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@@ -1,4 +1,4 @@
package cn.odboy.model.system.dto;
package cn.odboy.model.system.request;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
@@ -8,7 +8,7 @@ import javax.validation.constraints.NotBlank;
@Getter
@Setter
public class UserAuthDto {
public class UserLoginRequest {
@NotBlank
@ApiModelProperty(value = "用户名")
@@ -1,4 +1,4 @@
package cn.odboy.model.system.dto;
package cn.odboy.model.system.request;
import cn.odboy.base.MyObject;
import io.swagger.annotations.ApiModelProperty;
@@ -1,4 +1,4 @@
package cn.odboy.model.system.dto;
package cn.odboy.model.system.response;
import cn.odboy.base.MyObject;
import io.swagger.annotations.ApiModelProperty;
@@ -1,4 +1,4 @@
package cn.odboy.model.system.dto;
package cn.odboy.model.system.response;
import cn.odboy.base.MyObject;
import io.swagger.annotations.ApiModelProperty;
@@ -0,0 +1,42 @@
package cn.odboy.model.system.response;
import cn.odboy.base.MyObject;
import cn.odboy.model.system.domain.Dept;
import cn.odboy.model.system.domain.Job;
import cn.odboy.model.system.domain.Role;
import com.baomidou.mybatisplus.annotation.TableField;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.Set;
@Data
@EqualsAndHashCode(callSuper = false)
public class SimpleUserVo extends MyObject {
@ApiModelProperty(value = "ID", hidden = true)
private Long id;
@ApiModelProperty(value = "用户角色")
private Set<Role> roles;
@ApiModelProperty(value = "用户岗位")
private Set<Job> jobs;
private Long deptId;
@TableField(exist = false)
private Dept dept;
@ApiModelProperty(value = "用户名称")
private String username;
@ApiModelProperty(value = "用户昵称")
private String nickName;
@ApiModelProperty(value = "邮箱")
private String email;
@ApiModelProperty(value = "电话号码")
private String phone;
@ApiModelProperty(value = "用户性别")
private String gender;
@ApiModelProperty(value = "头像真实名称", hidden = true)
private String avatarName;
@ApiModelProperty(value = "是否启用")
private Boolean enabled;
@ApiModelProperty(value = "是否为admin账号", hidden = true)
private Boolean isAdmin = false;
}
@@ -0,0 +1,22 @@
package cn.odboy.model.system.response;
import cn.odboy.base.MyObject;
import cn.odboy.model.system.dto.RoleCodeDto;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
@Data
@EqualsAndHashCode(callSuper = false)
public class UserInfoVo extends MyObject {
private SimpleUserVo user;
private List<Long> dataScopes;
private List<RoleCodeDto> authorities;
public Set<String> getRoles() {
return authorities.stream().map(RoleCodeDto::getAuthority).collect(Collectors.toSet());
}
}
@@ -1,4 +1,4 @@
package cn.odboy.model.system.dto;
package cn.odboy.model.system.response;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@@ -1,4 +1,4 @@
package cn.odboy.model.tools.dto;
package cn.odboy.model.tools.request;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@@ -1,4 +1,4 @@
package cn.odboy.model.tools.dto;
package cn.odboy.model.tools.request;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@@ -1,7 +1,7 @@
package cn.odboy.application.job.mapper;
import cn.odboy.model.job.domain.QuartzJob;
import cn.odboy.model.job.dto.QuartzJobQueryCriteria;
import cn.odboy.model.job.request.QuartzJobQueryCriteria;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -1,7 +1,7 @@
package cn.odboy.application.job.mapper;
import cn.odboy.model.job.domain.QuartzLog;
import cn.odboy.model.job.dto.QuartzJobQueryCriteria;
import cn.odboy.model.job.request.QuartzJobQueryCriteria;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -6,7 +6,7 @@ import cn.odboy.context.SpringBeanHolder;
import cn.odboy.exception.BadRequestException;
import cn.odboy.model.job.domain.QuartzJob;
import cn.odboy.model.job.domain.QuartzLog;
import cn.odboy.model.job.dto.QuartzJobQueryCriteria;
import cn.odboy.model.job.request.QuartzJobQueryCriteria;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@@ -3,7 +3,7 @@ package cn.odboy.application.job.service;
import cn.odboy.base.PageResult;
import cn.odboy.model.job.domain.QuartzJob;
import cn.odboy.model.job.domain.QuartzLog;
import cn.odboy.model.job.dto.QuartzJobQueryCriteria;
import cn.odboy.model.job.request.QuartzJobQueryCriteria;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
@@ -10,7 +10,7 @@ import cn.odboy.base.PageResult;
import cn.odboy.exception.BadRequestException;
import cn.odboy.model.job.domain.QuartzJob;
import cn.odboy.model.job.domain.QuartzLog;
import cn.odboy.model.job.dto.QuartzJobQueryCriteria;
import cn.odboy.model.job.request.QuartzJobQueryCriteria;
import cn.odboy.util.FileUtil;
import cn.odboy.util.PageUtil;
import cn.odboy.util.RedisUtil;
@@ -3,11 +3,11 @@ package cn.odboy.util;
import lombok.SneakyThrows;
import org.junit.jupiter.api.Test;
import static cn.odboy.util.DESEncryptUtil.desDecrypt;
import static cn.odboy.util.DESEncryptUtil.desEncrypt;
import static cn.odboy.util.DesEncryptUtil.desDecrypt;
import static cn.odboy.util.DesEncryptUtil.desEncrypt;
import static org.junit.jupiter.api.Assertions.assertEquals;
public class DESEncryptUtilTest {
public class DesEncryptUtilTest {
@SneakyThrows
public static void main(String[] args) {
@@ -16,6 +16,4 @@ public class LoginProperties {
* 账号单用户 登录
*/
private boolean singleLogin = false;
public static final String cacheKey = "user_login_cache:";
}
@@ -1,6 +1,5 @@
package cn.odboy.application.core.config;
import cn.odboy.util.SecurityUtil;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
@@ -5,7 +5,6 @@ import cn.odboy.application.core.config.SecurityProperties;
import cn.odboy.application.core.service.impl.UserOnlineServiceImpl;
import cn.odboy.constant.SystemConst;
import cn.odboy.model.system.dto.UserOnlineDto;
import cn.odboy.util.SecurityUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
@@ -8,7 +8,6 @@ import cn.odboy.constant.SystemConst;
import cn.odboy.constant.SystemRedisKey;
import cn.odboy.model.system.dto.UserJwtDto;
import cn.odboy.util.RedisUtil;
import cn.odboy.util.SecurityUtil;
import io.jsonwebtoken.*;
import io.jsonwebtoken.io.Decoders;
import io.jsonwebtoken.security.Keys;
@@ -1,23 +1,24 @@
package cn.odboy.application.core.rest;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.IdUtil;
import cn.odboy.annotation.AnonymousDeleteMapping;
import cn.odboy.annotation.AnonymousGetMapping;
import cn.odboy.annotation.AnonymousPostMapping;
import cn.odboy.application.core.config.CaptchaConfig;
import cn.odboy.application.core.config.LoginProperties;
import cn.odboy.application.core.config.SecurityProperties;
import cn.odboy.application.core.constant.LoginCodeEnum;
import cn.odboy.application.core.context.TokenProvider;
import cn.odboy.application.core.context.UserDetailsHelper;
import cn.odboy.application.core.service.impl.UserDetailsServiceImpl;
import cn.odboy.application.core.service.impl.UserOnlineServiceImpl;
import cn.odboy.constant.SystemConst;
import cn.odboy.constant.SystemRedisKey;
import cn.odboy.exception.BadRequestException;
import cn.odboy.model.system.dto.UserAuthDto;
import cn.odboy.model.system.response.UserInfoVo;
import cn.odboy.model.system.dto.UserJwtDto;
import cn.odboy.model.system.request.UserLoginRequest;
import cn.odboy.properties.RsaProperties;
import cn.odboy.util.RSAEncryptUtil;
import cn.odboy.util.RsaEncryptUtil;
import cn.odboy.util.RedisUtil;
import cn.odboy.util.SecurityUtil;
import cn.odboy.util.StringUtil;
@@ -31,7 +32,6 @@ import org.springframework.http.ResponseEntity;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
@@ -53,32 +53,31 @@ import java.util.concurrent.TimeUnit;
@RequiredArgsConstructor
@Api(tags = "系统:系统授权接口")
public class AuthController {
private final SecurityProperties properties;
private final RedisUtil redisUtil;
private final UserOnlineServiceImpl onlineUserService;
private final TokenProvider tokenProvider;
private final CaptchaConfig captchaConfig;
private final LoginProperties loginProperties;
private final PasswordEncoder passwordEncoder;
private final UserDetailsHelper userDetailsService;
private final UserDetailsServiceImpl userDetailsService;
@ApiOperation("登录授权")
@AnonymousPostMapping(value = "/login")
public ResponseEntity<Object> login(@Validated @RequestBody UserAuthDto authUser, HttpServletRequest request) throws Exception {
public ResponseEntity<Object> login(@Validated @RequestBody UserLoginRequest loginRequest, HttpServletRequest request) throws Exception {
// 密码解密
String password = RSAEncryptUtil.decryptByPrivateKey(RsaProperties.privateKey, authUser.getPassword());
String password = RsaEncryptUtil.decryptByPrivateKey(RsaProperties.privateKey, loginRequest.getPassword());
// 查询验证码
String code = redisUtil.get(authUser.getUuid(), String.class);
String code = redisUtil.get(loginRequest.getUuid(), String.class);
// 清除验证码
redisUtil.del(authUser.getUuid());
redisUtil.del(loginRequest.getUuid());
if (StringUtil.isBlank(code)) {
throw new BadRequestException("验证码不存在或已过期");
}
if (StringUtil.isBlank(authUser.getCode()) || !authUser.getCode().equalsIgnoreCase(code)) {
if (StringUtil.isBlank(loginRequest.getCode()) || !loginRequest.getCode().equalsIgnoreCase(code)) {
throw new BadRequestException("验证码错误");
}
// 获取用户信息
UserJwtDto jwtUser = userDetailsService.loadUserByUsername(authUser.getUsername());
UserJwtDto jwtUser = userDetailsService.loadUserByUsername(loginRequest.getUsername());
// 验证用户密码
if (!passwordEncoder.matches(password, jwtUser.getPassword())) {
throw new BadRequestException("登录密码错误");
@@ -90,11 +89,11 @@ public class AuthController {
// 返回 token 与 用户信息
Map<String, Object> authInfo = new HashMap<>(2) {{
put("token", String.format("%s %s", SystemConst.TOKEN_PREFIX, token));
put("user", jwtUser);
put("user", BeanUtil.copyProperties(jwtUser, UserInfoVo.class));
}};
if (loginProperties.isSingleLogin()) {
// 踢掉之前已经登录的token
onlineUserService.kickOutByUsername(authUser.getUsername());
onlineUserService.kickOutByUsername(loginRequest.getUsername());
}
// 保存在线信息
onlineUserService.save(jwtUser, token, request);
@@ -104,9 +103,10 @@ public class AuthController {
@ApiOperation("获取用户信息")
@GetMapping(value = "/info")
public ResponseEntity<UserDetails> getUserInfo() {
public ResponseEntity<UserInfoVo> getUserInfo() {
UserJwtDto jwtUser = (UserJwtDto) SecurityUtil.getCurrentUser();
return ResponseEntity.ok(jwtUser);
UserInfoVo userInfoVo = BeanUtil.copyProperties(jwtUser, UserInfoVo.class);
return ResponseEntity.ok(userInfoVo);
}
@ApiOperation("获取验证码")
@@ -117,7 +117,7 @@ public class AuthController {
String uuid = SystemRedisKey.CAPTCHA_LOGIN + IdUtil.simpleUUID();
//当验证码类型为 arithmetic时且长度 >= 2 时,captcha.text()的结果有几率为浮点型
String captchaValue = captcha.text();
if (captcha.getCharType() - 1 == LoginCodeEnum.ARITHMETIC.ordinal() && captchaValue.contains(".")) {
if (captcha.getCharType() - 1 == LoginCodeEnum.ARITHMETIC.ordinal() && captchaValue.contains(SystemConst.SYMBOL_DOT)) {
captchaValue = captchaValue.split("\\.")[0];
}
// 保存
@@ -3,7 +3,7 @@ package cn.odboy.application.core.rest;
import cn.odboy.application.core.service.UserOnlineService;
import cn.odboy.base.PageResult;
import cn.odboy.model.system.dto.UserOnlineDto;
import cn.odboy.util.DESEncryptUtil;
import cn.odboy.util.DesEncryptUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
@@ -45,7 +45,7 @@ public class OnlineController {
public ResponseEntity<Object> deleteOnlineUser(@RequestBody Set<String> keys) throws Exception {
for (String token : keys) {
// 解密Key
token = DESEncryptUtil.desDecrypt(token);
token = DesEncryptUtil.desDecrypt(token);
userOnlineService.logoutByToken(token);
}
return new ResponseEntity<>(HttpStatus.OK);
@@ -1,8 +1,8 @@
package cn.odboy.application.core.service.impl;
import cn.hutool.core.util.RandomUtil;
import cn.odboy.application.core.config.LoginProperties;
import cn.odboy.application.core.service.UserCacheService;
import cn.odboy.constant.SystemRedisKey;
import cn.odboy.model.system.dto.UserJwtDto;
import cn.odboy.util.RedisUtil;
import cn.odboy.util.StringUtil;
@@ -24,7 +24,7 @@ public class UserCacheServiceImpl implements UserCacheService {
username = StringUtil.lowerCase(username);
if (StringUtil.isNotEmpty(username)) {
// 获取数据
return redisUtil.get(LoginProperties.cacheKey + username, UserJwtDto.class);
return redisUtil.get(SystemRedisKey.USER_INFO + username, UserJwtDto.class);
}
return null;
}
@@ -37,7 +37,7 @@ public class UserCacheServiceImpl implements UserCacheService {
if (StringUtil.isNotEmpty(userName)) {
// 添加数据, 避免数据同时过期(2小时左右)
long time = 7200 + RandomUtil.randomInt(900, 1800);
redisUtil.set(LoginProperties.cacheKey + userName, user, time);
redisUtil.set(SystemRedisKey.USER_INFO + userName, user, time);
}
}
@@ -48,7 +48,7 @@ public class UserCacheServiceImpl implements UserCacheService {
userName = StringUtil.lowerCase(userName);
if (StringUtil.isNotEmpty(userName)) {
// 清除数据
redisUtil.del(LoginProperties.cacheKey + userName);
redisUtil.del(SystemRedisKey.USER_INFO + userName);
}
}
}
@@ -1,4 +1,4 @@
package cn.odboy.application.core.context;
package cn.odboy.application.core.service.impl;
import cn.odboy.application.core.service.UserCacheService;
import cn.odboy.application.system.service.DataService;
@@ -18,7 +18,7 @@ import java.util.List;
@Slf4j
@RequiredArgsConstructor
@Service("userDetailsService")
public class UserDetailsHelper implements UserDetailsService {
public class UserDetailsServiceImpl implements UserDetailsService {
private final UserService userService;
private final RoleService roleService;
private final DataService dataService;
@@ -34,7 +34,7 @@ public class UserOnlineServiceImpl implements UserOnlineService {
String ip = BrowserUtil.getIp(request);
String id = tokenProvider.getId(token);
String version = BrowserUtil.getVersion(request);
String address = IPUtil.getCityInfo(ip);
String address = IpUtil.getCityInfo(ip);
UserOnlineDto userOnlineDto = null;
try {
userOnlineDto = new UserOnlineDto();
@@ -45,7 +45,7 @@ public class UserOnlineServiceImpl implements UserOnlineService {
userOnlineDto.setBrowser(version);
userOnlineDto.setIp(ip);
userOnlineDto.setAddress(address);
userOnlineDto.setKey(DESEncryptUtil.desEncrypt(token));
userOnlineDto.setKey(DesEncryptUtil.desEncrypt(token));
userOnlineDto.setLoginTime(new Date());
} catch (Exception e) {
log.error(e.getMessage(), e);
@@ -1,7 +1,7 @@
package cn.odboy.application.system.mapper;
import cn.odboy.model.system.domain.Dept;
import cn.odboy.model.system.dto.DeptQueryCriteria;
import cn.odboy.model.system.request.DeptQueryCriteria;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@@ -1,7 +1,7 @@
package cn.odboy.application.system.mapper;
import cn.odboy.model.system.domain.DictDetail;
import cn.odboy.model.system.dto.DictDetailQueryCriteria;
import cn.odboy.model.system.request.DictDetailQueryCriteria;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -1,7 +1,7 @@
package cn.odboy.application.system.mapper;
import cn.odboy.model.system.domain.Dict;
import cn.odboy.model.system.dto.DictQueryCriteria;
import cn.odboy.model.system.request.DictQueryCriteria;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -1,7 +1,7 @@
package cn.odboy.application.system.mapper;
import cn.odboy.model.system.domain.Job;
import cn.odboy.model.system.dto.JobQueryCriteria;
import cn.odboy.model.system.request.JobQueryCriteria;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -1,7 +1,7 @@
package cn.odboy.application.system.mapper;
import cn.odboy.model.system.domain.Menu;
import cn.odboy.model.system.dto.MenuQueryCriteria;
import cn.odboy.model.system.request.MenuQueryCriteria;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@@ -25,7 +25,7 @@ public interface MenuMapper extends BaseMapper<Menu> {
Menu getMenuByComponentName(@Param("name") String name);
int getMenuCountByPid(@Param("pid") Long pid);
Integer getMenuCountByPid(@Param("pid") Long pid);
void updateSubCntById(@Param("count") int count, @Param("menuId") Long menuId);
}
@@ -1,7 +1,7 @@
package cn.odboy.application.system.mapper;
import cn.odboy.model.system.domain.Role;
import cn.odboy.model.system.dto.RoleQueryCriteria;
import cn.odboy.model.system.request.RoleQueryCriteria;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@@ -1,7 +1,7 @@
package cn.odboy.application.system.mapper;
import cn.odboy.model.system.domain.User;
import cn.odboy.model.system.dto.UserQueryCriteria;
import cn.odboy.model.system.request.UserQueryCriteria;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -1,10 +1,9 @@
package cn.odboy.application.system.rest;
import cn.odboy.application.system.service.VerifyService;
import cn.odboy.application.tools.service.CaptchaService;
import cn.odboy.application.tools.service.EmailService;
import cn.odboy.constant.CodeBiEnum;
import cn.odboy.constant.CodeEnum;
import cn.odboy.model.tools.dto.EmailDto;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
@@ -14,29 +13,30 @@ import org.springframework.web.bind.annotation.*;
import java.util.Objects;
@RestController
@RequiredArgsConstructor
@RequestMapping("/api/code")
@Api(tags = "系统:验证码管理")
public class VerifyController {
private final VerifyService verificationCodeService;
public class CaptchaController {
private final CaptchaService captchaService;
private final EmailService emailService;
@PostMapping(value = "/resetEmail")
/**
* 除了这个其他的接口都没有用上
*
* @param email 邮件地址
*/
@PostMapping(value = "/sendCaptcha")
@ApiOperation("重置邮箱,发送验证码")
public ResponseEntity<Object> resetEmail(@RequestParam String email) {
EmailDto emailDto = verificationCodeService.sendEmailCode(email, CodeEnum.EMAIL_RESET_EMAIL_CODE.getKey());
emailService.sendEmail(emailDto);
emailService.sendCaptcha(email, CodeEnum.EMAIL_RESET_EMAIL_CODE.getKey());
return new ResponseEntity<>(HttpStatus.OK);
}
@PostMapping(value = "/email/resetPass")
@PostMapping(value = "/resetPass")
@ApiOperation("重置密码,发送验证码")
public ResponseEntity<Object> resetPass(@RequestParam String email) {
EmailDto emailDto = verificationCodeService.sendEmailCode(email, CodeEnum.EMAIL_RESET_PWD_CODE.getKey());
emailService.sendEmail(emailDto);
emailService.sendCaptcha(email, CodeEnum.EMAIL_RESET_PWD_CODE.getKey());
return new ResponseEntity<>(HttpStatus.OK);
}
@@ -46,10 +46,10 @@ public class VerifyController {
CodeBiEnum biEnum = CodeBiEnum.find(codeBi);
switch (Objects.requireNonNull(biEnum)) {
case ONE:
verificationCodeService.validateEmailCode(CodeEnum.EMAIL_RESET_EMAIL_CODE.getKey(), email, code);
captchaService.checkCode(CodeEnum.EMAIL_RESET_EMAIL_CODE.getKey(), email, code);
break;
case TWO:
verificationCodeService.validateEmailCode(CodeEnum.EMAIL_RESET_PWD_CODE.getKey(), email, code);
captchaService.checkCode(CodeEnum.EMAIL_RESET_PWD_CODE.getKey(), email, code);
break;
default:
break;
@@ -2,9 +2,9 @@ package cn.odboy.application.system.rest;
import cn.odboy.application.system.service.DeptService;
import cn.odboy.base.PageResult;
import cn.odboy.exception.BadRequestException;
import cn.odboy.model.system.domain.Dept;
import cn.odboy.model.system.dto.DeptQueryCriteria;
import cn.odboy.model.system.request.DeptQueryCriteria;
import cn.odboy.model.system.request.CreateDeptRequest;
import cn.odboy.util.PageUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@@ -24,9 +24,7 @@ import java.util.stream.Collectors;
@Api(tags = "系统:部门管理")
@RequestMapping("/api/dept")
public class DeptController {
private final DeptService deptService;
private static final String ENTITY_NAME = "dept";
@ApiOperation("导出部门数据")
@GetMapping(value = "/download")
@@ -68,10 +66,7 @@ public class DeptController {
@ApiOperation("新增部门")
@PostMapping
@PreAuthorize("@el.check('dept:add')")
public ResponseEntity<Object> createDept(@Validated @RequestBody Dept resources) {
if (resources.getId() != null) {
throw new BadRequestException("A new " + ENTITY_NAME + " cannot already have an ID");
}
public ResponseEntity<Object> createDept(@Validated @RequestBody CreateDeptRequest resources) {
deptService.createDept(resources);
return new ResponseEntity<>(HttpStatus.CREATED);
}
@@ -2,9 +2,9 @@ package cn.odboy.application.system.rest;
import cn.odboy.application.system.service.DictService;
import cn.odboy.base.PageResult;
import cn.odboy.exception.BadRequestException;
import cn.odboy.model.system.domain.Dict;
import cn.odboy.model.system.dto.DictQueryCriteria;
import cn.odboy.model.system.request.DictQueryCriteria;
import cn.odboy.model.system.request.CreateDictRequest;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@@ -25,9 +25,7 @@ import java.util.Set;
@Api(tags = "系统:字典管理")
@RequestMapping("/api/dict")
public class DictController {
private final DictService dictService;
private static final String ENTITY_NAME = "dict";
@ApiOperation("导出字典数据")
@GetMapping(value = "/download")
@@ -54,10 +52,7 @@ public class DictController {
@ApiOperation("新增字典")
@PostMapping
@PreAuthorize("@el.check('dict:add')")
public ResponseEntity<Object> createDict(@Validated @RequestBody Dict resources) {
if (resources.getId() != null) {
throw new BadRequestException("A new " + ENTITY_NAME + " cannot already have an ID");
}
public ResponseEntity<Object> createDict(@Validated @RequestBody CreateDictRequest resources) {
dictService.saveDict(resources);
return new ResponseEntity<>(HttpStatus.CREATED);
}
@@ -2,9 +2,9 @@ package cn.odboy.application.system.rest;
import cn.odboy.application.system.service.DictDetailService;
import cn.odboy.base.PageResult;
import cn.odboy.exception.BadRequestException;
import cn.odboy.model.system.domain.DictDetail;
import cn.odboy.model.system.dto.DictDetailQueryCriteria;
import cn.odboy.model.system.request.DictDetailQueryCriteria;
import cn.odboy.model.system.request.CreateDictDetailRequest;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@@ -24,9 +24,7 @@ import java.util.Map;
@Api(tags = "系统:字典详情管理")
@RequestMapping("/api/dictDetail")
public class DictDetailController {
private final DictDetailService dictDetailService;
private static final String ENTITY_NAME = "dictDetail";
@ApiOperation("查询字典详情")
@GetMapping
@@ -49,10 +47,7 @@ public class DictDetailController {
@ApiOperation("新增字典详情")
@PostMapping
@PreAuthorize("@el.check('dict:add')")
public ResponseEntity<Object> createDictDetail(@Validated @RequestBody DictDetail resources) {
if (resources.getId() != null) {
throw new BadRequestException("A new " + ENTITY_NAME + " cannot already have an ID");
}
public ResponseEntity<Object> createDictDetail(@Validated @RequestBody CreateDictDetailRequest resources) {
dictDetailService.saveDictDetail(resources);
return new ResponseEntity<>(HttpStatus.CREATED);
}
@@ -2,9 +2,9 @@ package cn.odboy.application.system.rest;
import cn.odboy.application.system.service.JobService;
import cn.odboy.base.PageResult;
import cn.odboy.exception.BadRequestException;
import cn.odboy.model.system.domain.Job;
import cn.odboy.model.system.dto.JobQueryCriteria;
import cn.odboy.model.system.request.JobQueryCriteria;
import cn.odboy.model.system.request.CreateJobRequest;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@@ -25,9 +25,7 @@ import java.util.Set;
@Api(tags = "系统:岗位管理")
@RequestMapping("/api/job")
public class JobController {
private final JobService jobService;
private static final String ENTITY_NAME = "job";
@ApiOperation("导出岗位数据")
@GetMapping(value = "/download")
@@ -47,11 +45,8 @@ public class JobController {
@ApiOperation("新增岗位")
@PostMapping
@PreAuthorize("@el.check('job:add')")
public ResponseEntity<Object> createJob(@Validated @RequestBody Job resources) {
if (resources.getId() != null) {
throw new BadRequestException("A new " + ENTITY_NAME + " cannot already have an ID");
}
jobService.saveJob(resources);
public ResponseEntity<Object> createJob(@Validated @RequestBody CreateJobRequest resources) {
jobService.createJob(resources);
return new ResponseEntity<>(HttpStatus.CREATED);
}
@@ -5,8 +5,8 @@ import cn.odboy.application.system.service.MenuService;
import cn.odboy.base.PageResult;
import cn.odboy.exception.BadRequestException;
import cn.odboy.model.system.domain.Menu;
import cn.odboy.model.system.dto.MenuQueryCriteria;
import cn.odboy.model.system.dto.MenuVo;
import cn.odboy.model.system.request.MenuQueryCriteria;
import cn.odboy.model.system.response.MenuVo;
import cn.odboy.util.PageUtil;
import cn.odboy.util.SecurityUtil;
import io.swagger.annotations.Api;
@@ -5,7 +5,8 @@ import cn.odboy.application.system.service.RoleService;
import cn.odboy.base.PageResult;
import cn.odboy.exception.BadRequestException;
import cn.odboy.model.system.domain.Role;
import cn.odboy.model.system.dto.RoleQueryCriteria;
import cn.odboy.model.system.request.RoleQueryCriteria;
import cn.odboy.model.system.request.CreateRoleRequest;
import cn.odboy.util.SecurityUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.Api;
@@ -30,11 +31,8 @@ import java.util.stream.Collectors;
@Api(tags = "系统:角色管理")
@RequestMapping("/api/roles")
public class RoleController {
private final RoleService roleService;
private static final String ENTITY_NAME = "role";
@ApiOperation("获取单个role")
@GetMapping(value = "/{id}")
@PreAuthorize("@el.check('roles:list')")
@@ -73,10 +71,7 @@ public class RoleController {
@ApiOperation("新增角色")
@PostMapping
@PreAuthorize("@el.check('roles:add')")
public ResponseEntity<Object> createRole(@Validated @RequestBody Role resources) {
if (resources.getId() != null) {
throw new BadRequestException("A new " + ENTITY_NAME + " cannot already have an ID");
}
public ResponseEntity<Object> createRole(@Validated @RequestBody CreateRoleRequest resources) {
getLevels(resources.getLevel());
roleService.createRole(resources);
return new ResponseEntity<>(HttpStatus.CREATED);
@@ -1,19 +1,25 @@
package cn.odboy.application.system.rest;
import cn.hutool.core.collection.CollectionUtil;
import cn.odboy.application.system.service.*;
import cn.odboy.application.system.service.DataService;
import cn.odboy.application.system.service.DeptService;
import cn.odboy.application.system.service.RoleService;
import cn.odboy.application.system.service.UserService;
import cn.odboy.application.tools.service.CaptchaService;
import cn.odboy.base.MyMetaOption;
import cn.odboy.base.PageResult;
import cn.odboy.constant.CodeEnum;
import cn.odboy.exception.BadRequestException;
import cn.odboy.model.system.domain.Dept;
import cn.odboy.model.system.domain.Role;
import cn.odboy.model.system.domain.User;
import cn.odboy.model.system.dto.UserPassVo;
import cn.odboy.model.system.dto.UserQueryCriteria;
import cn.odboy.model.system.response.UserPassVo;
import cn.odboy.model.system.request.UserQueryCriteria;
import cn.odboy.properties.RsaProperties;
import cn.odboy.util.PageUtil;
import cn.odboy.util.RSAEncryptUtil;
import cn.odboy.util.RsaEncryptUtil;
import cn.odboy.util.SecurityUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@@ -30,9 +36,7 @@ import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import java.util.*;
import java.util.stream.Collectors;
@Api(tags = "系统:用户管理")
@@ -40,13 +44,12 @@ import java.util.stream.Collectors;
@RequestMapping("/api/users")
@RequiredArgsConstructor
public class UserController {
private final PasswordEncoder passwordEncoder;
private final UserService userService;
private final DataService dataService;
private final DeptService deptService;
private final RoleService roleService;
private final VerifyService verificationCodeService;
private final CaptchaService verificationCodeService;
@ApiOperation("导出用户数据")
@GetMapping(value = "/download")
@@ -132,8 +135,8 @@ public class UserController {
@ApiOperation("修改密码")
@PostMapping(value = "/updatePass")
public ResponseEntity<Object> updateUserPassword(@RequestBody UserPassVo passVo) throws Exception {
String oldPass = RSAEncryptUtil.decryptByPrivateKey(RsaProperties.privateKey, passVo.getOldPass());
String newPass = RSAEncryptUtil.decryptByPrivateKey(RsaProperties.privateKey, passVo.getNewPass());
String oldPass = RsaEncryptUtil.decryptByPrivateKey(RsaProperties.privateKey, passVo.getOldPass());
String newPass = RsaEncryptUtil.decryptByPrivateKey(RsaProperties.privateKey, passVo.getNewPass());
User user = userService.getUserByUsername(SecurityUtil.getCurrentUsername());
if (!passwordEncoder.matches(oldPass, user.getPassword())) {
throw new BadRequestException("修改失败,旧密码错误");
@@ -162,12 +165,12 @@ public class UserController {
@ApiOperation("修改邮箱")
@PostMapping(value = "/updateEmail/{code}")
public ResponseEntity<Object> updateUserEmail(@PathVariable String code, @RequestBody User resources) throws Exception {
String password = RSAEncryptUtil.decryptByPrivateKey(RsaProperties.privateKey, resources.getPassword());
String password = RsaEncryptUtil.decryptByPrivateKey(RsaProperties.privateKey, resources.getPassword());
User user = userService.getUserByUsername(SecurityUtil.getCurrentUsername());
if (!passwordEncoder.matches(password, user.getPassword())) {
throw new BadRequestException("密码错误");
}
verificationCodeService.validateEmailCode(CodeEnum.EMAIL_RESET_EMAIL_CODE.getKey(), resources.getEmail(), code);
verificationCodeService.checkCode(CodeEnum.EMAIL_RESET_EMAIL_CODE.getKey(), resources.getEmail(), code);
userService.updateEmailByUsername(user.getUsername(), resources.getEmail());
return new ResponseEntity<>(HttpStatus.OK);
}
@@ -184,4 +187,33 @@ public class UserController {
throw new BadRequestException("角色权限不足");
}
}
@ApiOperation("查询用户基础数据")
@PostMapping(value = "/queryUserMetaPage")
@PreAuthorize("@el.check('user:list')")
public ResponseEntity<List<MyMetaOption>> queryUserMetaPage(@Validated @RequestBody UserQueryCriteria criteria) {
int maxPageSize = 50;
return new ResponseEntity<>(userService.page(new Page<>(criteria.getPage(), maxPageSize), new LambdaQueryWrapper<User>()
.and(c -> {
c.eq(User::getPhone, criteria.getBlurry());
c.or();
c.eq(User::getEmail, criteria.getBlurry());
c.or();
c.like(User::getUsername, criteria.getBlurry());
c.or();
c.like(User::getNickName, criteria.getBlurry());
})
).getRecords().stream().map(m -> {
Map<String, Object> ext = new HashMap<>(1);
ext.put("id", m.getId());
ext.put("deptId", m.getDeptId());
ext.put("email", m.getEmail());
ext.put("phone", m.getPhone());
return MyMetaOption.builder()
.label(m.getNickName())
.value(m.getUsername())
.ext(ext)
.build();
}).collect(Collectors.toList()), HttpStatus.OK);
}
}
@@ -2,13 +2,13 @@ package cn.odboy.application.system.service;
import cn.odboy.base.BaseResult;
import cn.odboy.model.system.domain.Dept;
import cn.odboy.model.system.dto.DeptQueryCriteria;
import cn.odboy.model.system.request.DeptQueryCriteria;
import cn.odboy.model.system.request.CreateDeptRequest;
import com.baomidou.mybatisplus.extension.service.IService;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import java.util.Set;
public interface DeptService extends IService<Dept> {
@@ -36,7 +36,7 @@ public interface DeptService extends IService<Dept> {
*
* @param resources /
*/
void createDept(Dept resources);
void createDept(CreateDeptRequest resources);
/**
* 编辑
@@ -2,7 +2,8 @@ package cn.odboy.application.system.service;
import cn.odboy.base.PageResult;
import cn.odboy.model.system.domain.DictDetail;
import cn.odboy.model.system.dto.DictDetailQueryCriteria;
import cn.odboy.model.system.request.DictDetailQueryCriteria;
import cn.odboy.model.system.request.CreateDictDetailRequest;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
@@ -16,7 +17,7 @@ public interface DictDetailService extends IService<DictDetail> {
*
* @param resources /
*/
void saveDictDetail(DictDetail resources);
void saveDictDetail(CreateDictDetailRequest resources);
/**
* 编辑
@@ -2,7 +2,8 @@ package cn.odboy.application.system.service;
import cn.odboy.base.PageResult;
import cn.odboy.model.system.domain.Dict;
import cn.odboy.model.system.dto.DictQueryCriteria;
import cn.odboy.model.system.request.DictQueryCriteria;
import cn.odboy.model.system.request.CreateDictRequest;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
@@ -36,7 +37,7 @@ public interface DictService extends IService<Dict> {
*
* @param resources /
*/
void saveDict(Dict resources);
void saveDict(CreateDictRequest resources);
/**
* 编辑
@@ -2,7 +2,8 @@ package cn.odboy.application.system.service;
import cn.odboy.base.PageResult;
import cn.odboy.model.system.domain.Job;
import cn.odboy.model.system.dto.JobQueryCriteria;
import cn.odboy.model.system.request.JobQueryCriteria;
import cn.odboy.model.system.request.CreateJobRequest;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
@@ -27,7 +28,7 @@ public interface JobService extends IService<Job> {
*
* @param resources /
*/
void saveJob(Job resources);
void createJob(CreateJobRequest resources);
/**
* 编辑
@@ -1,8 +1,8 @@
package cn.odboy.application.system.service;
import cn.odboy.model.system.domain.Menu;
import cn.odboy.model.system.dto.MenuQueryCriteria;
import cn.odboy.model.system.dto.MenuVo;
import cn.odboy.model.system.request.MenuQueryCriteria;
import cn.odboy.model.system.response.MenuVo;
import com.baomidou.mybatisplus.extension.service.IService;
import javax.servlet.http.HttpServletResponse;
@@ -4,7 +4,8 @@ import cn.odboy.base.PageResult;
import cn.odboy.model.system.domain.Role;
import cn.odboy.model.system.domain.User;
import cn.odboy.model.system.dto.RoleCodeDto;
import cn.odboy.model.system.dto.RoleQueryCriteria;
import cn.odboy.model.system.request.RoleQueryCriteria;
import cn.odboy.model.system.request.CreateRoleRequest;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
@@ -53,7 +54,7 @@ public interface RoleService extends IService<Role> {
*
* @param resources /
*/
void createRole(Role resources);
void createRole(CreateRoleRequest resources);
/**
* 编辑
@@ -2,7 +2,7 @@ package cn.odboy.application.system.service;
import cn.odboy.base.PageResult;
import cn.odboy.model.system.domain.User;
import cn.odboy.model.system.dto.UserQueryCriteria;
import cn.odboy.model.system.request.UserQueryCriteria;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import org.springframework.web.multipart.MultipartFile;
@@ -4,8 +4,8 @@ import cn.hutool.core.collection.CollUtil;
import cn.odboy.application.system.service.DataService;
import cn.odboy.application.system.service.DeptService;
import cn.odboy.application.system.service.RoleService;
import cn.odboy.constant.SystemRedisKey;
import cn.odboy.constant.DataScopeEnum;
import cn.odboy.constant.SystemRedisKey;
import cn.odboy.model.system.domain.Dept;
import cn.odboy.model.system.domain.Role;
import cn.odboy.model.system.domain.User;
@@ -1,5 +1,6 @@
package cn.odboy.application.system.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.ObjectUtil;
@@ -8,12 +9,13 @@ import cn.odboy.application.system.mapper.RoleMapper;
import cn.odboy.application.system.mapper.UserMapper;
import cn.odboy.application.system.service.DeptService;
import cn.odboy.base.BaseResult;
import cn.odboy.constant.SystemRedisKey;
import cn.odboy.constant.DataScopeEnum;
import cn.odboy.constant.SystemRedisKey;
import cn.odboy.exception.BadRequestException;
import cn.odboy.model.system.domain.Dept;
import cn.odboy.model.system.domain.User;
import cn.odboy.model.system.dto.DeptQueryCriteria;
import cn.odboy.model.system.request.DeptQueryCriteria;
import cn.odboy.model.system.request.CreateDeptRequest;
import cn.odboy.util.*;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.RequiredArgsConstructor;
@@ -93,8 +95,8 @@ public class DeptServiceImpl extends ServiceImpl<DeptMapper, Dept> implements De
@Override
@Transactional(rollbackFor = Exception.class)
public void createDept(Dept resources) {
save(resources);
public void createDept(CreateDeptRequest resources) {
save(BeanUtil.copyProperties(resources, Dept.class));
// 清理缓存
updateSubCnt(resources.getPid());
// 清理自定义角色权限的DataScope缓存
@@ -1,5 +1,6 @@
package cn.odboy.application.system.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.odboy.application.system.mapper.DictDetailMapper;
import cn.odboy.application.system.mapper.DictMapper;
@@ -8,7 +9,8 @@ import cn.odboy.base.PageResult;
import cn.odboy.constant.SystemRedisKey;
import cn.odboy.model.system.domain.Dict;
import cn.odboy.model.system.domain.DictDetail;
import cn.odboy.model.system.dto.DictDetailQueryCriteria;
import cn.odboy.model.system.request.DictDetailQueryCriteria;
import cn.odboy.model.system.request.CreateDictDetailRequest;
import cn.odboy.util.PageUtil;
import cn.odboy.util.RedisUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -34,11 +36,12 @@ public class DictDetailServiceImpl extends ServiceImpl<DictDetailMapper, DictDet
@Override
@Transactional(rollbackFor = Exception.class)
public void saveDictDetail(DictDetail resources) {
resources.setDictId(resources.getDict().getId());
save(resources);
public void saveDictDetail(CreateDictDetailRequest resources) {
DictDetail dictDetail = BeanUtil.copyProperties(resources, DictDetail.class);
dictDetail.setDictId(resources.getDict().getId());
save(dictDetail);
// 清理缓存
delCaches(resources);
delCaches(dictDetail);
}
@Override
@@ -1,5 +1,6 @@
package cn.odboy.application.system.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollectionUtil;
import cn.odboy.application.system.mapper.DictDetailMapper;
import cn.odboy.application.system.mapper.DictMapper;
@@ -8,7 +9,8 @@ import cn.odboy.base.PageResult;
import cn.odboy.constant.SystemRedisKey;
import cn.odboy.model.system.domain.Dict;
import cn.odboy.model.system.domain.DictDetail;
import cn.odboy.model.system.dto.DictQueryCriteria;
import cn.odboy.model.system.request.DictQueryCriteria;
import cn.odboy.model.system.request.CreateDictRequest;
import cn.odboy.util.FileUtil;
import cn.odboy.util.PageUtil;
import cn.odboy.util.RedisUtil;
@@ -43,8 +45,8 @@ public class DictServiceImpl extends ServiceImpl<DictMapper, Dict> implements Di
@Override
@Transactional(rollbackFor = Exception.class)
public void saveDict(Dict resources) {
save(resources);
public void saveDict(CreateDictRequest resources) {
save(BeanUtil.copyProperties(resources, Dict.class));
}
@Override
@@ -1,5 +1,6 @@
package cn.odboy.application.system.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.odboy.application.system.mapper.JobMapper;
import cn.odboy.application.system.mapper.UserMapper;
import cn.odboy.application.system.service.JobService;
@@ -8,7 +9,8 @@ import cn.odboy.constant.SystemRedisKey;
import cn.odboy.exception.BadRequestException;
import cn.odboy.exception.EntityExistException;
import cn.odboy.model.system.domain.Job;
import cn.odboy.model.system.dto.JobQueryCriteria;
import cn.odboy.model.system.request.JobQueryCriteria;
import cn.odboy.model.system.request.CreateJobRequest;
import cn.odboy.util.FileUtil;
import cn.odboy.util.PageUtil;
import cn.odboy.util.RedisUtil;
@@ -53,12 +55,12 @@ public class JobServiceImpl extends ServiceImpl<JobMapper, Job> implements JobSe
@Override
@Transactional(rollbackFor = Exception.class)
public void saveJob(Job resources) {
public void createJob(CreateJobRequest resources) {
Job job = jobMapper.getJobByName(resources.getName());
if (job != null) {
throw new EntityExistException(Job.class, "name", resources.getName());
}
save(resources);
save(BeanUtil.copyProperties(resources, Job.class));
}
@Override
@@ -15,9 +15,9 @@ import cn.odboy.exception.EntityExistException;
import cn.odboy.model.system.domain.Menu;
import cn.odboy.model.system.domain.Role;
import cn.odboy.model.system.domain.User;
import cn.odboy.model.system.dto.MenuMetaVo;
import cn.odboy.model.system.dto.MenuQueryCriteria;
import cn.odboy.model.system.dto.MenuVo;
import cn.odboy.model.system.response.MenuMetaVo;
import cn.odboy.model.system.request.MenuQueryCriteria;
import cn.odboy.model.system.response.MenuVo;
import cn.odboy.util.ClassUtil;
import cn.odboy.util.FileUtil;
import cn.odboy.util.RedisUtil;
@@ -5,7 +5,7 @@ import cn.hutool.core.date.DateUtil;
import cn.odboy.application.system.service.MonitorService;
import cn.odboy.constant.SystemConst;
import cn.odboy.util.FileUtil;
import cn.odboy.util.IPUtil;
import cn.odboy.util.IpUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import oshi.SystemInfo;
@@ -178,7 +178,7 @@ public class MonitorServiceImpl implements MonitorService {
// 系统信息
systemInfo.put("os", os.toString());
systemInfo.put("day", formatBetween);
systemInfo.put("ip", IPUtil.getLocalIp());
systemInfo.put("ip", IpUtil.getLocalIp());
return systemInfo;
}
}
@@ -1,5 +1,6 @@
package cn.odboy.application.system.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.CollectionUtil;
import cn.odboy.application.core.service.UserCacheService;
@@ -16,7 +17,8 @@ import cn.odboy.model.system.domain.Menu;
import cn.odboy.model.system.domain.Role;
import cn.odboy.model.system.domain.User;
import cn.odboy.model.system.dto.RoleCodeDto;
import cn.odboy.model.system.dto.RoleQueryCriteria;
import cn.odboy.model.system.request.RoleQueryCriteria;
import cn.odboy.model.system.request.CreateRoleRequest;
import cn.odboy.util.FileUtil;
import cn.odboy.util.PageUtil;
import cn.odboy.util.RedisUtil;
@@ -74,11 +76,11 @@ public class RoleServiceImpl extends ServiceImpl<RoleMapper, Role> implements Ro
@Override
@Transactional(rollbackFor = Exception.class)
public void createRole(Role resources) {
public void createRole(CreateRoleRequest resources) {
if (roleMapper.getRoleByName(resources.getName()) != null) {
throw new EntityExistException(Role.class, "username", resources.getName());
throw new EntityExistException(Role.class, "name", resources.getName());
}
save(resources);
save(BeanUtil.copyProperties(resources, Role.class));
// 判断是否有部门数据,若有,则需创建关联
if (CollectionUtil.isNotEmpty(resources.getDepts())) {
roleDeptMapper.insertBatchByRoleId(resources.getId(), resources.getDepts());
@@ -91,7 +93,7 @@ public class RoleServiceImpl extends ServiceImpl<RoleMapper, Role> implements Ro
Role role = getById(resources.getId());
Role role1 = roleMapper.getRoleByName(resources.getName());
if (role1 != null && !role1.getId().equals(role.getId())) {
throw new EntityExistException(Role.class, "username", resources.getName());
throw new EntityExistException(Role.class, "name", resources.getName());
}
role.setName(resources.getName());
role.setDescription(resources.getDescription());
@@ -1,7 +1,7 @@
package cn.odboy.application.system.service.impl;
import cn.odboy.application.core.service.UserOnlineService;
import cn.odboy.application.core.service.UserCacheService;
import cn.odboy.application.core.service.UserOnlineService;
import cn.odboy.application.system.mapper.UserJobMapper;
import cn.odboy.application.system.mapper.UserMapper;
import cn.odboy.application.system.mapper.UserRoleMapper;
@@ -13,7 +13,7 @@ import cn.odboy.exception.EntityExistException;
import cn.odboy.model.system.domain.Job;
import cn.odboy.model.system.domain.Role;
import cn.odboy.model.system.domain.User;
import cn.odboy.model.system.dto.UserQueryCriteria;
import cn.odboy.model.system.request.UserQueryCriteria;
import cn.odboy.properties.FileProperties;
import cn.odboy.util.*;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -111,11 +111,11 @@
FROM sys_menu
WHERE name = #{name}
</select>
<update id="getMenuCountByPid">
<select id="getMenuCountByPid">
SELECT count(*)
FROM sys_menu
WHERE pid = #{pid}
</update>
</select>
<update id="updateSubCntById">
update sys_menu
set sub_count = #{count}
@@ -1,7 +1,7 @@
package cn.odboy.application.tools.mapper;
import cn.odboy.model.tools.domain.LocalStorage;
import cn.odboy.model.tools.dto.LocalStorageQueryCriteria;
import cn.odboy.model.tools.request.LocalStorageQueryCriteria;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -1,7 +1,7 @@
package cn.odboy.application.tools.mapper;
import cn.odboy.model.tools.domain.QiniuContent;
import cn.odboy.model.tools.dto.QiniuQueryCriteria;
import cn.odboy.model.tools.request.QiniuQueryCriteria;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -5,7 +5,7 @@ import cn.odboy.base.PageResult;
import cn.odboy.constant.FileTypeEnum;
import cn.odboy.exception.BadRequestException;
import cn.odboy.model.tools.domain.LocalStorage;
import cn.odboy.model.tools.dto.LocalStorageQueryCriteria;
import cn.odboy.model.tools.request.LocalStorageQueryCriteria;
import cn.odboy.util.FileUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.Api;
@@ -26,7 +26,6 @@ import java.io.IOException;
@Api(tags = "工具:本地存储管理")
@RequestMapping("/api/localStorage")
public class LocalStorageController {
private final LocalStorageService localStorageService;
@GetMapping
@@ -5,7 +5,7 @@ import cn.odboy.application.tools.service.QiniuContentService;
import cn.odboy.base.PageResult;
import cn.odboy.model.tools.domain.QiniuConfig;
import cn.odboy.model.tools.domain.QiniuContent;
import cn.odboy.model.tools.dto.QiniuQueryCriteria;
import cn.odboy.model.tools.request.QiniuQueryCriteria;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@@ -31,7 +31,6 @@ import java.util.Map;
@RequestMapping("/api/qiNiuContent")
@Api(tags = "工具:七牛云存储管理")
public class QiniuController {
private final QiniuContentService qiniuContentService;
private final QiNiuConfigService qiNiuConfigService;
@@ -90,7 +89,7 @@ public class QiniuController {
@ApiOperation("删除文件")
@DeleteMapping(value = "/{id}")
public ResponseEntity<Object> deleteQiNiu(@PathVariable Long id) {
qiniuContentService.delete(qiniuContentService.getById(id));
qiniuContentService.deleteFileById(id);
return new ResponseEntity<>(HttpStatus.OK);
}
@@ -1,9 +1,9 @@
package cn.odboy.application.system.service;
package cn.odboy.application.tools.service;
import cn.odboy.model.tools.dto.EmailDto;
public interface VerifyService {
public interface CaptchaService {
/**
* 发送验证码
*
@@ -11,7 +11,7 @@ public interface VerifyService {
* @param key /
* @return /
*/
EmailDto sendEmailCode(String email, String key);
EmailDto renderCode(String email, String key);
/**
@@ -20,5 +20,5 @@ public interface VerifyService {
* @param code /
* @param key /
*/
void validateEmailCode(String key, String email, String code);
void checkCode(String key, String email, String code);
}
@@ -29,4 +29,12 @@ public interface EmailService extends IService<EmailConfig> {
* @param emailDto 邮件发送的内容
*/
void sendEmail(EmailDto emailDto);
/**
* 发送邮件验证码
*
* @param email 邮箱地址
* @param key 类型
*/
void sendCaptcha(String email, String key);
}
@@ -2,7 +2,7 @@ package cn.odboy.application.tools.service;
import cn.odboy.base.PageResult;
import cn.odboy.model.tools.domain.LocalStorage;
import cn.odboy.model.tools.dto.LocalStorageQueryCriteria;
import cn.odboy.model.tools.request.LocalStorageQueryCriteria;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import org.springframework.web.multipart.MultipartFile;
@@ -2,7 +2,7 @@ package cn.odboy.application.tools.service;
import cn.odboy.base.PageResult;
import cn.odboy.model.tools.domain.QiniuContent;
import cn.odboy.model.tools.dto.QiniuQueryCriteria;
import cn.odboy.model.tools.request.QiniuQueryCriteria;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import org.springframework.web.multipart.MultipartFile;
@@ -47,13 +47,6 @@ public interface QiniuContentService extends IService<QiniuContent> {
*/
String download(QiniuContent content);
/**
* 删除文件
*
* @param content 文件
*/
void delete(QiniuContent content);
/**
* 同步数据
*/
@@ -74,4 +67,11 @@ public interface QiniuContentService extends IService<QiniuContent> {
* @throws IOException /
*/
void downloadExcel(List<QiniuContent> queryAll, HttpServletResponse response) throws IOException;
/**
* 删除文件
*
* @param id 文件id
*/
void deleteFileById(Long id);
}
@@ -1,4 +1,4 @@
package cn.odboy.application.system.service.impl;
package cn.odboy.application.tools.service.impl;
import cn.hutool.core.lang.Dict;
import cn.hutool.core.util.RandomUtil;
@@ -6,7 +6,7 @@ import cn.hutool.extra.template.Template;
import cn.hutool.extra.template.TemplateConfig;
import cn.hutool.extra.template.TemplateEngine;
import cn.hutool.extra.template.TemplateUtil;
import cn.odboy.application.system.service.VerifyService;
import cn.odboy.application.tools.service.CaptchaService;
import cn.odboy.exception.BadRequestException;
import cn.odboy.model.tools.dto.EmailDto;
import cn.odboy.util.RedisUtil;
@@ -19,15 +19,14 @@ import java.util.Collections;
@Service
@RequiredArgsConstructor
public class VerifyServiceImpl implements VerifyService {
public class CaptchaServiceImpl implements CaptchaService {
private final RedisUtil redisUtil;
@Value("${code.expiration}")
private Long expiration;
@Override
@Transactional(rollbackFor = Exception.class)
public EmailDto sendEmailCode(String email, String key) {
public EmailDto renderCode(String email, String key) {
EmailDto emailDto;
String content;
String redisKey = key + email;
@@ -41,8 +40,8 @@ public class VerifyServiceImpl implements VerifyService {
if (!redisUtil.set(redisKey, code, expiration)) {
throw new BadRequestException("服务异常,请联系网站负责人");
}
content = template.render(Dict.create().set("code", code));
// 存在就再次发送原来的验证码
content = template.render(Dict.create().set("code", code));
} else {
content = template.render(Dict.create().set("code", oldCode));
}
@@ -51,7 +50,7 @@ public class VerifyServiceImpl implements VerifyService {
}
@Override
public void validateEmailCode(String key, String email, String code) {
public void checkCode(String key, String email, String code) {
String value = redisUtil.get(key + email, String.class);
if (value == null || !value.equals(code)) {
throw new BadRequestException("无效验证码");
@@ -3,11 +3,13 @@ package cn.odboy.application.tools.service.impl;
import cn.hutool.extra.mail.Mail;
import cn.hutool.extra.mail.MailAccount;
import cn.odboy.application.tools.mapper.EmailConfigMapper;
import cn.odboy.application.tools.service.CaptchaService;
import cn.odboy.application.tools.service.EmailService;
import cn.odboy.constant.CodeEnum;
import cn.odboy.exception.BadRequestException;
import cn.odboy.model.tools.domain.EmailConfig;
import cn.odboy.model.tools.dto.EmailDto;
import cn.odboy.util.DESEncryptUtil;
import cn.odboy.util.DesEncryptUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheConfig;
@@ -23,6 +25,8 @@ public class EmailServiceImpl extends ServiceImpl<EmailConfigMapper, EmailConfig
@Lazy
@Autowired
private EmailService emailService;
@Autowired
private CaptchaService captchaService;
@Override
@CachePut(key = "'config'")
@@ -31,7 +35,7 @@ public class EmailServiceImpl extends ServiceImpl<EmailConfigMapper, EmailConfig
EmailConfig localConfig = emailService.getEmailConfig();
if (!emailConfig.getPassword().equals(localConfig.getPassword())) {
// 对称加密
emailConfig.setPassword(DESEncryptUtil.desEncrypt(emailConfig.getPassword()));
emailConfig.setPassword(DesEncryptUtil.desEncrypt(emailConfig.getPassword()));
}
emailConfig.setId(1L);
saveOrUpdate(emailConfig);
@@ -61,7 +65,7 @@ public class EmailServiceImpl extends ServiceImpl<EmailConfigMapper, EmailConfig
account.setAuth(true);
try {
// 对称解密
account.setPass(DESEncryptUtil.desDecrypt(emailConfig.getPassword()));
account.setPass(DesEncryptUtil.desDecrypt(emailConfig.getPassword()));
} catch (Exception e) {
throw new BadRequestException(e.getMessage());
}
@@ -89,4 +93,9 @@ public class EmailServiceImpl extends ServiceImpl<EmailConfigMapper, EmailConfig
throw new BadRequestException("邮件发送失败");
}
}
@Override
public void sendCaptcha(String email, String key) {
emailService.sendEmail(captchaService.renderCode(email, CodeEnum.EMAIL_RESET_EMAIL_CODE.getKey()));
}
}
@@ -6,7 +6,7 @@ import cn.odboy.application.tools.service.LocalStorageService;
import cn.odboy.base.PageResult;
import cn.odboy.exception.BadRequestException;
import cn.odboy.model.tools.domain.LocalStorage;
import cn.odboy.model.tools.dto.LocalStorageQueryCriteria;
import cn.odboy.model.tools.request.LocalStorageQueryCriteria;
import cn.odboy.properties.FileProperties;
import cn.odboy.util.FileUtil;
import cn.odboy.util.PageUtil;

Some files were not shown because too many files have changed in this diff Show More