Browse Source

组件初始化

lyhzzz 2 years ago
parent
commit
275a7bbd14
32 changed files with 1449 additions and 4 deletions
  1. 20 0
      pom.xml
  2. 21 0
      src/main/java/com/fdkankan/tk/TakeLookApplication.java
  3. 43 0
      src/main/java/com/fdkankan/tk/common/PageInfo.java
  4. 9 0
      src/main/java/com/fdkankan/tk/common/RequestBase.java
  5. 37 0
      src/main/java/com/fdkankan/tk/common/ResultCode.java
  6. 82 0
      src/main/java/com/fdkankan/tk/common/ResultData.java
  7. 145 0
      src/main/java/com/fdkankan/tk/common/util/JwtUtil.java
  8. 5 0
      src/main/java/com/fdkankan/tk/common/util/RedisKeyUtil.java
  9. 152 0
      src/main/java/com/fdkankan/tk/common/util/ShellUtil.java
  10. 14 0
      src/main/java/com/fdkankan/tk/common/util/StringUtils.java
  11. 22 0
      src/main/java/com/fdkankan/tk/config/MybatisPlusPageConfig.java
  12. 56 0
      src/main/java/com/fdkankan/tk/config/OriginFilter.java
  13. 37 0
      src/main/java/com/fdkankan/tk/config/WebAppConfig.java
  14. 21 0
      src/main/java/com/fdkankan/tk/controller/RoomController.java
  15. 21 0
      src/main/java/com/fdkankan/tk/controller/RoomNumController.java
  16. 87 0
      src/main/java/com/fdkankan/tk/entity/Room.java
  17. 57 0
      src/main/java/com/fdkankan/tk/entity/RoomNum.java
  18. 22 0
      src/main/java/com/fdkankan/tk/exception/BusinessException.java
  19. 35 0
      src/main/java/com/fdkankan/tk/exception/GlobalExceptionHandler.java
  20. 4 4
      src/main/java/com/fdkankan/tk/generate/AutoGenerate.java
  21. 87 0
      src/main/java/com/fdkankan/tk/interceptor/TokenInterceptor.java
  22. 18 0
      src/main/java/com/fdkankan/tk/mapper/IRoomMapper.java
  23. 18 0
      src/main/java/com/fdkankan/tk/mapper/IRoomNumMapper.java
  24. 16 0
      src/main/java/com/fdkankan/tk/service/IRoomNumService.java
  25. 16 0
      src/main/java/com/fdkankan/tk/service/IRoomService.java
  26. 20 0
      src/main/java/com/fdkankan/tk/service/impl/RoomNumServiceImpl.java
  27. 20 0
      src/main/java/com/fdkankan/tk/service/impl/RoomServiceImpl.java
  28. 51 0
      src/main/resources/application-local.yaml
  29. 49 0
      src/main/resources/application.yaml
  30. 254 0
      src/main/resources/logback-spring.xml
  31. 5 0
      src/main/resources/mapper/tk/RoomMapper.xml
  32. 5 0
      src/main/resources/mapper/tk/RoomNumMapper.xml

+ 20 - 0
pom.xml

@@ -45,6 +45,13 @@
             <version>3.5.1</version>
         </dependency>
 
+        <!--velocity模板-->
+        <dependency>
+            <groupId>org.apache.velocity</groupId>
+            <artifactId>velocity-engine-core</artifactId>
+            <version>2.3</version>
+        </dependency>
+
 
         <dependency>
             <groupId>org.springframework.boot</groupId>
@@ -90,6 +97,19 @@
             <version>1.18.20</version>
         </dependency>
 
+        <dependency>
+            <groupId>io.jsonwebtoken</groupId>
+            <artifactId>jjwt</artifactId>
+            <version>0.9.1</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.auth0</groupId>
+            <artifactId>java-jwt</artifactId>
+            <version>3.10.3</version>
+        </dependency>
+
+
 
     </dependencies>
 

+ 21 - 0
src/main/java/com/fdkankan/tk/TakeLookApplication.java

@@ -0,0 +1,21 @@
+package com.fdkankan.tk;
+
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+
+@SpringBootApplication
+@EnableTransactionManagement//开启事务
+@EnableScheduling
+@ComponentScan(basePackages = {"com.fdkankan.*"})
+@MapperScan("com.fdkankan.**.mapper")
+public class TakeLookApplication {
+
+    public static void main(String[] args) {
+        SpringApplication.run(TakeLookApplication.class, args);
+    }
+
+}

+ 43 - 0
src/main/java/com/fdkankan/tk/common/PageInfo.java

@@ -0,0 +1,43 @@
+package com.fdkankan.tk.common;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class PageInfo<T> {
+
+    private long pageNum;
+
+    private long pageSize;
+
+    private long total;
+
+    private T list;
+
+    public static PageInfo PageInfo(Page page){
+        return PageInfo.builder()
+            .pageNum(page.getCurrent())
+            .pageSize(page.getSize())
+            .total(page.getTotal())
+            .list(page.getRecords())
+            .build();
+    }
+    public static PageInfo PageInfo(Long currentPage, Long pageSize, Long total, List<?> list){
+        return PageInfo.builder()
+            .pageNum(currentPage)
+            .pageSize(pageSize)
+            .total(total)
+            .list(list)
+            .build();
+    }
+
+
+}

+ 9 - 0
src/main/java/com/fdkankan/tk/common/RequestBase.java

@@ -0,0 +1,9 @@
+package com.fdkankan.tk.common;
+
+import lombok.Data;
+
+@Data
+public class RequestBase {
+    private Integer pageNum = 1;
+    private Integer pageSize = 10;
+}

+ 37 - 0
src/main/java/com/fdkankan/tk/common/ResultCode.java

