lyhzzz 3 лет назад
Сommit
f50b618fcf
60 измененных файлов с 4133 добавлено и 0 удалено
  1. 30 0
      .gitignore
  2. 1 0
      README.md
  3. 136 0
      pom.xml
  4. 23 0
      src/main/java/com/fdkankan/app/AppCenterApplication.java
  5. 61 0
      src/main/java/com/fdkankan/app/common/CameraTypeEnum.java
  6. 9 0
      src/main/java/com/fdkankan/app/common/RedisKeyUtil.java
  7. 97 0
      src/main/java/com/fdkankan/app/common/Result.java
  8. 115 0
      src/main/java/com/fdkankan/app/constant/LoginConstant.java
  9. 33 0
      src/main/java/com/fdkankan/app/controller/LoginController.java
  10. 90 0
      src/main/java/com/fdkankan/app/entity/Camera.java
  11. 150 0
      src/main/java/com/fdkankan/app/entity/CameraDetail.java
  12. 279 0
      src/main/java/com/fdkankan/app/entity/Scene.java
  13. 114 0
      src/main/java/com/fdkankan/app/entity/ScenePlus.java
  14. 150 0
      src/main/java/com/fdkankan/app/entity/ScenePlusExt.java
  15. 231 0
      src/main/java/com/fdkankan/app/entity/ScenePro.java
  16. 141 0
      src/main/java/com/fdkankan/app/entity/User.java
  17. 36 0
      src/main/java/com/fdkankan/app/exception/GlobalExceptionHandler.java
  18. 98 0
      src/main/java/com/fdkankan/app/generate/AutoGenerate.java
  19. 18 0
      src/main/java/com/fdkankan/app/mapper/ICameraDetailMapper.java
  20. 18 0
      src/main/java/com/fdkankan/app/mapper/ICameraMapper.java
  21. 18 0
      src/main/java/com/fdkankan/app/mapper/ISceneMapper.java
  22. 18 0
      src/main/java/com/fdkankan/app/mapper/IScenePlusExtMapper.java
  23. 18 0
      src/main/java/com/fdkankan/app/mapper/IScenePlusMapper.java
  24. 21 0
      src/main/java/com/fdkankan/app/mapper/ISceneProMapper.java
  25. 18 0
      src/main/java/com/fdkankan/app/mapper/IUserMapper.java
  26. 21 0
      src/main/java/com/fdkankan/app/service/ICameraDetailService.java
  27. 21 0
      src/main/java/com/fdkankan/app/service/ICameraService.java
  28. 22 0
      src/main/java/com/fdkankan/app/service/IScenePlusExtService.java
  29. 20 0
      src/main/java/com/fdkankan/app/service/IScenePlusService.java
  30. 21 0
      src/main/java/com/fdkankan/app/service/ISceneProService.java
  31. 22 0
      src/main/java/com/fdkankan/app/service/ISceneService.java
  32. 23 0
      src/main/java/com/fdkankan/app/service/IUserService.java
  33. 40 0
      src/main/java/com/fdkankan/app/service/impl/CameraDetailServiceImpl.java
  34. 35 0
      src/main/java/com/fdkankan/app/service/impl/CameraServiceImpl.java
  35. 95 0
      src/main/java/com/fdkankan/app/service/impl/LoginService.java
  36. 44 0
      src/main/java/com/fdkankan/app/service/impl/ScenePlusExtServiceImpl.java
  37. 33 0
      src/main/java/com/fdkankan/app/service/impl/ScenePlusServiceImpl.java
  38. 40 0
      src/main/java/com/fdkankan/app/service/impl/SceneProServiceImpl.java
  39. 39 0
      src/main/java/com/fdkankan/app/service/impl/SceneServiceImpl.java
  40. 76 0
      src/main/java/com/fdkankan/app/service/impl/UserServiceImpl.java
  41. 33 0
      src/main/java/com/fdkankan/app/util/DateUserUtil.java
  42. 10 0
      src/main/java/com/fdkankan/app/vo/request/LoginParam.java
  43. 9 0
      src/main/java/com/fdkankan/app/vo/response/LoginVo.java
  44. 15 0
      src/main/java/com/fdkankan/app/vo/response/UserVo.java
  45. 40 0
      src/main/resources/bootstrap-dev-eur.yml
  46. 43 0
      src/main/resources/bootstrap-dev.yml
  47. 40 0
      src/main/resources/bootstrap-pro-eur.yml
  48. 40 0
      src/main/resources/bootstrap-pro.yml
  49. 5 0
      src/main/resources/bootstrap.yml
  50. 254 0
      src/main/resources/logback-spring.xml
  51. 5 0
      src/main/resources/mapper/app/CameraDetailMapper.xml
  52. 5 0
      src/main/resources/mapper/app/CameraMapper.xml
  53. 5 0
      src/main/resources/mapper/app/SceneMapper.xml
  54. 5 0
      src/main/resources/mapper/app/ScenePlusExtMapper.xml
  55. 5 0
      src/main/resources/mapper/app/ScenePlusMapper.xml
  56. 5 0
      src/main/resources/mapper/app/SceneProMapper.xml
  57. 5 0
      src/main/resources/mapper/app/UserMapper.xml
  58. 9 0
      src/main/resources/static/apppro.html
  59. BIN
      src/main/resources/static/img/logo.jpg
  60. 1125 0
      src/main/resources/static/txt/SensitiveWord.txt

+ 30 - 0
.gitignore

@@ -0,0 +1,30 @@
+ HELP.md
+/target/
+!.mvn/wrapper/maven-wrapper.jar
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+*.log
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+/build/
+
+### VS Code ###
+.vscode/

+ 1 - 0
README.md

@@ -0,0 +1 @@
+v1.0.0

+ 136 - 0
pom.xml

@@ -0,0 +1,136 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>com.fdkankan.ucenter</groupId>
+    <artifactId>4dkankan-center-user</artifactId>
+    <version>1.0-SNAPSHOT</version>
+    <packaging>jar</packaging>
+
+
+    <parent>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-starter-parent</artifactId>
+        <version>2.3.12.RELEASE</version>
+        <relativePath/>
+    </parent>
+
+    <dependencies>
+
+
+        <dependency>
+            <groupId>com.fdkankan</groupId>
+            <artifactId>4dkankan-utils-fyun</artifactId>
+            <version>2.0.0-SNAPSHOT</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.fdkankan</groupId>
+            <artifactId>4dkankan-utils-redis</artifactId>
+            <version>2.0.0-SNAPSHOT</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.fdkankan</groupId>
+            <artifactId>4dkankan-utils-mongodb</artifactId>
+            <version>2.0.0-SNAPSHOT</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.fdkankan</groupId>
+            <artifactId>4dkankan-utils-db</artifactId>
+            <version>2.0.0-SNAPSHOT</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.fdkankan</groupId>
+            <artifactId>4dkankan-utils-sms</artifactId>
+            <version>2.0.0-SNAPSHOT</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-aop</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.alibaba.cloud</groupId>
+            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
+            <version>2.2.7.RELEASE</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.alibaba.cloud</groupId>
+            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
+            <version>2.2.7.RELEASE</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>1.2.83</version>
+        </dependency>
+
+
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-validation</artifactId>
+        </dependency>
+
+
+        <!--htt请求工具-->
+        <dependency>
+            <groupId>com.dtflys.forest</groupId>
+            <artifactId>forest-spring-boot-starter</artifactId>
+            <version>1.5.24</version>
+        </dependency>
+
+        <!--    分布式日志追踪-->
+        <dependency>
+            <groupId>com.yomahub</groupId>
+            <artifactId>tlog-web-spring-boot-starter</artifactId>
+            <version>1.3.6</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>easyexcel</artifactId>
+            <version>3.1.0</version>
+        </dependency>
+
+
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+            </plugin>
+
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-surefire-plugin</artifactId>
+                <configuration>
+                    <testFailureIgnore>true</testFailureIgnore>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <source>8</source>
+                    <target>8</target>
+                </configuration>
+            </plugin>
+        </plugins>
+
+    </build>
+</project>

+ 23 - 0
src/main/java/com/fdkankan/app/AppCenterApplication.java

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

+ 61 - 0
src/main/java/com/fdkankan/app/common/CameraTypeEnum.java

