Browse Source

登录相关

lyhzzz 3 years ago
parent
commit
af2de6b004
88 changed files with 5747 additions and 1 deletions
  1. 125 1
      pom.xml
  2. 23 0
      src/main/java/com/fdkankan/user/UserCenterApplication.java
  3. 8 0
      src/main/java/com/fdkankan/user/common/RedisKeyUtil.java
  4. 97 0
      src/main/java/com/fdkankan/user/common/Result.java
  5. 115 0
      src/main/java/com/fdkankan/user/constant/LoginConstant.java
  6. 28 0
      src/main/java/com/fdkankan/user/controller/CameraController.java
  7. 25 0
      src/main/java/com/fdkankan/user/controller/IncrementController.java
  8. 132 0
      src/main/java/com/fdkankan/user/controller/LoginController.java
  9. 37 0
      src/main/java/com/fdkankan/user/controller/SceneController.java
  10. 157 0
      src/main/java/com/fdkankan/user/controller/UserController.java
  11. 90 0
      src/main/java/com/fdkankan/user/entity/Camera.java
  12. 150 0
      src/main/java/com/fdkankan/user/entity/CameraDetail.java
  13. 93 0
      src/main/java/com/fdkankan/user/entity/CameraSpace.java
  14. 108 0
      src/main/java/com/fdkankan/user/entity/ReceiverInfo.java
  15. 279 0
      src/main/java/com/fdkankan/user/entity/Scene.java
  16. 54 0
      src/main/java/com/fdkankan/user/entity/SceneCooperation.java
  17. 115 0
      src/main/java/com/fdkankan/user/entity/ScenePlus.java
  18. 151 0
      src/main/java/com/fdkankan/user/entity/ScenePlusExt.java
  19. 231 0
      src/main/java/com/fdkankan/user/entity/ScenePro.java
  20. 141 0
      src/main/java/com/fdkankan/user/entity/User.java
  21. 102 0
      src/main/java/com/fdkankan/user/entity/UserIncrement.java
  22. 36 0
      src/main/java/com/fdkankan/user/exception/GlobalExceptionHandler.java
  23. 98 0
      src/main/java/com/fdkankan/user/generate/AutoGenerate.java
  24. 18 0
      src/main/java/com/fdkankan/user/mapper/ICameraDetailMapper.java
  25. 18 0
      src/main/java/com/fdkankan/user/mapper/ICameraMapper.java
  26. 23 0
      src/main/java/com/fdkankan/user/mapper/ICameraSpaceMapper.java
  27. 18 0
      src/main/java/com/fdkankan/user/mapper/IReceiverInfoMapper.java
  28. 24 0
      src/main/java/com/fdkankan/user/mapper/ISceneCooperationMapper.java
  29. 18 0
      src/main/java/com/fdkankan/user/mapper/ISceneMapper.java
  30. 18 0
      src/main/java/com/fdkankan/user/mapper/IScenePlusExtMapper.java
  31. 18 0
      src/main/java/com/fdkankan/user/mapper/IScenePlusMapper.java
  32. 18 0
      src/main/java/com/fdkankan/user/mapper/ISceneProMapper.java
  33. 18 0
      src/main/java/com/fdkankan/user/mapper/IUserIncrementMapper.java
  34. 18 0
      src/main/java/com/fdkankan/user/mapper/IUserMapper.java
  35. 21 0
      src/main/java/com/fdkankan/user/service/ICameraDetailService.java
  36. 21 0
      src/main/java/com/fdkankan/user/service/ICameraService.java
  37. 20 0
      src/main/java/com/fdkankan/user/service/ICameraSpaceService.java
  38. 27 0
      src/main/java/com/fdkankan/user/service/IReceiverInfoService.java
  39. 19 0
      src/main/java/com/fdkankan/user/service/ISceneCooperationService.java
  40. 16 0
      src/main/java/com/fdkankan/user/service/IScenePlusExtService.java
  41. 19 0
      src/main/java/com/fdkankan/user/service/IScenePlusService.java
  42. 20 0
      src/main/java/com/fdkankan/user/service/ISceneProService.java
  43. 17 0
      src/main/java/com/fdkankan/user/service/ISceneService.java
  44. 21 0
      src/main/java/com/fdkankan/user/service/IUserIncrementService.java
  45. 48 0
      src/main/java/com/fdkankan/user/service/IUserService.java
  46. 73 0
      src/main/java/com/fdkankan/user/service/impl/CameraDetailServiceImpl.java
  47. 40 0
      src/main/java/com/fdkankan/user/service/impl/CameraServiceImpl.java
  48. 27 0
      src/main/java/com/fdkankan/user/service/impl/CameraSpaceServiceImpl.java
  49. 48 0
      src/main/java/com/fdkankan/user/service/impl/FdkkLaserService.java
  50. 261 0
      src/main/java/com/fdkankan/user/service/impl/LoginService.java
  51. 85 0
      src/main/java/com/fdkankan/user/service/impl/ReceiverInfoServiceImpl.java
  52. 28 0
      src/main/java/com/fdkankan/user/service/impl/SceneCooperationServiceImpl.java
  53. 20 0
      src/main/java/com/fdkankan/user/service/impl/ScenePlusExtServiceImpl.java
  54. 30 0
      src/main/java/com/fdkankan/user/service/impl/ScenePlusServiceImpl.java
  55. 72 0
      src/main/java/com/fdkankan/user/service/impl/SceneProServiceImpl.java
  56. 27 0
      src/main/java/com/fdkankan/user/service/impl/SceneServiceImpl.java
  57. 112 0
      src/main/java/com/fdkankan/user/service/impl/UserIncrementServiceImpl.java
  58. 235 0
      src/main/java/com/fdkankan/user/service/impl/UserServiceImpl.java
  59. 10 0
      src/main/java/com/fdkankan/user/vo/request/IncrementParam.java
  60. 10 0
      src/main/java/com/fdkankan/user/vo/request/LoginParam.java
  61. 13 0
      src/main/java/com/fdkankan/user/vo/request/RegisterParam.java
  62. 15 0
      src/main/java/com/fdkankan/user/vo/request/ShipAddressParam.java
  63. 10 0
      src/main/java/com/fdkankan/user/vo/request/UserParam.java
  64. 51 0
      src/main/java/com/fdkankan/user/vo/response/CameraSpaceVo.java
  65. 9 0
      src/main/java/com/fdkankan/user/vo/response/LoginVo.java
  66. 13 0
      src/main/java/com/fdkankan/user/vo/response/SceneNumVo.java
  67. 48 0
      src/main/java/com/fdkankan/user/vo/response/UserIncrementVo.java
  68. 21 0
      src/main/java/com/fdkankan/user/vo/response/UserVo.java
  69. 40 0
      src/main/resources/bootstrap-dev-eur.yml
  70. 43 0
      src/main/resources/bootstrap-dev.yml
  71. 40 0
      src/main/resources/bootstrap-pro-eur.yml
  72. 40 0
      src/main/resources/bootstrap-pro.yml
  73. 5 0
      src/main/resources/bootstrap.yml
  74. 254 0
      src/main/resources/logback-spring.xml
  75. 5 0
      src/main/resources/mapper/user/CameraDetailMapper.xml
  76. 5 0
      src/main/resources/mapper/user/CameraMapper.xml
  77. 11 0
      src/main/resources/mapper/user/CameraSpaceMapper.xml
  78. 5 0
      src/main/resources/mapper/user/ReceiverInfoMapper.xml
  79. 24 0
      src/main/resources/mapper/user/SceneCooperationMapper.xml
  80. 5 0
      src/main/resources/mapper/user/SceneMapper.xml
  81. 5 0
      src/main/resources/mapper/user/ScenePlusExtMapper.xml
  82. 5 0
      src/main/resources/mapper/user/ScenePlusMapper.xml
  83. 5 0
      src/main/resources/mapper/user/SceneProMapper.xml
  84. 5 0
      src/main/resources/mapper/user/UserIncrementMapper.xml
  85. 5 0
      src/main/resources/mapper/user/UserMapper.xml
  86. 9 0
      src/main/resources/static/apppro.html
  87. BIN
      src/main/resources/static/img/logo.jpg
  88. 1125 0
      src/main/resources/static/txt/SensitiveWord.txt

+ 125 - 1
pom.xml

@@ -4,9 +4,133 @@
          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>org.example</groupId>
+    <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/user/UserCenterApplication.java

@@ -0,0 +1,23 @@
+package com.fdkankan.user;
+
+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 UserCenterApplication {
+
+    public static void main(String[] args) {
+        SpringApplication.run(UserCenterApplication.class, args);
+    }
+
+}

+ 8 - 0
src/main/java/com/fdkankan/user/common/RedisKeyUtil.java

@@ -0,0 +1,8 @@
+package com.fdkankan.user.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:";
+
+}

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

@@ -0,0 +1,97 @@
+package com.fdkankan.user.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/user/constant/LoginConstant.java

@@ -0,0 +1,115 @@
+package com.fdkankan.user.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 = "服务器繁忙,请重试!";
+
+}

+ 28 - 0
src/main/java/com/fdkankan/user/controller/CameraController.java

@@ -0,0 +1,28 @@
+package com.fdkankan.user.controller;
+
+import com.fdkankan.common.util.JwtUtil;
+import com.fdkankan.user.common.Result;
+import com.fdkankan.user.service.ICameraDetailService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestHeader;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/api/user/camera")
+public class CameraController {
+
+    @Autowired
+    ICameraDetailService cameraDetailService;
+
+    /**
+     * 获取设备到期数量
+     */
+    @PostMapping("/deadlineNumber")
+    public Result deadlineNumber(@RequestHeader String token){
+        String username = JwtUtil.getUsername(token);
+        cameraDetailService.deadlineNumber(username);
+        return Result.success();
+    }
+}

+ 25 - 0
src/main/java/com/fdkankan/user/controller/IncrementController.java

@@ -0,0 +1,25 @@
+package com.fdkankan.user.controller;
+
+import com.fdkankan.common.util.JwtUtil;
+import com.fdkankan.user.common.Result;
+import com.fdkankan.user.service.IUserIncrementService;
+import com.fdkankan.user.vo.request.IncrementParam;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+
+@RestController
+@RequestMapping("/api/user/increment")
+public class IncrementController {
+
+    @Autowired
+    IUserIncrementService userIncrementService;
+
+    @PostMapping("/findIncrementList")
+    public Result findIncrementList(@RequestBody IncrementParam param, @RequestHeader String token){
+        param.setUserName(JwtUtil.getUsername(token));
+        userIncrementService.pageList(param);
+        return Result.success();
+    }
+}