@@ -0,0 +1,37 @@
+package com.fdkankan.tk.common;
+
+public enum ResultCode {
+    SUCCESS(0,"操作成功"),
+    ERROR(-1,"操作失败"),
+
+    MISSING_REQUIRED_PARAMETERS(4001,"参数缺少"),
+    USER_NOT_LOGIN(4008,"用户未登录"),
+
+    UPLOAD_ERROR(7001,"文件上传失败"),
+    UPLOAD_FILE_NO_EXIST(7002,"上传文件不存在"),
+    UPLOAD_FILE_TO_LONG(7003,"文件上传过大"),
+    UPLOAD_FILE_TYPE_ERROR(7005,"文件类型错误"),
+    UPLOAD_FILE_MSG_ERROR(7006,"文件内容错误"),
+    UPLOAD_FILE_OBJ_ERROR(7007,"文件内容错误,缺少obj,或者mtl文件"),
+    SYSTEM_HOT_ICON_NOT_EXIST(7008,"系统默认icon不存在"),
+    SYSTEM_HOT_ICON_NOT_DELETE(7009,"系统默认icon不能删除"),
+    CASE_USE(7010,"当前场景已被 “%s” 使用,不可删除"),
+    FOLDER_NOT_EXIST(7011,"视频文件夹不存在"),
+    CASE_NOT_EXIST(7012,"案件不存在"),
+    MERGER_VIDEO_ERROR(7013,"合成视频失败"),
+    MODEL_NOT_EXIST(7014,"模型不存在"),
+    SCENE_NOT_EXIST(7015,"当前场景已被删除"),
+    UPLOAD_FILE_CHINA_NAME(7016,"文件名不能包含中文"),
+    UPLOAD_FILE_NAME_TO_LONG(7017,"文件名超过长度限制"),
+
+    HOT_ICON_NOT_EXIST(7004,"热点icon不存在");
+
+    public int code;
+    public String msg;
+
+    ResultCode(int code , String msg){
+        this.code = code;
+        this.msg = msg;
+    }
+
+}

+ 82 - 0
src/main/java/com/fdkankan/tk/common/ResultData.java

@@ -0,0 +1,82 @@
+package com.fdkankan.tk.common;
+
+import com.alibaba.fastjson.JSONObject;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.util.Calendar;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class ResultData<T> implements Serializable {
+    /**
+     * 状态码
+     */
+    private int code;
+    /**
+     * 响应信息
+     */
+    private String message;
+    /**
+     * 后端返回结果
+     */
+    private T data;
+    /**
+     * 后端返回结果
+     */
+    private Boolean success;
+    /**
+     * 响应时间戳
+     */
+    private long timestamp = Calendar.getInstance().getTimeInMillis();
+
+    public static ResultData ok() {
+        return ok(null);
+    }
+
+    public static ResultData ok(Object data) {
+        return ok(ResultCode.SUCCESS.msg, data);
+    }
+
+    public static ResultData ok(String msg, Object data) {
+        return base(ResultCode.SUCCESS.code, msg, data, true);
+    }
+
+    public static ResultData ok(int page, int pageSize, int total, Object data) {
+        return ok(new PageInfo(page, pageSize, total, data));
+    }
+
+    public static ResultData error( String msg) {
+        return error(ResultCode.ERROR.code, msg, null);
+    }
+    public static ResultData error(int code, String msg) {
+        return error(code, msg, null);
+    }
+
+    public static ResultData error(int code, String msg, Object data) {
+        return base(code, msg, data, false);
+    }
+
+    public static ResultData error(ResultCode errorCode, Object data) {
+        return base(errorCode.code, errorCode.msg, data, false);
+    }
+
+    public static ResultData error(ResultCode errorCode) {
+        return error(errorCode.code, errorCode.msg);
+    }
+    public static String errorString(ResultCode errorCode) {
+        return JSONObject.toJSONString(error(errorCode.code, errorCode.msg));
+    }
+
+    private static ResultData base(int code, String msg, Object data, Boolean success) {
+        ResultData rd = new ResultData();
+        rd.setCode(code);
+        rd.setMessage(msg);
+        rd.setData(data);
+        rd.setSuccess(success);
+        return rd;
+    }
+}

+ 145 - 0
src/main/java/com/fdkankan/tk/common/util/JwtUtil.java

@@ -0,0 +1,145 @@
+package com.fdkankan.tk.common.util;
+
+import com.auth0.jwt.JWT;
+import com.auth0.jwt.exceptions.JWTDecodeException;
+import com.auth0.jwt.interfaces.DecodedJWT;
+import io.jsonwebtoken.Claims;
+import io.jsonwebtoken.JwtBuilder;
+import io.jsonwebtoken.Jwts;
+import io.jsonwebtoken.SignatureAlgorithm;
+
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.UUID;
+
+public class JwtUtil {
+
+    //生成签名的时候使用的秘钥secret
+    private static final String SECRET = "XX#$%()(#*!()!KL<><MQLMNQNQJQK&sdfkjsdrow32234545fdf>?N<:{LWPW";
+
+    /**
+     * 用户登录成功后生成Jwt
+     * 使用Hs256算法  私匙使用用户密码
+     *
+     * @param ttlMillis jwt过期时间
+     * @param userName  用户名
+     * @return
+     */
+    public static String createJWT(long ttlMillis, String userName, String loginType) {
+        //指定签名的时候使用的签名算法,也就是header那部分,jjwt已经将这部分内容封装好了。
+        SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
+
+        //生成JWT的时间
+        long nowMillis = System.currentTimeMillis();
+        Date now = new Date(nowMillis);
+
+        //创建payload的私有声明(根据特定的业务需要添加,如果要拿这个做验证,一般是需要和jwt的接收方提前沟通好验证方式的)
+        Map<String, Object> claims = new HashMap<String, Object>();
+        claims.put("userName", userName);
+        claims.put("loginType", loginType);
+
+        //下面就是在为payload添加各种标准声明和私有声明了
+        //这里其实就是new一个JwtBuilder,设置jwt的body
+        JwtBuilder builder = Jwts.builder()
+                //如果有私有声明,一定要先设置这个自己创建的私有的声明,这个是给builder的claim赋值,一旦写在标准的声明赋值之后,就是覆盖了那些标准的声明的
+                .setClaims(claims)
+                //设置jti(JWT ID):是JWT的唯一标识,根据业务需要,这个可以设置为一个不重复的值,主要用来作为一次性token,从而回避重放攻击。
+                .setId(UUID.randomUUID().toString())
+                //iat: jwt的签发时间
+                .setIssuedAt(now)
+                //代表这个JWT的主体,即它的所有人,这个是一个json格式的字符串,可以存放什么userid,roldid之类的,作为什么用户的唯一标志。
+                .setSubject(userName)
+                //设置签名使用的签名算法和签名使用的秘钥
+                .signWith(signatureAlgorithm, SECRET);
+
+        if (ttlMillis >= 0) {
+            long expMillis = nowMillis + ttlMillis;
+            Date exp = new Date(expMillis);
+            //设置过期时间
+            builder.setExpiration(exp);
+        }/*else{
+            //设置过期时间半小时
+            DateTime expDate = new DateTime().plusMinutes(30);
+            builder.setExpiration(expDate.toDate());
+        }*/
+        return builder.compact();
+    }
+
+
+    /**
+     * Token的解密
+     * @param token 加密后的token
+     * @return
+     */
+    public static Claims parseJWT(String token) {
+        //得到DefaultJwtParser
+        Claims claims = Jwts.parser()
+                //设置签名的秘钥
+                .setSigningKey(SECRET)
+                //设置需要解析的jwt
+                .parseClaimsJws(token).getBody();
+        return claims;
+    }
+
+
+    /**
+     * 校验token
+     * 在这里可以使用官方的校验,我这里校验的是token中携带的密码于数据库一致的话就校验通过
+     * @param token
+     * @param userName
+     * @return
+     */
+    public static Boolean isVerify(String token, String userName) {
+
+        try {
+            //得到DefaultJwtParser
+            Claims claims = Jwts.parser()
+                //设置签名的秘钥
+                .setSigningKey(SECRET)
+                //设置需要解析的jwt
+                .parseClaimsJws(token).getBody();
+
+            if (claims.get("userName").equals(userName)) {
+                return true;
+            }
+        }catch (Exception e){
+            return false;
+        }
+        return false;
+    }
+
+    /**
+     * 获得token中的信息无需secret解密也能获得
+     *
+     * @return token中包含的用户名
+     */
+    public static String getUsername(String token) {
+        try {
+            DecodedJWT jwt = JWT.decode(token);
+            return jwt.getClaim("userName").asString();
+        } catch (JWTDecodeException e) {
+            return null;
+        }
+    }
+    /**
+     * 获得token中的信息无需secret解密也能获得
+     *
+     * @return token中包含的用户名
+     */
+    public static String getLoginType(String token) {
+        try {
+            DecodedJWT jwt = JWT.decode(token);
+            return jwt.getClaim("loginType").asString();
+        } catch (JWTDecodeException e) {
+            return null;
+        }
+    }
+
+    public static void main(String[] args) {
+        long start = System.currentTimeMillis();
+        System.out.println(getUsername("eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMzUzNjUwMTEyOCIsImxvZ2luVHlwZSI6InVzZXIiLCJ1c2VyTmFtZSI6IjEzNTM2NTAxMTI4IiwiaWF0IjoxNjU4ODI4NjA2LCJqdGkiOiI4NjczYjFiMi0xYjc4LTRmMTEtOGQ5My05OWE0OWRlMGVhMjAifQ.0oYzEwTsV1iLn_cMeiqLc5upJfcYipRbIDSndSxeuK0"));
+        System.out.println(System.currentTimeMillis() - start);
+    }
+
+}

