dengsixing 1 vuosi sitten
commit
01cf125884
78 muutettua tiedostoa jossa 3202 lisäystä ja 0 poistoa
  1. 33 0
      .gitignore
  2. 112 0
      pom.xml
  3. 16 0
      src/main/java/com/fdkankan/jp/xspace/Application.java
  4. 50 0
      src/main/java/com/fdkankan/jp/xspace/common/PageInfo.java
  5. 23 0
      src/main/java/com/fdkankan/jp/xspace/common/RequestBase.java
  6. 108 0
      src/main/java/com/fdkankan/jp/xspace/common/Result.java
  7. 71 0
      src/main/java/com/fdkankan/jp/xspace/common/ResultCode.java
  8. 10 0
      src/main/java/com/fdkankan/jp/xspace/common/annotation/CheckPlatformAdminPermit.java
  9. 27 0
      src/main/java/com/fdkankan/jp/xspace/common/exception/BusinessException.java
  10. 49 0
      src/main/java/com/fdkankan/jp/xspace/common/exception/GlobalExceptionHandler.java
  11. 27 0
      src/main/java/com/fdkankan/jp/xspace/common/exception/PackException.java
  12. 7 0
      src/main/java/com/fdkankan/jp/xspace/common/rabbitmq/RabbitmqConstant.java
  13. 7 0
      src/main/java/com/fdkankan/jp/xspace/common/redis/RedisConstant.java
  14. 34 0
      src/main/java/com/fdkankan/jp/xspace/config/WebAppConfig.java
  15. 81 0
      src/main/java/com/fdkankan/jp/xspace/controller/BaseController.java
  16. 21 0
      src/main/java/com/fdkankan/jp/xspace/controller/RoleController.java
  17. 28 0
      src/main/java/com/fdkankan/jp/xspace/controller/SceneController.java
  18. 21 0
      src/main/java/com/fdkankan/jp/xspace/controller/ScenePlusController.java
  19. 21 0
      src/main/java/com/fdkankan/jp/xspace/controller/ScenePlusExtController.java
  20. 54 0
      src/main/java/com/fdkankan/jp/xspace/controller/SceneXspaceController.java
  21. 88 0
      src/main/java/com/fdkankan/jp/xspace/controller/UserController.java
  22. 21 0
      src/main/java/com/fdkankan/jp/xspace/controller/UserRoleController.java
  23. 48 0
      src/main/java/com/fdkankan/jp/xspace/controller/XspaceUserController.java
  24. 10 0
      src/main/java/com/fdkankan/jp/xspace/dto/LoginDTO.java
  25. 12 0
      src/main/java/com/fdkankan/jp/xspace/dto/PageXspaceUserDTO.java
  26. 20 0
      src/main/java/com/fdkankan/jp/xspace/dto/SceneDTO.java
  27. 22 0
      src/main/java/com/fdkankan/jp/xspace/dto/XspacePageDTO.java
  28. 16 0
      src/main/java/com/fdkankan/jp/xspace/dto/XspaceUserDTO.java
  29. 72 0
      src/main/java/com/fdkankan/jp/xspace/entity/Role.java
  30. 126 0
      src/main/java/com/fdkankan/jp/xspace/entity/ScenePlus.java
  31. 198 0
      src/main/java/com/fdkankan/jp/xspace/entity/ScenePlusExt.java
  32. 78 0
      src/main/java/com/fdkankan/jp/xspace/entity/SceneXspace.java
  33. 152 0
      src/main/java/com/fdkankan/jp/xspace/entity/User.java
  34. 63 0
      src/main/java/com/fdkankan/jp/xspace/entity/UserRole.java
  35. 54 0
      src/main/java/com/fdkankan/jp/xspace/entity/XspaceUser.java
  36. 98 0
      src/main/java/com/fdkankan/jp/xspace/generate/AutoGenerate.java
  37. 63 0
      src/main/java/com/fdkankan/jp/xspace/interceptor/CheckPlatAdminPermitAspect.java
  38. 64 0
      src/main/java/com/fdkankan/jp/xspace/interceptor/UcenterInterceptor.java
  39. 106 0
      src/main/java/com/fdkankan/jp/xspace/listener/RabbitMqListener.java
  40. 18 0
      src/main/java/com/fdkankan/jp/xspace/mapper/IRoleMapper.java
  41. 18 0
      src/main/java/com/fdkankan/jp/xspace/mapper/IScenePlusExtMapper.java
  42. 23 0
      src/main/java/com/fdkankan/jp/xspace/mapper/IScenePlusMapper.java
  43. 23 0
      src/main/java/com/fdkankan/jp/xspace/mapper/ISceneXspaceMapper.java
  44. 18 0
      src/main/java/com/fdkankan/jp/xspace/mapper/IUserMapper.java
  45. 18 0
      src/main/java/com/fdkankan/jp/xspace/mapper/IUserRoleMapper.java
  46. 22 0
      src/main/java/com/fdkankan/jp/xspace/mapper/IXspaceUserMapper.java
  47. 16 0
      src/main/java/com/fdkankan/jp/xspace/service/IRoleService.java
  48. 16 0
      src/main/java/com/fdkankan/jp/xspace/service/IScenePlusExtService.java
  49. 23 0
      src/main/java/com/fdkankan/jp/xspace/service/IScenePlusService.java
  50. 28 0
      src/main/java/com/fdkankan/jp/xspace/service/ISceneXspaceService.java
  51. 24 0
      src/main/java/com/fdkankan/jp/xspace/service/IUserRoleService.java
  52. 23 0
      src/main/java/com/fdkankan/jp/xspace/service/IUserService.java
  53. 26 0
      src/main/java/com/fdkankan/jp/xspace/service/IXspaceUserService.java
  54. 20 0
      src/main/java/com/fdkankan/jp/xspace/service/impl/RoleServiceImpl.java
  55. 20 0
      src/main/java/com/fdkankan/jp/xspace/service/impl/ScenePlusExtServiceImpl.java
  56. 39 0
      src/main/java/com/fdkankan/jp/xspace/service/impl/ScenePlusServiceImpl.java
  57. 131 0
      src/main/java/com/fdkankan/jp/xspace/service/impl/SceneXspaceServiceImpl.java
  58. 39 0
      src/main/java/com/fdkankan/jp/xspace/service/impl/UserRoleServiceImpl.java
  59. 110 0
      src/main/java/com/fdkankan/jp/xspace/service/impl/UserServiceImpl.java
  60. 75 0
      src/main/java/com/fdkankan/jp/xspace/service/impl/XspaceUserServiceImpl.java
  61. 17 0
      src/main/java/com/fdkankan/jp/xspace/util/PasswordUtil.java
  62. 26 0
      src/main/java/com/fdkankan/jp/xspace/util/UniqueStringGenerator.java
  63. 9 0
      src/main/java/com/fdkankan/jp/xspace/vo/LoginVO.java
  64. 17 0
      src/main/java/com/fdkankan/jp/xspace/vo/SceneVO.java
  65. 44 0
      src/main/java/com/fdkankan/jp/xspace/vo/UserVO.java
  66. 19 0
      src/main/java/com/fdkankan/jp/xspace/vo/XspaceUserVO.java
  67. 22 0
      src/main/java/com/fdkankan/jp/xspace/vo/XspaceVO.java
  68. 27 0
      src/main/resources/bootstrap-dev.yml
  69. 27 0
      src/main/resources/bootstrap-prod.yml
  70. 27 0
      src/main/resources/bootstrap-test.yml
  71. 10 0
      src/main/resources/bootstrap.yml
  72. 5 0
      src/main/resources/mapper/RoleMapper.xml
  73. 5 0
      src/main/resources/mapper/ScenePlusExtMapper.xml
  74. 33 0
      src/main/resources/mapper/ScenePlusMapper.xml
  75. 34 0
      src/main/resources/mapper/SceneXspaceMapper.xml
  76. 5 0
      src/main/resources/mapper/UserRoleMapper.xml
  77. 21 0
      src/main/resources/mapper/XspaceUserMapper.xml
  78. 13 0
      src/test/java/com/fdkankan/jp/xspace/ApplicationTests.java

+ 33 - 0
.gitignore

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

+ 112 - 0
pom.xml

@@ -0,0 +1,112 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<groupId>org.springframework.boot</groupId>
+		<artifactId>spring-boot-starter-parent</artifactId>
+		<version>2.3.12.RELEASE</version>
+		<relativePath/> <!-- lookup parent from repository -->
+	</parent>
+	<groupId>com.fdkankan</groupId>
+	<artifactId>4dkankan-project-jp-xspace</artifactId>
+	<version>0.0.1-SNAPSHOT</version>
+	<name>4dkankan-project-jp-xspace</name>
+	<description>xspace</description>
+	<dependencies>
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-starter-web</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-starter</artifactId>
+		</dependency>
+
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-starter-test</artifactId>
+			<scope>test</scope>
+		</dependency>
+
+		<dependency>
+			<groupId>com.fdkankan</groupId>
+			<artifactId>4dkankan-utils-fyun-oss</artifactId>
+			<version>3.0.0-SNAPSHOT</version>
+		</dependency>
+
+		<dependency>
+			<groupId>com.fdkankan</groupId>
+			<artifactId>4dkankan-utils-rabbitmq</artifactId>
+			<version>3.0.0-SNAPSHOT</version>
+		</dependency>
+
+		<dependency>
+			<groupId>com.fdkankan</groupId>
+			<artifactId>4dkankan-utils-db</artifactId>
+			<version>3.0.0-SNAPSHOT</version>
+		</dependency>
+
+		<dependency>
+			<groupId>com.fdkankan</groupId>
+			<artifactId>4dkankan-utils-redis</artifactId>
+			<version>3.0.0-SNAPSHOT</version>
+		</dependency>
+
+		<dependency>
+			<groupId>com.fdkankan</groupId>
+			<artifactId>4dkankan-utils-dingtalk</artifactId>
+			<version>3.0.0-SNAPSHOT</version>
+		</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>com.github.ulisesbocchio</groupId>
+			<artifactId>jasypt-spring-boot-starter</artifactId>
+			<version>3.0.5</version>
+		</dependency>
+
+		<dependency>
+			<groupId>org.projectlombok</groupId>
+			<artifactId>lombok</artifactId>
+		</dependency>
+
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-starter-aop</artifactId>
+		</dependency>
+
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-starter-validation</artifactId>
+		</dependency>
+
+	</dependencies>
+
+	<build>
+		<plugins>
+			<plugin>
+				<groupId>org.springframework.boot</groupId>
+				<artifactId>spring-boot-maven-plugin</artifactId>
+			</plugin>
+		</plugins>
+	</build>
+
+</project>