+ 132 - 0
src/main/java/com/fdkankan/user/controller/LoginController.java

@@ -0,0 +1,132 @@
+package com.fdkankan.user.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import com.fdkankan.common.util.JwtUtil;
+import com.fdkankan.user.common.Result;
+import com.fdkankan.user.service.impl.LoginService;
+import com.fdkankan.user.vo.request.LoginParam;
+import com.fdkankan.user.vo.request.RegisterParam;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+
+/**
+ * 登录
+ */
+@RestController
+@RequestMapping("/api/sso/user")
+public class LoginController {
+
+    @Autowired
+    LoginService loginService;
+
+    /**
+     * 登录
+     * phoneNum 用户名
+     * password 密码
+     */
+    @PostMapping("/login")
+    public Result login(@RequestBody LoginParam param){
+        return Result.success(loginService.login(param));
+    }
+
+    /**
+     * 相机扫码登录 获取二维码
+     */
+    @GetMapping("/createLoginQrCode")
+    public Result createLoginQrCode() throws Exception {
+        return  Result.success(loginService.createLoginQrCode());
+    }
+
+    /**
+     * 扫码验证登录
+     */
+    @PostMapping("/sendUserInfo")
+    public Result sendUserInfo(@RequestBody JSONObject jsonObject){
+        return Result.success(loginService.sendUserInfo(jsonObject.getString("uuid")));
+    }
+    /**
+     * 登出
+     */
+    @PostMapping("/logout")
+    public Result logout(@RequestHeader String token){
+        loginService.logout(token);
+        return Result.success();
+    }
+
+    /**
+     *  检测用户名
+     *  phoneNum  用户名
+     */
+    @PostMapping("/checkUser")
+    public Result checkUser(@RequestBody LoginParam param){
+        loginService.checkUser(param.getPhoneNum());
+        return Result.success();
+    }
+    /**
+     *  获取验证码
+     *  areaNum  区号
+     *  phoneNum 手机号码
+     */
+    @PostMapping("/getMsgAuthCode")
+    public Result getMsgAuthCode(@RequestBody LoginParam param) throws Exception {
+        loginService.getMsgAuthCode(param.getAreaNum(),param.getPhoneNum());
+        return Result.success();
+    }
+    /**
+     * 发送邮件验证码
+     */
+    @PostMapping("/getEmailAuthCode")
+    public Result getEmailAuthCode(@RequestBody RegisterParam param) throws Exception {
+        loginService.getEmailAuthCode(param.getEmail(),param.getCountry());
+        return Result.success();
+    }
+
+    /**
+     *  注册
+     *  areaNum  区号
+     *  phoneNum 手机号码
+     */
+    @PostMapping("/register")
+    public Result register(@RequestBody RegisterParam param) throws Exception {
+        loginService.register(param);
+        return Result.success();
+    }
+
+    /**
+     * 修改密码
+     */
+    @PostMapping("/changePassword")
+    public Result changePassword(@RequestBody RegisterParam param){
+        loginService.changePassword(param);
+        return Result.success();
+    }
+    /**
+     * 检验token是否过期
+     */
+    @PostMapping(value = "/checkToken")
+    public Result checkToken(@RequestHeader String token){
+        loginService.loginCheck(token);
+        return Result.success();
+    }
+
+    /**
+     * 检验验证码是否有效
+     */
+    @PostMapping(value = "/checkSms")
+    public Result checkSms(@RequestBody RegisterParam param,@RequestHeader String token){
+        String username = JwtUtil.getUsername(token);
+        loginService.checkSms(param.getMsgAuthCode(),username,false);
+        return Result.success();
+    }
+
+    /**
+     * getToken
+     */
+    @PostMapping("/getToken")
+    public Result getToken(@RequestBody LoginParam param){
+        return Result.success(loginService.login(param));
+    }
+}
+

+ 37 - 0
src/main/java/com/fdkankan/user/controller/SceneController.java

@@ -0,0 +1,37 @@
+package com.fdkankan.user.controller;
+
+
+import com.fdkankan.common.util.JwtUtil;
+import com.fdkankan.user.common.Result;
+import com.fdkankan.user.service.ISceneProService;
+import com.fdkankan.user.service.IUserService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestHeader;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ * 场景表 前端控制器
+ * </p>
+ *
+ * @author 
+ * @since 2022-07-04
+ */
+@RestController
+@RequestMapping("/api/user/scene")
+public class SceneController {
+
+    @Autowired
+    ISceneProService sceneProService;
+    @Autowired
+    IUserService userService;
+
+    @PostMapping("/findSceneNumber")
+    public Result findSceneNumber(@RequestHeader String token){
+        return Result.success(sceneProService.findSceneNumber(token));
+    }
+}
+

+ 157 - 0
src/main/java/com/fdkankan/user/controller/UserController.java

@@ -0,0 +1,157 @@
+package com.fdkankan.user.controller;
+
+import cn.hutool.jwt.JWT;
+import com.alibaba.fastjson.JSONObject;
+import com.fdkankan.common.constant.ServerCode;
+import com.fdkankan.common.util.JwtUtil;
+import com.fdkankan.user.common.Result;
+import com.fdkankan.user.service.IUserService;
+import com.fdkankan.user.service.impl.LoginService;
+import com.fdkankan.user.vo.request.RegisterParam;
+import com.fdkankan.user.vo.request.ShipAddressParam;
+import com.fdkankan.user.vo.request.UserParam;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+
+/**
+ * 个人中心
+ */
+@RestController
+@RequestMapping("/api/user")
+public class UserController {
+
+    @Autowired
+    private IUserService userService;
+    @Autowired
+    private LoginService loginService;
+
+
+    @RequestMapping(value = "/checkToken", method = RequestMethod.POST)
+    public Result checkToken() {
+        return Result.success();
+    }
+
+    /**
+     * 获取用户信息
+     */
+    @RequestMapping(value = "/getUserInfo", method = RequestMethod.POST)
+    public Result getUserInfo( @RequestHeader String token) throws Exception {
+        String username = JwtUtil.getUsername(token);
+        return Result.success(userService.getUserInfo(username));
+    }
+
+    /**
+     * 修改密码
+     */
+    @RequestMapping(value = "/changePassword", method = RequestMethod.POST)
+    public Result changePassword(@RequestBody RegisterParam param){
+        loginService.changePassword(param);
+        return Result.success();
+    }
+
+    /**
+     * 用户上传头像
+     * imgdata 图片的base64码
+     */
+    @RequestMapping(value = "/uploadHead", method = RequestMethod.POST)
+    public Result uploadHead(@RequestBody JSONObject jsonObject, @RequestHeader String token) throws Exception {
+        String username = JwtUtil.getUsername(token);
+        return Result.success(userService.uploadHead(jsonObject.getString("imgdata"),username));
+    }
+
+    /**
+     * 用户新增收货地址
+     * shipAddress      收货地址-详细地址
+     * shipAreaPath     收货地址-省-市-区
+     * province         所在地区-省
+     * city             所在地区-市
+     * shipName         收货人
+     * shipMobile       收货人手机
+     */
+    @RequestMapping(value = "/insertAddress", method = RequestMethod.POST)
+    public Result insertAddress(@RequestBody ShipAddressParam param, @RequestHeader String token){
+        String username = JwtUtil.getUsername(token);
+        userService.insertAddress(param,username);
+        return Result.success();
+    }
+
+    /**
+     * 用户更新默认地址
+     * id
+     * shipAddress      收货地址-详细地址
+     * shipAreaPath     收货地址-省-市-区
+     * province         所在地区-省
+     * city             所在地区-市
+     * shipName         收货人
+     * shipMobile       收货人手机
+     * setDefault       1表示默认地址,0表示不是默认地址
+     */
+    @RequestMapping(value = "/updateAddress", method = RequestMethod.POST)
+
+    public Result updateAddress(@RequestBody ShipAddressParam param,@RequestHeader String token){
+        String username = JwtUtil.getUsername(token);
+        userService.updateAddress(param,username);
+        return Result.success();
+    }
+
+    /**
+     * 用户删除默认地址
+     */
+    @RequestMapping(value = "/deleteAddress", method = RequestMethod.POST)
+    public Result deleteAddress(@RequestBody ShipAddressParam param){
+        userService.deleteAddress(param.getId());
+        return Result.success();
+    }
+    /**
+     * 用户更新邮箱地址
+     * email        邮箱地址
+     */
+    @RequestMapping(value = "/updateEmail", method = RequestMethod.POST)
+    public Result updateEmail(@RequestBody UserParam param,@RequestHeader String token){
+        String username = JwtUtil.getUsername(token);
+        userService.updateEmail(param.getEmail(),username);
+        return Result.success();
+    }
+
+    /**
+     * 获取用户默认收货信息
+     */
+    @RequestMapping(value = "/getReceiverInfo", method = RequestMethod.POST)
+    public Result getReceiverInfo(@RequestHeader String token){
+        String username = JwtUtil.getUsername(token);
+        return  Result.success(userService.getReceiverInfo(username));
+    }
+
+    /**
+     * 获取用户收货信息列表
+     */
+    @RequestMapping(value = "/getReceiverList", method = RequestMethod.POST)
+    public Result getReceiverList(@RequestHeader String token){
+        String username = JwtUtil.getUsername(token);
+        return Result.success(userService.getReceiverList(username));
+    }
+
+    /**
+     * 更改昵称
+     * nickName     用户昵称
+     */
+    @RequestMapping(value = "/updateNickName", method = RequestMethod.POST)
+    public Result updateNickName(@RequestBody UserParam param,@RequestHeader String token){
+        String username = JwtUtil.getUsername(token);
+        userService.updateNickName(param.getNickName(),username);
+        return Result.success();
+    }
+    /**
+     * 修改用户信息
+     * nickName     昵称
+     * email        邮箱
+     * isNotice     isNotice
+     */
+    @RequestMapping(value = "/updateUserDetail", method = RequestMethod.POST)
+    public Result updateUserDetail(@RequestBody UserParam param, @RequestHeader String token){
+        String username = JwtUtil.getUsername(token);
+        userService.updateUserDetail(param,username);
+        return Result.success();
+    }
+}

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

@@ -0,0 +1,90 @@
+package com.fdkankan.user.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/user/entity/CameraDetail.java

@@ -0,0 +1,150 @@
+package com.fdkankan.user.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;
+
+
+}

+ 93 - 0
src/main/java/com/fdkankan/user/entity/CameraSpace.java