+ 5 - 0
src/main/java/com/fdkankan/tk/common/util/RedisKeyUtil.java

@@ -0,0 +1,5 @@
+package com.fdkankan.tk.common.util;
+
+public class RedisKeyUtil {
+
+}

+ 152 - 0
src/main/java/com/fdkankan/tk/common/util/ShellUtil.java

@@ -0,0 +1,152 @@
+package com.fdkankan.tk.common.util;
+
+import cn.hutool.core.io.file.FileReader;
+import com.alibaba.fastjson.JSONObject;
+import lombok.extern.slf4j.Slf4j;
+
+import java.io.BufferedReader;
+import java.io.Closeable;
+import java.io.IOException;
+import java.io.InputStreamReader;
+
+@Slf4j
+public class ShellUtil {
+
+    public final static String LAS_TO_BIN = "bash  /home/ubuntu/bin/PotreeConverter.sh @inPath @outPath ''";
+        /**
+         * 执行系统命令, 返回执行结果
+         * @param cmd 需要执行的命令
+         */
+    public static void execCmd(String cmd) {
+        StringBuilder result = new StringBuilder();
+
+        Process process = null;
+        BufferedReader bufrIn = null;
+        BufferedReader bufrError = null;
+        long startTime = System.currentTimeMillis();
+
+        try {
+            // 执行命令, 返回一个子进程对象(命令在子进程中执行)
+            log.info("执行cmd:{}",cmd);
+            process = Runtime.getRuntime().exec(cmd);
+            // 获取命令执行结果, 有两个结果: 正常的输出 和 错误的输出(PS: 子进程的输出就是主进程的输入)
+            //处理InputStream的线程
+            threadRun(process);
+            // 方法阻塞, 等待命令执行完成(成功会返回0)
+            process.waitFor();
+        }catch (Exception e){
+            e.printStackTrace();
+        }finally {
+            closeStream(bufrIn);
+            closeStream(bufrError);
+            // 销毁子进程
+            if (process != null) {
+                process.destroy();
+            }
+        }
+        // 返回执行结果
+        log.info("执行cmd:{},结果:{},耗时:{}", cmd,result.toString(),System.currentTimeMillis() -startTime);
+    }
+
+    private static void threadRun(Process process) {
+        new Thread() {
+            @Override
+            public void run() {
+                BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()));
+                String line = null;
+                try {
+                    while((line = in.readLine()) != null) {
+                       log.debug("output: " + line);
+                    }
+                }
+                catch (IOException e) {
+                    e.printStackTrace();
+                }
+                finally {
+                    try {
+                        in.close();
+                    }
+                    catch (IOException e) {
+                        e.printStackTrace();
+                    }
+                }
+            }
+        }.start();
+        new Thread() {
+            @Override
+            public void run() {
+                BufferedReader err = new BufferedReader(new InputStreamReader(process.getErrorStream()));
+                String line = null;
+                try {
+                    while((line = err.readLine()) != null) {
+                        log.debug("err: " + line);
+                    }
+                }
+                catch (IOException e) {
+                    e.printStackTrace();
+                }
+                finally {
+                    try {
+                        err.close();
+                    }
+                    catch (IOException e) {
+                        e.printStackTrace();
+                    }
+                }
+            }
+        }.start();
+    }
+
+    private static void closeStream(Closeable stream) {
+        if (stream != null) {
+            try {
+                stream.close();
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+    }
+
+    public static void unZip(String zipPath, String dataPath) {
+        log.info("解压zip开始");
+        String command = "unzip -O GBK/GB18030CP936 " + zipPath + " -d " + dataPath;
+        execCmd(command);
+        log.info("解压zip完毕:" + command);
+    }
+
+    public static void unRar(String rarPath, String dataPath) {
+        log.info("解压rar开始");
+        String command = "unrar e " + rarPath + " " + dataPath;
+        execCmd(command);
+        log.info("解压rar完毕:" + command);
+    }
+
+    /**
+     * 修改cloud.js 文件
+     *
+     * @param path
+     * @return
+     * @throws IOException
+     */
+    public static JSONObject fixCloud(String path) throws IOException {
+        FileReader fileReader = new FileReader(path);
+        String str = fileReader.readString();
+        JSONObject json = JSONObject.parseObject(str);
+
+        String[] pointAttributes = {
+                "POSITION_CARTESIAN",
+                "COLOR_PACKED",
+                "NORMAL_OCT16"
+        };
+
+//    String[] pointAttributes = {
+//        "POSITION_CARTESIAN",
+//        "COLOR_PACKED",
+//        "NORMAL_OCT16",
+//        "INTENSITY",
+//        "CLASSIFICATION"
+//    };
+        json.put("pointAttributes", pointAttributes);
+        return json;
+    }
+}

+ 14 - 0
src/main/java/com/fdkankan/tk/common/util/StringUtils.java

@@ -0,0 +1,14 @@
+package com.fdkankan.tk.common.util;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class StringUtils {
+
+    public static boolean isChinese(String str) {
+        String regEx = "[\\u4e00-\\u9fa5]+";
+        Pattern p = Pattern.compile(regEx);
+        Matcher m = p.matcher(str);
+        return m.find();
+    }
+}

+ 22 - 0
src/main/java/com/fdkankan/tk/config/MybatisPlusPageConfig.java

@@ -0,0 +1,22 @@
+package com.fdkankan.tk.config;
+
+import com.baomidou.mybatisplus.annotation.DbType;
+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;
+
+
+@Configuration
+public class MybatisPlusPageConfig {
+
+    /**
+     * mybatisPlus配置分页插件
+     */
+    @Bean
+    public MybatisPlusInterceptor mybatisPlusInterceptor() {
+        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
+        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
+        return interceptor;
+    }
+}

+ 56 - 0
src/main/java/com/fdkankan/tk/config/OriginFilter.java

@@ -0,0 +1,56 @@
+package com.fdkankan.tk.config;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.boot.web.servlet.ServletComponentScan;
+import org.springframework.stereotype.Component;
+
+import javax.servlet.*;
+import javax.servlet.annotation.WebFilter;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+
+
+@Component("originFilter")
+@ServletComponentScan
+@WebFilter(urlPatterns = "/*", filterName = "shiroLoginFilter")
+public class OriginFilter implements Filter {
+
+	private FilterConfig config = null;
+
+	@Override
+	public void init(FilterConfig config) throws ServletException {
+		this.config = config;
+	}
+
+	@Override
+	public void destroy() {
+		this.config = null;
+	}
+
+	@Override
+	public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
+
+		HttpServletRequest request = (HttpServletRequest) servletRequest;
+		HttpServletResponse response = (HttpServletResponse) servletResponse;
+		response.setHeader("x-frame-options", "SAMEORIGIN");
+		// 不使用*,自动适配跨域域名,避免携带Cookie时失效
+		String origin = request.getHeader("Origin");
+		if (StringUtils.isNotBlank(origin)) {
+			response.setHeader("Access-Control-Allow-Origin", origin); }
+		// 自适应所有自定义头
+		String headers = request.getHeader("Access-Control-Request-Headers");
+		if(StringUtils.isNotBlank(headers)) {
+			response.setHeader("Access-Control-Allow-Headers", headers);
+			response.setHeader("Access-Control-Expose-Headers", headers);
+		}
+		// 允许跨域的请求方法类型
+		response.setHeader("Access-Control-Allow-Methods", "*");
+		// 预检命令(OPTIONS)缓存时间,单位:秒
+		response.setHeader("Access-Control-Max-Age", "3600");
+		// 明确许可客户端发送Cookie,不允许删除字段即可
+		response.setHeader("Access-Control-Allow-Credentials", "true");
+		filterChain.doFilter(request, response);
+	}
+}
+