@@ -0,0 +1,61 @@
+package com.fdkankan.app.common;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public enum CameraTypeEnum {
+    DOUBLE_EYE(0,"KK-","4DKKLITE_","旧双目相机"),
+    FDKK_PRO(1,"KK-","4DKKPRO_","四维看看pro八目相机"),
+    FDKK_LITE(2,"KK-","4DKKLITE_","四维看看lite"),
+    ZHIHOUSE_REDHOUSE(5,"KK-","4DKKLITE_","指房宝小红屋相机"),
+    DOUBLE_EYE_TURN(9,"KJ-","4DKKLITE_","双目转台"),
+    LASER_TURN(10,"SS-","4DKKLA_","激光转台");
+
+
+    private int type;
+    private String sceneNumPrefix;
+    private String wifiNamePrefix;
+    private String desc;
+
+    public int getType() {
+        return type;
+    }
+
+    public String getSceneNumPrefix() {
+        return sceneNumPrefix;
+    }
+
+    public String getWifiNamePrefix() {
+        return wifiNamePrefix;
+    }
+
+
+    static Map<Integer,CameraTypeEnum> typeMaps = new HashMap<>(5);
+    static Map<String,Integer> typePrefixMap = new HashMap<>(5);
+
+    static{
+        for (CameraTypeEnum typeEnum : CameraTypeEnum.values()) {
+            typeMaps.put(typeEnum.getType(),typeEnum);
+            typePrefixMap.put(typeEnum.getWifiNamePrefix(),typeEnum.getType());
+        }
+    }
+
+    CameraTypeEnum(Integer type, String sceneNumPrefix, String wifiNamePrefix, String desc) {
+        this.type = type;
+        this.sceneNumPrefix = sceneNumPrefix;
+        this.wifiNamePrefix = wifiNamePrefix;
+        this.desc = desc;
+    }
+
+    public static String getSceneNumPrefixByType(Integer type){
+        if(typeMaps.containsKey(type)){
+            return typeMaps.get(type).getSceneNumPrefix();
+        }
+        return "";
+    }
+
+    public static Integer getTypeByWifiNamePrefix(String wifiNamePrefix){
+        return typePrefixMap.get(wifiNamePrefix);
+    }
+
+}

+ 9 - 0
src/main/java/com/fdkankan/app/common/RedisKeyUtil.java

@@ -0,0 +1,9 @@
+package com.fdkankan.app.common;
+
+public class RedisKeyUtil {
+
+    public static final String PREFIX_MSG_NOT_CODE = "msg:not:code:";//短信重发验证
+    public static final String PREFIX_MSG_AUTH_CODE = "msg:auth:code:";
+
+    public static final String PREFIX_CACHE_CAMERA = "camera:";
+}

+ 97 - 0
src/main/java/com/fdkankan/app/common/Result.java

@@ -0,0 +1,97 @@
+package com.fdkankan.app.common;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+/**
+ * 通用返回类
+ *
+ * @author
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class Result<T> implements Serializable {
+    private static final long serialVersionUID = -1491499610244557029L;
+    public static final String SUCCESS_MSG = "操作成功";
+    public static int CODE_SUCCESS = 0;
+    public static int CODE_FAILURE = -1;
+    public static String[] NOOP = new String[]{};
+
+    /**
+     * 处理状态:0: 成功, 1: 失败
+     */
+    private int code;
+    /**
+     * 消息
+     */
+    private String msg;
+    /**
+     * 返回数据
+     */
+    private T data;
+    /**
+     * 处理成功,并返回数据
+     *
+     * @param data 数据对象
+     * @return data
+     */
+    public static Result success(Object data) {
+        return new Result(CODE_SUCCESS, SUCCESS_MSG, data);
+    }
+    /**
+     * 处理成功
+     *
+     * @return data
+     */
+    public static Result success() {
+        return new Result(CODE_SUCCESS, SUCCESS_MSG, NOOP);
+    }
+    /**
+     * 处理成功
+     *
+     * @param msg 消息
+     * @return data
+     */
+    public static Result success(String msg) {
+        return new Result(CODE_SUCCESS, msg, NOOP);
+    }
+    /**
+     * 处理成功
+     *
+     * @param msg  消息
+     * @param data 数据对象
+     * @return data
+     */
+    public static Result success(String msg, Object data) {
+        return new Result(CODE_SUCCESS, msg, data);
+    }
+    /**
+     * 处理失败,并返回数据(一般为错误信息)
+     *
+     * @param code 错误代码
+     * @param msg  消息
+     * @return data
+     */
+    public static Result failure(int code, String msg) {
+        return new Result(code, msg, NOOP);
+    }
+    /**
+     * 处理失败
+     *
+     * @param msg 消息
+     * @return data
+     */
+    public static Result failure(String msg) {
+        return failure(CODE_FAILURE, msg);
+    }
+
+    @Override
+    public String toString() {
+        return "JsonResult [code=" + code + ", msg=" + msg + ", data="
+                + data + "]";
+    }
+}

+ 115 - 0
src/main/java/com/fdkankan/app/constant/LoginConstant.java

@@ -0,0 +1,115 @@
+package com.fdkankan.app.constant;
+
+// 3001-4000 登陆注册状态码
+public class LoginConstant {
+
+    public static final String LOCAL_CLINET_USER = "LOCAL_CLINET_USER";
+
+    public static final String SUCCESS_MSG = "操作成功";
+    public static final String ERROR_MSG = "操作失败";
+
+    public static final String FAILURE_MSG_9999 = "系统暂不可用,请稍后再试!";
+
+    public static final int FAILURE_CODE_3001 = 3001;
+    public static final String FAILURE_MSG_3001 = "缺少必要参数";
+
+    public static final int FAILURE_CODE_3002 = 3002;
+    public static final String FAILURE_MSG_3002 = "访问异常!";
+
+    public static final int FAILURE_CODE_3003 = 3003;
+    public static final String FAILURE_MSG_3003 = "非法访问!";
+
+    public static final int FAILURE_CODE_3004 = 3004;
+    public static final String FAILURE_MSG_3004 = "用户未登录";
+
+    public static final int FAILURE_CODE_3005 = 3005;
+    public static final String FAILURE_MSG_3005 = "验证码已过期";
+
+    public static final int FAILURE_CODE_3006 = 3006;
+    public static final String FAILURE_MSG_3006 = "验证码错误";
+
+    public static final int FAILURE_CODE_3007 = 3007;
+    public static final String FAILURE_MSG_3007 = "昵称已存在";
+
+    public static final int FAILURE_CODE_3008 = 3008;
+    public static final String FAILURE_MSG_3008 = "该手机已被注册";
+
+    public static final int FAILURE_CODE_3009 = 3009;
+    public static final String FAILURE_MSG_3009 = "两次输入的密码不一致";
+
+    public static final int FAILURE_CODE_3010 = 3010;
+    public static final String FAILURE_MSG_3010 = "昵称长度错误";
+
+    public static final int FAILURE_CODE_3011 = 3011;
+    public static final String FAILURE_MSG_3011 = "密码需要包含英文大小写、数字,长度8-16字符";
+
+    public static final int FAILURE_CODE_3012 = 3012;
+    public static final String FAILURE_MSG_3012 = "昵称包含敏感词";
+
+    public static final int FAILURE_CODE_3013 = 3013;
+    public static final String FAILURE_MSG_3013 = "手机号码格式错误";
+
+    public static final int FAILURE_CODE_3014 = 3014;
+    public static final String FAILURE_MSG_3014 = "账号或密码不正确";
+
+    public static final int FAILURE_CODE_3015 = 3015;
+    public static final String FAILURE_MSG_3015 = "用户不存在";
+
+    public static final int FAILURE_CODE_3016 = 3016;
+    public static final String FAILURE_MSG_3016 = "登录失败,账号无权访问";
+
+    public static final int FAILURE_CODE_3017 = 3017;
+    public static final String FAILURE_MSG_3017 = "空文件";
+
+    public static final int FAILURE_CODE_3018 = 3018;
+    public static final String FAILURE_MSG_3018 = "需要上传或使用的文件不存在";
+
+    public static final int FAILURE_CODE_3019 = 3019;
+    public static final String FAILURE_MSG_3019 = "邮箱格式不正确";
+
+    public static final int FAILURE_CODE_3020 = 3020;
+    public static final String FAILURE_MSG_3020 = "邮箱地址已存在";
+
+    public static final int FAILURE_CODE_3021 = 3021;
+    public static final String FAILURE_MSG_3021 = "账号不存在,请核对后重新输入。";
+
+    public static final int FAILURE_CODE_3022 = 3022;
+    public static final String FAILURE_MSG_3022 = "该场景已添加协作者,请先取消协作后再添加";
+
+    public static final int FAILURE_CODE_3023 = 3023;
+    public static final String FAILURE_MSG_3023 = "手机验证码获取验证码次数过多,请明天再试";
+
+    public static final int FAILURE_CODE_3024 = 3024;
+    public static final String FAILURE_MSG_3024 = "不能将场景协作给自己";
+
+    public static final int FAILURE_CODE_3025 = 3025;
+    public static final String FAILURE_MSG_3025 = "不能将相机分配给自己";
+
+    public static final int FAILURE_CODE_3026 = 3026;
+    public static final String FAILURE_MSG_3026 = "有部分场景已存在协作者,请先取消协作后再添加";
+
+    public static final int FAILURE_CODE_3027 = 3027;
+    public static final String FAILURE_MSG_3027 = "原密码错误";
+
+    public static final int FAILURE_CODE_3028 = 3028;
+    public static final String FAILURE_MSG_3028 = "角色已存在";
+
+    public static final int FAILURE_CODE_3029 = 3029;
+    public static final String FAILURE_MSG_3029 = "当前角色存在关联的用户,请先删除用户或修改用户所属角色";
+
+    public static final int FAILURE_CODE_3030 = 3030;
+    public static final String FAILURE_MSG_3030 = "当前增值权益不存在";
+
+    public static final int FAILURE_CODE_3031 = 3031;
+    public static final String FAILURE_MSG_3031 = "相机已绑定";
+
+    public static final int FAILURE_CODE_3032 = 3032;
+    public static final String FAILURE_MSG_3032 = "当前相机已被授权,请选择另外相机绑定";
+
+    public static final int FAILURE_CODE_3033 = 3033;
+    public static final String FAILURE_MSG_3033 = "60秒内不能重复获取验证码";
+
+    public static final int FAILURE_CODE_3034 = 3034;
+    public static final String FAILURE_MSG_3034 = "服务器繁忙,请重试!";
+
+}