@@ -0,0 +1,93 @@
+package com.fdkankan.user.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_space")
+public class CameraSpace implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 用户表t_user的id
+     */
+    @TableField("user_id")
+    private Long userId;
+
+    /**
+     * 相机主表t_camera的id
+     */
+    @TableField("camera_id")
+    private Long cameraId;
+
+    /**
+     * 容量
+     */
+    @TableField("space")
+    private Long space;
+
+    /**
+     * 容量类型,0表示基础容量,1表示期限容量,2表示扩容容量
+     */
+    @TableField("space_type")
+    private Integer spaceType;
+
+    /**
+     * 生效时间
+     */
+    @TableField("space_start_time")
+    private Date spaceStartTime;
+
+    /**
+     * 结束时间
+     */
+    @TableField("space_end_time")
+    private Date spaceEndTime;
+
+    /**
+     * 创建时间
+     */
+    @TableField("create_time")
+    private Date createTime;
+
+    /**
+     * 记录的状态,A: 生效,I: 禁用
+     */
+    @TableField("rec_status")
+    @TableLogic
+    private String recStatus;
+
+    /**
+     * 更新时间
+     */
+    @TableField("update_time")
+    private Date updateTime;
+
+    /**
+     * 扩容订单集合
+     */
+    @TableField("order_sn")
+    private String orderSn;
+
+
+}

+ 108 - 0
src/main/java/com/fdkankan/user/entity/ReceiverInfo.java

@@ -0,0 +1,108 @@
+package com.fdkankan.user.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_receiver_info")
+public class ReceiverInfo implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 用户表t_user的id
+     */
+    @TableField("user_id")
+    private Long userId;
+
+    /**
+     * 收货人姓名
+     */
+    @TableField("ship_name")
+    private String shipName;
+
+    /**
+     * 收货人的电话号码
+     */
+    @TableField("ship_mobile")
+    private String shipMobile;
+
+    /**
+     * 所在地区
+     */
+    @TableField("ship_area")
+    private String shipArea;
+
+    /**
+     * 收货的详细地址
+     */
+    @TableField("ship_address")
+    private String shipAddress;
+
+    /**
+     * 1表示默认地址,0表示不是默认地址
+     */
+    @TableField("set_default")
+    private Integer setDefault;
+
+    @TableField("country")
+    private String country;
+
+    /**
+     * 收货地区路径
+     */
+    @TableField("ship_area_path")
+    private String shipAreaPath;
+
+    /**
+     * 收货电话
+     */
+    @TableField("ship_phone")
+    private String shipPhone;
+
+    /**
+     * 收货邮编
+     */
+    @TableField("ship_zip_code")
+    private String shipZipCode;
+
+    /**
+     * 创建时间
+     */
+    @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;
+
+
+}

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

@@ -0,0 +1,279 @@
+package com.fdkankan.user.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_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;
+
+
+}

+ 54 - 0
src/main/java/com/fdkankan/user/entity/SceneCooperation.java

@@ -0,0 +1,54 @@
+package com.fdkankan.user.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_scene_cooperation")
+public class SceneCooperation implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 场景码
+     */
+    @TableField("scene_num")
+    private String sceneNum;
+
+    /**
+     * 协作的用户id
+     */
+    @TableField("user_id")
+    private Long userId;
+
+    @TableField("create_time")
+    private Date createTime;
+
+    @TableField("update_time")
+    private Date updateTime;
+
+    @TableField("rec_status")
+    @TableLogic
+    private String recStatus;
+
+
+}

+ 115 - 0
src/main/java/com/fdkankan/user/entity/ScenePlus.java

@@ -0,0 +1,115 @@
+package com.fdkankan.user.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.util.Date;
+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 Date createTime;
+
+    /**
+     * 更新时间
+     */
+    @TableField("update_time")
+    private Date updateTime;
+
+    /**
+     * 0-有效,1-删除, 2-禁用
+     */
+    @TableField("tb_status")
+    private Integer tbStatus;
+
+
+}

+ 151 - 0
src/main/java/com/fdkankan/user/entity/ScenePlusExt.java

@@ -0,0 +1,151 @@
+package com.fdkankan.user.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.util.Date;
+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 Date createTime;
+
+    /**
+     * 更新时间
+     */
+    @TableField("update_time")
+    private Date updateTime;
+
+    /**
+     * 0-有效,1-删除, 2-禁用
+     */
+    @TableField("tb_status")
+    private Integer tbStatus;
+
+
+}

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

@@ -0,0 +1,231 @@
+package com.fdkankan.user.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>
+ * 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/user/entity/User.java

@@ -0,0 +1,141 @@
+package com.fdkankan.user.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-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;
+
+
+}

+ 102 - 0
src/main/java/com/fdkankan/user/entity/UserIncrement.java

@@ -0,0 +1,102 @@
+package com.fdkankan.user.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_user_increment")
+public class UserIncrement implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 权益包标识
+     */
+    @TableField("key_word")
+    private String keyWord;
+
+    /**
+     * 用户表t_user的id
+     */
+    @TableField("user_id")
+    private Long userId;
+
+    /**
+     * 相机主表t_camera的id
+     */
+    @TableField("camera_id")
+    private Long cameraId;
+
+    /**
+     * 会员权益类型Id
+     */
+    @TableField("increment_type_id")
+    private Integer incrementTypeId;
+
+    /**
+     * 结束时间
+     */
+    @TableField("increment_end_time")
+    private String incrementEndTime;
+
+    /**
+     * 是否过期(1过期,0未过期)
+     */
+    @TableField("is_expired")
+    private Integer isExpired;
+
+    /**
+     * 创建时间
+     */
+    @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;
+
+    /**
+     * 扩容订单集合
+     */
+    @TableField("order_sn")
+    private String orderSn;
+
+    /**
+     * 生效时间
+     */
+    @TableField("increment_start_time")
+    private String incrementStartTime;
+
+    @TableField("download_num")
+    private Integer downloadNum;
+
+
+}

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

@@ -0,0 +1,36 @@
+package com.fdkankan.user.exception;
+
+import com.fdkankan.common.exception.BusinessException;
+import com.fdkankan.user.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/user/generate/AutoGenerate.java

@@ -0,0 +1,98 @@
+package com.fdkankan.user.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_camera_space"
+        }));
+
+//        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/user/mapper/ICameraDetailMapper.java

@@ -0,0 +1,18 @@
+package com.fdkankan.user.mapper;
+
+import com.fdkankan.user.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/user/mapper/ICameraMapper.java

@@ -0,0 +1,18 @@
+package com.fdkankan.user.mapper;
+
+import com.fdkankan.user.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> {
+
+}

+ 23 - 0
src/main/java/com/fdkankan/user/mapper/ICameraSpaceMapper.java

@@ -0,0 +1,23 @@
+package com.fdkankan.user.mapper;
+
+import com.fdkankan.user.entity.CameraSpace;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fdkankan.user.vo.response.CameraSpaceVo;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 相机容量表 Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2022-07-04
+ */
+@Mapper
+public interface ICameraSpaceMapper extends BaseMapper<CameraSpace> {
+
+    List<CameraSpaceVo> getVoListByCameraId(@Param("cameraId") Long cameraId);
+}

+ 18 - 0
src/main/java/com/fdkankan/user/mapper/IReceiverInfoMapper.java

@@ -0,0 +1,18 @@
+package com.fdkankan.user.mapper;
+
+import com.fdkankan.user.entity.ReceiverInfo;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ * 收货人信息表 Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2022-07-04
+ */
+@Mapper
+public interface IReceiverInfoMapper extends BaseMapper<ReceiverInfo> {
+
+}

+ 24 - 0
src/main/java/com/fdkankan/user/mapper/ISceneCooperationMapper.java

@@ -0,0 +1,24 @@
+package com.fdkankan.user.mapper;
+
+import com.fdkankan.user.entity.SceneCooperation;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2022-07-04
+ */
+@Mapper
+public interface ISceneCooperationMapper extends BaseMapper<SceneCooperation> {
+
+    Integer getCooperationScenePlusNum(@Param("userId")Long userId,  @Param("sceneSource")List<Integer> sceneSourceList);
+
+    Integer getCooperationSceneProNum(Long userId, List<Integer> sceneSourceList);
+}

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

@@ -0,0 +1,18 @@
+package com.fdkankan.user.mapper;
+
+import com.fdkankan.user.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/user/mapper/IScenePlusExtMapper.java

@@ -0,0 +1,18 @@
+package com.fdkankan.user.mapper;
+
+import com.fdkankan.user.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/user/mapper/IScenePlusMapper.java

@@ -0,0 +1,18 @@
+package com.fdkankan.user.mapper;
+
+import com.fdkankan.user.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> {
+
+}

+ 18 - 0
src/main/java/com/fdkankan/user/mapper/ISceneProMapper.java

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

+ 18 - 0
src/main/java/com/fdkankan/user/mapper/IUserIncrementMapper.java

@@ -0,0 +1,18 @@
+package com.fdkankan.user.mapper;
+
+import com.fdkankan.user.entity.UserIncrement;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ * 用户增值权益表 Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2022-07-04
+ */
+@Mapper
+public interface IUserIncrementMapper extends BaseMapper<UserIncrement> {
+
+}

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

@@ -0,0 +1,18 @@
+package com.fdkankan.user.mapper;
+
+import com.fdkankan.user.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/user/service/ICameraDetailService.java

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

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

@@ -0,0 +1,21 @@
+package com.fdkankan.user.service;
+
+import com.fdkankan.user.entity.Camera;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 相机主表 服务类
+ * </p>
+ *
+ * @author 
+ * @since 2022-07-04
+ */
+public interface ICameraService extends IService<Camera> {
+
+    Camera getBySnCode(String snCode);
+
+    List<Camera> getCameraLikeSnCode(String trim);
+}

+ 20 - 0
src/main/java/com/fdkankan/user/service/ICameraSpaceService.java

@@ -0,0 +1,20 @@
+package com.fdkankan.user.service;
+
+import com.fdkankan.user.entity.CameraSpace;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fdkankan.user.vo.response.CameraSpaceVo;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 相机容量表 服务类
+ * </p>
+ *
+ * @author 
+ * @since 2022-07-04
+ */
+public interface ICameraSpaceService extends IService<CameraSpace> {
+
+    List<CameraSpaceVo> getVoListByCameraId(Long cameraId);
+}

+ 27 - 0
src/main/java/com/fdkankan/user/service/IReceiverInfoService.java