+ 16 - 0
src/main/java/com/fdkankan/jp/xspace/Application.java

@@ -0,0 +1,16 @@
+package com.fdkankan.jp.xspace;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.ComponentScans;
+
+@SpringBootApplication
+@ComponentScan(value = "com.fdkankan.**")
+public class Application {
+
+	public static void main(String[] args) {
+		SpringApplication.run(Application.class, args);
+	}
+
+}

+ 50 - 0
src/main/java/com/fdkankan/jp/xspace/common/PageInfo.java

@@ -0,0 +1,50 @@
+package com.fdkankan.jp.xspace.common;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class PageInfo<T> {
+
+    private long pageNum;
+
+    private long pageSize;
+
+    private long total;
+
+    private T list;
+
+    public static PageInfo PageInfo(Page page){
+        return PageInfo.builder()
+            .pageNum(page.getCurrent())
+            .pageSize(page.getSize())
+            .total(page.getTotal())
+            .list(page.getRecords())
+            .build();
+    }
+    public static PageInfo PageInfo(Long currentPage, Long pageSize, Long total, List<?> list){
+        return PageInfo.builder()
+            .pageNum(currentPage)
+            .pageSize(pageSize)
+            .total(total)
+            .list(list)
+            .build();
+    }
+
+
+    public static PageInfo PageInfoEmpty(Integer pageNum,Integer pageSize) {
+        Page<Object> voPage = new Page<>(pageNum,pageSize);
+        voPage.setRecords(new ArrayList<>());
+        voPage.setTotal(0);
+        return PageInfo.PageInfo(voPage);
+    }
+}

+ 23 - 0
src/main/java/com/fdkankan/jp/xspace/common/RequestBase.java

@@ -0,0 +1,23 @@
+package com.fdkankan.jp.xspace.common;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class RequestBase implements Serializable {
+
+    private int pageNum = 1;
+
+    private int pageSize = 10;
+
+    private int start;
+
+    private String orderBy = "id";
+
+    /**
+     * DESC-降序
+     * ASC-升序
+     */
+    private String sortBy = "DESC";
+}

+ 108 - 0
src/main/java/com/fdkankan/jp/xspace/common/Result.java

@@ -0,0 +1,108 @@
+package com.fdkankan.jp.xspace.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);
+    }
+    /**
+     * 处理失败
+     *
+     */
+    public static Result failure(ResultCode resultCode) {
+        return failure(resultCode.code(), resultCode.message());
+    }
+
+    @Override
+    public String toString() {
+        return "JsonResult [code=" + code + ", msg=" + msg + ", data="
+                + data + "]";
+    }
+}

+ 71 - 0
src/main/java/com/fdkankan/jp/xspace/common/ResultCode.java

@@ -0,0 +1,71 @@
+package com.fdkankan.jp.xspace.common;
+
+
+public enum ResultCode {
+    SYSTEM_ERROR(500, "系统异常"),
+
+    NOT_ROLE(4001, "无此角色"),
+    NOT_PERMISSION(4002, "无此权限"),
+    USER_EXIST(4003, "手机号已经被注册"),
+    PARAM_ERROR(4004, "参数缺失"),
+    USER_NOT_LOGIN(3004, "用户未登录"),
+    USER_NOT_EXIST(4007, "用户不存在"),
+    PASSWORD_ERROR(3014, "账号或密码不正确"),
+    COMPANY_NOT_EXIST(4007, "用户名不存在"),
+
+    DATA_TOO_LONG(50050, "长度超出限制!"),
+    NOT_RECORD(50051, "记录找不到!"),
+    POINT_GT_ZERO(50052, "点数设置结果小于0,设置失败!"),
+    CAMERA_NOT_EXIST(50053, "该设备不存在或已被激活!"),
+    PASSWORD_TYPE_ERROR(3011, "密码需要包含英文大小写、数字,长度8-16字符"),
+    OLD_PASSWORD_ERROR(3027, "原密码错误"),
+    SS_SCENE_DOWN_ERROR(50051, "获取深时下载状态失败!"),
+    MAIL_TEMPLATE_ERROR(50006, "邮件发送模板不存在"),
+    MAIL_SEND_ERROR(50007, "邮件发送失败"),
+    CAMERA_IN(50008, "相机已存在"),
+    SCENE_ERROR(50009, "场景状态不对"),
+    SCENE_DATA_ERROR(5010, "复制失败,场景资源文件不对"),
+    SCENE_COLD_STORAGE(5011, "场景已归档,无需再次归档"),
+    SCENE_NOT_EXIT(5012, "场景不存在"),
+    SCENE_NO_COLD_STORAGE(5013, "场景未归档,无需还原"),
+    SCENE_CONTRACTOR_ERROR(5014, "场景已被协作,无法再次协作"),
+    CONTRACTOR_USER_ERROR(5015, "承包商不存在"),
+    RESTORE_ERROR(5016, "还原的相机类型不同"),
+    LASER_ERROR(5017, "激光系统出错"),
+    SCENE_CONTRACTOR_ERROR2(5018, "场景协作失败,请勿同个公司内进行协作"),
+    SCENE_COMPANY_ERROR(5019, "场景所属公司不存在,或者公司管理员不存在"),
+
+    MAIN_CONTRACTOR_USER_ERROR(5020, "总承包商不存在"),
+    CLOD_STORAGE_ERROR(5021, "归档失败,场景未计算完成"),
+    GENERATE_OBJ_ERROR_TYPE(5022, "只能操作激光场景"),
+    GENERATE_OBJ_ERROR(5023, "当前场景不支持 生成OBJ"),
+
+    SCENE_CONTRACTOR_ERROR3(5024, "场景协作失败,请填写公司管理员账号"),
+    GENERATE_OBJ_EXITS(5025, "场景已生成obj"),
+    CAMERA_NOT_MOVE(5026, "场景已在改相机,无需迁移"),
+    CAMERA_TYPE_NOT_ERROR(5027, "相机类型不同,不能迁移"),
+    SCENE_MODELING(5028, "正在计算中,请耐心等待"),
+
+
+    ;
+
+    private Integer code;
+    private String message;
+
+   private ResultCode(Integer code, String message) {
+        this.code = code;
+        this.message = message;
+    }
+
+    public Integer code() {
+        return this.code;
+    }
+
+    public String message() {
+        return this.message;
+    }
+
+    public String formatMessage(Object... args) {
+        return String.format(this.message, args);
+    }
+}

+ 10 - 0
src/main/java/com/fdkankan/jp/xspace/common/annotation/CheckPlatformAdminPermit.java

@@ -0,0 +1,10 @@
+package com.fdkankan.jp.xspace.common.annotation;
+
+import java.lang.annotation.*;
+
+@Target({ElementType.METHOD})
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+public @interface CheckPlatformAdminPermit {
+    String description() default "";
+}

+ 27 - 0
src/main/java/com/fdkankan/jp/xspace/common/exception/BusinessException.java

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

+ 49 - 0
src/main/java/com/fdkankan/jp/xspace/common/exception/GlobalExceptionHandler.java

@@ -0,0 +1,49 @@
+package com.fdkankan.jp.xspace.common.exception;
+
+import com.fdkankan.jp.xspace.common.Result;
+import com.fdkankan.jp.xspace.common.ResultCode;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.dao.DataIntegrityViolationException;
+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.getCause().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());
+    }
+    /**
+     * 处理业务异常
+     */
+    @ResponseBody
+    @ExceptionHandler(value = DataIntegrityViolationException.class)
+    public Result DataIntegrityViolationExceptionHandler(DataIntegrityViolationException e) {
+        log.error("mysql服务错误:", e);
+        if(e.getCause().getMessage().contains("Data too long")){
+            return Result.failure(ResultCode.DATA_TOO_LONG);
+        }
+        return Result.failure( 500, e.getCause().getMessage());
+    }
+}

+ 27 - 0
src/main/java/com/fdkankan/jp/xspace/common/exception/PackException.java

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

+ 7 - 0
src/main/java/com/fdkankan/jp/xspace/common/rabbitmq/RabbitmqConstant.java

@@ -0,0 +1,7 @@
+package com.fdkankan.jp.xspace.common.rabbitmq;
+
+public class RabbitmqConstant {
+
+    public final static String QUEUE_PACK_XSPACE = "queue-page-xspace";
+
+}

+ 7 - 0
src/main/java/com/fdkankan/jp/xspace/common/redis/RedisConstant.java

@@ -0,0 +1,7 @@
+package com.fdkankan.jp.xspace.common.redis;
+
+public class RedisConstant {
+
+    public static final String KEY_XSPACE_TOKEN = "xspace:token#%s";
+
+}

+ 34 - 0
src/main/java/com/fdkankan/jp/xspace/config/WebAppConfig.java

@@ -0,0 +1,34 @@
+package com.fdkankan.jp.xspace.config;
+
+import com.fdkankan.jp.xspace.interceptor.UcenterInterceptor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+
+@Configuration
+public class WebAppConfig implements WebMvcConfigurer {
+
+	@Autowired
+	private UcenterInterceptor ucenterInterceptor;
+
+	@Override
+	public void addInterceptors(InterceptorRegistry registry) {
+
+		registry.addInterceptor(ucenterInterceptor).addPathPatterns("/**")
+				.excludePathPatterns(
+						"/user/login"
+				);
+
+		WebMvcConfigurer.super.addInterceptors(registry);
+	}
+
+	@Override
+	public void addResourceHandlers(ResourceHandlerRegistry registry) {
+		WebMvcConfigurer.super.addResourceHandlers(registry);
+	}
+
+}
+

+ 81 - 0
src/main/java/com/fdkankan/jp/xspace/controller/BaseController.java