+ 33 - 0
src/main/java/com/fdkankan/app/controller/LoginController.java

@@ -0,0 +1,33 @@
+package com.fdkankan.app.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import com.fdkankan.common.util.JwtUtil;
+import com.fdkankan.app.common.Result;
+import com.fdkankan.app.service.impl.LoginService;
+import com.fdkankan.app.vo.request.LoginParam;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+
+/**
+ * 登录
+ */
+@RestController
+@RequestMapping("/api/sso/app")
+public class LoginController {
+
+    @Autowired
+    LoginService loginService;
+
+    /**
+     * 登录
+     * phoneNum 用户名
+     * password 密码
+     */
+    @PostMapping("/userLogin")
+    public Result login(@RequestBody LoginParam param){
+        return Result.success(loginService.login(param));
+    }
+
+}
+

+ 90 - 0
src/main/java/com/fdkankan/app/entity/Camera.java

@@ -0,0 +1,90 @@
+package com.fdkankan.app.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-07-04
+ */
+@Getter
+@Setter
+@TableName("t_camera")
+public class Camera implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 相机的Mac地址
+     */
+    @TableField("child_name")
+    private String childName;
+
+    /**
+     * 激活时间
+     */
+    @TableField("activated_time")
+    private Date activatedTime;
+
+    /**
+     * 相机密码
+     */
+    @TableField("child_password")
+    private String childPassword;
+
+    /**
+     * sn码
+     */
+    @TableField("sn_code")
+    private String snCode;
+
+    /**
+     * wifi名称
+     */
+    @TableField("wifi_name")
+    private String wifiName;
+
+    /**
+     * wifi密码
+     */
+    @TableField("wifi_password")
+    private String wifiPassword;
+
+    /**
+     * 创建时间
+     */
+    @TableField("create_time")
+    private String createTime;
+
+    /**
+     * 更新时间
+     */
+    @TableField("update_time")
+    private String updateTime;
+
+    /**
+     * 记录的状态,A: 生效,I: 禁用
+     */
+    @TableField("rec_status")
+    @TableLogic(value = "A",delval = "I")
+    private String recStatus;
+
+    @TableField("is_out")
+    private Boolean isOut;
+
+
+}

+ 150 - 0
src/main/java/com/fdkankan/app/entity/CameraDetail.java

@@ -0,0 +1,150 @@
+package com.fdkankan.app.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-07-04
+ */
+@Getter
+@Setter
+@TableName("t_camera_detail")
+public class CameraDetail implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 余额
+     */
+    @TableField("balance")
+    private String balance;
+
+    /**
+     * 用户表t_user的id
+     */
+    @TableField("user_id")
+    private Long userId;
+
+    /**
+     * 0表示客户,1表示员工,2表示赠送,3表示其他,4经销商销售
+     */
+    @TableField("own")
+    private Integer own;
+
+    /**
+     * 订单号
+     */
+    @TableField("order_sn")
+    private String orderSn;
+
+    /**
+     * 0表示本国,1表示国外
+     */
+    @TableField("country")
+    private Integer country;
+
+    /**
+     * 经销商
+     */
+    @TableField("agency")
+    private String agency;
+
+    /**
+     * 相机类型,0表示双目,1四维看看pro,2 四维看看lite,9 双目转台,10 激光转台
+     */
+    @TableField("type")
+    private Integer type;
+
+    /**
+     * 总容量
+     */
+    @TableField("total_space")
+    private Long totalSpace;
+
+    /**
+     * 已使用容量
+     */
+    @TableField("used_space")
+    private Long usedSpace;
+
+    /**
+     * 相机主表t_camera的id
+     */
+    @TableField("camera_id")
+    private Long cameraId;
+
+    /**
+     * 商品表t_goods的id
+     */
+    @TableField("goods_id")
+    private Long goodsId;
+
+    /**
+     * 企业表t_company的id
+     */
+    @TableField("company_id")
+    private Long companyId;
+
+    /**
+     * 代理商架构管理t_agent_framework的id
+     */
+    @TableField("agent_framework_id")
+    private Long agentFrameworkId;
+
+    /**
+     * 相机协作用户id
+     */
+    @TableField("cooperation_user")
+    private Long cooperationUser;
+
+    /**
+     * 设备地址(追溯管理后台)
+     */
+    @TableField("address")
+    private String address;
+
+    /**
+     * 创建时间
+     */
+    @TableField("create_time")
+    private String createTime;
+
+    /**
+     * 更新时间
+     */
+    @TableField("update_time")
+    private String updateTime;
+
+    /**
+     * 记录的状态,A: 生效,I: 禁用
+     */
+    @TableField("rec_status")
+    @TableLogic(value = "A",delval = "I")
+    private String recStatus;
+
+    @TableField("user_camera_version")
+    private String userCameraVersion;
+
+    @TableField("app_version")
+    private String appVersion;
+
+    @TableField("last_request_time")
+    private Date lastRequestTime;
+
+
+}

+ 279 - 0
src/main/java/com/fdkankan/app/entity/Scene.java

@@ -0,0 +1,279 @@
+package com.fdkankan.app.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 lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 场景表
+ * </p>
+ *
+ * @author 
+ * @since 2022-07-04
+ */
+@Getter
+@Setter
+@TableName("t_scene")
+public class Scene implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 场景名称
+     */
+    @TableField("scene_name")
+    private String sceneName;
+
+    /**
+     * 场景描述
+     */
+    @TableField("scene_dec")
+    private String sceneDec;
+
+    /**
+     * 场景的链接地址
+     */
+    @TableField("web_site")
+    private String webSite;
+
+    /**
+     * 场景缩略图
+     */
+    @TableField("thumb")
+    private String thumb;
+
+    /**
+     * 创建时间
+     */
+    @TableField("create_time")
+    private String createTime;
+
+    /**
+     * 0表示未建好,1表示建好,-1表示出错,-2表示不要在官网上显示
+     */
+    @TableField("status")
+    private Integer status;
+
+    /**
+     * 原始的大场景数据(七牛)
+     */
+    @TableField("data_source")
+    private String dataSource;
+
+    /**
+     * 用户表t_user的id
+     */
+    @TableField("user_id")
+    private Long userId;
+
+    /**
+     * 0表示未付款,1表示付款了,-1表示欠费
+     */
+    @TableField("pay_status")
+    private Integer payStatus;
+
+    /**
+     * 相机主表t_camera的id
+     */
+    @TableField("camera_id")
+    private Long cameraId;
+
+    /**
+     * 手机id
+     */
+    @TableField("phone_id")
+    private String phoneId;
+
+    /**
+     * 大场景序号
+     */
+    @TableField("num")
+    private String num;
+
+    /**
+     * 大场景的密钥
+     */
+    @TableField("scene_key")
+    private String sceneKey;
+
+    /**
+     * 0表示其他,1表示文博,2表示地产,3表示电商,4表示餐饮,5表示家居
+     */
+    @TableField("scene_type")
+    private Integer sceneType;
+
+    /**
+     * 1表示推荐,0表示正常
+     */
+    @TableField("recommend")
+    private Integer recommend;
+
+    /**
+     * 浏览次数
+     */
+    @TableField("view_count")
+    private Integer viewCount;
+
+    /**
+     * 版本
+     */
+    @TableField("version")
+    private Integer version;
+
+    /**
+     * 表示缩略图是否存在
+     */
+    @TableField("thumb_status")
+    private Integer thumbStatus;
+
+    /**
+     * 0表示默认,1表示自己上传
+     */
+    @TableField("floor_logo")
+    private String floorLogo;
+
+    /**
+     * 标记大小
+     */
+    @TableField("floor_logo_size")
+    private Integer floorLogoSize;
+
+    /**
+     * 要上传的热点的id集合,用逗号隔开
+     */
+    @TableField("hots_ids")
+    private String hotsIds;
+
+    /**
+     * 表示初始点信息
+     */
+    @TableField("entry")
+    private String entry;
+
+    /**
+     * 拍摄数量
+     */
+    @TableField("shoot_count")
+    private Integer shootCount;
+
+    /**
+     * 风格
+     */
+    @TableField("style")
+    private Integer style;
+
+    /**
+     * 要gps定位
+     */
+    @TableField("gps")
+    private String gps;
+
+    /**
+     * 方案:1是双目,2是转台,3是六目,4是八目
+     */
+    @TableField("scene_scheme")
+    private Integer sceneScheme;
+
+    /**
+     * 背景音乐名称
+     */
+    @TableField("bg_music")
+    private String bgMusic;
+
+    /**
+     * 记录的状态,A: 生效,I: 禁用
+     */
+    @TableField("rec_status")
+    @TableLogic(value = "A",delval = "I")
+    private String recStatus;
+
+    /**
+     * 更新时间
+     */
+    @TableField("update_time")
+    private String updateTime;
+
+    /**
+     * 普通录屏文件地址
+     */
+    @TableField("screencap_voice_src")
+    private String screencapVoiceSrc;
+
+    /**
+     * 旧版录屏数据地址
+     */
+    @TableField("screencap_music")
+    private String screencapMusic;
+
+    /**
+     * 录屏文件个数
+     */
+    @TableField("screencap_len")
+    private Integer screencapLen;
+
+    /**
+     * 录音文件地址
+     */
+    @TableField("screencap_voice_sound")
+    private String screencapVoiceSound;
+
+    /**
+     * 选择的类型,sound为screencapVoiceSound,file为screencapVoiceSrc
+     */
+    @TableField("screencap_voice_type")
+    private String screencapVoiceType;
+
+    /**
+     * 录屏文件地址
+     */
+    @TableField("play_data")
+    private String playData;
+
+    /**
+     * 算法类型
+     */
+    @TableField("algorithm")
+    private String algorithm;
+
+    /**
+     * oss服务商
+     */
+    @TableField("oss")
+    private String oss;
+
+    /**
+     * 重新建模的版本
+     */
+    @TableField("floor_edit_ver")
+    private Integer floorEditVer;
+
+    /**
+     * 正式发布重新建模的版本
+     */
+    @TableField("floor_publish_ver")
+    private Integer floorPublishVer;
+
+    /**
+     * 使用容量
+     */
+    @TableField("space")
+    private Long space;
+
+    /**
+     * 录屏图片存放文件
+     */
+    @TableField("screencap_thumb")
+    private String screencapThumb;
+
+
+}