@@ -0,0 +1,27 @@
+package com.fdkankan.user.service;
+
+import com.fdkankan.user.entity.ReceiverInfo;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fdkankan.user.vo.request.ShipAddressParam;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 收货人信息表 服务类
+ * </p>
+ *
+ * @author 
+ * @since 2022-07-04
+ */
+public interface IReceiverInfoService extends IService<ReceiverInfo> {
+
+    ReceiverInfo getDefaultByUserId(Long userId);
+
+    void saveByParam(ShipAddressParam param, Long userId);
+
+    void updateDefaultAddress(ShipAddressParam param, Long userId);
+
+    List<ReceiverInfo> getListByUserId(Long userId);
+
+}

+ 19 - 0
src/main/java/com/fdkankan/user/service/ISceneCooperationService.java

@@ -0,0 +1,19 @@
+package com.fdkankan.user.service;
+
+import com.fdkankan.user.entity.SceneCooperation;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+import java.util.List;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author 
+ * @since 2022-07-04
+ */
+public interface ISceneCooperationService extends IService<SceneCooperation> {
+
+    Integer getCooperationSceneNum(Long userId, List<Integer> sceneSourceList);
+}

+ 16 - 0
src/main/java/com/fdkankan/user/service/IScenePlusExtService.java

@@ -0,0 +1,16 @@
+package com.fdkankan.user.service;
+
+import com.fdkankan.user.entity.ScenePlusExt;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author 
+ * @since 2022-07-04
+ */
+public interface IScenePlusExtService extends IService<ScenePlusExt> {
+
+}

+ 19 - 0
src/main/java/com/fdkankan/user/service/IScenePlusService.java

@@ -0,0 +1,19 @@
+package com.fdkankan.user.service;
+
+import com.fdkankan.user.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> {
+
+    Integer getCountByUserId(Long userId, List<Integer> sceneSourceList);
+}

+ 20 - 0
src/main/java/com/fdkankan/user/service/ISceneProService.java

@@ -0,0 +1,20 @@
+package com.fdkankan.user.service;
+
+import com.fdkankan.user.entity.ScenePro;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fdkankan.user.vo.response.SceneNumVo;
+
+import java.util.HashMap;
+
+/**
+ * <p>
+ * pro场景表 服务类
+ * </p>
+ *
+ * @author 
+ * @since 2022-07-04
+ */
+public interface ISceneProService extends IService<ScenePro> {
+
+    HashMap<String, SceneNumVo> findSceneNumber(String token);
+}

+ 17 - 0
src/main/java/com/fdkankan/user/service/ISceneService.java

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

+ 21 - 0
src/main/java/com/fdkankan/user/service/IUserIncrementService.java

@@ -0,0 +1,21 @@
+package com.fdkankan.user.service;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fdkankan.user.entity.UserIncrement;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fdkankan.user.vo.request.IncrementParam;
+
+/**
+ * <p>
+ * 用户增值权益表 服务类
+ * </p>
+ *
+ * @author 
+ * @since 2022-07-04
+ */
+public interface IUserIncrementService extends IService<UserIncrement> {
+
+    Long getCountByUserId(Long userId, int type);
+
+    Page pageList(IncrementParam param);
+}

+ 48 - 0
src/main/java/com/fdkankan/user/service/IUserService.java

@@ -0,0 +1,48 @@
+package com.fdkankan.user.service;
+
+import com.fdkankan.user.entity.ReceiverInfo;
+import com.fdkankan.user.entity.User;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fdkankan.user.vo.request.RegisterParam;
+import com.fdkankan.user.vo.request.ShipAddressParam;
+import com.fdkankan.user.vo.request.UserParam;
+import com.fdkankan.user.vo.response.UserVo;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 用户信息表 服务类
+ * </p>
+ *
+ * @author 
+ * @since 2022-07-01
+ */
+public interface IUserService extends IService<User> {
+
+    User getByUserName(String phoneNum);
+
+    void register(RegisterParam param);
+
+    void updatePassword(String phoneNum, String password);
+
+    UserVo getUserInfo(String userName);
+
+    String uploadHead(String imgdata, String userName) throws Exception;
+
+    void insertAddress(ShipAddressParam param, String userName);
+
+    void updateAddress(ShipAddressParam param, String userName);
+
+    void deleteAddress(Long id);
+
+    void updateEmail(String email, String userName);
+
+    ReceiverInfo getReceiverInfo(String userName);
+
+    List<ReceiverInfo> getReceiverList(String userName);
+
+    void updateNickName(String nickName, String userName);
+
+    void updateUserDetail(UserParam param, String userName);
+}

+ 73 - 0
src/main/java/com/fdkankan/user/service/impl/CameraDetailServiceImpl.java

@@ -0,0 +1,73 @@
+package com.fdkankan.user.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.fdkankan.common.constant.TbStatus;
+import com.fdkankan.user.entity.CameraDetail;
+import com.fdkankan.user.entity.User;
+import com.fdkankan.user.mapper.ICameraDetailMapper;
+import com.fdkankan.user.service.ICameraDetailService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fdkankan.user.service.ICameraSpaceService;
+import com.fdkankan.user.service.IUserService;
+import com.fdkankan.user.vo.response.CameraSpaceVo;
+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.List;
+
+/**
+ * <p>
+ * 相机子表 服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2022-07-04
+ */
+@Service
+public class CameraDetailServiceImpl extends ServiceImpl<ICameraDetailMapper, CameraDetail> implements ICameraDetailService {
+
+    @Autowired
+    IUserService userService;
+    @Autowired
+    ICameraSpaceService cameraSpaceService;
+
+    @Override
+    public CameraDetail getByCameraId(Long cameraId) {
+        LambdaQueryWrapper<CameraDetail> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(CameraDetail::getCameraId,cameraId);
+        List<CameraDetail> list = this.list(wrapper);
+        if(list!=null && list.size() >0){
+            return list.get(0);
+        }
+        return null;
+    }
+
+    @Override
+    public Long getCountByUserId(Long userId) {
+        LambdaQueryWrapper<CameraDetail> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(CameraDetail::getUserId,userId);
+        return this.count(wrapper);
+    }
+
+    @Override
+    public Integer deadlineNumber(String username) {
+        User user = userService.getByUserName(username);
+        QueryWrapper<CameraDetail> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().eq(CameraDetail::getUserId,user.getId());
+        List<CameraDetail> list = this.list(queryWrapper);
+        Integer number = 0;
+        List<CameraSpaceVo> cameraList = null;
+        for (CameraDetail cameraDetailEntity : list) {
+            cameraList = cameraSpaceService.getVoListByCameraId(cameraDetailEntity.getCameraId());
+            if(cameraList != null && cameraList.size() > 0){
+                if(Days.daysBetween(new DateTime(), new DateTime(cameraList.get(0).getSpaceEndTime())).getDays() < 30){
+                    number++;
+                }
+            }
+        }
+        return number;
+    }
+}

+ 40 - 0
src/main/java/com/fdkankan/user/service/impl/CameraServiceImpl.java

@@ -0,0 +1,40 @@
+package com.fdkankan.user.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.fdkankan.user.entity.Camera;
+import com.fdkankan.user.mapper.ICameraMapper;
+import com.fdkankan.user.service.ICameraService;
+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 CameraServiceImpl extends ServiceImpl<ICameraMapper, Camera> implements ICameraService {
+
+    @Override
+    public Camera getBySnCode(String snCode) {
+        LambdaQueryWrapper<Camera> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(Camera::getSnCode,snCode);
+        List<Camera> list = this.list(wrapper);
+        if(list !=null && list.size() > 0){
+            return list.get(0);
+        }
+        return null;
+    }
+
+    @Override
+    public List<Camera> getCameraLikeSnCode(String snCode) {
+        LambdaQueryWrapper<Camera> wrapper = new LambdaQueryWrapper<>();
+        wrapper.like(Camera::getSnCode,snCode);
+        return this.list(wrapper);
+    }
+}

+ 27 - 0
src/main/java/com/fdkankan/user/service/impl/CameraSpaceServiceImpl.java

@@ -0,0 +1,27 @@
+package com.fdkankan.user.service.impl;
+
+import com.fdkankan.user.entity.CameraSpace;
+import com.fdkankan.user.mapper.ICameraSpaceMapper;
+import com.fdkankan.user.service.ICameraSpaceService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fdkankan.user.vo.response.CameraSpaceVo;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 相机容量表 服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2022-07-04
+ */
+@Service
+public class CameraSpaceServiceImpl extends ServiceImpl<ICameraSpaceMapper, CameraSpace> implements ICameraSpaceService {
+
+    @Override
+    public List<CameraSpaceVo> getVoListByCameraId(Long cameraId) {
+        return this.getBaseMapper().getVoListByCameraId(cameraId);
+    }
+}

+ 48 - 0
src/main/java/com/fdkankan/user/service/impl/FdkkLaserService.java

@@ -0,0 +1,48 @@
+package com.fdkankan.user.service.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.fdkankan.user.common.Result;
+import com.fdkankan.user.vo.response.SceneNumVo;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Service;
+import org.springframework.web.client.RestTemplate;
+
+@Service
+@Slf4j
+public class FdkkLaserService {
+    @Value("${4dkk.laserService.host}")
+    private String laserHost;
+    private final String GET_LASER_SCENE_USER_URL="/laser/4dage/getSceneNum";
+    private RestTemplate restTemplate = new RestTemplate();
+
+    /**
+     * 根据用户获取激光相机数量
+     * @param token
+     */
+    public SceneNumVo getLaserSceneNumByUser(String token) {
+        SceneNumVo sceneNumVo = new SceneNumVo();
+        try {
+            String url = laserHost + GET_LASER_SCENE_USER_URL;
+            HttpHeaders headers = new HttpHeaders();
+            headers.add("fdToken", token);
+            HttpEntity<Object> formEntity = new HttpEntity<>( headers);
+            log.info("获取激光转台相机场景数,url:{},fdToken:{}",GET_LASER_SCENE_USER_URL,token);
+            ResponseEntity<Result> responseEntity = restTemplate.postForEntity(url,formEntity, Result.class);
+            log.info("获取激光转台相机场景数,url:{},fdToken:{},结果:{}",url,token, JSONObject.toJSONString(responseEntity.getBody()));
+            if(responseEntity.getStatusCode() != HttpStatus.OK || responseEntity.getBody().getCode() != HttpStatus.OK.value()){
+                log.error("自研激光转台相机协作失败!");
+                return sceneNumVo;
+            }
+            sceneNumVo = JSONObject.parseObject(JSONObject.toJSONString(responseEntity.getBody().getData()), SceneNumVo.class);
+            sceneNumVo.setTotalNum(sceneNumVo.getSceneNum() + sceneNumVo.getCooperationSceneNum());
+        }catch (Exception e){
+            log.error("自研激光转台相机协作失败!",e);
+        }
+        return sceneNumVo ;
+    }
+}