@@ -0,0 +1,81 @@
+package com.fdkankan.jp.xspace.controller;
+
+import com.fdkankan.common.util.DateEditor;
+import com.fdkankan.common.util.JwtUtil;
+import com.fdkankan.jp.xspace.common.ResultCode;
+import com.fdkankan.jp.xspace.entity.User;
+import com.fdkankan.jp.xspace.common.exception.BusinessException;
+import com.fdkankan.jp.xspace.service.IUserService;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.propertyeditors.StringTrimmerEditor;
+import org.springframework.web.bind.WebDataBinder;
+import org.springframework.web.bind.annotation.InitBinder;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.*;
+import java.util.Date;
+
+public class BaseController {
+
+    @Autowired
+    protected HttpServletRequest request;
+
+    @Autowired
+    protected HttpServletResponse response;
+
+    @Autowired
+    IUserService userService;
+
+    @InitBinder
+    protected void initBinder(WebDataBinder webDataBinder) {
+        webDataBinder.registerCustomEditor(String.class, new StringTrimmerEditor(true));
+        webDataBinder.registerCustomEditor(Date.class, new DateEditor(true));
+    }
+
+
+
+    public static void output(HttpServletResponse resp, File file) {
+        OutputStream os = null;
+        BufferedInputStream bis = null;
+        byte[] buff = new byte[1024];
+        try {
+            os = resp.getOutputStream();
+            bis = new BufferedInputStream(new FileInputStream(file));
+            int i = 0;
+            while ((i = bis.read(buff)) != -1) {
+                os.write(buff, 0, i);
+                os.flush();
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+        } finally {
+            try {
+                bis.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+    }
+
+    protected String getToken(){
+        return request.getHeader("token");
+    }
+    protected String getLang(){
+        return StringUtils.isBlank(request.getHeader("lang") ) ? "zh" : request.getHeader("lang");
+    }
+
+    protected User getUser(){
+        String username = JwtUtil.getUsername(getToken());
+        if(StringUtils.isBlank(username)){
+            throw new BusinessException(ResultCode.USER_NOT_LOGIN);
+        }
+        User user = userService.getByUserName(username);
+        if(user == null){
+            throw new BusinessException(ResultCode.USER_NOT_LOGIN);
+        }
+        return user;
+    }
+
+}

+ 21 - 0
src/main/java/com/fdkankan/jp/xspace/controller/RoleController.java

@@ -0,0 +1,21 @@
+package com.fdkankan.jp.xspace.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ * 角色表 前端控制器
+ * </p>
+ *
+ * @author 
+ * @since 2024-07-23
+ */
+@RestController
+@RequestMapping("/jp.xspace/role")
+public class RoleController {
+
+}
+

+ 28 - 0
src/main/java/com/fdkankan/jp/xspace/controller/SceneController.java

@@ -0,0 +1,28 @@
+package com.fdkankan.jp.xspace.controller;
+
+import com.fdkankan.jp.xspace.common.Result;
+import com.fdkankan.jp.xspace.dto.SceneDTO;
+import com.fdkankan.jp.xspace.dto.XspacePageDTO;
+import com.fdkankan.jp.xspace.entity.User;
+import com.fdkankan.jp.xspace.service.IScenePlusService;
+import com.fdkankan.jp.xspace.service.ISceneXspaceService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@RestController
+@RequestMapping("/scene")
+public class SceneController extends BaseController{
+
+    @Autowired
+    private IScenePlusService scenePlusService;
+    @Autowired
+    private ISceneXspaceService sceneXspaceService;
+
+    @PostMapping("/sceneList")
+    public Result sceneList(@RequestBody SceneDTO param){
+        return Result.success(scenePlusService.pageSgMesh(param, this.getUser()));
+    }
+
+}

+ 21 - 0
src/main/java/com/fdkankan/jp/xspace/controller/ScenePlusController.java

@@ -0,0 +1,21 @@
+package com.fdkankan.jp.xspace.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ * 场景主表 前端控制器
+ * </p>
+ *
+ * @author 
+ * @since 2024-07-22
+ */
+@RestController
+@RequestMapping("/jp.xspace/scenePlus")
+public class ScenePlusController {
+
+}
+

+ 21 - 0
src/main/java/com/fdkankan/jp/xspace/controller/ScenePlusExtController.java

@@ -0,0 +1,21 @@
+package com.fdkankan.jp.xspace.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author 
+ * @since 2024-07-22
+ */
+@RestController
+@RequestMapping("/jp.xspace/scenePlusExt")
+public class ScenePlusExtController {
+
+}
+

+ 54 - 0
src/main/java/com/fdkankan/jp/xspace/controller/SceneXspaceController.java

@@ -0,0 +1,54 @@
+package com.fdkankan.jp.xspace.controller;
+
+
+import cn.hutool.core.collection.CollUtil;
+import com.fdkankan.jp.xspace.common.Result;
+import com.fdkankan.jp.xspace.dto.XspacePageDTO;
+import com.fdkankan.jp.xspace.service.ISceneXspaceService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * <p>
+ * xspace同步表 前端控制器
+ * </p>
+ *
+ * @author
+ * @since 2024-07-22
+ */
+@RestController
+@RequestMapping("/xspace")
+public class SceneXspaceController extends BaseController{
+
+    @Autowired
+    private ISceneXspaceService sceneXspaceService;
+
+    @PostMapping("/list")
+    public Result xspaceList(@RequestBody XspacePageDTO param){
+        return Result.success(sceneXspaceService.pageXspace(param, this.getUser()));
+    }
+
+    @PostMapping("/delete")
+    public Result delete(@RequestBody List<Long> ids){
+        if(CollUtil.isEmpty(ids)){
+            return Result.success();
+        }
+        return sceneXspaceService.delete(ids, this.getUser());
+    }
+
+    @PostMapping("/sync")
+    public Result sync(@RequestBody List<String> nums){
+        if(CollUtil.isEmpty(nums)){
+            return Result.success();
+        }
+        return sceneXspaceService.sync(nums, this.getUser());
+    }
+
+}
+

+ 88 - 0
src/main/java/com/fdkankan/jp/xspace/controller/UserController.java

@@ -0,0 +1,88 @@
+package com.fdkankan.jp.xspace.controller;
+
+
+import com.fdkankan.jp.xspace.common.Result;
+import com.fdkankan.jp.xspace.dto.LoginDTO;
+import com.fdkankan.jp.xspace.service.IUserRoleService;
+import com.fdkankan.jp.xspace.service.IUserService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ * 用户信息表 前端控制器
+ * </p>
+ *
+ * @author
+ * @since 2022-12-23
+ */
+@RestController
+@RequestMapping("/user")
+public class UserController extends BaseController {
+
+    @Autowired
+    IUserService userService;
+    @Autowired
+    IUserRoleService userRoleService;
+
+    /**
+     * 登录
+     * phoneNum 用户名
+     * password 密码
+     */
+    @PostMapping("/login")
+    public Result login(@RequestBody LoginDTO param){
+        return Result.success(userService.login(param));
+    }
+
+    @PostMapping("/logout")
+    public Result logout() {
+        userService.logout(getToken());
+        return Result.success();
+    }
+
+//    /**
+//     * 获取用户信息
+//     */
+//    @RequestMapping(value = "/getUserInfo", method = RequestMethod.POST)
+//    public Result getUserInfo() {
+//        String username = JwtUtil.getUsername(getToken());
+//        return Result.success(userService.getUserInfo(username));
+//    }
+//
+//    /**
+//     * 查询用户列表
+//     */
+//    @PostMapping("/list")
+//    public Result list(@RequestBody UserListParam param){
+//        return Result.success(userService.pageList(param,getUser()));
+//    }
+//
+//    @PostMapping("/updatePassword")
+//    public Result updatePassword(@RequestBody UserParam param){
+//        userService.updatePassword(param);
+//        return Result.success();
+//    }
+//
+//
+//    @PostMapping("/allUserList")
+//    public Result allUserList(@RequestBody User param){
+//
+//        List<User> retrunList = new ArrayList<>();
+//        List<User> list = userService.allList(param);
+//        List<Long> userIds = list.stream().map(User::getId).collect(Collectors.toList());
+//        HashMap<Long ,Long>  roleUserMap = userRoleService.getByUserList(userIds);
+//        for (User user : list) {
+//            Long roleId = roleUserMap.get(user.getId());
+//            if(roleId != null && roleId!= 8){
+//                retrunList.add(user);
+//            }
+//        }
+//
+//        return Result.success(retrunList);
+//    }
+}
+

+ 21 - 0
src/main/java/com/fdkankan/jp/xspace/controller/UserRoleController.java

@@ -0,0 +1,21 @@
+package com.fdkankan.jp.xspace.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ * 用户角色关系表 前端控制器
+ * </p>
+ *
+ * @author 
+ * @since 2024-07-23
+ */
+@RestController
+@RequestMapping("/jp.xspace/userRole")
+public class UserRoleController {
+
+}
+

+ 48 - 0
src/main/java/com/fdkankan/jp/xspace/controller/XspaceUserController.java

@@ -0,0 +1,48 @@
+package com.fdkankan.jp.xspace.controller;
+
+
+import com.fdkankan.jp.xspace.common.Result;
+import com.fdkankan.jp.xspace.common.annotation.CheckPlatformAdminPermit;
+import com.fdkankan.jp.xspace.dto.PageXspaceUserDTO;
+import com.fdkankan.jp.xspace.dto.XspaceUserDTO;
+import com.fdkankan.jp.xspace.mapper.IXspaceUserMapper;
+import com.fdkankan.jp.xspace.service.IXspaceUserService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ * xpace用户列表 前端控制器
+ * </p>
+ *
+ * @author
+ * @since 2024-07-26
+ */
+@RestController
+@RequestMapping("/xspaceUser")
+public class XspaceUserController extends BaseController{
+
+    @Autowired
+    private IXspaceUserService xspaceUserService;
+
+    @CheckPlatformAdminPermit
+    @PostMapping("/list")
+    public Result page(@RequestBody @Validated PageXspaceUserDTO param){
+        return xspaceUserService.pageUser(param, getUser());
+    }
+
+    @CheckPlatformAdminPermit
+    @PostMapping("/updatePassword")
+    public Result updatePassword(@RequestBody @Validated XspaceUserDTO param){
+        return xspaceUserService.updatePassword(param);
+    }
+
+
+
+}
+

+ 10 - 0
src/main/java/com/fdkankan/jp/xspace/dto/LoginDTO.java

@@ -0,0 +1,10 @@
+package com.fdkankan.jp.xspace.dto;
+
+import lombok.Data;
+
+@Data
+public class LoginDTO {
+    private String phoneNum;        //用户名
+    private String password;        //密码
+    private Boolean rememberMe;
+}

+ 12 - 0
src/main/java/com/fdkankan/jp/xspace/dto/PageXspaceUserDTO.java

@@ -0,0 +1,12 @@
+package com.fdkankan.jp.xspace.dto;
+
+import com.fdkankan.jp.xspace.common.RequestBase;
+import lombok.Data;
+
+@Data
+public class PageXspaceUserDTO extends RequestBase {
+
+    private String userName;
+    private String nickName;
+
+}

+ 20 - 0
src/main/java/com/fdkankan/jp/xspace/dto/SceneDTO.java

@@ -0,0 +1,20 @@
+package com.fdkankan.jp.xspace.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fdkankan.jp.xspace.common.RequestBase;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class SceneDTO extends RequestBase {
+
+    private String title;
+    private String num;
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date timeStart;
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date timeEnd;
+    private Long userId;
+
+}

+ 22 - 0
src/main/java/com/fdkankan/jp/xspace/dto/XspacePageDTO.java

@@ -0,0 +1,22 @@
+package com.fdkankan.jp.xspace.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fdkankan.jp.xspace.common.RequestBase;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class XspacePageDTO extends RequestBase {
+
+    private String title;
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date timeStart;
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date timeEnd;
+    private Long userId;
+    private String creator;
+    private Integer status;
+    private Long companyId;
+
+}

+ 16 - 0
src/main/java/com/fdkankan/jp/xspace/dto/XspaceUserDTO.java

@@ -0,0 +1,16 @@
+package com.fdkankan.jp.xspace.dto;
+
+import com.fdkankan.jp.xspace.common.RequestBase;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+@Data
+public class XspaceUserDTO {
+
+    @NotNull(message = "id不能为空")
+    private Long id;
+    @NotNull(message = "密码不能为空")
+    private String newPassword;
+
+}

+ 72 - 0
src/main/java/com/fdkankan/jp/xspace/entity/Role.java

@@ -0,0 +1,72 @@
+package com.fdkankan.jp.xspace.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 2024-07-23
+ */
+@Getter
+@Setter
+@TableName("t_role")
+public class Role implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * id
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 角色描述
+     */
+    @TableField("role_desc")
+    private String roleDesc;
+
+    /**
+     * 角色名
+     */
+    @TableField("role_name")
+    private String roleName;
+
+    /**
+     * 角色key
+     */
+    @TableField("role_key")
+    private String roleKey;
+
+    /**
+     * 创建时间
+     */
+    @TableField("create_time")
+    private Date createTime;
+
+    /**
+     * 更新时间
+     */
+    @TableField("update_time")
+    private Date updateTime;
+
+    /**
+     * 记录的状态,A: 生效,I: 禁用
+     */
+    @TableField("rec_status")
+    @TableLogic(value = "A", delval = "I")
+    private String recStatus;
+
+
+}

+ 126 - 0
src/main/java/com/fdkankan/jp/xspace/entity/ScenePlus.java

@@ -0,0 +1,126 @@
+package com.fdkankan.jp.xspace.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 2024-07-22
+ */
+@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;
+
+    /**
+     * 是否有housetype文件(0-否,1-是)
+     */
+    @TableField("house_type")
+    private Integer houseType;
+
+    /**
+     * 创建时间
+     */
+    @TableField("create_time")
+    private Date createTime;
+
+    /**
+     * 更新时间
+     */
+    @TableField("update_time")
+    private Date updateTime;
+
+    /**
+     * A-有效,I-无效
+     */
+    @TableField("rec_status")
+    @TableLogic(value = "A", delval = "I")
+    private String recStatus;
+
+    @TableField("laser_title")
+    private String laserTitle;
+
+
+}

+ 198 - 0
src/main/java/com/fdkankan/jp/xspace/entity/ScenePlusExt.java

@@ -0,0 +1,198 @@
+package com.fdkankan.jp.xspace.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 2024-07-22
+ */
+@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("orig_space")
+    private Long origSpace;
+
+    /**
+     * 云服务器类型
+     */
+    @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;
+
+    /**
+     * 分辨率(2k,4k)
+     */
+    @TableField("scene_resolution")
+    private String sceneResolution;
+
+    /**
+     * 场景来源,lite:双目lite相机,pro:八目相机,minion:双面转台相机,laser:激光相机,virtual:虚拟场景,sketch:图片建模场景
+     */
+    @TableField("scene_from")
+    private String sceneFrom;
+
+    /**
+     * 切图方式(tiles:瓦片图,face:切片图,pan:全景图 ,local:本地切片,cube:立体图)
+     */
+    @TableField("scene_kind")
+    private String sceneKind;
+
+    /**
+     * 算法生成模型类型(dam,3dtiles)
+     */
+    @TableField("model_kind")
+    private String modelKind;
+
+    /**
+     * 点位视频
+     */
+    @TableField("videos")
+    private String videos;
+
+    /**
+     * oss桶名
+     */
+    @TableField("yun_file_bucket")
+    private String yunFileBucket;
+
+    /**
+     * 算法计算完成时间
+     */
+    @TableField("algorithm_time")
+    private Date algorithmTime;
+
+    /**
+     * 计算耗时
+     */
+    @TableField("compute_time")
+    private Long computeTime;
+
+    /**
+     * 拍摄模式
+     */
+    @TableField("location")
+    private Integer location;
+
+    /**
+     * 是否混合模式
+     */
+    @TableField("mixture")
+    private Integer mixture;
+
+    /**
+     * 创建时间
+     */
+    @TableField("create_time")
+    private Date createTime;
+
+    /**
+     * 更新时间
+     */
+    @TableField("update_time")
+    private Date updateTime;
+
+    /**
+     * A-有效,I-无效
+     */
+    @TableField("rec_status")
+    @TableLogic(value = "A", delval = "I")
+    private String recStatus;
+
+    @TableField("is_obj")
+    private Integer isObj;
+
+
+}