+ 114 - 0
src/main/java/com/fdkankan/app/entity/ScenePlus.java

@@ -0,0 +1,114 @@
+package com.fdkankan.app.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+
+import java.io.Serializable;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 场景主表
+ * </p>
+ *
+ * @author 
+ * @since 2022-07-04
+ */
+@Getter
+@Setter
+@TableName("t_scene_plus")
+public class ScenePlus implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 场景码
+     */
+    @TableField("num")
+    private String num;
+
+    /**
+     * 用户id
+     */
+    @TableField("user_id")
+    private Long userId;
+
+    /**
+     * 相机id
+     */
+    @TableField("camera_id")
+    private Long cameraId;
+
+    /**
+     * 手机id
+     */
+    @TableField("phone_id")
+    private String phoneId;
+
+    /**
+     * 场景名称
+     */
+    @TableField("title")
+    private String title;
+
+    /**
+     * 场景描述
+     */
+    @TableField("description")
+    private String description;
+
+    /**
+     * 场景状态:0-未建好,1--已建好,-1-计算出错,-2--不在官网显示
+     */
+    @TableField("scene_status")
+    private Integer sceneStatus;
+
+    /**
+     * 场景来源:相机拍摄10以内表示,1表示八目,2双目,3转台,4 激光  其他来源10以上,11:一键换装,12:123看房,13文通虚拟场景
+     */
+    @TableField("scene_source")
+    private Integer sceneSource;
+
+    /**
+     * 支付状态:0表示未付款,1表示付款了,-1表示欠费,-2表示容量不足
+     */
+    @TableField("pay_status")
+    private Integer payStatus;
+
+    /**
+     * 场景类型  0-其他,1-文博,2-地产,3-电商,4-餐饮,5-家居,99-一件换装虚拟房源
+     */
+    @TableField("scene_type")
+    private Integer sceneType;
+
+    /**
+     * 是否推荐:0-否,1-是
+     */
+    @TableField("recommend")
+    private Integer recommend;
+
+    /**
+     * 创建时间
+     */
+    @TableField("create_time")
+    private String createTime;
+
+    /**
+     * 更新时间
+     */
+    @TableField("update_time")
+    private String updateTime;
+
+    /**
+     * 0-有效,1-删除, 2-禁用
+     */
+    @TableField("tb_status")
+    @TableLogic(value = "0",delval = "1")
+    private Integer tbStatus;
+
+
+}

+ 150 - 0
src/main/java/com/fdkankan/app/entity/ScenePlusExt.java

@@ -0,0 +1,150 @@
+package com.fdkankan.app.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+
+import java.io.Serializable;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author 
+ * @since 2022-07-04
+ */
+@Getter
+@Setter
+@TableName("t_scene_plus_ext")
+public class ScenePlusExt implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * t_scene_plus主键
+     */
+    @TableField("plus_id")
+    private Long plusId;
+
+    /**
+     * 场景数据目录
+     */
+    @TableField("data_source")
+    private String dataSource;
+
+    /**
+     * 场景链接
+     */
+    @TableField("web_site")
+    private String webSite;
+
+    /**
+     * 缩略图链接
+     */
+    @TableField("thumb")
+    private String thumb;
+
+    /**
+     * 方案:1-双目,2-转台,3-六目,4-八目,10-获取4k图,11-获取2k,12-获取1k
+     */
+    @TableField("scene_scheme")
+    private Integer sceneScheme;
+
+    /**
+     * 使用用量
+     */
+    @TableField("space")
+    private Long space;
+
+    /**
+     * 云服务器类型
+     */
+    @TableField("ecs")
+    private String ecs;
+
+    /**
+     * 点位数量
+     */
+    @TableField("shoot_count")
+    private Integer shootCount;
+
+    /**
+     * 浏览次数
+     */
+    @TableField("view_count")
+    private Integer viewCount;
+
+    /**
+     * gps定位
+     */
+    @TableField("gps")
+    private String gps;
+
+    /**
+     * 算法类型(slam、sfm)
+     */
+    @TableField("algorithm")
+    private String algorithm;
+
+    /**
+     * 固件版本
+     */
+    @TableField("firmware_version")
+    private String firmwareVersion;
+
+    /**
+     * 算法类型(V2,V3)
+     */
+    @TableField("build_type")
+    private String buildType;
+
+    /**
+     * 全景图加载方式,tiles/1k:1k瓦片图,tiles/2:2k瓦片图,tiles/4k:4k瓦片图,pan:全景图 ,local:本地切片,cube:立体图
+     */
+    @TableField("scene_resolution")
+    private String sceneResolution;
+
+    /**
+     * 场景来源,lite:双目lite相机,pro:八目相机,minion:双面转台相机,laser:激光相机,virtual:虚拟场景,sketch:图片建模场景
+     */
+    @TableField("scene_from")
+    private String sceneFrom;
+
+    /**
+     * 点位视频
+     */
+    @TableField("videos")
+    private String videos;
+
+    /**
+     * 计算耗时
+     */
+    @TableField("compute_time")
+    private Long computeTime;
+
+    /**
+     * 创建时间
+     */
+    @TableField("create_time")
+    private String createTime;
+
+    /**
+     * 更新时间
+     */
+    @TableField("update_time")
+    private String updateTime;
+
+    /**
+     * 0-有效,1-删除, 2-禁用
+     */
+    @TableField("tb_status")
+    @TableLogic(value = "0",delval = "1")
+    private Integer tbStatus;
+
+
+}

+ 231 - 0
src/main/java/com/fdkankan/app/entity/ScenePro.java