+ 261 - 0
src/main/java/com/fdkankan/user/service/impl/LoginService.java

@@ -0,0 +1,261 @@
+package com.fdkankan.user.service.impl;
+
+import com.alibaba.fastjson.JSONObject;
+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.user.common.RedisKeyUtil;
+import com.fdkankan.user.constant.LoginConstant;
+import com.fdkankan.user.entity.Camera;
+import com.fdkankan.user.entity.CameraDetail;
+import com.fdkankan.user.entity.User;
+import com.fdkankan.user.service.ICameraDetailService;
+import com.fdkankan.user.service.ICameraService;
+import com.fdkankan.user.service.IUserService;
+import com.fdkankan.user.vo.request.LoginParam;
+import com.fdkankan.user.vo.request.RegisterParam;
+import com.fdkankan.user.vo.response.LoginVo;
+import com.fdkankan.user.vo.response.UserVo;
+import org.apache.commons.lang3.StringUtils;
+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.security.GeneralSecurityException;
+import java.util.Date;
+
+@Service
+public class LoginService {
+
+    @Autowired
+    private IUserService userService;
+    @Autowired
+    private RedisUtil redisUtil;
+    @Autowired
+    private SmsService smsService;
+    @Autowired
+    private ICameraService cameraService;
+    @Autowired
+    private ICameraDetailService cameraDetailService;
+    @Value("${phone.code.cn}")
+    private String cnCode;
+    @Value("${main.url}")
+    private String mainUrl;
+
+    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));
+
+        UserVo userVo = new UserVo();
+        BeanUtils.copyProperties(user,userVo);
+        LoginVo vo = new LoginVo();
+        vo.setToken(token);
+        vo.setUser(userVo);
+        return vo;
+    }
+
+    public void logout(String token) {
+        String redisKey = String.format(RedisKey.TOKEN_V3,token);
+        redisUtil.del(redisKey);
+    }
+
+    public void checkUser(String phoneNum) {
+        if(StringUtils.isNotBlank(phoneNum)){
+            throw new BusinessException(LoginConstant.FAILURE_CODE_3001, LoginConstant.FAILURE_MSG_3001);
+        }
+        User user = userService.getByUserName(phoneNum);
+        if(user == null){
+            throw new BusinessException(LoginConstant.FAILURE_CODE_3014, LoginConstant.FAILURE_MSG_3014);
+        }
+    }
+
+    public void getMsgAuthCode(String areaNum, String phoneNum) {
+        String redisKeyTime = RedisKeyUtil.PREFIX_MSG_NOT_CODE + phoneNum;      //重发验证
+        String redisKeyMsg = RedisKeyUtil.PREFIX_MSG_AUTH_CODE + phoneNum;      //验证码code
+
+        String value = redisUtil.get(redisKeyTime);
+        if(value !=null){
+            long times = new Date().getTime() - Long.parseLong(value) ;
+            throw new BusinessException(LoginConstant.FAILURE_CODE_3033, String.valueOf(60-(times/1000)));
+        }
+        String code = String.valueOf((int)((Math.random()*9+1)*100000));
+        if ("86".equals(areaNum)){
+            String sendCode = null;
+            try {
+                sendCode = smsService.sendSms(phoneNum, "{\"code\":\"" + code + "\"}", cnCode);
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+            if("isv.BUSINESS_LIMIT_CONTROL".equals(sendCode)){
+                throw new BusinessException(LoginConstant.FAILURE_CODE_3023, LoginConstant.FAILURE_MSG_3023);
+            }
+        }else{
+            try{
+                smsService.sendSMSMessage(areaNum + phoneNum, code);
+            }catch (Exception e){
+                e.printStackTrace();
+                throw new BusinessException(LoginConstant.FAILURE_CODE_3013, LoginConstant.FAILURE_MSG_3013);
+            }
+        }
+        if(redisUtil.hasKey(redisKeyMsg)){
+            redisUtil.del(redisKeyMsg);
+        }
+        redisUtil.set(redisKeyMsg,code,300);
+        redisUtil.set(redisKeyTime,String.valueOf(new Date().getTime()),60);
+    }
+
+    public void register(RegisterParam param) {
+        if (StringUtils.isEmpty(param.getPassword()) || StringUtils.isEmpty(param.getPhoneNum()) ||
+                StringUtils.isEmpty(param.getMsgAuthCode()) || StringUtils.isEmpty(param.getCountry()) || StringUtils.isEmpty(param.getConfirmPwd())){
+            throw new BusinessException(LoginConstant.FAILURE_CODE_3001, LoginConstant.FAILURE_MSG_3001);
+        }
+        if(!param.getPassword().matches(ConstantRegex.PASSWORD_REGEX)){
+            throw new BusinessException(LoginConstant.FAILURE_CODE_3011, LoginConstant.FAILURE_MSG_3011);
+        }
+        if (!param.getConfirmPwd().equals(param.getPassword())){
+            throw new BusinessException(LoginConstant.FAILURE_CODE_3009, LoginConstant.FAILURE_MSG_3009);
+        }
+        checkSms(param.getMsgAuthCode(),param.getPhoneNum(),true);
+        User user = userService.getByUserName(param.getPhoneNum());
+        if(user != null){
+            throw new BusinessException(LoginConstant.FAILURE_CODE_3008, LoginConstant.FAILURE_MSG_3008);
+        }
+        userService.register(param);
+
+    }
+
+    public JSONObject createLoginQrCode() throws Exception {
+        String uuid = NumberUtils.getUUID();
+        String filePath = ConstantFilePath.LOGIN_QR_CODE_PATH + uuid + ".png";
+        String path =this.getClass().getResource("/static/img/logo.jpg").getPath();
+        MatrixToImageWriterUtil.createQRCode(mainUrl + "app/index.html?m="+uuid, filePath,true,path);
+        JSONObject json = new JSONObject();
+        json.put("url", filePath.replace(ConstantFilePath.BASE_PATH, ""));
+        json.put("uuid", uuid);
+        return json;
+    }
+
+    public JSONObject sendUserInfo(String uuid) {
+        if (StringUtils.isEmpty(uuid)){
+            throw new BusinessException(LoginConstant.FAILURE_CODE_3001, LoginConstant.FAILURE_MSG_3001);
+        }
+        if(!redisUtil.hasKey(uuid)){
+            throw new BusinessException(LoginConstant.FAILURE_CODE_3004, LoginConstant.FAILURE_MSG_3004);
+        }
+        String childName = redisUtil.get(uuid);
+        Camera camera = cameraService.getBySnCode(childName);
+        if(camera == null){
+            throw new BusinessException(LoginConstant.FAILURE_CODE_3004, LoginConstant.FAILURE_MSG_3004);
+        }
+        CameraDetail cameraDetail = cameraDetailService.getByCameraId(camera.getId());
+        if(cameraDetail == null){
+            throw new BusinessException(LoginConstant.FAILURE_CODE_3004, LoginConstant.FAILURE_MSG_3004);
+        }
+        UserVo userVo = new UserVo();
+        userVo.setUserName(childName);
+        userVo.setId(cameraDetail.getUserId());
+        userVo.setCameraId(camera.getId());
+        userVo.setCameraLogin(1);
+        String token = this.redisLogin(childName,JSONObject.toJSONString(userVo));
+        JSONObject obj = new JSONObject();
+        obj.put("token",token);
+        obj.put("childName",childName);
+        obj.put("to",1);
+        redisUtil.del(uuid);
+        FileUtils.deleteFile(ConstantFilePath.LOGIN_QR_CODE_PATH +uuid +".png");
+        return obj;
+    }
+
+
+
+    public void getEmailAuthCode(String email, String country) throws Exception {
+        if(StringUtils.isEmpty(email) || StringUtils.isEmpty(country)){
+            throw new BusinessException(LoginConstant.FAILURE_CODE_3001, LoginConstant.FAILURE_MSG_3001);
+        }
+        String code = String.valueOf((int)((Math.random()*9+1)*100000));
+
+        if("1".equals(country)){
+            SendMailAcceUtils.sendMail(email, SendMailAcceUtils.EN_CODE_SUBJECT, SendMailAcceUtils.EN_CODE_MSG.replace("${code}", code), null);
+        }if("2".equals(country)){
+            SendMailAcceUtils.sendMailUsa(email, SendMailAcceUtils.EN_CODE_SUBJECT_USA, SendMailAcceUtils.EN_CODE_MSG_USA.replace("${code}", code), null);
+        }else {
+            SendMailAcceUtils.sendMail(email, SendMailAcceUtils.CN_CODE_SUBJECT, SendMailAcceUtils.CN_CODE_MSG.replace("${code}", code), null);
+        }
+
+        //删除缓存
+        if (redisUtil.hasKey(RedisKeyUtil.PREFIX_MSG_AUTH_CODE + email)){
+            redisUtil.del(RedisKeyUtil.PREFIX_MSG_AUTH_CODE + email);
+        }
+        //短信验证码,5分钟有效
+        redisUtil.set(RedisKeyUtil.PREFIX_MSG_AUTH_CODE + email, code, 300);
+    }
+
+    public void changePassword(RegisterParam param) {
+        if (StringUtils.isEmpty(param.getPassword()) || StringUtils.isEmpty(param.getConfirmPwd()) ||
+                StringUtils.isEmpty(param.getMsgAuthCode())
+                || StringUtils.isEmpty(param.getPhoneNum())){
+            throw new BusinessException(LoginConstant.FAILURE_CODE_3001, LoginConstant.FAILURE_MSG_3001);
+        }
+        if (!param.getPassword().equals(param.getConfirmPwd())){
+            throw new BusinessException(LoginConstant.FAILURE_CODE_3009, LoginConstant.FAILURE_MSG_3009);
+        }
+        //对前端传的密码解密
+        String password = Base64Converter.decode(Base64Converter.subText(param.getPassword()));
+        //正则判断密码是否符合规则(8位以上并且数字英文组合)
+        if(!password.matches(ConstantRegex.PASSWORD_REGEX)){
+            throw new BusinessException(LoginConstant.FAILURE_CODE_3011, LoginConstant.FAILURE_MSG_3011);
+        }
+        User user = userService.getByUserName(param.getPhoneNum());
+        if(user == null){
+            throw new BusinessException(LoginConstant.FAILURE_CODE_3015, LoginConstant.FAILURE_MSG_3015);
+        }
+        checkSms(param.getMsgAuthCode(),param.getPhoneNum(),true);
+        String pwdMd5 = SecurityUtil.MD5(password);
+        userService.updatePassword(param.getPhoneNum(), pwdMd5);
+    }
+
+    public String redisLogin(String userName,String value){
+        String token = JwtUtil.createJWT(-1,userName,"user");
+        String redisKey = String.format(RedisKey.TOKEN_V3,token);
+        redisUtil.set(redisKey, value);
+        return token;
+    }
+
+    public void loginCheck(String token) {
+        String redisKey = String.format(RedisKey.TOKEN_V3,token);
+        if(!redisUtil.hasKey(redisKey)){
+            throw new BusinessException(LoginConstant.FAILURE_CODE_3004, LoginConstant.FAILURE_MSG_3004);
+        }
+    }
+
+    public void checkSms(String msgAuthCode, String userName,boolean del) {
+        //验证码校验
+        String codeValue = redisUtil.get(RedisKeyUtil.PREFIX_MSG_AUTH_CODE + userName);
+        if (StringUtils.isEmpty(codeValue)){
+            throw new BusinessException(LoginConstant.FAILURE_CODE_3006, LoginConstant.FAILURE_MSG_3006);
+        }
+        if (!codeValue.equals(msgAuthCode)){
+            throw new BusinessException(LoginConstant.FAILURE_CODE_3006, LoginConstant.FAILURE_MSG_3006);
+        }
+        if(del){
+            redisUtil.del(RedisKeyUtil.PREFIX_MSG_AUTH_CODE + userName);
+        }
+    }
+}