+ 78 - 0
src/main/java/com/fdkankan/jp/xspace/entity/SceneXspace.java

@@ -0,0 +1,78 @@
+package com.fdkankan.jp.xspace.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>
+ * xspace同步表
+ * </p>
+ *
+ * @author
+ * @since 2024-07-22
+ */
+@Getter
+@Setter
+@TableName("t_scene_xspace")
+public class SceneXspace implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 场景码
+     */
+    @TableField("num")
+    private String num;
+
+    /**
+     * 序列号
+     */
+    @TableField("serial")
+    private String serial;
+
+    /**
+     * 用户id
+     */
+    @TableField("user_id")
+    private Long userId;
+
+    /**
+     * 同步状态
+     */
+    @TableField("status")
+    private Integer status;
+
+    /**
+     * 创建时间
+     */
+    @TableField("create_time")
+    private Date createTime;
+
+    /**
+     * 更新时间
+     */
+    @TableField("update_time")
+    private Date updateTime;
+
+    /**
+     * A-有效,I删除
+     */
+    @TableField("rec_status")
+    @TableLogic(value = "A", delval = "I")
+    private String recStatus;
+
+    @TableField(value = "updater")
+    private Long updater;
+
+
+}

+ 152 - 0
src/main/java/com/fdkankan/jp/xspace/entity/User.java

@@ -0,0 +1,152 @@
+package com.fdkankan.jp.xspace.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 用户信息表
+ * </p>
+ *
+ * @author
+ * @since 2022-12-23
+ */
+@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;
+
+    @TableField("company_id")
+    private Long companyId;
+
+    /**
+     * 深时场景下载总次数
+     */
+    @TableField("ss_download_num_total")
+    private Integer ssDownloadNumTotal;
+
+    /**
+     * 深时场景已下载次数
+     */
+    @TableField("ss_download_num")
+    private Integer ssDownloadNum;
+
+
+}

+ 63 - 0
src/main/java/com/fdkankan/jp/xspace/entity/UserRole.java

@@ -0,0 +1,63 @@
+package com.fdkankan.jp.xspace.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 2024-07-23
+ */
+@Getter
+@Setter
+@TableName("t_user_role")
+public class UserRole implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 用户表id
+     */
+    @TableField("user_id")
+    private Long userId;
+
+    /**
+     * 角色表id
+     */
+    @TableField("role_id")
+    private Long roleId;
+
+    /**
+     * 创建时间
+     */
+    @TableField("create_time")
+    private Date createTime;
+
+    /**
+     * 记录的状态,A: 生效,I: 禁用
+     */
+    @TableField("rec_status")
+    @TableLogic(value = "A", delval = "I")
+    private String recStatus;
+
+    /**
+     * 更新时间
+     */
+    @TableField("update_time")
+    private Date updateTime;
+
+
+}

+ 54 - 0
src/main/java/com/fdkankan/jp/xspace/entity/XspaceUser.java

@@ -0,0 +1,54 @@
+package com.fdkankan.jp.xspace.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>
+ * xpace用户列表
+ * </p>
+ *
+ * @author
+ * @since 2024-07-26
+ */
+@Getter
+@Setter
+@TableName("t_xspace_user")
+public class XspaceUser implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * geosign系统userid
+     */
+    @TableField("user_id")
+    private Long userId;
+
+    /**
+     * 创建时间
+     */
+    @TableField("create_time")
+    private Date createTime;
+
+    /**
+     * 修改时间
+     */
+    @TableField("update_time")
+    private Date updateTime;
+
+    @TableField("rec_status")
+    @TableLogic(value = "A", delval = "I")
+    private String recStatus;
+
+
+}

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

@@ -0,0 +1,98 @@
+package com.fdkankan.jp.xspace.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,"jp.xspace", getTables(new String[]{
+                "t_xspace_user"
+        }));
+
+//        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://47.106.180.58:13306/4dkankan_v4",
+            "root","JK20220120%JIK")
+                .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\\"));
+                })
+                .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();
+    }
+}

+ 63 - 0
src/main/java/com/fdkankan/jp/xspace/interceptor/CheckPlatAdminPermitAspect.java

@@ -0,0 +1,63 @@
+package com.fdkankan.jp.xspace.interceptor;
+
+import com.fdkankan.common.util.JwtUtil;
+import com.fdkankan.jp.xspace.common.ResultCode;
+import com.fdkankan.jp.xspace.common.exception.BusinessException;
+import com.fdkankan.jp.xspace.entity.User;
+import com.fdkankan.jp.xspace.service.IUserRoleService;
+import com.fdkankan.jp.xspace.service.IUserService;
+import lombok.extern.log4j.Log4j2;
+import org.apache.commons.lang3.StringUtils;
+import org.aspectj.lang.JoinPoint;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Before;
+import org.aspectj.lang.annotation.Pointcut;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+import java.io.IOException;
+import java.util.Set;
+
+@Log4j2
+@Aspect
+@Component
+public class CheckPlatAdminPermitAspect {
+
+	@Autowired
+	private IUserService userService;
+	@Autowired
+	private IUserRoleService userRoleService;
+
+	@Pointcut("@annotation(com.fdkankan.jp.xspace.common.annotation.CheckPlatformAdminPermit)")
+	public void CheckPlatformAdminPermit() {
+	}
+
+	/**
+	 * 前置通知 用于判断用户协作场景是否有协作权限
+	 *
+	 * @param joinPoint
+	 *            切点
+	 * @throws IOException
+	 */
+	@Before("CheckPlatformAdminPermit()")
+	public void doBefore(JoinPoint joinPoint) throws Exception {
+		HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
+		String token = request.getHeader("token");
+		String username = JwtUtil.getUsername(token);
+		if(StringUtils.isBlank(username)){
+			throw new BusinessException(ResultCode.USER_NOT_LOGIN);
+		}
+		User user = userService.getByUserName(username);
+		if(user == null){
+			throw new BusinessException(ResultCode.USER_NOT_LOGIN);
+		}
+		Set<Long> roleIds = userRoleService.getByUser(user);
+		if(!roleIds.contains(5L)){
+			throw new BusinessException(ResultCode.NOT_PERMISSION);
+		}
+	}
+
+}