@@ -0,0 +1,231 @@
+package com.fdkankan.app.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 lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * pro场景表
+ * </p>
+ *
+ * @author 
+ * @since 2022-07-04
+ */
+@Getter
+@Setter
+@TableName("t_scene_pro")
+public class ScenePro implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 场景名称
+     */
+    @TableField("scene_name")
+    private String sceneName;
+
+    /**
+     * 场景描述
+     */
+    @TableField("scene_dec")
+    private String sceneDec;
+
+    /**
+     * 场景的链接地址
+     */
+    @TableField("web_site")
+    private String webSite;
+
+    /**
+     * 场景缩略图
+     */
+    @TableField("thumb")
+    private String thumb;
+
+    /**
+     * 创建时间
+     */
+    @TableField("create_time")
+    private String createTime;
+
+    /**
+     * 0表示未建好,1表示建好,-1表示出错,-2表示不要在官网上显示
+     */
+    @TableField("status")
+    private Integer status;
+
+    /**
+     * 原始的大场景数据(七牛)
+     */
+    @TableField("data_source")
+    private String dataSource;
+
+    /**
+     * 用户表t_user的id
+     */
+    @TableField("user_id")
+    private Long userId;
+
+    /**
+     * 0表示未付款,1表示付款了,-1表示欠费,-2表示容量不足
+     */
+    @TableField("pay_status")
+    private Integer payStatus;
+
+    /**
+     * 相机主表t_camera的id
+     */
+    @TableField("camera_id")
+    private Long cameraId;
+
+    /**
+     * 手机id
+     */
+    @TableField("phone_id")
+    private String phoneId;
+
+    /**
+     * 场景logo
+     */
+    @TableField("scene_logo")
+    private String sceneLogo;
+
+    /**
+     * 大场景序号
+     */
+    @TableField("num")
+    private String num;
+
+    /**
+     * 0表示其他,1表示文博,2表示地产,3表示电商,4表示餐饮,5表示家居,99一件换装虚拟房源
+     */
+    @TableField("scene_type")
+    private Integer sceneType;
+
+    /**
+     * 1表示推荐,0表示正常
+     */
+    @TableField("recommend")
+    private Integer recommend;
+
+    /**
+     * 浏览次数
+     */
+    @TableField("view_count")
+    private Integer viewCount;
+
+    /**
+     * 拍摄数量 ps:点位数量
+     */
+    @TableField("shoot_count")
+    private Integer shootCount;
+
+    /**
+     * 所有资源文件名
+     */
+    @TableField("files_name")
+    private String filesName;
+
+    /**
+     * 点位视频
+     */
+    @TableField("videos")
+    private String videos;
+
+    /**
+     * 要gps定位
+     */
+    @TableField("gps")
+    private String gps;
+
+    /**
+     * 方案:1是双目,2是转台,3是六目,4是八目,10获取4k图,11获取2k,12获取1k
+     */
+    @TableField("scene_scheme")
+    private Integer sceneScheme;
+
+    /**
+     * 记录的状态,A: 生效,I: 禁用
+     */
+    @TableField("rec_status")
+    @TableLogic(value = "A",delval = "I")
+    private String recStatus;
+
+    /**
+     * 更新时间
+     */
+    @TableField("update_time")
+    private String updateTime;
+
+    /**
+     * 算法类型
+     */
+    @TableField("algorithm")
+    private String algorithm;
+
+    /**
+     * 服务器的服务商
+     */
+    @TableField("ecs")
+    private String ecs;
+
+    /**
+     * 使用容量
+     */
+    @TableField("space")
+    private Long space;
+
+    /**
+     * 固件版本
+     */
+    @TableField("firmware_version")
+    private String firmwareVersion;
+
+    /**
+     * 调用V2还是V3的算法
+     */
+    @TableField("build_type")
+    private String buildType;
+
+    /**
+     * 计算时间(秒为单位)
+     */
+    @TableField("compute_time")
+    private Long computeTime;
+
+    /**
+     * 场景来源,相机拍摄10以内表示,1表示八目,2双目,3转台,4 激光  其他来源10以上,11:一键换装,12:123看房,13文通虚拟场景,14上传的matterport场景
+     */
+    @TableField("scene_source")
+    private Integer sceneSource;
+
+    /**
+     * 大场景序号(随心装场景码)
+     */
+    @TableField("vrnum")
+    private String vrnum;
+
+    @TableField("unicode")
+    private String unicode;
+
+    @TableField("mosaics")
+    private String mosaics;
+
+    /**
+     * 是否已升级v4(0-否,1-是)
+     */
+    @TableField("is_upgrade")
+    private Integer isUpgrade;
+
+
+}

+ 141 - 0
src/main/java/com/fdkankan/app/entity/User.java

@@ -0,0 +1,141 @@
+package com.fdkankan.app.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 lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 用户信息表
+ * </p>
+ *
+ * @author 
+ * @since 2022-07-01
+ */
+@Getter
+@Setter
+@TableName("t_user")
+public class User implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 头像对应的链接地址
+     */
+    @TableField("head")
+    private String head;
+
+    /**
+     * 用户密码
+     */
+    @TableField("password")
+    private String password;
+
+    /**
+     * 用户邮箱
+     */
+    @TableField("email")
+    private String email;
+
+    /**
+     * 注册时间
+     */
+    @TableField("register_time")
+    private String registerTime;
+
+    /**
+     * 用户名
+     */
+    @TableField("user_name")
+    private String userName;
+
+    /**
+     * 昵称
+     */
+    @TableField("nick_name")
+    private String nickName;
+
+    /**
+     * 0表示禁言(bbs)
+     */
+    @TableField("status")
+    private Integer status;
+
+    /**
+     * 0表示拒绝通知,1表示接受通知
+     */
+    @TableField("is_notice")
+    private Integer isNotice;
+
+    /**
+     * 机构名称
+     */
+    @TableField("organization_name")
+    private String organizationName;
+
+    /**
+     * 主页链接
+     */
+    @TableField("main_page")
+    private String mainPage;
+
+    /**
+     * 所在国家,默认是86
+     */
+    @TableField("country")
+    private String country;
+
+    /**
+     * 所在省份
+     */
+    @TableField("province")
+    private String province;
+
+    /**
+     * 所在城市
+     */
+    @TableField("city")
+    private String city;
+
+    /**
+     * 可下载场景总数
+     */
+    @TableField("download_num_total")
+    private Integer downloadNumTotal;
+
+    /**
+     * 已下载场景总数
+     */
+    @TableField("download_num")
+    private Integer downloadNum;
+
+    /**
+     * 创建时间
+     */
+    @TableField("create_time")
+    private String createTime;
+
+    /**
+     * 记录的状态,A: 生效,I: 禁用
+     */
+    @TableField("rec_status")
+    @TableLogic(value = "A",delval = "I")
+    private String recStatus;
+
+    /**
+     * 更新时间
+     */
+    @TableField("update_time")
+    private String updateTime;
+
+
+}

+ 36 - 0
src/main/java/com/fdkankan/app/exception/GlobalExceptionHandler.java

@@ -0,0 +1,36 @@
+package com.fdkankan.app.exception;
+
+import com.fdkankan.common.exception.BusinessException;
+import com.fdkankan.app.common.Result;
+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 Result exceptionHandler(Exception e) throws Exception {
+        log.error("服务错误:", e);
+        return Result.failure( 500, e.getMessage());
+    }
+
+    /**
+     * 处理业务异常
+     */
+    @ResponseBody
+    @ExceptionHandler(value = BusinessException.class)
+    public Result businessExceptionHandler(BusinessException e) {
+        log.info("业务异常code:{},message:{}", e.getCode(), e.getMessage());
+        return Result.failure(e.getCode(), e.getMessage());
+    }
+}

+ 98 - 0
src/main/java/com/fdkankan/app/generate/AutoGenerate.java

@@ -0,0 +1,98 @@
+package com.fdkankan.app.generate;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.generator.FastAutoGenerator;
+import com.baomidou.mybatisplus.generator.config.OutputFile;
+import com.baomidou.mybatisplus.generator.config.rules.DateType;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+public class AutoGenerate {
+
+
+    public static void main(String[] args) {
+
+        String path =System.getProperty("user.dir") ;
+
+        generate(path,"user", getTables(new String[]{
+                "t_folder"
+        }));
+
+//        generate(path,"goods", getTables(new String[]{
+//                        "t_camera","t_camera_detail","t_camera_out","t_camera_space","t_camera_version",
+//                        "t_company","t_goods","t_goods_sku","t_cart","t_goods_spec",
+//                        "t_goods_spec_value","t_goods_spu_spec","t_sn_code"
+//        }));
+//
+//        generate(path,"order", getTables(new String[]{
+//                        "t_increment_order","t_invoice","t_order","t_order_item",
+//                        "t_pre_sale","t_space_sdk","t_trade_log","t_commerce_order","t_download_order","t_expansion_order"
+//        }));
+//        generate(path,"order", getTables(new String[]{
+//                        "t_virtual_order"
+//        }));
+//
+//        generate(path,"user", getTables(new String[]{
+//                        "t_user","t_user_increment","t_manager","t_province","t_increment_type","t_intercom_message","t_receiver_info"
+//        }));
+    }
+
+    public static List<String> getTables(String [] tableNames){
+        return new ArrayList<>(Arrays.asList(tableNames));
+    }
+
+
+    public static void  generate(String path,String moduleName,  List<String> tables){
+        FastAutoGenerator.create("jdbc:mysql://120.24.144.164:3306/4dkankan_v4",
+                "root","4Dage@4Dage#@168")
+                .globalConfig(builder -> {
+                    builder.author("")               //作者
+                            .outputDir(path+"\\src\\main\\java")    //输出路径(写到java目录)
+                            //.enableSwagger()           //开启swagger
+                            .commentDate("yyyy-MM-dd")
+                            .dateType(DateType.ONLY_DATE)
+                            .fileOverride();            //开启覆盖之前生成的文件
+
+                })
+                .packageConfig(builder -> {
+                    builder.parent("com.fdkankan")
+                            .moduleName(moduleName)
+                            .entity("entity")
+                            .service("service")
+                            .serviceImpl("service.impl")
+                            .controller("controller")
+                            .mapper("mapper")
+                            .xml("test.mapper")
+                            .pathInfo(Collections.singletonMap(OutputFile.mapperXml,path+"\\src\\main\\resources\\mapper\\"+moduleName));
+                })
+                .strategyConfig(builder -> {
+                    builder.addInclude(tables)
+                            .addTablePrefix("t_")
+
+                            .serviceBuilder()
+                            .formatServiceFileName("I%sService")
+                            .formatServiceImplFileName("%sServiceImpl")
+
+                            .entityBuilder()
+                            .enableLombok()
+                            .logicDeleteColumnName("rec_status")
+                            .enableTableFieldAnnotation()
+                            //.superClass(BaseEntity.class)
+
+                            .controllerBuilder()
+                            .formatFileName("%sController")
+                            .enableRestStyle()
+
+                            .mapperBuilder()
+                            .superClass(BaseMapper.class)
+                            .formatMapperFileName("I%sMapper")
+                            .enableMapperAnnotation()
+                            .formatXmlFileName("%sMapper");
+                })
+                // .templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板
+                .execute();
+    }
+}