+ 85 - 0
src/main/java/com/fdkankan/user/service/impl/ReceiverInfoServiceImpl.java

@@ -0,0 +1,85 @@
+package com.fdkankan.user.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.fdkankan.common.constant.ErrorCode;
+import com.fdkankan.common.constant.TbStatus;
+import com.fdkankan.common.exception.BusinessException;
+import com.fdkankan.user.entity.ReceiverInfo;
+import com.fdkankan.user.mapper.IReceiverInfoMapper;
+import com.fdkankan.user.service.IReceiverInfoService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fdkankan.user.vo.request.ShipAddressParam;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 收货人信息表 服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2022-07-04
+ */
+@Service
+public class ReceiverInfoServiceImpl extends ServiceImpl<IReceiverInfoMapper, ReceiverInfo> implements IReceiverInfoService {
+
+
+    @Override
+    public ReceiverInfo getDefaultByUserId(Long userId){
+        QueryWrapper<ReceiverInfo> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().eq(ReceiverInfo::getUserId,userId);
+        queryWrapper.lambda().eq(ReceiverInfo::getSetDefault,1);
+        List<ReceiverInfo> list = this.list(queryWrapper);
+        if(list == null || list.size()<=0){
+            return null;
+        }
+        return list.get(0);
+    }
+
+    @Override
+    public void saveByParam(ShipAddressParam param, Long userId) {
+        ReceiverInfo defaultEntity = getDefaultByUserId(userId);
+        ReceiverInfo receiverInfoEntity = new ReceiverInfo();
+        receiverInfoEntity.setSetDefault(0);
+        if(defaultEntity == null){
+            receiverInfoEntity.setSetDefault(1);
+        }
+        receiverInfoEntity.setUserId(userId);
+        receiverInfoEntity.setShipAreaPath(param.getShipAreaPath());
+        receiverInfoEntity.setShipAddress(param.getShipAddress());
+        receiverInfoEntity.setShipName(param.getShipName());
+        receiverInfoEntity.setShipMobile(param.getShipMobile());
+        this.save(receiverInfoEntity);
+    }
+
+    @Override
+    public void updateDefaultAddress(ShipAddressParam param, Long userId) {
+        if(param.getSetDefault() != null && param.getSetDefault() == 1){
+            ReceiverInfo defaultEntity = this.getDefaultByUserId(userId);
+            if(defaultEntity != null && defaultEntity.getId().intValue() != param.getId().intValue()){
+                defaultEntity.setSetDefault(0);
+                if(!this.updateById(defaultEntity)){
+                    throw new BusinessException(ErrorCode.ERROR_MSG);
+                }
+            }
+        }
+        ReceiverInfo receiverInfoEntity = this.getById(param.getId());
+        if(param.getSetDefault() != null){
+            receiverInfoEntity.setSetDefault(param.getSetDefault());
+        }
+        receiverInfoEntity.setShipAreaPath(param.getShipAreaPath());
+        receiverInfoEntity.setShipAddress(param.getShipAddress());
+        receiverInfoEntity.setShipName(param.getShipName());
+        receiverInfoEntity.setShipMobile(param.getShipMobile());
+        this.updateById(receiverInfoEntity);
+    }
+
+    @Override
+    public List<ReceiverInfo> getListByUserId(Long userId) {
+        QueryWrapper<ReceiverInfo> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().eq(ReceiverInfo::getUserId,userId);
+        return this.list(queryWrapper);
+    }
+
+}

+ 28 - 0
src/main/java/com/fdkankan/user/service/impl/SceneCooperationServiceImpl.java

@@ -0,0 +1,28 @@
+package com.fdkankan.user.service.impl;
+
+import com.fdkankan.user.entity.SceneCooperation;
+import com.fdkankan.user.mapper.ISceneCooperationMapper;
+import com.fdkankan.user.service.ISceneCooperationService;
+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 SceneCooperationServiceImpl extends ServiceImpl<ISceneCooperationMapper, SceneCooperation> implements ISceneCooperationService {
+
+    @Override
+    public Integer getCooperationSceneNum(Long userId, List<Integer> sceneSourceList) {
+        Integer cooperationSceneProNum = this.getBaseMapper().getCooperationSceneProNum(userId, sceneSourceList);
+        Integer cooperationScenePlusNum = this.getBaseMapper().getCooperationScenePlusNum(userId, sceneSourceList);
+        return cooperationSceneProNum + cooperationScenePlusNum;
+    }
+}

+ 20 - 0
src/main/java/com/fdkankan/user/service/impl/ScenePlusExtServiceImpl.java

@@ -0,0 +1,20 @@
+package com.fdkankan.user.service.impl;
+
+import com.fdkankan.user.entity.ScenePlusExt;
+import com.fdkankan.user.mapper.IScenePlusExtMapper;
+import com.fdkankan.user.service.IScenePlusExtService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2022-07-04
+ */
+@Service
+public class ScenePlusExtServiceImpl extends ServiceImpl<IScenePlusExtMapper, ScenePlusExt> implements IScenePlusExtService {
+
+}

+ 30 - 0
src/main/java/com/fdkankan/user/service/impl/ScenePlusServiceImpl.java

@@ -0,0 +1,30 @@
+package com.fdkankan.user.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.fdkankan.user.entity.ScenePlus;
+import com.fdkankan.user.mapper.IScenePlusMapper;
+import com.fdkankan.user.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 Integer getCountByUserId(Long userId, List<Integer> sceneSourceList) {
+        LambdaQueryWrapper<ScenePlus> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(ScenePlus::getUserId, userId);
+        wrapper.eq(ScenePlus::getSceneSource, sceneSourceList);
+        return Math.toIntExact(this.count(wrapper));
+    }
+}

+ 72 - 0
src/main/java/com/fdkankan/user/service/impl/SceneProServiceImpl.java

@@ -0,0 +1,72 @@
+package com.fdkankan.user.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.fdkankan.common.util.JwtUtil;
+import com.fdkankan.user.entity.ScenePlus;
+import com.fdkankan.user.entity.ScenePro;
+import com.fdkankan.user.entity.User;
+import com.fdkankan.user.mapper.ISceneProMapper;
+import com.fdkankan.user.service.*;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fdkankan.user.vo.response.SceneNumVo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * <p>
+ * pro场景表 服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2022-07-04
+ */
+@Service
+public class SceneProServiceImpl extends ServiceImpl<ISceneProMapper, ScenePro> implements ISceneProService {
+
+    @Autowired
+    IUserService userService;
+    @Autowired
+    ISceneCooperationService sceneCooperationService;
+    @Autowired
+    IScenePlusService scenePlusService;
+    @Autowired
+    ISceneService sceneService;
+    @Autowired
+    FdkkLaserService fdkkLaserService;
+
+    @Override
+    public HashMap<String, SceneNumVo> findSceneNumber(String token) {
+        User user = userService.getByUserName(JwtUtil.getUsername(token));
+        SceneNumVo sceneNumVoKk = getSceneNumVoByType(Arrays.asList(1,2,12,13,14), user.getId());
+        Integer oldNum = sceneService.getCountByUserId(user.getId());
+        sceneNumVoKk.setSceneNum( oldNum + sceneNumVoKk.getSceneNum());
+        sceneNumVoKk.setTotalNum(oldNum + sceneNumVoKk.getTotalNum());
+
+        SceneNumVo sceneNumVoKj = getSceneNumVoByType(Collections.singletonList(3), user.getId());
+        SceneNumVo sceneNumVoSS = fdkkLaserService.getLaserSceneNumByUser(token);
+        HashMap<String, SceneNumVo> hashMap = new HashMap<>();
+        hashMap.put("kk",sceneNumVoKk);
+        hashMap.put("kJ",sceneNumVoKj);
+        hashMap.put("SS",sceneNumVoSS);
+        return hashMap;
+    }
+
+    private SceneNumVo getSceneNumVoByType(List<Integer> sceneSourceList, Long userId){
+        SceneNumVo sceneNumVo = new SceneNumVo();
+        LambdaQueryWrapper<ScenePro> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(ScenePro::getUserId, userId);
+        queryWrapper.eq(ScenePro::getSceneSource, sceneSourceList);
+        queryWrapper.eq(ScenePro::getIsUpgrade, 0);
+        Integer sceneNum = Math.toIntExact(this.count(queryWrapper));
+        Integer count = scenePlusService.getCountByUserId(userId,sceneSourceList);
+        sceneNumVo.setCooperationSceneNum(sceneCooperationService.getCooperationSceneNum(userId,sceneSourceList));
+        sceneNumVo.setSceneNum(sceneNum + count);
+        sceneNumVo.setTotalNum(sceneNumVo.getSceneNum() + sceneNumVo.getCooperationSceneNum());
+        return sceneNumVo;
+    }
+}

+ 27 - 0
src/main/java/com/fdkankan/user/service/impl/SceneServiceImpl.java

@@ -0,0 +1,27 @@
+package com.fdkankan.user.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.fdkankan.user.entity.Scene;
+import com.fdkankan.user.mapper.ISceneMapper;
+import com.fdkankan.user.service.ISceneService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <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));
+    }
+}