+ 64 - 0
src/main/java/com/fdkankan/jp/xspace/interceptor/UcenterInterceptor.java

@@ -0,0 +1,64 @@
+package com.fdkankan.jp.xspace.interceptor;
+
+
+import cn.hutool.http.ContentType;
+import com.alibaba.fastjson.JSONObject;
+import com.fdkankan.jp.xspace.common.Result;
+import com.fdkankan.jp.xspace.common.ResultCode;
+import com.fdkankan.jp.xspace.common.redis.RedisConstant;
+import com.fdkankan.redis.constant.RedisKey;
+import com.fdkankan.redis.util.RedisUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.http.HttpHeaders;
+import org.springframework.stereotype.Component;
+import org.springframework.web.servlet.HandlerInterceptor;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+
+@Component
+@Slf4j
+public class UcenterInterceptor implements HandlerInterceptor {
+
+	@Resource
+	private RedisUtil redisUtil;
+
+
+	@Override
+	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
+		response.setHeader(HttpHeaders.CONTENT_TYPE, ContentType.JSON.getValue());
+		response.setCharacterEncoding(StandardCharsets.UTF_8.name());
+		String token = request.getHeader("token");
+		if(StringUtils.isEmpty(token)){
+			this.needLogin(request,response);
+			return false;
+		}
+		try {
+			String redisKey = String.format(RedisConstant.KEY_XSPACE_TOKEN,token);
+			if(redisUtil.hasKey(redisKey)){
+				redisUtil.expire(redisKey,2 * 60 * 60);
+				return true;
+			}
+		}catch (Exception e){
+			e.printStackTrace();
+		}
+		this.needLogin(request,response);
+		return false;
+	}
+
+	private void needLogin(HttpServletRequest request, HttpServletResponse response) {
+		try {
+			String result = JSONObject.toJSONString(Result.failure(ResultCode.USER_NOT_LOGIN));
+			response.getWriter().append(result);
+		} catch (IOException e) {
+			log.info("LoginInterceptor|needLogin|IOException|" + e);
+			e.printStackTrace();
+		}
+	}
+
+}
+

+ 106 - 0
src/main/java/com/fdkankan/jp/xspace/listener/RabbitMqListener.java

@@ -0,0 +1,106 @@
+package com.fdkankan.jp.xspace.listener;
+
+import cn.hutool.core.bean.BeanUtil;
+import com.fdkankan.common.constant.CommonStatus;
+import com.fdkankan.common.constant.CommonSuccessStatus;
+import com.fdkankan.dingtalk.DingTalkSendUtils;
+import com.fdkankan.fyun.face.FYunFileServiceInterface;
+import com.fdkankan.jp.xspace.common.exception.PackException;
+import com.fdkankan.jp.xspace.common.rabbitmq.RabbitmqConstant;
+import com.fdkankan.jp.xspace.entity.SceneXspace;
+import com.fdkankan.jp.xspace.entity.User;
+import com.fdkankan.jp.xspace.service.IUserService;
+import com.rabbitmq.client.Channel;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.amqp.core.Message;
+import org.springframework.amqp.rabbit.annotation.Queue;
+import org.springframework.amqp.rabbit.annotation.RabbitListener;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.nio.charset.StandardCharsets;
+
+/**
+ * <p>
+ * TODO
+ * </p>
+ *
+ * @author dengsixing
+ * @since 2022/4/19
+ **/
+@Slf4j
+@Component
+public class RabbitMqListener {
+
+    public static final String DINGTALK_MSG_PATTERN =
+            "**环境**: %s\n\n" +
+            "**失败原因**: %s\n\n" +
+            "**场景码**: %s\n\n" +
+            "**账号**: %s\n\n" +
+            "**资源地址**: %s\n\n";
+
+    @Value("${spring.profiles.active}")
+    private String profile;
+
+    @Resource
+    private FYunFileServiceInterface fYunFileService;
+    @Resource
+    private DingTalkSendUtils dingTalkSendUtils;
+    @Autowired
+    private IUserService userService;
+
+
+    /**
+     * 开启了手动确认模式,如果没有手动确认,消费者不会重试,当服务重启时会再次消费,因为rabbitmq认为你还没有处理完你的业务
+     * queuesToDeclare = @Queue("${queue.modeling.modeling-test}"),  如果队列不不存在会自动创建队列
+     * concurrency = "3"    设置消费线程数,每个线程每次只拉取一条消息消费
+     */
+    @RabbitListener(
+        queuesToDeclare = @Queue(RabbitmqConstant.QUEUE_PACK_XSPACE),
+        concurrency = "1"
+    )
+    public void packXspace(Channel channel, Message message) throws Exception {
+        String messageId = message.getMessageProperties().getMessageId();
+        String msg = new String(message.getBody(), StandardCharsets.UTF_8);
+        log.info("开始消费消息,id:{},content:{}", messageId, msg);
+
+        SceneXspace bean = BeanUtil.toBean(msg, SceneXspace.class);
+        String errorReason = null;
+        String dataSource = null;
+
+        try {
+            // TODO: 2024/7/24 准备资源
+
+            // TODO: 2024/7/24 调用unity打包
+
+            // TODO: 2024/7/24 处理文件 上传oss
+
+            // TODO: 2024/7/25 删除本地资源
+
+            bean.setStatus(CommonSuccessStatus.SUCCESS.code());
+        }catch (PackException e){
+            bean.setStatus(CommonSuccessStatus.FAIL.code());
+            errorReason = "unity打包失败";
+        } catch (Exception e) {
+            bean.setStatus(CommonSuccessStatus.FAIL.code());
+            errorReason = "后端报错";
+        }
+
+
+        if(bean.getStatus() == CommonSuccessStatus.FAIL.code()){
+            User user = userService.getById(bean.getUserId());
+            String content = String.format(DINGTALK_MSG_PATTERN, profile, errorReason, bean.getNum(), user.getUserName(), dataSource);
+            dingTalkSendUtils.sendActioncardMsgToDingRobot(content, "场景同步失败");
+        }
+
+
+        // TODO: 2024/7/24 更新记录
+
+        log.info("结束消费消息,id:{}", messageId);
+        channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
+    }
+
+
+}

+ 18 - 0
src/main/java/com/fdkankan/jp/xspace/mapper/IRoleMapper.java

@@ -0,0 +1,18 @@
+package com.fdkankan.jp.xspace.mapper;
+
+import com.fdkankan.jp.xspace.entity.Role;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ * 角色表 Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2024-07-23
+ */
+@Mapper
+public interface IRoleMapper extends BaseMapper<Role> {
+
+}

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

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

+ 23 - 0
src/main/java/com/fdkankan/jp/xspace/mapper/IScenePlusMapper.java

@@ -0,0 +1,23 @@
+package com.fdkankan.jp.xspace.mapper;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fdkankan.jp.xspace.dto.SceneDTO;
+import com.fdkankan.jp.xspace.entity.ScenePlus;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ * 场景主表 Mapper 接口
+ * </p>
+ *
+ * @author
+ * @since 2024-07-22
+ */
+@Mapper
+public interface IScenePlusMapper extends BaseMapper<ScenePlus> {
+
+    Page pageSgMesh(Page page, SceneDTO param);
+
+}

+ 23 - 0
src/main/java/com/fdkankan/jp/xspace/mapper/ISceneXspaceMapper.java

@@ -0,0 +1,23 @@
+package com.fdkankan.jp.xspace.mapper;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fdkankan.jp.xspace.dto.XspacePageDTO;
+import com.fdkankan.jp.xspace.entity.SceneXspace;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fdkankan.jp.xspace.vo.XspaceVO;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ * xspace同步表 Mapper 接口
+ * </p>
+ *
+ * @author
+ * @since 2024-07-22
+ */
+@Mapper
+public interface ISceneXspaceMapper extends BaseMapper<SceneXspace> {
+
+    Page<XspaceVO> pageXspace(Page page, XspacePageDTO param);
+
+}

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

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

+ 18 - 0
src/main/java/com/fdkankan/jp/xspace/mapper/IUserRoleMapper.java

@@ -0,0 +1,18 @@
+package com.fdkankan.jp.xspace.mapper;
+
+import com.fdkankan.jp.xspace.entity.UserRole;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ * 用户角色关系表 Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2024-07-23
+ */
+@Mapper
+public interface IUserRoleMapper extends BaseMapper<UserRole> {
+
+}

+ 22 - 0
src/main/java/com/fdkankan/jp/xspace/mapper/IXspaceUserMapper.java

@@ -0,0 +1,22 @@
+package com.fdkankan.jp.xspace.mapper;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fdkankan.jp.xspace.dto.PageXspaceUserDTO;
+import com.fdkankan.jp.xspace.entity.XspaceUser;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ * xpace用户列表 Mapper 接口
+ * </p>
+ *
+ * @author
+ * @since 2024-07-26
+ */
+@Mapper
+public interface IXspaceUserMapper extends BaseMapper<XspaceUser> {
+
+    Page pageUser(Page page, PageXspaceUserDTO param);
+
+}

+ 16 - 0
src/main/java/com/fdkankan/jp/xspace/service/IRoleService.java

@@ -0,0 +1,16 @@
+package com.fdkankan.jp.xspace.service;
+
+import com.fdkankan.jp.xspace.entity.Role;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 角色表 服务类
+ * </p>
+ *
+ * @author 
+ * @since 2024-07-23
+ */
+public interface IRoleService extends IService<Role> {
+
+}

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

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

+ 23 - 0
src/main/java/com/fdkankan/jp/xspace/service/IScenePlusService.java