+ 37 - 0
src/main/java/com/fdkankan/tk/config/WebAppConfig.java

@@ -0,0 +1,37 @@
+package com.fdkankan.tk.config;
+
+import com.fdkankan.tk.interceptor.TokenInterceptor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.CorsRegistry;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+
+@Configuration
+public class WebAppConfig implements WebMvcConfigurer {
+
+	@Autowired
+	TokenInterceptor tokenInterceptor;
+
+	@Override
+	public void addCorsMappings(CorsRegistry registry) {
+		registry.addMapping("/**").allowCredentials(true).allowedHeaders("*").allowedOrigins("*").allowedMethods("*");
+
+	}
+
+	@Override
+	public void addInterceptors(InterceptorRegistry registry) {
+		registry.addInterceptor(tokenInterceptor).addPathPatterns("/**")
+				.excludePathPatterns("/test/**");
+		WebMvcConfigurer.super.addInterceptors(registry);
+	}
+
+	@Override
+	public void addResourceHandlers(ResourceHandlerRegistry registry) {
+		WebMvcConfigurer.super.addResourceHandlers(registry);
+	}
+
+}
+

+ 21 - 0
src/main/java/com/fdkankan/tk/controller/RoomController.java

@@ -0,0 +1,21 @@
+package com.fdkankan.tk.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author 
+ * @since 2022-09-19
+ */
+@RestController
+@RequestMapping("/tk/room")
+public class RoomController {
+
+}
+

+ 21 - 0
src/main/java/com/fdkankan/tk/controller/RoomNumController.java

@@ -0,0 +1,21 @@
+package com.fdkankan.tk.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author 
+ * @since 2022-09-19
+ */
+@RestController
+@RequestMapping("/tk/roomNum")
+public class RoomNumController {
+
+}
+

+ 87 - 0
src/main/java/com/fdkankan/tk/entity/Room.java