+ 112 - 0
src/main/java/com/fdkankan/user/service/impl/UserIncrementServiceImpl.java

@@ -0,0 +1,112 @@
+package com.fdkankan.user.service.impl;
+
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fdkankan.common.constant.TbStatus;
+import com.fdkankan.common.util.DateUtil;
+import com.fdkankan.user.entity.Camera;
+import com.fdkankan.user.entity.User;
+import com.fdkankan.user.entity.UserIncrement;
+import com.fdkankan.user.mapper.IUserIncrementMapper;
+import com.fdkankan.user.service.ICameraService;
+import com.fdkankan.user.service.IUserIncrementService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fdkankan.user.service.IUserService;
+import com.fdkankan.user.vo.request.IncrementParam;
+import com.fdkankan.user.vo.response.UserIncrementVo;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.ObjectUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ * 用户增值权益表 服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2022-07-04
+ */
+@Service
+public class UserIncrementServiceImpl extends ServiceImpl<IUserIncrementMapper, UserIncrement> implements IUserIncrementService {
+
+    @Autowired
+    ICameraService cameraService;
+    @Autowired
+    IUserService userService;
+
+    @Override
+    public Long getCountByUserId(Long userId, int type) {
+        LambdaQueryWrapper<UserIncrement> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(UserIncrement::getUserId,userId);
+        wrapper.eq(UserIncrement::getIsExpired,0);
+        if(type == 0){
+            wrapper.isNull(UserIncrement::getCameraId);
+        }else if(type == 1){
+            wrapper.isNotNull(UserIncrement::getCameraId);
+        }
+        return this.count(wrapper);
+    }
+
+    @Override
+    public Page pageList(IncrementParam param) {
+        Page<UserIncrementVo> pageVo = new Page<>(param.getPageNum(), param.getPageSize());
+        User user = userService.getByUserName(param.getUserName());
+        List<Long> cameraIdList = null;
+        if(StrUtil.isNotEmpty(param.getSnCode()) && StrUtil.isNotEmpty(param.getSnCode().trim())){
+            List<Camera> cameraEntityList = cameraService.getCameraLikeSnCode(param.getSnCode().trim());
+            if(cameraEntityList == null || cameraEntityList.size()<=0){
+                return pageVo;
+            }
+            cameraIdList = cameraEntityList.stream().map(Camera::getId)
+                    .collect(Collectors.toList());
+        }
+        Page<UserIncrement> page = new Page<>(param.getPageNum(), param.getPageSize());
+        QueryWrapper<UserIncrement> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().eq(UserIncrement::getUserId,user.getId());
+        if(cameraIdList!=null ){
+            queryWrapper.lambda().in(UserIncrement::getCameraId,cameraIdList);
+        }
+        Page<UserIncrement> pageEntity = this.page(page, queryWrapper);
+
+        List<UserIncrementVo> responseList = convert(pageEntity.getRecords());
+        pageVo.setTotal(pageEntity.getTotal());
+        pageVo.setRecords(responseList);
+        return pageVo;
+    }
+
+
+    public List<UserIncrementVo> convert(List<UserIncrement> list) {
+        List<UserIncrementVo> result = new ArrayList<>();
+        if(list == null){
+            return result;
+        }
+        UserIncrementVo responseUserIncrement = new UserIncrementVo();
+        for (UserIncrement userIncrementEntity : list) {
+            responseUserIncrement = new UserIncrementVo();
+            BeanUtils.copyProperties(userIncrementEntity, responseUserIncrement);
+            if(!ObjectUtils.isEmpty(responseUserIncrement.getIncrementStartTime())){
+                responseUserIncrement.setIncrementStartStr(DateUtil.date2String(responseUserIncrement.getIncrementStartTime(), DateUtil.YYYY_MM_DD_DATE_FORMAT));
+            }
+            if(!ObjectUtils.isEmpty(responseUserIncrement.getIncrementEndTime())){
+                responseUserIncrement.setIncrementEndStr(DateUtil.date2String(responseUserIncrement.getIncrementEndTime(), DateUtil.YYYY_MM_DD_DATE_FORMAT));
+            }
+            if(!ObjectUtils.isEmpty(responseUserIncrement.getCreateTime())){
+                responseUserIncrement.setCreateStr(DateUtil.date2String(responseUserIncrement.getCreateTime(), DateUtil.YYYY_MM_DD_DATE_FORMAT));
+            }
+            if(responseUserIncrement.getCameraId() != null){
+                Camera cameraEntity = cameraService.getById(responseUserIncrement.getCameraId());
+                responseUserIncrement.setSnCode(cameraEntity != null ? cameraEntity.getSnCode() : null);
+            }
+            responseUserIncrement.setIsExpire(userIncrementEntity.getIsExpired() != 0);
+            result.add(responseUserIncrement);
+        }
+        return result;
+    }
+}

+ 235 - 0
src/main/java/com/fdkankan/user/service/impl/UserServiceImpl.java

@@ -0,0 +1,235 @@
+package com.fdkankan.user.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.user.constant.LoginConstant;
+import com.fdkankan.user.entity.ReceiverInfo;
+import com.fdkankan.user.entity.User;
+import com.fdkankan.user.mapper.IUserMapper;
+import com.fdkankan.user.service.ICameraDetailService;
+import com.fdkankan.user.service.IReceiverInfoService;
+import com.fdkankan.user.service.IUserIncrementService;
+import com.fdkankan.user.service.IUserService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fdkankan.user.vo.request.RegisterParam;
+import com.fdkankan.user.vo.request.ShipAddressParam;
+import com.fdkankan.user.vo.request.UserParam;
+import com.fdkankan.user.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.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;
+    @Autowired
+    IUserIncrementService userIncrementService;
+    @Autowired
+    IReceiverInfoService receiverInfoService;
+
+    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 void register(RegisterParam param) {
+        User userEntity = new User();
+        userEntity.setPassword(SecurityUtil.MD5(param.getPassword()));
+        userEntity.setEmail(param.getEmail());
+        userEntity.setUserName(param.getPhoneNum());
+        userEntity.setNickName(param.getPhoneNum());
+        userEntity.setHead(ConstantUrl.DEFAULT_USER_HEAD);
+        userEntity.setCountry(param.getCountry());
+        userEntity.setStatus(1);
+        userEntity.setIsNotice(1);
+        this.save(userEntity);
+    }
+
+    @Override
+    public void updatePassword(String phoneNum, String password) {
+        LambdaUpdateWrapper<User> wrapper = new LambdaUpdateWrapper<>();
+        wrapper.set(User::getPassword,password)
+                .eq(User::getUserName,phoneNum);
+        this.update(wrapper);
+    }
+
+    @Override
+    public UserVo getUserInfo(String userName) {
+        User user = this.getByUserName(userName);
+        UserVo userVo = new UserVo();
+        BeanUtils.copyProperties(user,userVo);
+        Long cameraCount = cameraDetailService.getCountByUserId(user.getId());
+        Long incrementNum = userIncrementService.getCountByUserId(user.getId(),0);
+        Long incrementBindNum = userIncrementService.getCountByUserId(user.getId(),1);
+        userVo.setCameraCount(cameraCount);
+        userVo.setIncrementNum(incrementNum);
+        userVo.setIncrementBindNum(incrementBindNum);
+        return userVo;
+    }
+
+    @Override
+    public String uploadHead(String imgdata, String userName) throws Exception {
+        if (StringUtils.isEmpty(imgdata)){
+            throw new BusinessException(LoginConstant.FAILURE_CODE_3001, LoginConstant.FAILURE_MSG_3001);
+        }
+        User dbUser = this.getByUserName(userName);
+        StringBuilder sb = new StringBuilder().append("head")
+                .append(File.separator).append(dbUser.getUserName()).append(File.separator)
+                .append("head").append("_").append(new Date().getTime()).append(".png");
+        StringBuilder qiniuPath = new StringBuilder().append("head")
+                .append("/").append(dbUser.getUserName()).append("/")
+                .append("head").append("_").append(new Date().getTime()).append(".png");
+        FileUtils.uploadImg(ConstantFilePath.USER_IMAGES_PATH + sb.toString(), imgdata);
+        dbUser.setHead(ConstantUrl.PREFIX_QINIU + qiniuPath.toString()+"?m="+System.currentTimeMillis());
+        this.updateById(dbUser);
+        //上传头像到七牛云
+        try {
+            QiniuUpload.delete(qiniuPath.toString());
+        } catch (Exception e) { }
+        if (QiniuUpload.setFileToBucket(qiniuPath.toString(), ConstantFilePath.USER_IMAGES_PATH + sb.toString())) {
+            FileUtils.deleteFile(ConstantFilePath.USER_IMAGES_PATH + sb.toString());
+        }
+        QiniuUpload.refresh(dbUser.getHead());
+        return dbUser.getHead();
+    }
+
+    @Override
+    public void insertAddress(ShipAddressParam param, String userName) {
+        if (StringUtils.isEmpty(param.getShipAddress()) || StringUtils.isEmpty(param.getShipAreaPath())
+                || StringUtils.isEmpty(param.getProvince()) || StringUtils.isEmpty(param.getCity())){
+            throw new BusinessException(LoginConstant.FAILURE_CODE_3001, LoginConstant.FAILURE_MSG_3001);
+        }
+        User user = getByUserName(userName);
+        receiverInfoService.saveByParam(param,user.getId());
+    }
+
+    @Override
+    public void updateAddress(ShipAddressParam param, String userName) {
+        if (param.getId() == null || StringUtils.isEmpty(param.getShipAddress()) || StringUtils.isEmpty(param.getShipAreaPath())
+                || StringUtils.isEmpty(param.getProvince()) || StringUtils.isEmpty(param.getCity())){
+            throw new BusinessException(LoginConstant.FAILURE_CODE_3001, LoginConstant.FAILURE_MSG_3001);
+        }
+        User user = getByUserName(userName);
+        receiverInfoService.updateDefaultAddress(param,user.getId());
+    }
+
+    @Override
+    public void deleteAddress(Long id) {
+        if (id == null ){
+            throw new BusinessException(LoginConstant.FAILURE_CODE_3001, LoginConstant.FAILURE_MSG_3001);
+        }
+        receiverInfoService.removeById(id);
+    }
+
+    @Override
+    public void updateEmail(String email, String userName) {
+        if (StringUtils.isEmpty(email)){
+            throw new BusinessException(LoginConstant.FAILURE_CODE_3001, LoginConstant.FAILURE_MSG_3001);
+        }
+        if(!email.matches(ConstantRegex.EMAIL_REGEX)){
+            throw new BusinessException(LoginConstant.FAILURE_CODE_3019, LoginConstant.FAILURE_MSG_3019);
+        }
+        User user = this.getByEmail(email);
+        if(user!=null && !user.getUserName().equals(userName)){
+            throw new BusinessException(LoginConstant.FAILURE_CODE_3020 , LoginConstant.FAILURE_MSG_3020);
+        }
+        LambdaUpdateWrapper<User> wrapper = new LambdaUpdateWrapper<>();
+        wrapper.eq(User::getUserName,userName);
+        wrapper.set(User::getEmail,email);
+        this.update(wrapper);
+    }
+
+    @Override
+    public ReceiverInfo getReceiverInfo(String userName) {
+        User dbUser = getByUserName(userName);
+        return receiverInfoService.getDefaultByUserId(dbUser.getId());
+    }
+
+    @Override
+    public List<ReceiverInfo> getReceiverList(String userName) {
+        User dbUser = getByUserName(userName);
+        return receiverInfoService.getListByUserId(dbUser.getId());
+    }
+
+    @Override
+    public void updateNickName(String nickName, String userName) {
+        if (StringUtils.isEmpty(nickName)){
+            throw new BusinessException(LoginConstant.FAILURE_CODE_3001, LoginConstant.FAILURE_MSG_3001);
+        }
+        //检验昵称敏感词
+        Set<String> set = Variable.sensitiveWord.getSensitiveWord(nickName, 1);
+        if (set != null && set.size() > 0){
+            throw new BusinessException(LoginConstant.FAILURE_CODE_3012, LoginConstant.FAILURE_MSG_3012);
+        }
+        LambdaUpdateWrapper<User> wrapper = new LambdaUpdateWrapper<>();
+        wrapper.eq(User::getUserName,userName);
+        wrapper.set(User::getNickName,nickName);
+        this.update(wrapper);
+    }
+
+    @Override
+    public void updateUserDetail(UserParam param, String userName) {
+        if (param.getNickName() != null){
+            //检验昵称敏感词
+            Set<String> set = Variable.sensitiveWord.getSensitiveWord(param.getNickName(), 1);
+            if (set != null && set.size() > 0){
+                throw new BusinessException(LoginConstant.FAILURE_CODE_3012, LoginConstant.FAILURE_MSG_3012);
+            }
+        }
+
+        if(param.getEmail() != null && !param.getEmail().matches(ConstantRegex.EMAIL_REGEX)){
+            throw new BusinessException(LoginConstant.FAILURE_CODE_3019, LoginConstant.FAILURE_MSG_3019);
+        }
+        User emailUser = getByEmail(param.getEmail());
+        if(emailUser != null && !emailUser.getUserName().equals(userName)){
+            throw new BusinessException(LoginConstant.FAILURE_CODE_3020 , LoginConstant.FAILURE_MSG_3020);
+        }
+        LambdaUpdateWrapper<User> wrapper = new LambdaUpdateWrapper<>();
+        wrapper.eq(User::getUserName,userName);
+        wrapper.set(User::getNickName,param.getNickName());
+        wrapper.set(User::getEmail,param.getEmail());
+        wrapper.set(User::getIsNotice,param.getIsNotice());
+        this.update(wrapper);
+    }
+
+}