@@ -0,0 +1,23 @@
+package com.fdkankan.jp.xspace.service;
+
+import com.fdkankan.jp.xspace.common.PageInfo;
+import com.fdkankan.jp.xspace.dto.SceneDTO;
+import com.fdkankan.jp.xspace.entity.ScenePlus;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fdkankan.jp.xspace.entity.User;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 场景主表 服务类
+ * </p>
+ *
+ * @author
+ * @since 2024-07-22
+ */
+public interface IScenePlusService extends IService<ScenePlus> {
+
+     PageInfo pageSgMesh(SceneDTO param, User user);
+
+}

+ 28 - 0
src/main/java/com/fdkankan/jp/xspace/service/ISceneXspaceService.java

@@ -0,0 +1,28 @@
+package com.fdkankan.jp.xspace.service;
+
+import com.fdkankan.jp.xspace.common.PageInfo;
+import com.fdkankan.jp.xspace.common.Result;
+import com.fdkankan.jp.xspace.dto.XspacePageDTO;
+import com.fdkankan.jp.xspace.entity.SceneXspace;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fdkankan.jp.xspace.entity.User;
+
+import java.util.List;
+
+/**
+ * <p>
+ * xspace同步表 服务类
+ * </p>
+ *
+ * @author
+ * @since 2024-07-22
+ */
+public interface ISceneXspaceService extends IService<SceneXspace> {
+
+    PageInfo pageXspace(XspacePageDTO param, User user);
+
+    Result delete(List<Long> ids, User user);
+
+    Result sync(List<String> nums, User user);
+
+}

+ 24 - 0
src/main/java/com/fdkankan/jp/xspace/service/IUserRoleService.java

@@ -0,0 +1,24 @@
+package com.fdkankan.jp.xspace.service;
+
+import com.fdkankan.jp.xspace.entity.User;
+import com.fdkankan.jp.xspace.entity.UserRole;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+import java.util.List;
+import java.util.Set;
+
+/**
+ * <p>
+ * 用户角色关系表 服务类
+ * </p>
+ *
+ * @author
+ * @since 2024-07-23
+ */
+public interface IUserRoleService extends IService<UserRole> {
+
+    List<UserRole> getByUserId(Long userId);
+
+    Set<Long> getByUser(User user);
+
+}

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

@@ -0,0 +1,23 @@
+package com.fdkankan.jp.xspace.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fdkankan.jp.xspace.dto.LoginDTO;
+import com.fdkankan.jp.xspace.entity.User;
+import com.fdkankan.jp.xspace.vo.LoginVO;
+
+/**
+ * <p>
+ * 用户信息表 服务类
+ * </p>
+ *
+ * @author
+ * @since 2022-12-23
+ */
+public interface IUserService extends IService<User> {
+
+    User getByUserName(String managerPhone);
+
+    LoginVO login(LoginDTO param);
+
+    void logout(String token);
+}

+ 26 - 0
src/main/java/com/fdkankan/jp/xspace/service/IXspaceUserService.java

@@ -0,0 +1,26 @@
+package com.fdkankan.jp.xspace.service;
+
+import com.fdkankan.jp.xspace.common.Result;
+import com.fdkankan.jp.xspace.dto.PageXspaceUserDTO;
+import com.fdkankan.jp.xspace.dto.XspaceUserDTO;
+import com.fdkankan.jp.xspace.entity.User;
+import com.fdkankan.jp.xspace.entity.XspaceUser;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * xpace用户列表 服务类
+ * </p>
+ *
+ * @author
+ * @since 2024-07-26
+ */
+public interface IXspaceUserService extends IService<XspaceUser> {
+
+    Result pageUser(PageXspaceUserDTO param, User user);
+
+    XspaceUser getByUserId(Long userId);
+
+    Result updatePassword(XspaceUserDTO param);
+
+}

+ 20 - 0
src/main/java/com/fdkankan/jp/xspace/service/impl/RoleServiceImpl.java

@@ -0,0 +1,20 @@
+package com.fdkankan.jp.xspace.service.impl;
+
+import com.fdkankan.jp.xspace.entity.Role;
+import com.fdkankan.jp.xspace.mapper.IRoleMapper;
+import com.fdkankan.jp.xspace.service.IRoleService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 角色表 服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2024-07-23
+ */
+@Service
+public class RoleServiceImpl extends ServiceImpl<IRoleMapper, Role> implements IRoleService {
+
+}

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

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

+ 39 - 0
src/main/java/com/fdkankan/jp/xspace/service/impl/ScenePlusServiceImpl.java

@@ -0,0 +1,39 @@
+package com.fdkankan.jp.xspace.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fdkankan.jp.xspace.common.PageInfo;
+import com.fdkankan.jp.xspace.dto.SceneDTO;
+import com.fdkankan.jp.xspace.entity.ScenePlus;
+import com.fdkankan.jp.xspace.entity.User;
+import com.fdkankan.jp.xspace.mapper.IScenePlusMapper;
+import com.fdkankan.jp.xspace.service.IScenePlusService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fdkankan.jp.xspace.vo.SceneVO;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 场景主表 服务实现类
+ * </p>
+ *
+ * @author
+ * @since 2024-07-22
+ */
+@Service
+public class ScenePlusServiceImpl extends ServiceImpl<IScenePlusMapper, ScenePlus> implements IScenePlusService {
+
+    @Override
+    public PageInfo pageSgMesh(SceneDTO param, User user) {
+        param.setUserId(user.getId());
+        Page<ScenePlus> page = this.baseMapper.pageSgMesh(new Page<>(param.getPageNum(), param.getPageSize()), param);
+        List<SceneVO> sceneVOList = BeanUtil.copyToList(page.getRecords(), SceneVO.class);
+        sceneVOList.stream().forEach(v->v.setUserName(user.getUserName()));
+        PageInfo pageInfo = PageInfo.PageInfo(page);
+        pageInfo.setList(sceneVOList);
+        return pageInfo;
+    }
+}

+ 131 - 0
src/main/java/com/fdkankan/jp/xspace/service/impl/SceneXspaceServiceImpl.java

@@ -0,0 +1,131 @@
+package com.fdkankan.jp.xspace.service.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fdkankan.common.constant.RecStatus;
+import com.fdkankan.jp.xspace.common.PageInfo;
+import com.fdkankan.jp.xspace.common.Result;
+import com.fdkankan.jp.xspace.common.ResultCode;
+import com.fdkankan.jp.xspace.common.rabbitmq.RabbitmqConstant;
+import com.fdkankan.jp.xspace.dto.XspacePageDTO;
+import com.fdkankan.jp.xspace.entity.ScenePlus;
+import com.fdkankan.jp.xspace.entity.SceneXspace;
+import com.fdkankan.jp.xspace.entity.User;
+import com.fdkankan.jp.xspace.mapper.ISceneXspaceMapper;
+import com.fdkankan.jp.xspace.service.IScenePlusService;
+import com.fdkankan.jp.xspace.service.ISceneXspaceService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fdkankan.jp.xspace.service.IUserRoleService;
+import com.fdkankan.jp.xspace.service.IUserService;
+import com.fdkankan.jp.xspace.util.UniqueStringGenerator;
+import com.fdkankan.jp.xspace.vo.XspaceVO;
+import com.fdkankan.rabbitmq.util.RabbitMqProducer;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ * xspace同步表 服务实现类
+ * </p>
+ *
+ * @author
+ * @since 2024-07-22
+ */
+@Service
+public class SceneXspaceServiceImpl extends ServiceImpl<ISceneXspaceMapper, SceneXspace> implements ISceneXspaceService {
+
+    @Autowired
+    private IUserRoleService userRoleService;
+    @Autowired
+    private IUserService userService;
+    @Autowired
+    private IScenePlusService scenePlusService;
+    @Autowired
+    private RabbitMqProducer mqProducer;
+
+    @Override
+    public PageInfo pageXspace(XspacePageDTO param, User user) {
+        Set<Long> roleIds = userRoleService.getByUser(user);
+        if(!roleIds.contains(5)){//平台管理员可以看到所有
+            if(roleIds.contains(6)){//公司管理员可以看到同一公司下所有
+                param.setCompanyId(user.getCompanyId());
+            }else{//普通员工只能看到自己的
+                param.setUserId(user.getId());
+            }
+        }
+        Page<XspaceVO> xspaceVOPage = this.baseMapper.pageXspace(new Page(param.getPageNum(), param.getPageSize()), param);
+        return PageInfo.PageInfo(xspaceVOPage);
+    }
+
+    @Override
+    public Result delete(List<Long> ids, User user) {
+
+        List<SceneXspace> sceneXspaces = this.listByIds(ids);
+        if(CollUtil.isEmpty(sceneXspaces)){
+            return Result.success();
+        }
+        //校验数据
+        Set<Long> userIds = sceneXspaces.stream().map(x -> x.getUserId()).collect(Collectors.toSet());
+        Set<Long> roleIds = userRoleService.getByUser(user);
+        boolean notPermission = false;
+        if(!roleIds.contains(5)){//平台管理员可以看到所有
+            if(roleIds.contains(6)){//公司管理员可以看到同一公司下所有
+                List<User> users = userService.listByIds(userIds);
+                notPermission = users.stream().anyMatch(u -> !u.getCompanyId().equals(user.getCompanyId()));
+            }else{//普通员工只能删除自己的
+                notPermission = userIds.stream().anyMatch(id -> !id.equals(user.getId()));
+            }
+        }
+        if(notPermission){
+            return Result.failure(ResultCode.NOT_PERMISSION);
+        }
+
+        sceneXspaces.stream().forEach(x->{
+            // TODO: 2024/7/24 删除oss文件
+
+            x.setUpdater(user.getId());
+            x.setRecStatus(RecStatus.DISABLE.code());
+            this.updateById(x);
+            this.removeById(x.getId());
+        });
+
+        return Result.success();
+    }
+
+    @Override
+    public Result sync(List<String> nums, User user) {
+
+        List<SceneXspace> syncList = this.list(new LambdaQueryWrapper<SceneXspace>().in(SceneXspace::getNum, nums).eq(SceneXspace::getUserId, user.getId()));
+        List<String> canSyncList = nums;
+        if(CollUtil.isNotEmpty(syncList)){
+            List<String> doneNumsList = syncList.stream().map(v -> v.getNum()).collect(Collectors.toList());
+            canSyncList = nums.stream().filter(v->!doneNumsList.contains(v)).collect(Collectors.toList());
+        }
+
+        List<ScenePlus> scenePlusList = scenePlusService.list(new LambdaQueryWrapper<ScenePlus>().eq(ScenePlus::getUserId, user.getId()).in(ScenePlus::getNum, canSyncList));
+        if(CollUtil.isEmpty(scenePlusList)){
+            return Result.success();
+        }
+
+
+        List<SceneXspace> sceneXspaceList = scenePlusList.stream().map(p -> {
+            SceneXspace sceneXspace = new SceneXspace();
+            sceneXspace.setNum(p.getNum());
+            sceneXspace.setUserId(p.getUserId());
+            sceneXspace.setSerial(UniqueStringGenerator.getUniqueString());
+            return sceneXspace;
+        }).collect(Collectors.toList());
+
+        this.saveBatch(sceneXspaceList);
+        sceneXspaceList.stream().forEach(v->{
+            mqProducer.sendByWorkQueue(RabbitmqConstant.QUEUE_PACK_XSPACE, v);
+        });
+
+        return Result.success();
+    }
+}

