diff --git a/common/service-utils/pom.xml b/common/service-utils/pom.xml index 23a0cf0..9131699 100644 --- a/common/service-utils/pom.xml +++ b/common/service-utils/pom.xml @@ -40,11 +40,26 @@ redisson 3.26.1 + + + io.minio + minio + org.lionsoul ip2region 2.6.5 + + + org.springframework + spring-websocket + + + + org.springframework.boot + spring-boot-starter-mail + diff --git a/common/service-utils/src/main/java/cn/bunny/common/service/config/MyBatisPlusFieldConfig.java b/common/service-utils/src/main/java/cn/bunny/common/service/config/MyBatisPlusFieldConfig.java index d32b125..b441e16 100644 --- a/common/service-utils/src/main/java/cn/bunny/common/service/config/MyBatisPlusFieldConfig.java +++ b/common/service-utils/src/main/java/cn/bunny/common/service/config/MyBatisPlusFieldConfig.java @@ -19,12 +19,12 @@ public class MyBatisPlusFieldConfig implements MetaObjectHandler { @Override public void insertFill(MetaObject metaObject) { // 设置属性值 + this.strictInsertFill(metaObject, "isDeleted", Integer.class, 0); this.setFieldValByName("createTime", new Date(), metaObject); this.setFieldValByName("updateTime", new Date(), metaObject); - this.setFieldValByName("deleteStatus", 1, metaObject); if (BaseContext.getUsername() != null) { - this.setFieldValByName("createBy", BaseContext.getUsername(), metaObject); - this.setFieldValByName("updateBy", BaseContext.getUsername(), metaObject); + this.setFieldValByName("createUser", BaseContext.getUsername(), metaObject); + this.setFieldValByName("updateUser", BaseContext.getUsername(), metaObject); } } @@ -33,7 +33,9 @@ public class MyBatisPlusFieldConfig implements MetaObjectHandler { */ @Override public void updateFill(MetaObject metaObject) { - this.setFieldValByName("updateTime", new Date(), metaObject); - this.setFieldValByName("updateBy", BaseContext.getUsername(), metaObject); + if (BaseContext.getUserId() != null) { + this.setFieldValByName("updateTime", new Date(), metaObject); + this.setFieldValByName("updateUser", BaseContext.getUsername(), metaObject); + } } } diff --git a/common/service-utils/src/main/java/cn/bunny/common/service/config/RedisConfiguration.java b/common/service-utils/src/main/java/cn/bunny/common/service/config/RedisConfiguration.java index c82936b..0c67fee 100644 --- a/common/service-utils/src/main/java/cn/bunny/common/service/config/RedisConfiguration.java +++ b/common/service-utils/src/main/java/cn/bunny/common/service/config/RedisConfiguration.java @@ -45,11 +45,14 @@ public class RedisConfiguration { redisTemplate.setConnectionFactory(connectionFactory); // 设置key序列化为string redisTemplate.setKeySerializer(new StringRedisSerializer()); + // 设置value序列化为JSON,使用GenericJackson2JsonRedisSerializer替换默认序列化 redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer()); redisTemplate.setHashKeySerializer(new StringRedisSerializer()); redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer()); + // 开启Redis事务 + redisTemplate.setEnableTransactionSupport(true); return redisTemplate; } diff --git a/common/service-utils/src/main/java/cn/bunny/common/service/context/BaseContext.java b/common/service-utils/src/main/java/cn/bunny/common/service/context/BaseContext.java index aaae16c..afb5454 100644 --- a/common/service-utils/src/main/java/cn/bunny/common/service/context/BaseContext.java +++ b/common/service-utils/src/main/java/cn/bunny/common/service/context/BaseContext.java @@ -1,12 +1,10 @@ package cn.bunny.common.service.context; -import cn.bunny.vo.system.login.LoginVo; +import cn.bunny.vo.user.LoginVo; public class BaseContext { private static final ThreadLocal userId = new ThreadLocal<>(); private static final ThreadLocal username = new ThreadLocal(); - private static final ThreadLocal adminId = new ThreadLocal<>(); - private static final ThreadLocal adminName = new ThreadLocal<>(); private static final ThreadLocal loginVo = new ThreadLocal<>(); // 用户id相关 @@ -39,26 +37,4 @@ public class BaseContext { userId.remove(); loginVo.remove(); } - - // adminId 相关 - public static Long getAdminId() { - return adminId.get(); - } - - public static void setAdminId(Long _adminId) { - adminId.set(_adminId); - } - - public static String getAdminName() { - return adminName.get(); - } - - public static void setAdminName(String _adminName) { - adminName.set(_adminName); - } - - public static void removeAdmin() { - adminName.remove(); - adminId.remove(); - } } \ No newline at end of file diff --git a/common/service-utils/src/main/java/cn/bunny/common/service/exception/GlobalExceptionHandler.java b/common/service-utils/src/main/java/cn/bunny/common/service/exception/GlobalExceptionHandler.java index 30ec51c..14532e6 100644 --- a/common/service-utils/src/main/java/cn/bunny/common/service/exception/GlobalExceptionHandler.java +++ b/common/service-utils/src/main/java/cn/bunny/common/service/exception/GlobalExceptionHandler.java @@ -1,10 +1,12 @@ package cn.bunny.common.service.exception; +import cn.bunny.pojo.constant.ExceptionConstant; import cn.bunny.pojo.result.Result; import cn.bunny.pojo.result.ResultCodeEnum; -import cn.bunny.pojo.result.constant.ExceptionConstant; import lombok.extern.slf4j.Slf4j; +import org.springframework.context.support.DefaultMessageSourceResolvable; +import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestControllerAdvice; @@ -12,6 +14,9 @@ import org.springframework.web.bind.annotation.RestControllerAdvice; import java.io.FileNotFoundException; import java.nio.file.AccessDeniedException; import java.sql.SQLIntegrityConstraintViolationException; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.stream.Collectors; @RestControllerAdvice @Slf4j @@ -32,18 +37,42 @@ public class GlobalExceptionHandler { public Result exceptionHandler(RuntimeException exception) throws FileNotFoundException { log.error("GlobalExceptionHandler===>运行时异常信息:{}", exception.getMessage()); exception.printStackTrace(); - return Result.error(null, 500, "出错了啦"); + return Result.error(null, 500, "出错了"); } // 捕获系统异常 @ExceptionHandler(Exception.class) @ResponseBody public Result error(Exception exception) { - log.error("GlobalExceptionHandler===>系统异常信息:{}", exception.getMessage()); + log.error("捕获系统异常:{}", exception.getMessage()); + log.error("GlobalExceptionHandler===>系统异常信息:{}", (Object) exception.getStackTrace()); + // 错误消息 + String message = exception.getMessage(); + + // 匹配到内容 + String patternString = "Request method '(\\w+)' is not supported"; + Matcher matcher = Pattern.compile(patternString).matcher(message); + if (matcher.find()) return Result.error(null, 500, "请求方法错误,不是 " + matcher.group(1)); + + // 请求API不存在 + String noStaticResource = "No static resource (.*)\\."; + Matcher noStaticResourceMatcher = Pattern.compile(noStaticResource).matcher(message); + if (noStaticResourceMatcher.find()) + return Result.error(null, 500, "请求API不存在 " + noStaticResourceMatcher.group(1)); + + // 返回错误内容 return Result.error(null, 500, "系统异常"); } + // 表单验证字段 + @ExceptionHandler(MethodArgumentNotValidException.class) + public Result handleValidationExceptions(MethodArgumentNotValidException ex) { + log.error("表单验证失败:{}", ex.getMessage()); + String errorMessage = ex.getBindingResult().getFieldErrors().stream().map(DefaultMessageSourceResolvable::getDefaultMessage).collect(Collectors.joining(", ")); + return Result.error(null, 201, errorMessage); + } + // 特定异常处理 @ExceptionHandler(ArithmeticException.class) @ResponseBody @@ -73,10 +102,10 @@ public class GlobalExceptionHandler { // 截取用户名 String username = message.split(" ")[2]; // 错误信息 - String errorMessage = username + ExceptionConstant.ALREADY_USER_Exception; + String errorMessage = username + ExceptionConstant.ALREADY_USER_EXCEPTION; return Result.error(errorMessage); } else { - return Result.error(ExceptionConstant.UNKNOWN_Exception); + return Result.error(ExceptionConstant.UNKNOWN_EXCEPTION); } } } diff --git a/common/service-utils/src/main/java/cn/bunny/common/service/interceptor/UserTokenInterceptor.java b/common/service-utils/src/main/java/cn/bunny/common/service/interceptor/UserTokenInterceptor.java index bfe839e..58d4bee 100644 --- a/common/service-utils/src/main/java/cn/bunny/common/service/interceptor/UserTokenInterceptor.java +++ b/common/service-utils/src/main/java/cn/bunny/common/service/interceptor/UserTokenInterceptor.java @@ -1,13 +1,6 @@ package cn.bunny.common.service.interceptor; import cn.bunny.common.service.context.BaseContext; -import cn.bunny.common.service.utils.JwtHelper; -import cn.bunny.common.service.utils.ResponseUtil; -import cn.bunny.pojo.result.Result; -import cn.bunny.pojo.result.ResultCodeEnum; -import cn.bunny.pojo.result.constant.RedisUserConstant; -import cn.bunny.vo.system.login.LoginVo; -import com.alibaba.fastjson2.JSONObject; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import lombok.NonNull; @@ -16,11 +9,8 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.lang.Nullable; import org.springframework.stereotype.Component; -import org.springframework.web.method.HandlerMethod; import org.springframework.web.servlet.HandlerInterceptor; -import java.util.Map; - /** * * 微服务请求其它模块找不到Token,无法从线程中获取值 * 传递请求头,在微服务中 @@ -34,31 +24,31 @@ public class UserTokenInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, @NonNull HttpServletResponse response, @NonNull Object handler) { String token = request.getHeader("token"); - Map mapByToken = JwtHelper.getMapByToken(token); - LoginVo loginVo = JSONObject.parseObject(JSONObject.toJSONString(mapByToken), LoginVo.class); - Object redisUserinfo = redisTemplate.opsForValue().get(RedisUserConstant.getUserLoginInfoPrefix(loginVo.getEmail())); + // Map mapByToken = JwtHelper.getMapByToken(token); + // LoginVo loginVo = JSONObject.parseObject(JSONObject.toJSONString(mapByToken), LoginVo.class); + // Object redisUserinfo = redisTemplate.opsForValue().get(RedisUserConstant.getUserLoginInfoPrefix(loginVo.getEmail())); + // + // // 不是动态方法直接返回 + // if (!(handler instanceof HandlerMethod)) return true; + // + // // token过期-提示身份验证过期 + // if (JwtHelper.isExpired(token)) { + // ResponseUtil.out(response, Result.error(ResultCodeEnum.AUTHENTICATION_EXPIRED)); + // return false; + // } + // // 解析不到userId + // if (loginVo.getId() == null) { + // ResponseUtil.out(response, Result.error(ResultCodeEnum.LOGIN_AUTH)); + // return false; + // } + // if (redisUserinfo == null) { + // ResponseUtil.out(response, Result.error(ResultCodeEnum.LOGIN_AUTH)); + // return false; + // } - // 不是动态方法直接返回 - if (!(handler instanceof HandlerMethod)) return true; - - // token过期-提示身份验证过期 - if (JwtHelper.isExpired(token)) { - ResponseUtil.out(response, Result.error(ResultCodeEnum.AUTHENTICATION_EXPIRED)); - return false; - } - // 解析不到userId - if (loginVo.getId() == null) { - ResponseUtil.out(response, Result.error(ResultCodeEnum.LOGIN_AUTH)); - return false; - } - if (redisUserinfo == null) { - ResponseUtil.out(response, Result.error(ResultCodeEnum.LOGIN_AUTH)); - return false; - } - - BaseContext.setUserId(loginVo.getId()); - BaseContext.setUsername(loginVo.getEmail()); - BaseContext.setLoginVo(loginVo); + // BaseContext.setUserId(loginVo.getId()); + // BaseContext.setUsername(loginVo.getEmail()); + // BaseContext.setLoginVo(loginVo); return true; } diff --git a/common/service-utils/src/main/java/cn/bunny/common/service/utils/HttpUtil.java b/common/service-utils/src/main/java/cn/bunny/common/service/utils/HttpUtil.java new file mode 100644 index 0000000..bfb9b51 --- /dev/null +++ b/common/service-utils/src/main/java/cn/bunny/common/service/utils/HttpUtil.java @@ -0,0 +1,206 @@ +package cn.bunny.common.service.utils; + +import org.apache.commons.lang3.StringUtils; +import org.apache.http.HttpResponse; +import org.apache.http.NameValuePair; +import org.apache.http.client.HttpClient; +import org.apache.http.client.entity.UrlEncodedFormEntity; +import org.apache.http.client.methods.HttpDelete; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.client.methods.HttpPut; +import org.apache.http.conn.ClientConnectionManager; +import org.apache.http.conn.scheme.Scheme; +import org.apache.http.conn.scheme.SchemeRegistry; +import org.apache.http.conn.ssl.SSLSocketFactory; +import org.apache.http.entity.ByteArrayEntity; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.DefaultHttpClient; +import org.apache.http.message.BasicNameValuePair; + +import javax.net.ssl.SSLContext; +import javax.net.ssl.TrustManager; +import javax.net.ssl.X509TrustManager; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.security.cert.X509Certificate; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class HttpUtil { + public static HttpResponse doGet(String host, String path, String method, Map headers, Map querys) throws Exception { + HttpClient httpClient = wrapClient(host); + + HttpGet request = new HttpGet(buildUrl(host, path, querys)); + for (Map.Entry e : headers.entrySet()) { + request.addHeader(e.getKey(), e.getValue()); + } + + return httpClient.execute(request); + } + + public static HttpResponse doPost(String host, String path, String method, Map headers, Map querys, Map bodys) throws Exception { + HttpClient httpClient = wrapClient(host); + + HttpPost request = new HttpPost(buildUrl(host, path, querys)); + for (Map.Entry e : headers.entrySet()) { + request.addHeader(e.getKey(), e.getValue()); + } + + if (bodys != null) { + List nameValuePairList = new ArrayList(); + + for (String key : bodys.keySet()) { + nameValuePairList.add(new BasicNameValuePair(key, bodys.get(key))); + } + UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(nameValuePairList, "utf-8"); + formEntity.setContentType("application/x-www-form-urlencoded; charset=UTF-8"); + request.setEntity(formEntity); + } + + return httpClient.execute(request); + } + + + public static HttpResponse doPost(String host, String path, String method, Map headers, Map querys, String body) throws Exception { + HttpClient httpClient = wrapClient(host); + + HttpPost request = new HttpPost(buildUrl(host, path, querys)); + for (Map.Entry e : headers.entrySet()) { + request.addHeader(e.getKey(), e.getValue()); + } + + if (StringUtils.isNotBlank(body)) { + request.setEntity(new StringEntity(body, "utf-8")); + } + + return httpClient.execute(request); + } + + + public static HttpResponse doPost(String host, String path, String method, Map headers, Map querys, byte[] body) throws Exception { + HttpClient httpClient = wrapClient(host); + + HttpPost request = new HttpPost(buildUrl(host, path, querys)); + for (Map.Entry e : headers.entrySet()) { + request.addHeader(e.getKey(), e.getValue()); + } + + if (body != null) { + request.setEntity(new ByteArrayEntity(body)); + } + + return httpClient.execute(request); + } + + + public static HttpResponse doPut(String host, String path, String method, Map headers, Map querys, String body) throws Exception { + HttpClient httpClient = wrapClient(host); + + HttpPut request = new HttpPut(buildUrl(host, path, querys)); + for (Map.Entry e : headers.entrySet()) { + request.addHeader(e.getKey(), e.getValue()); + } + + if (StringUtils.isNotBlank(body)) { + request.setEntity(new StringEntity(body, "utf-8")); + } + + return httpClient.execute(request); + } + + + public static HttpResponse doPut(String host, String path, String method, Map headers, Map querys, byte[] body) throws Exception { + HttpClient httpClient = wrapClient(host); + + HttpPut request = new HttpPut(buildUrl(host, path, querys)); + for (Map.Entry e : headers.entrySet()) { + request.addHeader(e.getKey(), e.getValue()); + } + + if (body != null) { + request.setEntity(new ByteArrayEntity(body)); + } + + return httpClient.execute(request); + } + + + public static HttpResponse doDelete(String host, String path, String method, Map headers, Map querys) throws Exception { + HttpClient httpClient = wrapClient(host); + + HttpDelete request = new HttpDelete(buildUrl(host, path, querys)); + for (Map.Entry e : headers.entrySet()) { + request.addHeader(e.getKey(), e.getValue()); + } + + return httpClient.execute(request); + } + + private static String buildUrl(String host, String path, Map querys) throws UnsupportedEncodingException { + StringBuilder sbUrl = new StringBuilder(); + sbUrl.append(host); + if (!StringUtils.isBlank(path)) { + sbUrl.append(path); + } + if (null != querys) { + StringBuilder sbQuery = new StringBuilder(); + for (Map.Entry query : querys.entrySet()) { + if (!sbQuery.isEmpty()) { + sbQuery.append("&"); + } + if (StringUtils.isBlank(query.getKey()) && !StringUtils.isBlank(query.getValue())) { + sbQuery.append(query.getValue()); + } + if (!StringUtils.isBlank(query.getKey())) { + sbQuery.append(query.getKey()); + if (!StringUtils.isBlank(query.getValue())) { + sbQuery.append("="); + sbQuery.append(URLEncoder.encode(query.getValue(), StandardCharsets.UTF_8)); + } + } + } + if (!sbQuery.isEmpty()) { + sbUrl.append("?").append(sbQuery); + } + } + + return sbUrl.toString(); + } + + private static HttpClient wrapClient(String host) { + HttpClient httpClient = new DefaultHttpClient(); + if (host.startsWith("https://")) { + sslClient(httpClient); + } + + return httpClient; + } + + private static void sslClient(HttpClient httpClient) { + try { + SSLContext ctx = SSLContext.getInstance("TLS"); + X509TrustManager tm = new X509TrustManager() { + public X509Certificate[] getAcceptedIssuers() { + return null; + } + + public void checkClientTrusted(X509Certificate[] xcs, String str) { + } + + public void checkServerTrusted(X509Certificate[] xcs, String str) { + } + }; + ctx.init(null, new TrustManager[]{tm}, null); + SSLSocketFactory ssf = new SSLSocketFactory(ctx); + ssf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); + ClientConnectionManager ccm = httpClient.getConnectionManager(); + SchemeRegistry registry = ccm.getSchemeRegistry(); + registry.register(new Scheme("https", 443, ssf)); + } catch (Exception ex) { + throw new RuntimeException(); + } + } +} \ No newline at end of file diff --git a/common/service-utils/src/main/java/cn/bunny/common/service/utils/ip/IpEntity.java b/common/service-utils/src/main/java/cn/bunny/common/service/utils/ip/IpEntity.java new file mode 100644 index 0000000..0b09e8b --- /dev/null +++ b/common/service-utils/src/main/java/cn/bunny/common/service/utils/ip/IpEntity.java @@ -0,0 +1,21 @@ +package cn.bunny.common.service.utils.ip; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +@ApiModel(value = "IpEntity对象", description = "用户IP相关信息") +public class IpEntity { + @ApiModelProperty("原始地址") + private String remoteAddr; + + @ApiModelProperty("IP归属地") + private String ipRegion; +} diff --git a/common/service-utils/src/main/java/cn/bunny/common/service/utils/ip/IpUtil.java b/common/service-utils/src/main/java/cn/bunny/common/service/utils/ip/IpUtil.java new file mode 100644 index 0000000..8f18a0b --- /dev/null +++ b/common/service-utils/src/main/java/cn/bunny/common/service/utils/ip/IpUtil.java @@ -0,0 +1,99 @@ +package cn.bunny.common.service.utils.ip; + +import jakarta.annotation.PostConstruct; +import lombok.extern.slf4j.Slf4j; +import org.lionsoul.ip2region.xdb.Searcher; +import org.springframework.core.io.ClassPathResource; +import org.springframework.util.FileCopyUtils; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import java.io.InputStream; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +@Slf4j +public class IpUtil { + private static Searcher searcher; + + /** + * 判断是否为合法 IP + */ + public static boolean checkIp(String ipAddress) { + String ip = "([1-9]|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])(\\.(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])){3}"; + Pattern pattern = Pattern.compile(ip); + Matcher matcher = pattern.matcher(ipAddress); + return matcher.matches(); + } + + /** + * 在服务启动时,将 ip2region 加载到内存中 + */ + @PostConstruct + private static void initIp2Region() { + try { + InputStream inputStream = new ClassPathResource("/ipdb/ip2region.xdb").getInputStream(); + byte[] bytes = FileCopyUtils.copyToByteArray(inputStream); + searcher = Searcher.newWithBuffer(bytes); + } catch (Exception exception) { + log.error("ip转换错误消息:{}", exception.getMessage()); + log.error("ip转换错误栈:{}", (Object) exception.getStackTrace()); + } + } + + /** + * 获取 ip 所属地址 + * + * @param ip ip + */ + public static String getIpRegion(String ip) { + if (ip.equals("0:0:0:0:0:0:0:1")) ip = "127.0.0.1"; + boolean isIp = checkIp(ip); + if (isIp) { + initIp2Region(); + try { + // searchIpInfo 的数据格式: 国家|区域|省份|城市|ISP + String searchIpInfo = searcher.search(ip); + String[] splitIpInfo = searchIpInfo.split("\\|"); + if (splitIpInfo.length > 0) { + if ("中国".equals(splitIpInfo[0])) { + // 国内属地返回省份 + return splitIpInfo[2]; + } else if ("0".equals(splitIpInfo[0])) { + if ("内网IP".equals(splitIpInfo[4])) { + // 内网 IP + return splitIpInfo[4]; + } else { + return ""; + } + } else { + // 国外属地返回国家 + return splitIpInfo[0]; + } + } + } catch (Exception exception) { + log.error("获取 ip 所属地址消息:{}", exception.getMessage()); + log.error("获取 ip 所属地址:{}", (Object) exception.getStackTrace()); + } + return ""; + } else { + throw new IllegalArgumentException("非法的IP地址"); + } + } + + /** + * * 获取当前用户登录IP地址 + * + * @return IP地址 + */ + public static IpEntity getCurrentUserIpAddress() { + // 获取用户IP地址 + ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); + String remoteAddr = requestAttributes != null ? requestAttributes.getRequest().getRemoteAddr() : "0:0:0:0:0:0:0:1"; + String ipRegion = IpUtil.getIpRegion(remoteAddr); + return IpEntity.builder() + .remoteAddr(remoteAddr) + .ipRegion(ipRegion) + .build(); + } +} diff --git a/module/module-mail/src/main/java/cn/bunny/module/mail/utils/MailSendCheckUtil.java b/common/service-utils/src/main/java/cn/bunny/common/service/utils/mail/MailSendCheckUtil.java similarity index 84% rename from module/module-mail/src/main/java/cn/bunny/module/mail/utils/MailSendCheckUtil.java rename to common/service-utils/src/main/java/cn/bunny/common/service/utils/mail/MailSendCheckUtil.java index f386346..540a124 100644 --- a/module/module-mail/src/main/java/cn/bunny/module/mail/utils/MailSendCheckUtil.java +++ b/common/service-utils/src/main/java/cn/bunny/common/service/utils/mail/MailSendCheckUtil.java @@ -1,8 +1,8 @@ -package cn.bunny.module.mail.utils; +package cn.bunny.common.service.utils.mail; import cn.bunny.common.service.utils.EmptyUtil; -import cn.bunny.pojo.email.EmailSend; -import cn.bunny.pojo.result.constant.MailMessageConstant; +import cn.bunny.pojo.common.EmailSend; +import cn.bunny.pojo.constant.MailMessageConstant; public class MailSendCheckUtil { /** diff --git a/module/module-mail/src/main/java/cn/bunny/module/mail/utils/MailSenderUtil.java b/common/service-utils/src/main/java/cn/bunny/common/service/utils/mail/MailSenderUtil.java similarity index 92% rename from module/module-mail/src/main/java/cn/bunny/module/mail/utils/MailSenderUtil.java rename to common/service-utils/src/main/java/cn/bunny/common/service/utils/mail/MailSenderUtil.java index 85ee281..65c6f2e 100644 --- a/module/module-mail/src/main/java/cn/bunny/module/mail/utils/MailSenderUtil.java +++ b/common/service-utils/src/main/java/cn/bunny/common/service/utils/mail/MailSenderUtil.java @@ -1,7 +1,7 @@ -package cn.bunny.module.mail.utils; +package cn.bunny.common.service.utils.mail; -import cn.bunny.pojo.email.EmailSend; -import cn.bunny.pojo.email.EmailSendInit; +import cn.bunny.pojo.common.EmailSend; +import cn.bunny.pojo.common.EmailSendInit; import jakarta.mail.MessagingException; import jakarta.mail.internet.MimeMessage; import org.springframework.mail.SimpleMailMessage; @@ -43,6 +43,7 @@ public class MailSenderUtil { MimeMessage message = javaMailSender.createMimeMessage(); // 创建 MimeMessageHelper MimeMessageHelper helper = new MimeMessageHelper(message, true); + String ccParam = emailSend.getCcParam(); // 设置发送人 helper.setFrom(username); @@ -53,11 +54,15 @@ public class MailSenderUtil { // 设置发送消息 为富文本 helper.setText(emailSend.getMessage(), emailSend.getIsRichText()); // 设置抄送人 - helper.setCc(emailSend.getCcParam().split(",")); + if (ccParam != null) { + helper.setCc(ccParam.split(",")); + } // 邮件添加附件 MultipartFile[] files = emailSend.getFile(); - for (MultipartFile file : files) { - helper.addAttachment(Objects.requireNonNull(file.getOriginalFilename()), file); + if (files != null) { + for (MultipartFile file : files) { + helper.addAttachment(Objects.requireNonNull(file.getOriginalFilename()), file); + } } // 发送邮件 diff --git a/module/module-mail/src/main/java/cn/bunny/module/mail/template-propties b/common/service-utils/src/main/java/cn/bunny/common/service/utils/mail/template-propties similarity index 95% rename from module/module-mail/src/main/java/cn/bunny/module/mail/template-propties rename to common/service-utils/src/main/java/cn/bunny/common/service/utils/mail/template-propties index 2ce3978..cc51c94 100644 --- a/module/module-mail/src/main/java/cn/bunny/module/mail/template-propties +++ b/common/service-utils/src/main/java/cn/bunny/common/service/utils/mail/template-propties @@ -1,3 +1,5 @@ +Configuration example + mail: host: smtp.qq.com # 邮箱地址 port: 465 # 邮箱端口号 diff --git a/module/module-minio/src/main/java/cn/bunny/module/minio/properties/MinioProperties.java b/common/service-utils/src/main/java/cn/bunny/common/service/utils/minio/MinioProperties.java similarity index 90% rename from module/module-minio/src/main/java/cn/bunny/module/minio/properties/MinioProperties.java rename to common/service-utils/src/main/java/cn/bunny/common/service/utils/minio/MinioProperties.java index 8ee36f7..2f659be 100644 --- a/module/module-minio/src/main/java/cn/bunny/module/minio/properties/MinioProperties.java +++ b/common/service-utils/src/main/java/cn/bunny/common/service/utils/minio/MinioProperties.java @@ -1,4 +1,4 @@ -package cn.bunny.module.minio.properties; +package cn.bunny.common.service.utils.minio; import io.minio.MinioClient; import lombok.Data; @@ -21,7 +21,6 @@ public class MinioProperties { @Bean public MinioClient minioClient() { - log.info("注册MinioClient..."); return MinioClient.builder().endpoint(endpointUrl).credentials(accessKey, secretKey).build(); } } diff --git a/common/service-utils/src/main/java/cn/bunny/common/service/utils/minio/MinioUtil.java b/common/service-utils/src/main/java/cn/bunny/common/service/utils/minio/MinioUtil.java new file mode 100644 index 0000000..c3c991e --- /dev/null +++ b/common/service-utils/src/main/java/cn/bunny/common/service/utils/minio/MinioUtil.java @@ -0,0 +1,142 @@ +package cn.bunny.common.service.utils.minio; + +import cn.bunny.common.service.exception.BunnyException; +import cn.bunny.pojo.common.MinioFIlePath; +import cn.bunny.pojo.constant.MinioConstant; +import cn.bunny.pojo.result.ResultCodeEnum; +import io.minio.GetObjectArgs; +import io.minio.GetObjectResponse; +import io.minio.MinioClient; +import io.minio.PutObjectArgs; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.util.StringUtils; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.io.InputStream; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.UUID; + +/** + * Minio操作工具类 简化操作步骤 + * By:Bunny0212 + */ +@Component +@Slf4j +public class MinioUtil { + @Autowired + private MinioProperties properties; + @Autowired + private MinioClient minioClient; + + /** + * 获取Minio文件路径 + */ + public static MinioFIlePath getMinioFilePath(String buckName, String minioPreType, MultipartFile file) { + String uuid = UUID.randomUUID().toString(); + // 定义日期时间格式 + LocalDateTime currentDateTime = LocalDateTime.now(); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM-dd"); + String extension = ""; + + // 原始文件名 + String filename = file.getOriginalFilename(); + if (StringUtils.hasText(filename) && filename.contains(".")) { + extension = "." + filename.substring(filename.lastIndexOf(".") + 1); + } + + // UUID防止重名 + String uuidFilename = uuid + extension; + + // 拼接时间+UUID文件名 + String timeUuidFilename = currentDateTime.format(formatter) + "/" + uuidFilename;// 加上时间路径 + + // 上传根文件夹+拼接时间+UUID文件名 + String filepath = MinioConstant.getType(minioPreType) + timeUuidFilename; + + // 桶名称+上传根文件夹+拼接时间+UUID文件名 + String buckNameFilepath = "/" + buckName + MinioConstant.getType(minioPreType) + timeUuidFilename; + + // 设置及Minio基础信息 + MinioFIlePath minioFIlePath = new MinioFIlePath(); + minioFIlePath.setFilename(filename); + minioFIlePath.setUuidFilename(uuidFilename); + minioFIlePath.setTimeUuidFilename(timeUuidFilename); + minioFIlePath.setFilepath(filepath); + minioFIlePath.setBucketNameFilepath(buckNameFilepath); + + return minioFIlePath; + } + + /** + * * 上传文件并返回处理信息 + */ + public MinioFIlePath getUploadMinioObjectFilePath(MultipartFile file, String minioPreType) throws IOException { + // 如果buckName为空,设置为默认的桶 + String bucketName = properties.getBucketName(); + if (file != null) { + MinioFIlePath minioFile = getMinioFilePath(bucketName, minioPreType, file); + String filepath = minioFile.getFilepath(); + + // 上传对象 + putObject(bucketName, filepath, file.getInputStream(), file.getSize()); + + // 设置图片地址 + return minioFile; + } + return null; + } + + /** + * 获取默认bucket文件,并返回字节数组 + * + * @param objectName 对象名称 + * @return 文件流对象 + */ + public byte[] getBucketObjectByte(String objectName) { + // 如果buckName为空,设置为默认的桶 + String bucketName = properties.getBucketName(); + + try { + objectName = objectName.replace("/" + bucketName, ""); + GetObjectResponse getObjectResponse = minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(objectName).build()); + + return getObjectResponse.readAllBytes(); + } catch (Exception exception) { + exception.getStackTrace(); + } + throw new BunnyException(ResultCodeEnum.GET_BUCKET_EXCEPTION); + } + + /** + * 获取Minio全路径名,Object带有桶名称 + * + * @param objectName 对象名称 + * @return 全路径 + */ + public String getObjectNameFullPath(String objectName) { + String url = properties.getEndpointUrl(); + + return url + objectName; + } + + /** + * 上传文件 + * + * @param bucketName 桶名称 + * @param filename 文件名 + * @param inputStream 输入流 + * @param size 大小 + */ + public void putObject(String bucketName, String filename, InputStream inputStream, Long size) { + try { + minioClient.putObject(PutObjectArgs.builder().bucket(bucketName).object(filename).stream(inputStream, size, -1).build()); + } catch (Exception exception) { + log.error("上传文件失败:{}", (Object) exception.getStackTrace()); + throw new BunnyException(ResultCodeEnum.UPDATE_ERROR); + } + } +} \ No newline at end of file diff --git a/dao/src/main/java/cn/bunny/dto/email/EmailTemplateDto.java b/dao/src/main/java/cn/bunny/dto/email/EmailTemplateDto.java index 734a1c0..e890cf4 100644 --- a/dao/src/main/java/cn/bunny/dto/email/EmailTemplateDto.java +++ b/dao/src/main/java/cn/bunny/dto/email/EmailTemplateDto.java @@ -1,5 +1,7 @@ package cn.bunny.dto.email; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -9,13 +11,21 @@ import lombok.NoArgsConstructor; @AllArgsConstructor @NoArgsConstructor @Builder +@Schema(name = "EmailTemplateDto", title = "邮箱模板请求内容", description = "邮箱模板请求内容") public class EmailTemplateDto { - // 模板名称 + + @Schema(name = "templateName", title = "模板名称") + @NotBlank(message = "模板名称不能为空") private String templateName; - // 主题 + + @Schema(name = "subject", title = "主题") + @NotBlank(message = "主题不能为空") private String subject; - // 邮件内容 + + @Schema(name = "body", title = "邮件内容") + @NotBlank(message = "邮件内容不能为空") private String body; - // 邮件类型 + + @Schema(name = "type", title = "邮件类型") private String type; } diff --git a/dao/src/main/java/cn/bunny/dto/email/EmailUsersDto.java b/dao/src/main/java/cn/bunny/dto/email/EmailUsersDto.java index be3b1b4..8953864 100644 --- a/dao/src/main/java/cn/bunny/dto/email/EmailUsersDto.java +++ b/dao/src/main/java/cn/bunny/dto/email/EmailUsersDto.java @@ -1,5 +1,8 @@ package cn.bunny.dto.email; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -12,19 +15,31 @@ import lombok.NoArgsConstructor; @AllArgsConstructor @NoArgsConstructor @Builder +@Schema(name = "EmailUsersDto", title = "邮箱用户发送基础内容", description = "邮箱用户发送基础内容") public class EmailUsersDto { - // 修改时需要传 + + @Schema(name = "id", title = "主键") + @NotBlank(message = "id不能为空") private Long id; - // 邮箱 + + @Schema(name = "email", title = "邮箱") + @NotBlank(message = "邮箱不能为空") private String email; - // 密码 + + @Schema(name = "password", title = "密码") + @NotBlank(message = "密码不能为空") private String password; - // SMTP服务器 + + @Schema(name = "host", title = "SMTP服务器") private String host; - // 端口号 + + @Schema(name = "port", title = "端口号") + @NotNull(message = "端口号不能为空") private Integer port; - // 邮箱协议 + + @Schema(name = "smtpAgreement", title = "邮箱协议") private Integer smtpAgreement; - // 是否为默认邮件 + + @Schema(name = "isDefault", title = "是否为默认邮件") private Boolean isDefault; } diff --git a/dao/src/main/java/cn/bunny/dto/user/LoginDto.java b/dao/src/main/java/cn/bunny/dto/user/LoginDto.java index 1f4213b..b00b2ed 100644 --- a/dao/src/main/java/cn/bunny/dto/user/LoginDto.java +++ b/dao/src/main/java/cn/bunny/dto/user/LoginDto.java @@ -1,5 +1,7 @@ package cn.bunny.dto.user; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -9,11 +11,22 @@ import lombok.NoArgsConstructor; @AllArgsConstructor @NoArgsConstructor @Builder +@Schema(name = "LoginDto", title = "登录表单内容", description = "登录表单内容") public class LoginDto { - // 用户名 + + @Schema(name = "username", title = "用户名") + @NotBlank(message = "用户名不能为空") private String username; - // 密码 + + @Schema(name = "password", title = "密码") + @NotBlank(message = "密码不能为空") private String password; - // 邮箱验证码 + + + @Schema(name = "emailCode", title = "邮箱验证码") + @NotBlank(message = "邮箱验证码不能为空") private String emailCode; + + @Schema(name = "readMeDay", title = "记住我的天数") + private Long readMeDay = 1L; } diff --git a/dao/src/main/java/cn/bunny/entity/base/BaseEntity.java b/dao/src/main/java/cn/bunny/entity/BaseEntity.java similarity index 97% rename from dao/src/main/java/cn/bunny/entity/base/BaseEntity.java rename to dao/src/main/java/cn/bunny/entity/BaseEntity.java index 451c19b..960e2ff 100644 --- a/dao/src/main/java/cn/bunny/entity/base/BaseEntity.java +++ b/dao/src/main/java/cn/bunny/entity/BaseEntity.java @@ -1,4 +1,4 @@ -package cn.bunny.entity.base; +package cn.bunny.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; diff --git a/dao/src/main/java/cn/bunny/entity/system/AdminUser.java b/dao/src/main/java/cn/bunny/entity/system/AdminUser.java new file mode 100644 index 0000000..8088269 --- /dev/null +++ b/dao/src/main/java/cn/bunny/entity/system/AdminUser.java @@ -0,0 +1,56 @@ +package cn.bunny.entity.system; + +import cn.bunny.entity.BaseEntity; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + *

+ * 管理员用户信息 + *

+ * + * @author Bunny + * @since 2024-06-26 + */ +@EqualsAndHashCode(callSuper = true) +@Data +@Accessors(chain = true) +@TableName("sys_user") +@Schema(name = "AdminUser对象", title = "用户信息", description = "用户信息") +public class AdminUser extends BaseEntity { + @Schema(name = "username", title = "用户名") + private String username; + + @Schema(name = "nickName", title = "昵称") + private String nickName; + + @Schema(name = "email", title = "邮箱") + private String email; + + @Schema(name = "phone", title = "手机号") + private String phone; + + @Schema(name = "password", title = "密码") + private String password; + + @Schema(name = "avatar", title = "头像") + private String avatar; + + @Schema(name = "sex", title = "性别", description = "0:女 1:男") + private Byte sex; + + @Schema(name = "summary", title = "个人描述") + private String summary; + + @Schema(name = "lastLoginIp", title = "最后登录IP") + private String lastLoginIp; + + @Schema(name = "lastLoginIpAddress", title = "最后登录ip归属地") + private String lastLoginIpAddress; + + @Schema(name = "status", title = "状态", description = "1:禁用 0:正常") + private Byte status; +} diff --git a/dao/src/main/java/cn/bunny/entity/system/EmailTemplate.java b/dao/src/main/java/cn/bunny/entity/system/EmailTemplate.java new file mode 100644 index 0000000..3313d49 --- /dev/null +++ b/dao/src/main/java/cn/bunny/entity/system/EmailTemplate.java @@ -0,0 +1,38 @@ +package cn.bunny.entity.system; + +import cn.bunny.entity.BaseEntity; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + *

+ * + *

+ * + * @author Bunny + * @since 2024-05-19 + */ +@EqualsAndHashCode(callSuper = true) +@Data +@Accessors(chain = true) +@TableName("sys_email_template") +@Schema(name = "EmailTemplate对象", title = "邮件模板表", description = "邮件模板表") +public class EmailTemplate extends BaseEntity { + @Schema(name = "templateName", title = "模板名称") + private String templateName; + + @Schema(name = "subject", title = "主题") + private String subject; + + @Schema(name = "body", title = "邮件内容") + private String body; + + @Schema(name = "type", title = "邮件类型") + private String type; + + @Schema(name = "isDefault", title = "是否默认") + private Boolean isDefault; +} \ No newline at end of file diff --git a/dao/src/main/java/cn/bunny/entity/system/EmailUsers.java b/dao/src/main/java/cn/bunny/entity/system/EmailUsers.java new file mode 100644 index 0000000..1d26527 --- /dev/null +++ b/dao/src/main/java/cn/bunny/entity/system/EmailUsers.java @@ -0,0 +1,45 @@ +package cn.bunny.entity.system; + +import cn.bunny.entity.BaseEntity; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + *

+ * 邮箱发送表 + *

+ * + * @author Bunny + * @since 2024-05-17 + */ + +@EqualsAndHashCode(callSuper = true) +@Data +@Accessors(chain = true) +@TableName("sys_email_users") +@Schema(name = "EmailUsers对象", title = "邮箱发送表", description = "邮箱发送表") +public class EmailUsers extends BaseEntity { + @Schema(name = "email", title = "邮箱") + private String email; + + @Schema(name = "emailTemplate", title = "使用邮件模板") + private Long emailTemplate; + + @Schema(name = "password", title = "密码") + private String password; + + @Schema(name = "host", title = "Host地址") + private String host; + + @Schema(name = "port", title = "端口号") + private Integer port; + + @Schema(name = "smtpAgreement", title = "邮箱协议") + private String smtpAgreement; + + @Schema(name = "isDefault", title = "是否为默认邮件") + private Byte isDefault; +} \ No newline at end of file diff --git a/dao/src/main/java/cn/bunny/entity/system/log/SystemLog.java b/dao/src/main/java/cn/bunny/entity/system/SystemLog.java similarity index 97% rename from dao/src/main/java/cn/bunny/entity/system/log/SystemLog.java rename to dao/src/main/java/cn/bunny/entity/system/SystemLog.java index 58d7308..cdbf098 100644 --- a/dao/src/main/java/cn/bunny/entity/system/log/SystemLog.java +++ b/dao/src/main/java/cn/bunny/entity/system/SystemLog.java @@ -1,4 +1,4 @@ -package cn.bunny.entity.system.log; +package cn.bunny.entity.system; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; diff --git a/dao/src/main/java/cn/bunny/entity/system/admin/AdminPower.java b/dao/src/main/java/cn/bunny/entity/system/admin/AdminPower.java deleted file mode 100644 index 2544ab8..0000000 --- a/dao/src/main/java/cn/bunny/entity/system/admin/AdminPower.java +++ /dev/null @@ -1,58 +0,0 @@ -package cn.bunny.entity.system.admin; - -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Getter; -import lombok.Setter; -import lombok.experimental.Accessors; - -import java.io.Serial; -import java.io.Serializable; -import java.time.LocalDateTime; - -/** - *

- * - *

- * - * @author Bunny - * @since 2024-05-18 - */ -@Getter -@Setter -@Accessors(chain = true) -@TableName("admin_power") -@ApiModel(value = "AdminPower对象", description = "") -public class AdminPower implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - @ApiModelProperty("权限ID") - @TableId(value = "id", type = IdType.AUTO) - private Long id; - - @ApiModelProperty("权限名称") - private String powerName; - - @ApiModelProperty("权限编码") - private String powerCode; - - @ApiModelProperty("描述") - private String description; - - @ApiModelProperty("创建时间") - private LocalDateTime createTime; - - @ApiModelProperty("更新时间") - private LocalDateTime updateTime; - - @ApiModelProperty("更新用户") - private String updateUser; - - @ApiModelProperty("是否删除,0-未删除,1-已删除") - private Byte isDelete; -} diff --git a/dao/src/main/java/cn/bunny/entity/system/admin/AdminRole.java b/dao/src/main/java/cn/bunny/entity/system/admin/AdminRole.java deleted file mode 100644 index 59c36f4..0000000 --- a/dao/src/main/java/cn/bunny/entity/system/admin/AdminRole.java +++ /dev/null @@ -1,55 +0,0 @@ -package cn.bunny.entity.system.admin; - -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Getter; -import lombok.Setter; -import lombok.experimental.Accessors; - -import java.io.Serializable; -import java.time.LocalDateTime; - -/** - *

- * - *

- * - * @author Bunny - * @since 2024-05-18 - */ -@Getter -@Setter -@Accessors(chain = true) -@TableName("admin_role") -@ApiModel(value = "AdminRole对象", description = "") -public class AdminRole implements Serializable { - - private static final long serialVersionUID = 1L; - - @TableId(value = "id", type = IdType.AUTO) - private String id; - - @ApiModelProperty("角色名称") - private String roleName; - - @ApiModelProperty("描述") - private String description; - - @ApiModelProperty("角色代码") - private String roleCode; - - @ApiModelProperty("创建时间") - private LocalDateTime createTime; - - @ApiModelProperty("更新时间") - private LocalDateTime updateTime; - - @ApiModelProperty("操作用户") - private String updateUser; - - @ApiModelProperty("是否删除") - private Byte isDeleted; -} diff --git a/dao/src/main/java/cn/bunny/entity/system/admin/AdminRolePower.java b/dao/src/main/java/cn/bunny/entity/system/admin/AdminRolePower.java deleted file mode 100644 index 26370de..0000000 --- a/dao/src/main/java/cn/bunny/entity/system/admin/AdminRolePower.java +++ /dev/null @@ -1,56 +0,0 @@ -package cn.bunny.entity.system.admin; - -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Getter; -import lombok.Setter; -import lombok.experimental.Accessors; - -import java.io.Serializable; -import java.time.LocalDateTime; - -/** - *

- * - *

- * - * @author Bunny - * @since 2024-05-18 - */ -@Getter -@Setter -@Accessors(chain = true) -@TableName("admin_role_power") -@ApiModel(value = "AdminRolePower对象", description = "") -public class AdminRolePower implements Serializable { - - private static final long serialVersionUID = 1L; - - @ApiModelProperty("ID") - @TableId(value = "id", type = IdType.AUTO) - private String id; - - @ApiModelProperty("角色id") - private String roleId; - - @ApiModelProperty("权限id") - private String powerId; - - @ApiModelProperty("描述") - private String description; - - @ApiModelProperty("创建时间") - private LocalDateTime createTime; - - @ApiModelProperty("更新时间") - private LocalDateTime updateTime; - - @ApiModelProperty("更新用户") - private String updateUser; - - @ApiModelProperty("是否删除,0-未删除,1-已删除") - private Byte isDelete; -} diff --git a/dao/src/main/java/cn/bunny/entity/system/admin/AdminUserRole.java b/dao/src/main/java/cn/bunny/entity/system/admin/AdminUserRole.java deleted file mode 100644 index 78f954f..0000000 --- a/dao/src/main/java/cn/bunny/entity/system/admin/AdminUserRole.java +++ /dev/null @@ -1,56 +0,0 @@ -package cn.bunny.entity.system.admin; - -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Getter; -import lombok.Setter; -import lombok.experimental.Accessors; - -import java.io.Serializable; -import java.time.LocalDateTime; - -/** - *

- * - *

- * - * @author Bunny - * @since 2024-05-18 - */ -@Getter -@Setter -@Accessors(chain = true) -@TableName("admin_user_role") -@ApiModel(value = "AdminUserRole对象", description = "") -public class AdminUserRole implements Serializable { - - private static final long serialVersionUID = 1L; - - @ApiModelProperty("ID") - @TableId(value = "id", type = IdType.AUTO) - private String id; - - @ApiModelProperty("用户id") - private String userId; - - @ApiModelProperty("角色id") - private String roleId; - - @ApiModelProperty("描述") - private String description; - - @ApiModelProperty("创建时间") - private LocalDateTime createTime; - - @ApiModelProperty("更新时间") - private LocalDateTime updateTime; - - @ApiModelProperty("更新用户") - private String updateUser; - - @ApiModelProperty("是否删除,0-未删除,1-已删除") - private Byte isDelete; -} diff --git a/dao/src/main/java/cn/bunny/entity/system/admin/auth/AuthUserRole.java b/dao/src/main/java/cn/bunny/entity/system/admin/auth/AuthUserRole.java deleted file mode 100644 index f1b3794..0000000 --- a/dao/src/main/java/cn/bunny/entity/system/admin/auth/AuthUserRole.java +++ /dev/null @@ -1,21 +0,0 @@ -package cn.bunny.entity.system.admin.auth; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@AllArgsConstructor -@NoArgsConstructor -@Builder -public class AuthUserRole { - // 用户id - private Long userId; - // 角色id - private Long roleId; - // 角色代码 - private String roleCode; - // 描述 - private String roleDescription; -} diff --git a/dao/src/main/java/cn/bunny/entity/system/email/EmailTemplate.java b/dao/src/main/java/cn/bunny/entity/system/email/EmailTemplate.java deleted file mode 100644 index 18cb9c2..0000000 --- a/dao/src/main/java/cn/bunny/entity/system/email/EmailTemplate.java +++ /dev/null @@ -1,42 +0,0 @@ -package cn.bunny.entity.system.email; - -import cn.bunny.entity.base.BaseEntity; -import com.baomidou.mybatisplus.annotation.TableName; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Getter; -import lombok.Setter; -import lombok.experimental.Accessors; - -import java.io.Serial; -import java.io.Serializable; - -/** - *

- * - *

- * - * @author Bunny - * @since 2024-05-19 - */ -@Getter -@Setter -@Accessors(chain = true) -@TableName("email_template") -@ApiModel(value = "EmailTemplate对象", description = "邮件模板") -public class EmailTemplate extends BaseEntity implements Serializable { - @Serial - private static final long serialVersionUID = 1L; - - @ApiModelProperty("模板名称") - private String templateName; - - @ApiModelProperty("主题") - private String subject; - - @ApiModelProperty("邮件内容") - private String body; - - @ApiModelProperty("邮件类型") - private String type; -} diff --git a/dao/src/main/java/cn/bunny/entity/system/email/EmailUsers.java b/dao/src/main/java/cn/bunny/entity/system/email/EmailUsers.java deleted file mode 100644 index def87bb..0000000 --- a/dao/src/main/java/cn/bunny/entity/system/email/EmailUsers.java +++ /dev/null @@ -1,49 +0,0 @@ -package cn.bunny.entity.system.email; - -import cn.bunny.entity.base.BaseEntity; -import com.baomidou.mybatisplus.annotation.TableName; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Getter; -import lombok.Setter; -import lombok.experimental.Accessors; - -import java.io.Serial; -import java.io.Serializable; - -/** - *

- * 邮箱发送表 - *

- * - * @author Bunny - * @since 2024-05-17 - */ -@Getter -@Setter -@Accessors(chain = true) -@TableName("email_users") -@ApiModel(value = "EmailUsers对象", description = "邮箱发送表") -public class EmailUsers extends BaseEntity implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - @ApiModelProperty("邮箱") - private String email; - - @ApiModelProperty("密码") - private String password; - - @ApiModelProperty("Host地址") - private String host; - - @ApiModelProperty("端口号") - private Integer port; - - @ApiModelProperty("邮箱协议") - private String smtpAgreement; - - @ApiModelProperty("是否为默认邮件") - private Integer isDefault; -} diff --git a/dao/src/main/java/cn/bunny/entity/system/user/User.java b/dao/src/main/java/cn/bunny/entity/system/user/User.java deleted file mode 100644 index 33c086d..0000000 --- a/dao/src/main/java/cn/bunny/entity/system/user/User.java +++ /dev/null @@ -1,61 +0,0 @@ -package cn.bunny.entity.system.user; - -import cn.bunny.entity.base.BaseEntity; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.io.Serial; -import java.io.Serializable; -import java.time.LocalDateTime; - -/** - *

- * 用户信息 - *

- * - * @author Bunny - * @since 2024-05-17 - */ -@EqualsAndHashCode(callSuper = true) -@Data -@Accessors(chain = true) -@ApiModel(value = "User对象", description = "用户信息") -public class User extends BaseEntity implements Serializable { - @Serial - private static final long serialVersionUID = 1L; - @ApiModelProperty("昵称") - private String nickName; - @ApiModelProperty("邮箱") - private String email; - @ApiModelProperty("密码") - private String password; - @ApiModelProperty("头像") - private String avatar; - @ApiModelProperty("0:女 1:男") - private Byte sex; - @ApiModelProperty("个人描述") - private String personDescription; - @ApiModelProperty("加入时间") - private LocalDateTime joinTime; - - @ApiModelProperty("最后登录时间") - private LocalDateTime lastLoginTime; - - @ApiModelProperty("最后登录IP") - private String lastLoginIp; - - @ApiModelProperty("最后登录ip地址") - private String lastLoginIpAddress; - - @ApiModelProperty("积分") - private Integer totalIntegral; - - @ApiModelProperty("当前积分") - private Integer currentIntegral; - - @ApiModelProperty("0:禁用 1:正常") - private Byte status; -} diff --git a/dao/src/main/java/cn/bunny/pojo/email/EmailSend.java b/dao/src/main/java/cn/bunny/pojo/common/EmailSend.java similarity index 95% rename from dao/src/main/java/cn/bunny/pojo/email/EmailSend.java rename to dao/src/main/java/cn/bunny/pojo/common/EmailSend.java index 247da00..aa8a42b 100644 --- a/dao/src/main/java/cn/bunny/pojo/email/EmailSend.java +++ b/dao/src/main/java/cn/bunny/pojo/common/EmailSend.java @@ -1,4 +1,4 @@ -package cn.bunny.pojo.email; +package cn.bunny.pojo.common; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/dao/src/main/java/cn/bunny/pojo/email/EmailSendInit.java b/dao/src/main/java/cn/bunny/pojo/common/EmailSendInit.java similarity index 92% rename from dao/src/main/java/cn/bunny/pojo/email/EmailSendInit.java rename to dao/src/main/java/cn/bunny/pojo/common/EmailSendInit.java index ca084e1..0487149 100644 --- a/dao/src/main/java/cn/bunny/pojo/email/EmailSendInit.java +++ b/dao/src/main/java/cn/bunny/pojo/common/EmailSendInit.java @@ -1,4 +1,4 @@ -package cn.bunny.pojo.email; +package cn.bunny.pojo.common; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/dao/src/main/java/cn/bunny/pojo/file/MinioFIlePath.java b/dao/src/main/java/cn/bunny/pojo/common/MinioFIlePath.java similarity index 92% rename from dao/src/main/java/cn/bunny/pojo/file/MinioFIlePath.java rename to dao/src/main/java/cn/bunny/pojo/common/MinioFIlePath.java index f283278..27b08ad 100644 --- a/dao/src/main/java/cn/bunny/pojo/file/MinioFIlePath.java +++ b/dao/src/main/java/cn/bunny/pojo/common/MinioFIlePath.java @@ -1,4 +1,4 @@ -package cn.bunny.pojo.file; +package cn.bunny.pojo.common; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/dao/src/main/java/cn/bunny/pojo/constant/ExceptionConstant.java b/dao/src/main/java/cn/bunny/pojo/constant/ExceptionConstant.java new file mode 100644 index 0000000..9b7b67a --- /dev/null +++ b/dao/src/main/java/cn/bunny/pojo/constant/ExceptionConstant.java @@ -0,0 +1,22 @@ +package cn.bunny.pojo.constant; + +import lombok.Data; + + +@Data +public class ExceptionConstant { + public static final String UNKNOWN_EXCEPTION = "未知错误"; + + // 用户相关 + public static final String USER_NOT_LOGIN_EXCEPTION = "用户未登录"; + public static final String USERNAME_IS_EMPTY_EXCEPTION = "用户名不能为空"; + public static final String ALREADY_USER_EXCEPTION = "用户已存在"; + public static final String USER_NOT_FOUND_EXCEPTION = "用户不存在"; + + // 密码相关 + public static final String PASSWORD_EXCEPTION = "密码错误"; + public static final String PASSWORD_NOT_EMPTY_EXCEPTION = "密码不能为空"; + public static final String OLD_PASSWORD_EXCEPTION = "旧密码不匹配"; + public static final String PASSWORD_EDIT_EXCEPTION = "密码修改失败"; + public static final String OLD_PASSWORD_SAME_NEW_PASSWORD_EXCEPTION = "旧密码与新密码相同"; +} \ No newline at end of file diff --git a/dao/src/main/java/cn/bunny/pojo/constant/LocalDateTimeConstant.java b/dao/src/main/java/cn/bunny/pojo/constant/LocalDateTimeConstant.java new file mode 100644 index 0000000..20a231e --- /dev/null +++ b/dao/src/main/java/cn/bunny/pojo/constant/LocalDateTimeConstant.java @@ -0,0 +1,10 @@ +package cn.bunny.pojo.constant; + +import lombok.Data; + +@Data +public class LocalDateTimeConstant { + public static final String YYYY_MM_DD = "yyyy-MM-dd"; + public static final String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss"; + public static final String YYYY_MM_DD_HH_MM_SS_SLASH = "yyyy/MM/dd HH:mm:ss"; +} diff --git a/dao/src/main/java/cn/bunny/pojo/result/constant/MailMessageConstant.java b/dao/src/main/java/cn/bunny/pojo/constant/MailMessageConstant.java similarity index 92% rename from dao/src/main/java/cn/bunny/pojo/result/constant/MailMessageConstant.java rename to dao/src/main/java/cn/bunny/pojo/constant/MailMessageConstant.java index 9a13a7f..f57aac6 100644 --- a/dao/src/main/java/cn/bunny/pojo/result/constant/MailMessageConstant.java +++ b/dao/src/main/java/cn/bunny/pojo/constant/MailMessageConstant.java @@ -1,4 +1,4 @@ -package cn.bunny.pojo.result.constant; +package cn.bunny.pojo.constant; import lombok.Data; diff --git a/dao/src/main/java/cn/bunny/pojo/result/constant/MinioConstant.java b/dao/src/main/java/cn/bunny/pojo/constant/MinioConstant.java similarity index 91% rename from dao/src/main/java/cn/bunny/pojo/result/constant/MinioConstant.java rename to dao/src/main/java/cn/bunny/pojo/constant/MinioConstant.java index c080b1f..8e66dbf 100644 --- a/dao/src/main/java/cn/bunny/pojo/result/constant/MinioConstant.java +++ b/dao/src/main/java/cn/bunny/pojo/constant/MinioConstant.java @@ -1,4 +1,4 @@ -package cn.bunny.pojo.result.constant; +package cn.bunny.pojo.constant; import lombok.Data; @@ -34,6 +34,6 @@ public class MinioConstant { public static String getType(String type) { String value = typeMap.get(type); if (value != null) return value; - throw new RuntimeException(FileMessageConstant.COMPOSE_OBJECT_EXCEPTION); + throw new RuntimeException("上传类型错误或缺失"); } } diff --git a/dao/src/main/java/cn/bunny/pojo/constant/RedisUserConstant.java b/dao/src/main/java/cn/bunny/pojo/constant/RedisUserConstant.java new file mode 100644 index 0000000..8f0f235 --- /dev/null +++ b/dao/src/main/java/cn/bunny/pojo/constant/RedisUserConstant.java @@ -0,0 +1,34 @@ +package cn.bunny.pojo.constant; + +import lombok.Data; + +/** + * Redis用户前缀设置 + */ +@Data +public class RedisUserConstant { + // 过期时间 + public static final Long REDIS_EXPIRATION_TIME = 15L;// 15 天/分钟 Redis过期 + public static final Integer Cookie_EXPIRATION_TIME = 5 * 60 * 60;// cookies 过期时间 5 分钟 + + private static final String ADMIN_LOGIN_INFO_PREFIX = "admin::login_info::"; + private static final String ADMIN_EMAIL_CODE_PREFIX = "admin::email_code::"; + private static final String USER_LOGIN_INFO_PREFIX = "user::login_info::"; + private static final String USER_EMAIL_CODE_PREFIX = "user::email_code::"; + + public static String getAdminLoginInfoPrefix(String adminUser) { + return ADMIN_LOGIN_INFO_PREFIX + adminUser; + } + + public static String getAdminUserEmailCodePrefix(String adminUser) { + return ADMIN_EMAIL_CODE_PREFIX + adminUser; + } + + public static String getUserLoginInfoPrefix(String user) { + return USER_LOGIN_INFO_PREFIX + user; + } + + public static String getUserEmailCodePrefix(String user) { + return USER_EMAIL_CODE_PREFIX + user; + } +} diff --git a/dao/src/main/java/cn/bunny/pojo/result/constant/UserConstant.java b/dao/src/main/java/cn/bunny/pojo/constant/UserConstant.java similarity index 66% rename from dao/src/main/java/cn/bunny/pojo/result/constant/UserConstant.java rename to dao/src/main/java/cn/bunny/pojo/constant/UserConstant.java index b36248a..e69d048 100644 --- a/dao/src/main/java/cn/bunny/pojo/result/constant/UserConstant.java +++ b/dao/src/main/java/cn/bunny/pojo/constant/UserConstant.java @@ -1,8 +1,9 @@ -package cn.bunny.pojo.result.constant; +package cn.bunny.pojo.constant; import lombok.Data; @Data public class UserConstant { public static final String USER_AVATAR = "https://thirdwx.qlogo.cn/mmopen/vi_32/DYAIOgq83eoj0hHXhgJNOTSOFsS4uZs8x1ConecaVOB8eIl115xmJZcT4oCicvia7wMEufibKtTLqiaJeanU2Lpg3w/132"; + public static final String PERSON_DESCRIPTION = "这个人很懒没有介绍..."; } diff --git a/dao/src/main/java/cn/bunny/pojo/result/ResultCodeEnum.java b/dao/src/main/java/cn/bunny/pojo/result/ResultCodeEnum.java index d2a98d7..46fabed 100644 --- a/dao/src/main/java/cn/bunny/pojo/result/ResultCodeEnum.java +++ b/dao/src/main/java/cn/bunny/pojo/result/ResultCodeEnum.java @@ -11,36 +11,44 @@ public enum ResultCodeEnum { SUCCESS(200, "操作成功"), SUCCESS_LOGOUT(200, "退出成功"), EMAIL_CODE_REFRESH(200, "邮箱验证码已刷新"), + // 验证错误 201 - USERNAME_NOT_EMPTY(201, "用户名不能为空"), - PASSWORD_NOT_EMPTY(201, "密码不能为空"), + USERNAME_OR_PASSWORD_NOT_EMPTY(201, "用户名或密码不能为空"), EMAIL_CODE_NOT_EMPTY(201, "邮箱验证码不能为空"), SEND_EMAIL_CODE_NOT_EMPTY(201, "请先发送邮箱验证码"), EMAIL_CODE_NOT_MATCHING(201, "邮箱验证码不匹配"), LOGIN_ERROR(201, "账号或密码错误"), LOGIN_ERROR_USERNAME_PASSWORD_NOT_EMPTY(201, "登录信息不能为空"), + GET_BUCKET_EXCEPTION(201, "获取文件信息失败"), + // 数据相关 206 ILLEGAL_REQUEST(206, "非法请求"), REPEAT_SUBMIT(206, "重复提交"), DATA_ERROR(206, "数据异常"), + // 身份过期 208 LOGIN_AUTH(208, "请先登陆"), AUTHENTICATION_EXPIRED(208, "身份验证过期"), SESSION_EXPIRATION(208, "会话过期"), + // 封禁 209 FAIL_NO_ACCESS_DENIED_USER_LOCKED(209, "该账户被封禁"), THE_SAME_USER_HAS_LOGGED_IN(209, "相同用户已登录"), + // 提示错误 URL_ENCODE_ERROR(216, "URL编码失败"), ILLEGAL_CALLBACK_REQUEST_ERROR(217, "非法回调请求"), FETCH_USERINFO_ERROR(219, "获取用户信息失败"), + // 无权访问 403 FAIL_REQUEST_NOT_AUTH(403, "用户未认证"), FAIL_NO_ACCESS_DENIED(403, "无权访问"), FAIL_NO_ACCESS_DENIED_USER_OFFLINE(403, "用户强制下线"), LOGGED_IN_FROM_ANOTHER_DEVICE(403, "没有权限访问"), + // 系统错误 500 SERVICE_ERROR(500, "服务异常"), + UPDATE_ERROR(500, "上传文件失败"), FAIL(500, "失败"), ; diff --git a/dao/src/main/java/cn/bunny/pojo/result/constant/ExceptionConstant.java b/dao/src/main/java/cn/bunny/pojo/result/constant/ExceptionConstant.java deleted file mode 100644 index cdb8945..0000000 --- a/dao/src/main/java/cn/bunny/pojo/result/constant/ExceptionConstant.java +++ /dev/null @@ -1,52 +0,0 @@ -package cn.bunny.pojo.result.constant; - -import lombok.Data; - - -@Data -public class ExceptionConstant { - public static final String UNKNOWN_Exception = "未知错误"; - public static final String TOKEN_IS_EMPTY = "token为空"; - public static final String DATA_IS_EMPTY = "数据为空"; - public static final String REQUEST_DATA_NOT_EMPTY_Exception = "请求参数为空"; - public static final String UPDATE_DTO_IS_NULL_Exception = "修改参数为空"; - public static final String ADD_DATA_IS_EMPTY_Exception = "添加数据为空"; - public static final String DELETE_ID_IS_NOT_EMPTY_Exception = "删除id不能为空"; - // 文章操作相关 - public static final String DO_LIKE_COMMENT_NOT_EXIST = "点赞内容不存在"; - public static final String REPLY_USER_EMPTY_EXCEPTION = "回复的用户不存在"; - public static final String REPLY_USER_ID_EMPTY_EXCEPTION = "回复的用户不能为空"; - public static final String MENU_IS_NOT_EXIST_Exception = "菜单不存在"; - public static final String POST_COMMENT_EMPTY_Exception = "评论内容不能为空"; - public static final String ARTICLE_ID_NOT_EMPTY_Exception = "文章id不能为空"; - public static final String UPDATE_ID_IS_NOT_EMPTY_Exception = "修改id不能为空"; - public static final String CANNOT_TOP_OTHER_USER = "不能操作此内容"; - public static final String ARTICLE_NOT_FOUND_EXCEPTION = "文章未找到"; - // 登录相关 - public static final String USER_TOKEN_OUT_OF_DATE_Exception = "用户登录过期"; - public static final String LOGIN_DTO_IS_EMPTY_Exception = "登录参数不能为空"; - public static final String LOGIN_FAILED_Exception = "登录失败"; - // 账号相关 - public static final String ACCOUNT_NOT_FOUND_Exception = "账号不存在"; - public static final String ACCOUNT_LOCKED_Exception = "账号被锁定"; - // 用户相关 - public static final String USER_NOT_LOGIN_Exception = "用户未登录"; - public static final String USERNAME_IS_EMPTY_Exception = "用户名不能为空"; - public static final String ALREADY_USER_Exception = "用户已存在"; - public static final String USER_NOT_FOUND_Exception = "用户不存在"; - // 密码相关 - public static final String PASSWORD_Exception = "密码错误"; - public static final String PASSWORD_NOT_EMPTY_Exception = "密码不能为空"; - public static final String OLD_PASSWORD_Exception = "旧密码不匹配"; - public static final String PASSWORD_EDIT_Exception = "密码修改失败"; - public static final String OLD_PASSWORD_SAME_NEW_PASSWORD_Exception = "旧密码与新密码相同"; - // 验证码错误 - public static final String PLEASE_SEND_EMAIL_CODE_Exception = "请先发送验证码"; - public static final String MESSAGE_CODE_NOT_PASS_Exception = "短信验证码未过期"; - public static final String MESSAGE_CODE_UNAUTHORIZED_Exception = "短信验证码未授权,请联系管理员"; - public static final String VERIFICATION_CODE_ERROR_Exception = "验证码错误"; - public static final String CAPTCHA_IS_EMPTY_Exception = "验证码不能为空"; - public static final String KEY_IS_EMPTY_Exception = "验证码key不能为空"; - public static final String VERIFICATION_CODE_DOES_NOT_MATCH_Exception = "验证码不匹配"; - public static final String VERIFICATION_CODE_IS_EMPTY_Exception = "验证码失效或不存在"; -} diff --git a/dao/src/main/java/cn/bunny/pojo/result/constant/FileMessageConstant.java b/dao/src/main/java/cn/bunny/pojo/result/constant/FileMessageConstant.java deleted file mode 100644 index fc027bd..0000000 --- a/dao/src/main/java/cn/bunny/pojo/result/constant/FileMessageConstant.java +++ /dev/null @@ -1,21 +0,0 @@ -package cn.bunny.pojo.result.constant; - -import lombok.Data; - -@Data -public class FileMessageConstant { - public static final String DOWNLOAD_BUCKET_EXCEPTION = "下载文件失败"; - public static final String FILE_UPLOAD_EXCEPTION = "文件上传失败"; - public static final String BUCKET_EXISTS_EXCEPTION = "查询文件对象失败"; - public static final String DELETE_BUCKET_EXCEPTION = "删除文件对象失败"; - public static final String FILE_IS_EMPTY = "文件信息为空"; - public static final String FILE_IS_NOT_EXITS = "文件信息为空"; - public static final String GET_BUCKET_EXCEPTION = "获取文件信息失败"; - public static final String QUERY_BUCKET_EXCEPTION = "查询文件信息失败"; - public static final String CREATE_BUCKET_EXCEPTION = "创建文件对象失败"; - public static final String UPDATE_BUCKET_EXCEPTION = "更新文件对象失败"; - public static final String COMPOSE_OBJECT_EXCEPTION = "对象错误"; - public static final String COPY_BUCKET_EXCEPTION = "复制文件内容失败"; - public static final String DISABLE_BUCKET_EXCEPTION = "禁用文件失败"; - public static final String ENABLE_BUCKET_EXCEPTION = "启用文件失败"; -} diff --git a/dao/src/main/java/cn/bunny/pojo/result/constant/LocalDateTimeConstant.java b/dao/src/main/java/cn/bunny/pojo/result/constant/LocalDateTimeConstant.java deleted file mode 100644 index afda4da..0000000 --- a/dao/src/main/java/cn/bunny/pojo/result/constant/LocalDateTimeConstant.java +++ /dev/null @@ -1,11 +0,0 @@ -package cn.bunny.pojo.result.constant; - -import lombok.Data; - -@Data -public class LocalDateTimeConstant { - public static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd"; - public static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm"; - public static final String DEFAULT_DATE_TIME_SECOND_FORMAT = "yyyy-MM-dd HH:mm:ss"; - public static final String DEFAULT_TIME_FORMAT = "HH:mm:ss"; -} diff --git a/dao/src/main/java/cn/bunny/pojo/result/constant/RedisUserConstant.java b/dao/src/main/java/cn/bunny/pojo/result/constant/RedisUserConstant.java deleted file mode 100644 index 9ddf241..0000000 --- a/dao/src/main/java/cn/bunny/pojo/result/constant/RedisUserConstant.java +++ /dev/null @@ -1,67 +0,0 @@ -package cn.bunny.pojo.result.constant; - -import lombok.Data; - -/** - * Redis用户前缀设置 - */ -@Data -public class RedisUserConstant { - // 管理员用户 - public static final String ADMIN_LOGIN_INFO_PREFIX = "ADMIN::LOGIN_INFO::"; - public static final String ADMIN_EMAIL_CODE_PREFIX = "ADMIN::EMAIL_CODE::"; - // 普通用户 - public static final String USER_LOGIN_INFO_PREFIX = "USER::LOGIN_INFO::"; - public static final String USER_EMAIL_CODE_PREFIX = "USER::EMAIL_CODE::"; - public static final String USER_DO_LIKE_PREFIX = "USER::doLike::"; - - /** - * * 管理员用户登录信息 - * - * @param adminUser 管理员用户 - * @return 登录信息key - */ - public static String getAdminLoginInfoPrefix(String adminUser) { - return ADMIN_LOGIN_INFO_PREFIX + adminUser; - } - - /** - * * 管理员用户邮箱验证码 - * - * @param adminUser 管理员用户 - * @return 管理员用户邮箱验证码key - */ - public static String getAdminUserEmailCodePrefix(String adminUser) { - return ADMIN_EMAIL_CODE_PREFIX + adminUser; - } - - /** - * * 用户登录信息 - * - * @param user 用户名 - * @return 登录信息key - */ - public static String getUserLoginInfoPrefix(String user) { - return USER_LOGIN_INFO_PREFIX + user; - } - - /** - * * 用户邮箱验证码 - * - * @param user 用户名 - * @return 用户邮箱验证码key - */ - public static String getUserEmailCodePrefix(String user) { - return USER_EMAIL_CODE_PREFIX + user; - } - - /** - * * 用户点赞操作 - * - * @param user 用户名 - * @return 用户点赞key - */ - public static String getUserDoLikePrefix(String user) { - return USER_DO_LIKE_PREFIX + user; - } -} diff --git a/dao/src/main/java/cn/bunny/pojo/result/constant/SQLAutoFillConstant.java b/dao/src/main/java/cn/bunny/pojo/result/constant/SQLAutoFillConstant.java deleted file mode 100644 index d2ebde4..0000000 --- a/dao/src/main/java/cn/bunny/pojo/result/constant/SQLAutoFillConstant.java +++ /dev/null @@ -1,14 +0,0 @@ -package cn.bunny.pojo.result.constant; - -import lombok.Data; - -/** - * 数据库中自动填充字段 - */ -@Data -public class SQLAutoFillConstant { - public static final String SET_CREATE_TIME = "setCreateTime"; - public static final String SET_UPDATE_TIME = "setUpdateTime"; - public static final String SET_CREATE_USER = "setCreateUser"; - public static final String SET_UPDATE_USER = "setUpdateUser"; -} diff --git a/dao/src/main/java/cn/bunny/pojo/result/constant/SecurityConstant.java b/dao/src/main/java/cn/bunny/pojo/result/constant/SecurityConstant.java deleted file mode 100644 index 4d21335..0000000 --- a/dao/src/main/java/cn/bunny/pojo/result/constant/SecurityConstant.java +++ /dev/null @@ -1,13 +0,0 @@ -package cn.bunny.pojo.result.constant; - -import lombok.Data; - -import java.util.Arrays; -import java.util.List; - -@Data -public class SecurityConstant { - public static String[] annotations = {"/", "/test/**", "/diagram-viewer/**", "/editor-app/**", "/*.html", - "/*/*/noAuth/**", "/*/noAuth/**", "/favicon.ico", "/swagger-resources/**", "/webjars/**", "/v3/**", "/swagger-ui.html/**", "/doc.html"}; - public static List annotationsList = Arrays.asList(annotations); -} diff --git a/dao/src/main/java/cn/bunny/pojo/result/constant/StatusConstant.java b/dao/src/main/java/cn/bunny/pojo/result/constant/StatusConstant.java deleted file mode 100644 index 333531e..0000000 --- a/dao/src/main/java/cn/bunny/pojo/result/constant/StatusConstant.java +++ /dev/null @@ -1,14 +0,0 @@ -package cn.bunny.pojo.result.constant; - -import lombok.Data; - -/** - * 状态常量,启用或者禁用 - */ -@Data -public class StatusConstant { - // 启用为1 - public static final Integer ENABLE = 1; - // 禁用为0 - public static final Integer DISABLE = 0; -} diff --git a/dao/src/main/java/cn/bunny/pojo/tree/AbstractTreeNode.java b/dao/src/main/java/cn/bunny/pojo/tree/AbstractTreeNode.java deleted file mode 100644 index 643a62e..0000000 --- a/dao/src/main/java/cn/bunny/pojo/tree/AbstractTreeNode.java +++ /dev/null @@ -1,11 +0,0 @@ -package cn.bunny.pojo.tree; - -import java.util.List; - -public interface AbstractTreeNode { - Long getId(); - - Long getParentId(); - - void setChildren(List children); -} diff --git a/dao/src/main/java/cn/bunny/pojo/tree/TreeBuilder.java b/dao/src/main/java/cn/bunny/pojo/tree/TreeBuilder.java deleted file mode 100644 index 0b6214f..0000000 --- a/dao/src/main/java/cn/bunny/pojo/tree/TreeBuilder.java +++ /dev/null @@ -1,29 +0,0 @@ -package cn.bunny.pojo.tree; - -import java.util.ArrayList; -import java.util.List; - -public class TreeBuilder { - - public List buildTree(List nodeList) { - List tree = new ArrayList<>(); - for (T node : nodeList) { - if (node.getParentId() == 0) { - node.setChildren(getChildren(node.getId(), nodeList)); - tree.add(node); - } - } - return tree; - } - - private List getChildren(Long nodeId, List nodeList) { - List children = new ArrayList<>(); - for (T node : nodeList) { - if (node.getParentId().equals(nodeId)) { - node.setChildren(getChildren(node.getId(), nodeList)); - children.add(node); - } - } - return children; - } -} diff --git a/dao/src/main/java/cn/bunny/vo/BaseVo.java b/dao/src/main/java/cn/bunny/vo/BaseVo.java new file mode 100644 index 0000000..a73c506 --- /dev/null +++ b/dao/src/main/java/cn/bunny/vo/BaseVo.java @@ -0,0 +1,47 @@ +package cn.bunny.vo; + +import com.alibaba.fastjson2.annotation.JSONField; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; +import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; + +@Data +@Schema(name = "BaseVo", title = "基础返回对象内容", description = "基础返回对象内容") +public class BaseVo implements Serializable { + @Schema(name = "id", title = "主键") + @JsonProperty("id") + @JsonFormat(shape = JsonFormat.Shape.STRING) + @JSONField(serializeUsing = ToStringSerializer.class) + private Long id; + + @Schema(name = "updateTime", title = "更新时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonSerialize(using = LocalDateTimeSerializer.class) + @JsonDeserialize(using = LocalDateTimeDeserializer.class) + private LocalDateTime updateTime; + + @Schema(name = "createTime", title = "发布时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonSerialize(using = LocalDateTimeSerializer.class) + @JsonDeserialize(using = LocalDateTimeDeserializer.class) + private LocalDateTime createTime; + + @Schema(name = "createUser", title = "创建用户") + @JsonFormat(shape = JsonFormat.Shape.STRING) + @JSONField(serializeUsing = ToStringSerializer.class) + private Long createUser; + + @Schema(name = "updateUser", title = "操作用户") + @JsonFormat(shape = JsonFormat.Shape.STRING) + @JSONField(serializeUsing = ToStringSerializer.class) + private Long updateUser; +} \ No newline at end of file diff --git a/dao/src/main/java/cn/bunny/vo/email/EmailTemplateVo.java b/dao/src/main/java/cn/bunny/vo/email/EmailTemplateVo.java index 8cc34d0..88926c2 100644 --- a/dao/src/main/java/cn/bunny/vo/email/EmailTemplateVo.java +++ b/dao/src/main/java/cn/bunny/vo/email/EmailTemplateVo.java @@ -1,5 +1,6 @@ package cn.bunny.vo.email; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -9,11 +10,14 @@ import lombok.NoArgsConstructor; @AllArgsConstructor @NoArgsConstructor @Builder +@Schema(name = "EmailTemplateVo对象", title = "邮箱模板返回内容", description = "邮箱模板返回内容") public class EmailTemplateVo { - // 模板名称 + @Schema(name = "templateName", title = "模板名称") private String templateName; - // 主题 + + @Schema(name = "subject", title = "主题") private String subject; - // 邮件内容 + + @Schema(name = "body", title = "邮件内容") private String body; } \ No newline at end of file diff --git a/dao/src/main/java/cn/bunny/vo/system/login/LoginVo.java b/dao/src/main/java/cn/bunny/vo/system/login/LoginVo.java deleted file mode 100644 index 087e7de..0000000 --- a/dao/src/main/java/cn/bunny/vo/system/login/LoginVo.java +++ /dev/null @@ -1,48 +0,0 @@ -package cn.bunny.vo.system.login; - -import cn.bunny.pojo.result.constant.LocalDateTimeConstant; -import com.fasterxml.jackson.annotation.JsonFormat; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; -import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.time.LocalDateTime; -import java.util.List; - -/** - * 用户登录返回内容 - */ -@Data -@AllArgsConstructor -@NoArgsConstructor -@Builder -public class LoginVo { - private Long id; - private String nickName; - private String email; - private String password; - private String avatar; - private Byte sex; - private String personDescription; - @JsonFormat(pattern = LocalDateTimeConstant.DEFAULT_DATE_TIME_SECOND_FORMAT) - @JsonSerialize(using = LocalDateTimeSerializer.class) - @JsonDeserialize(using = LocalDateTimeDeserializer.class) - private LocalDateTime joinTime; - @JsonFormat(pattern = LocalDateTimeConstant.DEFAULT_DATE_TIME_SECOND_FORMAT) - @JsonSerialize(using = LocalDateTimeSerializer.class) - @JsonDeserialize(using = LocalDateTimeDeserializer.class) - private LocalDateTime lastLoginTime; - private String lastLoginIp; - private String lastLoginIpAddress; - private Integer totalIntegral; - private Integer currentIntegral; - private Byte status; - private String token; - private List roleList; - private List powerList; -} diff --git a/dao/src/main/java/cn/bunny/vo/system/user/UserInfoVo.java b/dao/src/main/java/cn/bunny/vo/system/user/UserInfoVo.java deleted file mode 100644 index 78e954d..0000000 --- a/dao/src/main/java/cn/bunny/vo/system/user/UserInfoVo.java +++ /dev/null @@ -1,43 +0,0 @@ -package cn.bunny.vo.system.user; - -import cn.bunny.pojo.result.constant.LocalDateTimeConstant; -import com.fasterxml.jackson.annotation.JsonFormat; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; -import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.time.LocalDateTime; - -/** - * 获取用户信息返回参数 - */ -@Data -@AllArgsConstructor -@NoArgsConstructor -@Builder -public class UserInfoVo { - private Long userId; - private String nickName; - private String email; - private String avatar; - private Byte sex; - private String personDescription; - @JsonFormat(pattern = LocalDateTimeConstant.DEFAULT_DATE_TIME_SECOND_FORMAT) - @JsonSerialize(using = LocalDateTimeSerializer.class) - @JsonDeserialize(using = LocalDateTimeDeserializer.class) - private LocalDateTime joinTime; - @JsonFormat(pattern = LocalDateTimeConstant.DEFAULT_DATE_TIME_SECOND_FORMAT) - @JsonSerialize(using = LocalDateTimeSerializer.class) - @JsonDeserialize(using = LocalDateTimeDeserializer.class) - private LocalDateTime lastLoginTime; - private String lastLoginIp; - private String lastLoginIpAddress; - private Integer totalIntegral; - private Integer currentIntegral; - private Byte status; -} diff --git a/dao/src/main/java/cn/bunny/vo/user/LoginVo.java b/dao/src/main/java/cn/bunny/vo/user/LoginVo.java new file mode 100644 index 0000000..5fc2d32 --- /dev/null +++ b/dao/src/main/java/cn/bunny/vo/user/LoginVo.java @@ -0,0 +1,72 @@ +package cn.bunny.vo.user; + +import cn.bunny.vo.BaseVo; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; + +import java.util.List; + +/** + * 用户登录返回内容 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AllArgsConstructor +@NoArgsConstructor +@Builder +@Schema(name = "LoginVo对象", title = "登录成功返回内容", description = "登录成功返回内容") +public class LoginVo extends BaseVo { + @Schema(name = "nickName", title = "昵称") + private String nickName; + + @Schema(name = "username", title = "用户名") + private String username; + + @Schema(name = "email", title = "邮箱") + private String email; + + @Schema(name = "phone", title = "手机号") + private String phone; + + @Schema(name = "password", title = "密码") + private String password; + + @Schema(name = "avatar", title = "头像") + private String avatar; + + @Schema(name = "sex", title = "0:女 1:男") + private Byte sex; + + @Schema(name = "personDescription", title = "个人描述") + private String personDescription; + + @Schema(name = "articleMode", title = "文章显示模式") + private String articleMode; + + @Schema(name = "layout", title = "页面布局方式") + private String layout; + + @Schema(name = "lastLoginIp", title = "最后登录IP") + private String lastLoginIp; + + @Schema(name = "lastLoginIpAddress", title = "最后登录ip地址") + private String lastLoginIpAddress; + + @Schema(name = "totalIntegral", title = "积分") + private Integer totalIntegral; + + @Schema(name = "currentIntegral", title = "当前积分") + private Integer currentIntegral; + + @Schema(name = "status", title = "0:禁用 1:正常") + private Boolean status; + + @Schema(name = "token", title = "令牌") + private String token; + + @Schema(name = "roleList", title = "角色列表") + private List roleList; + + @Schema(name = "powerList", title = "权限列表") + private List powerList; +} \ No newline at end of file diff --git a/dao/src/main/java/cn/bunny/vo/system/login/ValidateCodeVo.java b/dao/src/main/java/cn/bunny/vo/user/ValidateCodeVo.java similarity index 93% rename from dao/src/main/java/cn/bunny/vo/system/login/ValidateCodeVo.java rename to dao/src/main/java/cn/bunny/vo/user/ValidateCodeVo.java index 21c7ae4..4c51471 100644 --- a/dao/src/main/java/cn/bunny/vo/system/login/ValidateCodeVo.java +++ b/dao/src/main/java/cn/bunny/vo/user/ValidateCodeVo.java @@ -1,4 +1,4 @@ -package cn.bunny.vo.system.login; +package cn.bunny.vo.user; import io.swagger.v3.oas.annotations.media.Schema; import lombok.AllArgsConstructor; diff --git a/module/module-mail/pom.xml b/module/module-mail/pom.xml deleted file mode 100644 index 90242e5..0000000 --- a/module/module-mail/pom.xml +++ /dev/null @@ -1,26 +0,0 @@ - - 4.0.0 - - cn.bunny - module - 0.0.1-SNAPSHOT - - - module-mail - jar - - module-mail - https://maven.apache.org - - - UTF-8 - - - - - org.springframework.boot - spring-boot-starter-mail - - - diff --git a/module/module-minio/pom.xml b/module/module-minio/pom.xml deleted file mode 100644 index cdc48fe..0000000 --- a/module/module-minio/pom.xml +++ /dev/null @@ -1,27 +0,0 @@ - - 4.0.0 - - cn.bunny - module - 0.0.1-SNAPSHOT - - - module-minio - jar - - module-minio - https://maven.apache.org - - - UTF-8 - - - - - - io.minio - minio - - - diff --git a/module/module-minio/src/main/java/cn/bunny/module/minio/utils/MinioUtil.java b/module/module-minio/src/main/java/cn/bunny/module/minio/utils/MinioUtil.java deleted file mode 100644 index a83d2f9..0000000 --- a/module/module-minio/src/main/java/cn/bunny/module/minio/utils/MinioUtil.java +++ /dev/null @@ -1,1187 +0,0 @@ -package cn.bunny.module.minio.utils; - -import cn.bunny.common.service.exception.BunnyException; -import cn.bunny.module.minio.properties.MinioProperties; -import cn.bunny.pojo.file.MinioFIlePath; -import cn.bunny.pojo.result.constant.FileMessageConstant; -import cn.bunny.pojo.result.constant.MinioConstant; -import io.minio.*; -import io.minio.messages.*; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.springframework.web.multipart.MultipartFile; - -import java.io.IOException; -import java.io.InputStream; -import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; -import java.util.List; -import java.util.Map; -import java.util.UUID; - -/** - * Minio操作工具类 简化操作步骤 - * By:Bunny0212 - */ -@Component -@Slf4j -public class MinioUtil { - @Autowired - private MinioProperties properties; - @Autowired - private MinioClient minioClient; - - /** - * 获取Minio文件路径 - */ - public static MinioFIlePath getMinioFilePath(String buckName, String minioPreType, MultipartFile file) { - String uuid = UUID.randomUUID().toString(); - // 定义日期时间格式 - LocalDateTime currentDateTime = LocalDateTime.now(); - DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM-dd"); - String extension = ""; - - // 原始文件名 - String filename = file.getOriginalFilename(); - if (filename.contains(".")) { - extension = "." + filename.substring(filename.lastIndexOf(".") + 1); - } - - // UUID防止重名 - String uuidFilename = uuid + extension; - - // 拼接时间+UUID文件名 - String timeUuidFilename = currentDateTime.format(formatter) + "/" + uuidFilename;// 加上时间路径 - - // 上传根文件夹+拼接时间+UUID文件名 - String filepath = MinioConstant.getType(minioPreType) + timeUuidFilename; - - // 桶名称+上传根文件夹+拼接时间+UUID文件名 - String buckNameFilepath = "/" + buckName + MinioConstant.getType(minioPreType) + timeUuidFilename; - - // 设置及Minio基础信息 - MinioFIlePath minioFIlePath = new MinioFIlePath(); - minioFIlePath.setFilename(filename); - minioFIlePath.setUuidFilename(uuidFilename); - minioFIlePath.setTimeUuidFilename(timeUuidFilename); - minioFIlePath.setFilepath(filepath); - minioFIlePath.setBucketNameFilepath(buckNameFilepath); - - return minioFIlePath; - } - - /** - * 上传文件 - * - * @return 返回上传路径 - */ - public String uploadFile(MultipartFile file, String bucketName, String minioPreType) throws IOException { - return getUploadFilePath(file, bucketName, minioPreType); - } - - /** - * 上传文件 - * - * @return 返回上传路径 - */ - public String uploadFile(MultipartFile file, String minioPreType) throws IOException { - // 如果buckName为空,设置为默认的桶 - String bucketName = properties.getBucketName(); - - return getUploadFilePath(file, bucketName, minioPreType); - } - - /** - * * 上传文件 - * - * @return 上传路径 - */ - private String getUploadFilePath(MultipartFile file, String bucketName, String minioPreType) throws IOException { - if (file != null) { - MinioFIlePath minioFile = getMinioFilePath(bucketName, minioPreType, file); - String bucketNameFilepath = minioFile.getBucketNameFilepath(); - String filepath = minioFile.getFilepath(); - - // 上传对象 - putObject(bucketName, filepath, file.getInputStream(), file.getSize()); - - // 设置图片地址 - return bucketNameFilepath; - } - return null; - } - - /** - * * 上传文件 - * - * @return 上传路径 - */ - public MinioFIlePath getUploadMinioObjectFilePath(MultipartFile file, String bucketName, String minioPreType) throws IOException { - if (file != null) { - MinioFIlePath minioFile = getMinioFilePath(bucketName, minioPreType, file); - String filepath = minioFile.getFilepath(); - - // 上传对象 - putObject(bucketName, filepath, file.getInputStream(), file.getSize()); - - // 设置图片地址 - return minioFile; - } - return null; - } - - /** - * * 上传文件并返回处理信息 - */ - public MinioFIlePath getUploadMinioObjectFilePath(MultipartFile file, String minioPreType) throws IOException { - // 如果buckName为空,设置为默认的桶 - String bucketName = properties.getBucketName(); - if (file != null) { - MinioFIlePath minioFile = getMinioFilePath(bucketName, minioPreType, file); - String filepath = minioFile.getFilepath(); - - // 上传对象 - putObject(bucketName, filepath, file.getInputStream(), file.getSize()); - - // 设置图片地址 - return minioFile; - } - return null; - } - - /** - * 获取文件并返回字节数组 - * - * @param bucketName 桶名称 - * @param objectName 对象名称 - * @return 文件流对象 - */ - public byte[] getBucketObjectByte(String bucketName, String objectName) { - try { - GetObjectResponse getObjectResponse = minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(objectName).build()); - log.info("获取文件 ------ 成功"); - return getObjectResponse.readAllBytes(); - } catch (Exception exception) { - log.error("获取文件 ------ 失败消息:{}", exception.getLocalizedMessage()); - exception.getStackTrace(); - } - throw new BunnyException(FileMessageConstant.GET_BUCKET_EXCEPTION); - } - - /** - * 获取默认bucket文件,并返回字节数组 - * - * @param objectName 对象名称 - * @return 文件流对象 - */ - public byte[] getBucketObjectByte(String objectName) { - // 如果buckName为空,设置为默认的桶 - String bucketName = properties.getBucketName(); - - try { - objectName = objectName.replace("/" + bucketName, ""); - GetObjectResponse getObjectResponse = minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(objectName).build()); - - return getObjectResponse.readAllBytes(); - } catch (Exception exception) { - exception.getStackTrace(); - } - throw new BunnyException(FileMessageConstant.GET_BUCKET_EXCEPTION); - } - - /** - * 获取Minio全路径名,Object带有桶名称 - * - * @param objectName 对象名称 - * @return 全路径 - */ - public String getObjectNameFullPath(String objectName) { - String url = properties.getEndpointUrl(); - - return url + objectName; - } - - /** - * 获取Minio全路径名-默认桶名称 - * - * @param objectName 对象名称 - * @return 全路径 - */ - public String getDefaultBuckNameFullPath(String objectName) { - String url = properties.getEndpointUrl(); - String bucketName = properties.getBucketName(); - - return url + "/" + bucketName + objectName; - } - - /** - * 获取Minio全路径名,自定义桶名称 - * - * @param objectName 对象名称 - * @return 全路径 - */ - public String getBuckNameFullPath(String bucketName, String objectName) { - String url = properties.getEndpointUrl(); - - return url + "/" + bucketName + objectName; - } - - /** - * 判断桶是否存在 - * - * @param bucketName 桶名称 - * @return 布尔值,是否存在 - */ - public boolean bucketExists(String bucketName) { - boolean found = false; - try { - found = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build()); - return found; - } catch (Exception exception) { - log.error("判断桶是否存在 ------ 失败消息:{}", exception.getLocalizedMessage()); - exception.getStackTrace(); - } - throw new BunnyException(FileMessageConstant.BUCKET_EXISTS_EXCEPTION); - } - - /** - * 删除桶的加密配置 - * - * @param bucketName 桶名称 - */ - public void deleteBucketEncryption(String bucketName) { - try { - minioClient.deleteBucketEncryption(DeleteBucketEncryptionArgs.builder().build()); - log.info("删除桶的加密配置 ------ 成功"); - } catch (Exception exception) { - log.error("删除桶的加密配置 ------ 失败消息:{}", exception.getLocalizedMessage()); - exception.getStackTrace(); - } - throw new BunnyException(FileMessageConstant.DELETE_BUCKET_EXCEPTION); - } - - /** - * 删除桶的生命周期配置 - * - * @param bucketName 桶名称 - */ - public void deleteBucketLifecycle(String bucketName) { - try { - minioClient.deleteBucketLifecycle(DeleteBucketLifecycleArgs.builder().build()); - log.info("删除桶的生命周期配置 ------ 成功"); - } catch (Exception exception) { - log.error("删除桶的生命周期配置 ------ 失败消息:{}", exception.getLocalizedMessage()); - exception.getStackTrace(); - throw new BunnyException(FileMessageConstant.DELETE_BUCKET_EXCEPTION); - } - } - - /** - * 删除桶的通知配置 - * - * @param bucketName 桶的名称 - */ - public void deleteBucketNotification(String bucketName) { - try { - minioClient.deleteBucketNotification(DeleteBucketNotificationArgs.builder().bucket(bucketName).build()); - log.info("删除桶的通知配置 ------ 成功"); - } catch (Exception exception) { - log.error("删除桶的加密配置 ------ 失败消息:{}", exception.getLocalizedMessage()); - exception.getStackTrace(); - throw new BunnyException(FileMessageConstant.DELETE_BUCKET_EXCEPTION); - } - } - - /** - * 删除桶策略配置 - * - * @param bucketName 桶的名称 - */ - public void deleteBucketPolicy(String bucketName) { - try { - minioClient.deleteBucketPolicy(DeleteBucketPolicyArgs.builder().bucket(bucketName).build()); - log.info("删除桶中的对象锁配置 ------ 成功"); - } catch (Exception exception) { - log.error("删除桶的加密配置 ------ 失败消息:{}", exception.getLocalizedMessage()); - exception.getStackTrace(); - throw new BunnyException(FileMessageConstant.DELETE_BUCKET_EXCEPTION); - } - } - - /** - * 删除桶的桶复制配置 - * - * @param bucketName 桶的名称 - */ - public void deleteBucketReplication(String bucketName) { - try { - minioClient.deleteBucketReplication(DeleteBucketReplicationArgs.builder().bucket(bucketName).build()); - log.info("删除桶的桶复制配置 ------ 成功"); - } catch (Exception exception) { - log.error("删除桶的桶复制配置 ------ 失败消息:{}", exception.getLocalizedMessage()); - exception.getStackTrace(); - throw new BunnyException(FileMessageConstant.DELETE_BUCKET_EXCEPTION); - } - } - - /** - * 删除桶的标签 - * - * @param bucketName 桶的名称 - */ - public void deleteBucketTags(String bucketName) { - try { - minioClient.deleteBucketTags(DeleteBucketTagsArgs.builder().bucket(bucketName).build()); - log.info("删除桶的标签 ------ 成功"); - } catch (Exception exception) { - log.error("删除桶的桶复制配置 ------ 失败消息:{}", exception.getLocalizedMessage()); - exception.getStackTrace(); - throw new BunnyException(FileMessageConstant.DELETE_BUCKET_EXCEPTION); - } - } - - /** - * 删除桶中的对象锁配置 - * - * @param bucketName 桶的名称 - */ - public void deleteObjectLockConfiguration(String bucketName) { - try { - minioClient.deleteObjectLockConfiguration(DeleteObjectLockConfigurationArgs.builder().bucket(bucketName).build()); - log.info("删除桶中的对象锁配置 ------ 成功"); - } catch (Exception exception) { - log.error("删除桶中的对象锁配置 ------ 失败消息:{}", exception.getLocalizedMessage()); - exception.getStackTrace(); - throw new BunnyException(FileMessageConstant.DELETE_BUCKET_EXCEPTION); - } - } - - /** - * 获取存储桶的加密配置 - * - * @param bucketName 桶的名称 - * @return SseConfiguration 获取成功不为null - */ - public SseConfiguration getBucketEncryption(String bucketName) { - SseConfiguration conf = null; - - try { - conf = minioClient.getBucketEncryption(GetBucketEncryptionArgs.builder().bucket(bucketName).build()); - log.info("获取存储桶的加密配置 ------ 成功"); - } catch (Exception exception) { - log.error("获取存储桶的加密配置 ------ 失败消息:{}", exception.getLocalizedMessage()); - exception.getStackTrace(); - throw new BunnyException(FileMessageConstant.GET_BUCKET_EXCEPTION); - } - - return conf; - } - - /** - * 获取存储桶的生命周期配置 - * - * @param bucketName 桶的名称 - * @return LifecycleConfiguration 获取成功不为null - */ - public LifecycleConfiguration getBucketLifecycle(String bucketName) { - LifecycleConfiguration lifecycle = null; - try { - lifecycle = minioClient.getBucketLifecycle(GetBucketLifecycleArgs.builder().bucket(bucketName).build()); - log.info("获取存储桶的生命周期配置 ------ 成功"); - } catch (Exception exception) { - log.error("获取存储桶的生命周期配置 ------ 失败消息:{}", exception.getLocalizedMessage()); - exception.getStackTrace(); - throw new BunnyException(FileMessageConstant.GET_BUCKET_EXCEPTION); - } - - return lifecycle; - } - - /** - * 获取存储桶的通知配置 - * - * @param bucketName 桶的名称 - * @return NotificationConfiguration 获取成功不为null - */ - public NotificationConfiguration getBucketNotification(String bucketName) { - NotificationConfiguration configuration = null; - - try { - configuration = minioClient.getBucketNotification(GetBucketNotificationArgs.builder().bucket(bucketName).build()); - log.info("获取存储桶的通知配置 ------ 成功"); - } catch (Exception exception) { - log.error("获取存储桶的通知配置 ------ 失败消息:{}", exception.getLocalizedMessage()); - exception.getStackTrace(); - throw new BunnyException(FileMessageConstant.GET_BUCKET_EXCEPTION); - } - - return configuration; - } - - /** - * 获取桶的桶策略配置 - * - * @param bucketName 桶的名称 - * @return String 获取成功不为null - */ - public String getBucketPolicy(String bucketName) { - String config = null; - - try { - config = minioClient.getBucketPolicy(GetBucketPolicyArgs.builder().bucket(bucketName).build()); - log.info("获取桶的桶策略配置 ------ 成功"); - } catch (Exception exception) { - log.error("获取桶的桶策略配置 ------ 失败消息:{}", exception.getLocalizedMessage()); - exception.getStackTrace(); - throw new BunnyException(FileMessageConstant.GET_BUCKET_EXCEPTION); - } - - return config; - } - - /** - * 获取桶复制参数 - * - * @param bucketName 桶的名称 - * @return ReplicationConfiguration 获取成功不为null - */ - public ReplicationConfiguration getBucketReplication(String bucketName) { - ReplicationConfiguration configuration = null; - - try { - configuration = minioClient.getBucketReplication(GetBucketReplicationArgs.builder().bucket(bucketName).build()); - log.info("获取桶复制参数 ------ 成功"); - } catch (Exception exception) { - log.error("获取桶复制参数 ------ 失败消息:{}", exception.getLocalizedMessage()); - exception.getStackTrace(); - throw new BunnyException(FileMessageConstant.GET_BUCKET_EXCEPTION); - } - - return configuration; - } - - /** - * 获取存储桶的标签 - * - * @param bucketName 桶的名称 - * @return Tags 获取成功不为null - */ - public Tags getBucketTags(String bucketName) { - Tags tags = null; - - try { - tags = minioClient.getBucketTags(GetBucketTagsArgs.builder().bucket(bucketName).build()); - log.info("获取存储桶的标签 ------ 成功"); - } catch (Exception exception) { - log.error("获取存储桶的标签 ------ 失败消息:{}", exception.getLocalizedMessage()); - exception.getStackTrace(); - throw new BunnyException(FileMessageConstant.GET_BUCKET_EXCEPTION); - } - return tags; - } - - /** - * 获取存储桶的版本控制配置 - * - * @param bucketName 桶的名称 - * @return Tags 获取成功不为null - */ - public VersioningConfiguration getBucketVersioning(String bucketName) { - VersioningConfiguration configuration = null; - - try { - configuration = minioClient.getBucketVersioning(GetBucketVersioningArgs.builder().bucket(bucketName).build()); - log.info("获取存储桶的版本控制配置 ------ 成功"); - } catch (Exception exception) { - log.error("获取存储桶的版本控制配置 ------ 失败消息:{}", exception.getLocalizedMessage()); - exception.getStackTrace(); - throw new BunnyException(FileMessageConstant.GET_BUCKET_EXCEPTION); - } - - return configuration; - } - - /** - * 获取存储桶中的对象锁配置 - * - * @param bucketName 桶的名称 - * @return Tags 获取成功不为null - */ - public ObjectLockConfiguration getObjectLockConfiguration(String bucketName) { - ObjectLockConfiguration configuration = null; - try { - configuration = minioClient.getObjectLockConfiguration(GetObjectLockConfigurationArgs.builder().bucket(bucketName).build()); - log.info("获取存储桶中的对象锁配置 ------ 成功"); - } catch (Exception exception) { - log.error("获取存储桶中的对象锁配置 ------ 失败消息:{}", exception.getLocalizedMessage()); - exception.getStackTrace(); - throw new BunnyException(FileMessageConstant.GET_BUCKET_EXCEPTION); - } - - return configuration; - } - - /** - * 列出所有桶的桶信息 - * - * @return Tags 获取成功不为null - */ - public List listBuckets() { - List buckets = null; - - try { - buckets = minioClient.listBuckets(); - log.info("列出所有桶的桶信息 ------ 成功"); - } catch (Exception exception) { - log.error("列出所有桶的桶信息 ------ 失败消息:{}", exception.getLocalizedMessage()); - exception.getStackTrace(); - throw new BunnyException(FileMessageConstant.QUERY_BUCKET_EXCEPTION); - } - - return buckets; - } - - /** - * 创建桶 - * - * @param bucketName 桶的名称 - */ - public void makeBucket(String bucketName) { - try { - minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build()); - log.info("创建桶 ------ 成功"); - } catch (Exception exception) { - log.error("创建桶 ------ 失败消息:{}", exception.getLocalizedMessage()); - exception.getStackTrace(); - throw new BunnyException(FileMessageConstant.CREATE_BUCKET_EXCEPTION); - } - } - - /** - * 创建桶 - * - * @param bucketName 桶的名称 - */ - public void makeBucket(String bucketName, String region) { - try { - minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).region(region).build()); - log.info("创建桶 ------ 成功"); - } catch (Exception exception) { - log.error("创建桶 ------ 失败消息:{}", exception.getLocalizedMessage()); - exception.getStackTrace(); - throw new BunnyException(FileMessageConstant.CREATE_BUCKET_EXCEPTION); - } - } - - /** - * 创建桶 - * - * @param bucketName 桶的名称 - */ - public void makeBucket(String bucketName, String region, boolean objectLock) { - try { - minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).region(region).objectLock(objectLock).build()); - log.info("创建桶 ------ 成功"); - } catch (Exception exception) { - log.error("创建桶 ------ 失败消息:{}", exception.getLocalizedMessage()); - exception.getStackTrace(); - throw new BunnyException(FileMessageConstant.CREATE_BUCKET_EXCEPTION); - } - } - - /** - * 删除桶 - * - * @param bucketName 桶的名称 - */ - public void removeBucket(String bucketName) { - try { - minioClient.removeBucket(RemoveBucketArgs.builder().bucket(bucketName).build()); - log.info("删除桶 ------ 成功"); - } catch (Exception exception) { - log.error("删除桶 ------ 失败消息:{}", exception.getLocalizedMessage()); - exception.getStackTrace(); - throw new BunnyException(FileMessageConstant.DELETE_BUCKET_EXCEPTION); - } - } - - /** - * 设置桶的加密配置 - * - * @param bucketName 同名称 - * @param configuration 配置信息 - */ - public void setBucketEncryption(String bucketName, SseConfiguration configuration) { - try { - minioClient.setBucketEncryption(SetBucketEncryptionArgs.builder().bucket(bucketName).config(configuration).build()); - log.info("设置桶的加密配置 ------ 成功"); - } catch (Exception exception) { - log.error("设置桶的加密配置 ------ 失败消息:{}", exception.getLocalizedMessage()); - exception.getStackTrace(); - throw new BunnyException(FileMessageConstant.UPDATE_BUCKET_EXCEPTION); - } - } - - /** - * 设置桶策略 - * - * @param bucketName 同名称 - * @param policyJson 配置信息 - */ - public void setBucketPolicy(String bucketName, String policyJson) { - try { - minioClient.setBucketPolicy(SetBucketPolicyArgs.builder().bucket(bucketName).config(policyJson).build()); - log.info("查看桶策略 ------ 成功"); - } catch (Exception exception) { - log.error("查看桶策略 ------ 失败消息:{}", exception.getLocalizedMessage()); - exception.getStackTrace(); - throw new BunnyException(FileMessageConstant.UPDATE_BUCKET_EXCEPTION); - } - } - - /** - * 设置桶复制参数 - * - * @param bucketName 同名称 - * @param config 配置信息 - * @return 布尔值是否完成 - */ - public void setBucketReplication(String bucketName, ReplicationConfiguration config) { - try { - minioClient.setBucketReplication(SetBucketReplicationArgs.builder().bucket(bucketName).config(config).build()); - log.info("设置桶复制参数 ------ 成功"); - } catch (Exception exception) { - log.error("设置桶复制参数 ------ 失败消息:{}", exception.getLocalizedMessage()); - exception.getStackTrace(); - throw new BunnyException(FileMessageConstant.UPDATE_BUCKET_EXCEPTION); - } - } - - /** - * 设置/修改桶标签 - * - * @param bucketName 桶名称 - * @param map 标签集合 - */ - public void setBucketTags(String bucketName, Map map) { - try { - minioClient.setBucketTags(SetBucketTagsArgs.builder().bucket(bucketName).tags(map).build()); - log.info("设置/修改桶标签 ------ 成功"); - } catch (Exception exception) { - log.error("设置/修改桶标签 ------ 失败消息:{}", exception.getLocalizedMessage()); - exception.getStackTrace(); - throw new BunnyException(FileMessageConstant.UPDATE_BUCKET_EXCEPTION); - } - } - - /** - * 设置桶的版本配置 - * - * @param bucketName 同名称 - * @param configuration 配置信息 - */ - public void setBucketVersioning(String bucketName, VersioningConfiguration configuration) { - try { - minioClient.setBucketVersioning( - SetBucketVersioningArgs.builder().bucket(bucketName).config(configuration).build()); - log.info("设置桶的版本配置 ------ 成功"); - } catch (Exception exception) { - log.error("设置桶的版本配置 ------ 失败消息:{}", exception.getLocalizedMessage()); - exception.getStackTrace(); - throw new BunnyException(FileMessageConstant.UPDATE_BUCKET_EXCEPTION); - } - } - - /** - * 对象对象锁定配置 - * - * @param bucketName 同名称 - * @param configuration 配置信息 - */ - public void setObjectLockConfiguration(String bucketName, ObjectLockConfiguration configuration) { - try { - minioClient.setObjectLockConfiguration(SetObjectLockConfigurationArgs.builder().bucket(bucketName).config(configuration).build()); - log.info("对象对象锁定配置 ------ 成功"); - } catch (Exception exception) { - log.error("对象对象锁定配置 ------ 失败消息:{}", exception.getLocalizedMessage()); - exception.getStackTrace(); - throw new BunnyException(FileMessageConstant.UPDATE_BUCKET_EXCEPTION); - } - } - - /** - * 组合对象 - * - * @param bucketName 同名称 - * @param objectName 对象名称 - * @param sources 对象列表 - */ - public void composeObject(String bucketName, String objectName, List sources) { - try { - minioClient.composeObject(ComposeObjectArgs.builder().bucket(bucketName).object(objectName).sources(sources).build()); - log.info("组合对象 ------ 成功"); - } catch (Exception exception) { - log.error("组合对象 ------ 失败消息:{}", exception.getLocalizedMessage()); - exception.getStackTrace(); - throw new BunnyException(FileMessageConstant.COMPOSE_OBJECT_EXCEPTION); - } - } - - /** - * 组合对象 - * - * @param bucketName 同名称 - * @param objectName 对象名称 - * @param sources 对象列表 - * @param userMetadata 用户元数据 - */ - public void composeObject(String bucketName, String objectName, List sources, Map userMetadata) { - try { - minioClient.composeObject(ComposeObjectArgs.builder() - .bucket(bucketName) - .object(objectName) - .sources(sources) - .userMetadata(userMetadata).build()); - log.info("组合对象 ------ 成功"); - } catch (Exception exception) { - log.error("组合对象 ------ 失败消息:{}", exception.getLocalizedMessage()); - exception.getStackTrace(); - throw new BunnyException(FileMessageConstant.COMPOSE_OBJECT_EXCEPTION); - } - } - - /** - * 组合对象 - * - * @param bucketName 同名称 - * @param objectName 对象名称 - * @param sources 对象列表 - * @param userMetadata 用户元数据 - * @param sideEncryption 通过组合源对象列表 - */ - public void composeObject(String bucketName, String objectName, List sources, Map userMetadata, ServerSideEncryption sideEncryption) { - try { - minioClient.composeObject(ComposeObjectArgs.builder() - .bucket(bucketName) - .object(objectName) - .sources(sources) - .userMetadata(userMetadata) - .sse(sideEncryption).build()); - log.info("组合对象 ------ 成功"); - } catch (Exception exception) { - log.error("组合对象 ------ 失败消息:{}", exception.getLocalizedMessage()); - exception.getStackTrace(); - throw new BunnyException(FileMessageConstant.COMPOSE_OBJECT_EXCEPTION); - } - } - - /** - * 复制另一个桶中文件 - * - * @param bucketName 桶中名字 - * @param objectName 复制名称 - * @param sourceBucketName 复制到桶中名称 - * @param sourceObjectName 复制完成后名称 - */ - public void copyObject(String bucketName, String objectName, String sourceBucketName, String sourceObjectName) { - try { - minioClient.copyObject(CopyObjectArgs.builder() - .bucket(bucketName) - .object(objectName) - .source(CopySource.builder().bucket(sourceBucketName).object(sourceObjectName).build()) - .build()); - log.info("复制另一个桶中文件 ------ 成功"); - } catch (Exception exception) { - log.error("复制另一个桶中文件 ------ 失败消息:{}", exception.getLocalizedMessage()); - exception.getStackTrace(); - throw new BunnyException(FileMessageConstant.COPY_BUCKET_EXCEPTION); - } - } - - /** - * 复制另一个桶中文件 - * - * @param bucketName 桶中名字 - * @param objectName 复制名称 - * @param sourceBucketName 复制到桶中名称 - * @param sourceObjectName 复制完成后名称 - * @param sideEncryption 加密key - */ - public void copyObject(String bucketName, String objectName, String sourceBucketName, String sourceObjectName, ServerSideEncryption sideEncryption) { - try { - minioClient.copyObject(CopyObjectArgs.builder() - .bucket(bucketName) - .object(objectName) - .source(CopySource.builder().bucket(sourceBucketName).object(sourceObjectName).build()) - .sse(sideEncryption) - .build()); - log.info("复制另一个桶中文件 ------ 成功"); - } catch (Exception exception) { - log.error("复制另一个桶中文件 ------ 失败消息:{}", exception.getLocalizedMessage()); - exception.getStackTrace(); - throw new BunnyException(FileMessageConstant.COPY_BUCKET_EXCEPTION); - } - } - - /** - * 复制另一个桶中文件 - * - * @param bucketName 桶中名字 - * @param objectName 复制名称 - * @param sourceBucketName 复制到桶中名称 - * @param sourceObjectName 复制完成后名称 - * @param etag 标签 - * @param headers 头部信息 - */ - public void copyObject(String bucketName, String objectName, String sourceBucketName, String sourceObjectName, String etag, Map headers) { - try { - minioClient.copyObject(CopyObjectArgs.builder() - .bucket(bucketName) - .object(objectName) - .source(CopySource.builder().bucket(sourceBucketName).object(sourceObjectName).matchETag(etag).build()) - .headers(headers) - .build()); - log.info("复制另一个桶中文件 ------ 成功"); - } catch (Exception exception) { - log.error("复制另一个桶中文件 ------ 失败消息:{}", exception.getLocalizedMessage()); - exception.getStackTrace(); - throw new BunnyException(FileMessageConstant.COPY_BUCKET_EXCEPTION); - } - } - - /** - * 删除对象的标记 - * - * @param bucketName 桶中名字 - * @param objectName 复制名称 - */ - public void deleteObjectTags(String bucketName, String objectName) { - try { - minioClient.deleteObjectTags(DeleteObjectTagsArgs.builder().bucket(bucketName).object(objectName).build()); - log.info("删除对象的标记 ------ 成功"); - } catch (Exception exception) { - log.error("删除对象的标记 ------ 失败消息:{}", exception.getLocalizedMessage()); - exception.getStackTrace(); - throw new BunnyException(FileMessageConstant.DELETE_BUCKET_EXCEPTION); - } - } - - /** - * 禁用对象 - * - * @param bucketName 桶中名字 - * @param objectName 复制名称 - */ - public void disableObjectLegalHold(String bucketName, String objectName) { - try { - minioClient.disableObjectLegalHold(DisableObjectLegalHoldArgs.builder().bucket(bucketName).object(objectName).build()); - log.info("禁用对象 ------ 成功"); - } catch (Exception exception) { - log.error("禁用对象 ------ 失败消息:{}", exception.getLocalizedMessage()); - exception.getStackTrace(); - throw new BunnyException(FileMessageConstant.DISABLE_BUCKET_EXCEPTION); - } - } - - /** - * 启用文件对象 - * - * @param bucketName 桶中名字 - * @param objectName 复制名称 - */ - public void enableObjectLegalHold(String bucketName, String objectName) { - try { - minioClient.enableObjectLegalHold(EnableObjectLegalHoldArgs.builder().bucket(bucketName).object(objectName).build()); - log.info("禁用对象 ------ 成功"); - } catch (Exception exception) { - log.error("禁用对象 ------ 失败消息:{}", exception.getLocalizedMessage()); - exception.getStackTrace(); - throw new BunnyException(FileMessageConstant.ENABLE_BUCKET_EXCEPTION); - } - } - - /** - * 获取文件 - * - * @param bucketName 桶名称 - * @param objectName 对象名称 - */ - public InputStream getObject(String bucketName, String objectName) { - try { - GetObjectResponse object = minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(objectName).build()); - log.info("获取文件 ------ 成功"); - return object; - } catch (Exception exception) { - log.error("获取文件 ------ 失败消息:{}", exception.getLocalizedMessage()); - exception.getStackTrace(); - throw new BunnyException(FileMessageConstant.GET_BUCKET_EXCEPTION); - } - } - - /** - * 下载文件 - * - * @param bucketName 桶名称 - * @param objectName 对象名称 - * @param filename 文件名 - */ - public void downloadObject(String bucketName, String objectName, String filename) { - try { - minioClient.downloadObject(DownloadObjectArgs.builder().bucket(bucketName).object(objectName).filename(filename).build()); - log.info("下载文件 ------ 成功"); - } catch (Exception exception) { - log.error("下载文件 ------ 失败消息:{}", exception.getLocalizedMessage()); - exception.getStackTrace(); - throw new BunnyException(FileMessageConstant.DOWNLOAD_BUCKET_EXCEPTION); - } - } - - /** - * 下载文件 - * - * @param bucketName 桶名称 - * @param objectName 对象名称 - * @param filename 文件名 - * @param sideEncryption 秘钥 - */ - public void downloadObject(String bucketName, String objectName, String filename, ServerSideEncryptionCustomerKey sideEncryption) { - try { - minioClient.downloadObject(DownloadObjectArgs.builder().bucket(bucketName).object(objectName).filename(filename).ssec(sideEncryption).build()); - log.info("下载文件 ------ 成功"); - } catch (Exception exception) { - log.error("下载文件 ------ 失败消息:{}", exception.getLocalizedMessage()); - exception.getStackTrace(); - throw new BunnyException(FileMessageConstant.DOWNLOAD_BUCKET_EXCEPTION); - } - } - - /** - * 获取对象保留 - * - * @param bucketName 桶名称 - * @param objectName 对象名称 - * @param versionId 版本ID - * @return 对象保留 - */ - public Retention getObjectRetention(String bucketName, String objectName, String versionId) { - try { - Retention retention = minioClient.getObjectRetention(GetObjectRetentionArgs.builder().bucket(bucketName).object(objectName).versionId(versionId).build()); - log.info("获取对象保留 ------ 成功"); - return retention; - } catch (Exception exception) { - log.error("获取对象保留 ------ 失败消息:{}", exception.getLocalizedMessage()); - exception.getStackTrace(); - throw new BunnyException(FileMessageConstant.DOWNLOAD_BUCKET_EXCEPTION); - } - } - - /** - * 获取对象标签 - * - * @param bucketName 桶名称 - * @param objectName 对象名称 - * @return 对象保留 - */ - public Tags getObjectTags(String bucketName, String objectName) { - try { - Tags tags = minioClient.getObjectTags(GetObjectTagsArgs.builder().bucket(bucketName).object(objectName).build()); - log.info("获取对象标签 ------ 成功"); - return tags; - } catch (Exception exception) { - log.error("获取对象标签 ------ 失败消息:{}", exception.getLocalizedMessage()); - exception.getStackTrace(); - throw new BunnyException(FileMessageConstant.GET_BUCKET_EXCEPTION); - } - } - - /** - * 上传文件 - * - * @param bucketName 桶名称 - * @param filename 文件名 - * @param inputStream 输入流 - * @param size 大小 - */ - public void putObject(String bucketName, String filename, InputStream inputStream, Long size) { - try { - minioClient.putObject(PutObjectArgs.builder().bucket(bucketName).object(filename).stream(inputStream, size, -1).build()); - log.info("上传文件 ------ 成功"); - } catch (Exception exception) { - log.error("上传文件 ------ 失败消息:{}", exception.getLocalizedMessage()); - exception.getStackTrace(); - throw new BunnyException(FileMessageConstant.FILE_UPLOAD_EXCEPTION); - } - } - - /** - * 上传文件 - * - * @param bucketName 桶名称 - * @param filename 文件名 - * @param contentType 文件类型 - * @param inputStream 输入流 - * @param size 大小 - */ - public void putObject(String bucketName, String filename, String contentType, InputStream inputStream, Long size) { - try { - minioClient.putObject(PutObjectArgs.builder().bucket(bucketName).object(filename).stream(inputStream, size, -1).contentType(contentType).build()); - log.info("上传文件 ------ 成功"); - } catch (Exception exception) { - log.error("上传文件 ------ 失败消息:{}", exception.getLocalizedMessage()); - exception.getStackTrace(); - throw new BunnyException(FileMessageConstant.FILE_UPLOAD_EXCEPTION); - } - } - - /** - * 上传文件 - * - * @param bucketName 桶名称 - * @param object 对象信息 - * @param filename 文件名 - * @param contentType 文件类型 - */ - public void putObject(String bucketName, String object, String filename, String contentType) { - try { - if (contentType != null) { - minioClient.uploadObject(UploadObjectArgs.builder().bucket(bucketName).object(filename).contentType(contentType).build()); - } else { - minioClient.uploadObject(UploadObjectArgs.builder().bucket(bucketName).object(filename).build()); - } - log.info("上传文件 ------ 成功"); - } catch (Exception exception) { - log.error("上传文件 ------ 失败消息:{}", exception.getLocalizedMessage()); - exception.getStackTrace(); - throw new BunnyException(FileMessageConstant.FILE_UPLOAD_EXCEPTION); - } - } - - /** - * 删除文件 - * - * @param bucketName 桶名称 - * @param objectName 对象名称 - */ - public void removeObject(String bucketName, String objectName) { - try { - minioClient.removeObject(RemoveObjectArgs.builder().bucket(bucketName).object(objectName).build()); - log.info("删除文件 ------ 成功"); - } catch (Exception exception) { - log.error("删除文件 ------ 失败消息:{}", exception.getLocalizedMessage()); - exception.getStackTrace(); - throw new BunnyException(FileMessageConstant.DELETE_BUCKET_EXCEPTION); - } - } - - /** - * 删除文件 - * - * @param bucketName 桶名称 - * @param objectName 对象名称 - * @param versionId 版本号 - */ - public void removeObject(String bucketName, String objectName, String versionId) { - try { - minioClient.removeObject(RemoveObjectArgs.builder().bucket(bucketName).object(objectName).versionId(versionId).build()); - log.info("删除文件 ------ 成功"); - } catch (Exception exception) { - log.error("删除文件 ------ 失败消息:{}", exception.getLocalizedMessage()); - exception.getStackTrace(); - throw new BunnyException(FileMessageConstant.DELETE_BUCKET_EXCEPTION); - } - } - - /** - * 删除文件 - * - * @param bucketName 桶名称 - * @param objectName 对象名称 - * @param bypassRetentionMode 保持模式 - */ - public void removeObject(String bucketName, String objectName, String versionId, boolean bypassRetentionMode) { - try { - minioClient.removeObject(RemoveObjectArgs.builder().bucket(bucketName).object(objectName).versionId(versionId).bypassGovernanceMode(bypassRetentionMode).build()); - log.info("删除文件 ------ 成功"); - } catch (Exception exception) { - log.error("删除文件 ------ 失败消息:{}", exception.getLocalizedMessage()); - exception.getStackTrace(); - throw new BunnyException(FileMessageConstant.DELETE_BUCKET_EXCEPTION); - } - } - - /** - * 上传多文件,通过创建中间TAR文件(可选压缩)来完成的 - * - * @param bucketName 桶名称 - * @param objects 对象名称 - */ - public void uploadSnowballObjects(String bucketName, List objects) { - try { - minioClient.uploadSnowballObjects(UploadSnowballObjectsArgs.builder().bucket(bucketName).objects(objects).build()); - log.info("上传多文件 ------ 成功"); - } catch (Exception exception) { - log.error("上传多文件 ------ 失败消息:{}", exception.getLocalizedMessage()); - exception.getStackTrace(); - throw new BunnyException(FileMessageConstant.FILE_UPLOAD_EXCEPTION); - } - } - - /** - * 设置对象标签 - * - * @param bucketName 桶名称 - * @param objectName 对象名称 - * @param retention 配置信息 - * @param bypassGovernanceMode 保持模式 - */ - public void setObjectLockRetention(String bucketName, String objectName, Retention retention, boolean bypassGovernanceMode) { - try { - minioClient.setObjectRetention(SetObjectRetentionArgs.builder().bucket(bucketName).object(objectName).config(retention).bypassGovernanceMode(bypassGovernanceMode).build()); - log.info("删除文件 ------ 成功"); - } catch (Exception exception) { - log.error("删除文件 ------ 失败消息:{}", exception.getLocalizedMessage()); - exception.getStackTrace(); - throw new BunnyException(FileMessageConstant.UPDATE_BUCKET_EXCEPTION); - } - } - - /** - * 设置对象标签 - * - * @param bucketName 桶名称 - * @param objectName 对象名称 - * @param map 对象集合 - */ - public void setObjectTags(String bucketName, String objectName, Map map) { - try { - minioClient.setObjectTags(SetObjectTagsArgs.builder().bucket(bucketName).object(objectName).tags(map).build()); - log.info("删除文件 ------ 成功"); - } catch (Exception exception) { - log.error("删除文件 ------ 失败消息:{}", exception.getLocalizedMessage()); - exception.getStackTrace(); - throw new BunnyException(FileMessageConstant.UPDATE_BUCKET_EXCEPTION); - } - } - - /** - * 获取对象状态 - * - * @param bucketName 桶名称 - * @param objectName 对象名称 - * @param versionId 版本ID - * @param customerKey 秘钥 - * @return 对象信息 - */ - public StatObjectResponse statObject(String bucketName, String objectName, String versionId, ServerSideEncryptionCustomerKey customerKey) { - try { - StatObjectResponse statObjectResponse = minioClient.statObject(StatObjectArgs.builder().bucket(bucketName).object(objectName).versionId(versionId).ssec(customerKey).build()); - log.info("获取对象状态 ------ 成功"); - return statObjectResponse; - } catch (Exception exception) { - log.error("获取对象状态 ------ 失败消息:{}", exception.getLocalizedMessage()); - exception.getStackTrace(); - throw new BunnyException(FileMessageConstant.DELETE_BUCKET_EXCEPTION); - } - } -} \ No newline at end of file diff --git a/module/module-rabbitMQ/pom.xml b/module/module-rabbitMQ/pom.xml deleted file mode 100644 index 29884a1..0000000 --- a/module/module-rabbitMQ/pom.xml +++ /dev/null @@ -1,35 +0,0 @@ - - 4.0.0 - - cn.bunny - module - 0.0.1-SNAPSHOT - - - module-rabbitMQ - jar - - module-rabbitMQ - https://maven.apache.org - - - UTF-8 - - - - - org.springframework.boot - spring-boot-starter-amqp - - - org.springframework.amqp - spring-rabbit-test - - - com.fasterxml.jackson.dataformat - jackson-dataformat-xml - 2.16.0-rc1 - - - diff --git a/module/pom.xml b/module/pom.xml deleted file mode 100644 index e415333..0000000 --- a/module/pom.xml +++ /dev/null @@ -1,42 +0,0 @@ - - 4.0.0 - - cn.bunny - bunny-template - 0.0.1-SNAPSHOT - - - module - pom - - module - https://maven.apache.org - - module-minio - module-mail - module-rabbitMQ - spring-security - - - - UTF-8 - - - - - cn.bunny - service-utils - 0.0.1-SNAPSHOT - - - com.google.protobuf - protobuf-java - 4.27.2 - - - org.springframework.boot - spring-boot-starter-web - - - diff --git a/module/spring-security/pom.xml b/module/spring-security/pom.xml deleted file mode 100644 index 070d1de..0000000 --- a/module/spring-security/pom.xml +++ /dev/null @@ -1,32 +0,0 @@ - - 4.0.0 - - cn.bunny - module - 0.0.1-SNAPSHOT - - - spring-security - jar - - spring-security - https://maven.apache.org - - - UTF-8 - - - - - - org.springframework.boot - spring-boot-starter-security - - - - org.springframework.security - spring-security-test - - - diff --git a/module/spring-security/src/main/java/cn/bunny/security/filter/TokenAuthenticationFilter.java b/module/spring-security/src/main/java/cn/bunny/security/filter/TokenAuthenticationFilter.java deleted file mode 100644 index cb10849..0000000 --- a/module/spring-security/src/main/java/cn/bunny/security/filter/TokenAuthenticationFilter.java +++ /dev/null @@ -1,91 +0,0 @@ -package cn.bunny.security.filter; - -import cn.bunny.common.service.context.BaseContext; -import cn.bunny.common.service.exception.BunnyException; -import cn.bunny.common.service.utils.JwtHelper; -import cn.bunny.common.service.utils.ResponseUtil; -import cn.bunny.pojo.result.Result; -import cn.bunny.pojo.result.ResultCodeEnum; -import cn.bunny.pojo.result.constant.RedisUserConstant; -import cn.bunny.vo.system.login.LoginVo; -import com.alibaba.fastjson2.JSON; -import jakarta.servlet.FilterChain; -import jakarta.servlet.ServletException; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; -import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; -import org.springframework.security.core.authority.SimpleGrantedAuthority; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.util.StringUtils; -import org.springframework.web.filter.OncePerRequestFilter; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -public class TokenAuthenticationFilter extends OncePerRequestFilter { - private final RedisTemplate redisTemplate; - - public TokenAuthenticationFilter(RedisTemplate redisTemplate) { - this.redisTemplate = redisTemplate; - } - - @Override - protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws ServletException, IOException, BunnyException { - String token = request.getHeader("token"); - - // login请求就没token,直接放行,因为后边有其他的过滤器 - if (token == null) { - doFilter(request, response, chain); - return; - } - - // 如果想让这个用户下线,清空Redis这个用户值,返回未登录,判断Redis是否有这个用户 - // 如果想让这个用户锁定,清空Redis值并在数据库中设置status值为1 - String userName = JwtHelper.getUsername(token); - Object usernameObject = redisTemplate.opsForValue().get(RedisUserConstant.getUserLoginInfoPrefix(userName)); - if (usernameObject == null) { - Result error = Result.error(ResultCodeEnum.LOGIN_AUTH); - ResponseUtil.out(response, error); - return; - } - - // 获取Redis中登录信息 - LoginVo loginVo = JSON.parseObject(JSON.toJSONString(usernameObject), LoginVo.class); - // 如果是登录接口,直接放行 - UsernamePasswordAuthenticationToken authentication = getAuthentication(request); - if (authentication != null) { - // 设置用户详细信息 - authentication.setDetails(loginVo.getPersonDescription()); - SecurityContextHolder.getContext().setAuthentication(authentication); - } - - chain.doFilter(request, response); - } - - private UsernamePasswordAuthenticationToken getAuthentication(HttpServletRequest request) { - // 请求头是否有token - String token = request.getHeader("token"); - String username = RedisUserConstant.getAdminLoginInfoPrefix(JwtHelper.getUsername(token)); - List authList = new ArrayList<>(); - if (!StringUtils.hasText(username)) return null; - - // 当前用户信息放到ThreadLocal里面 - BaseContext.setAdminId(JwtHelper.getUserId(token)); - BaseContext.setAdminName(username); - - // 通过username从redis获取权限数据 - Object UserObject = redisTemplate.opsForValue().get(username); - // 把redis获取字符串权限数据转换要求集合类型 List - if (UserObject != null) { - LoginVo loginVo = JSON.parseObject(JSON.toJSONString(UserObject), LoginVo.class); - List roleList = loginVo.getRoleList(); - roleList.forEach(role -> authList.add(new SimpleGrantedAuthority(role))); - - return new UsernamePasswordAuthenticationToken(username, null, authList); - } else { - return new UsernamePasswordAuthenticationToken(username, null, new ArrayList<>()); - } - } -} diff --git a/module/spring-security/src/main/java/cn/bunny/security/filter/TokenLoginFilterService.java b/module/spring-security/src/main/java/cn/bunny/security/filter/TokenLoginFilterService.java deleted file mode 100644 index 47bcf59..0000000 --- a/module/spring-security/src/main/java/cn/bunny/security/filter/TokenLoginFilterService.java +++ /dev/null @@ -1,139 +0,0 @@ -package cn.bunny.security.filter; - - -import cn.bunny.common.service.utils.ResponseUtil; -import cn.bunny.dto.user.LoginDto; -import cn.bunny.pojo.result.Result; -import cn.bunny.pojo.result.ResultCodeEnum; -import cn.bunny.pojo.result.constant.RedisUserConstant; -import cn.bunny.security.handelr.SecurityAuthenticationFailureHandler; -import cn.bunny.security.handelr.SecurityAuthenticationSuccessHandler; -import cn.bunny.security.service.CustomUserDetailsService; -import cn.bunny.vo.system.login.LoginVo; -import com.fasterxml.jackson.databind.ObjectMapper; -import jakarta.servlet.FilterChain; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; -import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.http.HttpMethod; -import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; -import org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.AuthenticationException; -import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; -import org.springframework.security.web.util.matcher.AntPathRequestMatcher; -import org.springframework.util.StringUtils; - -import java.io.IOException; -import java.util.Objects; -import java.util.concurrent.TimeUnit; - -/** - * * UsernamePasswordAuthenticationFilter - * * 也可以在这里添加验证码、短信等的验证 - * 由于SpringSecurity的登录只能是表单形式 并且用户名密码需要时username、password,可以通过继承 UsernamePasswordAuthenticationFilter 获取登录请求的参数 - * 再去设置到 UsernamePasswordAuthenticationToken 中 来改变请求传参方式、参数名等 或者也可以在登录的时候加入其他参数等等 - */ -public class TokenLoginFilterService extends UsernamePasswordAuthenticationFilter { - private final RedisTemplate redisTemplate; - private final CustomUserDetailsService customUserDetailsService; - private LoginDto loginDto; - - // 依赖注入 - public TokenLoginFilterService(AuthenticationConfiguration authenticationConfiguration, RedisTemplate redisTemplate, CustomUserDetailsService customUserDetailsService) throws Exception { - this.setAuthenticationSuccessHandler(new SecurityAuthenticationSuccessHandler()); - this.setAuthenticationFailureHandler(new SecurityAuthenticationFailureHandler()); - this.setPostOnly(false); - // ? 指定登录接口及提交方式,可以指定任意路径 - this.setRequiresAuthenticationRequestMatcher(new AntPathRequestMatcher("/*/login", HttpMethod.POST.name())); - this.setAuthenticationManager(authenticationConfiguration.getAuthenticationManager()); - // 依赖注入 - this.redisTemplate = redisTemplate; - this.customUserDetailsService = customUserDetailsService; - } - - /** - * * 登录认证,获取输入的用户名和密码,调用方法认证 - * 接受前端login登录参数 - * 在这里可以设置短信验证登录 - */ - @Override - public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException { - try { - // 获取用户信息 - loginDto = new ObjectMapper().readValue(request.getInputStream(), LoginDto.class); - - // 登录验证码判断 - String username = loginDto.getUsername(); - String emailCode = loginDto.getEmailCode().toLowerCase(); - String redisEmailCode = (String) redisTemplate.opsForValue().get(RedisUserConstant.getAdminUserEmailCodePrefix(username)); - - // 如果不存在验证码 - if (!StringUtils.hasText(emailCode)) { - ResponseUtil.out(response, Result.error(ResultCodeEnum.EMAIL_CODE_NOT_EMPTY)); - return null; - } - if (!StringUtils.hasText(redisEmailCode)) { - ResponseUtil.out(response, Result.error(ResultCodeEnum.SEND_EMAIL_CODE_NOT_EMPTY)); - return null; - } - // 验证码不匹配 - if (!Objects.equals(redisEmailCode.toLowerCase(), emailCode)) { - ResponseUtil.out(response, Result.error(ResultCodeEnum.EMAIL_CODE_NOT_MATCHING)); - return null; - } - - // 封装对象,将用户名密码传入 - Authentication authenticationToken = new UsernamePasswordAuthenticationToken(loginDto.getUsername(), loginDto.getPassword()); - return this.getAuthenticationManager().authenticate(authenticationToken); - } catch (IOException e) { - throw new RuntimeException(e.getLocalizedMessage()); - } - } - - /** - * * 认证成功调用方法 - * 返回登录成功后的信息 - */ - @Override - protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, FilterChain chain, Authentication auth) { - // 封装返回对象 - LoginVo loginVo = customUserDetailsService.login(loginDto); - - // 判断用户是否被锁定 - if (loginVo.getStatus() == 1) { - ResponseUtil.out(response, Result.error(ResultCodeEnum.FAIL_NO_ACCESS_DENIED_USER_LOCKED)); - return; - } - - // 将值存入Redis中 - redisTemplate.opsForValue().set(RedisUserConstant.getAdminLoginInfoPrefix(loginVo.getEmail()), loginVo, 15, TimeUnit.DAYS); - // 将Redis中验证码删除 - redisTemplate.delete(RedisUserConstant.getAdminUserEmailCodePrefix(loginVo.getEmail())); - // 返回登录信息 - ResponseUtil.out(response, Result.success(loginVo)); - } - - /** - * * 认证失败调用方法,失败判断 - * 1. 是否包含用户名 - * 2. 是否包含密码 - */ - @Override - protected void unsuccessfulAuthentication(HttpServletRequest request, HttpServletResponse response, AuthenticationException failed) { - // 账号和密码不能为空 - if (loginDto == null) { - ResponseUtil.out(response, Result.error(ResultCodeEnum.LOGIN_ERROR_USERNAME_PASSWORD_NOT_EMPTY)); - } - // 用户名为空 - if (!StringUtils.hasText(loginDto.getUsername())) { - ResponseUtil.out(response, Result.error(ResultCodeEnum.USERNAME_NOT_EMPTY)); - } - // 密码为空 - if (!StringUtils.hasText(loginDto.getPassword())) { - ResponseUtil.out(response, Result.error(ResultCodeEnum.PASSWORD_NOT_EMPTY)); - } - // 抛出异常,账号或密码错误 - ResponseUtil.out(response, Result.error(null, ResultCodeEnum.LOGIN_ERROR)); - } -} diff --git a/pom.xml b/pom.xml index db56230..0bf395a 100644 --- a/pom.xml +++ b/pom.xml @@ -19,13 +19,12 @@ common dao service - module - 22 - 22 - 21 + 17 + 17 + 17 3.8.1 3.5.6 8.0.30 diff --git a/service/Dockerfile b/service/Dockerfile index c799d18..9473bcf 100644 --- a/service/Dockerfile +++ b/service/Dockerfile @@ -18,6 +18,6 @@ COPY target/*.jar /home/bunny/app.jar ENTRYPOINT ["java","-jar","/home/bunny/app.jar"] #暴露 8800 端口 -EXPOSE 8080 +EXPOSE 7070 -# maven 打包:mvn clean package -Pprod -DskipTests \ No newline at end of file +# mvn clean package -Pprod -DskipTests \ No newline at end of file diff --git a/service/pom.xml b/service/pom.xml index c619113..8141258 100644 --- a/service/pom.xml +++ b/service/pom.xml @@ -25,38 +25,35 @@ service-utils 0.0.1-SNAPSHOT - - - cn.bunny - module-rabbitMQ - 0.0.1-SNAPSHOT - - - - cn.bunny - spring-security - 0.0.1-SNAPSHOT - - + org.springframework.boot spring-boot-starter-security + org.springframework.security spring-security-test + + + org.springframework.boot + spring-boot-starter-amqp + + + org.springframework.amqp + spring-rabbit-test + + + com.fasterxml.jackson.dataformat + jackson-dataformat-xml + 2.16.0-rc1 + org.springframework.boot spring-boot-starter-web - - - cn.bunny - module-mail - 0.0.1-SNAPSHOT - junit diff --git a/service/src/main/java/cn/bunny/service/ServiceApplication.java b/service/src/main/java/cn/bunny/service/ServiceApplication.java index c9022ce..1d46dbc 100644 --- a/service/src/main/java/cn/bunny/service/ServiceApplication.java +++ b/service/src/main/java/cn/bunny/service/ServiceApplication.java @@ -9,13 +9,13 @@ import org.springframework.context.annotation.ComponentScan; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.transaction.annotation.EnableTransactionManagement; -@ComponentScan(basePackages = {"cn.bunny"}) @MapperScan("cn.bunny.service.mapper") -@EnableScheduling// 定时任务 -@EnableCaching// 开启缓存注解 -@EnableTransactionManagement// 开启事务注解 -@SpringBootApplication +@ComponentScan("cn.bunny") +@EnableScheduling +@EnableCaching +@EnableTransactionManagement @Slf4j +@SpringBootApplication public class ServiceApplication { public static void main(String[] args) { SpringApplication.run(ServiceApplication.class, args); diff --git a/service/src/main/java/cn/bunny/service/aop/annotation/AutoFill.java b/service/src/main/java/cn/bunny/service/aop/annotation/AutoFill.java deleted file mode 100644 index cf2b292..0000000 --- a/service/src/main/java/cn/bunny/service/aop/annotation/AutoFill.java +++ /dev/null @@ -1,15 +0,0 @@ -package cn.bunny.service.aop.annotation; - -import cn.bunny.pojo.enums.OperationType; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -@Target(ElementType.METHOD) -@Retention(RetentionPolicy.RUNTIME) -public @interface AutoFill { - // 数据库操作类型 - OperationType value(); -} diff --git a/service/src/main/java/cn/bunny/service/aop/aspect/AutoFillAspect.java b/service/src/main/java/cn/bunny/service/aop/aspect/AutoFillAspect.java deleted file mode 100644 index 20d6cd9..0000000 --- a/service/src/main/java/cn/bunny/service/aop/aspect/AutoFillAspect.java +++ /dev/null @@ -1,28 +0,0 @@ -package cn.bunny.service.aop.aspect; - -import lombok.extern.slf4j.Slf4j; -import org.aspectj.lang.JoinPoint; -import org.aspectj.lang.annotation.Aspect; -import org.aspectj.lang.annotation.Before; -import org.aspectj.lang.annotation.Pointcut; -import org.springframework.beans.BeanUtils; -import org.springframework.stereotype.Component; - -@Aspect -@Component -@Slf4j -public class AutoFillAspect { - @Pointcut("execution(* cn.bunny.service.web.service.impl..*(..))") - public void autoFillPointcut() { - } - - /** - * 之前操作 - * - * @param joinPoint 参数 - */ - @Before("autoFillPointcut()") - public void autoFill(JoinPoint joinPoint) { - log.info("开始进行自动填充"); - } -} diff --git a/service/src/main/java/cn/bunny/service/aop/aspect/AutoLogAspect.java b/service/src/main/java/cn/bunny/service/aop/aspect/AutoLogAspect.java index 5a8e4c5..f4b61ad 100644 --- a/service/src/main/java/cn/bunny/service/aop/aspect/AutoLogAspect.java +++ b/service/src/main/java/cn/bunny/service/aop/aspect/AutoLogAspect.java @@ -1,100 +1,24 @@ package cn.bunny.service.aop.aspect; -import cn.bunny.common.service.utils.JwtHelper; -import cn.bunny.entity.system.log.SystemLog; -import cn.bunny.service.aop.annotation.SkipLog; -import cn.bunny.service.mapper.SystemLogMapper; -import cn.bunny.vo.system.login.LoginVo; -import com.alibaba.fastjson2.JSONObject; -import jakarta.servlet.http.HttpServletRequest; import lombok.extern.slf4j.Slf4j; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Pointcut; -import org.aspectj.lang.reflect.MethodSignature; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import org.springframework.web.context.request.RequestContextHolder; -import org.springframework.web.context.request.ServletRequestAttributes; - -import java.util.Arrays; -import java.util.Map; @Aspect @Component @Slf4j public class AutoLogAspect { - @Autowired - private SystemLogMapper systemLogMapper; - @Pointcut("execution(* cn.bunny.service.web.controller..*(..))") + @Pointcut("execution(* cn.bunny.service.controller..*(..))") public void point() { } @Around(value = "point()") public Object aroundMethod(ProceedingJoinPoint joinPoint) throws Throwable { - Object result; - MethodSignature signature = (MethodSignature) joinPoint.getSignature(); - // 是否有跳过注解,如果有跳过注解就不执行当前操作!!! - SkipLog annotation = signature.getMethod().getAnnotation(SkipLog.class); - // 目标方法所在类名路径 - String classPath = joinPoint.getSignature().getDeclaringTypeName(); - // 当前执行的方法名 - String methodName = signature.getName(); - // 入参内容 - String args = Arrays.toString(joinPoint.getArgs()); - // 获取用户token - ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); - HttpServletRequest request = requestAttributes.getRequest(); - String token = request.getHeader("token"); - // 初始化系统日志对象 - SystemLog systemLog = new SystemLog(); - // token转为实体对象 - Map mapByToken = JwtHelper.getMapByToken(token); - LoginVo loginVo = JSONObject.parseObject(JSONObject.toJSONString(mapByToken), LoginVo.class); - - // 插入Ip地址 - systemLog.setIpAddress(request.getRemoteHost()); - - try { - // 当为null时跳过执行 - if (annotation != null) return joinPoint.proceed(); - if (args.equals("[null]")) { - systemLog.setArgs(null); - } else { - systemLog.setArgs(args); - } - // 登录返回Vo不为空即插入 - if (loginVo != null) { - systemLog.setNickname(loginVo.getNickName()); - systemLog.setEmail(loginVo.getEmail()); - systemLog.setUpdateUser(loginVo.getId()); - } - - systemLog.setClassPath(classPath); - systemLog.setMethodName(methodName); - systemLog.setToken(token); - - // 目标对象(连接点)方法的执行 - result = joinPoint.proceed(); - systemLog.setResult(JSONObject.toJSONString(result)); - } catch (Exception exception) { - String message = exception.getMessage(); - StackTraceElement[] stackTrace = exception.getStackTrace(); - - // 如果报错,设置报错的堆栈和消息,放到数据库中 - systemLog.setErrorStack(Arrays.toString(stackTrace)); - systemLog.setErrorMessage(message); - - // 插入日志数据到数据库 - systemLogMapper.insert(systemLog); - - throw exception; - } - - // 插入日志数据到数据库 - systemLogMapper.insert(systemLog); - return result; + System.out.println("AOP方法执行"); + return joinPoint.proceed(); } } diff --git a/service/src/main/java/cn/bunny/service/controller/IndexController.java b/service/src/main/java/cn/bunny/service/controller/IndexController.java index d645557..5e29a64 100644 --- a/service/src/main/java/cn/bunny/service/controller/IndexController.java +++ b/service/src/main/java/cn/bunny/service/controller/IndexController.java @@ -1,7 +1,13 @@ package cn.bunny.service.controller; +import cn.hutool.captcha.CaptchaUtil; +import cn.hutool.captcha.CircleCaptcha; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -15,4 +21,16 @@ public class IndexController { public String index() { return "欢迎访问 Bunny Java Template,欢迎去Gitee:https://gitee.com/BunnyBoss/java_single.git"; } + + @Operation(summary = "生成验证码", description = "生成验证码") + @GetMapping("checkCode") + public ResponseEntity checkCode() { + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.IMAGE_JPEG); + + // 生成验证码 + CircleCaptcha captcha = CaptchaUtil.createCircleCaptcha(150, 48, 4, 2); + byte[] image = captcha.getImageBytes(); + return new ResponseEntity<>(image, headers, HttpStatus.OK); + } } diff --git a/service/src/main/java/cn/bunny/service/controller/LoginController.java b/service/src/main/java/cn/bunny/service/controller/LoginController.java deleted file mode 100644 index 6d4aa81..0000000 --- a/service/src/main/java/cn/bunny/service/controller/LoginController.java +++ /dev/null @@ -1,36 +0,0 @@ -package cn.bunny.service.controller; - - -import cn.bunny.dto.user.LoginDto; -import cn.bunny.pojo.result.Result; -import cn.bunny.service.service.UserService; -import cn.bunny.vo.system.login.LoginVo; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -@Tag(name = "登录相关接口") -@RestController -@RequestMapping("/admin") -public class LoginController { - @Autowired - private UserService userService; - - @Operation(summary = "登录接口", description = "后台用户登录接口") - @PostMapping("login") - public Result login(@RequestBody LoginDto loginDto) { - LoginVo vo = userService.login(loginDto); - return Result.success(vo); - } - - @Operation(summary = "发送邮箱验证码", description = "发送邮箱验证码") - @PostMapping("noAuth/sendEmail") - public Result sendEmail(String email) { - userService.sendEmail(email); - return Result.success(); - } -} diff --git a/service/src/main/java/cn/bunny/service/controller/WebController.java b/service/src/main/java/cn/bunny/service/controller/WebController.java deleted file mode 100644 index 88e4fb6..0000000 --- a/service/src/main/java/cn/bunny/service/controller/WebController.java +++ /dev/null @@ -1,31 +0,0 @@ -package cn.bunny.service.controller; - -import cn.bunny.service.service.LoginService; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -@Tag(name = "web相关接口") -@RestController -@RequestMapping("/api") -public class WebController { - @Autowired - private LoginService loginService; - - @Operation(summary = "生成验证码", description = "生成验证码") - @GetMapping("checkCode") - public ResponseEntity checkCode() { - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.IMAGE_JPEG); - - byte[] image = loginService.checkCode(); - return new ResponseEntity(image, headers, HttpStatus.OK); - } -} diff --git a/service/src/main/java/cn/bunny/service/mapper/AdminPowerMapper.java b/service/src/main/java/cn/bunny/service/mapper/AdminPowerMapper.java deleted file mode 100644 index 0fc1686..0000000 --- a/service/src/main/java/cn/bunny/service/mapper/AdminPowerMapper.java +++ /dev/null @@ -1,34 +0,0 @@ -package cn.bunny.service.mapper; - -import cn.bunny.entity.system.admin.AdminPower; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import org.apache.ibatis.annotations.Mapper; - -import java.util.List; - -/** - *

- * Mapper 接口 - *

- * - * @author Bunny - * @since 2024-05-18 - */ -@Mapper -public interface AdminPowerMapper extends BaseMapper { - /** - * 查询用户权限信息 - * - * @param roleIdList 角色id 列表 - * @return 用户对应的权限 - */ - AdminPower[] selectByPowerWithRoleIdList(List roleIdList); - - /** - * 查询用户权限 - * - * @param userId 用户id - * @return 用户权限列表 - */ - List queryByUserIdWithPower(Long userId); -} diff --git a/service/src/main/java/cn/bunny/service/mapper/AdminRoleMapper.java b/service/src/main/java/cn/bunny/service/mapper/AdminRoleMapper.java deleted file mode 100644 index 6616caf..0000000 --- a/service/src/main/java/cn/bunny/service/mapper/AdminRoleMapper.java +++ /dev/null @@ -1,26 +0,0 @@ -package cn.bunny.service.mapper; - -import cn.bunny.entity.system.admin.AdminRole; -import cn.bunny.entity.system.admin.auth.AuthUserRole; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import org.apache.ibatis.annotations.Mapper; - -/** - *

- * Mapper 接口 - *

- * - * @author Bunny - * @since 2024-05-18 - */ -@Mapper -public interface AdminRoleMapper extends BaseMapper { - - /** - * 查询用户所有的角色信息 - * - * @param userId 用户id - * @return 用户对应的角色 - */ - AuthUserRole[] selectByRoleWithUserId(Long userId); -} diff --git a/service/src/main/java/cn/bunny/service/mapper/EmailUsersMapper.java b/service/src/main/java/cn/bunny/service/mapper/EmailUsersMapper.java deleted file mode 100644 index ab8b865..0000000 --- a/service/src/main/java/cn/bunny/service/mapper/EmailUsersMapper.java +++ /dev/null @@ -1,24 +0,0 @@ -package cn.bunny.service.mapper; - -import cn.bunny.entity.system.email.EmailUsers; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import org.apache.ibatis.annotations.Mapper; - -/** - *

- * Mapper 接口 - *

- * - * @author Bunny - * @since 2024-05-14 - */ -@Mapper -public interface EmailUsersMapper extends BaseMapper { - - /** - * 彻底删除邮箱用户 - * - * @param id 用户ID - */ - void thoroughDeleteById(Long id); -} diff --git a/service/src/main/java/cn/bunny/service/mapper/SystemLogMapper.java b/service/src/main/java/cn/bunny/service/mapper/SystemLogMapper.java deleted file mode 100644 index 2741252..0000000 --- a/service/src/main/java/cn/bunny/service/mapper/SystemLogMapper.java +++ /dev/null @@ -1,18 +0,0 @@ -package cn.bunny.service.mapper; - -import cn.bunny.entity.system.log.SystemLog; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import org.apache.ibatis.annotations.Mapper; - -/** - *

- * 系统日志表 Mapper 接口 - *

- * - * @author Bunny - * @since 2024-05-31 - */ -@Mapper -public interface SystemLogMapper extends BaseMapper { - -} diff --git a/service/src/main/java/cn/bunny/service/mapper/UserMapper.java b/service/src/main/java/cn/bunny/service/mapper/UserMapper.java deleted file mode 100644 index 83ac911..0000000 --- a/service/src/main/java/cn/bunny/service/mapper/UserMapper.java +++ /dev/null @@ -1,25 +0,0 @@ -package cn.bunny.service.mapper; - -import cn.bunny.entity.system.user.User; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import org.apache.ibatis.annotations.Mapper; - -/** - *

- * 用户信息 Mapper 接口 - *

- * - * @author Bunny - * @since 2024-05-18 - */ -@Mapper -public interface UserMapper extends BaseMapper { - /** - * 前台用户登录接口 - * - * @param username 邮箱/昵称 - * @param password 吗,Image - * @return 登录参数 - */ - User login(String username, String password); -} diff --git a/module/module-rabbitMQ/src/main/java/cn/bunny/module/rabbitMQ/config/RabbitMqConfig.java b/service/src/main/java/cn/bunny/service/mq/RabbitMqConfig.java similarity index 98% rename from module/module-rabbitMQ/src/main/java/cn/bunny/module/rabbitMQ/config/RabbitMqConfig.java rename to service/src/main/java/cn/bunny/service/mq/RabbitMqConfig.java index f033ced..ea48ef8 100644 --- a/module/module-rabbitMQ/src/main/java/cn/bunny/module/rabbitMQ/config/RabbitMqConfig.java +++ b/service/src/main/java/cn/bunny/service/mq/RabbitMqConfig.java @@ -1,4 +1,4 @@ -package cn.bunny.module.rabbitMQ.config; +package cn.bunny.service.mq; import jakarta.annotation.PostConstruct; import lombok.extern.slf4j.Slf4j; diff --git a/module/module-rabbitMQ/src/main/java/cn/bunny/module/rabbitMQ/listener/DelayListener.java b/service/src/main/java/cn/bunny/service/mq/listener/DelayListener.java similarity index 75% rename from module/module-rabbitMQ/src/main/java/cn/bunny/module/rabbitMQ/listener/DelayListener.java rename to service/src/main/java/cn/bunny/service/mq/listener/DelayListener.java index 318cd63..9efd5a9 100644 --- a/module/module-rabbitMQ/src/main/java/cn/bunny/module/rabbitMQ/listener/DelayListener.java +++ b/service/src/main/java/cn/bunny/service/mq/listener/DelayListener.java @@ -1,4 +1,4 @@ -package cn.bunny.module.rabbitMQ.listener; +package cn.bunny.service.mq.listener; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; diff --git a/module/module-rabbitMQ/src/main/java/cn/bunny/module/rabbitMQ/listener/DirectListener.java b/service/src/main/java/cn/bunny/service/mq/listener/DirectListener.java similarity index 97% rename from module/module-rabbitMQ/src/main/java/cn/bunny/module/rabbitMQ/listener/DirectListener.java rename to service/src/main/java/cn/bunny/service/mq/listener/DirectListener.java index 3b8b17e..646eb4b 100644 --- a/module/module-rabbitMQ/src/main/java/cn/bunny/module/rabbitMQ/listener/DirectListener.java +++ b/service/src/main/java/cn/bunny/service/mq/listener/DirectListener.java @@ -1,4 +1,4 @@ -package cn.bunny.module.rabbitMQ.listener; +package cn.bunny.service.mq.listener; import com.rabbitmq.client.Channel; import lombok.extern.slf4j.Slf4j; diff --git a/module/module-rabbitMQ/src/main/java/cn/bunny/module/rabbitMQ/listener/ErrorListener.java b/service/src/main/java/cn/bunny/service/mq/listener/ErrorListener.java similarity index 75% rename from module/module-rabbitMQ/src/main/java/cn/bunny/module/rabbitMQ/listener/ErrorListener.java rename to service/src/main/java/cn/bunny/service/mq/listener/ErrorListener.java index 22d2529..1406e5c 100644 --- a/module/module-rabbitMQ/src/main/java/cn/bunny/module/rabbitMQ/listener/ErrorListener.java +++ b/service/src/main/java/cn/bunny/service/mq/listener/ErrorListener.java @@ -1,4 +1,4 @@ -package cn.bunny.module.rabbitMQ.listener; +package cn.bunny.service.mq.listener; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; diff --git a/module/module-rabbitMQ/src/main/java/cn/bunny/module/rabbitMQ/listener/FanoutListener.java b/service/src/main/java/cn/bunny/service/mq/listener/FanoutListener.java similarity index 75% rename from module/module-rabbitMQ/src/main/java/cn/bunny/module/rabbitMQ/listener/FanoutListener.java rename to service/src/main/java/cn/bunny/service/mq/listener/FanoutListener.java index 2d4d0ff..36ac1bd 100644 --- a/module/module-rabbitMQ/src/main/java/cn/bunny/module/rabbitMQ/listener/FanoutListener.java +++ b/service/src/main/java/cn/bunny/service/mq/listener/FanoutListener.java @@ -1,4 +1,4 @@ -package cn.bunny.module.rabbitMQ.listener; +package cn.bunny.service.mq.listener; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; diff --git a/module/module-rabbitMQ/src/main/java/cn/bunny/module/rabbitMQ/listener/LazyListener.java b/service/src/main/java/cn/bunny/service/mq/listener/LazyListener.java similarity index 75% rename from module/module-rabbitMQ/src/main/java/cn/bunny/module/rabbitMQ/listener/LazyListener.java rename to service/src/main/java/cn/bunny/service/mq/listener/LazyListener.java index c682154..c6b7e95 100644 --- a/module/module-rabbitMQ/src/main/java/cn/bunny/module/rabbitMQ/listener/LazyListener.java +++ b/service/src/main/java/cn/bunny/service/mq/listener/LazyListener.java @@ -1,4 +1,4 @@ -package cn.bunny.module.rabbitMQ.listener; +package cn.bunny.service.mq.listener; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; diff --git a/module/module-rabbitMQ/src/main/java/cn/bunny/module/rabbitMQ/listener/TopicListener.java b/service/src/main/java/cn/bunny/service/mq/listener/TopicListener.java similarity index 75% rename from module/module-rabbitMQ/src/main/java/cn/bunny/module/rabbitMQ/listener/TopicListener.java rename to service/src/main/java/cn/bunny/service/mq/listener/TopicListener.java index 9363906..ced0904 100644 --- a/module/module-rabbitMQ/src/main/java/cn/bunny/module/rabbitMQ/listener/TopicListener.java +++ b/service/src/main/java/cn/bunny/service/mq/listener/TopicListener.java @@ -1,4 +1,4 @@ -package cn.bunny.module.rabbitMQ.listener; +package cn.bunny.service.mq.listener; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; diff --git a/service/src/main/java/cn/bunny/service/mq/PublishDirect.java b/service/src/main/java/cn/bunny/service/mq/publish/PublishDirect.java similarity index 88% rename from service/src/main/java/cn/bunny/service/mq/PublishDirect.java rename to service/src/main/java/cn/bunny/service/mq/publish/PublishDirect.java index 849cbe0..90537ca 100644 --- a/service/src/main/java/cn/bunny/service/mq/PublishDirect.java +++ b/service/src/main/java/cn/bunny/service/mq/publish/PublishDirect.java @@ -1,4 +1,4 @@ -package cn.bunny.service.mq; +package cn.bunny.service.mq.publish; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.beans.factory.annotation.Autowired; diff --git a/service/src/main/java/cn/bunny/service/security/CustomUserDetailsService.java b/service/src/main/java/cn/bunny/service/security/CustomUserDetailsService.java deleted file mode 100644 index ebc6310..0000000 --- a/service/src/main/java/cn/bunny/service/security/CustomUserDetailsService.java +++ /dev/null @@ -1,54 +0,0 @@ -package cn.bunny.service.security; - -import cn.bunny.dto.user.LoginDto; -import cn.bunny.entity.system.admin.AdminRole; -import cn.bunny.entity.system.user.User; -import cn.bunny.security.custom.CustomUser; -import cn.bunny.service.mapper.AdminRoleMapper; -import cn.bunny.service.mapper.UserMapper; -import cn.bunny.service.service.UserService; -import cn.bunny.vo.system.login.LoginVo; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.core.authority.AuthorityUtils; -import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.security.core.userdetails.UsernameNotFoundException; -import org.springframework.stereotype.Component; - -import java.util.List; - -@Component -public class CustomUserDetailsService implements cn.bunny.security.service.CustomUserDetailsService { - @Autowired - private UserMapper userMapper; - @Autowired - private UserService userService; - @Autowired - private AdminRoleMapper adminRoleMapper; - - @Override - public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { - // 根据邮箱查询用户名 - User user = userMapper.selectOne(Wrappers.lambdaQuery().eq(User::getEmail, username)); - List sysRoleList = adminRoleMapper.selectList(null); - // 都为空抛出异常,用户不存在 - if (user == null) { - throw new UsernameNotFoundException(""); - } - - // 查询所有的角色 - List roleAuthoritieList = sysRoleList.stream().map(AdminRole::getRoleCode).toList(); - return new CustomUser(user, AuthorityUtils.createAuthorityList(roleAuthoritieList)); - } - - /** - * 前台用户登录接口 - * - * @param loginDto 登录参数 - * @return 登录后结果返回 - */ - @Override - public LoginVo login(LoginDto loginDto) { - return userService.login(loginDto); - } -} diff --git a/module/spring-security/src/main/java/cn/bunny/security/config/WebSecurityConfig.java b/service/src/main/java/cn/bunny/service/security/config/WebSecurityConfig.java similarity index 79% rename from module/spring-security/src/main/java/cn/bunny/security/config/WebSecurityConfig.java rename to service/src/main/java/cn/bunny/service/security/config/WebSecurityConfig.java index 29a8c62..9ed324f 100644 --- a/module/spring-security/src/main/java/cn/bunny/security/config/WebSecurityConfig.java +++ b/service/src/main/java/cn/bunny/service/security/config/WebSecurityConfig.java @@ -1,12 +1,13 @@ -package cn.bunny.security.config; +package cn.bunny.service.security.config; -import cn.bunny.security.custom.CustomPasswordEncoder; -import cn.bunny.security.filter.TokenAuthenticationFilter; -import cn.bunny.security.filter.TokenLoginFilterService; -import cn.bunny.security.handelr.SecurityAccessDeniedHandler; -import cn.bunny.security.handelr.SecurityAuthenticationEntryPoint; -import cn.bunny.security.service.CustomAuthorizationManagerService; -import cn.bunny.security.service.CustomUserDetailsService; +import cn.bunny.service.security.custom.CustomPasswordEncoder; +import cn.bunny.service.security.filter.NoTokenAuthenticationFilter; +import cn.bunny.service.security.filter.TokenAuthenticationFilter; +import cn.bunny.service.security.filter.TokenLoginFilterService; +import cn.bunny.service.security.handelr.SecurityAccessDeniedHandler; +import cn.bunny.service.security.handelr.SecurityAuthenticationEntryPoint; +import cn.bunny.service.security.service.CustomAuthorizationManagerService; +import cn.bunny.service.security.service.CustomUserDetailsService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -60,7 +61,8 @@ public class WebSecurityConfig { .rememberMe(AbstractHttpConfigurer::disable) .authorizeHttpRequests(authorize -> { // 有样式文件,不需要访问权限 - authorize.requestMatchers(RegexRequestMatcher.regexMatcher("^\\S*[css|js]$")).permitAll(); + // authorize.requestMatchers(RegexRequestMatcher.regexMatcher("^\\S*[css|js]$")).permitAll(); + authorize.requestMatchers(RegexRequestMatcher.regexMatcher("^.*\\.(css|js)$")).permitAll(); // 上面都不是需要鉴权访问 authorize.anyRequest().access(customAuthorizationManager); }) @@ -73,6 +75,7 @@ public class WebSecurityConfig { // 登录验证过滤器 .addFilterBefore(new TokenLoginFilterService(authenticationConfiguration, redisTemplate, customUserDetailsService), UsernamePasswordAuthenticationFilter.class) // 其它权限鉴权过滤器 + .addFilterAt(new NoTokenAuthenticationFilter(redisTemplate), UsernamePasswordAuthenticationFilter.class) .addFilterAt(new TokenAuthenticationFilter(redisTemplate), UsernamePasswordAuthenticationFilter.class) // 自定义密码加密器和用户登录 .passwordManagement(customPasswordEncoder).userDetailsService(customUserDetailsService); @@ -88,8 +91,11 @@ public class WebSecurityConfig { // 排出鉴定路径 @Bean public WebSecurityCustomizer webSecurityCustomizer() { - String[] annotations = {"/", "/test/**", "/admin/login", "/*.html", "/*/*/noAuth/**", "/*/noAuth/**", "/favicon.ico", - "/swagger-resources/**", "/swagger-ui.html/**", "/v3/**", "/api/**" + String[] annotations = { + "/", "/ws/**", + "/*/*/noAuth/**", "/*/noAuth/**", "/noAuth/**", + "/media.ico", "/favicon.ico", "*.html", + "/swagger-resources/**", "/v3/**", "/swagger-ui/**" }; return web -> web.ignoring().requestMatchers(annotations); } diff --git a/module/spring-security/src/main/java/cn/bunny/security/custom/CustomPasswordEncoder.java b/service/src/main/java/cn/bunny/service/security/custom/CustomPasswordEncoder.java similarity index 96% rename from module/spring-security/src/main/java/cn/bunny/security/custom/CustomPasswordEncoder.java rename to service/src/main/java/cn/bunny/service/security/custom/CustomPasswordEncoder.java index 57864ed..fe7cbf9 100644 --- a/module/spring-security/src/main/java/cn/bunny/security/custom/CustomPasswordEncoder.java +++ b/service/src/main/java/cn/bunny/service/security/custom/CustomPasswordEncoder.java @@ -1,4 +1,4 @@ -package cn.bunny.security.custom; +package cn.bunny.service.security.custom; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.Customizer; diff --git a/module/spring-security/src/main/java/cn/bunny/security/custom/CustomUser.java b/service/src/main/java/cn/bunny/service/security/custom/CustomUser.java similarity index 64% rename from module/spring-security/src/main/java/cn/bunny/security/custom/CustomUser.java rename to service/src/main/java/cn/bunny/service/security/custom/CustomUser.java index 296d5a1..c36ac54 100644 --- a/module/spring-security/src/main/java/cn/bunny/security/custom/CustomUser.java +++ b/service/src/main/java/cn/bunny/service/security/custom/CustomUser.java @@ -1,5 +1,6 @@ -package cn.bunny.security.custom; +package cn.bunny.service.security.custom; +import cn.bunny.entity.system.AdminUser; import lombok.Getter; import lombok.Setter; import org.springframework.security.core.GrantedAuthority; @@ -13,9 +14,9 @@ import java.util.Collection; @Getter @Setter public class CustomUser extends User { - private cn.bunny.entity.system.user.User user; + private AdminUser user; - public CustomUser(cn.bunny.entity.system.user.User user, Collection authorities) { + public CustomUser(AdminUser user, Collection authorities) { super(user.getEmail(), user.getPassword(), authorities); this.user = user; } diff --git a/service/src/main/java/cn/bunny/service/security/filter/NoTokenAuthenticationFilter.java b/service/src/main/java/cn/bunny/service/security/filter/NoTokenAuthenticationFilter.java new file mode 100644 index 0000000..6d07df5 --- /dev/null +++ b/service/src/main/java/cn/bunny/service/security/filter/NoTokenAuthenticationFilter.java @@ -0,0 +1,55 @@ +package cn.bunny.service.security.filter; + + +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.web.filter.OncePerRequestFilter; + +import java.io.IOException; + +public class NoTokenAuthenticationFilter extends OncePerRequestFilter { + private final RedisTemplate redisTemplate; + + public NoTokenAuthenticationFilter(RedisTemplate redisTemplate) { + this.redisTemplate = redisTemplate; + } + + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { + // // 判断是否有 token + // String token = request.getHeader("token"); + // if (token == null) { + // ResponseUtil.out(response, Result.error(ResultCodeEnum.LOGIN_AUTH)); + // return; + // } + // + // // 判断 token 是否过期 + // boolean expired = JwtHelper.isExpired(token); + // if (expired) { + // ResponseUtil.out(response, Result.error(ResultCodeEnum.AUTHENTICATION_EXPIRED)); + // return; + // } + // + // // token 存在查找 Redis + // String username = JwtHelper.getUsername(token); + // Long userId = JwtHelper.getUserId(token); + // LoginVo loginVo = (LoginVo) redisTemplate.opsForValue().get(RedisUserConstant.getAdminLoginInfoPrefix(username)); + // + // // 判断用户是否禁用 + // if (loginVo != null && loginVo.getStatus()) { + // ResponseUtil.out(response, Result.error(ResultCodeEnum.FAIL_NO_ACCESS_DENIED_USER_LOCKED)); + // return; + // } + // + // // 设置用户信息 + // BaseContext.setUsername(username); + // BaseContext.setUserId(userId); + // BaseContext.setLoginVo(loginVo); + + // 执行下一个过滤器 + doFilter(request, response, filterChain); + } +} \ No newline at end of file diff --git a/service/src/main/java/cn/bunny/service/security/filter/TokenAuthenticationFilter.java b/service/src/main/java/cn/bunny/service/security/filter/TokenAuthenticationFilter.java new file mode 100644 index 0000000..f0649bc --- /dev/null +++ b/service/src/main/java/cn/bunny/service/security/filter/TokenAuthenticationFilter.java @@ -0,0 +1,61 @@ +package cn.bunny.service.security.filter; + +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.web.filter.OncePerRequestFilter; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +public class TokenAuthenticationFilter extends OncePerRequestFilter { + private final RedisTemplate redisTemplate; + + public TokenAuthenticationFilter(RedisTemplate redisTemplate) { + this.redisTemplate = redisTemplate; + } + + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws ServletException, IOException { + String token = request.getHeader("token"); + + // 判断是否有token,如果后面还有过滤器就这样写 + // if (token == null) { + // doFilter(request, response, chain); + // return; + // } + + // 自定义实现内容 + UsernamePasswordAuthenticationToken authentication = getAuthentication(request); + SecurityContextHolder.getContext().setAuthentication(authentication); + + chain.doFilter(request, response); + } + + /** + * * 用户请求判断 + * + * @param request 请求 + * @return 验证码方法 + */ + private UsernamePasswordAuthenticationToken getAuthentication(HttpServletRequest request) { + // 请求头是否有token + String token = request.getHeader("token"); + String username = "admin"; + List authList = new ArrayList<>(); + + // 设置角色内容 + if (token != null) { + List roleList = new ArrayList<>(); + return new UsernamePasswordAuthenticationToken(username, null, authList); + } else { + return new UsernamePasswordAuthenticationToken(username, null, new ArrayList<>()); + } + } +} diff --git a/service/src/main/java/cn/bunny/service/security/filter/TokenLoginFilterService.java b/service/src/main/java/cn/bunny/service/security/filter/TokenLoginFilterService.java new file mode 100644 index 0000000..69fd16c --- /dev/null +++ b/service/src/main/java/cn/bunny/service/security/filter/TokenLoginFilterService.java @@ -0,0 +1,86 @@ +package cn.bunny.service.security.filter; + + +import cn.bunny.dto.user.LoginDto; +import cn.bunny.pojo.constant.RedisUserConstant; +import cn.bunny.pojo.result.Result; +import cn.bunny.pojo.result.ResultCodeEnum; +import cn.bunny.service.security.handelr.SecurityAuthenticationFailureHandler; +import cn.bunny.service.security.handelr.SecurityAuthenticationSuccessHandler; +import cn.bunny.service.security.service.CustomUserDetailsService; +import cn.bunny.vo.user.LoginVo; +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.AuthenticationException; +import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; +import org.springframework.security.web.util.matcher.AntPathRequestMatcher; +import org.springframework.web.bind.annotation.RequestMethod; + +import java.io.IOException; +import java.util.concurrent.TimeUnit; + +import static cn.bunny.common.service.utils.ResponseUtil.out; + +/** + * * UsernamePasswordAuthenticationFilter + * * 也可以在这里添加验证码、短信等的验证 + * 由于SpringSecurity的登录只能是表单形式 并且用户名密码需要时username、password,可以通过继承 UsernamePasswordAuthenticationFilter 获取登录请求的参数 + * 再去设置到 UsernamePasswordAuthenticationToken 中 来改变请求传参方式、参数名等 或者也可以在登录的时候加入其他参数等等 + */ +public class TokenLoginFilterService extends UsernamePasswordAuthenticationFilter { + private final RedisTemplate redisTemplate; + private final CustomUserDetailsService customUserDetailsService; + private LoginDto loginDto; + + public TokenLoginFilterService(AuthenticationConfiguration authenticationConfiguration, RedisTemplate redisTemplate, CustomUserDetailsService customUserDetailsService) throws Exception { + this.setAuthenticationSuccessHandler(new SecurityAuthenticationSuccessHandler()); + this.setAuthenticationFailureHandler(new SecurityAuthenticationFailureHandler()); + this.setPostOnly(false); + this.setRequiresAuthenticationRequestMatcher(new AntPathRequestMatcher("/*/login", RequestMethod.POST.name())); + this.setAuthenticationManager(authenticationConfiguration.getAuthenticationManager()); + this.redisTemplate = redisTemplate; + this.customUserDetailsService = customUserDetailsService; + } + + @Override + public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException { + loginDto = new LoginDto(); + loginDto.setUsername("admin"); + loginDto.setPassword("password"); + Authentication authenticationToken = new UsernamePasswordAuthenticationToken(loginDto.getUsername(), loginDto.getPassword()); + return getAuthenticationManager().authenticate(authenticationToken); + } + + @Override + protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, FilterChain chain, Authentication auth) throws IOException, ServletException { + LoginVo loginAdminVo = customUserDetailsService.login(loginDto); + + if (loginAdminVo.getStatus()) { + out(response, Result.error(ResultCodeEnum.FAIL_NO_ACCESS_DENIED_USER_LOCKED)); + return; + } + + redisTemplate.opsForValue().set(RedisUserConstant.getAdminLoginInfoPrefix(loginAdminVo.getEmail()), loginAdminVo, 15, TimeUnit.DAYS); + redisTemplate.delete(RedisUserConstant.getAdminUserEmailCodePrefix(loginAdminVo.getEmail())); + + out(response, Result.success(loginAdminVo)); + } + + @Override + protected void unsuccessfulAuthentication(HttpServletRequest request, HttpServletResponse response, AuthenticationException failed) throws IOException, ServletException { + String password = loginDto.getPassword(); + String username = loginDto.getUsername(); + + if (password == null || password.isBlank() || username == null || username.isBlank()) { + out(response, Result.error(ResultCodeEnum.USERNAME_OR_PASSWORD_NOT_EMPTY)); + } else { + out(response, Result.error(null, ResultCodeEnum.LOGIN_ERROR)); + } + } +} diff --git a/module/spring-security/src/main/java/cn/bunny/security/handelr/SecurityAccessDeniedHandler.java b/service/src/main/java/cn/bunny/service/security/handelr/SecurityAccessDeniedHandler.java similarity index 95% rename from module/spring-security/src/main/java/cn/bunny/security/handelr/SecurityAccessDeniedHandler.java rename to service/src/main/java/cn/bunny/service/security/handelr/SecurityAccessDeniedHandler.java index 6dc7ea8..f1bef1b 100644 --- a/module/spring-security/src/main/java/cn/bunny/security/handelr/SecurityAccessDeniedHandler.java +++ b/service/src/main/java/cn/bunny/service/security/handelr/SecurityAccessDeniedHandler.java @@ -1,4 +1,4 @@ -package cn.bunny.security.handelr; +package cn.bunny.service.security.handelr; import cn.bunny.pojo.result.Result; import cn.bunny.pojo.result.ResultCodeEnum; diff --git a/module/spring-security/src/main/java/cn/bunny/security/handelr/SecurityAuthenticationEntryPoint.java b/service/src/main/java/cn/bunny/service/security/handelr/SecurityAuthenticationEntryPoint.java similarity index 96% rename from module/spring-security/src/main/java/cn/bunny/security/handelr/SecurityAuthenticationEntryPoint.java rename to service/src/main/java/cn/bunny/service/security/handelr/SecurityAuthenticationEntryPoint.java index 39801f9..5a78264 100644 --- a/module/spring-security/src/main/java/cn/bunny/security/handelr/SecurityAuthenticationEntryPoint.java +++ b/service/src/main/java/cn/bunny/service/security/handelr/SecurityAuthenticationEntryPoint.java @@ -1,4 +1,4 @@ -package cn.bunny.security.handelr; +package cn.bunny.service.security.handelr; import cn.bunny.common.service.utils.ResponseUtil; import cn.bunny.pojo.result.Result; diff --git a/module/spring-security/src/main/java/cn/bunny/security/handelr/SecurityAuthenticationFailureHandler.java b/service/src/main/java/cn/bunny/service/security/handelr/SecurityAuthenticationFailureHandler.java similarity index 95% rename from module/spring-security/src/main/java/cn/bunny/security/handelr/SecurityAuthenticationFailureHandler.java rename to service/src/main/java/cn/bunny/service/security/handelr/SecurityAuthenticationFailureHandler.java index e6eba91..07d26a0 100644 --- a/module/spring-security/src/main/java/cn/bunny/security/handelr/SecurityAuthenticationFailureHandler.java +++ b/service/src/main/java/cn/bunny/service/security/handelr/SecurityAuthenticationFailureHandler.java @@ -1,4 +1,4 @@ -package cn.bunny.security.handelr; +package cn.bunny.service.security.handelr; import cn.bunny.pojo.result.Result; import com.alibaba.fastjson2.JSON; diff --git a/module/spring-security/src/main/java/cn/bunny/security/handelr/SecurityAuthenticationSuccessHandler.java b/service/src/main/java/cn/bunny/service/security/handelr/SecurityAuthenticationSuccessHandler.java similarity index 95% rename from module/spring-security/src/main/java/cn/bunny/security/handelr/SecurityAuthenticationSuccessHandler.java rename to service/src/main/java/cn/bunny/service/security/handelr/SecurityAuthenticationSuccessHandler.java index fb6605e..c4f7e0d 100644 --- a/module/spring-security/src/main/java/cn/bunny/security/handelr/SecurityAuthenticationSuccessHandler.java +++ b/service/src/main/java/cn/bunny/service/security/handelr/SecurityAuthenticationSuccessHandler.java @@ -1,4 +1,4 @@ -package cn.bunny.security.handelr; +package cn.bunny.service.security.handelr; import cn.bunny.pojo.result.Result; import com.alibaba.fastjson2.JSON; diff --git a/module/spring-security/src/main/java/cn/bunny/security/service/CustomAuthorizationManagerService.java b/service/src/main/java/cn/bunny/service/security/service/CustomAuthorizationManagerService.java similarity index 86% rename from module/spring-security/src/main/java/cn/bunny/security/service/CustomAuthorizationManagerService.java rename to service/src/main/java/cn/bunny/service/security/service/CustomAuthorizationManagerService.java index 3c1f939..b505269 100644 --- a/module/spring-security/src/main/java/cn/bunny/security/service/CustomAuthorizationManagerService.java +++ b/service/src/main/java/cn/bunny/service/security/service/CustomAuthorizationManagerService.java @@ -1,4 +1,4 @@ -package cn.bunny.security.service; +package cn.bunny.service.security.service; import org.springframework.security.authorization.AuthorizationManager; import org.springframework.security.web.access.intercept.RequestAuthorizationContext; diff --git a/module/spring-security/src/main/java/cn/bunny/security/service/CustomUserDetailsService.java b/service/src/main/java/cn/bunny/service/security/service/CustomUserDetailsService.java similarity index 90% rename from module/spring-security/src/main/java/cn/bunny/security/service/CustomUserDetailsService.java rename to service/src/main/java/cn/bunny/service/security/service/CustomUserDetailsService.java index 7cf5b4e..47f0d12 100644 --- a/module/spring-security/src/main/java/cn/bunny/security/service/CustomUserDetailsService.java +++ b/service/src/main/java/cn/bunny/service/security/service/CustomUserDetailsService.java @@ -1,7 +1,7 @@ -package cn.bunny.security.service; +package cn.bunny.service.security.service; import cn.bunny.dto.user.LoginDto; -import cn.bunny.vo.system.login.LoginVo; +import cn.bunny.vo.user.LoginVo; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.core.userdetails.UsernameNotFoundException; diff --git a/service/src/main/java/cn/bunny/service/security/CustomAuthorizationManagerServiceImpl.java b/service/src/main/java/cn/bunny/service/security/service/iml/CustomAuthorizationManagerServiceImpl.java similarity index 67% rename from service/src/main/java/cn/bunny/service/security/CustomAuthorizationManagerServiceImpl.java rename to service/src/main/java/cn/bunny/service/security/service/iml/CustomAuthorizationManagerServiceImpl.java index c26adbd..a4ca2ef 100644 --- a/service/src/main/java/cn/bunny/service/security/CustomAuthorizationManagerServiceImpl.java +++ b/service/src/main/java/cn/bunny/service/security/service/iml/CustomAuthorizationManagerServiceImpl.java @@ -1,13 +1,9 @@ -package cn.bunny.service.security; +package cn.bunny.service.security.service.iml; import cn.bunny.common.service.utils.JwtHelper; -import cn.bunny.entity.system.admin.AdminPower; -import cn.bunny.security.service.CustomAuthorizationManagerService; -import cn.bunny.service.mapper.AdminPowerMapper; +import cn.bunny.service.security.service.CustomAuthorizationManagerService; import jakarta.servlet.http.HttpServletRequest; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.access.AccessDeniedException; import org.springframework.security.authorization.AuthorizationDecision; import org.springframework.security.core.Authentication; import org.springframework.security.core.GrantedAuthority; @@ -25,9 +21,6 @@ import java.util.function.Supplier; @Component @Slf4j public class CustomAuthorizationManagerServiceImpl implements CustomAuthorizationManagerService { - @Autowired - private AdminPowerMapper adminPowerMapper; - @Override public void verify(Supplier authentication, RequestAuthorizationContext requestAuthorizationContext) { CustomAuthorizationManagerService.super.verify(authentication, requestAuthorizationContext); @@ -42,9 +35,6 @@ public class CustomAuthorizationManagerServiceImpl implements CustomAuthorizatio String requestURI = request.getRequestURI();// 请求地址 String method = request.getMethod();// 请求方式 List roleCodeList = authentication.get().getAuthorities().stream().map(GrantedAuthority::getAuthority).toList();// 角色代码列表 - if (token == null) { - throw new AccessDeniedException(""); - } return new AuthorizationDecision(hasRoleList(requestURI, method, userId)); } @@ -57,16 +47,6 @@ public class CustomAuthorizationManagerServiceImpl implements CustomAuthorizatio * @param userId 用户id */ private Boolean hasRoleList(String requestURI, String method, Long userId) { - // 查询用户权限 - List powerList = adminPowerMapper.queryByUserIdWithPower(userId); - // 如果查询到当前地址符合这个地址 - for (AdminPower adminPower : powerList) { - String description = adminPower.getDescription(); - if (description.equals(requestURI) || requestURI.matches(description)) { - return true; - } - } - - return false; + return true; } } diff --git a/service/src/main/java/cn/bunny/service/security/service/iml/CustomUserDetailsService.java b/service/src/main/java/cn/bunny/service/security/service/iml/CustomUserDetailsService.java new file mode 100644 index 0000000..7faac1e --- /dev/null +++ b/service/src/main/java/cn/bunny/service/security/service/iml/CustomUserDetailsService.java @@ -0,0 +1,33 @@ +package cn.bunny.service.security.service.iml; + +import cn.bunny.dto.user.LoginDto; +import cn.bunny.entity.system.AdminUser; +import cn.bunny.service.security.custom.CustomUser; +import cn.bunny.vo.user.LoginVo; +import org.springframework.security.core.authority.AuthorityUtils; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.stereotype.Component; + +import java.util.List; + +@Component +public class CustomUserDetailsService implements cn.bunny.service.security.service.CustomUserDetailsService { + + @Override + public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { + // 查询所有的角色 + return new CustomUser(new AdminUser(), AuthorityUtils.createAuthorityList(List.of("admin", "common"))); + } + + /** + * 前台用户登录接口 + * + * @param loginDto 登录参数 + * @return 登录后结果返回 + */ + @Override + public LoginVo login(LoginDto loginDto) { + return new LoginVo(); + } +} diff --git a/service/src/main/java/cn/bunny/service/service/LoginService.java b/service/src/main/java/cn/bunny/service/service/LoginService.java deleted file mode 100644 index 6a2dd06..0000000 --- a/service/src/main/java/cn/bunny/service/service/LoginService.java +++ /dev/null @@ -1,10 +0,0 @@ -package cn.bunny.service.service; - -public interface LoginService { - /** - * * 生成验证码 - * - * @return 验证码图片数组 - */ - byte[] checkCode(); -} diff --git a/service/src/main/java/cn/bunny/service/service/UserService.java b/service/src/main/java/cn/bunny/service/service/UserService.java deleted file mode 100644 index aad4b8e..0000000 --- a/service/src/main/java/cn/bunny/service/service/UserService.java +++ /dev/null @@ -1,31 +0,0 @@ -package cn.bunny.service.service; - -import cn.bunny.dto.user.LoginDto; -import cn.bunny.entity.system.user.User; -import cn.bunny.vo.system.login.LoginVo; -import com.baomidou.mybatisplus.extension.service.IService; - -/** - *

- * 用户信息 服务类 - *

- * - * @author Bunny - * @since 2024-05-18 - */ -public interface UserService extends IService { - /** - * 前台用户登录接口 - * - * @param loginDto 登录参数 - * @return 登录后结果返回 - */ - LoginVo login(LoginDto loginDto); - - /** - * 发送邮箱验证码 - * - * @param email 邮箱 - */ - void sendEmail(String email); -} diff --git a/service/src/main/java/cn/bunny/service/service/impl/LoginServiceImpl.java b/service/src/main/java/cn/bunny/service/service/impl/LoginServiceImpl.java deleted file mode 100644 index 36023b1..0000000 --- a/service/src/main/java/cn/bunny/service/service/impl/LoginServiceImpl.java +++ /dev/null @@ -1,21 +0,0 @@ -package cn.bunny.service.service.impl; - -import cn.bunny.service.service.LoginService; -import cn.hutool.captcha.CaptchaUtil; -import cn.hutool.captcha.CircleCaptcha; -import org.springframework.stereotype.Service; - -@Service -public class LoginServiceImpl implements LoginService { - /** - * * 生成验证码 - * - * @return 验证码图片数组 - */ - @Override - public byte[] checkCode() { - // 生成验证码 - CircleCaptcha captcha = CaptchaUtil.createCircleCaptcha(150, 48, 4, 2); - return captcha.getImageBytes(); - } -} diff --git a/service/src/main/java/cn/bunny/service/service/impl/UserServiceImpl.java b/service/src/main/java/cn/bunny/service/service/impl/UserServiceImpl.java deleted file mode 100644 index fa4b983..0000000 --- a/service/src/main/java/cn/bunny/service/service/impl/UserServiceImpl.java +++ /dev/null @@ -1,131 +0,0 @@ -package cn.bunny.service.service.impl; - -import cn.bunny.common.service.exception.BunnyException; -import cn.bunny.common.service.utils.EmptyUtil; -import cn.bunny.common.service.utils.JwtHelper; -import cn.bunny.dto.user.LoginDto; -import cn.bunny.entity.system.admin.AdminPower; -import cn.bunny.entity.system.admin.auth.AuthUserRole; -import cn.bunny.entity.system.email.EmailUsers; -import cn.bunny.entity.system.user.User; -import cn.bunny.module.mail.utils.MailSenderUtil; -import cn.bunny.pojo.email.EmailSend; -import cn.bunny.pojo.email.EmailSendInit; -import cn.bunny.pojo.result.constant.ExceptionConstant; -import cn.bunny.pojo.result.constant.MailMessageConstant; -import cn.bunny.pojo.result.constant.RedisUserConstant; -import cn.bunny.service.mapper.AdminPowerMapper; -import cn.bunny.service.mapper.AdminRoleMapper; -import cn.bunny.service.mapper.EmailUsersMapper; -import cn.bunny.service.mapper.UserMapper; -import cn.bunny.service.service.UserService; -import cn.bunny.vo.system.login.LoginVo; -import cn.hutool.captcha.CaptchaUtil; -import cn.hutool.captcha.CircleCaptcha; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import org.springdoc.core.service.OperationService; -import org.springframework.beans.BeanUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.stereotype.Service; -import org.springframework.util.DigestUtils; - -import java.util.Arrays; -import java.util.List; -import java.util.concurrent.TimeUnit; - -/** - *

- * 用户信息 服务实现类 - *

- * - * @author Bunny - * @since 2024-05-18 - */ -@Service -public class UserServiceImpl extends ServiceImpl implements UserService { - @Autowired - private AdminRoleMapper roleMapper; - @Autowired - private AdminPowerMapper powerMapper; - @Autowired - private EmailUsersMapper emailUsersMapper; - @Autowired - private RedisTemplate redisTemplate; - @Autowired - private OperationService operationBuilder; - - /** - * 前台用户登录接口 - * - * @param loginDto 登录参数 - * @return 登录后结果返回 - */ - @Override - public LoginVo login(LoginDto loginDto) { - // 判断用户和密码是否为空 - String username = loginDto.getUsername(); - EmptyUtil.isEmpty(username, ExceptionConstant.USERNAME_IS_EMPTY_Exception); - // 密码不能为空 - EmptyUtil.isEmpty(loginDto.getPassword(), ExceptionConstant.PASSWORD_NOT_EMPTY_Exception); - String password = DigestUtils.md5DigestAsHex(loginDto.getPassword().getBytes()); - // 查询数据库,用户对应的角色、权限 - User user = baseMapper.login(username, password); - - if (user == null) { - throw new BunnyException(ExceptionConstant.USER_NOT_FOUND_Exception); - } - - Long userId = user.getId(); - - // 查询用户所有的角色信息 - AuthUserRole[] roleList = roleMapper.selectByRoleWithUserId(userId); - List roleCodeList = Arrays.stream(roleList).map(AuthUserRole::getRoleCode).toList(); - List roleIdList = Arrays.stream(roleList).map(AuthUserRole::getRoleId).toList(); - // 查询用户权限信息 - AdminPower[] adminPowerList = powerMapper.selectByPowerWithRoleIdList(roleIdList); - List powerCodeList = Arrays.stream(adminPowerList).map(AdminPower::getPowerCode).toList(); - - // 设置返回类型 - LoginVo loginVo = new LoginVo(); - BeanUtils.copyProperties(user, loginVo); - String token = JwtHelper.createToken(loginVo.getId(), loginVo.getEmail(), 7); - loginVo.setToken(token); - loginVo.setRoleList(roleCodeList); - loginVo.setPowerList(powerCodeList); - - return loginVo; - } - - /** - * 发送邮箱验证码 - * - * @param email 邮箱 - */ - @Override - public void sendEmail(String email) { - // 从数据库中获取发送邮箱参数 - EmailUsers emailUsers = emailUsersMapper.selectOne(Wrappers.lambdaQuery().eq(EmailUsers::getIsDefault, 1)); - EmailSendInit emailSendInit = new EmailSendInit(); - // 判断发送邮箱邮件是否为空 - EmptyUtil.isEmpty(emailUsers, MailMessageConstant.EMAIL_CONFIG_NOT_FOUND); - BeanUtils.copyProperties(emailUsers, emailSendInit); - emailSendInit.setUsername(emailUsers.getEmail()); - // 生成验证码 - MailSenderUtil mailSenderUtil = new MailSenderUtil(emailSendInit); - CircleCaptcha captcha = CaptchaUtil.createCircleCaptcha(150, 48, 4, 2); - // 生成验证码和可以 - String code = captcha.getCode(); - // 发送验证码 - EmailSend emailSend = new EmailSend(); - emailSend.setSubject("邮箱验证码"); - emailSend.setMessage(code); - emailSend.setSendTo(email); - emailSend.setIsRichText(false); - mailSenderUtil.sendSimpleEmail(emailSend); - - // 将验证码保存到Redis中,并设置15分钟过期 - redisTemplate.opsForValue().set(RedisUserConstant.ADMIN_EMAIL_CODE_PREFIX + email, code, 15, TimeUnit.MINUTES); - } -} diff --git a/service/src/main/resources/application-dev.yml b/service/src/main/resources/application-dev.yml index 849f519..fd1aead 100644 --- a/service/src/main/resources/application-dev.yml +++ b/service/src/main/resources/application-dev.yml @@ -1,10 +1,16 @@ bunny: datasource: host: 192.168.3.98 - port: 3306 + port: 3304 sqlData: bunny_docs username: root - password: "123456" + password: "02120212" + datasource2: + host: 106.15.251.123 + port: 3305 + sqlData: bunny_docs_i18n + username: root + password: "02120212" redis: host: 192.168.3.98 @@ -14,13 +20,13 @@ bunny: minio: endpointUrl: "http://192.168.3.98:9000" - bucket-name: test accessKey: bunny secretKey: "02120212" + bucket-name: bunny-bbs rabbitmq: host: 192.168.3.98 port: 5672 username: admin - password: "admin" + password: admin virtual-host: / \ No newline at end of file diff --git a/service/src/main/resources/application-prod.yml b/service/src/main/resources/application-prod.yml index 1b421d3..733b9b0 100644 --- a/service/src/main/resources/application-prod.yml +++ b/service/src/main/resources/application-prod.yml @@ -6,10 +6,16 @@ knife4j: bunny: datasource: host: 192.168.3.98 - port: 3306 + port: 3304 sqlData: bunny_docs username: root - password: "123456" + password: "02120212" + datasource2: + host: 106.15.251.123 + port: 3305 + sqlData: bunny_docs_i18n + username: root + password: "02120212" redis: host: 192.168.3.98 @@ -19,13 +25,13 @@ bunny: minio: endpointUrl: "http://192.168.3.98:9000" - bucket-name: test accessKey: bunny secretKey: "02120212" + bucket-name: bunny-bbs rabbitmq: host: 192.168.3.98 port: 5672 username: admin - password: "admin" + password: admin virtual-host: / \ No newline at end of file diff --git a/service/src/main/resources/application.yml b/service/src/main/resources/application.yml index 076e9bc..630121a 100644 --- a/service/src/main/resources/application.yml +++ b/service/src/main/resources/application.yml @@ -1,5 +1,5 @@ server: - port: 8080 + port: 7070 spring: profiles: @@ -24,6 +24,12 @@ spring: url: jdbc:mysql://${bunny.datasource.host}:${bunny.datasource.port}/${bunny.datasource.sqlData}?serverTimezone=GMT%2B8&useSSL=false&characterEncoding=utf-8&allowPublicKeyRetrieval=true username: ${bunny.datasource.username} password: ${bunny.datasource.password} + i18n: + type: com.zaxxer.hikari.HikariDataSource + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://${bunny.datasource2.host}:${bunny.datasource2.port}/${bunny.datasource2.sqlData}?serverTimezone=GMT%2B8&useSSL=false&characterEncoding=utf-8&allowPublicKeyRetrieval=true + username: ${bunny.datasource2.username} + password: ${bunny.datasource2.password} aop: enabled: true diff --git a/service/src/main/resources/mapper/AdminPowerMapper.xml b/service/src/main/resources/mapper/AdminPowerMapper.xml deleted file mode 100644 index 842029f..0000000 --- a/service/src/main/resources/mapper/AdminPowerMapper.xml +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - - - - - - - - - - - - - - id, power_name, power_code, description, create_time, update_time, update_user, is_delete - - - - - - - - diff --git a/service/src/main/resources/mapper/AdminRoleMapper.xml b/service/src/main/resources/mapper/AdminRoleMapper.xml deleted file mode 100644 index 8e11472..0000000 --- a/service/src/main/resources/mapper/AdminRoleMapper.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - - - - - - - id, role_name, description, role_code, create_time, update_time, update_user, is_deleted - - - - - diff --git a/service/src/main/resources/mapper/EmailUsersMapper.xml b/service/src/main/resources/mapper/EmailUsersMapper.xml deleted file mode 100644 index 29b04db..0000000 --- a/service/src/main/resources/mapper/EmailUsersMapper.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - - - - - - id, email, password, host, port, create_time, update_time, update_user, is_delete - - - - - delete - from email_users - where id = #{id} - - - diff --git a/service/src/main/resources/mapper/SystemLogMapper.xml b/service/src/main/resources/mapper/SystemLogMapper.xml deleted file mode 100644 index c7c0feb..0000000 --- a/service/src/main/resources/mapper/SystemLogMapper.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - id, class_path, method_name, args, result, error_stack, error_message, email, nickname, token, create_time, update_time, update_user, is_deleted - - - diff --git a/service/src/main/resources/mapper/UserMapper.xml b/service/src/main/resources/mapper/UserMapper.xml deleted file mode 100644 index 6ee63e7..0000000 --- a/service/src/main/resources/mapper/UserMapper.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - id, nick_name, email, password, avatar, sex, person_description, join_time, last_login_time, last_login_ip, last_login_ip_address, total_integral, current_integral, status, create_time, update_time, update_user, is_deleted - - - - - diff --git a/service/src/test/java/cn/bunny/CustomPasswordEncoderTest.java b/service/src/test/java/cn/bunny/CustomPasswordEncoderTest.java index f952f74..40494f1 100644 --- a/service/src/test/java/cn/bunny/CustomPasswordEncoderTest.java +++ b/service/src/test/java/cn/bunny/CustomPasswordEncoderTest.java @@ -1,6 +1,6 @@ package cn.bunny; -import cn.bunny.security.custom.CustomPasswordEncoder; +import cn.bunny.service.security.custom.CustomPasswordEncoder; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; diff --git a/service/src/test/java/cn/bunny/jwt/JwtHelperTest.java b/service/src/test/java/cn/bunny/jwt/JwtHelperTest.java index b6166ef..c55c57b 100644 --- a/service/src/test/java/cn/bunny/jwt/JwtHelperTest.java +++ b/service/src/test/java/cn/bunny/jwt/JwtHelperTest.java @@ -1,7 +1,6 @@ package cn.bunny.jwt; import cn.bunny.common.service.utils.JwtHelper; -import cn.bunny.entity.system.user.User; import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONObject; import org.junit.jupiter.api.Test; @@ -99,7 +98,7 @@ class JwtHelperTest { createTokenWithMapToken = "eyJhbGciOiJIUzI1NiIsInppcCI6IkdaSVAifQ.H4sIAAAAAAAA_23MTQ6CMBBA4buMW_oz7VChK0_gHcZSQpUiwWpMCHe3B3D9vbwdVt44g9-PBpYUHlfOETy8X3G7xC_ndY4yPDM0wB8uvFWbSlm9Umh6aRClRdl2nrTW6qTCxKW2aQCPxjYQM6f5_-9eUgXqWzThRmKk8SzIaBSMzgnXsuuI-sFqguMH0SvcYacAAAA.qW_gqkc8RQJM-UbFVj7xldSEv1RORO4qlw6VMrTEmM0"; createTokenWithMapToken = "eyJhbGciOiJIUzI1NiIsInppcCI6IkdaSVAifQ.H4sIAAAAAAAA_23MSw7CIBRA0b08p_yhFBi5AvfwApiiRQmiMWm6d7sAx-fmbtCwY4Ww7QQeJd4vWDMEeL9yP-cv1rZmFp8VCOAHB_bDljFa4Fwqz5SUTEs2uWCEEPzE44LjaEuCIJUmkCuW9f_vNsoBaJ1yYnZ0Rqep8VlRnESi3khrklFeXC3sP3hOgQ2nAAAA.bkPBbfpLd21eaJE2gjzniUx5n9VvCqWSY_zBiu8oO9k"; createTokenWithMapToken = "eyJhbGciOiJIUzI1NiIsInppcCI6IkdaSVAifQ.H4sIAAAAAAAA_23MWw7CIBBA0b2Mv7yGhxa-XIF7GCmkaNEG0Zg03btdgN_n5q6wUKMKYd0YPEq8X6gmCPB-pXZOX6rLnER8VmBAH-rUdpt6X4KUqL3QiMKgcEOwSil5kHGivrdlhIDaMEiVyvz_d-tlhxg1WoXI6aiu3GLWfLCD5z6PJ2eMR5cdbD-TzBm3pwAAAA.Zq6T6wsZ9aoRxck4LDAl7QwGDUu_eMiRsGgNt5fSM-4"; - + Map tokenByMap = JwtHelper.getMapByToken(createTokenWithMapToken);