+ 18 - 0
src/main/java/com/fdkankan/app/mapper/ICameraDetailMapper.java

@@ -0,0 +1,18 @@
+package com.fdkankan.app.mapper;
+
+import com.fdkankan.app.entity.CameraDetail;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ * 相机子表 Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2022-07-04
+ */
+@Mapper
+public interface ICameraDetailMapper extends BaseMapper<CameraDetail> {
+
+}

+ 18 - 0
src/main/java/com/fdkankan/app/mapper/ICameraMapper.java

@@ -0,0 +1,18 @@
+package com.fdkankan.app.mapper;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fdkankan.app.entity.Camera;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ * 相机主表 Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2022-07-04
+ */
+@Mapper
+public interface ICameraMapper extends BaseMapper<Camera> {
+}

+ 18 - 0
src/main/java/com/fdkankan/app/mapper/ISceneMapper.java

@@ -0,0 +1,18 @@
+package com.fdkankan.app.mapper;
+
+import com.fdkankan.app.entity.Scene;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ * 场景表 Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2022-07-04
+ */
+@Mapper
+public interface ISceneMapper extends BaseMapper<Scene> {
+
+}

+ 18 - 0
src/main/java/com/fdkankan/app/mapper/IScenePlusExtMapper.java

@@ -0,0 +1,18 @@
+package com.fdkankan.app.mapper;
+
+import com.fdkankan.app.entity.ScenePlusExt;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2022-07-04
+ */
+@Mapper
+public interface IScenePlusExtMapper extends BaseMapper<ScenePlusExt> {
+
+}

+ 18 - 0
src/main/java/com/fdkankan/app/mapper/IScenePlusMapper.java

@@ -0,0 +1,18 @@
+package com.fdkankan.app.mapper;
+
+import com.fdkankan.app.entity.ScenePlus;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ * 场景主表 Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2022-07-04
+ */
+@Mapper
+public interface IScenePlusMapper extends BaseMapper<ScenePlus> {
+
+}

+ 21 - 0
src/main/java/com/fdkankan/app/mapper/ISceneProMapper.java

@@ -0,0 +1,21 @@
+package com.fdkankan.app.mapper;
+
+import com.fdkankan.app.entity.ScenePro;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * <p>
+ * pro场景表 Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2022-07-04
+ */
+@Mapper
+public interface ISceneProMapper extends BaseMapper<ScenePro> {
+
+}

+ 18 - 0
src/main/java/com/fdkankan/app/mapper/IUserMapper.java

@@ -0,0 +1,18 @@
+package com.fdkankan.app.mapper;
+
+import com.fdkankan.app.entity.User;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ * 用户信息表 Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2022-07-01
+ */
+@Mapper
+public interface IUserMapper extends BaseMapper<User> {
+
+}

+ 21 - 0
src/main/java/com/fdkankan/app/service/ICameraDetailService.java

@@ -0,0 +1,21 @@
+package com.fdkankan.app.service;
+
+import com.fdkankan.app.entity.CameraDetail;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * <p>
+ * 相机子表 服务类
+ * </p>
+ *
+ * @author 
+ * @since 2022-07-04
+ */
+public interface ICameraDetailService extends IService<CameraDetail> {
+
+    Long getCountByUserId(Long userId);
+
+}

+ 21 - 0
src/main/java/com/fdkankan/app/service/ICameraService.java

@@ -0,0 +1,21 @@
+package com.fdkankan.app.service;
+
+import com.fdkankan.common.response.PageInfo;
+import com.fdkankan.app.entity.Camera;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * <p>
+ * 相机主表 服务类
+ * </p>
+ *
+ * @author 
+ * @since 2022-07-04
+ */
+public interface ICameraService extends IService<Camera> {
+
+
+}

+ 22 - 0
src/main/java/com/fdkankan/app/service/IScenePlusExtService.java

@@ -0,0 +1,22 @@
+package com.fdkankan.app.service;
+
+import com.fdkankan.app.entity.ScenePlusExt;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author 
+ * @since 2022-07-04
+ */
+public interface IScenePlusExtService extends IService<ScenePlusExt> {
+
+    ScenePlusExt getByPlusId(Long plusId);
+
+    HashMap<Long,ScenePlusExt> getByPlusIds(List<Long> plusIds);
+}

+ 20 - 0
src/main/java/com/fdkankan/app/service/IScenePlusService.java

@@ -0,0 +1,20 @@
+package com.fdkankan.app.service;
+
+import com.fdkankan.app.entity.ScenePlus;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 场景主表 服务类
+ * </p>
+ *
+ * @author 
+ * @since 2022-07-04
+ */
+public interface IScenePlusService extends IService<ScenePlus> {
+
+    Long getCountByUserId(Long userId, List<Integer> sceneSourceList);
+
+}

+ 21 - 0
src/main/java/com/fdkankan/app/service/ISceneProService.java

@@ -0,0 +1,21 @@
+package com.fdkankan.app.service;
+
+import com.fdkankan.app.entity.CameraDetail;
+import com.fdkankan.app.entity.ScenePro;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * <p>
+ * pro场景表 服务类
+ * </p>
+ *
+ * @author 
+ * @since 2022-07-04
+ */
+public interface ISceneProService extends IService<ScenePro> {
+
+    Long getCountByUserId(Long userId, List<Integer> resourceList);
+}

+ 22 - 0
src/main/java/com/fdkankan/app/service/ISceneService.java

@@ -0,0 +1,22 @@
+package com.fdkankan.app.service;
+
+import com.fdkankan.app.entity.Scene;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 场景表 服务类
+ * </p>
+ *
+ * @author 
+ * @since 2022-07-04
+ */
+public interface ISceneService extends IService<Scene> {
+
+    Integer getCountByUserId(Long userId);
+
+
+    void bindOrUnCamera(List<Long> cameraIds, Long id);
+}

+ 23 - 0
src/main/java/com/fdkankan/app/service/IUserService.java

@@ -0,0 +1,23 @@
+package com.fdkankan.app.service;
+
+import com.fdkankan.app.entity.User;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fdkankan.app.vo.response.UserVo;
+
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * <p>
+ * 用户信息表 服务类
+ * </p>
+ *
+ * @author 
+ * @since 2022-07-01
+ */
+public interface IUserService extends IService<User> {
+
+    User getByUserName(String phoneNum);
+
+    HashMap<Long, User> getByIds(List<Long> userIds);
+}

+ 40 - 0
src/main/java/com/fdkankan/app/service/impl/CameraDetailServiceImpl.java

@@ -0,0 +1,40 @@
+package com.fdkankan.app.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.fdkankan.common.constant.Constant;
+import com.fdkankan.app.entity.*;
+import com.fdkankan.app.mapper.ICameraDetailMapper;
+import com.fdkankan.app.service.*;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.joda.time.DateTime;
+import org.joda.time.Days;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * <p>
+ * 相机子表 服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2022-07-04
+ */
+@Service
+public class CameraDetailServiceImpl extends ServiceImpl<ICameraDetailMapper, CameraDetail> implements ICameraDetailService {
+
+
+    @Override
+    public Long getCountByUserId(Long userId) {
+        LambdaQueryWrapper<CameraDetail> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(CameraDetail::getUserId,userId);
+        return this.count(wrapper);
+    }
+
+
+}

+ 35 - 0
src/main/java/com/fdkankan/app/service/impl/CameraServiceImpl.java

@@ -0,0 +1,35 @@
+package com.fdkankan.app.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fdkankan.common.response.PageInfo;
+import com.fdkankan.common.util.DateUtil;
+import com.fdkankan.common.util.FileSizeUtil;
+import com.fdkankan.app.entity.*;
+import com.fdkankan.app.mapper.ICameraMapper;
+import com.fdkankan.app.service.*;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fdkankan.app.util.DateUserUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.joda.time.DateTime;
+import org.joda.time.Days;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ * 相机主表 服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2022-07-04
+ */
+@Service
+public class CameraServiceImpl extends ServiceImpl<ICameraMapper, Camera> implements ICameraService {
+
+
+}

+ 95 - 0
src/main/java/com/fdkankan/app/service/impl/LoginService.java