+ 39 - 0
src/main/java/com/fdkankan/jp/xspace/service/impl/UserRoleServiceImpl.java

@@ -0,0 +1,39 @@
+package com.fdkankan.jp.xspace.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.fdkankan.jp.xspace.entity.User;
+import com.fdkankan.jp.xspace.entity.UserRole;
+import com.fdkankan.jp.xspace.mapper.IUserRoleMapper;
+import com.fdkankan.jp.xspace.service.IUserRoleService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ * 用户角色关系表 服务实现类
+ * </p>
+ *
+ * @author
+ * @since 2024-07-23
+ */
+@Service
+public class UserRoleServiceImpl extends ServiceImpl<IUserRoleMapper, UserRole> implements IUserRoleService {
+
+    @Override
+    public List<UserRole> getByUserId(Long userId) {
+        LambdaQueryWrapper<UserRole> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(UserRole::getUserId,userId);
+        return this.list(wrapper);
+    }
+
+    @Override
+    public Set<Long> getByUser(User user) {
+        List<UserRole> userRoles = this.getByUserId(user.getId());
+        return userRoles.stream().map(UserRole::getRoleId).collect(Collectors.toSet());
+    }
+
+}

+ 110 - 0
src/main/java/com/fdkankan/jp/xspace/service/impl/UserServiceImpl.java

@@ -0,0 +1,110 @@
+package com.fdkankan.jp.xspace.service.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fdkankan.common.util.Base64Converter;
+import com.fdkankan.common.util.JwtUtil;
+import com.fdkankan.common.util.SecurityUtil;
+import com.fdkankan.jp.xspace.common.ResultCode;
+import com.fdkankan.jp.xspace.common.redis.RedisConstant;
+import com.fdkankan.jp.xspace.dto.LoginDTO;
+import com.fdkankan.jp.xspace.entity.User;
+import com.fdkankan.jp.xspace.entity.UserRole;
+import com.fdkankan.jp.xspace.common.exception.BusinessException;
+import com.fdkankan.jp.xspace.entity.XspaceUser;
+import com.fdkankan.jp.xspace.mapper.IUserMapper;
+import com.fdkankan.jp.xspace.service.IUserRoleService;
+import com.fdkankan.jp.xspace.service.IUserService;
+import com.fdkankan.jp.xspace.service.IXspaceUserService;
+import com.fdkankan.jp.xspace.vo.LoginVO;
+import com.fdkankan.jp.xspace.vo.UserVO;
+import com.fdkankan.redis.util.RedisUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.Objects;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ * 用户信息表 服务实现类
+ * </p>
+ *
+ * @author
+ * @since 2022-12-23
+ */
+@Service
+public class UserServiceImpl extends ServiceImpl<IUserMapper, User> implements IUserService {
+
+    @Resource
+    private RedisUtil redisUtil;
+    @Autowired
+    private IUserRoleService userRoleService;
+    @Autowired
+    private IXspaceUserService xspaceUserService;
+
+    @Override
+    public User getByUserName(String managerPhone) {
+        LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(User::getUserName,managerPhone);
+        return this.getOne(wrapper);
+    }
+
+    @Override
+    public LoginVO login(LoginDTO param) {
+        if (StringUtils.isEmpty(param.getPassword()) || StringUtils.isEmpty(param.getPhoneNum())){
+            throw new BusinessException(ResultCode.PARAM_ERROR);
+        }
+        String password = Base64Converter.decode(Base64Converter.subText(param.getPassword()));
+        String passwordCode = SecurityUtil.MD5(password);
+        User user = this.getByUserName(param.getPhoneNum());
+        if(user == null){
+            throw new BusinessException(ResultCode.USER_NOT_EXIST);
+        }
+        if(!user.getPassword().equals(passwordCode)){
+            throw new BusinessException(ResultCode.PASSWORD_ERROR);
+        }
+        String token = this.redisLogin(user.getUserName(), JSONObject.toJSONString(user),"user");
+        UserVO userVo = getUserVo(user);
+        LoginVO vo = new LoginVO();
+        vo.setToken(token);
+        vo.setUser(userVo);
+
+        XspaceUser xspaceUser = xspaceUserService.getByUserId(userVo.getId());
+        if(Objects.isNull(xspaceUser)){
+            xspaceUser = new XspaceUser();
+            xspaceUser.setUserId(userVo.getId());
+            xspaceUserService.save(xspaceUser);
+        }
+
+        return vo;
+    }
+
+    @Override
+    public void logout(String token) {
+        redisUtil.del(String.format(RedisConstant.KEY_XSPACE_TOKEN,token));
+    }
+
+    public String redisLogin(String userName,String value,String loginType){
+        String token = JwtUtil.createJWT(-1,userName,loginType);
+        String redisKey = String.format(RedisConstant.KEY_XSPACE_TOKEN,token);
+        redisUtil.set(redisKey, value,2 * 60 * 60);
+        return token;
+    }
+
+    private UserVO getUserVo(User user){
+        UserVO userVo = new UserVO();
+        BeanUtils.copyProperties(user,userVo);
+        List<UserRole> userRoles = userRoleService.getByUserId(userVo.getId());
+        Set<Long> roleIds = userRoles.stream().map(UserRole::getRoleId).collect(Collectors.toSet());
+        userVo.setRoleIds(roleIds);
+        return userVo;
+    }
+
+}

+ 75 - 0
src/main/java/com/fdkankan/jp/xspace/service/impl/XspaceUserServiceImpl.java

@@ -0,0 +1,75 @@
+package com.fdkankan.jp.xspace.service.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fdkankan.common.util.Base64Converter;
+import com.fdkankan.common.util.SecurityUtil;
+import com.fdkankan.jp.xspace.common.PageInfo;
+import com.fdkankan.jp.xspace.common.Result;
+import com.fdkankan.jp.xspace.common.ResultCode;
+import com.fdkankan.jp.xspace.common.exception.BusinessException;
+import com.fdkankan.jp.xspace.dto.PageXspaceUserDTO;
+import com.fdkankan.jp.xspace.dto.XspaceUserDTO;
+import com.fdkankan.jp.xspace.entity.User;
+import com.fdkankan.jp.xspace.entity.XspaceUser;
+import com.fdkankan.jp.xspace.mapper.IXspaceUserMapper;
+import com.fdkankan.jp.xspace.service.IUserRoleService;
+import com.fdkankan.jp.xspace.service.IUserService;
+import com.fdkankan.jp.xspace.service.IXspaceUserService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fdkankan.jp.xspace.util.PasswordUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Objects;
+import java.util.Set;
+
+/**
+ * <p>
+ * xpace用户列表 服务实现类
+ * </p>
+ *
+ * @author
+ * @since 2024-07-26
+ */
+@Service
+public class XspaceUserServiceImpl extends ServiceImpl<IXspaceUserMapper, XspaceUser> implements IXspaceUserService {
+    @Autowired
+    private IUserService userService;
+
+    @Override
+    public XspaceUser getByUserId(Long userId) {
+        return this.getOne(new LambdaQueryWrapper<XspaceUser>().eq(XspaceUser::getUserId, userId));
+    }
+
+    @Override
+    public Result pageUser(PageXspaceUserDTO param, User user) {
+        Page page = this.baseMapper.pageUser(new Page(param.getPageNum(), param.getPageSize()), param);
+        return Result.success(PageInfo.PageInfo(page));
+    }
+
+    @Override
+    public Result updatePassword(XspaceUserDTO param) {
+
+        XspaceUser xspaceUser = this.getById(param.getId());
+        if(Objects.isNull(xspaceUser)){
+            return Result.failure(ResultCode.USER_NOT_EXIST);
+        }
+
+        String password = Base64Converter.decode(Base64Converter.subText(param.getNewPassword()));
+        if(!PasswordUtil.checkPasswordFormal(password)){
+            throw new BusinessException(ResultCode.PASSWORD_TYPE_ERROR);
+        }
+        String passwordCode = SecurityUtil.MD5(password);
+
+        LambdaUpdateWrapper<User> wrapper = new LambdaUpdateWrapper<>();
+        wrapper.eq(User::getId,xspaceUser.getUserId());
+        wrapper.set(User::getPassword,passwordCode);
+        userService.update(wrapper);
+
+        return Result.success();
+    }
+}

+ 17 - 0
src/main/java/com/fdkankan/jp/xspace/util/PasswordUtil.java

@@ -0,0 +1,17 @@
+package com.fdkankan.jp.xspace.util;
+
+public class PasswordUtil {
+
+    /**
+     * 校验密码格式 8-16个字符,不包含空格,必须包含数字,字母或字符至少两种
+     *
+     * @param value
+     * @return
+     * @author Super WD
+     */
+    public static boolean checkPasswordFormal(String value) {
+        String regex = "^(?=.*\\d)(?!^[0-9]+$)(?!^[A-z]+$)(?!^[^A-z0-9]+$)^[^\\s\\u4e00-\\u9fa5]{8,16}";
+        return value.matches(regex);
+    }
+
+}

+ 26 - 0
src/main/java/com/fdkankan/jp/xspace/util/UniqueStringGenerator.java

@@ -0,0 +1,26 @@
+package com.fdkankan.jp.xspace.util;
+
+public class UniqueStringGenerator {
+    private static final int MAX_GENERATE_COUNT = 99999;
+
+    private static int generateCount = 0;
+
+    private UniqueStringGenerator() {}
+
+    public static synchronized String getUniqueString() {
+
+        if(generateCount > MAX_GENERATE_COUNT) generateCount = 0;
+
+        String uniqueNumber = Long.toString(System.currentTimeMillis()) + Integer.toString(generateCount);
+
+        generateCount++;
+
+        return uniqueNumber;
+
+    }
+
+     public static void main(String[] args) {
+         System.out.println(getUniqueString());
+     }
+
+}