@@ -0,0 +1,87 @@
+package com.fdkankan.tk.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.util.Date;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author 
+ * @since 2022-09-19
+ */
+@Getter
+@Setter
+@TableName("t_room")
+public class Room implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 房间id
+     */
+    @TableId(value = "room_id", type = IdType.AUTO)
+    private Integer roomId;
+
+    /**
+     * 房间标题
+     */
+    @TableField("room_title")
+    private String roomTitle;
+
+    /**
+     * 房间简介
+     */
+    @TableField("room_info")
+    private String roomInfo;
+
+    /**
+     * 房间主持人昵称
+     */
+    @TableField("room_host_name")
+    private String roomHostName;
+
+    /**
+     * 房间主持人用户名
+     */
+    @TableField("room_user_name")
+    private String roomUserName;
+
+    /**
+     * 房间封面图
+     */
+    @TableField("room_cover_url")
+    private String roomCoverUrl;
+
+    /**
+     * 房间浏览量
+     */
+    @TableField("room_view_count")
+    private Integer roomViewCount;
+
+    /**
+     * 房间分享链接
+     */
+    @TableField("room_share_url")
+    private String roomShareUrl;
+
+    @TableField("tb_status")
+    @TableLogic
+    private Integer tbStatus;
+
+    @TableField("create_time")
+    private Date createTime;
+
+    @TableField("update_time")
+    private Date updateTime;
+
+
+}

+ 57 - 0
src/main/java/com/fdkankan/tk/entity/RoomNum.java

@@ -0,0 +1,57 @@
+package com.fdkankan.tk.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.util.Date;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author 
+ * @since 2022-09-19
+ */
+@Getter
+@Setter
+@TableName("t_room_num")
+public class RoomNum implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 房间场景关系表
+     */
+    @TableId(value = "room_num_id", type = IdType.AUTO)
+    private Integer roomNumId;
+
+    /**
+     * 房间id
+     */
+    @TableField("room_id")
+    private Integer roomId;
+
+    /**
+     * 场景码
+     */
+    @TableField("num")
+    private String num;
+
+    @TableField("tb_status")
+    @TableLogic
+    private Integer tbStatus;
+
+    @TableField("create_time")
+    private Date createTime;
+
+    @TableField("update_time")
+    private Date updateTime;
+
+
+}

+ 22 - 0
src/main/java/com/fdkankan/tk/exception/BusinessException.java

@@ -0,0 +1,22 @@
+package com.fdkankan.tk.exception;
+
+import com.fdkankan.tk.common.ResultCode;
+import lombok.Data;
+
+/**
+ * 自定义业务异常类
+ */
+@Data
+public class BusinessException extends RuntimeException {
+    private int code;
+    private String message;
+
+    public BusinessException(Integer code, String msg){
+        this.code = code;
+        this.message = msg;
+    }
+    public BusinessException(ResultCode errorCode) {
+        this.code = errorCode.code;
+        this.message = errorCode.msg;
+    }
+}

+ 35 - 0
src/main/java/com/fdkankan/tk/exception/GlobalExceptionHandler.java

@@ -0,0 +1,35 @@
+package com.fdkankan.tk.exception;
+
+import com.fdkankan.tk.common.ResultData;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+
+/**
+ * 全局异常处理器
+ */
+@RestControllerAdvice
+@Slf4j
+public class GlobalExceptionHandler {
+
+    /**
+     * 处理未知异常
+     */
+    @ResponseBody
+    @ExceptionHandler(value = Exception.class)
+    public ResultData exceptionHandler(Exception e) throws Exception {
+        log.error("服务错误:", e);
+        return ResultData.error( 500, e.getMessage());
+    }
+
+    /**
+     * 处理业务异常
+     */
+    @ResponseBody
+    @ExceptionHandler(value = BusinessException.class)
+    public ResultData businessExceptionHandler(BusinessException e) {
+        log.info("业务异常code:{},message:{}", e.getCode(), e.getMessage());
+        return ResultData.error(e.getCode(), e.getMessage());
+    }
+}

+ 4 - 4
src/main/java/com/fdkankan/tk/generate/AutoGenerate.java