@@ -0,0 +1,95 @@
+package com.fdkankan.app.service.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.fdkankan.app.service.*;
+import com.fdkankan.common.constant.ConstantFilePath;
+import com.fdkankan.common.constant.ConstantRegex;
+import com.fdkankan.common.exception.BusinessException;
+import com.fdkankan.common.util.*;
+import com.fdkankan.redis.constant.RedisKey;
+import com.fdkankan.redis.util.RedisUtil;
+import com.fdkankan.sms.SendMailAcceUtils;
+import com.fdkankan.sms.SmsService;
+import com.fdkankan.app.common.RedisKeyUtil;
+import com.fdkankan.app.constant.LoginConstant;
+import com.fdkankan.app.entity.Camera;
+import com.fdkankan.app.entity.CameraDetail;
+import com.fdkankan.app.entity.User;
+import com.fdkankan.app.vo.request.LoginParam;
+import com.fdkankan.app.vo.response.LoginVo;
+import com.fdkankan.app.vo.response.UserVo;
+import org.apache.commons.lang3.StringUtils;
+import org.omg.PortableInterceptor.INACTIVE;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import java.util.*;
+
+@Service
+public class LoginService {
+
+    @Autowired
+    private IUserService userService;
+    @Autowired
+    private RedisUtil redisUtil;
+    @Autowired
+    private ICameraService cameraService;
+    @Autowired
+    private ICameraDetailService cameraDetailService;
+    @Autowired
+    ISceneProService sceneProService;
+    @Autowired
+    IScenePlusService scenePlusService;
+
+    public LoginVo login(LoginParam param) {
+        if (StringUtils.isEmpty(param.getPassword()) || StringUtils.isEmpty(param.getPhoneNum())){
+            throw new BusinessException(LoginConstant.FAILURE_CODE_3001, LoginConstant.FAILURE_MSG_3001);
+        }
+        String password = Base64Converter.decode(Base64Converter.subText(param.getPassword()));
+        String passwordCode = SecurityUtil.MD5(password);
+        User user = userService.getByUserName(param.getPhoneNum());
+        if(user == null){
+            throw new BusinessException(LoginConstant.FAILURE_CODE_3015, LoginConstant.FAILURE_MSG_3015);
+        }
+        if(!user.getPassword().equals(passwordCode)){
+            throw new BusinessException(LoginConstant.FAILURE_CODE_3014, LoginConstant.FAILURE_MSG_3014);
+        }
+        String token = this.redisLogin(user.getUserName(),JSONObject.toJSONString(user));
+
+        Long count = cameraDetailService.getCountByUserId(user.getId());
+        if(param.getCameraType() == null){
+            param.setCameraType(  4);
+        }
+        List<Integer> resourceList = new ArrayList<>();
+        if(param.getCameraType() == 4){
+            resourceList = Arrays.asList(1,2,12,13,14);
+        }else {
+            resourceList = Collections.singletonList(3);
+        }
+        Long sceneProCount = sceneProService.getCountByUserId(user.getId(),resourceList);
+        Long scenePlusCount = scenePlusService.getCountByUserId(user.getId(),resourceList);
+        UserVo userVo = new UserVo();
+        userVo.setCameraCount(count);
+        userVo.setSceneCount(sceneProCount + scenePlusCount);
+        BeanUtils.copyProperties(user,userVo);
+        LoginVo vo = new LoginVo();
+        vo.setToken(token);
+        vo.setUser(userVo);
+        return vo;
+    }
+
+    public void logout(String userName) {
+        String redisKey = RedisKeyUtil.PREFIX_CACHE_CAMERA+ userName;
+        redisUtil.del(redisKey);
+    }
+
+    public String redisLogin(String userName,String value){
+        String token = JwtUtil.createJWT(-1,userName,"app");
+        String redisKey = RedisKeyUtil.PREFIX_CACHE_CAMERA+ userName;
+        redisUtil.set(redisKey, token,21600);
+        return token;
+    }
+
+}

+ 44 - 0
src/main/java/com/fdkankan/app/service/impl/ScenePlusExtServiceImpl.java

@@ -0,0 +1,44 @@
+package com.fdkankan.app.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.fdkankan.app.entity.ScenePlusExt;
+import com.fdkankan.app.mapper.IScenePlusExtMapper;
+import com.fdkankan.app.service.IScenePlusExtService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2022-07-04
+ */
+@Service
+public class ScenePlusExtServiceImpl extends ServiceImpl<IScenePlusExtMapper, ScenePlusExt> implements IScenePlusExtService {
+
+    @Override
+    public ScenePlusExt getByPlusId(Long plusId) {
+        LambdaQueryWrapper<ScenePlusExt> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(ScenePlusExt::getPlusId,plusId);
+        List<ScenePlusExt> list = this.list(wrapper);
+        if(list != null && list.size() >0){
+            return list.get(0);
+        }
+        return null;
+    }
+
+    @Override
+    public HashMap<Long, ScenePlusExt> getByPlusIds(List<Long> plusIds) {
+        LambdaQueryWrapper<ScenePlusExt> wrapper = new LambdaQueryWrapper<>();
+        wrapper.in(ScenePlusExt::getPlusId,plusIds);
+        List<ScenePlusExt> list = this.list(wrapper);
+        HashMap<Long,ScenePlusExt> map = new HashMap<>();
+        list.forEach(entity -> map.put(entity.getPlusId(),entity));
+        return map;
+    }
+}

+ 33 - 0
src/main/java/com/fdkankan/app/service/impl/ScenePlusServiceImpl.java

@@ -0,0 +1,33 @@
+package com.fdkankan.app.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.fdkankan.app.entity.ScenePlus;
+import com.fdkankan.app.mapper.IScenePlusMapper;
+import com.fdkankan.app.service.IScenePlusService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 场景主表 服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2022-07-04
+ */
+@Service
+public class ScenePlusServiceImpl extends ServiceImpl<IScenePlusMapper, ScenePlus> implements IScenePlusService {
+
+    @Override
+    public Long getCountByUserId(Long userId, List<Integer> sceneSourceList) {
+        LambdaQueryWrapper<ScenePlus> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(ScenePlus::getUserId, userId);
+        wrapper.in(ScenePlus::getSceneSource, sceneSourceList);
+        return this.count(wrapper);
+    }
+
+
+}

+ 40 - 0
src/main/java/com/fdkankan/app/service/impl/SceneProServiceImpl.java

@@ -0,0 +1,40 @@
+package com.fdkankan.app.service.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.fdkankan.common.constant.ConstantFilePath;
+import com.fdkankan.common.util.FileUtils;
+import com.fdkankan.common.util.JwtUtil;
+import com.fdkankan.fyun.oss.UploadToOssUtil;
+import com.fdkankan.app.entity.*;
+import com.fdkankan.app.mapper.ISceneProMapper;
+import com.fdkankan.app.service.*;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fdkankan.app.util.DateUserUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.io.File;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ * pro场景表 服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2022-07-04
+ */
+@Service
+public class SceneProServiceImpl extends ServiceImpl<ISceneProMapper, ScenePro> implements ISceneProService {
+
+    @Override
+    public Long getCountByUserId(Long userId, List<Integer> resourceList) {
+        LambdaQueryWrapper<ScenePro> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(ScenePro::getUserId,userId);
+        wrapper.in(ScenePro::getSceneSource,resourceList);
+        return this.count(wrapper);
+    }
+}

+ 39 - 0
src/main/java/com/fdkankan/app/service/impl/SceneServiceImpl.java

@@ -0,0 +1,39 @@
+package com.fdkankan.app.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.fdkankan.app.entity.Scene;
+import com.fdkankan.app.mapper.ISceneMapper;
+import com.fdkankan.app.service.ISceneService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 场景表 服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2022-07-04
+ */
+@Service
+public class SceneServiceImpl extends ServiceImpl<ISceneMapper, Scene> implements ISceneService {
+
+    @Override
+    public Integer getCountByUserId(Long userId) {
+        LambdaQueryWrapper<Scene> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(Scene::getUserId,userId);
+        return Math.toIntExact(this.count(wrapper));
+    }
+
+
+    @Override
+    public void bindOrUnCamera(List<Long> cameraIds, Long userId) {
+        LambdaUpdateWrapper<Scene> wrapper = new LambdaUpdateWrapper<>();
+        wrapper.set(Scene::getUserId,userId)
+                .in(Scene::getCameraId,cameraIds);
+        this.update(wrapper);
+    }
+}

+ 76 - 0
src/main/java/com/fdkankan/app/service/impl/UserServiceImpl.java

@@ -0,0 +1,76 @@
+package com.fdkankan.app.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.fdkankan.common.constant.*;
+import com.fdkankan.common.exception.BusinessException;
+import com.fdkankan.common.util.FileUtils;
+import com.fdkankan.common.util.SecurityUtil;
+import com.fdkankan.common.validation.Variable;
+import com.fdkankan.fyun.qiniu.QiniuUpload;
+import com.fdkankan.app.constant.LoginConstant;
+import com.fdkankan.app.entity.User;
+import com.fdkankan.app.mapper.IUserMapper;
+import com.fdkankan.app.service.ICameraDetailService;
+import com.fdkankan.app.service.IUserService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fdkankan.app.vo.response.UserVo;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.io.File;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * <p>
+ * 用户信息表 服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2022-07-01
+ */
+@Service
+public class UserServiceImpl extends ServiceImpl<IUserMapper, User> implements IUserService {
+
+    @Autowired
+    ICameraDetailService cameraDetailService;
+
+    private User getByEmail(String email){
+        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().eq(User ::getEmail,email);
+        List<User> list = this.list(queryWrapper);
+        if(list == null || list.size()<=0){
+            return null;
+        }
+        return list.get(0);
+    }
+
+    @Override
+    public User getByUserName(String phoneNum) {
+        LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(User::getUserName,phoneNum);
+        List<User> list = this.list(wrapper);
+        if(list != null && list.size() >0){
+            return list.get(0);
+        }
+        return null;
+    }
+
+
+
+    @Override
+    public HashMap<Long, User> getByIds(List<Long> userIds) {
+        LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
+        wrapper.in(User::getId,userIds);
+        List<User> list = this.list(wrapper);
+        HashMap<Long,User> map = new HashMap<>();
+        list.forEach(entity -> map.put(entity.getId(),entity));
+        return map;
+    }
+}

