diff --git a/.gitignore b/.gitignore index a1c2a238a965f004ff76978ac1086aa6fe95caea..c4fd7109b9d0836956d6fd5041f860a127d00b87 100644 --- a/.gitignore +++ b/.gitignore @@ -1,23 +1,12 @@ -# Compiled class file -*.class - -# Log file -*.log - -# BlueJ files -*.ctxt - -# Mobile Tools for Java (J2ME) -.mtj.tmp/ - -# Package Files # -*.jar -*.war -*.nar -*.ear -*.zip -*.tar.gz -*.rar - -# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml -hs_err_pid* +# 基础控制 +## 忽略编辑器文件 +**/.idea +**/__pycache__ +**/.vscode + +target/ + +## File-based project format: +*.iws +*.iml +*.ipr \ No newline at end of file diff --git a/aop/pom.xml b/aop/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..4d03d345ed3baf8f47d61a47ef1944d38cea9ec7 --- /dev/null +++ b/aop/pom.xml @@ -0,0 +1,86 @@ + + + 4.0.0 + + com.duan + aop + 1.0-SNAPSHOT + + + org.springframework.boot + spring-boot-starter-parent + 2.4.3 + + + + + org.springframework.boot + spring-boot-starter + 2.4.3 + + + + org.springframework.boot + spring-boot-starter-web + 2.4.3 + + + + org.springframework.boot + spring-boot-starter-test + 2.4.3 + + + + org.projectlombok + lombok + 1.18.4 + + + + junit + junit + 4.13.1 + test + + + + com.alibaba + fastjson + 1.2.50 + + + + com.google.guava + guava + 20.0 + + + + org.aspectj + aspectjweaver + + + + + com.baomidou + mybatis-plus-boot-starter + 3.4.3 + + + + + mysql + mysql-connector-java + 8.0.23 + + + + + org.springframework.boot + spring-boot-starter-validation + + + \ No newline at end of file diff --git a/aop/src/main/java/com/duan/AopApplication.java b/aop/src/main/java/com/duan/AopApplication.java new file mode 100644 index 0000000000000000000000000000000000000000..40139736251dc3240cd0ee64790adb7b488b5556 --- /dev/null +++ b/aop/src/main/java/com/duan/AopApplication.java @@ -0,0 +1,19 @@ +package com.duan; + +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +/** + * @author db + * @version 1.0 + * @description AOPApplication + * @since 2024/1/3 + */ +@SpringBootApplication +@MapperScan(basePackages = "com.duan.mapper") +public class AopApplication { + public static void main(String[] args) { + SpringApplication.run(AopApplication.class); + } +} diff --git a/aop/src/main/java/com/duan/anno/Log.java b/aop/src/main/java/com/duan/anno/Log.java new file mode 100644 index 0000000000000000000000000000000000000000..fe6560040fefbe1904e5a3b534f2bbb0ae5f7ebe --- /dev/null +++ b/aop/src/main/java/com/duan/anno/Log.java @@ -0,0 +1,17 @@ +package com.duan.anno; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * @author db + * @version 1.0 + * @description Log + * @since 2024/4/11 + */ +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +public @interface Log { +} diff --git a/aop/src/main/java/com/duan/aspect/LoggingAspect.java b/aop/src/main/java/com/duan/aspect/LoggingAspect.java new file mode 100644 index 0000000000000000000000000000000000000000..cda55ffa96314f5d96ae65de6f46ef862e0fa641 --- /dev/null +++ b/aop/src/main/java/com/duan/aspect/LoggingAspect.java @@ -0,0 +1,89 @@ +package com.duan.aspect; + +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.stereotype.Component; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import javax.servlet.http.HttpServletRequest; +import java.time.LocalDateTime; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.Map; +import java.util.stream.IntStream; + +/** + * @author db + * @version 1.0 + * @description LoggingAspect + * @since 2024/1/3 + */ +@Aspect +@Component +@Slf4j +public class LoggingAspect { + /** + * com.duan.controller 包中公共方法的切入点 + */ + @Pointcut("execution(public * com.duan.controller.*.*(..))") + public void loggingPointcut(){ + // 暂不用处理 + } + + @Around("loggingPointcut()") + public Object around(ProceedingJoinPoint pjp) throws Throwable{ + // 获取类名 + String className = pjp.getTarget().getClass().getTypeName(); + // 获取方法名 + String methodName = pjp.getSignature().getName(); + // 获取参数名 + String[] parameterNames = ((MethodSignature) pjp.getSignature()).getParameterNames(); + + Object result = null; + // 获取参数值 + Object[] args = pjp.getArgs(); + + // 获取请求 + HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); + // 获取请求的url + String url = request.getRequestURL().toString(); + + + + // 请求参数,以参数名和值为键值对 + Map paramMap = new HashMap<>(); + IntStream.range(0, parameterNames.length).forEach(i->paramMap.put(parameterNames[i], args[i])); + + // header参数 + Enumeration headerNames = request.getHeaderNames(); + Map headerMap = new HashMap<>(); + while (headerNames.hasMoreElements()){ + String headerName = headerNames.nextElement(); + String headerValue = request.getHeader(headerName); + headerMap.put(headerName, headerValue); + } + + // 打印请求参数,记录起始时间 + long start = System.currentTimeMillis(); + log.info("请求| 请求接口:{} | 类名:{} | 方法:{} | header参数:{} | 参数:{} | 请求时间:{}", url, className, methodName, headerMap, paramMap, LocalDateTime.now()); + + try { + result = pjp.proceed(); + System.out.println(result.toString()); + } catch (Exception e) { + log.error("返回| 处理时间:{} 毫秒 | 返回结果 :{}", (System.currentTimeMillis() - start), "failed"); + throw e; + } + + // 获取执行完的时间 打印返回报文 + log.info("返回| 处理时间:{} 毫秒 | 返回结果 :{}", (System.currentTimeMillis() - start), "success"); + return result; + } + + +} diff --git a/aop/src/main/java/com/duan/controller/LoginController.java b/aop/src/main/java/com/duan/controller/LoginController.java new file mode 100644 index 0000000000000000000000000000000000000000..311b2e89f340ac0e1542ae6cbbff82006bedf2e8 --- /dev/null +++ b/aop/src/main/java/com/duan/controller/LoginController.java @@ -0,0 +1,28 @@ +package com.duan.controller; + +import com.duan.pojo.Result; +import com.duan.pojo.User; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +/** + * @author db + * @version 1.0 + * @description LoginController + * @since 2023/12/19 + */ +@RestController +@Slf4j +public class LoginController { + + @PostMapping("/login") + public Result login(@RequestBody User user){ + log.info("这是正常日志"); + if("admin".equals(user.getUserName()) && "123456".equals(user.getPassword())){ + return Result.success("ok"); + } + return Result.error(); + } +} diff --git a/aop/src/main/java/com/duan/controller/UserController.java b/aop/src/main/java/com/duan/controller/UserController.java new file mode 100644 index 0000000000000000000000000000000000000000..564969ff19ae0e9dd4c29fa16fd1585a4c02d55b --- /dev/null +++ b/aop/src/main/java/com/duan/controller/UserController.java @@ -0,0 +1,29 @@ +package com.duan.controller; + +import com.duan.anno.Log; +import com.duan.pojo.Result; +import com.duan.pojo.User; +import com.duan.service.UserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * @author db + * @version 1.0 + * @description UserController + * @since 2024/4/15 + */ +@RestController +@RequestMapping("/user") +public class UserController { + + @Autowired + private UserService userService; + + @PostMapping("/addUser") + @Log + public Result addUser(@RequestBody User user){ + userService.AddUser(user); + return Result.success(); + } +} diff --git a/aop/src/main/java/com/duan/mapper/UserMapper.java b/aop/src/main/java/com/duan/mapper/UserMapper.java new file mode 100644 index 0000000000000000000000000000000000000000..5b2bad265a435e91091608bdf8c9a29fd606e368 --- /dev/null +++ b/aop/src/main/java/com/duan/mapper/UserMapper.java @@ -0,0 +1,15 @@ +package com.duan.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.duan.pojo.User; +import org.apache.ibatis.annotations.Mapper; + +/** + * @author db + * @version 1.0 + * @description UserMapper + * @since 2024/4/15 + */ +@Mapper +public interface UserMapper extends BaseMapper { +} diff --git a/aop/src/main/java/com/duan/pojo/Result.java b/aop/src/main/java/com/duan/pojo/Result.java new file mode 100644 index 0000000000000000000000000000000000000000..b3852789db2a3e75ac88a6d35186a0660cf46c4f --- /dev/null +++ b/aop/src/main/java/com/duan/pojo/Result.java @@ -0,0 +1,34 @@ +package com.duan.pojo; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author db + * @version 1.0 + * @description Result + * @since 2023/12/19 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class Result { + + private Integer code; + private String msg; + private Object data; + + public static Result success(){ + return new Result(1,"success",null); + } + + public static Result success(Object data){ + return new Result(1,"success",data); + } + + public static Result error(){ + return new Result(0,"error",null); + } + +} diff --git a/aop/src/main/java/com/duan/pojo/User.java b/aop/src/main/java/com/duan/pojo/User.java new file mode 100644 index 0000000000000000000000000000000000000000..29c631d714587bfe300d469baaa443fba3f5148a --- /dev/null +++ b/aop/src/main/java/com/duan/pojo/User.java @@ -0,0 +1,33 @@ +package com.duan.pojo; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Date; + +/** + * @author db + * @version 1.0 + * @description User + * @since 2023/12/19 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@TableName("User") +public class User { + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + private String userName; + private String password; + + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private Date createTime; + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private Date updateTime; +} diff --git a/aop/src/main/java/com/duan/service/UserService.java b/aop/src/main/java/com/duan/service/UserService.java new file mode 100644 index 0000000000000000000000000000000000000000..154e54e10969b404512627a69db46ba30c1d0470 --- /dev/null +++ b/aop/src/main/java/com/duan/service/UserService.java @@ -0,0 +1,15 @@ +package com.duan.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.duan.pojo.User; + +/** + * @author db + * @version 1.0 + * @description UserService + * @since 2024/4/15 + */ +public interface UserService extends IService { + + void AddUser(User user); +} diff --git a/aop/src/main/java/com/duan/service/impl/UserServiceImpl.java b/aop/src/main/java/com/duan/service/impl/UserServiceImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..2caf29723ff4d583db5906fec541372dd6258a13 --- /dev/null +++ b/aop/src/main/java/com/duan/service/impl/UserServiceImpl.java @@ -0,0 +1,25 @@ +package com.duan.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.duan.mapper.UserMapper; +import com.duan.pojo.User; +import com.duan.service.UserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * @author db + * @version 1.0 + * @description UserServiceImpl + * @since 2024/4/15 + */ +@Service +public class UserServiceImpl extends ServiceImpl implements UserService { + + @Autowired + private UserMapper userMapper; + @Override + public void AddUser(User user) { + userMapper.insert(user); + } +} diff --git a/aop/src/main/resources/application-dev.yml b/aop/src/main/resources/application-dev.yml new file mode 100644 index 0000000000000000000000000000000000000000..b3ecc52c3ff461ba42104e24d730f076674a273b --- /dev/null +++ b/aop/src/main/resources/application-dev.yml @@ -0,0 +1,18 @@ + + +mybatis-plus: + configuration: + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 查看日志 + +spring: + datasource: + url: jdbc:mysql://localhost:3306/aop_data?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false + username: root + password: 123456 + driver-class-name: com.mysql.cj.jdbc.Driver + +mybatis: + type-aliases-package: com.duan.pojo + configuration: + map-underscore-to-camel-case: true + diff --git a/aop/src/main/resources/application.yml b/aop/src/main/resources/application.yml new file mode 100644 index 0000000000000000000000000000000000000000..fc4ee6af2b6b15aaa5168265a78734c31944c37f --- /dev/null +++ b/aop/src/main/resources/application.yml @@ -0,0 +1,9 @@ +server: + port: 8082 + servlet: + context-path: /aop # 应用名 localhost:8090/logback + +spring: + profiles: + active: dev + diff --git a/aop/src/test/java/com/duan/TestAop.java b/aop/src/test/java/com/duan/TestAop.java new file mode 100644 index 0000000000000000000000000000000000000000..241b0c1621952f0d5f1ad9ed42ceadc94c4f70a9 --- /dev/null +++ b/aop/src/test/java/com/duan/TestAop.java @@ -0,0 +1,40 @@ +package com.duan; + +import com.duan.mapper.UserMapper; +import com.duan.pojo.User; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +import java.util.Date; + +/** + * @author db + * @version 1.0 + * @description Test + * @since 2024/4/15 + */ +@SpringBootTest +@RunWith(SpringRunner.class) +public class TestAop { + + @Autowired + private UserMapper userMapper; + + @Test + public void test1(){ + User user = new User(); + user.setUserName("admin"); + user.setPassword("123456"); + user.setCreateTime(new Date()); + user.setUpdateTime(new Date()); + + userMapper.insert(user); + + } + + +} diff --git a/excel/pom.xml b/excel/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..57134ff95359f9c1432d6ee31cf007cfd791978d --- /dev/null +++ b/excel/pom.xml @@ -0,0 +1,79 @@ + + + 4.0.0 + + com.duan + excel + 1.0-SNAPSHOT + + + org.springframework.boot + spring-boot-starter-parent + 2.4.3 + + + + + org.springframework.boot + spring-boot-starter + 2.4.3 + + + + org.springframework.boot + spring-boot-starter-web + 2.4.3 + + + + org.springframework.boot + spring-boot-starter-test + 2.4.3 + + + + org.projectlombok + lombok + 1.18.2 + + + + junit + junit + 4.13.2 + test + + + + + com.alibaba + fastjson + 1.2.50 + + + + com.google.guava + guava + 20.0 + + + + + + com.baomidou + mybatis-plus-boot-starter + 3.4.3 + + + + + mysql + mysql-connector-java + 8.0.23 + + + + + \ No newline at end of file diff --git a/excel/src/main/java/com/duan/ExcelApplication.java b/excel/src/main/java/com/duan/ExcelApplication.java new file mode 100644 index 0000000000000000000000000000000000000000..15ae08b4b50d4205292e974b49b4a0ae3c02afb4 --- /dev/null +++ b/excel/src/main/java/com/duan/ExcelApplication.java @@ -0,0 +1,17 @@ +package com.duan; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +/** + * @author db + * @version 1.0 + * @description ExcelApplication + * @since 2024/3/20 + */ +@SpringBootApplication +public class ExcelApplication { + public static void main(String[] args) { + SpringApplication.run(ExcelApplication.class); + } +} diff --git a/excel/src/main/resources/application-dev.yml b/excel/src/main/resources/application-dev.yml new file mode 100644 index 0000000000000000000000000000000000000000..15809fbaa4ecbe5a546da74bed4d609cf30acde7 --- /dev/null +++ b/excel/src/main/resources/application-dev.yml @@ -0,0 +1,18 @@ + + +mybatis-plus: + configuration: + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 查看日志 + +spring: + datasource: + url: jdbc:mysql://localhost:3306/transaction?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false + username: root + password: 123456 + driver-class-name: com.mysql.cj.jdbc.Driver + +mybatis: + type-aliases-package: com.duan.pojo + configuration: + map-underscore-to-camel-case: true + diff --git a/excel/src/main/resources/application.yml b/excel/src/main/resources/application.yml new file mode 100644 index 0000000000000000000000000000000000000000..4cc9cb52d058a275677e5d2a139c202cf8ad68d5 --- /dev/null +++ b/excel/src/main/resources/application.yml @@ -0,0 +1,8 @@ +server: + port: 8088 + servlet: + context-path: /excel + +spring: + profiles: + active: dev diff --git a/filter/pom.xml b/filter/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..c8878e71a4dc3edfa090271f1f8982476f2b1d79 --- /dev/null +++ b/filter/pom.xml @@ -0,0 +1,37 @@ + + + 4.0.0 + + com.duan + filter + 1.0-SNAPSHOT + + + + org.springframework.boot + spring-boot-starter + 2.4.3 + + + + org.springframework.boot + spring-boot-starter-web + 2.4.3 + + + + org.projectlombok + lombok + 1.18.2 + + + + junit + junit + 4.13.2 + test + + + \ No newline at end of file diff --git a/filter/src/main/java/com/duan/FilterApplication.java b/filter/src/main/java/com/duan/FilterApplication.java new file mode 100644 index 0000000000000000000000000000000000000000..4e2b948224026803c9a6547203913068aa9af585 --- /dev/null +++ b/filter/src/main/java/com/duan/FilterApplication.java @@ -0,0 +1,20 @@ +package com.duan; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.ServletComponentScan; + + +/** + * @author db + * @version 1.0 + * @description FilterApplication + * @since 2023/12/19 + */ +//@ServletComponentScan +@SpringBootApplication +public class FilterApplication { + public static void main(String[] args) { + SpringApplication.run(FilterApplication.class); + } +} diff --git a/filter/src/main/java/com/duan/config/FilterConfig.java b/filter/src/main/java/com/duan/config/FilterConfig.java new file mode 100644 index 0000000000000000000000000000000000000000..89516d813a7ee53fa036c60cd04665465ef99b2c --- /dev/null +++ b/filter/src/main/java/com/duan/config/FilterConfig.java @@ -0,0 +1,35 @@ +package com.duan.config; + +import com.duan.filter.TestFilter2; +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import javax.servlet.Filter; +import java.util.ArrayList; +import java.util.List; + +/** + * @author db + * @version 1.0 + * @description FilterConfig + * @since 2023/12/20 + */ +@Configuration +public class FilterConfig { + + @Bean + public FilterRegistrationBean testFilter2(){ + FilterRegistrationBean filterFilterRegistrationBean = new FilterRegistrationBean<>(); + filterFilterRegistrationBean.setEnabled(true); // 是否启动注入过滤器 + filterFilterRegistrationBean.setFilter(new TestFilter2()); // 设置过滤器 + filterFilterRegistrationBean.setOrder(1); // 设置过滤器顺序 数字越小越靠前 + filterFilterRegistrationBean.setName("TestFilter2"); // 设置过滤器名字 + + List urlPatterns = new ArrayList<>(); + urlPatterns.add("/*"); + filterFilterRegistrationBean.setUrlPatterns(urlPatterns); // 设置要过滤的路径 + + return filterFilterRegistrationBean; + } +} diff --git a/filter/src/main/java/com/duan/controller/LoginController.java b/filter/src/main/java/com/duan/controller/LoginController.java new file mode 100644 index 0000000000000000000000000000000000000000..26dfd335045990e8f580993c0f8159c6bd58de8a --- /dev/null +++ b/filter/src/main/java/com/duan/controller/LoginController.java @@ -0,0 +1,26 @@ +package com.duan.controller; + +import com.duan.pojo.Result; +import com.duan.pojo.User; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +/** + * @author db + * @version 1.0 + * @description LoginController + * @since 2023/12/19 + */ +@RestController +public class LoginController { + + @PostMapping("/login") + public Result login(@RequestBody User user){ + System.out.println("调用Controller中的login方法"); + if("admin".equals(user.getUsername()) && "123456".equals(user.getPassword())){ + return Result.success(); + } + return Result.error(); + } +} diff --git a/filter/src/main/java/com/duan/filter/LoginFilter.java b/filter/src/main/java/com/duan/filter/LoginFilter.java new file mode 100644 index 0000000000000000000000000000000000000000..174fbee774db2fc861bf2fc9dcdb0c3c31e47c92 --- /dev/null +++ b/filter/src/main/java/com/duan/filter/LoginFilter.java @@ -0,0 +1,27 @@ +package com.duan.filter; + +import javax.servlet.*; +import javax.servlet.annotation.WebFilter; +import java.io.IOException; + +/** + * @author db + * @version 1.0 + * @description LoginFilter + * @since 2023/12/19 + */ + +//@WebFilter(urlPatterns = "/*") +public class LoginFilter implements Filter { + + // 拦截方法,只要资源请求被拦截到,就一定会调用此方法 + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { + System.out.println("拦截方法执行,拦截了请求"); + + System.out.println("放行前逻辑+++++++"); + chain.doFilter(request,response); + + System.out.println("放行后逻辑——————"); + } +} diff --git a/filter/src/main/java/com/duan/filter/TestFilter.java b/filter/src/main/java/com/duan/filter/TestFilter.java new file mode 100644 index 0000000000000000000000000000000000000000..df3d0794a9cf8c07dbfd13656b2728b6026912c0 --- /dev/null +++ b/filter/src/main/java/com/duan/filter/TestFilter.java @@ -0,0 +1,21 @@ +package com.duan.filter; + +import org.springframework.stereotype.Component; + +import javax.servlet.*; +import java.io.IOException; + +/** + * @author db + * @version 1.0 + * @description TestFilter + * @since 2023/12/20 + */ +//@Component +//public class TestFilter implements Filter { +// @Override +// public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { +// System.out.println("通过@Component方式配置过滤器"); +// chain.doFilter(request,response); +// } +//} diff --git a/filter/src/main/java/com/duan/filter/TestFilter2.java b/filter/src/main/java/com/duan/filter/TestFilter2.java new file mode 100644 index 0000000000000000000000000000000000000000..8689ec91193e75c681793a491d7fe94ce7a21027 --- /dev/null +++ b/filter/src/main/java/com/duan/filter/TestFilter2.java @@ -0,0 +1,18 @@ +package com.duan.filter; + +import javax.servlet.*; +import java.io.IOException; + +/** + * @author db + * @version 1.0 + * @description TestFilter2 + * @since 2023/12/20 + */ +public class TestFilter2 implements Filter { + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { + System.out.println("使用@Configration配置过滤器"); + chain.doFilter(request,response); + } +} diff --git a/filter/src/main/java/com/duan/pojo/Result.java b/filter/src/main/java/com/duan/pojo/Result.java new file mode 100644 index 0000000000000000000000000000000000000000..b3852789db2a3e75ac88a6d35186a0660cf46c4f --- /dev/null +++ b/filter/src/main/java/com/duan/pojo/Result.java @@ -0,0 +1,34 @@ +package com.duan.pojo; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author db + * @version 1.0 + * @description Result + * @since 2023/12/19 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class Result { + + private Integer code; + private String msg; + private Object data; + + public static Result success(){ + return new Result(1,"success",null); + } + + public static Result success(Object data){ + return new Result(1,"success",data); + } + + public static Result error(){ + return new Result(0,"error",null); + } + +} diff --git a/filter/src/main/java/com/duan/pojo/User.java b/filter/src/main/java/com/duan/pojo/User.java new file mode 100644 index 0000000000000000000000000000000000000000..1895461f53a2e2cacba36ff0da269fb6f194dda3 --- /dev/null +++ b/filter/src/main/java/com/duan/pojo/User.java @@ -0,0 +1,19 @@ +package com.duan.pojo; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author db + * @version 1.0 + * @description User + * @since 2023/12/19 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class User { + private String username; + private String password; +} diff --git a/interceptor/pom.xml b/interceptor/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..5eaea71a91cd9241099da2a8aa19abced1ba8014 --- /dev/null +++ b/interceptor/pom.xml @@ -0,0 +1,44 @@ + + + 4.0.0 + + com.duan + interceptor + 1.0-SNAPSHOT + + + + org.springframework.boot + spring-boot-starter + 2.4.3 + + + + org.springframework.boot + spring-boot-starter-web + 2.4.3 + + + + org.projectlombok + lombok + 1.18.2 + + + + junit + junit + 4.13.2 + test + + + com.alibaba + fastjson + 2.0.15 + compile + + + + \ No newline at end of file diff --git a/interceptor/src/main/java/com/duan/InterceptorApplication.java b/interceptor/src/main/java/com/duan/InterceptorApplication.java new file mode 100644 index 0000000000000000000000000000000000000000..efa3d65f063fd9f5f406258adb404718735d0633 --- /dev/null +++ b/interceptor/src/main/java/com/duan/InterceptorApplication.java @@ -0,0 +1,19 @@ +package com.duan; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.ServletComponentScan; + +/** + * @author db + * @version 1.0 + * @description InterceptorApplication + * @since 2023/8/31 + */ +@ServletComponentScan +@SpringBootApplication +public class InterceptorApplication { + public static void main(String[] args) { + SpringApplication.run(InterceptorApplication.class,args); + } +} diff --git a/interceptor/src/main/java/com/duan/config/LoginInterceptorConfig.java b/interceptor/src/main/java/com/duan/config/LoginInterceptorConfig.java new file mode 100644 index 0000000000000000000000000000000000000000..6b454cacbce84100b4debff8ee64c084bfbe889b --- /dev/null +++ b/interceptor/src/main/java/com/duan/config/LoginInterceptorConfig.java @@ -0,0 +1,26 @@ +package com.duan.config; + +import com.duan.handler.LoginInterceptor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +/** + * @author db + * @version 1.0 + * @description LoginInterceptorConfig 注册拦截器 + * @since 2023/12/20 + */ +@Configuration +public class LoginInterceptorConfig implements WebMvcConfigurer { + + @Autowired + private LoginInterceptor loginInterceptor; + + @Override + public void addInterceptors(InterceptorRegistry registry){ + registry.addInterceptor(loginInterceptor).addPathPatterns("/**"); + + } +} diff --git a/interceptor/src/main/java/com/duan/controller/LoginController.java b/interceptor/src/main/java/com/duan/controller/LoginController.java new file mode 100644 index 0000000000000000000000000000000000000000..66ac9537aae1a399fe7ff407d9d5d26c9634ded8 --- /dev/null +++ b/interceptor/src/main/java/com/duan/controller/LoginController.java @@ -0,0 +1,27 @@ +package com.duan.controller; + +import com.duan.pojo.Result; +import com.duan.pojo.User; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +/** + * @author db + * @version 1.0 + * @description LoginController + * @since 2023/12/19 + */ +@RestController +public class LoginController { + + @PostMapping("/login") + public Result login(@RequestBody User user){ + System.out.println("执行LoginController中login方法"); + if("admin".equals(user.getUsername()) && "123456".equals(user.getPassword())){ + return Result.success(); + } + return Result.error(); + } +} diff --git a/interceptor/src/main/java/com/duan/handler/LoginInterceptor.java b/interceptor/src/main/java/com/duan/handler/LoginInterceptor.java new file mode 100644 index 0000000000000000000000000000000000000000..c0a8de35f937b63725b881f48410ffbe2ed996f9 --- /dev/null +++ b/interceptor/src/main/java/com/duan/handler/LoginInterceptor.java @@ -0,0 +1,39 @@ +package com.duan.handler; + +import org.springframework.lang.Nullable; +import org.springframework.stereotype.Component; +import org.springframework.web.servlet.HandlerInterceptor; +import org.springframework.web.servlet.ModelAndView; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * @author db + * @version 1.0 + * @description LoginInterceptor + * @since 2023/12/20 + */ +@Component +public class LoginInterceptor implements HandlerInterceptor { + + // 目标方法执行前调用 true:放行 + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { + System.out.println("preHandle"); + return true; + } + + // 目标方法执行后调用 + @Override + public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { + System.out.println("postHandle..."); + } + + + // 请求处理后调用 + @Override + public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { + System.out.println("Completion..."); + } +} diff --git a/interceptor/src/main/java/com/duan/pojo/Result.java b/interceptor/src/main/java/com/duan/pojo/Result.java new file mode 100644 index 0000000000000000000000000000000000000000..b3852789db2a3e75ac88a6d35186a0660cf46c4f --- /dev/null +++ b/interceptor/src/main/java/com/duan/pojo/Result.java @@ -0,0 +1,34 @@ +package com.duan.pojo; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author db + * @version 1.0 + * @description Result + * @since 2023/12/19 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class Result { + + private Integer code; + private String msg; + private Object data; + + public static Result success(){ + return new Result(1,"success",null); + } + + public static Result success(Object data){ + return new Result(1,"success",data); + } + + public static Result error(){ + return new Result(0,"error",null); + } + +} diff --git a/interceptor/src/main/java/com/duan/pojo/User.java b/interceptor/src/main/java/com/duan/pojo/User.java new file mode 100644 index 0000000000000000000000000000000000000000..1895461f53a2e2cacba36ff0da269fb6f194dda3 --- /dev/null +++ b/interceptor/src/main/java/com/duan/pojo/User.java @@ -0,0 +1,19 @@ +package com.duan.pojo; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author db + * @version 1.0 + * @description User + * @since 2023/12/19 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class User { + private String username; + private String password; +} diff --git a/jwt/pom.xml b/jwt/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..67337c7178aa6c210eb0ab6bc4451b03ce828be8 --- /dev/null +++ b/jwt/pom.xml @@ -0,0 +1,40 @@ + + + 4.0.0 + + com.duan + jwt + 1.0-SNAPSHOT + + + + org.springframework.boot + spring-boot-starter + 2.4.3 + + + + org.springframework.boot + spring-boot-starter-web + 2.4.3 + + + + io.jsonwebtoken + jjwt + 0.9.1 + + + + + junit + junit + 4.13.2 + test + + + + + \ No newline at end of file diff --git a/jwt/src/main/java/com/duan/JWTApplication.java b/jwt/src/main/java/com/duan/JWTApplication.java new file mode 100644 index 0000000000000000000000000000000000000000..40b9a7ce21fc0d6c5cf214017bd8aad6f164128e --- /dev/null +++ b/jwt/src/main/java/com/duan/JWTApplication.java @@ -0,0 +1,18 @@ +package com.duan; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +/** + * @author db + * @version 1.0 + * @description JWTApplication + * @since 2023/12/21 + */ +@SpringBootApplication +public class JWTApplication { + + public static void main(String[] args) { + SpringApplication.run(JWTApplication.class); + } +} diff --git a/jwt/src/main/java/com/duan/controller.java b/jwt/src/main/java/com/duan/controller.java new file mode 100644 index 0000000000000000000000000000000000000000..122140e819a502820af5fe120c2b006223aa76d5 --- /dev/null +++ b/jwt/src/main/java/com/duan/controller.java @@ -0,0 +1,10 @@ +package com.duan; + +/** + * @author db + * @version 1.0 + * @description controller + * @since 2023/12/21 + */ +public class controller { +} diff --git a/jwt/src/main/java/com/utils/JWTUtils.java b/jwt/src/main/java/com/utils/JWTUtils.java new file mode 100644 index 0000000000000000000000000000000000000000..16ae2a41216b2de6304aec5ba3a61c0ae16c0493 --- /dev/null +++ b/jwt/src/main/java/com/utils/JWTUtils.java @@ -0,0 +1,45 @@ +package com.utils; + +import io.jsonwebtoken.Claims; +import io.jsonwebtoken.Jwts; +import io.jsonwebtoken.SignatureAlgorithm; + +import java.util.Date; +import java.util.Map; + +/** + * @author db + * @version 1.0 + * @description JWTUtils + * @since 2023/12/31 + */ +public class JWTUtils { + + // 密钥 + private static String signKey = "cxykk1217"; + // 过期时间 + private static Long expire = 1000L*60*30; // 30分钟 + + /** + * 生成JWT + * @param claims JWT第二部分负载payload中存储的内容 + * @return + */ + public static String generateJwt(Map claims){ + String jwt = Jwts.builder().signWith(SignatureAlgorithm.HS256, signKey) + .addClaims(claims) + .setExpiration(new Date(System.currentTimeMillis() + expire)) + .compact(); + + return jwt; + } + + public static Claims parseJWT(String jwt){ + Claims claims = Jwts.parser().setSigningKey(signKey) + .parseClaimsJws(jwt) + .getBody(); + return claims; + } + + +} diff --git a/jwt/src/test/java/com/duan/JWTTest.java b/jwt/src/test/java/com/duan/JWTTest.java new file mode 100644 index 0000000000000000000000000000000000000000..f2b9b0abcbecbc65631de9cc0d452e9e1daac3a0 --- /dev/null +++ b/jwt/src/test/java/com/duan/JWTTest.java @@ -0,0 +1,46 @@ +package com.duan; + +import io.jsonwebtoken.Claims; +import io.jsonwebtoken.Jwts; +import io.jsonwebtoken.SignatureAlgorithm; +import org.junit.Test; + +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +/** + * @author db + * @version 1.0 + * @description JWTTest + * @since 2023/12/21 + */ +public class JWTTest { + + /** + * 生成令牌 + */ + @Test + public void getJWT(){ + Map map = new HashMap<>(); + map.put("id",1); + map.put("username","程序员康康"); + String jwt = Jwts.builder().signWith(SignatureAlgorithm.HS256, "cxykk1217") // 设置签名算法和密钥 + .setClaims(map) // 设置给定的数据 + .setExpiration(new Date(System.currentTimeMillis() + 1000L * 60 * 3)) + .compact(); + System.out.println(jwt); + } + + /** + * 解析令牌 + */ + @Test + public void parseJwt(){ + Claims body = Jwts.parser() + .setSigningKey("cxykk1217") + .parseClaimsJws("eyJhbGciOiJIUzI1NiJ9.eyJpZCI6MSwiZXhwIjoxNzAzOTkxMjg5LCJ1c2VybmFtZSI6Iueoi-W6j-WRmOW6t-W6tyJ9.Q_xG0pDaG2rkix2rEw2SNS5uBwTS5f0FbzcLFpQ0yJY") + .getBody(); + System.out.println(body); + } +} diff --git a/log/pom.xml b/log/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..7eb7a739c619704eadcec2ec8601427b2e0e0418 --- /dev/null +++ b/log/pom.xml @@ -0,0 +1,56 @@ + + + 4.0.0 + + com.duan + log + 1.0-SNAPSHOT + + org.springframework.boot + spring-boot-starter-parent + 2.4.3 + + + + + org.springframework.boot + spring-boot-starter + 2.4.3 + + + + org.springframework.boot + spring-boot-starter-web + 2.4.3 + + + + org.projectlombok + lombok + 1.18.2 + + + + junit + junit + 4.13.2 + test + + + + com.alibaba + fastjson + 1.2.50 + + + + com.google.guava + guava + 20.0 + + + + + \ No newline at end of file diff --git a/log/src/main/java/com/duan/LogApplication.java b/log/src/main/java/com/duan/LogApplication.java new file mode 100644 index 0000000000000000000000000000000000000000..425c038ca7af99e09da9b65e3e5cd23fbaae452d --- /dev/null +++ b/log/src/main/java/com/duan/LogApplication.java @@ -0,0 +1,19 @@ +package com.duan; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +import javax.swing.*; + +/** + * @author db + * @version 1.0 + * @description LogApplication + * @since 2024/1/7 + */ +@SpringBootApplication +public class LogApplication { + public static void main(String[] args) { + SpringApplication.run(LogApplication.class); + } +} diff --git a/log/src/main/java/com/duan/config/HostIpConfig.java b/log/src/main/java/com/duan/config/HostIpConfig.java new file mode 100644 index 0000000000000000000000000000000000000000..3f5ae28b525e4662135780b6e4c3ea6e8d87a12f --- /dev/null +++ b/log/src/main/java/com/duan/config/HostIpConfig.java @@ -0,0 +1,19 @@ +package com.duan.config; + +import ch.qos.logback.classic.pattern.ClassicConverter; +import ch.qos.logback.classic.spi.ILoggingEvent; +import com.duan.utils.LocalIP; + +/** + * @author db + * @version 1.0 + * @description HostIpConfig 获得主机IP地址 + * @since 2024/1/9 + */ +public class HostIpConfig extends ClassicConverter { + @Override + public String convert(ILoggingEvent event) { + String hostIP = LocalIP.getIpAddress(); + return hostIP; + } +} diff --git a/log/src/main/java/com/duan/config/RequestIpConfig.java b/log/src/main/java/com/duan/config/RequestIpConfig.java new file mode 100644 index 0000000000000000000000000000000000000000..95c6d9ce56acfaf6427bf3b2a8a7499e3fcdb9f9 --- /dev/null +++ b/log/src/main/java/com/duan/config/RequestIpConfig.java @@ -0,0 +1,29 @@ +package com.duan.config; + +import ch.qos.logback.classic.pattern.ClassicConverter; +import ch.qos.logback.classic.spi.ILoggingEvent; +import com.duan.utils.IpUtils; +import org.springframework.web.context.request.RequestAttributes; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import javax.servlet.http.HttpServletRequest; + +/** + * @author db + * @version 1.0 + * @description RequestIpConfig 获得请求IP + * @since 2024/1/9 + */ +public class RequestIpConfig extends ClassicConverter { + @Override + public String convert(ILoggingEvent event) { + RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes(); + if (requestAttributes == null) { + return "127.0.0.1"; + } + HttpServletRequest request = ((ServletRequestAttributes)requestAttributes).getRequest(); + String requestIP = IpUtils.getIpAddr(request); + return requestIP; + } +} diff --git a/log/src/main/java/com/duan/config/UUIDConfig.java b/log/src/main/java/com/duan/config/UUIDConfig.java new file mode 100644 index 0000000000000000000000000000000000000000..0dc4240855bc0c8e14d4ec3027e521f2e6664f25 --- /dev/null +++ b/log/src/main/java/com/duan/config/UUIDConfig.java @@ -0,0 +1,18 @@ +package com.duan.config; + +import ch.qos.logback.classic.pattern.ClassicConverter; +import ch.qos.logback.classic.spi.ILoggingEvent; + +/** + * @author db + * @version 1.0 + * @description UUIDConfig + * @since 2024/1/9 + */ +public class UUIDConfig extends ClassicConverter { + @Override + public String convert(ILoggingEvent iLoggingEvent) { + + return "12344556"; + } +} diff --git a/log/src/main/java/com/duan/config/WebConfig.java b/log/src/main/java/com/duan/config/WebConfig.java new file mode 100644 index 0000000000000000000000000000000000000000..e32b8a108a76cce57688cad44d7e618697769dae --- /dev/null +++ b/log/src/main/java/com/duan/config/WebConfig.java @@ -0,0 +1,24 @@ +package com.duan.config; + +import com.duan.interceptor.TraceInterceptor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; + +/** + * @author db + * @version 1.0 + * @description WebConfig + * @since 2024/1/9 + */ +@Configuration +public class WebConfig extends WebMvcConfigurerAdapter { + @Autowired + private TraceInterceptor traceInterceptor; + + @Override + public void addInterceptors(InterceptorRegistry registry) { + registry.addInterceptor(traceInterceptor); + } +} diff --git a/log/src/main/java/com/duan/controller/LoginController.java b/log/src/main/java/com/duan/controller/LoginController.java new file mode 100644 index 0000000000000000000000000000000000000000..e11e49fd63e1390271b5a1a4b292e9535e69d779 --- /dev/null +++ b/log/src/main/java/com/duan/controller/LoginController.java @@ -0,0 +1,31 @@ +package com.duan.controller; + + +import com.duan.pojo.Result; +import com.duan.pojo.User; +import lombok.extern.slf4j.Slf4j; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +/** + * @author db + * @version 1.0 + * @description LoginController + * @since 2023/12/19 + */ +@RestController +@Slf4j +public class LoginController { + + @PostMapping("/login") + public Result login(@RequestBody User user){ + log.info("这是正常日志"); + if("admin".equals(user.getUsername()) && "123456".equals(user.getPassword())){ + return Result.success("ok"); + } + return Result.error(); + } +} diff --git a/log/src/main/java/com/duan/interceptor/TraceInterceptor.java b/log/src/main/java/com/duan/interceptor/TraceInterceptor.java new file mode 100644 index 0000000000000000000000000000000000000000..a9af6d222ada96f39b4c63b0e874804fe2aa564a --- /dev/null +++ b/log/src/main/java/com/duan/interceptor/TraceInterceptor.java @@ -0,0 +1,29 @@ +package com.duan.interceptor; + +import org.slf4j.MDC; +import org.springframework.stereotype.Component; +import org.springframework.web.servlet.HandlerInterceptor; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.UUID; + +/** + * @author db + * @version 1.0 + * @description TraceInterceptor + * @since 2024/1/9 + */ +@Component +public class TraceInterceptor implements HandlerInterceptor { + @Override + public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object handler) throws Exception { + MDC.put("traceid", UUID.randomUUID().toString()); + return true; + } + + @Override + public void afterCompletion(HttpServletRequest httpServletRequest,HttpServletResponse httpServletResponse,Object handler,Exception e) throws Exception { + MDC.remove("traceid"); + } +} diff --git a/log/src/main/java/com/duan/pojo/Result.java b/log/src/main/java/com/duan/pojo/Result.java new file mode 100644 index 0000000000000000000000000000000000000000..b3852789db2a3e75ac88a6d35186a0660cf46c4f --- /dev/null +++ b/log/src/main/java/com/duan/pojo/Result.java @@ -0,0 +1,34 @@ +package com.duan.pojo; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author db + * @version 1.0 + * @description Result + * @since 2023/12/19 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class Result { + + private Integer code; + private String msg; + private Object data; + + public static Result success(){ + return new Result(1,"success",null); + } + + public static Result success(Object data){ + return new Result(1,"success",data); + } + + public static Result error(){ + return new Result(0,"error",null); + } + +} diff --git a/log/src/main/java/com/duan/pojo/User.java b/log/src/main/java/com/duan/pojo/User.java new file mode 100644 index 0000000000000000000000000000000000000000..1895461f53a2e2cacba36ff0da269fb6f194dda3 --- /dev/null +++ b/log/src/main/java/com/duan/pojo/User.java @@ -0,0 +1,19 @@ +package com.duan.pojo; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author db + * @version 1.0 + * @description User + * @since 2023/12/19 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class User { + private String username; + private String password; +} diff --git a/log/src/main/java/com/duan/utils/IpUtils.java b/log/src/main/java/com/duan/utils/IpUtils.java new file mode 100644 index 0000000000000000000000000000000000000000..6f212592d15534a9a25b3d47206fd6176cae8ca8 --- /dev/null +++ b/log/src/main/java/com/duan/utils/IpUtils.java @@ -0,0 +1,51 @@ +package com.duan.utils; + + +import com.google.common.base.Strings; + +import javax.servlet.http.HttpServletRequest; + +public class IpUtils { + + private IpUtils(){ + + } + + public static String getIpAddr(HttpServletRequest request) { + String xIp = request.getHeader("X-Real-IP"); + String xFor = request.getHeader("X-Forwarded-For"); + + if (!Strings.isNullOrEmpty(xFor) && !"unKnown".equalsIgnoreCase(xFor)) { + //多次反向代理后会有多个ip值,第一个ip才是真实ip + int index = xFor.indexOf(","); + if (index != -1) { + return xFor.substring(0, index); + } else { + return xFor; + } + } + xFor = xIp; + if (!Strings.isNullOrEmpty(xFor) && !"unKnown".equalsIgnoreCase(xFor)) { + return xFor; + } + if (Strings.nullToEmpty(xFor).trim().isEmpty() || "unknown".equalsIgnoreCase(xFor)) { + xFor = request.getHeader("Proxy-Client-IP"); + } + if (Strings.nullToEmpty(xFor).trim().isEmpty() || "unknown".equalsIgnoreCase(xFor)) { + xFor = request.getHeader("WL-Proxy-Client-IP"); + } + if (Strings.nullToEmpty(xFor).trim().isEmpty() || "unknown".equalsIgnoreCase(xFor)) { + xFor = request.getHeader("HTTP_CLIENT_IP"); + } + if (Strings.nullToEmpty(xFor).trim().isEmpty() || "unknown".equalsIgnoreCase(xFor)) { + xFor = request.getHeader("HTTP_X_FORWARDED_FOR"); + } + if (Strings.nullToEmpty(xFor).trim().isEmpty() || "unknown".equalsIgnoreCase(xFor)) { + xFor = request.getRemoteAddr(); + } + + + return "0:0:0:0:0:0:0:1".equals(xFor) ? "127.0.0.1" : xFor; + } + +} diff --git a/log/src/main/java/com/duan/utils/LocalIP.java b/log/src/main/java/com/duan/utils/LocalIP.java new file mode 100644 index 0000000000000000000000000000000000000000..3d30cae792fac5531321659840167bf54e0144d5 --- /dev/null +++ b/log/src/main/java/com/duan/utils/LocalIP.java @@ -0,0 +1,72 @@ +package com.duan.utils; + +import java.net.Inet4Address; +import java.net.InetAddress; +import java.net.NetworkInterface; +import java.util.Enumeration; + +public class LocalIP { + public static InetAddress getLocalHostExactAddress() { + try { + InetAddress candidateAddress = null; + + // 从网卡中获取IP + Enumeration networkInterfaces = NetworkInterface.getNetworkInterfaces(); + while (networkInterfaces.hasMoreElements()) { + NetworkInterface iface = networkInterfaces.nextElement(); + // 该网卡接口下的ip会有多个,也需要一个个的遍历,找到自己所需要的 + for (Enumeration inetAddrs = iface.getInetAddresses(); inetAddrs.hasMoreElements(); ) { + InetAddress inetAddr = inetAddrs.nextElement(); + // 排除loopback回环类型地址(不管是IPv4还是IPv6 只要是回环地址都会返回true) + if (!inetAddr.isLoopbackAddress()) { + if (inetAddr.isSiteLocalAddress()) { + // 如果是site-local地址,就是它了 就是我们要找的 + // ~~~~~~~~~~~~~绝大部分情况下都会在此处返回你的ip地址值~~~~~~~~~~~~~ + return inetAddr; + } + + // 若不是site-local地址 那就记录下该地址当作候选 + if (candidateAddress == null) { + candidateAddress = inetAddr; + } + + } + } + } + + // 如果出去loopback回环地之外无其它地址了,那就回退到原始方案吧 + return candidateAddress == null ? InetAddress.getLocalHost() : candidateAddress; + } catch (Exception e) { + e.printStackTrace(); + } + return null; + + } + + public static String getIpAddress() { + try { + //从网卡中获取IP + Enumeration allNetInterfaces = NetworkInterface.getNetworkInterfaces(); + InetAddress ip; + while (allNetInterfaces.hasMoreElements()) { + NetworkInterface netInterface = (NetworkInterface) allNetInterfaces.nextElement(); + //用于排除回送接口,非虚拟网卡,未在使用中的网络接口 + if (!netInterface.isLoopback() && !netInterface.isVirtual() && netInterface.isUp()) { + //返回和网络接口绑定的所有IP地址 + Enumeration addresses = netInterface.getInetAddresses(); + while (addresses.hasMoreElements()) { + ip = addresses.nextElement(); + if (ip instanceof Inet4Address) { + return ip.getHostAddress(); + } + } + } + } + } catch (Exception e) { + System.err.println("IP地址获取失败" + e.toString()); + } + return ""; + } + +} + diff --git a/log/src/main/resources/application-dev.yml b/log/src/main/resources/application-dev.yml new file mode 100644 index 0000000000000000000000000000000000000000..8b137891791fe96927ad78e64b0aad7bded08bdc --- /dev/null +++ b/log/src/main/resources/application-dev.yml @@ -0,0 +1 @@ + diff --git a/log/src/main/resources/application.yml b/log/src/main/resources/application.yml new file mode 100644 index 0000000000000000000000000000000000000000..53c19bc3a921cb8d0a07a54ede6bdc19d6f5f947 --- /dev/null +++ b/log/src/main/resources/application.yml @@ -0,0 +1,8 @@ +server: + port: 8082 + servlet: + context-path: /log + +spring: + profiles: + active: dev diff --git a/log/src/main/resources/logback-spring.xml b/log/src/main/resources/logback-spring.xml new file mode 100644 index 0000000000000000000000000000000000000000..57488e3c98ddfdff87ef590469683ba2bd5f72bd --- /dev/null +++ b/log/src/main/resources/logback-spring.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + + + + + + + + + + + + + + + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n + + + + + + + + ${LOG_HOME}/info.log + + + + + ${LOG_HOME}/info.%d{yyyy-MM-dd}.%i.log + + 30 + + 1GB + 10MB + + + + + UTF-8 + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n + + + + + + INFO + + + + + + ${LOG_HOME}/error.log + + + ${LOG_HOME}/error.%d{yyyy-MM-dd}.%i.log + 30 + + 1GB + 10MB + + + UTF-8 + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n + + + + ERROR + + + + + + + + + + + + \ No newline at end of file diff --git a/logback/pom.xml b/logback/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..71fe43dcfa61fac25ed94b382f0d5d6fce0e10eb --- /dev/null +++ b/logback/pom.xml @@ -0,0 +1,67 @@ + + + 4.0.0 + + com.duan + logback + 1.0-SNAPSHOT + + + + org.apache.maven.plugins + maven-compiler-plugin + + 8 + 8 + + + + + + + org.springframework.boot + spring-boot-starter-parent + 2.4.3 + + + + + org.springframework.boot + spring-boot-starter + 2.4.3 + + + + org.springframework.boot + spring-boot-starter-web + 2.4.3 + + + + org.projectlombok + lombok + 1.18.2 + + + + junit + junit + 4.13.2 + test + + + + com.alibaba + fastjson + 1.2.50 + + + + com.google.guava + guava + 20.0 + + + \ No newline at end of file diff --git a/logback/src/main/java/com/duan/LogbackApplication.java b/logback/src/main/java/com/duan/LogbackApplication.java new file mode 100644 index 0000000000000000000000000000000000000000..33eb30e162f454d82157b0171cf635d6f8c2f45e --- /dev/null +++ b/logback/src/main/java/com/duan/LogbackApplication.java @@ -0,0 +1,12 @@ +package com.duan; + + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class LogbackApplication { + public static void main(String[] args) { + SpringApplication.run(LogbackApplication.class); + } +} diff --git a/logback/src/main/java/com/duan/config/ControllerResponseAdvice.java b/logback/src/main/java/com/duan/config/ControllerResponseAdvice.java new file mode 100644 index 0000000000000000000000000000000000000000..3240bc0f7b0254163424ccd1d459da9d64b78d5a --- /dev/null +++ b/logback/src/main/java/com/duan/config/ControllerResponseAdvice.java @@ -0,0 +1,42 @@ +package com.duan.config; + +import com.alibaba.fastjson.JSON; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.MethodParameter; +import org.springframework.http.MediaType; +import org.springframework.http.server.ServerHttpRequest; +import org.springframework.http.server.ServerHttpResponse; +import org.springframework.http.server.ServletServerHttpRequest; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice; + +import javax.servlet.http.HttpServletRequest; + +/** + * @author db + * @version 1.0 + * @description ControllerResponseAdvice + * @since 2024/1/3 + * + * 使用ResponseBodyAdvice对Controller的所有返回值进行封装 + */ +@ControllerAdvice +public class ControllerResponseAdvice implements ResponseBodyAdvice { + @Override + public boolean supports(MethodParameter returnType, Class converterType) { + return true; + } + + @Override + public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) { + if (body != null) { + try { + HttpServletRequest servletRequest = ((ServletServerHttpRequest) request).getServletRequest(); + servletRequest.setAttribute("responseParams", JSON.toJSONString(body)); + } catch (Exception e) { + e.printStackTrace(); + } + } + return body; + } +} diff --git a/logback/src/main/java/com/duan/config/IPConfig.java b/logback/src/main/java/com/duan/config/IPConfig.java new file mode 100644 index 0000000000000000000000000000000000000000..43256b14b51deb43c5ab33f527f7449e6210a545 --- /dev/null +++ b/logback/src/main/java/com/duan/config/IPConfig.java @@ -0,0 +1,27 @@ +package com.duan.config; + +import ch.qos.logback.classic.pattern.ClassicConverter; +import ch.qos.logback.classic.spi.ILoggingEvent; +import com.duan.utils.LocalIP; + +import java.net.InetAddress; + +public class IPConfig extends ClassicConverter { + @Override + public String convert(ILoggingEvent iLoggingEvent) { +// String hostAddress = null; +// try { +// hostAddress = Inet4Address.getLocalHost().getHostAddress(); +// } catch (UnknownHostException e) { +// e.printStackTrace(); +// } + + InetAddress localIPAddress = LocalIP.getLocalHostExactAddress(); + String hostAddress = localIPAddress.getHostAddress(); + System.out.println(hostAddress); + + String ipAddress = LocalIP.getIpAddress(); + System.out.println(ipAddress); + return ipAddress; + } +} diff --git a/logback/src/main/java/com/duan/config/IPLogConfig.java b/logback/src/main/java/com/duan/config/IPLogConfig.java new file mode 100644 index 0000000000000000000000000000000000000000..9dbe5a67f51096eb98a5ae1c25424b47552c6fe4 --- /dev/null +++ b/logback/src/main/java/com/duan/config/IPLogConfig.java @@ -0,0 +1,26 @@ +package com.duan.config; + + +import ch.qos.logback.classic.pattern.ClassicConverter; +import ch.qos.logback.classic.spi.ILoggingEvent; +import com.duan.utils.IpUtils; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.context.request.RequestAttributes; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import javax.servlet.http.HttpServletRequest; + + +public class IPLogConfig extends ClassicConverter { + @Override + public String convert(ILoggingEvent iLoggingEvent) { + RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes(); + if (requestAttributes == null) { + return "127.0.0.1"; + } + HttpServletRequest request = ((ServletRequestAttributes) requestAttributes).getRequest(); + return IpUtils.getIpAddr(request); + + } +} diff --git a/logback/src/main/java/com/duan/config/JsonParameterRequestWrapper.java b/logback/src/main/java/com/duan/config/JsonParameterRequestWrapper.java new file mode 100644 index 0000000000000000000000000000000000000000..d5cf7190947cbb8e52732ef020408f01c4ffebb7 --- /dev/null +++ b/logback/src/main/java/com/duan/config/JsonParameterRequestWrapper.java @@ -0,0 +1,82 @@ +package com.duan.config; + +import com.duan.utils.StreamUtil; + +import javax.servlet.ReadListener; +import javax.servlet.ServletInputStream; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletRequestWrapper; +import java.io.BufferedReader; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStreamReader; + +/** + * @author db + * @version 1.0 + * @description JsonParameterRequestWrapper + * @since 2024/1/3 + */ +public class JsonParameterRequestWrapper extends HttpServletRequestWrapper { + + //用于保存读取body中数据 + private byte[] body; + private String bodyMessage; + public JsonParameterRequestWrapper(HttpServletRequest request) throws IOException { + super(request); + //读取请求的数据保存到本类当中 + body = StreamUtil.readBytes(request.getReader(), "UTF-8"); + bodyMessage = new String(body,"utf-8"); + } + + //覆盖(重写)父类的方法 + @Override + public BufferedReader getReader() throws IOException { + return new BufferedReader(new InputStreamReader(getInputStream())); + } + //覆盖(重写)父类的方法 + @Override + public ServletInputStream getInputStream() throws IOException { + final ByteArrayInputStream bais = new ByteArrayInputStream(body); + return new ServletInputStream() { + @Override + public boolean isFinished() { + return false; + } + + @Override + public boolean isReady() { + return false; + } + + @Override + public void setReadListener(ReadListener readListener) { + + } + + @Override + public int read() throws IOException { + return bais.read(); + } + }; + } + /** + * 获取body中的数据 + * @return + */ + public byte[] getBody() { + return body; + } + /** + * 把处理后的参数放到body里面 + * @param body + */ + public void setBody(byte[] body) { + this.body = body; + } + + public String getBodyMessage() { + return bodyMessage; + } + +} diff --git a/logback/src/main/java/com/duan/config/LogInterceptorConfig.java b/logback/src/main/java/com/duan/config/LogInterceptorConfig.java new file mode 100644 index 0000000000000000000000000000000000000000..d3cd93f647b6da353a7d6e3af9c276ce5a229a7b --- /dev/null +++ b/logback/src/main/java/com/duan/config/LogInterceptorConfig.java @@ -0,0 +1,27 @@ +package com.duan.config; + +import com.duan.interceptor.LogDemoInterceptor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +/** + * @author db + * @version 1.0 + * @description LogInterceptorConfig + * @since 2024/1/3 + */ +@Configuration +public class LogInterceptorConfig implements WebMvcConfigurer { + + @Autowired + private LogDemoInterceptor logDemoInterceptor; + + @Override + public void addInterceptors(InterceptorRegistry registry){ + registry.addInterceptor(logDemoInterceptor).addPathPatterns("/**"); + + } + +} diff --git a/logback/src/main/java/com/duan/controller/LoginController.java b/logback/src/main/java/com/duan/controller/LoginController.java new file mode 100644 index 0000000000000000000000000000000000000000..85eb2dfbd583c3804febfc0889253aacbbb49b1b --- /dev/null +++ b/logback/src/main/java/com/duan/controller/LoginController.java @@ -0,0 +1,30 @@ +package com.duan.controller; + +import com.duan.pojo.Result; +import com.duan.pojo.User; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +/** + * @author db + * @version 1.0 + * @description LoginController + * @since 2023/12/19 + */ +@RestController +@Slf4j +public class LoginController { + + @PostMapping("/login") + public Result login(@RequestBody User user){ + log.info("这是正常日志"); + log.error("这是错误日志"); + if("admin".equals(user.getUsername()) && "123456".equals(user.getPassword())){ + return Result.success("ok"); + } + + return Result.error(); + } +} diff --git a/logback/src/main/java/com/duan/filter/RecordChannelFilter.java b/logback/src/main/java/com/duan/filter/RecordChannelFilter.java new file mode 100644 index 0000000000000000000000000000000000000000..c5e5f932a5f352212a2947a87770f8bde0b8b5f8 --- /dev/null +++ b/logback/src/main/java/com/duan/filter/RecordChannelFilter.java @@ -0,0 +1,45 @@ +package com.duan.filter; + +import com.duan.config.JsonParameterRequestWrapper; +import org.springframework.stereotype.Component; + +import javax.servlet.*; +import javax.servlet.annotation.WebFilter; +import javax.servlet.http.HttpServletRequest; +import javax.xml.ws.RequestWrapper; +import java.io.IOException; + +/** + * @author db + * @version 1.0 + * @description RecordChannelFilter + * @since 2024/1/3 + */ +@Component +@WebFilter(urlPatterns = "/**") +public class RecordChannelFilter implements Filter { + @Override + public void init(FilterConfig filterConfig) throws ServletException { + + } + + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { + ServletRequest requestWrapper = null; + if(request instanceof HttpServletRequest) { + requestWrapper = new JsonParameterRequestWrapper((HttpServletRequest) request); + } + if(requestWrapper == null) { + //防止流读取一次就没有了,将流传递下去 + chain.doFilter(request, response); + } else { + chain.doFilter(requestWrapper, response); + } + + } + + @Override + public void destroy() { + + } +} diff --git a/logback/src/main/java/com/duan/interceptor/LogDemoInterceptor.java b/logback/src/main/java/com/duan/interceptor/LogDemoInterceptor.java new file mode 100644 index 0000000000000000000000000000000000000000..49af35851cdeba9544b4f74b2644c84dfbe55c7b --- /dev/null +++ b/logback/src/main/java/com/duan/interceptor/LogDemoInterceptor.java @@ -0,0 +1,110 @@ +package com.duan.interceptor; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.duan.config.JsonParameterRequestWrapper; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.MethodParameter; +import org.springframework.stereotype.Component; +import org.springframework.web.context.request.RequestAttributes; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; +import org.springframework.web.method.HandlerMethod; +import org.springframework.web.servlet.HandlerInterceptor; +import org.springframework.web.servlet.ModelAndView; + +import javax.servlet.ServletInputStream; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletRequestWrapper; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.lang.reflect.Parameter; +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Arrays; +import java.util.Date; +import java.util.Map; + +/** + * @author db + * @version 1.0 + * @description LogDemoInterceptor + * @since 2024/1/3 + */ +@Component +@Slf4j +public class LogDemoInterceptor implements HandlerInterceptor { + // 目标方法执行前调用 true:放行 + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws IOException { + System.out.println("preHandle"); + + + DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); + String requestTime = sdf.format(new Date()); + request.setAttribute("requestTime",requestTime); + System.out.println("请求时间"+requestTime); + + JsonParameterRequestWrapper jsonParameterRequestWrapper = new JsonParameterRequestWrapper(request); + String bodyMessage = jsonParameterRequestWrapper.getBodyMessage(); + + request.setAttribute("requestParams",bodyMessage); + + + String requestMethod = request.getMethod(); + request.setAttribute("requestMethod",requestMethod); + return true; + } + + // 目标方法执行后调用 + @Override + public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { + System.out.println("postHandle..."); + + } + + + // 请求处理后调用 + @Override + public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { + + JSONObject json = new JSONObject(); + // 接口请求时间 + String requestTime = (String)request.getAttribute("requestTime"); + json.put("requestTime",requestTime); + + // 请求参数 + Object requestParams = request.getAttribute("requestParams"); + json.put("requestParams",requestParams.toString()); + + // 请求方法 + Object requestMethod = request.getAttribute("requestMethod"); + json.put("requestMethod",requestMethod.toString()); + + DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); + Date parse = null; + try { + parse = sdf.parse(requestTime); + } catch (ParseException e) { + e.printStackTrace(); + } + long time = parse.getTime(); + + // 接口响应时间 + long responseTime = System.currentTimeMillis(); + Date date = new Date(responseTime); + String format = sdf.format(date); + json.put("format",format); + + // 接口耗时 + long consumeTime = responseTime - time; + json.put("consumeTime",consumeTime); + + Object responseParams = request.getAttribute("responseParams"); + json.put("responseParams",responseParams); + + log.info(String.valueOf(json)); + System.out.println("Completion..."); + } +} diff --git a/logback/src/main/java/com/duan/pojo/Result.java b/logback/src/main/java/com/duan/pojo/Result.java new file mode 100644 index 0000000000000000000000000000000000000000..b3852789db2a3e75ac88a6d35186a0660cf46c4f --- /dev/null +++ b/logback/src/main/java/com/duan/pojo/Result.java @@ -0,0 +1,34 @@ +package com.duan.pojo; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author db + * @version 1.0 + * @description Result + * @since 2023/12/19 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class Result { + + private Integer code; + private String msg; + private Object data; + + public static Result success(){ + return new Result(1,"success",null); + } + + public static Result success(Object data){ + return new Result(1,"success",data); + } + + public static Result error(){ + return new Result(0,"error",null); + } + +} diff --git a/logback/src/main/java/com/duan/pojo/User.java b/logback/src/main/java/com/duan/pojo/User.java new file mode 100644 index 0000000000000000000000000000000000000000..1895461f53a2e2cacba36ff0da269fb6f194dda3 --- /dev/null +++ b/logback/src/main/java/com/duan/pojo/User.java @@ -0,0 +1,19 @@ +package com.duan.pojo; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author db + * @version 1.0 + * @description User + * @since 2023/12/19 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class User { + private String username; + private String password; +} diff --git a/logback/src/main/java/com/duan/utils/IpUtils.java b/logback/src/main/java/com/duan/utils/IpUtils.java new file mode 100644 index 0000000000000000000000000000000000000000..42a7fd54c3702ea175bc376d7c4588ee7136937a --- /dev/null +++ b/logback/src/main/java/com/duan/utils/IpUtils.java @@ -0,0 +1,54 @@ +package com.duan.utils; + + + + + +import com.google.common.base.Strings; + +import javax.servlet.http.HttpServletRequest; + +public class IpUtils { + + private IpUtils(){ + + } + + public static String getIpAddr(HttpServletRequest request) { + String xIp = request.getHeader("X-Real-IP"); + String xFor = request.getHeader("X-Forwarded-For"); + + if (!Strings.isNullOrEmpty(xFor) && !"unKnown".equalsIgnoreCase(xFor)) { + //多次反向代理后会有多个ip值,第一个ip才是真实ip + int index = xFor.indexOf(","); + if (index != -1) { + return xFor.substring(0, index); + } else { + return xFor; + } + } + xFor = xIp; + if (!Strings.isNullOrEmpty(xFor) && !"unKnown".equalsIgnoreCase(xFor)) { + return xFor; + } + if (Strings.nullToEmpty(xFor).trim().isEmpty() || "unknown".equalsIgnoreCase(xFor)) { + xFor = request.getHeader("Proxy-Client-IP"); + } + if (Strings.nullToEmpty(xFor).trim().isEmpty() || "unknown".equalsIgnoreCase(xFor)) { + xFor = request.getHeader("WL-Proxy-Client-IP"); + } + if (Strings.nullToEmpty(xFor).trim().isEmpty() || "unknown".equalsIgnoreCase(xFor)) { + xFor = request.getHeader("HTTP_CLIENT_IP"); + } + if (Strings.nullToEmpty(xFor).trim().isEmpty() || "unknown".equalsIgnoreCase(xFor)) { + xFor = request.getHeader("HTTP_X_FORWARDED_FOR"); + } + if (Strings.nullToEmpty(xFor).trim().isEmpty() || "unknown".equalsIgnoreCase(xFor)) { + xFor = request.getRemoteAddr(); + } + + + return "0:0:0:0:0:0:0:1".equals(xFor) ? "127.0.0.1" : xFor; + } + +} diff --git a/logback/src/main/java/com/duan/utils/LocalIP.java b/logback/src/main/java/com/duan/utils/LocalIP.java new file mode 100644 index 0000000000000000000000000000000000000000..3d30cae792fac5531321659840167bf54e0144d5 --- /dev/null +++ b/logback/src/main/java/com/duan/utils/LocalIP.java @@ -0,0 +1,72 @@ +package com.duan.utils; + +import java.net.Inet4Address; +import java.net.InetAddress; +import java.net.NetworkInterface; +import java.util.Enumeration; + +public class LocalIP { + public static InetAddress getLocalHostExactAddress() { + try { + InetAddress candidateAddress = null; + + // 从网卡中获取IP + Enumeration networkInterfaces = NetworkInterface.getNetworkInterfaces(); + while (networkInterfaces.hasMoreElements()) { + NetworkInterface iface = networkInterfaces.nextElement(); + // 该网卡接口下的ip会有多个,也需要一个个的遍历,找到自己所需要的 + for (Enumeration inetAddrs = iface.getInetAddresses(); inetAddrs.hasMoreElements(); ) { + InetAddress inetAddr = inetAddrs.nextElement(); + // 排除loopback回环类型地址(不管是IPv4还是IPv6 只要是回环地址都会返回true) + if (!inetAddr.isLoopbackAddress()) { + if (inetAddr.isSiteLocalAddress()) { + // 如果是site-local地址,就是它了 就是我们要找的 + // ~~~~~~~~~~~~~绝大部分情况下都会在此处返回你的ip地址值~~~~~~~~~~~~~ + return inetAddr; + } + + // 若不是site-local地址 那就记录下该地址当作候选 + if (candidateAddress == null) { + candidateAddress = inetAddr; + } + + } + } + } + + // 如果出去loopback回环地之外无其它地址了,那就回退到原始方案吧 + return candidateAddress == null ? InetAddress.getLocalHost() : candidateAddress; + } catch (Exception e) { + e.printStackTrace(); + } + return null; + + } + + public static String getIpAddress() { + try { + //从网卡中获取IP + Enumeration allNetInterfaces = NetworkInterface.getNetworkInterfaces(); + InetAddress ip; + while (allNetInterfaces.hasMoreElements()) { + NetworkInterface netInterface = (NetworkInterface) allNetInterfaces.nextElement(); + //用于排除回送接口,非虚拟网卡,未在使用中的网络接口 + if (!netInterface.isLoopback() && !netInterface.isVirtual() && netInterface.isUp()) { + //返回和网络接口绑定的所有IP地址 + Enumeration addresses = netInterface.getInetAddresses(); + while (addresses.hasMoreElements()) { + ip = addresses.nextElement(); + if (ip instanceof Inet4Address) { + return ip.getHostAddress(); + } + } + } + } + } catch (Exception e) { + System.err.println("IP地址获取失败" + e.toString()); + } + return ""; + } + +} + diff --git a/logback/src/main/java/com/duan/utils/StreamUtil.java b/logback/src/main/java/com/duan/utils/StreamUtil.java new file mode 100644 index 0000000000000000000000000000000000000000..106375b14471c5d3f7824d7d59eb162df5fb6ea2 --- /dev/null +++ b/logback/src/main/java/com/duan/utils/StreamUtil.java @@ -0,0 +1,61 @@ +package com.duan.utils; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.List; + +/** + * @author db + * @version 1.0 + * @description StreamUtil + * @since 2024/1/3 + */ +public class StreamUtil { + public static byte[] readStream(InputStream stream, int length) throws IOException { + byte[]streamData=null; + List lengths = new ArrayList(); + List buffers = new ArrayList(); + int l = 0; int totalLength = 0; byte[] buffer = null; // + while (totalLength < length && l != -1) { // + buffer = new byte[length]; + l = stream.read(buffer); + if (l != -1) { + lengths.add(new Integer(l)); + buffers.add(buffer); + totalLength+=l; + } + } + if(totalLength==0) { + return null; + } + l=0; + streamData = new byte[totalLength]; + length =buffers.size(); + int blength=0; + byte[] bbuffer=null; + for (int i = 0; i < length; i++) { + blength = ((Integer) lengths.get(i)).intValue(); + bbuffer = (byte[]) buffers.get(i); + System.arraycopy(bbuffer, 0, streamData, l,blength); + l=l+blength; + } + stream=null; lengths=null; buffers=null; buffer=null; + return streamData; + } + + public static byte[] readBytes(BufferedReader bufferedReader, String charset) throws IOException{ + StringBuffer sb = new StringBuffer(); + String s; + while ((s = bufferedReader.readLine()) != null) { + sb.append(s); + } + if(sb.length() == 0){ + return "".getBytes(charset); + } + return sb.toString().getBytes(charset); + } + + +} diff --git a/logback/src/main/resources/application-dev.yml b/logback/src/main/resources/application-dev.yml new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/logback/src/main/resources/application-prod.yml b/logback/src/main/resources/application-prod.yml new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/logback/src/main/resources/application.yml b/logback/src/main/resources/application.yml new file mode 100644 index 0000000000000000000000000000000000000000..fa879608895ba4da8f219bb7617c19757ae4971d --- /dev/null +++ b/logback/src/main/resources/application.yml @@ -0,0 +1,9 @@ +server: + port: 8081 + servlet: + context-path: /logback # 应用名 localhost:8090/logback + +spring: + profiles: + active: prod + diff --git a/logback/src/main/resources/logback-spring.xml b/logback/src/main/resources/logback-spring.xml new file mode 100644 index 0000000000000000000000000000000000000000..3a634267d892dec571c971f62e3bed6248d6498d --- /dev/null +++ b/logback/src/main/resources/logback-spring.xml @@ -0,0 +1,115 @@ + + + + + + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + + UTF-8 + + + + + + + + + + + + + + + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n + + + + + + ${LOG_HOME}/info.log + + + ${LOG_HOME}/info.%d{yyyy-MM-dd}.%i.log + 30 + + 1GB + 10MB + + + UTF-8 + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n + + + + + + + INFO + ERROR + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +   +     +         +         0 +         +         256 +         +         + +     + + + + + + + + + + \ No newline at end of file diff --git a/logback/src/test/java/com/duan/LogTest.java b/logback/src/test/java/com/duan/LogTest.java new file mode 100644 index 0000000000000000000000000000000000000000..43f36e8b76edb6adb62798ec6f26bdbddfe2c82f --- /dev/null +++ b/logback/src/test/java/com/duan/LogTest.java @@ -0,0 +1,39 @@ +package com.duan; + +import org.junit.Test; + +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + * @author db + * @version 1.0 + * @description LogTest + * @since 2024/1/3 + */ + +public class LogTest { + + @Test + public void testLog(){ + Date date = new Date(); + System.out.println(date); + + DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); + String result = sdf.format(date); + System.out.println(result); + + Date parse = null; + try { + parse = sdf.parse(result); + } catch (ParseException e) { + e.printStackTrace(); + } + long time = parse.getTime(); + System.out.println(time); + + System.out.println(System.currentTimeMillis()); + } +} diff --git a/loginFilter/pom.xml b/loginFilter/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..b7ebb660f4e59e54e6415dd03cf1bfc8620dedbb --- /dev/null +++ b/loginFilter/pom.xml @@ -0,0 +1,58 @@ + + + 4.0.0 + + com.duan + loginFilter + 1.0-SNAPSHOT + + + + org.springframework.boot + spring-boot-starter-parent + 2.4.3 + + + + + org.springframework.boot + spring-boot-starter + 2.4.3 + + + + org.springframework.boot + spring-boot-starter-web + 2.4.3 + + + + io.jsonwebtoken + jjwt + 0.9.1 + + + + org.projectlombok + lombok + 1.18.2 + + + + junit + junit + 4.13.2 + test + + + + com.alibaba + fastjson + 1.2.50 + + + + + \ No newline at end of file diff --git a/loginFilter/src/main/java/com/duan/LoginFilterApplication.java b/loginFilter/src/main/java/com/duan/LoginFilterApplication.java new file mode 100644 index 0000000000000000000000000000000000000000..fbdde0f0047178aad9989a3a54c2ca41cc8f76e8 --- /dev/null +++ b/loginFilter/src/main/java/com/duan/LoginFilterApplication.java @@ -0,0 +1,19 @@ +package com.duan; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.ServletComponentScan; + +/** + * @author db + * @version 1.0 + * @description LoginFilterApplication + * @since 2024/1/11 + */ +@SpringBootApplication +@ServletComponentScan +public class LoginFilterApplication { + public static void main(String[] args) { + SpringApplication.run(LoginFilterApplication.class); + } +} diff --git a/loginFilter/src/main/java/com/duan/controller/LoginController.java b/loginFilter/src/main/java/com/duan/controller/LoginController.java new file mode 100644 index 0000000000000000000000000000000000000000..7f9319b560821e8acec01cfbef724c5142e105d9 --- /dev/null +++ b/loginFilter/src/main/java/com/duan/controller/LoginController.java @@ -0,0 +1,49 @@ +package com.duan.controller; + + +import com.duan.pojo.Result; +import com.duan.pojo.User; +import com.duan.utils.JWTUtils; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +import java.util.HashMap; +import java.util.UUID; + +/** + * @author db + * @version 1.0 + * @description LoginController + * @since 2023/12/19 + */ +@RestController +@Slf4j +public class LoginController { + + @PostMapping("/login") + public Result login(@RequestBody User user){ + log.info("这是正常日志"); + if(!"admin".equals(user.getUsername()) && !"123456".equals(user.getPassword())){ + return Result.error("登陆失败"); + }else{ + HashMap map = new HashMap<>(); + map.put("id", UUID.randomUUID().toString()); + + // 生成token + String token = JWTUtils.generateJwt(map); + return Result.success(token); + } + } + + @PostMapping("/getUser") + public Result getUserById(String userId){ + User user = new User(); + user.setUsername("cxykk"); + user.setPassword("123456"); + log.info("getUser方法"); + + return Result.success(user); + } +} diff --git a/loginFilter/src/main/java/com/duan/filter/LoginFilter.java b/loginFilter/src/main/java/com/duan/filter/LoginFilter.java new file mode 100644 index 0000000000000000000000000000000000000000..60d3b7e71e7c3f18cfe6f37e6780536657c5e7c6 --- /dev/null +++ b/loginFilter/src/main/java/com/duan/filter/LoginFilter.java @@ -0,0 +1,63 @@ +package com.duan.filter; + +import com.alibaba.fastjson.JSONObject; +import com.duan.pojo.Result; +import com.duan.utils.JWTUtils; + +import javax.servlet.*; +import javax.servlet.annotation.WebFilter; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * @author db + * @version 1.0 + * @description LoginFilter + * @since 2024/1/11 + */ +@WebFilter(urlPatterns = "/*") +public class LoginFilter implements Filter { + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { + + HttpServletRequest httpServletRequest = (HttpServletRequest) request; + HttpServletResponse httpServletResponse = (HttpServletResponse) response; + // 1. 获得请求路径 + String url = httpServletRequest.getRequestURL().toString(); + + // 2. 判断请求的资源路径 + if(url.contains("/login")){ + // 登录功能,放行 + chain.doFilter(request,response); + return; + } + + // 3. 获取请求头token + String token = httpServletRequest.getHeader("token"); + if(token == null){ + // 返回登录页面 + Result noLogin = Result.error("NO_LOGIN"); + // 使用原始方式给客户端响应数据 + // 把noLogin 对象转成json字符串返回 + String jsonString = JSONObject.toJSONString(noLogin); + httpServletResponse.getWriter().write(jsonString); + return; + } + // 4. 解析token + try{ + JWTUtils.parseJWT(token); + }catch (Exception e){ + // token存在问题 + // 返回登录页面 + Result noLogin = Result.error("NO_LOGIN"); + // 使用原始方式给客户端响应数据 + // 把noLogin 对象转成json字符串返回 + String jsonString = JSONObject.toJSONString(noLogin); + httpServletResponse.getWriter().write(jsonString); + return; + } + // 5. token解析成功,放行 + chain.doFilter(request,response); + } +} diff --git a/loginFilter/src/main/java/com/duan/pojo/Result.java b/loginFilter/src/main/java/com/duan/pojo/Result.java new file mode 100644 index 0000000000000000000000000000000000000000..39cc5f3a3a01449cd0185069f912bfa333a5962e --- /dev/null +++ b/loginFilter/src/main/java/com/duan/pojo/Result.java @@ -0,0 +1,37 @@ +package com.duan.pojo; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author db + * @version 1.0 + * @description Result + * @since 2023/12/19 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class Result { + + private Integer code; + private String msg; + private Object data; + + public static Result success(){ + return new Result(1,"success",null); + } + + public static Result success(Object data){ + return new Result(1,"success",data); + } + + public static Result error(){ + return new Result(0,"error",null); + } + public static Result error(Object data){ + return new Result(0,"error",data); + } + +} diff --git a/loginFilter/src/main/java/com/duan/pojo/User.java b/loginFilter/src/main/java/com/duan/pojo/User.java new file mode 100644 index 0000000000000000000000000000000000000000..1895461f53a2e2cacba36ff0da269fb6f194dda3 --- /dev/null +++ b/loginFilter/src/main/java/com/duan/pojo/User.java @@ -0,0 +1,19 @@ +package com.duan.pojo; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author db + * @version 1.0 + * @description User + * @since 2023/12/19 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class User { + private String username; + private String password; +} diff --git a/loginFilter/src/main/java/com/duan/utils/JWTUtils.java b/loginFilter/src/main/java/com/duan/utils/JWTUtils.java new file mode 100644 index 0000000000000000000000000000000000000000..e5b24d1a17861aace3bcdabfc58f89847af75876 --- /dev/null +++ b/loginFilter/src/main/java/com/duan/utils/JWTUtils.java @@ -0,0 +1,45 @@ +package com.duan.utils; + +import io.jsonwebtoken.Claims; +import io.jsonwebtoken.Jwts; +import io.jsonwebtoken.SignatureAlgorithm; + +import java.util.Date; +import java.util.Map; + +/** + * @author db + * @version 1.0 + * @description JWTUtils + * @since 2023/12/31 + */ +public class JWTUtils { + + // 密钥 + private static String signKey = "cxykk1217"; + // 过期时间 + private static Long expire = 1000L*60*30; // 30分钟 + + /** + * 生成JWT + * @param claims JWT第二部分负载payload中存储的内容 + * @return + */ + public static String generateJwt(Map claims){ + String jwt = Jwts.builder().signWith(SignatureAlgorithm.HS256, signKey) + .addClaims(claims) + .setExpiration(new Date(System.currentTimeMillis() + expire)) + .compact(); + + return jwt; + } + + public static Claims parseJWT(String jwt){ + Claims claims = Jwts.parser().setSigningKey(signKey) + .parseClaimsJws(jwt) + .getBody(); + return claims; + } + + +} diff --git a/loginFilter/src/main/resources/application-dev.yml b/loginFilter/src/main/resources/application-dev.yml new file mode 100644 index 0000000000000000000000000000000000000000..8b137891791fe96927ad78e64b0aad7bded08bdc --- /dev/null +++ b/loginFilter/src/main/resources/application-dev.yml @@ -0,0 +1 @@ + diff --git a/loginFilter/src/main/resources/application.yml b/loginFilter/src/main/resources/application.yml new file mode 100644 index 0000000000000000000000000000000000000000..f309b04f6ce2a882d4a8f616ccee82c2c57d97af --- /dev/null +++ b/loginFilter/src/main/resources/application.yml @@ -0,0 +1,8 @@ +server: + port: 8084 + servlet: + context-path: /filter + +spring: + profiles: + active: dev diff --git a/loginInterceptor/pom.xml b/loginInterceptor/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..ca61f47a1d66e0cd2023467bdb736a6e69822734 --- /dev/null +++ b/loginInterceptor/pom.xml @@ -0,0 +1,57 @@ + + + 4.0.0 + + com.duan + loginInterceptor + 1.0-SNAPSHOT + + + org.springframework.boot + spring-boot-starter-parent + 2.4.3 + + + + + org.springframework.boot + spring-boot-starter + 2.4.3 + + + + org.springframework.boot + spring-boot-starter-web + 2.4.3 + + + + io.jsonwebtoken + jjwt + 0.9.1 + + + + org.projectlombok + lombok + 1.18.2 + + + + junit + junit + 4.13.2 + test + + + + com.alibaba + fastjson + 1.2.50 + + + + + \ No newline at end of file diff --git a/loginInterceptor/src/main/java/com/duan/LoginInterceptorApplication.java b/loginInterceptor/src/main/java/com/duan/LoginInterceptorApplication.java new file mode 100644 index 0000000000000000000000000000000000000000..bf91068f4f553342d869a47253027d3e7816bf2a --- /dev/null +++ b/loginInterceptor/src/main/java/com/duan/LoginInterceptorApplication.java @@ -0,0 +1,17 @@ +package com.duan; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +/** + * @author db + * @version 1.0 + * @description LoginInterceptorApplication + * @since 2024/1/14 + */ +@SpringBootApplication +public class LoginInterceptorApplication { + public static void main(String[] args) { + SpringApplication.run(LoginInterceptorApplication.class); + } +} diff --git a/loginInterceptor/src/main/java/com/duan/config/LoginInterceptorConfig.java b/loginInterceptor/src/main/java/com/duan/config/LoginInterceptorConfig.java new file mode 100644 index 0000000000000000000000000000000000000000..6b454cacbce84100b4debff8ee64c084bfbe889b --- /dev/null +++ b/loginInterceptor/src/main/java/com/duan/config/LoginInterceptorConfig.java @@ -0,0 +1,26 @@ +package com.duan.config; + +import com.duan.handler.LoginInterceptor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +/** + * @author db + * @version 1.0 + * @description LoginInterceptorConfig 注册拦截器 + * @since 2023/12/20 + */ +@Configuration +public class LoginInterceptorConfig implements WebMvcConfigurer { + + @Autowired + private LoginInterceptor loginInterceptor; + + @Override + public void addInterceptors(InterceptorRegistry registry){ + registry.addInterceptor(loginInterceptor).addPathPatterns("/**"); + + } +} diff --git a/loginInterceptor/src/main/java/com/duan/controller/LoginController.java b/loginInterceptor/src/main/java/com/duan/controller/LoginController.java new file mode 100644 index 0000000000000000000000000000000000000000..7f9319b560821e8acec01cfbef724c5142e105d9 --- /dev/null +++ b/loginInterceptor/src/main/java/com/duan/controller/LoginController.java @@ -0,0 +1,49 @@ +package com.duan.controller; + + +import com.duan.pojo.Result; +import com.duan.pojo.User; +import com.duan.utils.JWTUtils; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +import java.util.HashMap; +import java.util.UUID; + +/** + * @author db + * @version 1.0 + * @description LoginController + * @since 2023/12/19 + */ +@RestController +@Slf4j +public class LoginController { + + @PostMapping("/login") + public Result login(@RequestBody User user){ + log.info("这是正常日志"); + if(!"admin".equals(user.getUsername()) && !"123456".equals(user.getPassword())){ + return Result.error("登陆失败"); + }else{ + HashMap map = new HashMap<>(); + map.put("id", UUID.randomUUID().toString()); + + // 生成token + String token = JWTUtils.generateJwt(map); + return Result.success(token); + } + } + + @PostMapping("/getUser") + public Result getUserById(String userId){ + User user = new User(); + user.setUsername("cxykk"); + user.setPassword("123456"); + log.info("getUser方法"); + + return Result.success(user); + } +} diff --git a/loginInterceptor/src/main/java/com/duan/handler/LoginInterceptor.java b/loginInterceptor/src/main/java/com/duan/handler/LoginInterceptor.java new file mode 100644 index 0000000000000000000000000000000000000000..d74f00a60c018faac6bc585ab19a019f50bf3b3d --- /dev/null +++ b/loginInterceptor/src/main/java/com/duan/handler/LoginInterceptor.java @@ -0,0 +1,76 @@ +package com.duan.handler; + +import com.alibaba.fastjson.JSONObject; +import com.duan.pojo.Result; +import com.duan.utils.JWTUtils; +import org.springframework.stereotype.Component; +import org.springframework.web.servlet.HandlerInterceptor; +import org.springframework.web.servlet.ModelAndView; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * @author db + * @version 1.0 + * @description LoginInterceptor + * @since 2023/12/20 + */ +@Component +public class LoginInterceptor implements HandlerInterceptor { + + // 目标方法执行前调用 true:放行 + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws IOException { + + // 1. 获得请求路径 + String url = request.getRequestURL().toString(); + + // 2. 判断请求的资源路径 + if(url.contains("/login")){ + // 登录功能,放行 + return true; + } + + // 3. 获取请求头token + String token = request.getHeader("token"); + if(token == null){ + // 返回登录页面 + Result noLogin = Result.error("NO_LOGIN"); + // 使用原始方式给客户端响应数据 + // 把noLogin 对象转成json字符串返回 + String jsonString = JSONObject.toJSONString(noLogin); + response.getWriter().write(jsonString); + return false; + } + // 4. 解析token + try{ + JWTUtils.parseJWT(token); + }catch (Exception e){ + // token存在问题 + // 返回登录页面 + Result noLogin = Result.error("NO_LOGIN"); + // 使用原始方式给客户端响应数据 + // 把noLogin 对象转成json字符串返回 + String jsonString = JSONObject.toJSONString(noLogin); + response.getWriter().write(jsonString); + return false; + } + // 5. token解析成功,放行 + return true; + } + + // 目标方法执行后调用 + @Override + public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { + System.out.println("postHandle..."); + } + + + // 请求处理后调用 + @Override + public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { + System.out.println("Completion..."); + } +} diff --git a/loginInterceptor/src/main/java/com/duan/pojo/Result.java b/loginInterceptor/src/main/java/com/duan/pojo/Result.java new file mode 100644 index 0000000000000000000000000000000000000000..39cc5f3a3a01449cd0185069f912bfa333a5962e --- /dev/null +++ b/loginInterceptor/src/main/java/com/duan/pojo/Result.java @@ -0,0 +1,37 @@ +package com.duan.pojo; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author db + * @version 1.0 + * @description Result + * @since 2023/12/19 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class Result { + + private Integer code; + private String msg; + private Object data; + + public static Result success(){ + return new Result(1,"success",null); + } + + public static Result success(Object data){ + return new Result(1,"success",data); + } + + public static Result error(){ + return new Result(0,"error",null); + } + public static Result error(Object data){ + return new Result(0,"error",data); + } + +} diff --git a/loginInterceptor/src/main/java/com/duan/pojo/User.java b/loginInterceptor/src/main/java/com/duan/pojo/User.java new file mode 100644 index 0000000000000000000000000000000000000000..1895461f53a2e2cacba36ff0da269fb6f194dda3 --- /dev/null +++ b/loginInterceptor/src/main/java/com/duan/pojo/User.java @@ -0,0 +1,19 @@ +package com.duan.pojo; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author db + * @version 1.0 + * @description User + * @since 2023/12/19 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class User { + private String username; + private String password; +} diff --git a/loginInterceptor/src/main/java/com/duan/utils/JWTUtils.java b/loginInterceptor/src/main/java/com/duan/utils/JWTUtils.java new file mode 100644 index 0000000000000000000000000000000000000000..e5b24d1a17861aace3bcdabfc58f89847af75876 --- /dev/null +++ b/loginInterceptor/src/main/java/com/duan/utils/JWTUtils.java @@ -0,0 +1,45 @@ +package com.duan.utils; + +import io.jsonwebtoken.Claims; +import io.jsonwebtoken.Jwts; +import io.jsonwebtoken.SignatureAlgorithm; + +import java.util.Date; +import java.util.Map; + +/** + * @author db + * @version 1.0 + * @description JWTUtils + * @since 2023/12/31 + */ +public class JWTUtils { + + // 密钥 + private static String signKey = "cxykk1217"; + // 过期时间 + private static Long expire = 1000L*60*30; // 30分钟 + + /** + * 生成JWT + * @param claims JWT第二部分负载payload中存储的内容 + * @return + */ + public static String generateJwt(Map claims){ + String jwt = Jwts.builder().signWith(SignatureAlgorithm.HS256, signKey) + .addClaims(claims) + .setExpiration(new Date(System.currentTimeMillis() + expire)) + .compact(); + + return jwt; + } + + public static Claims parseJWT(String jwt){ + Claims claims = Jwts.parser().setSigningKey(signKey) + .parseClaimsJws(jwt) + .getBody(); + return claims; + } + + +} diff --git a/loginInterceptor/src/main/resources/application-dev.yml b/loginInterceptor/src/main/resources/application-dev.yml new file mode 100644 index 0000000000000000000000000000000000000000..8b137891791fe96927ad78e64b0aad7bded08bdc --- /dev/null +++ b/loginInterceptor/src/main/resources/application-dev.yml @@ -0,0 +1 @@ + diff --git a/loginInterceptor/src/main/resources/application.yml b/loginInterceptor/src/main/resources/application.yml new file mode 100644 index 0000000000000000000000000000000000000000..11e514b74568b33b5e33201413fb643bb057867b --- /dev/null +++ b/loginInterceptor/src/main/resources/application.yml @@ -0,0 +1,8 @@ +server: + port: 8085 + servlet: + context-path: /interceptor + +spring: + profiles: + active: dev diff --git a/mq-demo/consumer/pom.xml b/mq-demo/consumer/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..07b62fe9cd56db272152c28aa2acd8d42664955a --- /dev/null +++ b/mq-demo/consumer/pom.xml @@ -0,0 +1,19 @@ + + + + mq-demo + cn.itcast.demo + 1.0-SNAPSHOT + + 4.0.0 + + consumer + + + 8 + 8 + + + \ No newline at end of file diff --git a/mq-demo/consumer/src/main/java/com/itheima/consumer/ConsumerApplication.java b/mq-demo/consumer/src/main/java/com/itheima/consumer/ConsumerApplication.java new file mode 100644 index 0000000000000000000000000000000000000000..9db371c32d0ff28bfc46832da7f6716bf75b162c --- /dev/null +++ b/mq-demo/consumer/src/main/java/com/itheima/consumer/ConsumerApplication.java @@ -0,0 +1,11 @@ +package com.itheima.consumer; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class ConsumerApplication { + public static void main(String[] args) { + SpringApplication.run(ConsumerApplication.class, args); + } +} diff --git a/mq-demo/consumer/src/main/java/com/itheima/consumer/config/MessageConfig.java b/mq-demo/consumer/src/main/java/com/itheima/consumer/config/MessageConfig.java new file mode 100644 index 0000000000000000000000000000000000000000..b924e5c75bf8bededceaa129e952707958b1293b --- /dev/null +++ b/mq-demo/consumer/src/main/java/com/itheima/consumer/config/MessageConfig.java @@ -0,0 +1,38 @@ +package com.itheima.consumer.config; + +import org.springframework.amqp.core.Queue; +import org.springframework.amqp.core.QueueBuilder; +import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter; +import org.springframework.amqp.support.converter.MessageConverter; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Lazy; + + +/** + * @author db + * @version 1.0 + * @description MessageConfig + * @since 2023/12/5 + */ +@Configuration +public class MessageConfig { + + @Bean + public Queue objectQueue(){ + return new Queue("object.queue"); + } + +// @Bean +// public Queue lazyQueue(){ +// return QueueBuilder +// .durable("lazy.queue") +// .lazy() // 开启Lazy模式 +// .build(); +// } + + @Bean + public MessageConverter messageConverter(){ + return new Jackson2JsonMessageConverter(); + } +} diff --git a/mq-demo/consumer/src/main/java/com/itheima/consumer/listener/SpringRabbitListener.java b/mq-demo/consumer/src/main/java/com/itheima/consumer/listener/SpringRabbitListener.java new file mode 100644 index 0000000000000000000000000000000000000000..aedb36a9b5633e3a82cff14eacd002823050347a --- /dev/null +++ b/mq-demo/consumer/src/main/java/com/itheima/consumer/listener/SpringRabbitListener.java @@ -0,0 +1,105 @@ +package com.itheima.consumer.listener; + +import org.springframework.amqp.rabbit.annotation.*; +import org.springframework.amqp.support.converter.MessageConversionException; +import org.springframework.stereotype.Component; + +import java.util.Map; + +/** + * @author db + * @version 1.0 + * @description SpringRabbitListener + * @since 2023/11/29 + */ + +@Component +public class SpringRabbitListener { +// 利用RabbitListener来声明要监听的队列信息 +// 将来一旦监听的队列中有了消息,就会推送给当前服务,调用当前方法,处理消息。 +// 可以看到方法体中接收的就是消息体的内容 +// @RabbitListener(queuesToDeclare = @Queue(value = "simple.queue")) +// public void listenSimpleQueueMessage(String msg) throws InterruptedException { +// System.out.println("spring 消费者接收到消息:【" + msg + "】"); +// throw new MessageConversionException("故意的"); +// } +// +// +// @RabbitListener(queuesToDeclare = @Queue(value = "work.queue")) +// public void listenWorkQueueMessage1(String msg) throws InterruptedException { +// System.out.println("消费者1接收到消息:【" + msg + "】"); +// Thread.sleep(200); +// } +// +// @RabbitListener(queuesToDeclare = @Queue(value = "work.queue")) +// public void listenWorkQueueMessage2(String msg) throws InterruptedException { +// System.out.println("消费者2接收到消息.............:【" + msg + "】"); +// Thread.sleep(20); +// } + +// @RabbitListener(bindings = @QueueBinding(value = @Queue, // 创建临时队列 +// exchange = @Exchange(name="logs",type="fanout") // 绑定交换机 +// )) +// public void listenFanoutQueueMessage1(String msg) throws InterruptedException { +// System.out.println("消费者1接收到消息:【" + msg + "】"); +// } +// +// @RabbitListener(bindings = @QueueBinding(value = @Queue, // 创建临时队列 +// exchange = @Exchange(name="logs",type="fanout") // 绑定交换机 +// )) +// public void listenFanoutQueueMessage2(String msg) throws InterruptedException { +// System.out.println("消费者2接收到消息。。。。:【" + msg + "】"); +// } + + + + @RabbitListener(bindings = @QueueBinding(value = @Queue, // 创建临时队列 + key = {"info","error"}, //路由key + exchange = @Exchange(name="logs",type="direct") // 绑定交换机 + )) + public void listenDirectQueueMessage1(String msg) throws InterruptedException { + System.out.println("消费者1接收到消息:【" + msg + "】"); + } + + @RabbitListener(bindings = @QueueBinding(value = @Queue, // 创建临时队列 + key = {"error"}, //路由key + exchange = @Exchange(name="logs",type="direct") // 绑定交换机 + )) + public void listenDirectQueueMessage2(String msg) throws InterruptedException { + System.out.println("消费者2接收到消息。。。。:【" + msg + "】"); + } + + + @RabbitListener(bindings = @QueueBinding(value = @Queue, // 创建临时队列 + key = {"user.*"}, //路由key + exchange = @Exchange(name="topics",type="topic") // 绑定交换机 + )) + public void listenTopicQueueMessage1(String msg) throws InterruptedException { + System.out.println("消费者1接收到消息:【" + msg + "】"); + } + + @RabbitListener(bindings = @QueueBinding(value = @Queue, // 创建临时队列 + key = {"user.#"}, //路由key + exchange = @Exchange(name="topics",type="topic") // 绑定交换机 + )) + public void listenTopicQueueMessage2(String msg) throws InterruptedException { + System.out.println("消费者2接收到消息:【" + msg + "】"); + } + + + @RabbitListener(queues = "object.queue") + public void listenObjectMessage(Map msg) throws InterruptedException { + System.out.println("消费者接收到消息:【" + msg + "】"); + throw new RuntimeException("故意的"); + } + +// @RabbitListener(bindings = @QueueBinding(value = @Queue, // 创建临时队列 +// key = {"user.#"}, //路由key +// exchange = @Exchange(name="topics",type="topic"), // 绑定交换机 +// arguments = @Argument(name="x-queue-mod",value = "lazy") +// )) +// public void listenLazyQueueMessage(String msg) throws InterruptedException { +// System.out.println("消费者2接收到消息:【" + msg + "】"); +// } + +} diff --git a/mq-demo/consumer/src/main/resources/application.yml b/mq-demo/consumer/src/main/resources/application.yml new file mode 100644 index 0000000000000000000000000000000000000000..b3781da63c11d8321d54c716512b48c1f4580cd6 --- /dev/null +++ b/mq-demo/consumer/src/main/resources/application.yml @@ -0,0 +1,24 @@ +logging: + pattern: + dateformat: MM-dd HH:mm:ss:SSS + +spring: + rabbitmq: + host: 192.168.137.120 + port: 5672 + username: admin + password: 123456 + virtual-host: / + connection-timeout: 600000 + listener: + simple: + acknowledge-mode: auto # 不做处理 + retry: + enabled: true # 开启消费者失败重试 + initial-interval: 1000ms # 初识的失败等待时长为1秒 + multiplier: 1 # 失败的等待时长倍数,下次等待时长 = multiplier * last-interval + max-attempts: 3 # 最大重试次数 + stateless: true # true无状态;false有状态。如果业务中包含事务,这里改为false +# listener: +# simple: +# prefetch: 1 # 每次只能获取一条消息,处理完成才能获取下一个消息 diff --git a/mq-demo/pom.xml b/mq-demo/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..94bb0e871889855b2424d0169883326a2bf3a3e5 --- /dev/null +++ b/mq-demo/pom.xml @@ -0,0 +1,55 @@ + + + 4.0.0 + + cn.itcast.demo + mq-demo + 1.0-SNAPSHOT + + publisher + consumer + + pom + + + org.springframework.boot + spring-boot-starter-parent + 2.7.12 + + + + + 8 + 8 + + + + + org.projectlombok + lombok + + + + org.springframework.boot + spring-boot-starter-amqp + + + + org.springframework.boot + spring-boot-starter-test + + + + com.fasterxml.jackson.core + jackson-databind + 2.10.3 + + + + org.springframework.boot + spring-boot-starter-logging + + + \ No newline at end of file diff --git a/mq-demo/publisher/pom.xml b/mq-demo/publisher/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..985532aed36ae2ac02821418fb4d5bdb69e36428 --- /dev/null +++ b/mq-demo/publisher/pom.xml @@ -0,0 +1,19 @@ + + + + mq-demo + cn.itcast.demo + 1.0-SNAPSHOT + + 4.0.0 + + publisher + + + 8 + 8 + + + \ No newline at end of file diff --git a/mq-demo/publisher/src/main/java/com/itheima/publisher/PublisherApplication.java b/mq-demo/publisher/src/main/java/com/itheima/publisher/PublisherApplication.java new file mode 100644 index 0000000000000000000000000000000000000000..64810678f9c6d2c8c4f10ceed26a7df1bd816e89 --- /dev/null +++ b/mq-demo/publisher/src/main/java/com/itheima/publisher/PublisherApplication.java @@ -0,0 +1,11 @@ +package com.itheima.publisher; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class PublisherApplication { + public static void main(String[] args) { + SpringApplication.run(PublisherApplication.class); + } +} diff --git a/mq-demo/publisher/src/main/java/com/itheima/publisher/config/MqConfig.java b/mq-demo/publisher/src/main/java/com/itheima/publisher/config/MqConfig.java new file mode 100644 index 0000000000000000000000000000000000000000..01dde58b5c4db1c79a8036984eb2c9e73bd0c851 --- /dev/null +++ b/mq-demo/publisher/src/main/java/com/itheima/publisher/config/MqConfig.java @@ -0,0 +1,32 @@ +package com.itheima.publisher.config; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.amqp.core.ReturnedMessage; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.beans.BeansException; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.context.annotation.Configuration; + +/** + * @author db + * @version 1.0 + * @description MqConfig + * @since 2023/12/7 + */ +@Configuration +@Slf4j +public class MqConfig implements ApplicationContextAware { + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + RabbitTemplate rabbitTemplate = applicationContext.getBean(RabbitTemplate.class); + rabbitTemplate.setReturnsCallback(returnedMessage -> { + log.info("触发return callback,"); + log.debug("exchange: {}", returnedMessage.getExchange()); + log.debug("routingKey: {}", returnedMessage.getRoutingKey()); + log.debug("message: {}", returnedMessage.getMessage()); + log.debug("replyCode: {}", returnedMessage.getReplyCode()); + log.debug("replyText: {}", returnedMessage.getReplyText()); + }); + } +} diff --git a/mq-demo/publisher/src/main/java/com/itheima/publisher/config/RabbitmqMessageConfig.java b/mq-demo/publisher/src/main/java/com/itheima/publisher/config/RabbitmqMessageConfig.java new file mode 100644 index 0000000000000000000000000000000000000000..fb2a0c9a09aec44a1e2d2e0f3c9538907c18a6e6 --- /dev/null +++ b/mq-demo/publisher/src/main/java/com/itheima/publisher/config/RabbitmqMessageConfig.java @@ -0,0 +1,31 @@ +package com.itheima.publisher.config; + +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.amqp.core.ReturnedMessage; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter; +import org.springframework.amqp.support.converter.MessageConverter; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import javax.annotation.PostConstruct; + +/** + * @author db + * @version 1.0 + * @description RabbitmqMessageConfig + * @since 2023/12/5 + */ + +@Configuration +public class RabbitmqMessageConfig { + + + @Bean + public MessageConverter messageConverter(){ + return new Jackson2JsonMessageConverter(); + } + + +} diff --git a/mq-demo/publisher/src/main/resources/application.yml b/mq-demo/publisher/src/main/resources/application.yml new file mode 100644 index 0000000000000000000000000000000000000000..e64fcc88fe7028d8292bdd27d9bd37e318ed9f4c --- /dev/null +++ b/mq-demo/publisher/src/main/resources/application.yml @@ -0,0 +1,23 @@ +logging: + pattern: + dateformat: MM-dd HH:mm:ss:SSS + level: + com.itheima: debug +spring: + rabbitmq: + host: 192.168.137.120 + port: 5672 + virtual-host: / + username: admin + password: 123456 + connection-timeout: 1s # 设置MQ的连接超时时间 + template: +# retry: +# enabled: true # 开启超时重试机制 +# initial-interval: 1000ms # 失败后的初始等待时间 +# multiplier: 1 # 失败后下次等待时长倍数 +# max-attempts: 3 # 最大重试次数 + mandatory: true + publisher-confirm-type: correlated # 开启publisher confirm 机制,并设置confirm 类型 + publisher-returns: true # 开启publisher return 机制 + diff --git a/mq-demo/publisher/src/test/java/com/itheima/publisher/SpringAmqpTest.java b/mq-demo/publisher/src/test/java/com/itheima/publisher/SpringAmqpTest.java new file mode 100644 index 0000000000000000000000000000000000000000..38a87b012f8d4d1d2fc6de1e26e53a363622ee9b --- /dev/null +++ b/mq-demo/publisher/src/test/java/com/itheima/publisher/SpringAmqpTest.java @@ -0,0 +1,119 @@ +package com.itheima.publisher; + +import lombok.extern.slf4j.Slf4j; +import org.junit.jupiter.api.Test; +import org.springframework.amqp.rabbit.connection.CorrelationData; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.util.concurrent.ListenableFutureCallback; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author db + * @version 1.0 + * @description SpringAmqpTest + * @since 2023/11/29 + */ +@SpringBootTest +@Slf4j +public class SpringAmqpTest { + + @Autowired + private RabbitTemplate rabbitTemplate; + + @Test + public void testSimpleQueue() { + // 队列名称 + String queueName = "simple.queue"; + // 消息 + String message = "hello, spring amqp!"; + // 发送消息 + rabbitTemplate.convertAndSend(queueName, message); + } + + @Test + public void testWorkQueue() throws InterruptedException { + for(int i= 0;i<20;i++){ + // 队列名称 + String queueName = "work.queue"; + // 消息 + String message = "hello, work.queue!"; + // 发送消息 + rabbitTemplate.convertAndSend(queueName, message + i); + Thread.sleep(20); + } + + } + + @Test + public void testFanoutQueue() { + // 队列名称 + String exchangeName = "logs"; + // 消息 + String message = "hello, fanout!"; + // 发送消息 参数1:交换机名称 参数2:路由key 参数3:消息 + rabbitTemplate.convertAndSend(exchangeName, "",message); + + } + + @Test + public void testDirectQueue() { + // 队列名称 + String exchangeName = "logs"; + // 消息 + String message = "hello, direct!"; + // 发送消息 参数1:交换机名称 参数2:路由key 参数3:消息 + rabbitTemplate.convertAndSend(exchangeName, "info",message); + + } + + @Test + public void testTopicQueue() { + // 队列名称 + String exchangeName = "topics"; + // 发送消息 参数1:交换机名称 参数2:路由key 参数3:消息 + rabbitTemplate.convertAndSend(exchangeName, "user.save.findAll","user.save.findAll的消息"); + + } + + @Test + public void testObjectQueue() { + Map map = new HashMap<>(); + map.put("name","rabbitMq"); + map.put("version","3.8.30"); + rabbitTemplate.convertAndSend("object.queue",map); + + } + + @Test + public void testPublisherConfirm() throws InterruptedException { + // 创建CorrelationData + CorrelationData correlationData = new CorrelationData(); + // 给future添加confirmCallback + correlationData.getFuture().addCallback(new ListenableFutureCallback() { + @Override + public void onFailure(Throwable ex) { + // 2.1.Future发生异常时的处理逻辑,基本不会触发 + log.error("send message fail", ex); + } + + @Override + public void onSuccess(CorrelationData.Confirm result) { + // 2.2.Future接收到回执的处理逻辑,参数中的result就是回执内容 + if(result.isAck()){ // result.isAck(),boolean类型,true代表ack回执,false 代表 nack回执 + log.debug("发送消息成功,收到 ack!"); + }else{ // result.getReason(),String类型,返回nack时的异常描述 + log.error("发送消息失败,收到 nack, reason : {}", result.getReason()); + } + } + }); + + // 发送消息 + rabbitTemplate.convertAndSend("logs123","info","hello",correlationData); + + Thread.sleep(2000); + } +} diff --git a/paramValidated/pom.xml b/paramValidated/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..d86d9454111b4c8f0f7c785964309dd7966c37a4 --- /dev/null +++ b/paramValidated/pom.xml @@ -0,0 +1,97 @@ + + + 4.0.0 + + com.duan + paramValidated + 1.0-SNAPSHOT + + + org.springframework.boot + spring-boot-starter-parent + 2.4.3 + + + + + org.springframework.boot + spring-boot-starter + 2.4.3 + + + + org.springframework.boot + spring-boot-starter-web + 2.4.3 + + + + org.springframework.boot + spring-boot-starter-test + 2.4.3 + + + + org.projectlombok + lombok + 1.18.2 + + + + junit + junit + 4.13.2 + test + + + + com.alibaba + fastjson + 1.2.50 + + + + io.swagger + swagger-annotations + 1.5.21 + + + + io.swagger + swagger-models + 1.5.21 + + + + + + + + + + + + + + + com.baomidou + mybatis-plus-boot-starter + 3.4.3 + + + + + mysql + mysql-connector-java + 8.0.23 + + + + + org.springframework.boot + spring-boot-starter-validation + + + \ No newline at end of file diff --git a/paramValidated/src/main/java/com/duan/ParamValidatedApplication.java b/paramValidated/src/main/java/com/duan/ParamValidatedApplication.java new file mode 100644 index 0000000000000000000000000000000000000000..a2d4063b8f4cebd578048ab9fb6990ab3fb58dac --- /dev/null +++ b/paramValidated/src/main/java/com/duan/ParamValidatedApplication.java @@ -0,0 +1,17 @@ +package com.duan; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +/** + * @author db + * @version 1.0 + * @description ParamValidatedApplication + * @since 2024/5/28 + */ +@SpringBootApplication +public class ParamValidatedApplication { + public static void main(String[] args) { + SpringApplication.run(ParamValidatedApplication.class); + } +} diff --git a/paramValidated/src/main/java/com/duan/anno/PasswordValid.java b/paramValidated/src/main/java/com/duan/anno/PasswordValid.java new file mode 100644 index 0000000000000000000000000000000000000000..a0c815cbdc852ea08d39c57eeb44b99e1d8aa43e --- /dev/null +++ b/paramValidated/src/main/java/com/duan/anno/PasswordValid.java @@ -0,0 +1,25 @@ +package com.duan.anno; + +import com.duan.config.PasswordValidValidator; + +import javax.validation.Constraint; +import javax.validation.Payload; + +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +import static java.lang.annotation.ElementType.*; +import static java.lang.annotation.ElementType.TYPE_USE; +import static java.lang.annotation.RetentionPolicy.RUNTIME; + + +@Constraint(validatedBy = { PasswordValidValidator.class}) +@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE }) +@Retention(RUNTIME) +public @interface PasswordValid { + String message() default "{密码格式不对}"; + + Class[] groups() default { }; + + Class[] payload() default { }; +} diff --git a/paramValidated/src/main/java/com/duan/config/MybatisPlusConfig.java b/paramValidated/src/main/java/com/duan/config/MybatisPlusConfig.java new file mode 100644 index 0000000000000000000000000000000000000000..6a5d11c73a3ed514119a8c71e84068a5fafa235c --- /dev/null +++ b/paramValidated/src/main/java/com/duan/config/MybatisPlusConfig.java @@ -0,0 +1,27 @@ +package com.duan.config; + +import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * @author db + * @version 1.0 + * @description MybatisPlusConfig + * @since 2023/7/24 + */ +@Configuration +public class MybatisPlusConfig { + + /** + * 3.4.0之后版本 + * @return + */ + @Bean + public MybatisPlusInterceptor mybatisPlusInterceptor(){ + MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor(); + mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor()); + return mybatisPlusInterceptor; + } +} diff --git a/paramValidated/src/main/java/com/duan/config/PasswordValidValidator.java b/paramValidated/src/main/java/com/duan/config/PasswordValidValidator.java new file mode 100644 index 0000000000000000000000000000000000000000..553733f30236fef5bdb6ffd18680547faa62262e --- /dev/null +++ b/paramValidated/src/main/java/com/duan/config/PasswordValidValidator.java @@ -0,0 +1,32 @@ +package com.duan.config; + +import com.duan.anno.PasswordValid; + +import javax.validation.ConstraintValidator; +import javax.validation.ConstraintValidatorContext; + +/** + * @author db + * @version 1.0 + * @description PasswordValidValidator + * @since 2024/6/25 + */ +public class PasswordValidValidator implements ConstraintValidator { + @Override + public void initialize(PasswordValid constraintAnnotation) { + + } + + @Override + public boolean isValid(String value, ConstraintValidatorContext context) { + if (value == null) { + return false; + } + + boolean hasUppercase = value.chars().anyMatch(Character::isUpperCase); + boolean hasLowercase = value.chars().anyMatch(Character::isLowerCase); + boolean hasDigit = value.chars().anyMatch(Character::isDigit); + + return value.length() >= 8 && hasUppercase && hasLowercase && hasDigit; + } +} diff --git a/paramValidated/src/main/java/com/duan/controller/UserController.java b/paramValidated/src/main/java/com/duan/controller/UserController.java new file mode 100644 index 0000000000000000000000000000000000000000..18099028f3a77bdf2a20f5faaec1eadcb6631760 --- /dev/null +++ b/paramValidated/src/main/java/com/duan/controller/UserController.java @@ -0,0 +1,42 @@ +package com.duan.controller; + +import com.duan.pojo.ResponseResult; +import com.duan.pojo.Result; +import com.duan.pojo.SysUser; +import com.duan.pojo.vo.SysUserVO; +import com.duan.service.UserService; +import com.duan.validatedGroup.CreateUserGroup; +import com.duan.validatedGroup.UpdateUserGroup; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +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; + +/** + * @author db + * @version 1.0 + * @description UserController + * @since 2024/4/15 + */ +@RestController +@RequestMapping("/user") + +public class UserController { + + @Autowired + private UserService userService; + + @PostMapping("/addUser") + public ResponseResult addUser(@RequestBody @Validated(value = CreateUserGroup.class) SysUserVO sysUserVO){ + userService.addUser(sysUserVO); + return ResponseResult.okResult(); + } + + @PostMapping("/updateUser") + public ResponseResult updateUser(@RequestBody @Validated(value = UpdateUserGroup.class) SysUserVO sysUserVO){ + userService.updateUser(sysUserVO); + return ResponseResult.okResult(); + } +} diff --git a/paramValidated/src/main/java/com/duan/execption/GlobalExceptionHandler.java b/paramValidated/src/main/java/com/duan/execption/GlobalExceptionHandler.java new file mode 100644 index 0000000000000000000000000000000000000000..ae57b8e576cf777a34f59c6ce6270f833acbd41b --- /dev/null +++ b/paramValidated/src/main/java/com/duan/execption/GlobalExceptionHandler.java @@ -0,0 +1,62 @@ +package com.duan.execption; + + +import com.duan.pojo.AppHttpCodeEnum; +import com.duan.pojo.ResponseResult; +import lombok.extern.slf4j.Slf4j; +import org.springframework.validation.ObjectError; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * @author db + * @version 1.0 + * @description GlobalExceptionHandler + * @since 2023/7/23 + */ +@RestControllerAdvice +@Slf4j +public class GlobalExceptionHandler { + + // 全局异常 + @ExceptionHandler(Exception.class) + public ResponseResult exceptionHandler(Exception e){ + //打印异常信息 + log.error("出现了异常! {}",e); + //从异常对象中获取提示信息封装返回 + return ResponseResult.errorResult(AppHttpCodeEnum.SYSTEM_ERROR.getCode(),e.getMessage()); + } + + // 自定义异常 + @ExceptionHandler(LxAdminException.class) + public ResponseResult LxAdminExceptionHandler(LxAdminException e){ + //打印异常信息 + log.error("出现了异常! {}",e); + //从异常对象中获取提示信息封装返回 + return ResponseResult.errorResult(e.getCode(),e.getMsg()); + } + + + /** + * 参数非法校验 + * @param ex + * @return + */ + @ExceptionHandler(MethodArgumentNotValidException.class) + public ResponseResult handleMethodArgumentNotValidException(MethodArgumentNotValidException ex) { + try { + List errors = ex.getBindingResult().getAllErrors(); + String message = errors.stream().map(ObjectError::getDefaultMessage).collect(Collectors.joining(",")); + log.error("param illegal: {}", message); + return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID, message); + } catch (Exception e) { + return ResponseResult.errorResult(AppHttpCodeEnum.ERROR); + } + } + + +} diff --git a/paramValidated/src/main/java/com/duan/execption/LxAdminException.java b/paramValidated/src/main/java/com/duan/execption/LxAdminException.java new file mode 100644 index 0000000000000000000000000000000000000000..75480e8ea7a7ded5fd5713a5fb1f75d54721eb1e --- /dev/null +++ b/paramValidated/src/main/java/com/duan/execption/LxAdminException.java @@ -0,0 +1,27 @@ +package com.duan.execption; + + +import com.duan.pojo.AppHttpCodeEnum; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author db + * @version 1.0 + * @description LxAdminException 自定义异常 + * @since 2023/7/23 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class LxAdminException extends RuntimeException{ + private int code; + private String msg; + + public LxAdminException(AppHttpCodeEnum httpCodeEnum) { + super(httpCodeEnum.getMsg()); + this.code = httpCodeEnum.getCode(); + this.msg = httpCodeEnum.getMsg(); + } +} diff --git a/paramValidated/src/main/java/com/duan/handle/MyMetaObjectHandler.java b/paramValidated/src/main/java/com/duan/handle/MyMetaObjectHandler.java new file mode 100644 index 0000000000000000000000000000000000000000..5825c3fdaa9d5b9a44bacbd5256b812b168ffc77 --- /dev/null +++ b/paramValidated/src/main/java/com/duan/handle/MyMetaObjectHandler.java @@ -0,0 +1,28 @@ +package com.duan.handle; + +import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; +import org.apache.ibatis.reflection.MetaObject; +import org.springframework.stereotype.Component; + +import java.util.Date; + +/** + * @author db + * @version 1.0 + * @description MyMetaObjectHandler + * @since 2023/7/24 + */ +@Component +public class MyMetaObjectHandler implements MetaObjectHandler { + @Override + public void insertFill(MetaObject metaObject) { + + this.setFieldValByName("createTime", new Date(), metaObject); + this.setFieldValByName("updateTime", new Date(), metaObject); + } + + @Override + public void updateFill(MetaObject metaObject) { + this.setFieldValByName("updateTime", new Date(), metaObject); + } +} diff --git a/paramValidated/src/main/java/com/duan/mapper/UserMapper.java b/paramValidated/src/main/java/com/duan/mapper/UserMapper.java new file mode 100644 index 0000000000000000000000000000000000000000..aeba15b340c72624f5f55bf3f782fd84819c083d --- /dev/null +++ b/paramValidated/src/main/java/com/duan/mapper/UserMapper.java @@ -0,0 +1,15 @@ +package com.duan.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.duan.pojo.SysUser; +import org.apache.ibatis.annotations.Mapper; + +/** + * @author db + * @version 1.0 + * @description UserMapper + * @since 2024/6/15 + */ +@Mapper +public interface UserMapper extends BaseMapper { +} diff --git a/paramValidated/src/main/java/com/duan/pojo/AppHttpCodeEnum.java b/paramValidated/src/main/java/com/duan/pojo/AppHttpCodeEnum.java new file mode 100644 index 0000000000000000000000000000000000000000..cd63693e773f5317705471212c0bdc6634e7e571 --- /dev/null +++ b/paramValidated/src/main/java/com/duan/pojo/AppHttpCodeEnum.java @@ -0,0 +1,78 @@ +package com.duan.pojo; + +/** + * @author db + * @version 1.0 + * @description AppHttpCodeEnum + * @since 2023/7/12 + */ +public enum AppHttpCodeEnum { + // 成功 + SUCCESS(200,"操作成功"), + // 失败 + ERROR(500,"操作失败"), + // 登录 + NEED_LOGIN(401,"需要登录后操作"), + NO_OPERATOR_AUTH(403,"无权限操作"), + SYSTEM_ERROR(500,"出现错误"), + USERNAME_EXIST(501,"用户名已存在"), + PHONENUMBER_EXIST(502,"手机号已存在"), + EMAIL_EXIST(503, "邮箱已存在"), + REQUIRE_USERNAME(504, "必需填写用户名"), + LOGIN_ERROR(505,"用户名或密码错误"), + + // 角色 + ROLE_USERED(20001,"此角色已被用户使用"), + ROLE_INSERT_ERROR(20002,"插入角色失败"), + ROLE_UPDATE_ERROR(20003,"更新角色失败"), + ROLE_DELETE_ERROR(20004,"删除角色失败"), + + // 菜单 + MENU_EXIST(30001,"菜单名称已存在"), + MENU_UPDATE_ERROR(30002,"修改菜单时,上级菜单不能选择自己"), + MENU_DELETE_ERROR(30003,"含有子菜单,不能删除此此菜单"), + MENU_INSERT(30004,"菜单增加失败"), + + // 用户 + USER_NAME_EXIST(40001,"用户名已存在"), + USER_PHONE_EXIST(40002,"手机号已存在"), + USER_EMILE_EXIST(40003,"邮箱已存在"), + USER_INSET_ERROR(40004,"增加用户失败"), + + // 用户角色 + USER_ROLE_DELETE_ERROR(50001,"删除用户角色失败"), + + // 用户岗位 + USER_POST_DELETE_ERROR(60001,"删除用户岗位失败"), + + // 部门 + DEPT_EXIST(70001,"部门名称已存在"), + DEPT_ERROR(70002,"部门停用,不允许新增"), + DEPT_HAS_CHILDREN(70003,"此部门有子部门,不允许删除"), + DEPT_EXIST_USER(70004,"此部门关联的有用户,不允许删除"), + DEPT_PARENT_ERROR(70005,"上级部门不能是自己"), + + // 岗位 + POST_EXIST(80001,"岗位名称已存在"), + + // 参数配置 + CONFIG_SYSTEM_INNER(90001,"系统内部参数不能删除"), + CONFIG_KEY_EXIST(90002,"参数键名已存在"), + PARAM_INVALID(90003,"参数校验失败"); + + int code; + String msg; + + AppHttpCodeEnum(int code, String errorMessage){ + this.code = code; + this.msg = errorMessage; + } + + public int getCode() { + return code; + } + + public String getMsg() { + return msg; + } +} diff --git a/paramValidated/src/main/java/com/duan/pojo/ResponseResult.java b/paramValidated/src/main/java/com/duan/pojo/ResponseResult.java new file mode 100644 index 0000000000000000000000000000000000000000..f21aba48b1ce2ce2c34fa4687a7d6f350c3c4e7c --- /dev/null +++ b/paramValidated/src/main/java/com/duan/pojo/ResponseResult.java @@ -0,0 +1,133 @@ +package com.duan.pojo; + +import com.fasterxml.jackson.annotation.JsonInclude; + +import java.io.Serializable; + +/** + * @author db + * @version 1.0 + * @description ResponseResult + * @since 2023/7/12 + */ +@JsonInclude(JsonInclude.Include.NON_NULL) +public class ResponseResult implements Serializable { + private static final long serialVersionUID = 2233637474601103587L; + + // 接口响应状态码 + private Integer code; + + // 接口响应信息 + private String msg; + + // 接口响应的数据 + private T data; + + public ResponseResult() { + this.code = AppHttpCodeEnum.SUCCESS.getCode(); + this.msg = AppHttpCodeEnum.SUCCESS.getMsg(); + } + + public ResponseResult(Integer code, T data) { + this.code = code; + this.data = data; + } + + public ResponseResult(Integer code, String msg, T data) { + this.code = code; + this.msg = msg; + this.data = data; + } + + public ResponseResult(Integer code, String msg) { + this.code = code; + this.msg = msg; + } + + public static ResponseResult errorResult(int code, String msg) { + ResponseResult result = new ResponseResult(); + return result.error(code, msg); + } + + public static ResponseResult okResult() { + ResponseResult result = new ResponseResult(); + return result; + } + + public static ResponseResult okResult(int code, String msg) { + ResponseResult result = new ResponseResult(); + return result.ok(code, null, msg); + } + + public static ResponseResult okResult(Object data) { + ResponseResult result = setAppHttpCodeEnum(AppHttpCodeEnum.SUCCESS, AppHttpCodeEnum.SUCCESS.getMsg()); + if (data != null) { + result.setData(data); + } + return result; + } + + public static ResponseResult errorResult(AppHttpCodeEnum enums) { + return setAppHttpCodeEnum(enums, enums.getMsg()); + } + + public static ResponseResult errorResult(AppHttpCodeEnum enums, String msg) { + return setAppHttpCodeEnum(enums, msg); + } + + public static ResponseResult setAppHttpCodeEnum(AppHttpCodeEnum enums) { + return okResult(enums.getCode(), enums.getMsg()); + } + + private static ResponseResult setAppHttpCodeEnum(AppHttpCodeEnum enums, String msg) { + return okResult(enums.getCode(), msg); + } + + public ResponseResult error(Integer code, String msg) { + this.code = code; + this.msg = msg; + return this; + } + + public ResponseResult ok(Integer code, T data) { + this.code = code; + this.data = data; + return this; + } + + public ResponseResult ok(Integer code, T data, String msg) { + this.code = code; + this.data = data; + this.msg = msg; + return this; + } + + public ResponseResult ok(T data) { + this.data = data; + return this; + } + + public Integer getCode() { + return code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMsg() { + return msg; + } + + public void setMsg(String msg) { + this.msg = msg; + } + + public T getData() { + return data; + } + + public void setData(T data) { + this.data = data; + } +} \ No newline at end of file diff --git a/paramValidated/src/main/java/com/duan/pojo/Result.java b/paramValidated/src/main/java/com/duan/pojo/Result.java new file mode 100644 index 0000000000000000000000000000000000000000..b3852789db2a3e75ac88a6d35186a0660cf46c4f --- /dev/null +++ b/paramValidated/src/main/java/com/duan/pojo/Result.java @@ -0,0 +1,34 @@ +package com.duan.pojo; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author db + * @version 1.0 + * @description Result + * @since 2023/12/19 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class Result { + + private Integer code; + private String msg; + private Object data; + + public static Result success(){ + return new Result(1,"success",null); + } + + public static Result success(Object data){ + return new Result(1,"success",data); + } + + public static Result error(){ + return new Result(0,"error",null); + } + +} diff --git a/paramValidated/src/main/java/com/duan/pojo/SysUser.java b/paramValidated/src/main/java/com/duan/pojo/SysUser.java new file mode 100644 index 0000000000000000000000000000000000000000..d7717d56c13115b8551222b183d28af9147fdcbb --- /dev/null +++ b/paramValidated/src/main/java/com/duan/pojo/SysUser.java @@ -0,0 +1,111 @@ +package com.duan.pojo; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.hibernate.validator.constraints.Length; +import org.hibernate.validator.constraints.Range; + +import javax.validation.constraints.*; +import java.io.Serializable; +import java.util.Date; + +/** + * 系统用户表(SysUser)表实体类 + * + * @author makejava + * @since 2023-07-13 11:37:54 + */ +@SuppressWarnings("serial") +@Data +@AllArgsConstructor +@NoArgsConstructor +@TableName("sys_user") +@ApiModel(value = "SysUser对象", description = "用户信息表") +public class SysUser implements Serializable{ + private static final long serialVersionUID = 767991252105621235L; + + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + @ApiModelProperty("部门ID") + @TableField("dept_id") + private Long deptId; + + @ApiModelProperty("用户名") + @TableField("user_name") + private String userName; + + @ApiModelProperty("昵称") + @TableField("nick_name") + private String nickName; + + @ApiModelProperty("密码") + @TableField("password") + private String password; + + @ApiModelProperty("用户性别(0男,1女") + @TableField("gender") + private Integer gender; + + @ApiModelProperty("手机号码") + @TableField("phone") + private String phone; + + @ApiModelProperty("邮箱") + @TableField("email") + private String email; + + @ApiModelProperty("头像地址") + @TableField("avatar_name") + private String avatarName; + + @ApiModelProperty("用户类型(0管理员,1普通用户") + @TableField("user_type") + private Integer userType; + + @ApiModelProperty("状态:1启用、0禁用") + @TableField("status") + private Integer status; + + @ApiModelProperty("备注") + @TableField("remark") + private String remark; + + @ApiModelProperty("创建者") + @TableField("create_by") + private String createBy; + + @ApiModelProperty("更新者") + @TableField("update_by") + private String updateBy; + + @ApiModelProperty("创建日期") + @TableField(value = "create_time",fill = FieldFill.INSERT_UPDATE) + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private Date createTime; + + @ApiModelProperty("更新时间") + @TableField(value = "update_time",fill = FieldFill.INSERT_UPDATE) + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private Date updateTime; + + @ApiModelProperty("删除标志(0代表未删除,1代表已删除)") + @TableField("is_delete") + private Integer isDelete; + + //关联角色id数组,非user表字段 + @TableField(exist = false) + private Long[] roleIds; + + //关联岗位id数组,非user表字段 + @TableField(exist = false) + private Long[] postIds; + + +} + diff --git a/paramValidated/src/main/java/com/duan/pojo/vo/AddressVO.java b/paramValidated/src/main/java/com/duan/pojo/vo/AddressVO.java new file mode 100644 index 0000000000000000000000000000000000000000..ed3f3da93c76e3a674a4c83db5cdd8f8c4697bd6 --- /dev/null +++ b/paramValidated/src/main/java/com/duan/pojo/vo/AddressVO.java @@ -0,0 +1,20 @@ +package com.duan.pojo.vo; + +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * @author db + * @version 1.0 + * @description AddressVO + * @since 2024/6/17 + */ +@Data +public class AddressVO { + + @NotBlank(message = "省份不能为空") + private String province; + @NotBlank(message = "城市不能为空") + private String city; +} diff --git a/paramValidated/src/main/java/com/duan/pojo/vo/SysUserVO.java b/paramValidated/src/main/java/com/duan/pojo/vo/SysUserVO.java new file mode 100644 index 0000000000000000000000000000000000000000..ee3447cd261148886641211691184c098912a45a --- /dev/null +++ b/paramValidated/src/main/java/com/duan/pojo/vo/SysUserVO.java @@ -0,0 +1,70 @@ +package com.duan.pojo.vo; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.duan.anno.PasswordValid; +import com.duan.validatedGroup.CreateUserGroup; +import com.duan.validatedGroup.UpdateUserGroup; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.Valid; +import javax.validation.constraints.Email; +import javax.validation.constraints.Min; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * @author db + * @version 1.0 + * @description SysUserVO + * @since 2024/6/17 + */ +@Data +public class SysUserVO { + + @Min(value = 1,groups = UpdateUserGroup.class) + private Long id; + + @ApiModelProperty("部门ID") + private Long deptId; + + @NotBlank(message = "名字不能为空",groups = CreateUserGroup.class) + @ApiModelProperty("用户名") + private String userName; + + @NotBlank(message = "昵称不能为null和空字符串") + @ApiModelProperty("昵称") + private String nickName; + + @PasswordValid(groups = CreateUserGroup.class) + @ApiModelProperty("密码") + private String password; + + @ApiModelProperty("用户性别(0男,1女") + private Integer gender; + + + @ApiModelProperty("手机号码") + private String phone; + + @Email(message = "请填写正确的邮箱地址") + @ApiModelProperty("邮箱") + private String email; + + @ApiModelProperty("头像地址") + private String avatarName; + + @ApiModelProperty("用户类型(0管理员,1普通用户") + private Integer userType; + + @ApiModelProperty("状态:1启用、0禁用") + private Integer status; + + @ApiModelProperty("备注") + private String remark; + + @NotNull(message = "请输入地址信息") + @Valid + private AddressVO addressVO ; +} diff --git a/paramValidated/src/main/java/com/duan/service/UserService.java b/paramValidated/src/main/java/com/duan/service/UserService.java new file mode 100644 index 0000000000000000000000000000000000000000..7c033f29b60a0de8a03d89ff6f877f5299054d09 --- /dev/null +++ b/paramValidated/src/main/java/com/duan/service/UserService.java @@ -0,0 +1,18 @@ +package com.duan.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.duan.pojo.SysUser; +import com.duan.pojo.vo.SysUserVO; + +/** + * @author db + * @version 1.0 + * @description UserService + * @since 2024/4/15 + */ +public interface UserService extends IService { + + void addUser(SysUserVO sysUserVO); + + void updateUser(SysUserVO sysUserVO); +} diff --git a/paramValidated/src/main/java/com/duan/service/impl/UserServiceImpl.java b/paramValidated/src/main/java/com/duan/service/impl/UserServiceImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..d94dc5c817f2de57c6bd6c2ec264d718cb76dad2 --- /dev/null +++ b/paramValidated/src/main/java/com/duan/service/impl/UserServiceImpl.java @@ -0,0 +1,36 @@ +package com.duan.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.duan.mapper.UserMapper; +import com.duan.pojo.SysUser; +import com.duan.pojo.vo.SysUserVO; +import com.duan.service.UserService; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * @author db + * @version 1.0 + * @description UserServiceImpl + * @since 2024/4/15 + */ +@Service +public class UserServiceImpl extends ServiceImpl implements UserService { + + @Autowired + private UserMapper userMapper; + @Override + public void addUser(SysUserVO sysUserVO) { + SysUser sysUser = new SysUser(); + BeanUtils.copyProperties(sysUserVO,sysUser); + userMapper.insert(sysUser); + } + + @Override + public void updateUser(SysUserVO sysUserVO) { + SysUser sysUser = new SysUser(); + BeanUtils.copyProperties(sysUserVO,sysUser); + userMapper.updateById(sysUser); + } +} diff --git a/paramValidated/src/main/java/com/duan/validatedGroup/CreateUserGroup.java b/paramValidated/src/main/java/com/duan/validatedGroup/CreateUserGroup.java new file mode 100644 index 0000000000000000000000000000000000000000..b99406aef680097a7ad997c105115de55be3b7b4 --- /dev/null +++ b/paramValidated/src/main/java/com/duan/validatedGroup/CreateUserGroup.java @@ -0,0 +1,10 @@ +package com.duan.validatedGroup; + +/** + * @author db + * @version 1.0 + * @description CreateUserGroup + * @since 2024/6/24 + */ +public interface CreateUserGroup { +} diff --git a/paramValidated/src/main/java/com/duan/validatedGroup/UpdateUserGroup.java b/paramValidated/src/main/java/com/duan/validatedGroup/UpdateUserGroup.java new file mode 100644 index 0000000000000000000000000000000000000000..87c09508660f96f0d2693f8b6cc4127040f213e6 --- /dev/null +++ b/paramValidated/src/main/java/com/duan/validatedGroup/UpdateUserGroup.java @@ -0,0 +1,10 @@ +package com.duan.validatedGroup; + +/** + * @author db + * @version 1.0 + * @description UpdateUserGroup + * @since 2024/6/24 + */ +public interface UpdateUserGroup { +} diff --git a/paramValidated/src/main/resources/application-dev.yml b/paramValidated/src/main/resources/application-dev.yml new file mode 100644 index 0000000000000000000000000000000000000000..433d0cc2a1be9e2fb974cff59a1ef10d357a61bc --- /dev/null +++ b/paramValidated/src/main/resources/application-dev.yml @@ -0,0 +1,22 @@ +server: + port: 8083 + servlet: + context-path: /param # 应用名 + + +mybatis-plus: + configuration: + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 查看日志 + +spring: + datasource: + url: jdbc:mysql://localhost:3306/param_data?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false + username: root + password: 123456 + driver-class-name: com.mysql.cj.jdbc.Driver + +mybatis: + type-aliases-package: com.duan.pojo + configuration: + map-underscore-to-camel-case: true + diff --git a/paramValidated/src/main/resources/application.yml b/paramValidated/src/main/resources/application.yml new file mode 100644 index 0000000000000000000000000000000000000000..6c171750b9a11d7fcf590b5a1d339f3659d9d065 --- /dev/null +++ b/paramValidated/src/main/resources/application.yml @@ -0,0 +1,9 @@ +server: + port: 8083 + servlet: + context-path: /param # 应用名 + +spring: + profiles: + active: dev + diff --git a/rabbitmq-java/pom.xml b/rabbitmq-java/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..d75c0a468b3c721505c86a225afda0e08fa9e4b7 --- /dev/null +++ b/rabbitmq-java/pom.xml @@ -0,0 +1,28 @@ + + + 4.0.0 + + org.example + rabbitmq-java + 1.0-SNAPSHOT + + + + + com.rabbitmq + amqp-client + 5.10.0 + + + + org.slf4j + slf4j-nop + 1.7.2 + + + + + + \ No newline at end of file diff --git a/rabbitmq-java/src/main/java/com/duan/rabbitmq/direct/Consumer1.java b/rabbitmq-java/src/main/java/com/duan/rabbitmq/direct/Consumer1.java new file mode 100644 index 0000000000000000000000000000000000000000..3e7023c6bf756792eee4c90deb0ceaaf84ae003c --- /dev/null +++ b/rabbitmq-java/src/main/java/com/duan/rabbitmq/direct/Consumer1.java @@ -0,0 +1,37 @@ +package com.duan.rabbitmq.direct; + +import com.duan.rabbitmq.utils.RabbitMqUtil; +import com.rabbitmq.client.*; + +import java.io.IOException; + +/** + * @author db + * @version 1.0 + * @description Consumer1 + * @since 2023/11/28 + */ +public class Consumer1 { + public static void main(String[] args) throws IOException { + // 获得连接对象 + Connection connection = RabbitMqUtil.getConnection(); + Channel channel = connection.createChannel(); + + // 通道绑定交换机 + channel.exchangeDeclare("logs_direct","direct"); + + // 绑定临时队列 + String queue = channel.queueDeclare().getQueue(); + + // 绑定交换机和队列 + channel.queueBind(queue,"logs_direct","error"); + + // 消费消息 + channel.basicConsume(queue,true,new DefaultConsumer(channel){ + @Override + public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException { + System.out.println("消费者1: "+new String(body)); + } + }); + } +} diff --git a/rabbitmq-java/src/main/java/com/duan/rabbitmq/direct/Consumer2.java b/rabbitmq-java/src/main/java/com/duan/rabbitmq/direct/Consumer2.java new file mode 100644 index 0000000000000000000000000000000000000000..21c8f53b4ef515b34f74ad982b80d816d56178aa --- /dev/null +++ b/rabbitmq-java/src/main/java/com/duan/rabbitmq/direct/Consumer2.java @@ -0,0 +1,39 @@ +package com.duan.rabbitmq.direct; + +import com.duan.rabbitmq.utils.RabbitMqUtil; +import com.rabbitmq.client.*; + +import java.io.IOException; + +/** + * @author db + * @version 1.0 + * @description Consumer1 + * @since 2023/11/28 + */ +public class Consumer2 { + public static void main(String[] args) throws IOException { + // 获得连接对象 + Connection connection = RabbitMqUtil.getConnection(); + Channel channel = connection.createChannel(); + + // 通道绑定交换机 + channel.exchangeDeclare("logs_direct","direct"); + + // 绑定临时队列 + String queue = channel.queueDeclare().getQueue(); + + // 绑定交换机和队列 + channel.queueBind(queue,"logs_direct","info"); + channel.queueBind(queue,"logs_direct","error"); + channel.queueBind(queue,"logs_direct","warning"); + + // 消费消息 + channel.basicConsume(queue,true,new DefaultConsumer(channel){ + @Override + public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException { + System.out.println("消费者1: "+new String(body)); + } + }); + } +} diff --git a/rabbitmq-java/src/main/java/com/duan/rabbitmq/direct/Provider.java b/rabbitmq-java/src/main/java/com/duan/rabbitmq/direct/Provider.java new file mode 100644 index 0000000000000000000000000000000000000000..83dfe729cac2342ddc441ad94e73551e531a5a65 --- /dev/null +++ b/rabbitmq-java/src/main/java/com/duan/rabbitmq/direct/Provider.java @@ -0,0 +1,28 @@ +package com.duan.rabbitmq.direct; + +import com.duan.rabbitmq.utils.RabbitMqUtil; +import com.rabbitmq.client.Channel; +import com.rabbitmq.client.Connection; + +import java.io.IOException; + +/** + * @author db + * @version 1.0 + * @description Provider + * @since 2023/11/28 + */ +public class Provider { + public static void main(String[] args) throws IOException { + // 建立连接 + Connection connection = RabbitMqUtil.getConnection(); + Channel channel = connection.createChannel(); + + channel.exchangeDeclare("logs_direct","direct"); + + String routingKey = "error"; + channel.basicPublish("logs_direct",routingKey,null,("这是direct模型发布的基于route key: ["+routingKey+"] 发送的消息").getBytes()); + + RabbitMqUtil.closeConnectionAndChannel(channel,connection); + } +} diff --git a/rabbitmq-java/src/main/java/com/duan/rabbitmq/fanout/Customer1.java b/rabbitmq-java/src/main/java/com/duan/rabbitmq/fanout/Customer1.java new file mode 100644 index 0000000000000000000000000000000000000000..a61977ccd5a3369d741481c329771855424c8ef4 --- /dev/null +++ b/rabbitmq-java/src/main/java/com/duan/rabbitmq/fanout/Customer1.java @@ -0,0 +1,37 @@ +package com.duan.rabbitmq.fanout; + +import com.duan.rabbitmq.utils.RabbitMqUtil; +import com.rabbitmq.client.*; + +import java.io.IOException; + +/** + * @author db + * @version 1.0 + * @description Customer1 + * @since 2023/11/28 + */ +public class Customer1 { + public static void main(String[] args) throws IOException { + // 获得连接对象 + Connection connection = RabbitMqUtil.getConnection(); + Channel channel = connection.createChannel(); + + // 通道绑定交换机 + channel.exchangeDeclare("logs","fanout"); + + // 绑定临时队列 + String queue = channel.queueDeclare().getQueue(); + + // 绑定交换机和队列 + channel.queueBind(queue,"logs",""); + + // 消费消息 + channel.basicConsume(queue,true,new DefaultConsumer(channel){ + @Override + public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException { + System.out.println("消费者1: "+new String(body)); + } + }); + } +} diff --git a/rabbitmq-java/src/main/java/com/duan/rabbitmq/fanout/Customer2.java b/rabbitmq-java/src/main/java/com/duan/rabbitmq/fanout/Customer2.java new file mode 100644 index 0000000000000000000000000000000000000000..b832c811b6a590ab42174e0802aaa1c0ec981459 --- /dev/null +++ b/rabbitmq-java/src/main/java/com/duan/rabbitmq/fanout/Customer2.java @@ -0,0 +1,37 @@ +package com.duan.rabbitmq.fanout; + +import com.duan.rabbitmq.utils.RabbitMqUtil; +import com.rabbitmq.client.*; + +import java.io.IOException; + +/** + * @author db + * @version 1.0 + * @description Customer1 + * @since 2023/11/28 + */ +public class Customer2 { + public static void main(String[] args) throws IOException { + // 获得连接对象 + Connection connection = RabbitMqUtil.getConnection(); + Channel channel = connection.createChannel(); + + // 通道绑定交换机 + channel.exchangeDeclare("logs","fanout"); + + // 绑定临时队列 + String queue = channel.queueDeclare().getQueue(); + + // 绑定交换机和队列 + channel.queueBind(queue,"logs",""); + + // 消费消息 + channel.basicConsume(queue,true,new DefaultConsumer(channel){ + @Override + public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException { + System.out.println("消费者2: "+new String(body)); + } + }); + } +} diff --git a/rabbitmq-java/src/main/java/com/duan/rabbitmq/fanout/Customer3.java b/rabbitmq-java/src/main/java/com/duan/rabbitmq/fanout/Customer3.java new file mode 100644 index 0000000000000000000000000000000000000000..39f0aea4edbfe4adc7833a38e145dfc2b7e7f3cf --- /dev/null +++ b/rabbitmq-java/src/main/java/com/duan/rabbitmq/fanout/Customer3.java @@ -0,0 +1,37 @@ +package com.duan.rabbitmq.fanout; + +import com.duan.rabbitmq.utils.RabbitMqUtil; +import com.rabbitmq.client.*; + +import java.io.IOException; + +/** + * @author db + * @version 1.0 + * @description Customer1 + * @since 2023/11/28 + */ +public class Customer3 { + public static void main(String[] args) throws IOException { + // 获得连接对象 + Connection connection = RabbitMqUtil.getConnection(); + Channel channel = connection.createChannel(); + + // 通道绑定交换机 + channel.exchangeDeclare("logs","fanout"); + + // 绑定临时队列 + String queue = channel.queueDeclare().getQueue(); + + // 绑定交换机和队列 + channel.queueBind(queue,"logs",""); + + // 消费消息 + channel.basicConsume(queue,true,new DefaultConsumer(channel){ + @Override + public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException { + System.out.println("消费者3: "+new String(body)); + } + }); + } +} diff --git a/rabbitmq-java/src/main/java/com/duan/rabbitmq/fanout/Provider.java b/rabbitmq-java/src/main/java/com/duan/rabbitmq/fanout/Provider.java new file mode 100644 index 0000000000000000000000000000000000000000..8259fa0ff726a8de44d4167d7362ca5ffada4166 --- /dev/null +++ b/rabbitmq-java/src/main/java/com/duan/rabbitmq/fanout/Provider.java @@ -0,0 +1,32 @@ +package com.duan.rabbitmq.fanout; + +import com.duan.rabbitmq.utils.RabbitMqUtil; +import com.rabbitmq.client.Channel; +import com.rabbitmq.client.Connection; + +import java.io.IOException; + +/** + * @author db + * @version 1.0 + * @description Provider + * @since 2023/11/28 + */ +public class Provider { + public static void main(String[] args) throws IOException { + + // 获取连接对象 + Connection connection = RabbitMqUtil.getConnection(); + Channel channel = connection.createChannel(); + + // 将通道声明交换机 参数1:交换机名称 参数2:交换机类型 + channel.exchangeDeclare("logs","fanout"); + + // 发送消息 + channel.basicPublish("logs","",null,"fanout type message".getBytes()); + + // 释放资源 + RabbitMqUtil.closeConnectionAndChannel(channel,connection); + + } +} diff --git a/rabbitmq-java/src/main/java/com/duan/rabbitmq/simple/Consumer.java b/rabbitmq-java/src/main/java/com/duan/rabbitmq/simple/Consumer.java new file mode 100644 index 0000000000000000000000000000000000000000..7182758a75528b85413b6dbdfbe2c0685d36a692 --- /dev/null +++ b/rabbitmq-java/src/main/java/com/duan/rabbitmq/simple/Consumer.java @@ -0,0 +1,66 @@ +package com.duan.rabbitmq.simple; + +import com.duan.rabbitmq.utils.RabbitMqUtil; +import com.rabbitmq.client.*; + +import java.io.IOException; +import java.util.concurrent.TimeoutException; + +/** + * @author db + * @version 1.0 + * @description Consumer 消费者 + * @since 2022/12/29 + */ +public class Consumer { + + public static void main(String[] args) throws IOException, TimeoutException { +// ConnectionFactory connectionFactory = new ConnectionFactory(); +// connectionFactory.setHost("192.168.137.120"); +// connectionFactory.setPort(5672); +// connectionFactory.setVirtualHost("/"); +// connectionFactory.setUsername("admin"); +// connectionFactory.setPassword("123456"); +// connectionFactory.setHandshakeTimeout(60000); +// +// // 创建连接 +// Connection connection = connectionFactory.newConnection(); + + // 从工具类中获得连接 + Connection connection = RabbitMqUtil.getConnection(); + // 创建信道 + Channel channel = connection.createChannel(); + + // 消费者成功消费时的回调 + DeliverCallback deliverCallback = (consumerTag,message) ->{ + System.out.println(new String(message.getBody())); + }; + + // 消费者取消消费时的回调 + CancelCallback callback = consumerTag ->{ + System.out.println("消费者取消消费接口的回调"); + }; + + // 参数1:消费队列的名称 + // 参数2:消息的自动确认机制(已获得消息就通知MQ消息已被消费)true 打开 false 关闭 + // 参数3: + channel.basicConsume("hello",true,deliverCallback,callback); + +// channel.close(); +// connection.close(); + } +} + + + + + + + + + + + + + + diff --git a/rabbitmq-java/src/main/java/com/duan/rabbitmq/simple/Producer.java b/rabbitmq-java/src/main/java/com/duan/rabbitmq/simple/Producer.java new file mode 100644 index 0000000000000000000000000000000000000000..465c18db9d0fc78860040324261396399c6c365d --- /dev/null +++ b/rabbitmq-java/src/main/java/com/duan/rabbitmq/simple/Producer.java @@ -0,0 +1,88 @@ +package com.duan.rabbitmq.simple; + +import com.duan.rabbitmq.utils.RabbitMqUtil; +import com.rabbitmq.client.Channel; +import com.rabbitmq.client.Connection; +import com.rabbitmq.client.ConnectionFactory; +import com.rabbitmq.client.MessageProperties; + +import java.io.IOException; +import java.util.concurrent.TimeoutException; + +/** + * @author db + * @version 1.0 + * @description Provider 生产者代码 + * @since 2022/12/29 + */ +public class Producer { + + public static void main(String[] args) throws IOException, TimeoutException { + +// // 1.创建连接工厂 +// ConnectionFactory connectionFactory = new ConnectionFactory(); +// // 2.设置连接属性 +// connectionFactory.setHost("192.168.137.120"); +// connectionFactory.setPort(5672); +// connectionFactory.setVirtualHost("/"); +// connectionFactory.setUsername("admin"); +// connectionFactory.setPassword("123456"); +// connectionFactory.setHandshakeTimeout(60000); +// +// // 3.从连接工厂获得连接 +// Connection connection = connectionFactory.newConnection(); + + // 从工具类中获得连接 + Connection connection = RabbitMqUtil.getConnection(); + // 4.从连接中获得channel + Channel channel = connection.createChannel(); + // 5.声明队列queue存储消息 + + /** + * 参数s:队列名称 如果队列不存在就自动创建 + * 参数b:用来定义队列特性是否要持久化 true 持久化队列 false 不持久化 + * 参数b1: exclusive 是否独占队列 true 独占队列 false 不独占 + * 参数b2:autoDelete 是否在消费完成后自动删除队列 true 自动删除 false 不自动删除 + * 参数5:额外附加参数 + * + */ + channel.queueDeclare("hello",true,false,false,null); + + // 7.发送消息给中间件 + // 参数1:交换机名称 参数2:队列名称 参数3:传递消息的额外设置 参数4: + channel.basicPublish("","hello", MessageProperties.PERSISTENT_TEXT_PLAIN,"hello rabbitmq".getBytes()); + + System.out.println("消息发送成功"); + + +// // 8.关闭连接 +// channel.close(); +// connection.close(); + +// RabbitMqUtil.closeConnectionAndChannel(channel,connection); + } +} + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/rabbitmq-java/src/main/java/com/duan/rabbitmq/topic/Customer1.java b/rabbitmq-java/src/main/java/com/duan/rabbitmq/topic/Customer1.java new file mode 100644 index 0000000000000000000000000000000000000000..df0116889f4422d484313f042b29ece8f4fad59e --- /dev/null +++ b/rabbitmq-java/src/main/java/com/duan/rabbitmq/topic/Customer1.java @@ -0,0 +1,37 @@ +package com.duan.rabbitmq.topic; + +import com.duan.rabbitmq.utils.RabbitMqUtil; +import com.rabbitmq.client.*; + +import java.io.IOException; + +/** + * @author db + * @version 1.0 + * @description Customer1 + * @since 2023/11/30 + */ +public class Customer1 { + public static void main(String[] args) throws IOException { + // 获得连接对象 + Connection connection = RabbitMqUtil.getConnection(); + Channel channel = connection.createChannel(); + + // 通道绑定交换机 + channel.exchangeDeclare("topics","topic"); + + // 绑定临时队列 + String queue = channel.queueDeclare().getQueue(); + + // 绑定交换机和队列 + channel.queueBind(queue,"topics","*.user.*"); + + // 消费消息 + channel.basicConsume(queue,true,new DefaultConsumer(channel){ + @Override + public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException { + System.out.println("消费者1: "+new String(body)); + } + }); + } +} diff --git a/rabbitmq-java/src/main/java/com/duan/rabbitmq/topic/Customer2.java b/rabbitmq-java/src/main/java/com/duan/rabbitmq/topic/Customer2.java new file mode 100644 index 0000000000000000000000000000000000000000..e28e12d249788c78876dd6b3162d329c61e11160 --- /dev/null +++ b/rabbitmq-java/src/main/java/com/duan/rabbitmq/topic/Customer2.java @@ -0,0 +1,37 @@ +package com.duan.rabbitmq.topic; + +import com.duan.rabbitmq.utils.RabbitMqUtil; +import com.rabbitmq.client.*; + +import java.io.IOException; + +/** + * @author db + * @version 1.0 + * @description Customer1 + * @since 2023/11/30 + */ +public class Customer2 { + public static void main(String[] args) throws IOException { + // 获得连接对象 + Connection connection = RabbitMqUtil.getConnection(); + Channel channel = connection.createChannel(); + + // 通道绑定交换机 + channel.exchangeDeclare("topics","topic"); + + // 绑定临时队列 + String queue = channel.queueDeclare().getQueue(); + + // 绑定交换机和队列 + channel.queueBind(queue,"topics","*.user.#"); + + // 消费消息 + channel.basicConsume(queue,true,new DefaultConsumer(channel){ + @Override + public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException { + System.out.println("消费者1: "+new String(body)); + } + }); + } +} diff --git a/rabbitmq-java/src/main/java/com/duan/rabbitmq/topic/Provider.java b/rabbitmq-java/src/main/java/com/duan/rabbitmq/topic/Provider.java new file mode 100644 index 0000000000000000000000000000000000000000..9dd09b05a897f317b012eb7a44a83455435881e1 --- /dev/null +++ b/rabbitmq-java/src/main/java/com/duan/rabbitmq/topic/Provider.java @@ -0,0 +1,36 @@ +package com.duan.rabbitmq.topic; + +import com.duan.rabbitmq.utils.RabbitMqUtil; +import com.rabbitmq.client.Channel; +import com.rabbitmq.client.Connection; + +import java.io.IOException; + +/** + * @author db + * @version 1.0 + * @description Provider + * @since 2023/11/30 + */ +public class Provider { + + public static void main(String[] args) throws IOException { + //获取连接对象 + Connection connection = RabbitMqUtil.getConnection(); + Channel channel = connection.createChannel(); + + //声明交换机以及交换机类型 topic + channel.exchangeDeclare("topics","topic"); + + //发布消息 + String routekey = "save.user.delete"; + + channel.basicPublish("topics",routekey,null,("这里是topic动态路由模型,routekey: ["+routekey+"]").getBytes()); + + //关闭资源 + RabbitMqUtil.closeConnectionAndChannel(channel,connection); + + } + + +} diff --git a/rabbitmq-java/src/main/java/com/duan/rabbitmq/utils/RabbitMqUtil.java b/rabbitmq-java/src/main/java/com/duan/rabbitmq/utils/RabbitMqUtil.java new file mode 100644 index 0000000000000000000000000000000000000000..a2027b30d0079ef54bd861c896f8b1558991557a --- /dev/null +++ b/rabbitmq-java/src/main/java/com/duan/rabbitmq/utils/RabbitMqUtil.java @@ -0,0 +1,48 @@ +package com.duan.rabbitmq.utils; + +import com.rabbitmq.client.Channel; +import com.rabbitmq.client.Connection; +import com.rabbitmq.client.ConnectionFactory; + +/** + * @author db + * @version 1.0 + * @description RabbitMqUtil + * @since 2023/1/2 + */ +public class RabbitMqUtil { + + // 定义提供连接对象的方法 + public static Connection getConnection(){ + try{ + // 1.创建连接工厂 + ConnectionFactory connectionFactory = new ConnectionFactory(); + // 2.设置连接属性 + connectionFactory.setHost("192.168.137.120"); + connectionFactory.setPort(5672); + connectionFactory.setVirtualHost("/"); + connectionFactory.setUsername("admin"); + connectionFactory.setPassword("123456"); + + connectionFactory.setHandshakeTimeout(60000); + return connectionFactory.newConnection(); + }catch (Exception e){ + e.printStackTrace(); + } + return null; + } + + // 关闭连接通道和关闭连接的工具方法 + public static void closeConnectionAndChannel(Channel channel,Connection connection){ + try{ + if(channel !=null){ + channel.close(); + } + if(connection != null){ + connection.close(); + } + }catch (Exception e){ + e.printStackTrace(); + } + } +} diff --git a/rabbitmq-java/src/main/java/com/duan/rabbitmq/work/Consumer1.java b/rabbitmq-java/src/main/java/com/duan/rabbitmq/work/Consumer1.java new file mode 100644 index 0000000000000000000000000000000000000000..c8d66a2a3237a64a617bb88b79a498b9f3776f23 --- /dev/null +++ b/rabbitmq-java/src/main/java/com/duan/rabbitmq/work/Consumer1.java @@ -0,0 +1,31 @@ +package com.duan.rabbitmq.work; + +import com.duan.rabbitmq.utils.RabbitMqUtil; +import com.rabbitmq.client.*; + +import java.io.IOException; + +/** + * @author db + * @version 1.0 + * @description Consumer1 + * @since 2023/3/24 + */ +public class Consumer1 { + public static void main(String[] args) throws IOException { + Connection connection = RabbitMqUtil.getConnection(); + // 创建信道 + Channel channel = connection.createChannel(); + + // 消费者消费成功时的回调 + channel.queueDeclare("work",true,false,false,null); + channel.basicConsume("work",true,new DefaultConsumer(channel){ + @Override + public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException{ + System.out.println("消费者1: "+new String(body)); + } + }); + +// RabbitMqUtil.closeConnectionAndChannel(channel,connection); + } +} diff --git a/rabbitmq-java/src/main/java/com/duan/rabbitmq/work/Consumer2.java b/rabbitmq-java/src/main/java/com/duan/rabbitmq/work/Consumer2.java new file mode 100644 index 0000000000000000000000000000000000000000..0f46f09df7f24ce8d287ae46b819c80ea936c11c --- /dev/null +++ b/rabbitmq-java/src/main/java/com/duan/rabbitmq/work/Consumer2.java @@ -0,0 +1,36 @@ +package com.duan.rabbitmq.work; + +import com.duan.rabbitmq.utils.RabbitMqUtil; +import com.rabbitmq.client.*; + +import java.io.IOException; + +/** + * @author db + * @version 1.0 + * @description Consumer1 + * @since 2023/3/24 + */ +public class Consumer2 { + public static void main(String[] args) throws IOException { + Connection connection = RabbitMqUtil.getConnection(); + // 创建信道 + Channel channel = connection.createChannel(); + + // 消费者消费成功时的回调 + channel.queueDeclare("work",true,false,false,null); + channel.basicConsume("work",true,new DefaultConsumer(channel){ + @Override + public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException{ + try{ + Thread.sleep(2000); + }catch (Exception e){ + e.printStackTrace(); + } + System.out.println("消费者2: "+new String(body)); + } + }); + +// RabbitMqUtil.closeConnectionAndChannel(channel,connection); + } +} diff --git a/rabbitmq-java/src/main/java/com/duan/rabbitmq/work/Consumer3.java b/rabbitmq-java/src/main/java/com/duan/rabbitmq/work/Consumer3.java new file mode 100644 index 0000000000000000000000000000000000000000..fd8672289b1719714d0c520640f32af0f673894d --- /dev/null +++ b/rabbitmq-java/src/main/java/com/duan/rabbitmq/work/Consumer3.java @@ -0,0 +1,34 @@ +package com.duan.rabbitmq.work; + +import com.duan.rabbitmq.utils.RabbitMqUtil; +import com.rabbitmq.client.*; + +import java.io.IOException; + +/** + * @author db + * @version 1.0 + * @description Consumer3 + * @since 2023/11/27 + */ +public class Consumer3 { + public static void main(String[] args) throws IOException { + Connection connection = RabbitMqUtil.getConnection(); + // 创建信道 + Channel channel = connection.createChannel(); + + channel.basicQos(1); // 每次只消费一个消息 + // 消费者消费成功时的回调 + channel.queueDeclare("work",true,false,false,null); + channel.basicConsume("work",false,new DefaultConsumer(channel){ + @Override + public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException{ + System.out.println("消费者1: "+new String(body)); + + // 手动确认,参数1:消息标识 参数2:每次确认1个 + channel.basicAck(envelope.getDeliveryTag(),false); + } + }); + + } +} diff --git a/rabbitmq-java/src/main/java/com/duan/rabbitmq/work/Consumer4.java b/rabbitmq-java/src/main/java/com/duan/rabbitmq/work/Consumer4.java new file mode 100644 index 0000000000000000000000000000000000000000..d990cdad9c90897ae9bd6e61cc7c851b257ccd9c --- /dev/null +++ b/rabbitmq-java/src/main/java/com/duan/rabbitmq/work/Consumer4.java @@ -0,0 +1,38 @@ +package com.duan.rabbitmq.work; + +import com.duan.rabbitmq.utils.RabbitMqUtil; +import com.rabbitmq.client.*; + +import java.io.IOException; + +/** + * @author db + * @version 1.0 + * @description Consumer4 + * @since 2023/11/27 + */ +public class Consumer4 { + public static void main(String[] args) throws IOException { + Connection connection = RabbitMqUtil.getConnection(); + // 创建信道 + Channel channel = connection.createChannel(); + + channel.basicQos(1); // 每次消费一个消息 + // 消费者消费成功时的回调 + channel.queueDeclare("work",true,false,false,null); + channel.basicConsume("work",false,new DefaultConsumer(channel){ + @Override + public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException{ + try{ + Thread.sleep(2000); + }catch (Exception e){ + e.printStackTrace(); + } + System.out.println("消费者2: "+new String(body)); + channel.basicAck(envelope.getDeliveryTag(),false); + } + }); + + + } +} diff --git a/rabbitmq-java/src/main/java/com/duan/rabbitmq/work/Producer.java b/rabbitmq-java/src/main/java/com/duan/rabbitmq/work/Producer.java new file mode 100644 index 0000000000000000000000000000000000000000..180ff6e42503abaa7af00843a2eaad5a8cedfa11 --- /dev/null +++ b/rabbitmq-java/src/main/java/com/duan/rabbitmq/work/Producer.java @@ -0,0 +1,38 @@ +package com.duan.rabbitmq.work; + +import com.duan.rabbitmq.utils.RabbitMqUtil; +import com.rabbitmq.client.Channel; +import com.rabbitmq.client.Connection; + +import java.io.IOException; + +/** + * @author db + * @version 1.0 + * @description Producer + * @since 2023/3/24 + */ +public class Producer { + + public static void main(String[] args) throws IOException { + Connection connection = RabbitMqUtil.getConnection(); + Channel channel = connection.createChannel(); + /** + * 声明队列queue存储信息 + * 参数1: 队列名称 + * 参数2: 用来定义队列是否要持久化 + * 参数3: exclusion 是否是独占队列 + * 参数4: autoDelete 是否再消费完成后自动删除队列 + * 参数5: 额外附加参数 + */ + channel.queueDeclare("work",true,false,false,null); + + for(int i = 0; i<20; i++){ + // 参数1:交换机名称 参数2:队列名称 参数3:消息传递的额外设置 + channel.basicPublish("","work",null,(i+"work").getBytes()); + } + + RabbitMqUtil.closeConnectionAndChannel(channel,connection); + + } +} diff --git a/resultException/pom.xml b/resultException/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..64749da97e5636651dc793cf89a9a1e177369308 --- /dev/null +++ b/resultException/pom.xml @@ -0,0 +1,57 @@ + + + 4.0.0 + + com.duan + resultException + 1.0-SNAPSHOT + + + org.springframework.boot + spring-boot-starter-parent + 2.4.3 + + + + + org.springframework.boot + spring-boot-starter + 2.4.3 + + + + org.springframework.boot + spring-boot-starter-web + 2.4.3 + + + + io.jsonwebtoken + jjwt + 0.9.1 + + + + org.projectlombok + lombok + 1.18.2 + + + + junit + junit + 4.13.2 + test + + + + com.alibaba + fastjson + 1.2.50 + + + + + \ No newline at end of file diff --git a/resultException/src/main/java/com/duan/ResultExceptionApplication.java b/resultException/src/main/java/com/duan/ResultExceptionApplication.java new file mode 100644 index 0000000000000000000000000000000000000000..44d121d63cdd608c2ac51e9ec69b1c5082bd7fcc --- /dev/null +++ b/resultException/src/main/java/com/duan/ResultExceptionApplication.java @@ -0,0 +1,17 @@ +package com.duan; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +/** + * @author db + * @version 1.0 + * @description ResultExceptionApplication + * @since 2024/1/18 + */ +@SpringBootApplication +public class ResultExceptionApplication { + public static void main(String[] args) { + SpringApplication.run(ResultExceptionApplication.class); + } +} diff --git a/resultException/src/main/java/com/duan/controller/LoginController.java b/resultException/src/main/java/com/duan/controller/LoginController.java new file mode 100644 index 0000000000000000000000000000000000000000..9fdcb16bd9cf9a786bf47910748154ebe77336c9 --- /dev/null +++ b/resultException/src/main/java/com/duan/controller/LoginController.java @@ -0,0 +1,51 @@ +package com.duan.controller; + + +import com.duan.execption.LxAdminException; +import com.duan.pojo.AppHttpCodeEnum; +import com.duan.pojo.ResponseResult; +import com.duan.pojo.User; +import com.duan.utils.JWTUtils; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +import java.util.HashMap; +import java.util.UUID; + +/** + * @author db + * @version 1.0 + * @description LoginController + * @since 2023/12/19 + */ +@RestController +@Slf4j +public class LoginController { + + @PostMapping("/login") + public ResponseResult login(@RequestBody User user){ + log.info("这是正常日志"); + if(!"admin".equals(user.getUsername()) && !"123456".equals(user.getPassword())){ + throw new LxAdminException(AppHttpCodeEnum.LOGIN_ERROR); + }else{ + HashMap map = new HashMap<>(); + map.put("id", UUID.randomUUID().toString()); + + // 生成token + String token = JWTUtils.generateJwt(map); + return ResponseResult.okResult(token); + } + } + + @PostMapping("/getUser") + public ResponseResult getUserById(String userId){ + User user = new User(); + user.setUsername("cxykk"); + user.setPassword("123456"); + log.info("getUser方法"); + + return ResponseResult.okResult(user); + } +} diff --git a/resultException/src/main/java/com/duan/execption/GlobalExceptionHandler.java b/resultException/src/main/java/com/duan/execption/GlobalExceptionHandler.java new file mode 100644 index 0000000000000000000000000000000000000000..93b144b77a016e03620a639b7552d6efaad60237 --- /dev/null +++ b/resultException/src/main/java/com/duan/execption/GlobalExceptionHandler.java @@ -0,0 +1,38 @@ +package com.duan.execption; + + +import com.duan.pojo.AppHttpCodeEnum; +import com.duan.pojo.ResponseResult; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; + +/** + * @author db + * @version 1.0 + * @description GlobalExceptionHandler + * @since 2023/7/23 + */ +@RestControllerAdvice +@Slf4j +public class GlobalExceptionHandler { + + // 全局异常 + @ExceptionHandler(Exception.class) + public ResponseResult exceptionHandler(Exception e){ + //打印异常信息 + log.error("出现了异常! {}",e); + //从异常对象中获取提示信息封装返回 + return ResponseResult.errorResult(AppHttpCodeEnum.SYSTEM_ERROR.getCode(),e.getMessage()); + } + + // 自定义异常 + @ExceptionHandler(LxAdminException.class) + public ResponseResult LxAdminExceptionHandler(LxAdminException e){ + //打印异常信息 + log.error("出现了异常! {}",e); + //从异常对象中获取提示信息封装返回 + return ResponseResult.errorResult(e.getCode(),e.getMsg()); + } + +} diff --git a/resultException/src/main/java/com/duan/execption/LxAdminException.java b/resultException/src/main/java/com/duan/execption/LxAdminException.java new file mode 100644 index 0000000000000000000000000000000000000000..75480e8ea7a7ded5fd5713a5fb1f75d54721eb1e --- /dev/null +++ b/resultException/src/main/java/com/duan/execption/LxAdminException.java @@ -0,0 +1,27 @@ +package com.duan.execption; + + +import com.duan.pojo.AppHttpCodeEnum; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author db + * @version 1.0 + * @description LxAdminException 自定义异常 + * @since 2023/7/23 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class LxAdminException extends RuntimeException{ + private int code; + private String msg; + + public LxAdminException(AppHttpCodeEnum httpCodeEnum) { + super(httpCodeEnum.getMsg()); + this.code = httpCodeEnum.getCode(); + this.msg = httpCodeEnum.getMsg(); + } +} diff --git a/resultException/src/main/java/com/duan/pojo/AppHttpCodeEnum.java b/resultException/src/main/java/com/duan/pojo/AppHttpCodeEnum.java new file mode 100644 index 0000000000000000000000000000000000000000..3e5e656d1e4ebaeca4b19b74f65d39d90a7c65b3 --- /dev/null +++ b/resultException/src/main/java/com/duan/pojo/AppHttpCodeEnum.java @@ -0,0 +1,33 @@ +package com.duan.pojo; + +/** + * @author db + * @version 1.0 + * @description AppHttpCodeEnum + * @since 2023/7/12 + */ +public enum AppHttpCodeEnum { + // 成功 + SUCCESS(200,"操作成功"), + // 失败 + ERROR(500,"操作失败"), + LOGIN_ERROR(505,"用户名或密码错误"), + SYSTEM_ERROR(500,"出现错误"); + + + int code; + String msg; + + AppHttpCodeEnum(int code, String errorMessage){ + this.code = code; + this.msg = errorMessage; + } + + public int getCode() { + return code; + } + + public String getMsg() { + return msg; + } +} diff --git a/resultException/src/main/java/com/duan/pojo/ResponseResult.java b/resultException/src/main/java/com/duan/pojo/ResponseResult.java new file mode 100644 index 0000000000000000000000000000000000000000..a858aafc17efa33a40f3b03cc8bfbf9654370492 --- /dev/null +++ b/resultException/src/main/java/com/duan/pojo/ResponseResult.java @@ -0,0 +1,137 @@ +package com.duan.pojo; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + * @author db + * @version 1.0 + * @description Result + * @since 2023/12/19 + */ +@Data +public class ResponseResult implements Serializable { + + private static final long serialVersionUID = 2233637474601103587L; + + // 接口响应状态码 + private Integer code; + + // 接口响应信息 + private String msg; + + // 接口响应的数据 + private T data; + + public ResponseResult() { + this.code = AppHttpCodeEnum.SUCCESS.getCode(); + this.msg = AppHttpCodeEnum.SUCCESS.getMsg(); + } + + public ResponseResult(Integer code, T data) { + this.code = code; + this.data = data; + } + + public ResponseResult(Integer code, String msg, T data) { + this.code = code; + this.msg = msg; + this.data = data; + } + + public ResponseResult(Integer code, String msg) { + this.code = code; + this.msg = msg; + } + + public static ResponseResult errorResult(int code, String msg) { + ResponseResult result = new ResponseResult(); + return result.error(code, msg); + } + + public static ResponseResult okResult() { + ResponseResult result = new ResponseResult(); + return result; + } + + public static ResponseResult okResult(int code, String msg) { + ResponseResult result = new ResponseResult(); + return result.ok(code, null, msg); + } + + public static ResponseResult okResult(Object data) { + ResponseResult result = setAppHttpCodeEnum(AppHttpCodeEnum.SUCCESS, AppHttpCodeEnum.SUCCESS.getMsg()); + if (data != null) { + result.setData(data); + } + return result; + } + + public static ResponseResult errorResult(AppHttpCodeEnum enums) { + return setAppHttpCodeEnum(enums, enums.getMsg()); + } + + public static ResponseResult errorResult(AppHttpCodeEnum enums, String msg) { + return setAppHttpCodeEnum(enums, msg); + } + + public static ResponseResult setAppHttpCodeEnum(AppHttpCodeEnum enums) { + return okResult(enums.getCode(), enums.getMsg()); + } + + private static ResponseResult setAppHttpCodeEnum(AppHttpCodeEnum enums, String msg) { + return okResult(enums.getCode(), msg); + } + + public ResponseResult error(Integer code, String msg) { + this.code = code; + this.msg = msg; + return this; + } + + public ResponseResult ok(Integer code, T data) { + this.code = code; + this.data = data; + return this; + } + + public ResponseResult ok(Integer code, T data, String msg) { + this.code = code; + this.data = data; + this.msg = msg; + return this; + } + + public ResponseResult ok(T data) { + this.data = data; + return this; + } + + public Integer getCode() { + return code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMsg() { + return msg; + } + + public void setMsg(String msg) { + this.msg = msg; + } + + public T getData() { + return data; + } + + public void setData(T data) { + this.data = data; + } + +} diff --git a/resultException/src/main/java/com/duan/pojo/User.java b/resultException/src/main/java/com/duan/pojo/User.java new file mode 100644 index 0000000000000000000000000000000000000000..1895461f53a2e2cacba36ff0da269fb6f194dda3 --- /dev/null +++ b/resultException/src/main/java/com/duan/pojo/User.java @@ -0,0 +1,19 @@ +package com.duan.pojo; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author db + * @version 1.0 + * @description User + * @since 2023/12/19 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class User { + private String username; + private String password; +} diff --git a/resultException/src/main/java/com/duan/utils/JWTUtils.java b/resultException/src/main/java/com/duan/utils/JWTUtils.java new file mode 100644 index 0000000000000000000000000000000000000000..e5b24d1a17861aace3bcdabfc58f89847af75876 --- /dev/null +++ b/resultException/src/main/java/com/duan/utils/JWTUtils.java @@ -0,0 +1,45 @@ +package com.duan.utils; + +import io.jsonwebtoken.Claims; +import io.jsonwebtoken.Jwts; +import io.jsonwebtoken.SignatureAlgorithm; + +import java.util.Date; +import java.util.Map; + +/** + * @author db + * @version 1.0 + * @description JWTUtils + * @since 2023/12/31 + */ +public class JWTUtils { + + // 密钥 + private static String signKey = "cxykk1217"; + // 过期时间 + private static Long expire = 1000L*60*30; // 30分钟 + + /** + * 生成JWT + * @param claims JWT第二部分负载payload中存储的内容 + * @return + */ + public static String generateJwt(Map claims){ + String jwt = Jwts.builder().signWith(SignatureAlgorithm.HS256, signKey) + .addClaims(claims) + .setExpiration(new Date(System.currentTimeMillis() + expire)) + .compact(); + + return jwt; + } + + public static Claims parseJWT(String jwt){ + Claims claims = Jwts.parser().setSigningKey(signKey) + .parseClaimsJws(jwt) + .getBody(); + return claims; + } + + +} diff --git a/resultException/src/main/resources/application-dev.yml b/resultException/src/main/resources/application-dev.yml new file mode 100644 index 0000000000000000000000000000000000000000..8b137891791fe96927ad78e64b0aad7bded08bdc --- /dev/null +++ b/resultException/src/main/resources/application-dev.yml @@ -0,0 +1 @@ + diff --git a/resultException/src/main/resources/application.yml b/resultException/src/main/resources/application.yml new file mode 100644 index 0000000000000000000000000000000000000000..a082a0ac1f097c423d6f956096565948c8889276 --- /dev/null +++ b/resultException/src/main/resources/application.yml @@ -0,0 +1,8 @@ +server: + port: 8086 + servlet: + context-path: /resultException + +spring: + profiles: + active: dev diff --git a/rztest/pom.xml b/rztest/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..c3f2649638fca06f435cb19b3d0eb790f3243649 --- /dev/null +++ b/rztest/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + com.duan + rztest + 1.0-SNAPSHOT + + + org.springframework.boot + spring-boot-starter-parent + 2.4.3 + + + + + org.springframework.boot + spring-boot-starter + 2.4.3 + + + + org.springframework.boot + spring-boot-starter-web + 2.4.3 + + + + org.projectlombok + lombok + 1.18.2 + + + + junit + junit + 4.13.2 + test + + + + com.alibaba + fastjson + 1.2.50 + + + + com.google.guava + guava + 20.0 + + + + org.aspectj + aspectjweaver + + + + org.apache.commons + commons-lang3 + + + org.assertj + assertj-core + + + + \ No newline at end of file diff --git a/rztest/src/main/java/com/duan/RZTestApplication.java b/rztest/src/main/java/com/duan/RZTestApplication.java new file mode 100644 index 0000000000000000000000000000000000000000..945fd65767efb05ee198bed2203846fdf517cb4b --- /dev/null +++ b/rztest/src/main/java/com/duan/RZTestApplication.java @@ -0,0 +1,17 @@ +package com.duan; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +/** + * @author db + * @version 1.0 + * @description RZTestApplication + * @since 2024/1/9 + */ +@SpringBootApplication +public class RZTestApplication { + public static void main(String[] args) { + SpringApplication.run(RZTestApplication.class); + } +} diff --git a/rztest/src/main/java/com/duan/aspect/LoggingAspect.java b/rztest/src/main/java/com/duan/aspect/LoggingAspect.java new file mode 100644 index 0000000000000000000000000000000000000000..45c5a9cc0e09ad6a21955faf9bb72efadd2d29f8 --- /dev/null +++ b/rztest/src/main/java/com/duan/aspect/LoggingAspect.java @@ -0,0 +1,123 @@ +package com.duan.aspect; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.duan.utils.DateUtils; +import com.duan.utils.IpUtils; +import com.duan.utils.LocalIP; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.time.DateFormatUtils; +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.stereotype.Component; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import javax.servlet.http.HttpServletRequest; +import java.util.Date; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.Map; +import java.util.stream.IntStream; + +/** + * @author db + * @version 1.0 + * @description LoggingAspect + * @since 2024/1/9 + */ +@Slf4j +@Aspect +@Component +public class LoggingAspect { + + /** + * com.kingsware.aiam.manage.controller 包中公共方法的切入点 + */ +// @Pointcut("execution(public * com.kingsware.aiam.manage.controller.*.*(..))") + @Pointcut("execution(public * com.duan.controller.*.*(..))") + public void loggingPointcut(){ + // 暂不用处理 + } + + @Around("loggingPointcut()") + public Object around(ProceedingJoinPoint pjp) throws Throwable{ + // 获取类名 + String className = pjp.getTarget().getClass().getTypeName(); + // 获取方法名 + String methodName = pjp.getSignature().getName(); + // 获取参数名 + String[] parameterNames = ((MethodSignature) pjp.getSignature()).getParameterNames(); + + Object result = null; + // 获取参数值 + Object[] args = pjp.getArgs(); + + // 获取请求 + HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); + // 获取请求的url +// String url = request.getRequestURL().toString(); + String url = IpUtils.getIpAddr(request); + +// String requestIP = IpUtils.getIpAddr(request); + + + + // 请求参数,以参数名和值为键值对 + Map paramMap = new HashMap<>(); + IntStream.range(0, parameterNames.length).forEach(i->paramMap.put(parameterNames[i], args[i])); + + // header参数 + Enumeration headerNames = request.getHeaderNames(); + Map headerMap = new HashMap<>(); + while (headerNames.hasMoreElements()){ + String headerName = headerNames.nextElement(); + String headerValue = request.getHeader(headerName); + headerMap.put(headerName, headerValue); + } + + // 打印请求参数,记录起始时间 + long start = System.currentTimeMillis(); + + try { + result = pjp.proceed(); + System.out.println(result.toString()); +// } catch (ManageException e) { +// JSONObject json = new JSONObject(); +// json.put("code",e.getCode()); +// json.put("logType","exception"); +// json.put("errMsg",e.getMsg()); +// json.put("exception",e.getMessage()); +// log.error(json.toJSONString()); +// throw e; + } catch (Exception e) { + JSONObject json = new JSONObject(); + json.put("code","500"); + json.put("logType","exception"); + json.put("errMsg","异常发生"); + json.put("exception",e.getMessage()); + log.error(json.toJSONString()); + throw e; + } + + // 获取执行完的时间 打印返回报文 + JSONObject json = new JSONObject(); + json.put("logType","ACCESS"); + json.put("hostName","znshxt"); + json.put("hostIp", LocalIP.getIpAddress()); + json.put("requestIp",url); + json.put("requestTime", DateFormatUtils.format(new Date(),"yyyy-MM-dd HH:mm:ss.SSS")); + json.put("requestParams", JSON.toJSON(paramMap)); + json.put("responseTime", DateFormatUtils.format(new Date(),"yyyy-MM-dd HH:mm:ss.SSS")); + json.put("responseParams",JSON.toJSON(result)); + json.put("consumeTime",System.currentTimeMillis() - start); +// json.put("httpMethod",request.getMethod()); +// json.put("className",className); +// json.put("classMethod",methodName); + log.info(json.toJSONString()); + return result; + } +} diff --git a/rztest/src/main/java/com/duan/config/HostIpConfig.java b/rztest/src/main/java/com/duan/config/HostIpConfig.java new file mode 100644 index 0000000000000000000000000000000000000000..3f5ae28b525e4662135780b6e4c3ea6e8d87a12f --- /dev/null +++ b/rztest/src/main/java/com/duan/config/HostIpConfig.java @@ -0,0 +1,19 @@ +package com.duan.config; + +import ch.qos.logback.classic.pattern.ClassicConverter; +import ch.qos.logback.classic.spi.ILoggingEvent; +import com.duan.utils.LocalIP; + +/** + * @author db + * @version 1.0 + * @description HostIpConfig 获得主机IP地址 + * @since 2024/1/9 + */ +public class HostIpConfig extends ClassicConverter { + @Override + public String convert(ILoggingEvent event) { + String hostIP = LocalIP.getIpAddress(); + return hostIP; + } +} diff --git a/rztest/src/main/java/com/duan/config/RequestIpConfig.java b/rztest/src/main/java/com/duan/config/RequestIpConfig.java new file mode 100644 index 0000000000000000000000000000000000000000..95c6d9ce56acfaf6427bf3b2a8a7499e3fcdb9f9 --- /dev/null +++ b/rztest/src/main/java/com/duan/config/RequestIpConfig.java @@ -0,0 +1,29 @@ +package com.duan.config; + +import ch.qos.logback.classic.pattern.ClassicConverter; +import ch.qos.logback.classic.spi.ILoggingEvent; +import com.duan.utils.IpUtils; +import org.springframework.web.context.request.RequestAttributes; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import javax.servlet.http.HttpServletRequest; + +/** + * @author db + * @version 1.0 + * @description RequestIpConfig 获得请求IP + * @since 2024/1/9 + */ +public class RequestIpConfig extends ClassicConverter { + @Override + public String convert(ILoggingEvent event) { + RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes(); + if (requestAttributes == null) { + return "127.0.0.1"; + } + HttpServletRequest request = ((ServletRequestAttributes)requestAttributes).getRequest(); + String requestIP = IpUtils.getIpAddr(request); + return requestIP; + } +} diff --git a/rztest/src/main/java/com/duan/config/UUIDConfig.java b/rztest/src/main/java/com/duan/config/UUIDConfig.java new file mode 100644 index 0000000000000000000000000000000000000000..2d2800b95d0ed68f0d3056894ab783d0d316fa19 --- /dev/null +++ b/rztest/src/main/java/com/duan/config/UUIDConfig.java @@ -0,0 +1,19 @@ +package com.duan.config; + +import ch.qos.logback.classic.pattern.ClassicConverter; +import ch.qos.logback.classic.spi.ILoggingEvent; +import com.alibaba.fastjson.JSONObject; + +/** + * @author db + * @version 1.0 + * @description UUIDConfig + * @since 2024/1/9 + */ +public class UUIDConfig extends ClassicConverter { + @Override + public String convert(ILoggingEvent iLoggingEvent) { + + return "12344556"; + } +} diff --git a/rztest/src/main/java/com/duan/config/WebConfig.java b/rztest/src/main/java/com/duan/config/WebConfig.java new file mode 100644 index 0000000000000000000000000000000000000000..e32b8a108a76cce57688cad44d7e618697769dae --- /dev/null +++ b/rztest/src/main/java/com/duan/config/WebConfig.java @@ -0,0 +1,24 @@ +package com.duan.config; + +import com.duan.interceptor.TraceInterceptor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; + +/** + * @author db + * @version 1.0 + * @description WebConfig + * @since 2024/1/9 + */ +@Configuration +public class WebConfig extends WebMvcConfigurerAdapter { + @Autowired + private TraceInterceptor traceInterceptor; + + @Override + public void addInterceptors(InterceptorRegistry registry) { + registry.addInterceptor(traceInterceptor); + } +} diff --git a/rztest/src/main/java/com/duan/controller/LoginController.java b/rztest/src/main/java/com/duan/controller/LoginController.java new file mode 100644 index 0000000000000000000000000000000000000000..85eb2dfbd583c3804febfc0889253aacbbb49b1b --- /dev/null +++ b/rztest/src/main/java/com/duan/controller/LoginController.java @@ -0,0 +1,30 @@ +package com.duan.controller; + +import com.duan.pojo.Result; +import com.duan.pojo.User; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +/** + * @author db + * @version 1.0 + * @description LoginController + * @since 2023/12/19 + */ +@RestController +@Slf4j +public class LoginController { + + @PostMapping("/login") + public Result login(@RequestBody User user){ + log.info("这是正常日志"); + log.error("这是错误日志"); + if("admin".equals(user.getUsername()) && "123456".equals(user.getPassword())){ + return Result.success("ok"); + } + + return Result.error(); + } +} diff --git a/rztest/src/main/java/com/duan/interceptor/TraceInterceptor.java b/rztest/src/main/java/com/duan/interceptor/TraceInterceptor.java new file mode 100644 index 0000000000000000000000000000000000000000..a9af6d222ada96f39b4c63b0e874804fe2aa564a --- /dev/null +++ b/rztest/src/main/java/com/duan/interceptor/TraceInterceptor.java @@ -0,0 +1,29 @@ +package com.duan.interceptor; + +import org.slf4j.MDC; +import org.springframework.stereotype.Component; +import org.springframework.web.servlet.HandlerInterceptor; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.UUID; + +/** + * @author db + * @version 1.0 + * @description TraceInterceptor + * @since 2024/1/9 + */ +@Component +public class TraceInterceptor implements HandlerInterceptor { + @Override + public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object handler) throws Exception { + MDC.put("traceid", UUID.randomUUID().toString()); + return true; + } + + @Override + public void afterCompletion(HttpServletRequest httpServletRequest,HttpServletResponse httpServletResponse,Object handler,Exception e) throws Exception { + MDC.remove("traceid"); + } +} diff --git a/rztest/src/main/java/com/duan/pojo/Result.java b/rztest/src/main/java/com/duan/pojo/Result.java new file mode 100644 index 0000000000000000000000000000000000000000..9d93e3d1ef0059613dd029afe59d7d4f1f356e2b --- /dev/null +++ b/rztest/src/main/java/com/duan/pojo/Result.java @@ -0,0 +1,34 @@ +package com.duan.pojo; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author db + * @version 1.0 + * @description Result + * @since 2023/12/19 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class Result { + + private Integer code; + private String msg; + private Object data; + + public static Result success(){ + return new Result(1,"success",null); + } + + public static Result success(Object data){ + return new Result(1,"success",data); + } + + public static Result error(){ + return new Result(0,"success",null); + } + +} diff --git a/rztest/src/main/java/com/duan/pojo/User.java b/rztest/src/main/java/com/duan/pojo/User.java new file mode 100644 index 0000000000000000000000000000000000000000..1895461f53a2e2cacba36ff0da269fb6f194dda3 --- /dev/null +++ b/rztest/src/main/java/com/duan/pojo/User.java @@ -0,0 +1,19 @@ +package com.duan.pojo; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author db + * @version 1.0 + * @description User + * @since 2023/12/19 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class User { + private String username; + private String password; +} diff --git a/rztest/src/main/java/com/duan/utils/DateUtils.java b/rztest/src/main/java/com/duan/utils/DateUtils.java new file mode 100644 index 0000000000000000000000000000000000000000..a7255923f2759be5f80441a78bde792e7d3fc489 --- /dev/null +++ b/rztest/src/main/java/com/duan/utils/DateUtils.java @@ -0,0 +1,396 @@ +package com.duan.utils; + +import org.apache.commons.lang3.time.DateFormatUtils; + +import java.lang.management.ManagementFactory; +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.*; +import java.time.format.DateTimeFormatter; +import java.util.Calendar; +import java.util.Date; +import java.util.TimeZone; + +/** + * @author lwh + * @date 2020/2/17 14:48 + * @description 日期相关的工具类 + */ +public class DateUtils extends org.apache.commons.lang3.time.DateUtils { + + private static final String TIME_ZONE ="GMT+0800"; + private static final String FORMAT_DATE = "yyyy-MM-dd"; + private static final String FORMAT_DATE_TIME = "yyyy-MM-dd HH:mm:ss"; + private static final ZoneId ZONEID = ZoneId.of(ZoneId.SHORT_IDS.get("CTT")); + private static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + + public static String YYYY = "yyyy"; + + public static String YYYY_MM = "yyyy-MM"; + + public static String YYYY_MM_DD = "yyyy-MM-dd"; + + public static String YYYYMMDDHHMMSS = "yyyyMMddHHmmss"; + + public static String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss"; + + private static String[] parsePatterns = { + "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM", + "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM", + "yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM"}; + + + + + + public static final String getTime() + { + return dateTimeNow(YYYY_MM_DD_HH_MM_SS); + } + + public static final String dateTimeNow() + { + return dateTimeNow(YYYYMMDDHHMMSS); + } + + public static final String dateTimeNow(final String format) + { + return parseDateToStr(format, new Date()); + } + + public static final String dateTime(final Date date) + { + return parseDateToStr(YYYY_MM_DD, date); + } + + public static final String parseDateToStr(final String format, final Date date) + { + return new SimpleDateFormat(format).format(date); + } + + public static final Date dateTime(final String format, final String ts) + { + try + { + return new SimpleDateFormat(format).parse(ts); + } + catch (ParseException e) + { + throw new RuntimeException(e); + } + } + + public static Date getCurDate() + { + return new Date(); + } + + /** + * 日期路径 即年/月/日 如2018/08/08 + */ + public static final String datePath() + { + Date now = new Date(); + return DateFormatUtils.format(now, "yyyy/MM/dd"); + } + + /** + * 日期路径 即年/月/日 如20180808 + */ + public static final String dateTime() + { + Date now = new Date(); + return DateFormatUtils.format(now, "yyyyMMdd"); + } + + + + /** + * 获取服务器启动时间 + */ + public static Date getServerStartDate() + { + long time = ManagementFactory.getRuntimeMXBean().getStartTime(); + return new Date(time); + } + + /** + * 计算相差天数 + */ + public static int differentDaysByMillisecond(Date date1, Date date2) + { + return Math.abs((int) ((date2.getTime() - date1.getTime()) / (1000 * 3600 * 24))); + } + + /** + * 计算两个时间差 + */ + public static String getDatePoor(Date endDate, Date nowDate) + { + long nd = 1000 * 24 * 60 * 60; + long nh = 1000 * 60 * 60; + long nm = 1000 * 60; + // long ns = 1000; + // 获得两个时间的毫秒时间差异 + long diff = endDate.getTime() - nowDate.getTime(); + // 计算差多少天 + long day = diff / nd; + // 计算差多少小时 + long hour = diff % nd / nh; + // 计算差多少分钟 + long min = diff % nd % nh / nm; + // 计算差多少秒//输出结果 + // long sec = diff % nd % nh % nm / ns; + return day + "天" + hour + "小时" + min + "分钟"; + } + + /** + * 增加 LocalDateTime ==> Date + */ + public static Date toDate(LocalDateTime temporalAccessor) + { + ZonedDateTime zdt = temporalAccessor.atZone(ZoneId.systemDefault()); + return Date.from(zdt.toInstant()); + } + + /** + * 增加 LocalDate ==> Date + */ + public static Date toDate(LocalDate temporalAccessor) + { + LocalDateTime localDateTime = LocalDateTime.of(temporalAccessor, LocalTime.of(0, 0, 0)); + ZonedDateTime zdt = localDateTime.atZone(ZoneId.systemDefault()); + return Date.from(zdt.toInstant()); + } + /** + * 获得当前日期 格式 yyyy-MM-dd HH:mm:ss + */ + public static String getNowDate() { + return formatter.format(Instant.now()); + } + + /** + * 时间戳转日期 格式 yyyy-MM-dd HH:mm:ss + */ + public static String getDate(long time) { + LocalDateTime localDateTime = LocalDateTime.ofEpochSecond(time/1000, (int) (time%1000), ZoneOffset.ofHours(8)); + return formatter.format(localDateTime); + } + + /** + * 根据格式化字符显示日期 + * @param date + * @param format + * @return + * @throws Exception + */ + public static String formatDate(Date date,String format) throws Exception{ + DateFormat sdf = new SimpleDateFormat(format); + String result = sdf.format(date); + return result; + } + /** + * 根据格式化字符显示当前日期 + * + * @param format 格式字符串 + * @return String 当前日期 + */ + public static String formatDate(String format) { + return DateFormatUtils.format(getTimeInMillis(), format, + TimeZone.getTimeZone(TIME_ZONE)); + } + + /** + * 取得当前日期毫秒数 + * + * @return long 当前日期毫秒数 + */ + public static long getTimeInMillis() { + Calendar cl1=Calendar.getInstance(TimeZone.getTimeZone(TIME_ZONE)); + return cl1.getTimeInMillis(); + } + + /** + * 得到当前日期 yyyy-MM-dd HH:mm:ss + * + * @return String + */ + public static String getCurrentDate() { + return formatDate(FORMAT_DATE_TIME); + } + + /** + * 将字符串按照格式转换成日期格式 + * @param format + * @param date + * @return + */ + public static Date parseDate(SimpleDateFormat format, String date) { + Date dt = null; + try { + format.setTimeZone(TimeZone.getTimeZone("GMT+0800")); + format.setLenient(false); + dt = format.parse(date); + } catch (Exception e) { + e.printStackTrace(); + throw new RuntimeException(e); + } + return dt; + } + + /** + * 将字符串转换成日期格式 + * @param dateStr + * @return + */ + public static Date parseDate(String dateStr) { + Date date = null; + if (null == dateStr || 0 == dateStr.length()){ + return null; + } + + if (dateStr.length() > 10){ + SimpleDateFormat DATE_TIME_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + date =parseDate(DATE_TIME_FORMAT,dateStr); + }else{ + SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd"); + date = parseDate(DATE_FORMAT,dateStr); + } + + return date; + } + /** + * + * 得到时间yyyy-MM-dd HH:mm:ss + * 把字符串换成特定格式的时间。 + * curdatetime 时间戳 + * dtype 单位 + * diff 数量 + * @return String + */ + public static String getDateTime(String Dtype,int diff) { + String dateTime=null; + try{ + + Calendar calendar=Calendar.getInstance(TimeZone.getTimeZone(TIME_ZONE)); + + if (Dtype.equalsIgnoreCase("D")){ + calendar.add(Calendar.DATE, diff); + }else if (Dtype.equalsIgnoreCase("H")){ + calendar.add(Calendar.HOUR, diff); + }else if (Dtype.equalsIgnoreCase("MIN")){ + calendar.add(Calendar.MINUTE, diff); + }else if (Dtype.equalsIgnoreCase("S")){ + calendar.add(Calendar.SECOND, diff); + }else if (Dtype.equalsIgnoreCase("M")){ + calendar.add(Calendar.MONTH, diff); + }else if (Dtype.equalsIgnoreCase("Y")){ + calendar.add(Calendar.YEAR, diff); + } + + dateTime= DateUtils.formatDate(calendar.getTime(),"yyyy-MM-dd HH:mm:ss"); + + }catch(Exception e){ + e.printStackTrace(); + } + + return dateTime; + + } + /** + * + * 得到时间yyyy-MM-dd HH:mm:ss + * 把字符串换成特定格式的时间。 + * curdatetime 时间戳 + * dtype 单位 + * diff 数量 + * @return String + */ + public static String getDateTime(String curDateTime,String Dtype,int diff) { + String dateTime=null; + try{ + Date cDateTime= DateUtils.parseDate(curDateTime); + + Calendar calendar=Calendar.getInstance(TimeZone.getTimeZone(TIME_ZONE)); + calendar.setTime(cDateTime); + + if (Dtype.equalsIgnoreCase("D")){ + calendar.add(Calendar.DATE, diff); + }else if (Dtype.equalsIgnoreCase("H")){ + calendar.add(Calendar.HOUR, diff); + }else if (Dtype.equalsIgnoreCase("MIN")){ + calendar.add(Calendar.MINUTE, diff); + }else if (Dtype.equalsIgnoreCase("S")){ + calendar.add(Calendar.SECOND, diff); + }else if (Dtype.equalsIgnoreCase("M")){ + calendar.add(Calendar.MONTH, diff); + }else if (Dtype.equalsIgnoreCase("Y")){ + calendar.add(Calendar.YEAR, diff); + } + + dateTime= DateUtils.formatDate(calendar.getTime(),"yyyy-MM-dd HH:mm:ss"); + + }catch(Exception e){ + e.printStackTrace(); + } + + return dateTime; + + } + /** + * 得到当前日期 yyyy-MM-dd + * + * @return String + */ + public static String getCurrentDay() { + return formatDate(FORMAT_DATE); + } + + /** + * 取得当前日期 + * + * @return java.sql.Date + */ + public static Date getDate() { + Calendar cl1=Calendar.getInstance(TimeZone.getTimeZone(TIME_ZONE)); + return cl1.getTime(); + } + + public static long instant2systemTimeMillis(Instant instant) { + return instant.toEpochMilli(); + } + + public static Instant systemTimeMillis2Instant(long systemTimeMillis) { + Date date = new Date(systemTimeMillis); + return date.toInstant(); + } + + public static Date instant2Date(Instant instant) { + return new Date(instant.toEpochMilli()); + } + + public static Instant date2Instant(Date date) { + return date.toInstant(); + } + + public static LocalDateTime instant2LocalDateTime(Instant instant) { + return instant.atZone(ZONEID).toLocalDateTime(); + } + + public static Instant localDateTime2Instant(LocalDateTime localDateTime) { + return localDateTime.atZone(ZONEID).toInstant(); + } + + public static LocalDateTime date2LocalDateTime(Date date) { + Instant instant = date2Instant(date); + return instant.atZone(ZONEID).toLocalDateTime(); + } + + public static Date localDateTime2Date(LocalDateTime localDateTime) { + return instant2Date(localDateTime.atZone(ZONEID).toInstant()); + } + public static LocalDateTime localDate2LocalDateTime(LocalDate localDate) { + return localDate.atStartOfDay(); + } +} diff --git a/rztest/src/main/java/com/duan/utils/IpUtils.java b/rztest/src/main/java/com/duan/utils/IpUtils.java new file mode 100644 index 0000000000000000000000000000000000000000..6f212592d15534a9a25b3d47206fd6176cae8ca8 --- /dev/null +++ b/rztest/src/main/java/com/duan/utils/IpUtils.java @@ -0,0 +1,51 @@ +package com.duan.utils; + + +import com.google.common.base.Strings; + +import javax.servlet.http.HttpServletRequest; + +public class IpUtils { + + private IpUtils(){ + + } + + public static String getIpAddr(HttpServletRequest request) { + String xIp = request.getHeader("X-Real-IP"); + String xFor = request.getHeader("X-Forwarded-For"); + + if (!Strings.isNullOrEmpty(xFor) && !"unKnown".equalsIgnoreCase(xFor)) { + //多次反向代理后会有多个ip值,第一个ip才是真实ip + int index = xFor.indexOf(","); + if (index != -1) { + return xFor.substring(0, index); + } else { + return xFor; + } + } + xFor = xIp; + if (!Strings.isNullOrEmpty(xFor) && !"unKnown".equalsIgnoreCase(xFor)) { + return xFor; + } + if (Strings.nullToEmpty(xFor).trim().isEmpty() || "unknown".equalsIgnoreCase(xFor)) { + xFor = request.getHeader("Proxy-Client-IP"); + } + if (Strings.nullToEmpty(xFor).trim().isEmpty() || "unknown".equalsIgnoreCase(xFor)) { + xFor = request.getHeader("WL-Proxy-Client-IP"); + } + if (Strings.nullToEmpty(xFor).trim().isEmpty() || "unknown".equalsIgnoreCase(xFor)) { + xFor = request.getHeader("HTTP_CLIENT_IP"); + } + if (Strings.nullToEmpty(xFor).trim().isEmpty() || "unknown".equalsIgnoreCase(xFor)) { + xFor = request.getHeader("HTTP_X_FORWARDED_FOR"); + } + if (Strings.nullToEmpty(xFor).trim().isEmpty() || "unknown".equalsIgnoreCase(xFor)) { + xFor = request.getRemoteAddr(); + } + + + return "0:0:0:0:0:0:0:1".equals(xFor) ? "127.0.0.1" : xFor; + } + +} diff --git a/rztest/src/main/java/com/duan/utils/LocalIP.java b/rztest/src/main/java/com/duan/utils/LocalIP.java new file mode 100644 index 0000000000000000000000000000000000000000..3d30cae792fac5531321659840167bf54e0144d5 --- /dev/null +++ b/rztest/src/main/java/com/duan/utils/LocalIP.java @@ -0,0 +1,72 @@ +package com.duan.utils; + +import java.net.Inet4Address; +import java.net.InetAddress; +import java.net.NetworkInterface; +import java.util.Enumeration; + +public class LocalIP { + public static InetAddress getLocalHostExactAddress() { + try { + InetAddress candidateAddress = null; + + // 从网卡中获取IP + Enumeration networkInterfaces = NetworkInterface.getNetworkInterfaces(); + while (networkInterfaces.hasMoreElements()) { + NetworkInterface iface = networkInterfaces.nextElement(); + // 该网卡接口下的ip会有多个,也需要一个个的遍历,找到自己所需要的 + for (Enumeration inetAddrs = iface.getInetAddresses(); inetAddrs.hasMoreElements(); ) { + InetAddress inetAddr = inetAddrs.nextElement(); + // 排除loopback回环类型地址(不管是IPv4还是IPv6 只要是回环地址都会返回true) + if (!inetAddr.isLoopbackAddress()) { + if (inetAddr.isSiteLocalAddress()) { + // 如果是site-local地址,就是它了 就是我们要找的 + // ~~~~~~~~~~~~~绝大部分情况下都会在此处返回你的ip地址值~~~~~~~~~~~~~ + return inetAddr; + } + + // 若不是site-local地址 那就记录下该地址当作候选 + if (candidateAddress == null) { + candidateAddress = inetAddr; + } + + } + } + } + + // 如果出去loopback回环地之外无其它地址了,那就回退到原始方案吧 + return candidateAddress == null ? InetAddress.getLocalHost() : candidateAddress; + } catch (Exception e) { + e.printStackTrace(); + } + return null; + + } + + public static String getIpAddress() { + try { + //从网卡中获取IP + Enumeration allNetInterfaces = NetworkInterface.getNetworkInterfaces(); + InetAddress ip; + while (allNetInterfaces.hasMoreElements()) { + NetworkInterface netInterface = (NetworkInterface) allNetInterfaces.nextElement(); + //用于排除回送接口,非虚拟网卡,未在使用中的网络接口 + if (!netInterface.isLoopback() && !netInterface.isVirtual() && netInterface.isUp()) { + //返回和网络接口绑定的所有IP地址 + Enumeration addresses = netInterface.getInetAddresses(); + while (addresses.hasMoreElements()) { + ip = addresses.nextElement(); + if (ip instanceof Inet4Address) { + return ip.getHostAddress(); + } + } + } + } + } catch (Exception e) { + System.err.println("IP地址获取失败" + e.toString()); + } + return ""; + } + +} + diff --git a/rztest/src/main/resources/application-dev.yml b/rztest/src/main/resources/application-dev.yml new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/rztest/src/main/resources/application-prod.yml b/rztest/src/main/resources/application-prod.yml new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/rztest/src/main/resources/application.yml b/rztest/src/main/resources/application.yml new file mode 100644 index 0000000000000000000000000000000000000000..997849322431fbbf20d9e92093b5e732413b391f --- /dev/null +++ b/rztest/src/main/resources/application.yml @@ -0,0 +1,9 @@ +server: + port: 8083 + servlet: + context-path: /rz # 应用名 localhost:8090/logback + +spring: + profiles: + active: prod + diff --git a/rztest/src/main/resources/logback-spring.xml b/rztest/src/main/resources/logback-spring.xml new file mode 100644 index 0000000000000000000000000000000000000000..d4e67d8e56a491b67a50f891d69d614ad006e870 --- /dev/null +++ b/rztest/src/main/resources/logback-spring.xml @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + + UTF-8 + + + + + + + + + + + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + + + + + + + ${LOG_HOME}/info.log + + + + ${LOG_HOME}/info.%d{yyyy-MM-dd}.log + 15 + + 50GB + 5G + + + UTF-8 + + ${CONSOLE_LOG_PATTERN} + + + + + + INFO + ERROR + + + +   +     +         +         0 +         +         256 +         +         + +     + + + + + + + + + \ No newline at end of file diff --git a/springboot-upload-download/pom.xml b/springboot-upload-download/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..a52315511cfb4759010f7542031ee9049575e288 --- /dev/null +++ b/springboot-upload-download/pom.xml @@ -0,0 +1,51 @@ + + + 4.0.0 + + com.duan + springboot-upload-download + 1.0-SNAPSHOT + + + + + org.springframework.boot + spring-boot-starter + 2.4.3 + + + + org.springframework.boot + spring-boot-starter-web + 2.4.3 + + + + org.projectlombok + lombok + 1.18.2 + + + + junit + junit + 4.13.2 + test + + + + commons-fileupload + commons-fileupload + 1.4 + + + + + + + + + + \ No newline at end of file diff --git a/springboot-upload-download/src/main/java/com/duan/UploadDownloadApplication.java b/springboot-upload-download/src/main/java/com/duan/UploadDownloadApplication.java new file mode 100644 index 0000000000000000000000000000000000000000..edc49bdc97904c24d891a9e76f00d0aed83b8140 --- /dev/null +++ b/springboot-upload-download/src/main/java/com/duan/UploadDownloadApplication.java @@ -0,0 +1,18 @@ +package com.duan; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +/** + * @author db + * @version 1.0 + * @description UplaodDownlaodApplication + * @since 2023/8/17 + */ +@SpringBootApplication +public class UploadDownloadApplication { + + public static void main(String[] args) { + SpringApplication.run(UploadDownloadApplication.class,args); + } +} diff --git a/springboot-upload-download/src/main/java/com/duan/controller/UploadDownloadController.java b/springboot-upload-download/src/main/java/com/duan/controller/UploadDownloadController.java new file mode 100644 index 0000000000000000000000000000000000000000..71445d24248afd16160256570d07a41dc1e7bf58 --- /dev/null +++ b/springboot-upload-download/src/main/java/com/duan/controller/UploadDownloadController.java @@ -0,0 +1,37 @@ +package com.duan.controller; + +import com.duan.service.UploadDownloadService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; + +/** + * @author db + * @version 1.0 + * @description UploadDownloadController + * @since 2023/8/19 + */ +@RestController +public class UploadDownloadController { + + @Autowired + private UploadDownloadService uploadDownloadService; + + + @PostMapping("/uploadDocument") + public String uploadDocument(MultipartFile file){ + uploadDownloadService.uploadDocument(file); + return "上传成功"; + } + + @PostMapping("/download") + public String download(HttpServletResponse response) { + String filePath = "D:\\RPAtest\\test.mp4"; + uploadDownloadService.download(filePath,response); + return "下载成功"; + } +} diff --git a/springboot-upload-download/src/main/java/com/duan/service/UploadDownloadService.java b/springboot-upload-download/src/main/java/com/duan/service/UploadDownloadService.java new file mode 100644 index 0000000000000000000000000000000000000000..9ee1c6073a1988e602015caea6221d97b9763be1 --- /dev/null +++ b/springboot-upload-download/src/main/java/com/duan/service/UploadDownloadService.java @@ -0,0 +1,28 @@ +package com.duan.service; + +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * @author db + * @version 1.0 + * @description uploadDownloadService + * @since 2023/8/17 + */ +public interface UploadDownloadService { + + /** + * 上传文件 + * @param file + */ + void uploadDocument(MultipartFile file); + + + void download(String filePath, HttpServletResponse response) ; + + void downloadFromURL(String url,String savePath) ; +} diff --git a/springboot-upload-download/src/main/java/com/duan/service/impl/UploadDownloadServiceImpl.java b/springboot-upload-download/src/main/java/com/duan/service/impl/UploadDownloadServiceImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..756fd5ea0c402931eb3b64781efd30bb0d1a738d --- /dev/null +++ b/springboot-upload-download/src/main/java/com/duan/service/impl/UploadDownloadServiceImpl.java @@ -0,0 +1,167 @@ +package com.duan.service.impl; + +import com.duan.service.UploadDownloadService; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.io.IOUtils; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.HttpURLConnection; +import java.net.URL; +import java.net.URLEncoder; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.UUID; + +/** + * @author db + * @version 1.0 + * @description uploadDownloadServiceImpl + * @since 2023/8/17 + */ + +@Service +@Slf4j +public class UploadDownloadServiceImpl implements UploadDownloadService { + + + /** + * 上传文件要考虑的细节 + * 1、如何修改文件上传时文件名 UUID+文件后缀 + * 2、上传的文件放在当前日期的目录中 + * 3、考虑上传文件的大小限制 + * @param file + */ + @Override + public void uploadDocument(MultipartFile file) { + + + // 要上传的文件存放的地址 + String path = "D:\\test\\"; + + // 获得文件名称 + String name = file.getName(); + log.info("name {}",name); + + String originalFilename = file.getOriginalFilename(); + log.info("originalFilename {}",originalFilename); + + // 新文件名称 + String newFileName = UUID.randomUUID().toString().replace("-","") + originalFilename; + + // 以当前日期为文件夹名称,新建文件夹 + String currentDay = new SimpleDateFormat("yyyy-MM-dd").format(new Date()); + + // 存放上传文件的目录 + File newFile = new File(path,currentDay); + if(!newFile.exists()){ + newFile.mkdirs(); + } + try{ + file.transferTo(new File(newFile,newFileName)); + }catch (Exception e){ + e.printStackTrace(); + } + + + } + + @Override + public void download(String filePath, HttpServletResponse response) { + // 1、从指定目录中读取文件 + File file = new File(filePath); + + BufferedInputStream is = null; + ServletOutputStream os = null; + try{ + // 2、将文件读取为文件输入流 + is= new BufferedInputStream(new FileInputStream(file)); + + String fileName = file.getName(); + + // 获得响应流之前,设置文件以附件形式下载 attachment + response.setHeader("Content-Disposition", "attachment;filename="+ URLEncoder.encode(fileName,"UTF-8")); + // 3、获取输出流 + + os = response.getOutputStream(); + + // 4、输入流复制给输出流 + int len=0; + byte[] b = new byte[1024]; + while((len=is.read(b)) != -1){ + os.write(b,0,len); + } + }catch (Exception e){ + + }finally { + // 4. 关闭资源(如果有多个流,我们需要先关闭外面的流,再关闭内部的流) + try { + if (os != null) + os.close(); + } catch (IOException e) { + log.error("关闭输出流失败"); + } + try { + if (is != null) + is.close(); + } catch (IOException e) { + log.error("关闭输入流失败"); + } + } + + + } + + @Override + public void downloadFromURL(String urlAddress, String savePath) { + + // 获得文件名称 + String[] split = urlAddress.split("/"); + String fileName = split[split.length -1]; + + BufferedInputStream bis = null; + BufferedOutputStream bos = null; + try{ + URL url = new URL(urlAddress); + HttpURLConnection con = (HttpURLConnection) url.openConnection(); + con.setRequestMethod(con.getRequestMethod()); + con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); + con.setRequestProperty("User-Agent", "Mozilla/4.76"); + con.setRequestProperty("connection", "keep-alive"); + con.setDoOutput(true); + + // 将文件读取为文件输入流 + bis = new BufferedInputStream(con.getInputStream()); + + // 文件输出流 + bos = new BufferedOutputStream(new FileOutputStream(savePath+fileName)); + + // 3. 输入流复制给输出流 + int len=0; + byte[] b = new byte[1024]; + while((len=bis.read(b)) != -1){ + bos.write(b,0,len); + } + }catch (Exception e){ + log.error(e.getMessage()); + }finally { + // 4. 关闭资源(如果有多个流,我们需要先关闭外面的流,再关闭内部的流) + try { + if (bos != null) + bos.close(); + } catch (IOException e) { + log.error("关闭输出流失败"); + } + try { + if (bis != null) + bis.close(); + } catch (IOException e) { + log.error("关闭输入流失败"); + } + } + + } +} diff --git a/springboot-upload-download/src/main/resources/application.yml b/springboot-upload-download/src/main/resources/application.yml new file mode 100644 index 0000000000000000000000000000000000000000..dbb6ae74245ff1b20ba7cb56cafbc0f1e9d952e9 --- /dev/null +++ b/springboot-upload-download/src/main/resources/application.yml @@ -0,0 +1,8 @@ +server: + port: 9001 +spring: + servlet: + multipart: + max-request-size: 100MB # 运行请求传递文件大小最大 + max-file-size: 100MB # 运行服务器可以处理的最大文件大小 + diff --git a/springboot-upload-download/src/test/java/com/duan/FileTest.java b/springboot-upload-download/src/test/java/com/duan/FileTest.java new file mode 100644 index 0000000000000000000000000000000000000000..ed708957fb4a6fd4f1d85582799e761c93dcf789 --- /dev/null +++ b/springboot-upload-download/src/test/java/com/duan/FileTest.java @@ -0,0 +1,114 @@ +package com.duan; + +import org.junit.Test; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.util.Date; +import java.util.logging.SimpleFormatter; + +/** + * @author db + * @version 1.0 + * @description FileTest + * @since 2023/8/17 + */ +public class FileTest { + + @Test + public void test1(){ + File file = new File("D:\\RPAtest\\14960.png"); + String name = file.getName(); + System.out.println("文件名称:"+ name); + + String parent = file.getParent(); + System.out.println("文件的父名称" + parent); + + File parentFile = file.getParentFile(); + System.out.println("文件的父文件 " + parentFile); + + String absolutePath = file.getAbsolutePath(); + System.out.println("文件绝对路径:"+absolutePath); + + String path = file.getPath(); + System.out.println("文件构造路径:"+path); + + long length = file.length(); + System.out.println("文件长度:"+length); + + long l = file.lastModified(); + System.out.println("文件最后修改时间:" + LocalDateTime.ofInstant(Instant.ofEpochMilli(l), ZoneId.of("Asia/Shanghai"))); + } + + @Test + public void test2(){ + // File.list() 返回一个String[] 表示该File目录中所有的子目录和文件 + File file = new File("D:\\RPAtest"); + String[] list = file.list(); + for(String str:list){ + System.out.println(str); + } + + // 返回一个File数组,表示该File目录中的所有的子文件或目录。 + System.out.println("+++++++++++++++++++++++++++++"); + File[] files = file.listFiles(); + for(File file1:files){ + System.out.println(file1.getName()); + } + } + + @Test + public void test3(){ + File file = new File("D:\\RPAtest\\123.db"); + File file2 = new File("D:\\RPAtest\\1234.db"); + + boolean exists = file.exists(); + System.out.println("文件是否存在 "+exists); + + boolean file1 = file.isFile(); + System.out.println("判断是否是文件 "+file1); + + boolean directory = file2.isDirectory(); + System.out.println("判断是否是目录 "+directory); + } + + @Test + public void test4() throws IOException { + // 文件的创建 + File f = new File("D:\\RPAtest\\123.db"); + System.out.println("123.db是否存在:"+f.exists()); + System.out.println("123.db是否创建:"+f.createNewFile()); + System.out.println("123.db是否存在:"+f.exists()); + + // 目录的创建 + File f2= new File("D:\\RPAtest\\newDir"); + System.out.println("newDir是否存在:"+f2.exists()); + System.out.println("newDir是否创建:"+f2.mkdir()); + System.out.println("newDir是否存在:"+f2.exists()); + + // 创建多级目录 + File f5= new File("D:\\RPAtest\\newDira\\newDirb"); + System.out.println("newDira\\newDirb创建:" + f5.mkdirs()); + + // 文件的删除 + System.out.println("123.db删除:" + f.delete()); + + // 目录的删除 + System.out.println("newDir删除:" + f2.delete()); + + String format = new SimpleDateFormat("yyyy-MM-dd").format(new Date()); + System.out.println(format); + + + } + + @Test + public void test5(){ + + } +} diff --git a/transaction/pom.xml b/transaction/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..db64fa1b09cb31610bf13e3a2cf648cd80b6d087 --- /dev/null +++ b/transaction/pom.xml @@ -0,0 +1,79 @@ + + + 4.0.0 + + com.duan + transaction + 1.0-SNAPSHOT + + + org.springframework.boot + spring-boot-starter-parent + 2.4.3 + + + + + org.springframework.boot + spring-boot-starter + 2.4.3 + + + + org.springframework.boot + spring-boot-starter-web + 2.4.3 + + + + org.springframework.boot + spring-boot-starter-test + 2.4.3 + + + + org.projectlombok + lombok + 1.18.2 + + + + junit + junit + 4.13.2 + test + + + + + com.alibaba + fastjson + 1.2.50 + + + + com.google.guava + guava + 20.0 + + + + + + com.baomidou + mybatis-plus-boot-starter + 3.4.3 + + + + + mysql + mysql-connector-java + 8.0.23 + + + + + \ No newline at end of file diff --git a/transaction/src/main/java/com/duan/TransactionApplication.java b/transaction/src/main/java/com/duan/TransactionApplication.java new file mode 100644 index 0000000000000000000000000000000000000000..3ada25bc94fe2a94edaac56efe69bf39cee68372 --- /dev/null +++ b/transaction/src/main/java/com/duan/TransactionApplication.java @@ -0,0 +1,20 @@ +package com.duan; + +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +/** + * @author db + * @version 1.0 + * @description TranscationApplication + * @since 2024/1/27 + */ +@SpringBootApplication +@MapperScan(basePackages = "com.duan.mapper") +public class TransactionApplication { + + public static void main(String[] args) { + SpringApplication.run(TransactionApplication.class); + } +} diff --git a/transaction/src/main/java/com/duan/controller/RoleController.java b/transaction/src/main/java/com/duan/controller/RoleController.java new file mode 100644 index 0000000000000000000000000000000000000000..8f77d6523df1a348d499ee03a76eeb0929bdb7c5 --- /dev/null +++ b/transaction/src/main/java/com/duan/controller/RoleController.java @@ -0,0 +1,31 @@ +package com.duan.controller; + +import com.duan.pojo.Result; +import com.duan.service.RoleService; +import com.duan.service.UserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * @author db + * @version 1.0 + * @description RoleController + * @since 2024/2/20 + */ +@RestController +public class RoleController { + + @Autowired + private UserService userService; + + @Autowired + private RoleService roleService; + + @PostMapping("/deleteRole") + public Result deleteRole(Integer roleId){ + roleService.deleteRole(roleId); + return Result.success(); + } +} diff --git a/transaction/src/main/java/com/duan/controller/UserController.java b/transaction/src/main/java/com/duan/controller/UserController.java new file mode 100644 index 0000000000000000000000000000000000000000..da1f7d53af9498efad64394479565786b4cca7d4 --- /dev/null +++ b/transaction/src/main/java/com/duan/controller/UserController.java @@ -0,0 +1,14 @@ +package com.duan.controller; + +import org.springframework.web.bind.annotation.RestController; + +/** + * @author db + * @version 1.0 + * @description UserController + * @since 2024/2/20 + */ +@RestController +public class UserController { + +} diff --git a/transaction/src/main/java/com/duan/mapper/RoleMapper.java b/transaction/src/main/java/com/duan/mapper/RoleMapper.java new file mode 100644 index 0000000000000000000000000000000000000000..2272ac637ad26e127fd5e22beacac6415ee00860 --- /dev/null +++ b/transaction/src/main/java/com/duan/mapper/RoleMapper.java @@ -0,0 +1,16 @@ +package com.duan.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.duan.pojo.Role; +import org.apache.ibatis.annotations.Mapper; + + +/** + * @author db + * @version 1.0 + * @description RoleMapper + * @since 2024/1/28 + */ +@Mapper +public interface RoleMapper extends BaseMapper { +} diff --git a/transaction/src/main/java/com/duan/mapper/UserMapper.java b/transaction/src/main/java/com/duan/mapper/UserMapper.java new file mode 100644 index 0000000000000000000000000000000000000000..259b164e1345b0569d0e7d8680f0f48b65bb860c --- /dev/null +++ b/transaction/src/main/java/com/duan/mapper/UserMapper.java @@ -0,0 +1,16 @@ +package com.duan.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.duan.pojo.User; +import org.apache.ibatis.annotations.Mapper; + + +/** + * @author db + * @version 1.0 + * @description UserMapper + * @since 2024/1/28 + */ +@Mapper +public interface UserMapper extends BaseMapper { +} diff --git a/transaction/src/main/java/com/duan/pojo/Result.java b/transaction/src/main/java/com/duan/pojo/Result.java new file mode 100644 index 0000000000000000000000000000000000000000..b3852789db2a3e75ac88a6d35186a0660cf46c4f --- /dev/null +++ b/transaction/src/main/java/com/duan/pojo/Result.java @@ -0,0 +1,34 @@ +package com.duan.pojo; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author db + * @version 1.0 + * @description Result + * @since 2023/12/19 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class Result { + + private Integer code; + private String msg; + private Object data; + + public static Result success(){ + return new Result(1,"success",null); + } + + public static Result success(Object data){ + return new Result(1,"success",data); + } + + public static Result error(){ + return new Result(0,"error",null); + } + +} diff --git a/transaction/src/main/java/com/duan/pojo/Role.java b/transaction/src/main/java/com/duan/pojo/Role.java new file mode 100644 index 0000000000000000000000000000000000000000..fa9fcf0a9b268e114512f5601231eacda7f4c5a3 --- /dev/null +++ b/transaction/src/main/java/com/duan/pojo/Role.java @@ -0,0 +1,42 @@ +package com.duan.pojo; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Date; + +/** + * @author db + * @version 1.0 + * @description Role + * @since 2024/1/28 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@TableName("role") +public class Role { + + @TableId(value = "role_id", type = IdType.AUTO) + private Integer roleId; + + @TableField("role_name") + private String roleName; + + @TableField("role_mark") + private String roleMark; + + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @TableField("create_time") + private Date createTime; + + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @TableField("update_time") + private Date updateTime; +} diff --git a/transaction/src/main/java/com/duan/pojo/User.java b/transaction/src/main/java/com/duan/pojo/User.java new file mode 100644 index 0000000000000000000000000000000000000000..cdbdb8b92b6c514776c4de32752f0b9d310683e3 --- /dev/null +++ b/transaction/src/main/java/com/duan/pojo/User.java @@ -0,0 +1,39 @@ +package com.duan.pojo; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Date; + +/** + * @author db + * @version 1.0 + * @description User + * @since 2024/1/28 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@TableName("user") +public class User { + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + private String username; + + private String password; + + private Integer role_id; + + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private Date createTime; + + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private Date updateTime; +} diff --git a/transaction/src/main/java/com/duan/service/RoleService.java b/transaction/src/main/java/com/duan/service/RoleService.java new file mode 100644 index 0000000000000000000000000000000000000000..f0b652914f34b8ece0f8e6c50e52662153ce8f2c --- /dev/null +++ b/transaction/src/main/java/com/duan/service/RoleService.java @@ -0,0 +1,18 @@ +package com.duan.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.duan.pojo.Role; + + +/** + * @author db + * @version 1.0 + * @description RoleService + * @since 2024/2/20 + */ +public interface RoleService extends IService { + + void deleteRole(Integer roleId); + + Role getRoleByRoleId(Integer roleId); +} diff --git a/transaction/src/main/java/com/duan/service/UserService.java b/transaction/src/main/java/com/duan/service/UserService.java new file mode 100644 index 0000000000000000000000000000000000000000..cf4fca53a2baa0ced652283919ac730e484be740 --- /dev/null +++ b/transaction/src/main/java/com/duan/service/UserService.java @@ -0,0 +1,15 @@ +package com.duan.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.duan.pojo.User; + +/** + * @author db + * @version 1.0 + * @description UserService + * @since 2024/1/28 + */ +public interface UserService extends IService { + + void deleteUserByRoleId(Integer roleId); +} diff --git a/transaction/src/main/java/com/duan/service/impl/RoleServiceImpl.java b/transaction/src/main/java/com/duan/service/impl/RoleServiceImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..cd63117f30994de70b3038c3e7d4a9b7539e48f9 --- /dev/null +++ b/transaction/src/main/java/com/duan/service/impl/RoleServiceImpl.java @@ -0,0 +1,56 @@ +package com.duan.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.duan.mapper.RoleMapper; +import com.duan.pojo.Role; +import com.duan.service.RoleService; +import com.duan.service.UserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +/** + * @author db + * @version 1.0 + * @description RoleServiceImpl + * @since 2024/2/20 + */ +@Service +public class RoleServiceImpl extends ServiceImpl implements RoleService { + @Autowired + private RoleMapper roleMapper; + + @Autowired + private UserService userService; +// @Override +// @Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRED) +// public void deleteRole(Integer roleId) { +// roleMapper.deleteById(roleId); +// +// userService.deleteUserByRoleId(roleId); +// } +// @Override +// @Transactional() +// public void deleteRole(Integer roleId) { +// roleMapper.deleteById(roleId); +// +// userService.deleteUserByRoleId(roleId); +//} + @Override + @Transactional + public void deleteRole(Integer roleId) { + roleMapper.deleteById(roleId); + Role roleByRoleId = getRoleByRoleId(roleId); + + userService.deleteUserByRoleId(roleId); + } + + @Override + public Role getRoleByRoleId(Integer roleId) { + Role role = roleMapper.selectById(roleId); + return role; + } + + +} diff --git a/transaction/src/main/java/com/duan/service/impl/UserServiceImpl.java b/transaction/src/main/java/com/duan/service/impl/UserServiceImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..5f78ff9924109dfec49a764346d22efbd685420e --- /dev/null +++ b/transaction/src/main/java/com/duan/service/impl/UserServiceImpl.java @@ -0,0 +1,30 @@ +package com.duan.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.duan.mapper.UserMapper; +import com.duan.pojo.User; +import com.duan.service.UserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +/** + * @author db + * @version 1.0 + * @description UserServiceImpl + * @since 2024/1/28 + */ +@Service +public class UserServiceImpl extends ServiceImpl implements UserService { + @Autowired + private UserMapper userMapper; + @Override + @Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRES_NEW) + public void deleteUserByRoleId(Integer roleId) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(User::getRole_id,roleId); + userMapper.delete(queryWrapper); + } +} diff --git a/transaction/src/main/resources/application-dev.yml b/transaction/src/main/resources/application-dev.yml new file mode 100644 index 0000000000000000000000000000000000000000..15809fbaa4ecbe5a546da74bed4d609cf30acde7 --- /dev/null +++ b/transaction/src/main/resources/application-dev.yml @@ -0,0 +1,18 @@ + + +mybatis-plus: + configuration: + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 查看日志 + +spring: + datasource: + url: jdbc:mysql://localhost:3306/transaction?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false + username: root + password: 123456 + driver-class-name: com.mysql.cj.jdbc.Driver + +mybatis: + type-aliases-package: com.duan.pojo + configuration: + map-underscore-to-camel-case: true + diff --git a/transaction/src/main/resources/application.yml b/transaction/src/main/resources/application.yml new file mode 100644 index 0000000000000000000000000000000000000000..d3353a5daac8dc963723ac2eb118ca0ee603a994 --- /dev/null +++ b/transaction/src/main/resources/application.yml @@ -0,0 +1,8 @@ +server: + port: 8087 + servlet: + context-path: /transaction + +spring: + profiles: + active: dev diff --git a/transaction/src/main/resources/logback-spring.xml b/transaction/src/main/resources/logback-spring.xml new file mode 100644 index 0000000000000000000000000000000000000000..cc60dca8af84d25df46321014f1c1a45d280456e --- /dev/null +++ b/transaction/src/main/resources/logback-spring.xml @@ -0,0 +1,100 @@ + + + + + + + + + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n + + + + + + + + + + + + + + + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n + + + + + + + + ${LOG_HOME}/info.log + + + + + ${LOG_HOME}/info.%d{yyyy-MM-dd}.%i.log + + 30 + + 1GB + 10MB + + + + + UTF-8 + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n + + + + + + INFO + + + + + + ${LOG_HOME}/error.log + + + ${LOG_HOME}/error.%d{yyyy-MM-dd}.%i.log + 30 + + 1GB + 10MB + + + UTF-8 + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n + + + + ERROR + + + + + + + + + + + + \ No newline at end of file diff --git a/transaction/src/test/java/com/duan/TestData.java b/transaction/src/test/java/com/duan/TestData.java new file mode 100644 index 0000000000000000000000000000000000000000..39bd243c5e98cf404555f1fe3766c063059eeca8 --- /dev/null +++ b/transaction/src/test/java/com/duan/TestData.java @@ -0,0 +1,123 @@ +package com.duan; + +import com.duan.mapper.RoleMapper; +import com.duan.mapper.UserMapper; +import com.duan.pojo.Role; +import com.duan.pojo.User; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.util.Base64Utils; + +import java.util.Date; + +/** + * @author db + * @version 1.0 + * @description TestData + * @since 2024/1/28 + */ +@SpringBootTest + +@RunWith(SpringRunner.class) +public class TestData { + + @Autowired + private UserMapper userMapper; + + @Autowired + private RoleMapper roleMapper; + + @Test + public void testUser(){ + + User user = new User(); + user.setUsername("张三丰"); + user.setPassword("123456"); + user.setRole_id(1); + user.setCreateTime(new Date()); + user.setUpdateTime(new Date()); + + userMapper.insert(user); + + + } + + @Test + public void testUser2(){ + + User user = new User(); + user.setUsername("张无忌"); + user.setPassword("123456"); + user.setRole_id(4); + user.setCreateTime(new Date()); + user.setUpdateTime(new Date()); + userMapper.insert(user); + + + } + + @Test + public void TestRole(){ + Role role = new Role(); + + role.setRoleId(1); + role.setRoleName("超级管理员"); + role.setRoleMark("最大权限"); + role.setCreateTime(new Date()); + role.setUpdateTime(new Date()); + + roleMapper.insert(role); + } + + @Test + public void TestRole2(){ + Role role = new Role(); + + role.setRoleName("管理员"); + role.setRoleMark("普通权限"); + role.setCreateTime(new Date()); + role.setUpdateTime(new Date()); + + roleMapper.insert(role); + } + + @Test + public void Test3(){ + + String a = "<糖尿病编号,糖尿病药名,糖尿病用法><高血压编号,高血压药名,高血压用法\n" + + "1,氯沙坦钾片(4+7),1天1次 次 \\/ 每次 100 mg\n" + + "2,盐酸二甲双胍片(4+7),1天3次 次 \\/ 每次 0.5 g><胰岛素编号,胰岛素种类,胰岛素用法,胰岛素用量>"; + String[] strs=a.split("<"); + for (int i=0;i'); + System.out.println(i); + String substring = strs[2].substring(18, 84); + System.out.println(substring); + String[] split = substring.split("\n"); +// System.out.println(split[0]); +// System.out.println(split[1]); + + for (int j=0;j