+ 9 - 0
src/main/java/com/fdkankan/jp/xspace/vo/LoginVO.java

@@ -0,0 +1,9 @@
+package com.fdkankan.jp.xspace.vo;
+
+import lombok.Data;
+
+@Data
+public class LoginVO {
+    private String token;
+    private UserVO user;
+}

+ 17 - 0
src/main/java/com/fdkankan/jp/xspace/vo/SceneVO.java

@@ -0,0 +1,17 @@
+package com.fdkankan.jp.xspace.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class SceneVO {
+
+    private String title;
+    private String num;
+    private String userName;
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+
+}

+ 44 - 0
src/main/java/com/fdkankan/jp/xspace/vo/UserVO.java

@@ -0,0 +1,44 @@
+package com.fdkankan.jp.xspace.vo;
+
+import lombok.Data;
+
+import java.util.Set;
+
+@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 Integer ssDownloadNum;                //深时已下载场景总数
+    private Integer ssDownloadNumTotal;           //深时总的下载场景总数
+    private Long incrementBindNum;           //已绑定的会员权益数量
+    private Long incrementNum;               //会员权益数量
+
+    private Long cameraId;
+    private Integer cameraLogin;
+
+    private Long sceneCount;
+    private Long expansionTotal;
+
+    private String password;        //app端需要使用
+
+    private String country;
+
+    private Set<Long> roleIds;
+
+    private String roleName;
+
+    private String createTime;
+    private String registerTime;
+
+    private Long companyId;
+
+    private String companyName;
+
+}

+ 19 - 0
src/main/java/com/fdkankan/jp/xspace/vo/XspaceUserVO.java

@@ -0,0 +1,19 @@
+package com.fdkankan.jp.xspace.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class XspaceUserVO {
+
+    private Long id;
+    private String companyName;
+    private String nickName;
+    private String userName;
+    private String roleName;
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+
+}

+ 22 - 0
src/main/java/com/fdkankan/jp/xspace/vo/XspaceVO.java

@@ -0,0 +1,22 @@
+package com.fdkankan.jp.xspace.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class XspaceVO {
+
+    private String id;
+    private String title;
+    private String num;
+    private String serial;
+    private String creator;
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date updateTime;
+    private Integer status;
+
+}

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

@@ -0,0 +1,27 @@
+spring:
+  application:
+    name: 4dkankan-project-xspace
+  cloud:
+    nacos:
+      server-addr: 120.24.144.164:8848
+      config:
+        file-extension: yaml
+        namespace: 4dkankan-jp-dev
+        shared-configs:
+          - data-id: common-redis-config.yaml
+            group: DEFAULT_GROUP
+            refresh: true
+
+          - data-id: common-rabbitmq-config.yaml
+            group: DEFAULT_GROUP
+            refresh: true
+
+          - data-id: common-db-config.yaml
+            group: DEFAULT_GROUP
+            refresh: true
+
+          - data-id: common-fyun-config.yaml
+            group: DEFAULT_GROUP
+            refresh: true
+      discovery:
+        namespace: ${spring.cloud.nacos.config.namespace}

+ 27 - 0
src/main/resources/bootstrap-prod.yml

@@ -0,0 +1,27 @@
+spring:
+  application:
+    name: 4dkankan-project-xspace
+  cloud:
+    nacos:
+      server-addr: 172.16.30.42:8848
+      config:
+        file-extension: yaml
+        namespace: 4dkankan-jp-v4
+        shared-configs:
+          - data-id: common-redis-config.yaml
+            group: DEFAULT_GROUP
+            refresh: true
+
+          - data-id: common-rabbitmq-config.yaml
+            group: DEFAULT_GROUP
+            refresh: true
+
+          - data-id: common-db-config.yaml
+            group: DEFAULT_GROUP
+            refresh: true
+
+          - data-id: common-fyun-config.yaml
+            group: DEFAULT_GROUP
+            refresh: true
+      discovery:
+        namespace: ${spring.cloud.nacos.config.namespace}

+ 27 - 0
src/main/resources/bootstrap-test.yml

@@ -0,0 +1,27 @@
+spring:
+  application:
+    name: 4dkankan-project-xspace
+  cloud:
+    nacos:
+      server-addr: 120.24.144.164:8848
+      config:
+        file-extension: yaml
+        namespace: 4dkankan-jp-v4-test
+        shared-configs:
+          - data-id: common-redis-config.yaml
+            group: DEFAULT_GROUP
+            refresh: true
+
+          - data-id: common-rabbitmq-config.yaml
+            group: DEFAULT_GROUP
+            refresh: true
+
+          - data-id: common-db-config.yaml
+            group: DEFAULT_GROUP
+            refresh: true
+
+          - data-id: common-fyun-config.yaml
+            group: DEFAULT_GROUP
+            refresh: true
+      discovery:
+        namespace: ${spring.cloud.nacos.config.namespace}

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

@@ -0,0 +1,10 @@
+spring:
+  profiles:
+    active: test
+
+jasypt:
+  encryptor:
+    password: xxx #?
+    algorithm: PBEWithMD5AndDES
+    iv-generator-classname: org.jasypt.iv.NoIvGenerator
+

+ 5 - 0
src/main/resources/mapper/RoleMapper.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.jp.xspace.mapper.IRoleMapper">
+
+</mapper>

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

+ 33 - 0
src/main/resources/mapper/ScenePlusMapper.xml

@@ -0,0 +1,33 @@
+<?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.jp.xspace.mapper.IScenePlusMapper">
+
+    <select id="pageSgMesh" parameterType="com.fdkankan.jp.xspace.dto.SceneDTO"  resultType="com.fdkankan.jp.xspace.entity.ScenePlus">
+        SELECT
+        p.title, p.num,p.create_time
+        FROM t_scene_plus p
+        LEFT JOIN t_scene_plus_ext e ON p.`id` = e.`plus_id`
+        WHERE p.rec_status = 'A'
+        AND p.`scene_source` = 5
+        AND e.`is_obj` = 1
+        AND p.`scene_status` = - 2
+        AND p.`pay_status` = 1
+        AND NOT EXISTS (
+            SELECT 1 FROM t_scene_xspace xs WHERE xs.`num` = p.`num` AND xs.`user_id` = p.`user_id`
+        )
+        AND p.`user_id` = #{param.userId}
+        <if test="param.timeStart != null">
+            AND p.`create_time` >= #{param.timeStart}
+        </if>
+        <if test="param.timeEnd != null">
+            AND p.`create_time` <![CDATA[ <= ]]> #{param.timeEnd}
+        </if>
+        <if test="param.num != null and param.num != ''">
+            AND p.`num` LIKE CONCAT('%', #{param.num}, '%')
+        </if>
+        <if test="param.title != null and param.title != ''">
+            AND p.`title` LIKE CONCAT('%', #{param.title}, '%')
+        </if>
+    </select>
+
+</mapper>

+ 34 - 0
src/main/resources/mapper/SceneXspaceMapper.xml

@@ -0,0 +1,34 @@
+<?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.jp.xspace.mapper.ISceneXspaceMapper">
+
+    <select id="pageXspace" resultType="com.fdkankan.jp.xspace.vo.XspaceVO" parameterType="com.fdkankan.jp.xspace.dto.XspacePageDTO">
+        SELECT sx.id, p.`title`,sx.`num`,sx.`serial`,u.`nick_name` as creator ,sx.`create_time`,sx.`update_time`,sx.`status`
+        FROM t_scene_xspace sx
+        LEFT JOIN t_scene_plus p ON sx.`num` = p.`num`
+        LEFT JOIN t_user u ON sx.`user_id` = u.`id`
+        WHERE sx.`rec_status` = 'A'
+        <if test="param.userId != null">
+            AND sx.`user_id` = #{param.userId}
+        </if>
+        <if test="param.companyId != null">
+            AND u.`company_id` = #{param.companyId}
+        </if>
+        <if test="param.title != null and param.title != ''">
+            AND p.`title` LIKE concat('%', #{param.title}, '%')
+        </if>
+        <if test="param.creator != null and param.creator != ''">
+            AND u.`nick_name` LIKE concat('%', #{param.creator}, '%')
+        </if>
+        <if test="param.timeStart != null">
+            AND sx.`create_time` >= #{param.timeStart}
+        </if>
+        <if test="param.timeEnd != null">
+            AND sx.`create_time` <![CDATA[ <= ]]> #{param.timeEnd}
+        </if>
+        <if test="param.status != null">
+            AND sx.`status` = #{param.status}
+        </if>
+    </select>
+
+</mapper>

+ 5 - 0
src/main/resources/mapper/UserRoleMapper.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.jp.xspace.mapper.IUserRoleMapper">
+
+</mapper>

+ 21 - 0
src/main/resources/mapper/XspaceUserMapper.xml

@@ -0,0 +1,21 @@
+<?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.jp.xspace.mapper.IXspaceUserMapper">
+
+    <select id="pageUser" parameterType="com.fdkankan.jp.xspace.dto.PageXspaceUserDTO" resultType="com.fdkankan.jp.xspace.vo.XspaceUserVO">
+        SELECT xu.`id`, c.`company_name`, u.`nick_name`,u.`user_name`, r.`role_name`,xu.`create_time`
+        FROM t_xspace_user xu
+                 LEFT JOIN t_user u ON xu.`user_id` = u.`id`
+                 LEFT JOIN t_company c ON u.`company_id` = c.`id`
+                 LEFT JOIN t_user_role ur ON u.`id` = ur.`user_id`
+                 LEFT JOIN t_role r ON  ur.`role_id` = r.`id`
+        WHERE xu.rec_status = 'A'
+        <if test="param.userName != null and param.userName != ''">
+            and u.`user_name` LIKE concat('%', #{param.userName}, '%')
+        </if>
+        <if test="param.nickName != null and param.nickName != ''">
+            AND u.`nick_name` LIKE concat('%', #{param.nickName}, '%')
+        </if>
+    </select>
+
+</mapper>

+ 13 - 0
src/test/java/com/fdkankan/jp/xspace/ApplicationTests.java

@@ -0,0 +1,13 @@
+package com.fdkankan.jp.xspace;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+
+@SpringBootTest
+class ApplicationTests {
+
+	@Test
+	void contextLoads() {
+	}
+
+}