+ 10 - 0
src/main/java/com/fdkankan/user/vo/request/IncrementParam.java

@@ -0,0 +1,10 @@
+package com.fdkankan.user.vo.request;
+
+import com.fdkankan.common.request.RequestBase;
+import lombok.Data;
+
+@Data
+public class IncrementParam extends RequestBase {
+    private String snCode;
+    private String userName;
+}

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

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

+ 13 - 0
src/main/java/com/fdkankan/user/vo/request/RegisterParam.java

@@ -0,0 +1,13 @@
+package com.fdkankan.user.vo.request;
+
+import lombok.Data;
+
+@Data
+public class RegisterParam {
+    private String phoneNum;
+    private String password;
+    private String msgAuthCode;
+    private String country;
+    private String confirmPwd;
+    private String email;
+}

+ 15 - 0
src/main/java/com/fdkankan/user/vo/request/ShipAddressParam.java

@@ -0,0 +1,15 @@
+package com.fdkankan.user.vo.request;
+
+import lombok.Data;
+
+@Data
+public class ShipAddressParam {
+    private Long id;
+    private String shipAddress;         //收货地址-详细地址
+    private String shipAreaPath;        //收货地址-省-市-区
+    private String province;            //所在地区-省
+    private String city;                //所在地区-市
+    private String shipName;            //收货人
+    private String shipMobile;          //收货人手机
+    private Integer setDefault;         //1表示默认地址,0表示不是默认地址
+}

+ 10 - 0
src/main/java/com/fdkankan/user/vo/request/UserParam.java

@@ -0,0 +1,10 @@
+package com.fdkankan.user.vo.request;
+
+import lombok.Data;
+
+@Data
+public class UserParam {
+    private String nickName;
+    private String email;
+    private Integer isNotice;
+}

+ 51 - 0
src/main/java/com/fdkankan/user/vo/response/CameraSpaceVo.java

@@ -0,0 +1,51 @@
+package com.fdkankan.user.vo.response;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.fdkankan.common.util.DateUtil;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+public class CameraSpaceVo implements Serializable, Comparable<CameraSpaceVo> {
+
+    private Long id;
+
+    private String childName;
+
+    @JSONField(format = "yyyy-MM-dd HH:mm:ss")
+    private Date spaceEndTime;
+
+    private int deadlineDays;
+
+    private String content;
+
+    private double usedSpace;
+
+    private String usedSpaceStr;
+
+    private double totalSpace;
+
+    private String totalSpaceStr;
+
+    private String spaceEndStr;
+
+    private Long space;
+
+    private String spaceStr;
+
+    private String snCode;
+
+    @Override
+    public int compareTo(CameraSpaceVo o) {
+        if (o.getSpaceEndTime() != null) {
+            if (DateUtil.after(this.getSpaceEndTime(), o.getSpaceEndTime())) {
+                return 1;
+            } else if (DateUtil.after(o.getSpaceEndTime(), this.getSpaceEndTime())) {
+                return -1;
+            }
+        }
+        return 0;
+    }
+}

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

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

+ 13 - 0
src/main/java/com/fdkankan/user/vo/response/SceneNumVo.java

@@ -0,0 +1,13 @@
+package com.fdkankan.user.vo.response;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class SceneNumVo implements Serializable {
+    private Integer cooperationSceneNum = 0;    //协作场景数量
+    private Integer sceneNum = 0;               //场景数量
+    private Integer totalNum = 0;
+   // private Integer type;                   //场景类型 0看看,1看见,2深时
+}

+ 48 - 0
src/main/java/com/fdkankan/user/vo/response/UserIncrementVo.java

@@ -0,0 +1,48 @@
+package com.fdkankan.user.vo.response;
+
+import com.fdkankan.common.request.RequestBase;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class UserIncrementVo  {
+
+    private String key;
+
+    private Long id;
+
+    private Long userId;
+
+    private Long cameraId;
+
+    private String orderSn;
+
+    /**
+     * 生效时间
+     */
+    private Date incrementStartTime;
+    /**
+     * 结束时间
+     */
+    private Date incrementEndTime;
+
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+
+    private String snCode;
+
+    private String incrementStartStr;
+
+    private String incrementEndStr;
+
+    private String createStr;
+
+    private Boolean isExpire;
+
+    private String keyWord;
+
+    private Integer isExpired;
+}

+ 21 - 0
src/main/java/com/fdkankan/user/vo/response/UserVo.java

@@ -0,0 +1,21 @@
+package com.fdkankan.user.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 Integer availableSpace;             //可用空间
+    private Long cameraCount;                //已绑相机
+    private Integer downloadNum;                //已下载场景总数
+    private Integer downloadNumTotal;           //总的下载场景总数
+    private Long incrementBindNum;           //已绑定的会员权益数量
+    private Long incrementNum;               //会员权益数量
+
+    private Long cameraId;
+    private Integer cameraLogin;
+}

+ 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-user
+  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/user/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.user.mapper.ICameraDetailMapper">
+
+</mapper>

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

+ 11 - 0
src/main/resources/mapper/user/CameraSpaceMapper.xml

@@ -0,0 +1,11 @@
+<?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.user.mapper.ICameraSpaceMapper">
+
+    <select id="getVoListByCameraId" resultType="com.fdkankan.user.vo.response.CameraSpaceVo">
+        select s.id, s.space_end_time, c.child_name, s.space from t_camera_space s
+            LEFT JOIN t_camera c on s.camera_id = c.id
+            where s.rec_status = 'A' and s.space_type = 2 and s.camera_id = #{cameraId} and TIMESTAMPDIFF(MINUTE, NOW(), s.space_end_time) &gt; -1
+            ORDER BY s.space_end_time
+    </select>
+</mapper>

+ 5 - 0
src/main/resources/mapper/user/ReceiverInfoMapper.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.user.mapper.IReceiverInfoMapper">
+
+</mapper>

+ 24 - 0
src/main/resources/mapper/user/SceneCooperationMapper.xml

@@ -0,0 +1,24 @@
+<?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.user.mapper.ISceneCooperationMapper">
+
+
+    <select id="getCooperationSceneProNum" resultType="java.lang.Integer">
+        SELECT count(0) FROM t_scene_cooperation a
+        LEFT JOIN t_scene_pro b ON a.scene_num = b.num
+        WHERE a.rec_status = 'A' AND b.rec_status = 'A' AND b.is_upgrade = 0
+        AND a.user_id = #{userId} AND b. AND b.scene_source in
+        <foreach collection="sceneSource" item="index" open="(" close=")" separator=",">
+            #{index}
+        </foreach>
+    </select>
+    <select id="getCooperationScenePlusNum" resultType="java.lang.Integer">
+        SELECT count(0) FROM t_scene_cooperation a
+        LEFT JOIN t_scene_plus b ON a.scene_num = b.num
+        WHERE a.rec_status = 'A' AND b.tb_status = 0
+        AND a.user_id = #{userId}  AND b.scene_source in
+        <foreach collection="sceneSource" item="index" open="(" close=")" separator=",">
+            #{index}
+        </foreach>
+    </select>
+</mapper>

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

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

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

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

+ 5 - 0
src/main/resources/mapper/user/UserIncrementMapper.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.user.mapper.IUserIncrementMapper">
+
+</mapper>

+ 5 - 0
src/main/resources/mapper/user/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.user.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


File diff suppressed because it is too large
+ 1125 - 0
src/main/resources/static/txt/SensitiveWord.txt