+ 33 - 0
src/main/java/com/fdkankan/app/util/DateUserUtil.java

@@ -0,0 +1,33 @@
+package com.fdkankan.app.util;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+public class DateUserUtil {
+
+    public static final String DEF_FMT = "yyyy-MM-dd HH:mm:ss";
+    public static final String DAY_FMT = "yyyy-MM-dd";
+
+    public static String getLastTime(String time1,String time2){
+        return getDate(time1).getTime() >getDate(time2).getTime() ? time1 : time2;
+    }
+
+    public static Date getDate(String time){
+        try {
+            return new SimpleDateFormat(DEF_FMT).parse(time);
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+        return new Date();
+    }
+
+    public static String getDayTime(String time) {
+        try {
+            Date date = new SimpleDateFormat(DEF_FMT).parse(time);
+            return new SimpleDateFormat(DAY_FMT).format(date);
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+       return "";
+    }
+}

+ 10 - 0
src/main/java/com/fdkankan/app/vo/request/LoginParam.java

@@ -0,0 +1,10 @@
+package com.fdkankan.app.vo.request;
+
+import lombok.Data;
+
+@Data
+public class LoginParam {
+    private String phoneNum;        //用户名
+    private String password;        //密码
+    private Integer cameraType;
+}

+ 9 - 0
src/main/java/com/fdkankan/app/vo/response/LoginVo.java

@@ -0,0 +1,9 @@
+package com.fdkankan.app.vo.response;
+
+import lombok.Data;
+
+@Data
+public class LoginVo {
+    private String token;
+    private UserVo user;
+}

+ 15 - 0
src/main/java/com/fdkankan/app/vo/response/UserVo.java

@@ -0,0 +1,15 @@
+package com.fdkankan.app.vo.response;
+
+import lombok.Data;
+
+@Data
+public class UserVo {
+    private Long id ;
+    private String userName;                    //用户名
+    private String head;                        //头像
+    private String nickName;                    //昵称
+    private String email;                       //邮箱
+    private Long cameraCount;                //已绑相机
+    private Long sceneCount;                //已绑相机
+
+}

+ 40 - 0
src/main/resources/bootstrap-dev-eur.yml

@@ -0,0 +1,40 @@
+spring:
+  application:
+    name: 4dkankan-center-user
+  cloud:
+    nacos:
+      config:
+        server-addr: 192.168.0.47:8848
+        file-extension: yaml
+        namespace: 4dkankan-dev
+        extension-configs:
+          - data-id: 4dkankan-center-user.yaml
+            group: DEFAULT_GROUP
+            refresh: true
+        shared-configs:
+          - data-id: common-db-config.yaml
+            group: DEFAULT_GROUP
+            refresh: true
+
+          - data-id: common-redis-config.yaml
+            group: DEFAULT_GROUP
+            refresh: true
+
+          - data-id: common-rabbitmq-config.yaml
+            group: DEFAULT_GROUP
+            refresh: true
+
+          - data-id: other-config.yaml
+            group: DEFAULT_GROUP
+            refresh: true
+
+          - data-id: common-upload-config.yaml
+            group: DEFAULT_GROUP
+            refresh: true
+      discovery:
+        server-addr: 192.168.0.47:8848
+        namespace: 4dkankan-dev
+
+
+
+

+ 43 - 0
src/main/resources/bootstrap-dev.yml

@@ -0,0 +1,43 @@
+spring:
+  application:
+    name: 4dkankan-center-app
+  cloud:
+    nacos:
+      config:
+        server-addr: 120.24.144.164:8848
+        file-extension: yaml
+        namespace: 4dkankan-dev
+        extension-configs:
+          - data-id: 4dkankan-center-user.yaml
+            group: DEFAULT_GROUP
+            refresh: true
+        shared-configs:
+          - data-id: common-db-config.yaml
+            group: DEFAULT_GROUP
+            refresh: true
+
+          - data-id: common-redis-config-52.yaml
+            group: DEFAULT_GROUP
+            refresh: true
+
+          - data-id: other-config.yaml
+            group: DEFAULT_GROUP
+            refresh: true
+
+          - data-id: common-upload-config.yaml
+            group: DEFAULT_GROUP
+            refresh: true
+
+          - data-id: common-mongodb-config.yaml
+            group: DEFAULT_GROUP
+            refresh: true
+
+          - data-id: common-satoken-config.yaml
+            group: DEFAULT_GROUP
+            refresh: true
+      discovery:
+        server-addr: 120.24.144.164:8848
+        namespace: 4dkankan-dev
+
+
+

+ 40 - 0
src/main/resources/bootstrap-pro-eur.yml

@@ -0,0 +1,40 @@
+spring:
+  application:
+    name: 4dkankan-center-user
+  cloud:
+    nacos:
+      config:
+        server-addr: 172.31.42.151:8848
+        file-extension: yaml
+        namespace: 4dkankan-pro-eur
+        extension-configs:
+          - data-id: 4dkankan-center-user.yaml
+            group: DEFAULT_GROUP
+            refresh: true
+        shared-configs:
+          - data-id: common-db-config.yaml
+            group: DEFAULT_GROUP
+            refresh: true
+
+          - data-id: common-redis-config.yaml
+            group: DEFAULT_GROUP
+            refresh: true
+
+          - data-id: common-rabbitmq-config.yaml
+            group: DEFAULT_GROUP
+            refresh: true
+
+          - data-id: other-config.yaml
+            group: DEFAULT_GROUP
+            refresh: true
+
+          - data-id: common-upload-config.yaml
+            group: DEFAULT_GROUP
+            refresh: true
+      discovery:
+        server-addr: 172.31.42.151:8848
+        namespace: 4dkankan-pro-eur
+
+
+
+

+ 40 - 0
src/main/resources/bootstrap-pro.yml

@@ -0,0 +1,40 @@
+spring:
+  application:
+    name: 4dkankan-center-user
+  cloud:
+    nacos:
+      config:
+        server-addr: 172.18.157.42:8848
+        file-extension: yaml
+        namespace: 4dkankan-pro
+        extension-configs:
+          - data-id: 4dkankan-center-user.yaml
+            group: DEFAULT_GROUP
+            refresh: true
+        shared-configs:
+          - data-id: common-db-config.yaml
+            group: DEFAULT_GROUP
+            refresh: true
+
+          - data-id: common-redis-config.yaml
+            group: DEFAULT_GROUP
+            refresh: true
+
+          - data-id: common-rabbitmq-config.yaml
+            group: DEFAULT_GROUP
+            refresh: true
+
+          - data-id: other-config.yaml
+            group: DEFAULT_GROUP
+            refresh: true
+
+          - data-id: common-upload-config.yaml
+            group: DEFAULT_GROUP
+            refresh: true
+      discovery:
+        server-addr: 172.18.157.42:8848
+        namespace: 4dkankan-pro
+
+
+
+

+ 5 - 0
src/main/resources/bootstrap.yml

@@ -0,0 +1,5 @@
+spring:
+  profiles:
+    active: dev
+
+

+ 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/logs/ucenter" />
+
+	<!-- 彩色日志 -->
+	<!-- 彩色日志依赖的渲染类 -->
+	<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/app/CameraDetailMapper.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.app.mapper.ICameraDetailMapper">
+
+</mapper>

+ 5 - 0
src/main/resources/mapper/app/CameraMapper.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.app.mapper.ICameraMapper">
+
+</mapper>

+ 5 - 0
src/main/resources/mapper/app/SceneMapper.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.app.mapper.ISceneMapper">
+
+</mapper>

+ 5 - 0
src/main/resources/mapper/app/ScenePlusExtMapper.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.app.mapper.IScenePlusExtMapper">
+
+</mapper>

+ 5 - 0
src/main/resources/mapper/app/ScenePlusMapper.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.app.mapper.IScenePlusMapper">
+
+</mapper>

+ 5 - 0
src/main/resources/mapper/app/SceneProMapper.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.app.mapper.ISceneProMapper">
+
+</mapper>

+ 5 - 0
src/main/resources/mapper/app/UserMapper.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.app.mapper.IUserMapper">
+
+</mapper>

+ 9 - 0
src/main/resources/static/apppro.html

@@ -0,0 +1,9 @@
+<!DOCTYPE html>
+<html>
+    <head>
+    <title>1</title>
+    </head>
+    <body >
+        4dage,app部门文件,请勿删除
+    </body>
+</html>

BIN
src/main/resources/static/img/logo.jpg


Разница между файлами не показана из-за своего большого размера
+ 1125 - 0
src/main/resources/static/txt/SensitiveWord.txt