@@ -17,8 +17,8 @@ public class AutoGenerate {
 
         String path =System.getProperty("user.dir") ;
 
-        generate(path,"fusion", getTables(new String[]{
-                "t_fusion_guide_path",
+        generate(path,"tk", getTables(new String[]{
+                "t_room","t_room_num",
         }));
 
 //        generate(path,"goods", getTables(new String[]{
@@ -46,8 +46,8 @@ public class AutoGenerate {
 
 
     public static void  generate(String path,String moduleName,  List<String> tables){
-        FastAutoGenerator.create("jdbc:mysql://192.168.0.47:13306/fd_fusion",
-                "root","4dkk2020cuikuan%")
+        FastAutoGenerator.create("jdbc:mysql://120.24.144.164:3306/4dkankan_takelook",
+                "root","4Dage@4Dage#@168")
                 .globalConfig(builder -> {
                     builder.author("")               //作者
                             .outputDir(path+"\\src\\main\\java")    //输出路径(写到java目录)

+ 87 - 0
src/main/java/com/fdkankan/tk/interceptor/TokenInterceptor.java

@@ -0,0 +1,87 @@
+package com.fdkankan.tk.interceptor;
+
+
+import com.alibaba.fastjson.JSONObject;
+import com.fdkankan.redis.constant.RedisKey;
+import com.fdkankan.redis.util.RedisUtil;
+import com.fdkankan.tk.common.ResultCode;
+import com.fdkankan.tk.common.ResultData;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.tomcat.util.http.MimeHeaders;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.web.servlet.HandlerInterceptor;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.lang.reflect.Field;
+
+@Component
+@Slf4j
+public class TokenInterceptor implements HandlerInterceptor {
+
+	@Autowired
+	private RedisUtil redisUtil;
+
+	@Override
+	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
+		response.setContentType("text/html;charset=UTF-8");
+		String token = request.getHeader("token");
+		if(StringUtils.isEmpty(token)){
+			String share = request.getHeader("share");
+			if(StringUtils.isNotBlank(share) && "1".equals(share) && request.getMethod().equals("GET")){
+				return true;
+			}
+			this.needLogin(request,response);
+			return false;
+		}
+		try {
+			String fdToken = String.format(RedisKey.TOKEN_V3,token);
+			if( redisUtil.hasKey(fdToken)){
+				redisUtil.expire(fdToken,6 * 60 * 60);
+				return true;
+			}
+		}catch (Exception e){
+			e.printStackTrace();
+		}
+		this.needLogin(request,response);
+		return false;
+	}
+
+	private void needLogin(HttpServletRequest request, HttpServletResponse response) {
+		try {
+			String result = JSONObject.toJSONString(ResultData.error(ResultCode.USER_NOT_LOGIN));
+			response.getWriter().append(result);
+		} catch (IOException e) {
+			log.info("LoginInterceptor|needLogin|IOException|" + e);
+			e.printStackTrace();
+		}
+	}
+
+
+	/**
+	 * 修改header信息,key-value键值对儿加入到header中
+	 */
+	private void reflectSetparam(HttpServletRequest request,String key,String value){
+		Class<? extends HttpServletRequest> requestClass = request.getClass();
+		System.out.println("request实现类="+requestClass.getName());
+		try {
+			Field request1 = requestClass.getDeclaredField("request");
+			request1.setAccessible(true);
+			Object o = request1.get(request);
+			Field coyoteRequest = o.getClass().getDeclaredField("coyoteRequest");
+			coyoteRequest.setAccessible(true);
+			Object o1 = coyoteRequest.get(o);
+			System.out.println("coyoteRequest实现类="+o1.getClass().getName());
+			Field headers = o1.getClass().getDeclaredField("headers");
+			headers.setAccessible(true);
+			MimeHeaders o2 = (MimeHeaders)headers.get(o1);
+			o2.addValue(key).setString(value);
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
+}
+

+ 18 - 0
src/main/java/com/fdkankan/tk/mapper/IRoomMapper.java

@@ -0,0 +1,18 @@
+package com.fdkankan.tk.mapper;
+
+import com.fdkankan.tk.entity.Room;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2022-09-19
+ */
+@Mapper
+public interface IRoomMapper extends BaseMapper<Room> {
+
+}

+ 18 - 0
src/main/java/com/fdkankan/tk/mapper/IRoomNumMapper.java

@@ -0,0 +1,18 @@
+package com.fdkankan.tk.mapper;
+
+import com.fdkankan.tk.entity.RoomNum;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2022-09-19
+ */
+@Mapper
+public interface IRoomNumMapper extends BaseMapper<RoomNum> {
+
+}

+ 16 - 0
src/main/java/com/fdkankan/tk/service/IRoomNumService.java

@@ -0,0 +1,16 @@
+package com.fdkankan.tk.service;
+
+import com.fdkankan.tk.entity.RoomNum;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author 
+ * @since 2022-09-19
+ */
+public interface IRoomNumService extends IService<RoomNum> {
+
+}

+ 16 - 0
src/main/java/com/fdkankan/tk/service/IRoomService.java

@@ -0,0 +1,16 @@
+package com.fdkankan.tk.service;
+
+import com.fdkankan.tk.entity.Room;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author 
+ * @since 2022-09-19
+ */
+public interface IRoomService extends IService<Room> {
+
+}

+ 20 - 0
src/main/java/com/fdkankan/tk/service/impl/RoomNumServiceImpl.java

@@ -0,0 +1,20 @@
+package com.fdkankan.tk.service.impl;
+
+import com.fdkankan.tk.entity.RoomNum;
+import com.fdkankan.tk.mapper.IRoomNumMapper;
+import com.fdkankan.tk.service.IRoomNumService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2022-09-19
+ */
+@Service
+public class RoomNumServiceImpl extends ServiceImpl<IRoomNumMapper, RoomNum> implements IRoomNumService {
+
+}

+ 20 - 0
src/main/java/com/fdkankan/tk/service/impl/RoomServiceImpl.java

@@ -0,0 +1,20 @@
+package com.fdkankan.tk.service.impl;
+
+import com.fdkankan.tk.entity.Room;
+import com.fdkankan.tk.mapper.IRoomMapper;
+import com.fdkankan.tk.service.IRoomService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2022-09-19
+ */
+@Service
+public class RoomServiceImpl extends ServiceImpl<IRoomMapper, Room> implements IRoomService {
+
+}

+ 51 - 0
src/main/resources/application-local.yaml

@@ -0,0 +1,51 @@
+spring:
+  datasource:
+    type: com.zaxxer.hikari.HikariDataSource          # 数据源类型:HikariCP
+    driver-class-name: com.mysql.jdbc.Driver          # mysql驱动
+    url: jdbc:mysql://120.24.144.164:3306/4dkankan_takelook?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai&allowMultiQueries=true
+    username: root
+    password: 4Dage@4Dage#@168
+    hikari:
+      connection-timeout: 30000         # 等待连接池分配连接的最大时长(毫秒),超过这个时长还没可用的连接则发生SQLException, 默认:30秒
+      minimum-idle: 5                   # 最小连接数
+      maximum-pool-size: 20             # 最大连接数
+      auto-commit: true                 # 事务自动提交
+      idle-timeout: 600000              # 连接超时的最大时长(毫秒),超时则被释放(retired),默认:10分钟
+      pool-name: DateSourceHikariCP     # 连接池名字
+      max-lifetime: 1800000             # 连接的生命时长(毫秒),超时而且没被使用则被释放(retired),默认:30分钟 1800000ms
+      connection-test-query: SELECT 1   # 连接测试语句
+  redis:
+    host: 120.25.146.52
+    port: 6379
+    timeout: 6000ms
+    password:
+    jedis:
+      pool:
+        max-active: 10  #连接池最大连接数(使用负值表示没有限制)
+        max-idle: 10 # 连接池中的最大空闲连接
+        min-idle: 5 # 连接池中的最小空闲连接
+        max-wait: -1 # 连接池最大阻塞等待时间(使用负值表示没有限制)
+    lettuce:
+      shutdown-timeout: 0ms
+
+4dkk:
+  laserService:
+    #深时(激光)地址 生产环境:https://laser.4dkankan.com/
+    basePath: http://uat-laser.4dkankan.com
+    port: 80
+    #basePath: http://192.168.0.152:8080
+    #port: 8080
+  fdService:
+    #官网生产环境:https://www.4dkankan.com      http://test.4dkankan.com
+    basePath: http://test.4dkankan.com
+    port: 80
+    #basePath: http://192.168.0.38/4dkankan_v2
+    #port: 8080
+  newFdService:
+    #官网生产环境:https://www.4dkankan.com
+    basePath: http://v4-test.4dkankan.com
+    port: 80
+  overallService:
+    #全景看看生产环境 host: https://www.4dkankan.com/qjkankan
+    basePath: http://test.4dkankan.com/qjkankan
+    port: 80

+ 49 - 0
src/main/resources/application.yaml

@@ -0,0 +1,49 @@
+spring:
+  profiles:
+    active: ${activeProfile:local}
+  servlet:
+    multipart:
+      max-file-size: 1000MB
+      maxRequestSize: 1000MB
+
+server:
+  port: 8808
+  servlet:
+    context-path: /takelook
+  tomcat:
+    max-http-form-post-size: -1
+
+
+
+logging:
+  config: classpath:logback-spring.xml
+mybatis-plus:
+  configuration:
+    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #开启sql日志
+
+
+
+forest:
+  ## 日志总开关,打开/关闭Forest请求/响应日志(默认为 true)
+  log-enabled: true
+  ## 打开/关闭Forest请求日志(默认为 true)
+  log-request: true
+  ## 打开/关闭Forest响应状态日志(默认为 true)
+  log-response-status: true
+  ## 打开/关闭Forest响应内容日志(默认为 false)
+  log-response-content: true
+  ## 请求超时时间,单位为毫秒, 默认值为3000
+  timeout: 3000000
+  ## 连接超时时间,单位为毫秒, 默认值为2000
+  connect-timeout: 3000000
+
+upload:
+  type: oss
+  query-path: https://4dkk.4dage.com/
+oss:
+  #point: http://oss-cn-shenzhen-internal.aliyuncs.com
+  point: http://oss-cn-shenzhen-internal.aliyuncs.com
+  key: LTAIUrvuHqj8pvry
+  secrey: JLOVl0k8Ke0aaM8nLMMiUAZ3EiiqI4
+  bucket: 4dkankan
+  small: ?x-oss-process=image/resize,m_fill,h_%s,w_%s

+ 254 - 0
src/main/resources/logback-spring.xml

@@ -0,0 +1,254 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出 -->
+<!-- scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true -->
+<!-- scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 -->
+<!-- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
+<configuration scan="true" scanPeriod="10 seconds">
+
+	<contextName>logback</contextName>
+	<!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。 -->
+	<property name="log.path" value="/home/take-look/logs" />
+
+	<!-- 彩色日志 -->
+	<!-- 彩色日志依赖的渲染类 -->
+	<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
+	<conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
+	<conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />
+	<!-- 彩色日志格式 -->
+	<property name="CONSOLE_LOG_PATTERN"
+			  value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}" />
+
+	<!--输出到控制台 -->
+	<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
+		<!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息 -->
+		<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+			<level>info</level>
+		</filter>
+		<encoder>
+			<Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
+			<!-- 设置字符集 -->
+			<charset>UTF-8</charset>
+		</encoder>
+	</appender>
+	<!--输出到文件 -->
+
+	<!-- 时间滚动输出 level为 DEBUG 日志 -->
+	<appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+		<!-- 正在记录的日志文件的路径及文件名 -->
+		<file>${log.path}/log_debug.log</file>
+		<!--日志文件输出格式 -->
+		<encoder>
+			<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
+			<charset>UTF-8</charset> <!-- 设置字符集 -->
+		</encoder>
+		<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
+		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+			<!-- 日志归档 -->
+			<fileNamePattern>${log.path}/debug/log-debug-%d{yyyy-MM-dd}.%i.log
+			</fileNamePattern>
+			<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+				<maxFileSize>100MB</maxFileSize>
+			</timeBasedFileNamingAndTriggeringPolicy>
+			<!--日志文件保留天数 -->
+			<maxHistory>15</maxHistory>
+		</rollingPolicy>
+		<!-- 此日志文件只记录debug级别的 -->
+		<filter class="ch.qos.logback.classic.filter.LevelFilter">
+			<level>debug</level>
+			<onMatch>ACCEPT</onMatch>
+			<onMismatch>DENY</onMismatch>
+		</filter>
+	</appender>
+
+	<!-- 时间滚动输出 level为 INFO 日志 -->
+	<appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+		<!-- 正在记录的日志文件的路径及文件名 -->
+		<file>${log.path}/log_info.log</file>
+		<!--日志文件输出格式 -->
+		<encoder>
+			<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
+			<charset>UTF-8</charset>
+		</encoder>
+		<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
+		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+			<!-- 每天日志归档路径以及格式 -->
+			<fileNamePattern>${log.path}/info/log-info-%d{yyyy-MM-dd}.%i.log
+			</fileNamePattern>
+			<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+				<maxFileSize>100MB</maxFileSize>
+			</timeBasedFileNamingAndTriggeringPolicy>
+			<!--日志文件保留天数 -->
+			<maxHistory>15</maxHistory>
+		</rollingPolicy>
+		<!-- 此日志文件只记录info级别的 -->
+		<filter class="ch.qos.logback.classic.filter.LevelFilter">
+			<level>info</level>
+			<onMatch>ACCEPT</onMatch>
+			<onMismatch>DENY</onMismatch>
+		</filter>
+	</appender>
+
+	<!-- 时间滚动输出 level为 WARN 日志 -->
+	<appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+		<!-- 正在记录的日志文件的路径及文件名 -->
+		<file>${log.path}/log_warn.log</file>
+		<!--日志文件输出格式 -->
+		<encoder>
+			<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
+			<charset>UTF-8</charset> <!-- 此处设置字符集 -->
+		</encoder>
+		<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
+		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+			<fileNamePattern>${log.path}/warn/log-warn-%d{yyyy-MM-dd}.%i.log
+			</fileNamePattern>
+			<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+				<maxFileSize>100MB</maxFileSize>
+			</timeBasedFileNamingAndTriggeringPolicy>
+			<!--日志文件保留天数 -->
+			<maxHistory>15</maxHistory>
+		</rollingPolicy>
+		<!-- 此日志文件只记录warn级别的 -->
+		<filter class="ch.qos.logback.classic.filter.LevelFilter">
+			<level>warn</level>
+			<onMatch>ACCEPT</onMatch>
+			<onMismatch>DENY</onMismatch>
+		</filter>
+	</appender>
+
+
+	<!-- 时间滚动输出 level为 ERROR 日志 -->
+	<appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+		<!-- 正在记录的日志文件的路径及文件名 -->
+		<file>${log.path}/log_error.log</file>
+		<!--日志文件输出格式 -->
+		<encoder>
+			<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
+			<charset>UTF-8</charset> <!-- 此处设置字符集 -->
+		</encoder>
+		<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
+		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+			<fileNamePattern>${log.path}/error/log-error-%d{yyyy-MM-dd}.%i.log
+			</fileNamePattern>
+			<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+				<maxFileSize>100MB</maxFileSize>
+			</timeBasedFileNamingAndTriggeringPolicy>
+			<!--日志文件保留天数 -->
+			<maxHistory>15</maxHistory>
+		</rollingPolicy>
+		<!-- 此日志文件只记录ERROR级别的 -->
+		<filter class="ch.qos.logback.classic.filter.LevelFilter">
+			<level>ERROR</level>
+			<onMatch>ACCEPT</onMatch>
+			<onMismatch>DENY</onMismatch>
+		</filter>
+	</appender>
+
+	<appender name="PROGRAM_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+		<!-- 正在记录的日志文件的路径及文件名 -->
+		<file>${log.path}/program/log_program.log</file>
+		<!--日志文件输出格式 -->
+		<encoder>
+			<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
+			<charset>UTF-8</charset> <!-- 此处设置字符集 -->
+		</encoder>
+		<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
+		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+			<fileNamePattern>${log.path}/program/log-program-%d{yyyy-MM-dd}.%i.log
+			</fileNamePattern>
+			<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+				<maxFileSize>100MB</maxFileSize>
+			</timeBasedFileNamingAndTriggeringPolicy>
+			<!--日志文件保留天数 -->
+			<maxHistory>15</maxHistory>
+		</rollingPolicy>
+		<!-- 此日志文件只记录ERROR级别的 -->
+		<filter class="ch.qos.logback.classic.filter.LevelFilter">
+			<onMatch>ACCEPT</onMatch>
+			<onMismatch>DENY</onMismatch>
+		</filter>
+	</appender>
+	<logger name="programLog" level="INFO" additivity="true">
+		<appender-ref ref="PROGRAM_FILE"/>
+	</logger>
+
+	<appender name="VISIT_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+		<!-- 正在记录的日志文件的路径及文件名 -->
+		<file>${log.path}/visit/log_visit.log</file>
+		<!--日志文件输出格式 -->
+		<encoder>
+			<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
+			<charset>UTF-8</charset> <!-- 此处设置字符集 -->
+		</encoder>
+		<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
+		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+			<fileNamePattern>${log.path}/visit/log-visit-%d{yyyy-MM-dd}.%i.log
+			</fileNamePattern>
+			<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+				<maxFileSize>100MB</maxFileSize>
+			</timeBasedFileNamingAndTriggeringPolicy>
+			<!--日志文件保留天数 -->
+			<maxHistory>15</maxHistory>
+		</rollingPolicy>
+		<!-- 此日志文件只记录ERROR级别的 -->
+		<filter class="ch.qos.logback.classic.filter.LevelFilter">
+			<onMatch>ACCEPT</onMatch>
+			<onMismatch>DENY</onMismatch>
+		</filter>
+	</appender>
+	<logger name="visitLog" level="INFO" additivity="true">
+		<appender-ref ref="VISIT_FILE"/>
+	</logger>
+
+
+	<!--  连接时长  -->
+	<appender name="timeLogger" class="ch.qos.logback.core.rolling.RollingFileAppender">
+		<file>${log.path}/timeLogger.log</file>
+		<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+			<level>DEBUG</level>
+		</filter>
+		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+			<fileNamePattern>${log.path}/timeLogger/timeLogger-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+			<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+				<maxFileSize>100MB</maxFileSize>
+			</timeBasedFileNamingAndTriggeringPolicy>
+			<!--日志文件保留天数-->
+			<maxHistory>10</maxHistory>
+		</rollingPolicy>
+		<encoder>
+			<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
+			<charset>UTF-8</charset> <!-- 此处设置字符集 -->
+		</encoder>
+	</appender>
+	<logger name="timeLogger" additivity="false" level="DEBUG">
+		<appender-ref ref="timeLogger"/>
+	</logger>
+
+	<!-- <logger>用来设置某一个包或者具体的某一个类的日志打印级别、 以及指定<appender>。<logger>仅有一个name属性, 一个可选的level和一个可选的addtivity属性。 name:用来指定受此logger约束的某一个包或者具体的某一个类。 level:用来设置打印级别,大小写无关:TRACE,
+		DEBUG, INFO, WARN, ERROR, ALL 和 OFF, 还有一个特俗值INHERITED或者同义词NULL,代表强制执行上级的级别。 如果未设置此属性,那么当前logger将会继承上级的级别。 addtivity:是否向上级logger传递打印信息。默认是true。 -->
+	<!--<logger name="org.springframework.web" level="info"/> -->
+	<!--<logger name="org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor" level="INFO"/> -->
+	<!-- 使用mybatis的时候,sql语句是debug下才会打印,而这里我们只配置了info,所以想要查看sql语句的话,有以下两种操作: 第一种把<root level="info">改成<root level="DEBUG">这样就会打印sql,不过这样日志那边会出现很多其他消息 第二种就是单独给dao下目录配置debug模式,代码如下,这样配置sql语句会打印,其他还是正常info级别: -->
+	<!-- root节点是必选节点,用来指定最基础的日志输出级别,只有一个level属性 level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF, 不能设置为INHERITED或者同义词NULL。默认是DEBUG 可以包含零个或多个元素,标识这个appender将会添加到这个logger。 -->
+
+	<root level="info">
+		<appender-ref ref="CONSOLE" />
+		<appender-ref ref="DEBUG_FILE" />
+		<appender-ref ref="INFO_FILE" />
+		<appender-ref ref="WARN_FILE" />
+		<appender-ref ref="ERROR_FILE" />
+	</root>
+
+	<!--生产环境:输出到文件 -->
+	<!--<springProfile name="pro"> -->
+	<!--<root level="info"> -->
+	<!--<appender-ref ref="CONSOLE" /> -->
+	<!--<appender-ref ref="DEBUG_FILE" /> -->
+	<!--<appender-ref ref="INFO_FILE" /> -->
+	<!--<appender-ref ref="ERROR_FILE" /> -->
+	<!--<appender-ref ref="WARN_FILE" /> -->
+	<!--</root> -->
+	<!--</springProfile> -->
+
+</configuration>
+
+

+ 5 - 0
src/main/resources/mapper/tk/RoomMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.fdkankan.tk.mapper.IRoomMapper">
+
+</mapper>

+ 5 - 0
src/main/resources/mapper/tk/RoomNumMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.fdkankan.tk.mapper.IRoomNumMapper">
+
+</mapper>