diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..c4d414f
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,35 @@
+target/
+!.mvn/wrapper/maven-wrapper.jar
+!**/src/main/**/target/
+!**/src/test/**/target/
+
+### IntelliJ IDEA ###
+*.iws
+*.iml
+*.ipr
+.idea/
+
+### Eclipse ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+build/
+!**/src/main/**/build/
+!**/src/test/**/build/
+
+### VS Code ###
+.vscode/
+
+### Mac OS ###
+.DS_Store
\ No newline at end of file
diff --git a/README.en.md b/README.en.md
new file mode 100644
index 0000000..9f53762
--- /dev/null
+++ b/README.en.md
@@ -0,0 +1,36 @@
+# DFB-web
+
+#### Description
+{**When you're done, you can delete the content in this README and update the file with details for others getting started with your repository**}
+
+#### Software Architecture
+Software architecture description
+
+#### Installation
+
+1. xxxx
+2. xxxx
+3. xxxx
+
+#### Instructions
+
+1. xxxx
+2. xxxx
+3. xxxx
+
+#### Contribution
+
+1. Fork the repository
+2. Create Feat_xxx branch
+3. Commit your code
+4. Create Pull Request
+
+
+#### Gitee Feature
+
+1. You can use Readme\_XXX.md to support different languages, such as Readme\_en.md, Readme\_zh.md
+2. Gitee blog [blog.gitee.com](https://blog.gitee.com)
+3. Explore open source project [https://gitee.com/explore](https://gitee.com/explore)
+4. The most valuable open source project [GVP](https://gitee.com/gvp)
+5. The manual of Gitee [https://gitee.com/help](https://gitee.com/help)
+6. The most popular members [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..12469f8
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,155 @@
+
+ 4.0.0
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.4.5
+
+
+ com.DFB
+ dfb-web-admin
+ 1.0-SNAPSHOT
+
+ 8
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+ compile
+
+
+
+
+ org.projectlombok
+ lombok
+ 1.18.20
+ true
+
+
+
+
+ com.baomidou
+ mybatis-plus-boot-starter
+ 3.4.2
+
+
+
+
+ org.junit.jupiter
+ junit-jupiter-api
+ 5.9.3
+ test
+
+
+
+
+ com.microsoft.sqlserver
+ mssql-jdbc
+ 9.4.1.jre8
+
+
+
+
+ com.alibaba
+ druid-spring-boot-starter
+ 1.1.23
+
+
+
+
+ org.apache.velocity
+ velocity-engine-core
+ 2.3
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-data-redis
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-cache
+
+
+
+
+ com.baomidou
+ mybatis-plus-generator
+ 3.3.2
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-aop
+
+
+
+
+ com.alibaba
+ fastjson
+ 1.2.76
+
+
+
+
+ com.baomidou
+ mybatis-plus-extension
+ 3.5.3.1
+ compile
+
+
+
+
+ com.qcloud
+ cos_api
+ 5.6.133
+
+
+
+
+ io.jsonwebtoken
+ jjwt
+ 0.9.1
+
+
+ cn.hutool
+ hutool-all
+ 5.7.22
+
+
+
+ io.springfox
+ springfox-spring-web
+ 3.0.0
+
+
+
+ com.github.penggle
+ kaptcha
+ 2.3.2
+
+
+ org.springframework.boot
+ spring-boot-test
+ 3.2.9
+ test
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+ 2.4.5
+
+
+
+
\ No newline at end of file
diff --git a/settings.xml b/settings.xml
new file mode 100644
index 0000000..4c0f96c
--- /dev/null
+++ b/settings.xml
@@ -0,0 +1,46 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ alimaven
+ central
+ aliyun maven
+ http://maven.aliyun.com/nexus/content/repositories/central/
+
+
+
+
+
+
+ JDK-8
+
+ true
+ 8
+
+
+ 8
+ 8
+ 8
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/java/com/mijiu/DFBApplication.java b/src/main/java/com/mijiu/DFBApplication.java
new file mode 100644
index 0000000..37159af
--- /dev/null
+++ b/src/main/java/com/mijiu/DFBApplication.java
@@ -0,0 +1,19 @@
+package com.mijiu;
+
+import lombok.extern.slf4j.Slf4j;
+
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.web.servlet.ServletComponentScan;
+
+
+@Slf4j
+@SpringBootApplication
+@ServletComponentScan
+public class DFBApplication {
+ public static void main(String[] args) {
+ SpringApplication.run(DFBApplication.class, args);
+ log.info("项目启动成功...");
+ }
+}
diff --git a/src/main/java/com/mijiu/common/Util/AdminHolder.java b/src/main/java/com/mijiu/common/Util/AdminHolder.java
new file mode 100644
index 0000000..8660e79
--- /dev/null
+++ b/src/main/java/com/mijiu/common/Util/AdminHolder.java
@@ -0,0 +1,23 @@
+package com.mijiu.common.Util;
+
+
+import com.mijiu.entity.vo.Administrator;
+
+/**
+ * @author mijiupro
+ */
+public class AdminHolder { private static final ThreadLocal TOKEN_HOLDER = new ThreadLocal<>();
+
+ public static void setInfoByToken(Administrator administrator) {
+ TOKEN_HOLDER.set(administrator);
+ }
+
+ public static Administrator getInfoByToken() {
+ return TOKEN_HOLDER.get();
+ }
+
+ public static void clear() {
+ TOKEN_HOLDER.remove();
+ }
+
+}
diff --git a/src/main/java/com/mijiu/common/Util/BaseContext.java b/src/main/java/com/mijiu/common/Util/BaseContext.java
new file mode 100644
index 0000000..ccf5b9c
--- /dev/null
+++ b/src/main/java/com/mijiu/common/Util/BaseContext.java
@@ -0,0 +1,26 @@
+package com.mijiu.common.Util;
+
+/**
+ * 基于ThreadLocal封装工具类,用户保存和获取当前登录用户id
+ */
+public class BaseContext {
+ private static ThreadLocal threadLocal = new ThreadLocal<>();
+
+ /**
+ * 获取值
+ *
+ * @return
+ */
+ public static Long getCurrentId() {
+ return threadLocal.get();
+ }
+
+ /**
+ * 设置值
+ *
+ * @param id
+ */
+ public static void setCurrentId(Long id) {
+ threadLocal.set(id);
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/mijiu/common/Util/JacksonObjectMapper.java b/src/main/java/com/mijiu/common/Util/JacksonObjectMapper.java
new file mode 100644
index 0000000..515fc93
--- /dev/null
+++ b/src/main/java/com/mijiu/common/Util/JacksonObjectMapper.java
@@ -0,0 +1,56 @@
+package com.mijiu.common.Util;
+
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.module.SimpleModule;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;
+import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
+import com.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer;
+import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
+import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
+import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer;
+
+import java.math.BigInteger;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.time.format.DateTimeFormatter;
+
+import static com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES;
+
+/**
+ * 对象映射器:基于jackson将Java对象转为json,或者将json转为Java对象
+ * 将JSON解析为Java对象的过程称为 [从JSON反序列化Java对象]
+ * 从Java对象生成JSON的过程称为 [序列化Java对象到JSON]
+ */
+public class JacksonObjectMapper extends ObjectMapper {
+
+ public static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd";
+ public static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
+ public static final String DEFAULT_TIME_FORMAT = "HH:mm:ss";
+
+ public JacksonObjectMapper() {
+ super();
+ //收到未知属性时不报异常
+ this.configure(FAIL_ON_UNKNOWN_PROPERTIES, false);
+
+ //反序列化时,属性不存在的兼容处理
+ this.getDeserializationConfig().withoutFeatures(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
+
+
+ SimpleModule simpleModule = new SimpleModule()
+ .addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT)))
+ .addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT)))
+ .addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT)))
+
+ .addSerializer(BigInteger.class, ToStringSerializer.instance)
+ .addSerializer(Long.class, ToStringSerializer.instance)
+ .addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT)))
+ .addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT)))
+ .addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT)));
+
+ //注册功能模块 例如,可以添加自定义序列化器和反序列化器
+ this.registerModule(simpleModule);
+ }
+}
diff --git a/src/main/java/com/mijiu/common/Util/JwtUtils.java b/src/main/java/com/mijiu/common/Util/JwtUtils.java
new file mode 100644
index 0000000..2e08e70
--- /dev/null
+++ b/src/main/java/com/mijiu/common/Util/JwtUtils.java
@@ -0,0 +1,103 @@
+package com.mijiu.common.Util;
+
+import io.jsonwebtoken.Claims;
+import io.jsonwebtoken.Jwts;
+import io.jsonwebtoken.SignatureAlgorithm;
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+import java.util.Date;
+import java.util.Map;
+
+
+/**
+ * @author mijiupro
+ */
+@Data
+public class JwtUtils {
+
+ private static String secret="123456";//密钥
+ private static long expiration=4320000000L;//过期时间
+
+
+ /**
+ * 生成token令牌
+ * @param claims JWT第二部分负载 payload 中存储的内容
+ * @param subject 主题(用户类型)
+ * @return token
+ */
+ public static String generateToken(Map claims, String subject) {
+ return Jwts.builder()
+ .setId(Claims.ID)//设置jti(JWT ID):是JWT的唯一标识,根据业务需要,这个可以设置为一个不重复的值,主要用来作为令牌的唯一标识。
+ .setSubject("mijiu")//设置主题,一般为用户类型
+ .setIssuedAt(new Date())//设置签发时间
+ .addClaims(claims)//设置负载
+ .signWith(SignatureAlgorithm.HS256, secret)//设置签名算法
+ .setExpiration(new Date(System.currentTimeMillis() + expiration))//设置令牌过期时间
+ .compact();//生成令牌
+ }
+
+ /**
+ * 解析token令牌
+ * @param token token令牌
+ * @return 负载
+ */
+ public static Claims parseToken(String token) {
+
+ return Jwts.parser()
+ .setSigningKey(secret)
+ .parseClaimsJws(token)
+ .getBody();
+ }
+
+ /**
+ * 验证token令牌
+ * @param token 令牌
+ * @return 是否有效
+ */
+ public static boolean validateToken(String token) {
+ try {
+ Jwts.parser()
+ .setSigningKey(secret)
+ .parseClaimsJws(token)
+ .getBody();
+
+ return true;
+ } catch (Exception e) {
+ return false;
+ }
+ }
+
+ /**
+ * 刷新Token
+ * @param token 旧的Token令牌
+ * @return 新的Token令牌
+ */
+ public String refreshToken(String token) {
+ try {
+ // 解析旧的Token,获取负载信息
+ Claims claims = parseToken(token);
+ // 生成新的Token,设置过期时间和签名算法等参数
+ return generateToken(claims, claims.getSubject());
+ } catch (Exception e) {
+ throw new RuntimeException("无法刷新令牌!", e);
+ }
+ }
+
+
+ /**
+ * 从令牌中获取主题信息
+ * @param token 令牌
+ * @return 主题信息(用户类型)
+ */
+ public String getSubjectFromToken(String token) {
+ try {
+ Claims claims = parseToken(token); // 解析令牌,获取负载信息
+ return claims.getSubject(); // 返回主题信息
+ } catch (Exception e) {
+ throw new RuntimeException("无法从令牌中获取主题。", e);
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/mijiu/common/Util/MyMetaObjecthandler.java b/src/main/java/com/mijiu/common/Util/MyMetaObjecthandler.java
new file mode 100644
index 0000000..e78d817
--- /dev/null
+++ b/src/main/java/com/mijiu/common/Util/MyMetaObjecthandler.java
@@ -0,0 +1,48 @@
+package com.mijiu.common.Util;
+
+import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.ibatis.reflection.MetaObject;
+import org.springframework.stereotype.Component;
+
+import java.time.LocalDateTime;
+
+/**
+ * 自定义元数据对象处理器
+ */
+@Component
+@Slf4j
+public class MyMetaObjecthandler implements MetaObjectHandler {
+ /**
+ * 插入操作,自动填充
+ *
+ * @param metaObject
+ */
+ @Override
+ public void insertFill(MetaObject metaObject) {
+ log.info("公共字段自动填充[insert]...");
+ log.info(metaObject.toString());
+
+ metaObject.setValue("createTime", LocalDateTime.now());
+ metaObject.setValue("updateTime", LocalDateTime.now());
+ metaObject.setValue("createStaff", BaseContext.getCurrentId());
+ metaObject.setValue("updateStaff", BaseContext.getCurrentId());
+ }
+
+ /**
+ * 更新操作,自动填充
+ *
+ * @param metaObject
+ */
+ @Override
+ public void updateFill(MetaObject metaObject) {
+ log.info("公共字段自动填充[update]...");
+ log.info(metaObject.toString());
+
+ long id = Thread.currentThread().getId();
+ log.info("线程id为:{}", id);
+
+ metaObject.setValue("updateTime", LocalDateTime.now());
+ metaObject.setValue("updateStaff", BaseContext.getCurrentId());
+ }
+}
diff --git a/src/main/java/com/mijiu/common/Util/ValidateCodeUtils.java b/src/main/java/com/mijiu/common/Util/ValidateCodeUtils.java
new file mode 100644
index 0000000..081da60
--- /dev/null
+++ b/src/main/java/com/mijiu/common/Util/ValidateCodeUtils.java
@@ -0,0 +1,44 @@
+package com.mijiu.common.Util;
+
+import java.util.Random;
+
+/**
+ * 随机生成验证码工具类
+ */
+public class ValidateCodeUtils {
+ /**
+ * 随机生成验证码
+ *
+ * @param length 长度为4位或者6位
+ * @return
+ */
+ public static Integer generateValidateCode(int length) {
+ Integer code = null;
+ if (length == 4) {
+ code = new Random().nextInt(9999);//生成随机数,最大为9999
+ if (code < 1000) {
+ code = code + 1000;//保证随机数为4位数字
+ }
+ } else if (length == 6) {
+ code = new Random().nextInt(999999);//生成随机数,最大为999999
+ if (code < 100000) {
+ code = code + 100000;//保证随机数为6位数字
+ }
+ } else {
+ throw new RuntimeException("只能生成4位或6位数字验证码");
+ }
+ return code;
+ }
+
+ /**
+ * 随机生成指定长度字符串验证码
+ *
+ * @param length 长度
+ * @return
+ */
+ public static String generateValidateCode4String(int length) {
+ Random rdm = new Random();
+ String hash1 = Integer.toHexString(rdm.nextInt());
+ return hash1.substring(0, length);
+ }
+}
diff --git a/src/main/java/com/mijiu/common/annotation/Log.java b/src/main/java/com/mijiu/common/annotation/Log.java
new file mode 100644
index 0000000..cd8b9eb
--- /dev/null
+++ b/src/main/java/com/mijiu/common/annotation/Log.java
@@ -0,0 +1,12 @@
+package com.mijiu.common.annotation;
+
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.METHOD)
+public @interface Log {
+}
diff --git a/src/main/java/com/mijiu/common/aop/LogAspect.java b/src/main/java/com/mijiu/common/aop/LogAspect.java
new file mode 100644
index 0000000..8fe54cf
--- /dev/null
+++ b/src/main/java/com/mijiu/common/aop/LogAspect.java
@@ -0,0 +1,59 @@
+package com.mijiu.common.annotation.aop;
+
+import com.alibaba.fastjson.JSONObject;
+import lombok.extern.slf4j.Slf4j;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import javax.servlet.http.HttpServletRequest;
+import java.time.LocalDateTime;
+import java.util.Arrays;
+
+@Component
+@Aspect
+@Slf4j
+public class LogAspect {
+
+ @Autowired
+ private HttpServletRequest request;
+
+ @Around("@annotation(com.mijiu.common.annotation.Log)")
+ public Object recordTime(ProceedingJoinPoint joinPoint) throws Throwable {
+
+ //操作时间
+ LocalDateTime operateTime = LocalDateTime.now();
+
+ //操作类名
+ String className = joinPoint.getTarget().getClass().getName();
+
+ //操作方法名
+ String methodName = joinPoint.getSignature().getName();
+
+ //操作返回参数
+ Object[] args = joinPoint.getArgs();
+ String methodParams = Arrays.toString(args);
+
+ long begin = System.currentTimeMillis();
+
+ //原始方法运行
+ Object result = joinPoint.proceed();
+ long end = System.currentTimeMillis();
+
+ //操作方法返回值
+ String returnValue = JSONObject.toJSONString(result);
+
+ //操作耗时
+ long costTime = end - begin;
+
+ //操作id
+ Long operateUser = (Long) request.getSession().getAttribute("StaffDfb");
+ log.info("操作者id: " + operateUser);
+
+ //回写进表或者其他
+
+ return result;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/mijiu/common/config/MybatisPlusConfig.java b/src/main/java/com/mijiu/common/config/MybatisPlusConfig.java
new file mode 100644
index 0000000..0335dfc
--- /dev/null
+++ b/src/main/java/com/mijiu/common/config/MybatisPlusConfig.java
@@ -0,0 +1,20 @@
+package com.mijiu.common.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;
+
+/**
+ * 配置MP的分页插件
+ */
+@Configuration
+public class MybatisPlusConfig {
+
+ @Bean
+ public MybatisPlusInterceptor mybatisPlusInterceptor() {
+ MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
+ mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
+ return mybatisPlusInterceptor;
+ }
+}
diff --git a/src/main/java/com/mijiu/common/config/RedisConfig.java b/src/main/java/com/mijiu/common/config/RedisConfig.java
new file mode 100644
index 0000000..5e5f001
--- /dev/null
+++ b/src/main/java/com/mijiu/common/config/RedisConfig.java
@@ -0,0 +1,27 @@
+package com.mijiu.common.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.redis.connection.RedisConnectionFactory;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.serializer.JdkSerializationRedisSerializer;
+import org.springframework.data.redis.serializer.StringRedisSerializer;
+
+@Configuration
+public class RedisConfig {
+
+ @Bean
+ public RedisTemplate redisTemplate(RedisConnectionFactory connectionFactory) {
+ RedisTemplate redisTemplate = new RedisTemplate<>();
+ redisTemplate.setConnectionFactory(connectionFactory);
+
+ // 设置key和value的序列化方式
+ redisTemplate.setKeySerializer(new StringRedisSerializer());
+ redisTemplate.setValueSerializer(new JdkSerializationRedisSerializer());
+ redisTemplate.setHashKeySerializer(new StringRedisSerializer());
+ redisTemplate.setHashValueSerializer(new JdkSerializationRedisSerializer());
+ redisTemplate.afterPropertiesSet();
+
+ return redisTemplate;
+ }
+}
diff --git a/src/main/java/com/mijiu/common/config/WebMvcConfig.java b/src/main/java/com/mijiu/common/config/WebMvcConfig.java
new file mode 100644
index 0000000..561d055
--- /dev/null
+++ b/src/main/java/com/mijiu/common/config/WebMvcConfig.java
@@ -0,0 +1,43 @@
+package com.mijiu.common.config;
+
+import com.mijiu.common.Util.JacksonObjectMapper;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.http.converter.HttpMessageConverter;
+import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
+import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
+
+
+import java.util.List;
+
+@Slf4j
+@Configuration
+public class WebMvcConfig extends WebMvcConfigurationSupport {
+ /**
+ * 设置静态资源映射
+ *
+ * @param registry
+ */
+ @Override
+ protected void addResourceHandlers(ResourceHandlerRegistry registry) {
+ registry.addResourceHandler("/**").addResourceLocations("classpath:/static/");
+ }
+
+ /**
+ * 扩展mvc框架的消息转换器
+ *
+ * @param converters
+ */
+ @Override
+ protected void extendMessageConverters(List> converters) {
+ //创建消息转换器对象
+ MappingJackson2HttpMessageConverter messageConverter = new MappingJackson2HttpMessageConverter();
+ //设置对象转换器,底层使用Jackson将Java对象转为json
+ messageConverter.setObjectMapper(new JacksonObjectMapper());
+ //将上面的消息转换器对象追加到mvc框架的转换器集合中
+ converters.add(0, messageConverter);
+ }
+
+
+}
diff --git a/src/main/java/com/mijiu/common/constant/CommonConstant.java b/src/main/java/com/mijiu/common/constant/CommonConstant.java
new file mode 100644
index 0000000..81bc688
--- /dev/null
+++ b/src/main/java/com/mijiu/common/constant/CommonConstant.java
@@ -0,0 +1,18 @@
+package com.mijiu.common.constant;
+
+/**
+ * 通用常量
+ */
+public interface CommonConstant {
+
+ /**
+ * 升序
+ */
+ String SORT_ORDER_ASC = "ascend";
+
+ /**
+ * 降序
+ */
+ String SORT_ORDER_DESC = " descend";
+
+}
diff --git a/src/main/java/com/mijiu/common/constant/UserConstant.java b/src/main/java/com/mijiu/common/constant/UserConstant.java
new file mode 100644
index 0000000..9d3e740
--- /dev/null
+++ b/src/main/java/com/mijiu/common/constant/UserConstant.java
@@ -0,0 +1,32 @@
+package com.mijiu.common.constant;
+
+/**
+ * 用户常量
+ *
+ */
+public interface UserConstant {
+
+ /**
+ * 用户登录态键
+ */
+ String USER_LOGIN_STATE = "user_login";
+
+ // region 权限
+
+ /**
+ * 默认角色
+ */
+ String DEFAULT_ROLE = "user";
+
+ /**
+ * 管理员角色
+ */
+ String ADMIN_ROLE = "admin";
+
+ /**
+ * 被封号
+ */
+ String BAN_ROLE = "ban";
+
+ // endregion
+}
diff --git a/src/main/java/com/mijiu/common/exception/AccountLockedException.java b/src/main/java/com/mijiu/common/exception/AccountLockedException.java
new file mode 100644
index 0000000..3b1f167
--- /dev/null
+++ b/src/main/java/com/mijiu/common/exception/AccountLockedException.java
@@ -0,0 +1,15 @@
+package com.mijiu.common.exception;
+
+/**
+ * 账号被锁定异常
+ */
+public class AccountLockedException extends CustomException {
+
+ public AccountLockedException() {
+ }
+
+ public AccountLockedException(String msg) {
+ super(msg);
+ }
+
+}
diff --git a/src/main/java/com/mijiu/common/exception/AccountNotFoundException.java b/src/main/java/com/mijiu/common/exception/AccountNotFoundException.java
new file mode 100644
index 0000000..f085646
--- /dev/null
+++ b/src/main/java/com/mijiu/common/exception/AccountNotFoundException.java
@@ -0,0 +1,12 @@
+package com.mijiu.common.exception;
+
+/**
+ * 账号不存在异常
+ */
+public class AccountNotFoundException extends CustomException {
+
+ public AccountNotFoundException(){}
+ public AccountNotFoundException(String msg) {
+ super(msg);
+ }
+}
diff --git a/src/main/java/com/mijiu/common/exception/CustomException.java b/src/main/java/com/mijiu/common/exception/CustomException.java
new file mode 100644
index 0000000..7fc208c
--- /dev/null
+++ b/src/main/java/com/mijiu/common/exception/CustomException.java
@@ -0,0 +1,12 @@
+package com.mijiu.common.exception;
+
+/**
+ * 自定义业务异常类
+ */
+public class CustomException extends RuntimeException {
+
+ public CustomException(){}
+ public CustomException(String message) {
+ super(message);
+ }
+}
diff --git a/src/main/java/com/mijiu/common/exception/GlobalExceptionHandler.java b/src/main/java/com/mijiu/common/exception/GlobalExceptionHandler.java
new file mode 100644
index 0000000..2478b24
--- /dev/null
+++ b/src/main/java/com/mijiu/common/exception/GlobalExceptionHandler.java
@@ -0,0 +1,72 @@
+package com.mijiu.common.exception;
+
+import com.mijiu.common.model.Result;
+import com.mijiu.common.model.ResultCode;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.ControllerAdvice;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.http.HttpStatus;
+import org.springframework.web.bind.annotation.ResponseStatus;
+
+import java.sql.SQLIntegrityConstraintViolationException;
+
+/**
+ * 全局异常处理
+ */
+@ControllerAdvice(annotations = {RestController.class, Controller.class})
+@ResponseBody
+@Slf4j
+public class GlobalExceptionHandler {
+
+
+ //账号不存在异常
+ @ExceptionHandler(AccountNotFoundException.class)
+ @ResponseStatus(HttpStatus.BAD_REQUEST)
+ public Result handleAccountNotFoundException(AccountNotFoundException ex) {
+ return Result.error(ResultCode.USER_NOT_EXIST);
+ }
+
+
+ //密码错误异常
+ @ExceptionHandler(PasswordErrorException.class)
+ @ResponseStatus(HttpStatus.BAD_REQUEST)
+ public Result handlePasswordErrorException(PasswordErrorException ex) {
+ return Result.error(ResultCode.USER_LOGIN_ERROR);
+ }
+
+ //登录状态过期异常
+ @ExceptionHandler(TokenOverdueException.class)
+ @ResponseStatus(HttpStatus.UNAUTHORIZED)
+ public Result handleTokenOverdueException(TokenOverdueException ex){
+ return Result.error(ResultCode.PERMISSION_EXPIRE);
+ }
+
+
+ //添加员工,管理员账号重复异常
+ @ExceptionHandler(SQLIntegrityConstraintViolationException.class)
+ public Result exceptionHandler(SQLIntegrityConstraintViolationException ex) {
+ log.error(ex.getMessage());
+
+ if (ex.getMessage().contains("Duplicate entry")) {
+ String[] split = ex.getMessage().split(" ");
+ String msg = split[2] + "已存在";
+ return Result.error(msg);
+ }
+ return Result.error();
+ }
+
+ /**
+ * 异常处理方法
+ *
+ * @return
+ */
+ @ExceptionHandler(CustomException.class)
+ public Result exceptionHandler(CustomException ex) {
+ log.error(ex.getMessage());
+
+ return Result.error(ex.getMessage());
+ }
+}
diff --git a/src/main/java/com/mijiu/common/exception/PasswordErrorException.java b/src/main/java/com/mijiu/common/exception/PasswordErrorException.java
new file mode 100644
index 0000000..a442a7d
--- /dev/null
+++ b/src/main/java/com/mijiu/common/exception/PasswordErrorException.java
@@ -0,0 +1,15 @@
+package com.mijiu.common.exception;
+
+/**
+ * 密码错误异常
+ */
+public class PasswordErrorException extends CustomException {
+
+ public PasswordErrorException() {
+ }
+
+ public PasswordErrorException(String msg) {
+ super(msg);
+ }
+
+}
diff --git a/src/main/java/com/mijiu/common/exception/TokenOverdueException.java b/src/main/java/com/mijiu/common/exception/TokenOverdueException.java
new file mode 100644
index 0000000..1d97a89
--- /dev/null
+++ b/src/main/java/com/mijiu/common/exception/TokenOverdueException.java
@@ -0,0 +1,9 @@
+package com.mijiu.common.exception;
+
+public class TokenOverdueException extends CustomException{
+ public TokenOverdueException(){}
+
+public TokenOverdueException(String msg){
+ super(msg);
+}
+}
diff --git a/src/main/java/com/mijiu/common/interceptor/JwtTokenAdminInterceptor.java b/src/main/java/com/mijiu/common/interceptor/JwtTokenAdminInterceptor.java
new file mode 100644
index 0000000..5d6b60d
--- /dev/null
+++ b/src/main/java/com/mijiu/common/interceptor/JwtTokenAdminInterceptor.java
@@ -0,0 +1,52 @@
+package com.mijiu.common.interceptor;
+
+import com.mijiu.common.Util.JwtUtils;
+import com.mijiu.common.model.Result;
+import com.mijiu.common.model.ResultCode;
+import com.alibaba.fastjson.JSON;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+import org.springframework.web.method.HandlerMethod;
+import org.springframework.web.servlet.HandlerInterceptor;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * jwt令牌校验的拦截器
+ */
+@Component
+@Slf4j
+public class JwtTokenAdminInterceptor implements HandlerInterceptor {
+
+ /**
+ * 通过拦截器 放行拦截器的某些请求 头部参数 add(未完成)
+ *
+ */
+ //jwt校验
+ public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
+ //判断当前拦截到的是Controller的方法还是其他资源
+ if (!(handler instanceof HandlerMethod)) {
+ //当前拦截到的不是动态方法,直接放行
+ return true;
+ }
+ //1、从请求头中获取令牌
+ String authorizationHeader = request.getHeader("Authorization");
+ if (authorizationHeader == null) {
+ log.info("Authorization值为空");
+ return false;
+ }
+ // 从第8个字符开始截取,去掉 "Bearer " 前缀
+ String jwt = authorizationHeader.substring(7);
+ //2、校验令牌
+ try {
+ JwtUtils.validateToken(jwt);
+ } catch (Exception e) {//jwt解析失败
+ e.printStackTrace();
+ response.getWriter().write(JSON.toJSONString(Result.error(ResultCode.USER_NOT_LOGGED_IN)));
+
+ return false;
+ }
+ return false;
+ }
+}
diff --git a/src/main/java/com/mijiu/common/model/PageRequest.java b/src/main/java/com/mijiu/common/model/PageRequest.java
new file mode 100644
index 0000000..d56fb46
--- /dev/null
+++ b/src/main/java/com/mijiu/common/model/PageRequest.java
@@ -0,0 +1,30 @@
+package com.mijiu.common.model;
+
+import com.mijiu.common.constant.CommonConstant;
+import lombok.Data;
+
+/**
+ * 分页请求
+ */
+@Data
+public class PageRequest {
+ /**
+ * 当前页号
+ */
+ private long current = 1;
+
+ /**
+ * 页面大小
+ */
+ private long pageSize = 10;
+
+ /**
+ * 排序字段
+ */
+ private String sortField;
+
+ /**
+ * 排序顺序(默认升序)
+ */
+ private String sortOrder = CommonConstant.SORT_ORDER_ASC;
+}
diff --git a/src/main/java/com/mijiu/common/model/Result.java b/src/main/java/com/mijiu/common/model/Result.java
new file mode 100644
index 0000000..42fa2ae
--- /dev/null
+++ b/src/main/java/com/mijiu/common/model/Result.java
@@ -0,0 +1,61 @@
+package com.mijiu.common.model;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 统一响应结果集
+ *
+ * @author crush
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+
+public class Result {
+
+ //操作代码
+ Integer code;
+
+ //提示信息
+ String message;
+
+ //结果数据
+ T data;
+
+ public Result(ResultCode resultCode) {
+ this.code = resultCode.code();
+ this.message = resultCode.message();
+ }
+
+ public Result(ResultCode resultCode, T data) {
+ this.code = resultCode.code();
+ this.message = resultCode.message();
+ this.data = data;
+ }
+
+ public Result(String message) {
+ this.message = message;
+ }
+
+ public static Result success() {
+ return new Result(ResultCode.SUCCESS);
+ }
+
+ public static Result success(T data) {
+ return new Result(ResultCode.SUCCESS, data);
+ }
+
+ public static Result error() {
+ return new Result(ResultCode.FAIL);
+ }
+
+ public static Result error(ResultCode resultCode) {
+ return new Result(resultCode);
+ }
+
+ public static Result error(String message) {
+ return new Result(message);
+ }
+}
diff --git a/src/main/java/com/mijiu/common/model/ResultCode.java b/src/main/java/com/mijiu/common/model/ResultCode.java
new file mode 100644
index 0000000..23476df
--- /dev/null
+++ b/src/main/java/com/mijiu/common/model/ResultCode.java
@@ -0,0 +1,82 @@
+package com.mijiu.common.model;
+
+import lombok.Getter;
+
+/**
+ * 通用响应状态
+ */
+@Getter
+public enum ResultCode {
+
+ /* 成功状态码 */
+ SUCCESS(0, "操作成功!"),
+
+ /* 错误状态码 */
+ FAIL(-1, "操作失败!"),
+
+ /* 参数错误:10001-19999 */
+ PARAM_IS_INVALID(10001, "参数无效"),
+ PARAM_IS_BLANK(10002, "参数为空"),
+ PARAM_TYPE_BIND_ERROR(10003, "参数格式错误"),
+ PARAM_NOT_COMPLETE(10004, "参数缺失"),
+
+ /* 用户错误:20001-29999*/
+ USER_NOT_LOGGED_IN(20001, "用户未登录,请先登录"),
+ USER_LOGIN_ERROR(20002, "账号不存在或密码错误"),
+ USER_ACCOUNT_FORBIDDEN(20003, "账号已被禁用"),
+ USER_NOT_EXIST(20004, "用户不存在"),
+ USER_HAS_EXISTED(20005, "用户已存在"),
+
+ /* 系统错误:40001-49999 */
+ FILE_MAX_SIZE_OVERFLOW(40003, "上传尺寸过大"),
+ FILE_ACCEPT_NOT_SUPPORT(40004, "上传文件格式不支持"),
+
+ /* 数据错误:50001-599999 */
+ RESULT_DATA_NONE(50001, "数据未找到"),
+ DATA_IS_WRONG(50002, "数据有误"),
+ DATA_ALREADY_EXISTED(50003, "数据已存在"),
+ AUTH_CODE_ERROR(50004, "验证码错误"),
+
+
+ /* 权限错误:70001-79999 */
+ PERMISSION_UNAUTHENTICATED(70001, "此操作需要登陆系统!"),
+
+ PERMISSION_UNAUTHORISE(70002, "权限不足,无权操作!"),
+
+ PERMISSION_EXPIRE(70003, "登录状态过期!"),
+
+ PERMISSION_TOKEN_EXPIRED(70004, "token已过期"),
+
+ PERMISSION_LIMIT(70005, "访问次数受限制"),
+
+ PERMISSION_TOKEN_INVALID(70006, "无效token"),
+
+ PERMISSION_SIGNATURE_ERROR(70007, "签名失败");
+
+ //操作代码
+ int code;
+ //提示信息
+ String message;
+
+ ResultCode(int code, String message) {
+ this.code = code;
+ this.message = message;
+ }
+
+ public int code() {
+ return code;
+ }
+
+ public String message() {
+ return message;
+ }
+
+ public void setCode(int code) {
+ this.code = code;
+ }
+
+ public void setMessage(String message) {
+ this.message = message;
+ }
+
+}
diff --git a/src/main/java/com/mijiu/common/model/dto/staffDfb/StaffDfbAddRequest.java b/src/main/java/com/mijiu/common/model/dto/staffDfb/StaffDfbAddRequest.java
new file mode 100644
index 0000000..64ca264
--- /dev/null
+++ b/src/main/java/com/mijiu/common/model/dto/staffDfb/StaffDfbAddRequest.java
@@ -0,0 +1,37 @@
+package com.mijiu.common.model.dto.staffDfb;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class StaffDfbAddRequest implements Serializable {
+
+ /**
+ * 姓名
+ */
+ private String name;
+
+ /**
+ * 用户名
+ */
+ private String username;
+
+ /**
+ * 手机号
+ */
+ private String phone;
+
+ /**
+ * 性别
+ */
+ private String sex;
+
+ /**
+ * 身份证号
+ */
+ private String idCard;
+
+ private static final long serialVersionUID = 1L;
+
+}
diff --git a/src/main/java/com/mijiu/common/model/dto/staffDfb/StaffDfbQueryByIdRequest.java b/src/main/java/com/mijiu/common/model/dto/staffDfb/StaffDfbQueryByIdRequest.java
new file mode 100644
index 0000000..4f39c7e
--- /dev/null
+++ b/src/main/java/com/mijiu/common/model/dto/staffDfb/StaffDfbQueryByIdRequest.java
@@ -0,0 +1,16 @@
+package com.mijiu.common.model.dto.staffDfb;
+
+import com.mijiu.common.model.PageRequest;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class StaffDfbQueryByIdRequest extends PageRequest implements Serializable {
+ /**
+ * id
+ */
+ private Long id;
+}
diff --git a/src/main/java/com/mijiu/common/model/dto/staffDfb/StaffDfbQueryRequest.java b/src/main/java/com/mijiu/common/model/dto/staffDfb/StaffDfbQueryRequest.java
new file mode 100644
index 0000000..476008f
--- /dev/null
+++ b/src/main/java/com/mijiu/common/model/dto/staffDfb/StaffDfbQueryRequest.java
@@ -0,0 +1,48 @@
+package com.mijiu.common.model.dto.staffDfb;
+
+import com.mijiu.common.model.PageRequest;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+
+/**
+ * 员工查询请求
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class StaffDfbQueryRequest extends PageRequest implements Serializable {
+
+ /**
+ * id
+ */
+ private Long id;
+
+ /**
+ * 用户名
+ */
+ private String name;
+
+ /**
+ * 用户昵称
+ */
+ private String userName;
+
+ /**
+ * 手机号
+ */
+ private String phone;
+
+ /**
+ * 性别
+ */
+ private String sex;
+
+ /**
+ * 身份证号
+ */
+ private String idCard;
+
+
+ private static final long serialVersionUID = 1L;
+}
diff --git a/src/main/java/com/mijiu/controller/ConduitController.java b/src/main/java/com/mijiu/controller/ConduitController.java
new file mode 100644
index 0000000..ca42ba8
--- /dev/null
+++ b/src/main/java/com/mijiu/controller/ConduitController.java
@@ -0,0 +1,61 @@
+package com.mijiu.controller;
+
+import com.mijiu.common.model.Result;
+import com.mijiu.entity.dto.BaseDto;
+import com.mijiu.entity.site.Conduit;
+import com.mijiu.mapper.ConduitMapper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * 管道站表
+ */
+@RestController
+@RequestMapping("/conduit")
+@CrossOrigin(allowedHeaders = "*")
+public class ConduitController {
+
+ @Autowired
+ private ConduitMapper mapper;
+
+ /**
+ * 查询列表
+ */
+ @GetMapping("/list")
+ public Result> list() {
+ return Result.success(mapper.selectList(null));
+ }
+
+ /**
+ * 查询详情
+ */
+ @GetMapping("/{id}")
+ public Result> detail(@PathVariable Long id) {
+ return Result.success(mapper.selectById(id));
+ }
+
+ /**
+ * 新增
+ */
+ @PostMapping ("/add")
+ public Result> add(@RequestBody Conduit conduit) {
+
+ return Result.success(mapper.insert(conduit));
+ }
+
+ /**
+ * 修改
+ */
+ @PutMapping("/update")
+ public Result> update( @RequestBody Conduit conduit) {
+ return Result.success(mapper.updateById(conduit));
+ }
+
+ /**
+ * 删除
+ */
+ @DeleteMapping("/delete/{id}")
+ public Result> delete(@PathVariable Long id) {
+ return Result.success(mapper.deleteById(id));
+ }
+}
diff --git a/src/main/java/com/mijiu/controller/DownholeFillingController.java b/src/main/java/com/mijiu/controller/DownholeFillingController.java
new file mode 100644
index 0000000..8e3c165
--- /dev/null
+++ b/src/main/java/com/mijiu/controller/DownholeFillingController.java
@@ -0,0 +1,225 @@
+package com.mijiu.controller;
+
+import com.alibaba.druid.sql.ast.statement.SQLForeignKeyImpl;
+import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
+import com.mijiu.common.model.Result;
+import com.mijiu.entity.DayAccumulate;
+import com.mijiu.entity.DownholeFilling;
+import com.mijiu.entity.Gauges;
+import com.mijiu.entity.site.Conduit;
+import com.mijiu.entity.site.Gob;
+import com.mijiu.entity.site.GroutingStation;
+import com.mijiu.entity.site.PressureMonitoring;
+import com.mijiu.mapper.*;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.CrossOrigin;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+
+@RestController
+@RequestMapping("/downholeFilling")
+@CrossOrigin(allowedHeaders = "*")
+public class DownholeFillingController {
+
+ @Autowired
+ private DownholeFillingMapper downholeFillingMapper;
+
+ @Autowired
+ private GaugesMapper gaugesMapper;
+
+ @Autowired
+ private DayAccumulateMapper dayAccumulateMapper;
+
+
+
+
+ @Autowired
+ private ConduitMapper conduitMapper;//管道
+
+ @Autowired
+ private GobMapper gobMapper;//采空区
+
+ @Autowired
+ private GroutingStationMapper groutingStationMapper;//注浆站
+
+ @Autowired
+ private PressureMonitoringMapper pressureMonitoringMapper;//压力监测
+
+
+ /**
+ * 查询大屏实例
+ */
+ @GetMapping("/getScreenExample")
+ public Result> getScreen(){
+ //管道列表
+ List conduitList = conduitMapper.selectList(null);
+ //采空区列表
+ List gobList = gobMapper.selectList(null);
+ //注浆站列表
+ List groutingStationList = groutingStationMapper.selectList(null);
+ //压力监测列表
+ List pressureMonitoringList = pressureMonitoringMapper.selectList(null);
+
+
+ Map map = new HashMap<>();
+ HashMap obj = new HashMap<>();
+ List