xiewj 2 năm trước cách đây
mục cha
commit
c89eabb116
27 tập tin đã thay đổi với 1346 bổ sung0 xóa
  1. 30 0
      .gitignore
  2. 260 0
      pom.xml
  3. 19 0
      src/main/java/com/fdkankan/openApi/OpenApiApplication.java
  4. 11 0
      src/main/java/com/fdkankan/openApi/component/ValidateApi.java
  5. 50 0
      src/main/java/com/fdkankan/openApi/component/ValidateApiAOP.java
  6. 44 0
      src/main/java/com/fdkankan/openApi/config/MyBatisPlusConfig.java
  7. 47 0
      src/main/java/com/fdkankan/openApi/config/SaTokenConfigure.java
  8. 10 0
      src/main/java/com/fdkankan/openApi/constant/HttpStatus.java
  9. 39 0
      src/main/java/com/fdkankan/openApi/controller/TestController.java
  10. 72 0
      src/main/java/com/fdkankan/openApi/entity/laser/LaserBaseEntity.java
  11. 72 0
      src/main/java/com/fdkankan/openApi/entity/laser/SceneEntity.java
  12. 54 0
      src/main/java/com/fdkankan/openApi/entity/system/SystemBaseEntity.java
  13. 29 0
      src/main/java/com/fdkankan/openApi/entity/system/User.java
  14. 45 0
      src/main/java/com/fdkankan/openApi/exception/GlobalExceptionHandler.java
  15. 22 0
      src/main/java/com/fdkankan/openApi/mapper/laser/SceneMapper.java
  16. 20 0
      src/main/java/com/fdkankan/openApi/mapper/system/IUserMapper.java
  17. 16 0
      src/main/java/com/fdkankan/openApi/service/laser/SceneService.java
  18. 53 0
      src/main/java/com/fdkankan/openApi/service/laser/impl/SceneServiceImpl.java
  19. 21 0
      src/main/java/com/fdkankan/openApi/service/system/IUserService.java
  20. 57 0
      src/main/java/com/fdkankan/openApi/service/system/impl/UserServiceImpl.java
  21. 140 0
      src/main/java/com/fdkankan/openApi/util/JwtUtil.java
  22. 32 0
      src/main/java/com/fdkankan/openApi/util/TokenUtil.java
  23. 43 0
      src/main/resources/bootstrap-dev.yml
  24. 83 0
      src/main/resources/bootstrap-local.yml
  25. 34 0
      src/main/resources/bootstrap-pro.yml
  26. 40 0
      src/main/resources/bootstrap-test.yml
  27. 3 0
      src/main/resources/bootstrap.yml

+ 30 - 0
.gitignore

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

+ 260 - 0
pom.xml

@@ -0,0 +1,260 @@
+<?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>com.fdkankan</groupId>
+        <artifactId>4dkankan-parent</artifactId>
+        <version>2.0.0-SNAPSHOT</version>
+    </parent>
+    <artifactId>4dkankan-center-openApi</artifactId>
+    <version>2.0.0-SNAPSHOT</version>
+    <name>4dkankan-center-openApi</name>
+    <description>公开接口中心</description>
+
+    <properties>
+        <java.version>1.8</java.version>
+        <hutool-version>5.7.17</hutool-version>
+        <spring.cloud-version>Hoxton.SR8</spring.cloud-version>
+        <fdkankan.common-version>2.0.0-SNAPSHOT</fdkankan.common-version>
+        <fastjson-version>1.2.83</fastjson-version>
+        <servlet-api-version>2.4</servlet-api-version>
+        <spring.boot-mybatis-version>1.3.2</spring.boot-mybatis-version>
+        <spring.plugin.metadata-version>1.2.0.RELEASE</spring.plugin.metadata-version>
+        <jwt-version>3.10.3</jwt-version>
+        <ant-version>1.8.2</ant-version>
+        <shiro.version>1.7.1</shiro.version>
+        <version>0.6.0</version>
+        <jjwt.version>0.6.0</jjwt.version>
+        <protobuf-java.version>3.2.0</protobuf-java.version>
+        <commons-pool2.version>2.5.0</commons-pool2.version>
+        <zxing.version>2.1</zxing.version>
+    </properties>
+    <dependencies>
+        <dependency>
+            <groupId>com.fdkankan</groupId>
+            <artifactId>4dkankan-common-web</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-db</artifactId>-->
+<!--            <version>3.0.0-SNAPSHOT</version>-->
+<!--        </dependency>-->
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+            <version>8.0.25</version>
+            <scope>runtime</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>druid-spring-boot-starter</artifactId>
+            <version>1.1.22</version>
+        </dependency>
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
+            <version>3.6.1</version>
+        </dependency>
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-boot-starter</artifactId>
+            <version>3.5.2</version>
+        </dependency>
+        <!-- Sa-Token 权限认证,在线文档:https://sa-token.cc -->
+        <dependency>
+            <groupId>cn.dev33</groupId>
+            <artifactId>sa-token-spring-boot-starter</artifactId>
+            <version>1.34.0</version>
+        </dependency>
+
+        <dependency>
+            <groupId>cn.dev33</groupId>
+            <artifactId>sa-token-dao-redis-jackson</artifactId>
+            <version>1.34.0</version>
+        </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-fyun-s3</artifactId>
+            <version>3.0.0-SNAPSHOT</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.fdkankan</groupId>
+            <artifactId>4dkankan-utils-model</artifactId>
+            <version>3.0.0-SNAPSHOT</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.alibaba.csp</groupId>
+            <artifactId>sentinel-datasource-nacos</artifactId>
+            <version>1.7.2</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.yomahub</groupId>
+            <artifactId>tlog-web-spring-boot-starter</artifactId>
+            <version>1.3.6</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.yomahub</groupId>
+            <artifactId>tlog-feign-spring-boot-starter</artifactId>
+            <version>1.3.6</version>
+        </dependency>
+
+        <!--        htt请求工具-->
+        <dependency>
+            <groupId>com.dtflys.forest</groupId>
+            <artifactId>forest-spring-boot-starter</artifactId>
+            <version>1.5.19</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.google.firebase</groupId>
+            <artifactId>firebase-admin</artifactId>
+            <version>6.8.1</version>
+        </dependency>
+
+    </dependencies>
+    <dependencyManagement>
+
+        <dependencies>
+            <dependency>
+                <groupId>com.alibaba.cloud</groupId>
+                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
+                <version>2.2.7.RELEASE</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+
+            <dependency>
+                <groupId>org.springframework.cloud</groupId>
+                <artifactId>spring-cloud-dependencies</artifactId>
+                <version>${spring.cloud-version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+            <dependency>
+                <groupId>cn.hutool</groupId>
+                <artifactId>hutool-all</artifactId>
+                <version>${hutool-version}</version>
+            </dependency>
+
+            <dependency>
+                <groupId>com.alibaba</groupId>
+                <artifactId>fastjson</artifactId>
+                <version>${fastjson-version}</version>
+            </dependency>
+
+            <dependency>
+                <groupId>javax.servlet</groupId>
+                <artifactId>servlet-api</artifactId>
+                <version>${servlet-api-version}</version>
+            </dependency>
+
+            <dependency>
+                <groupId>org.mybatis.spring.boot</groupId>
+                <artifactId>mybatis-spring-boot-starter</artifactId>
+                <version>${spring.boot-mybatis-version}</version>
+            </dependency>
+
+            <dependency>
+                <groupId>org.springframework.plugin</groupId>
+                <artifactId>spring-plugin-metadata</artifactId>
+                <version>${spring.plugin.metadata-version}</version>
+            </dependency>
+
+            <dependency>
+                <groupId>com.auth0</groupId>
+                <artifactId>java-jwt</artifactId>
+                <version>${jwt-version}</version>
+            </dependency>
+
+            <dependency>
+                <groupId>org.apache.ant</groupId>
+                <artifactId>ant</artifactId>
+                <version>${ant-version}</version>
+            </dependency>
+
+            <dependency>
+                <groupId>org.apache.shiro</groupId>
+                <artifactId>shiro-spring</artifactId>
+                <version>${shiro.version}</version>
+            </dependency>
+
+            <dependency>
+                <groupId>io.jsonwebtoken</groupId>
+                <artifactId>jjwt</artifactId>
+                <version>${jjwt.version}</version>
+            </dependency>
+
+            <dependency>
+                <groupId>com.google.protobuf</groupId>
+                <artifactId>protobuf-java</artifactId>
+                <version>${protobuf-java.version}</version>
+            </dependency>
+
+            <dependency>
+                <groupId>org.apache.commons</groupId>
+                <artifactId>commons-lang3</artifactId>
+                <version>${commons-lang3.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.commons</groupId>
+                <artifactId>commons-pool2</artifactId>
+                <version>${commons-pool2.version}</version>
+            </dependency>
+
+            <dependency>
+                <groupId>org.apache.logging.log4j</groupId>
+                <artifactId>log4j-api</artifactId>
+                <version>2.17.0</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.logging.log4j</groupId>
+                <artifactId>log4j-to-slf4j</artifactId>
+                <version>2.17.0</version>
+            </dependency>
+
+        </dependencies>
+    </dependencyManagement>
+
+
+    <build>
+        <finalName>${artifactId}</finalName>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

+ 19 - 0
src/main/java/com/fdkankan/openApi/OpenApiApplication.java

@@ -0,0 +1,19 @@
+package com.fdkankan.openApi;
+
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.scheduling.annotation.EnableScheduling;
+
+@SpringBootApplication
+@EnableScheduling
+@ComponentScan(basePackages = {"com.fdkankan.*"})
+@MapperScan({"com.fdkankan.openApi.mapper.laser","com.fdkankan.openApi.mapper.fdkankan","com.fdkankan.openApi.mapper.system"})
+public class OpenApiApplication {
+
+	public static void main(String[] args) {
+		SpringApplication.run(OpenApiApplication.class, args);
+	}
+
+}

+ 11 - 0
src/main/java/com/fdkankan/openApi/component/ValidateApi.java

@@ -0,0 +1,11 @@
+package com.fdkankan.openApi.component;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Target(ElementType.METHOD)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface ValidateApi {
+}

+ 50 - 0
src/main/java/com/fdkankan/openApi/component/ValidateApiAOP.java

@@ -0,0 +1,50 @@
+package com.fdkankan.openApi.component;
+
+import cn.hutool.core.util.StrUtil;
+import com.fdkankan.common.constant.ErrorCode;
+import com.fdkankan.common.exception.BusinessException;
+import com.fdkankan.openApi.util.TokenUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Pointcut;
+import org.aspectj.lang.reflect.MethodSignature;
+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.lang.reflect.Method;
+import java.util.Objects;
+
+@Component
+@Aspect
+public class ValidateApiAOP {
+    @Pointcut("@annotation(com.fdkankan.openApi.component.ValidateApi)")
+    public void pointCut(){}
+    @Around("pointCut()")
+    public Object handle(ProceedingJoinPoint proceedingJoinPoint) throws Throwable{
+        //获取请求对象
+        ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
+        HttpServletRequest request = servletRequestAttributes.getRequest();
+        //处理
+        //请求头
+        String authorization =  request.getHeader("Authorization");
+
+        if(StrUtil.isEmpty(authorization)){
+            throw new BusinessException(ErrorCode.AUTH_FAIL);
+        }
+
+        if (!TokenUtil.validateToken(authorization)){
+            throw new BusinessException(ErrorCode.AUTH_FAIL);
+        }
+
+        //注解处理
+        Class<?> clazz = proceedingJoinPoint.getTarget().getClass();
+        //方法签名
+        MethodSignature methodSignature = (MethodSignature) proceedingJoinPoint.getSignature();
+        Method method = clazz.getDeclaredMethod(methodSignature.getName(), methodSignature.getParameterTypes());
+        return proceedingJoinPoint.proceed();
+    }
+}

+ 44 - 0
src/main/java/com/fdkankan/openApi/config/MyBatisPlusConfig.java

@@ -0,0 +1,44 @@
+package com.fdkankan.openApi.config;
+
+import com.baomidou.mybatisplus.annotation.DbType;
+import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
+import com.baomidou.mybatisplus.extension.plugins.inner.BlockAttackInnerInterceptor;
+import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+
+@Configuration
+@EnableTransactionManagement
+public class MyBatisPlusConfig {
+    /*
+     * 分页插件,自动识别数据库类型
+     * 多租户,请参考官网【插件扩展】
+     */
+    /**
+     * 新的分页插件,一缓和二缓遵循mybatis的规则,需要设置 MybatisConfiguration#useDeprecatedExecutor = false 避免缓存出现问题
+     */
+
+    @Bean
+    public MybatisPlusInterceptor mybatisPlusInterceptor() {
+        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
+        //向Mybatis过滤器链中添加分页拦截器
+//        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
+        //还可以添加其他的拦截器
+        interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
+
+        // 阻断插件
+        interceptor.addInnerInterceptor(blockAttackInnerInterceptor());
+        return interceptor;
+    }
+
+    /**
+     * 如果是对全表的删除或更新操作,就会终止该操作
+     * https://baomidou.com/guide/interceptor-block-attack.html
+     */
+    public BlockAttackInnerInterceptor blockAttackInnerInterceptor()
+    {
+        return new BlockAttackInnerInterceptor();
+    }
+}

+ 47 - 0
src/main/java/com/fdkankan/openApi/config/SaTokenConfigure.java

@@ -0,0 +1,47 @@
+package com.fdkankan.openApi.config;
+
+import cn.dev33.satoken.interceptor.SaInterceptor;
+import cn.dev33.satoken.router.SaRouter;
+import cn.dev33.satoken.stp.StpUtil;
+import com.fdkankan.common.constant.ErrorCode;
+import com.fdkankan.common.exception.BusinessException;
+import com.fdkankan.redis.util.RedisUtil;
+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.WebMvcConfigurer;
+
+/**
+ * @author Xiewj
+ * @date 2022/12/19
+ */
+
+/**
+ * [Sa-Token 权限认证] 配置类
+ */
+@Configuration
+public class SaTokenConfigure implements WebMvcConfigurer {
+   // 注册 Sa-Token 拦截器,打开注解式鉴权功能
+   @Autowired
+   private RedisUtil redisUtil;
+   @Override
+   public void addInterceptors(InterceptorRegistry registry) {
+      // 注册 Sa-Token 拦截器,打开注解式鉴权功能
+      registry.addInterceptor(new SaInterceptor( handler -> {
+         SaRouter
+                 .match("/**")
+                 .notMatch("/test")
+                 .check( r -> {
+                    if (!redisUtil.hasKey("token#"+StpUtil.getTokenInfo().tokenValue)) {
+                       StpUtil.logout();
+                       throw new BusinessException(ErrorCode.USER_NOT_LOGIN);
+                    }
+                 } );
+      })).addPathPatterns("/**");
+   }
+
+
+
+}
+
+

+ 10 - 0
src/main/java/com/fdkankan/openApi/constant/HttpStatus.java

@@ -0,0 +1,10 @@
+package com.fdkankan.openApi.constant;
+
+/**
+ * 返回状态码
+ *
+ * @author fdkk
+ */
+public enum HttpStatus {
+
+}

+ 39 - 0
src/main/java/com/fdkankan/openApi/controller/TestController.java

@@ -0,0 +1,39 @@
+package com.fdkankan.openApi.controller;
+
+import cn.dev33.satoken.annotation.SaCheckLogin;
+import cn.dev33.satoken.annotation.SaIgnore;
+import com.fdkankan.openApi.entity.laser.SceneEntity;
+import com.fdkankan.openApi.entity.system.User;
+import com.fdkankan.openApi.service.laser.SceneService;
+import com.fdkankan.openApi.service.system.IUserService;
+import com.fdkankan.web.controller.BaseController;
+import com.fdkankan.web.response.ResultData;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @author Xiewj
+ * @date 2023/2/9
+ */
+@RestController
+@RequestMapping("/test")
+@SaCheckLogin
+public class TestController extends BaseController {
+    @Autowired
+    private SceneService sceneService;
+    
+    @Autowired
+    private IUserService userService;
+    
+
+    @GetMapping("/test")
+    @SaIgnore
+    public ResultData test(){
+        SceneEntity bySceneCode = sceneService.findBySceneCode("SS-t-yotkjVf55A");
+        User byUserName = userService.findByUserName("18666186515");
+
+        return ResultData.ok("ok");
+    }
+}

+ 72 - 0
src/main/java/com/fdkankan/openApi/entity/laser/LaserBaseEntity.java

@@ -0,0 +1,72 @@
+package com.fdkankan.openApi.entity.laser;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Entity基类
+ *
+ * @author fdkk
+ */
+@Data
+public abstract class LaserBaseEntity implements Serializable
+{
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value="id", type= IdType.AUTO)
+    private Long id;
+
+    /** 搜索值 */
+    @TableField(exist = false)
+    private String searchValue;
+
+    /** 创建者 */
+    private String createBy;
+
+    /** 创建时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")//set
+    private Date createTime;
+
+    /** 更新者 */
+    private String updateBy;
+
+    /** 更新时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")//set
+    private Date updateTime;
+
+    /** 备注 */
+    private String remark;
+
+    @TableField(value = "deleted")
+    @TableLogic(value = "0",delval = "1")
+    private Integer deleted;
+
+
+    /** 请求参数 */
+    @TableField(exist = false)
+    private Map<String, Object> params;
+
+
+    public Map<String, Object> getParams()
+    {
+        if (params == null)
+        {
+            params = new HashMap<>();
+        }
+        return params;
+    }
+
+    public void setParams(Map<String, Object> params)
+    {
+        this.params = params;
+    }
+}

+ 72 - 0
src/main/java/com/fdkankan/openApi/entity/laser/SceneEntity.java

@@ -0,0 +1,72 @@
+package com.fdkankan.openApi.entity.laser;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @author Xiewj
+ * @date 2023/2/10
+ */
+@Data
+@TableName("t_scene")
+public class SceneEntity extends LaserBaseEntity {
+
+
+    private String sceneCode;
+
+    private String path;
+
+    private Integer status;
+
+    private Integer showMode;
+
+    private Integer recount;
+
+    private String title;
+
+    private String childName;
+
+    private String snCode;
+
+    private Date shootTime;
+
+    private String webSite;
+
+    private Long userId;
+
+    private String userName;
+
+    private String initPic;
+
+    private String password;
+
+    private Boolean isOpen;
+
+    private Boolean isCopy;
+
+    private Boolean disableFloorPan;
+
+    private String lasUrl;
+    private String plyUrl;
+    private String objUrl;
+
+    private int buildObjStatus;
+
+    private Integer viewCount;
+
+    private Integer cooperationUserId;
+    private String cooperationUserName;
+
+    private String datasetId;
+
+    private int uploadCount;
+
+    private Date copyTime;
+
+    private String sceneVersion;
+    private Integer offlineStatus;
+    private Integer offlineVer;
+    private String offlineUrl;
+}

+ 54 - 0
src/main/java/com/fdkankan/openApi/entity/system/SystemBaseEntity.java

@@ -0,0 +1,54 @@
+package com.fdkankan.openApi.entity.system;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ * TODO
+ * </p>
+ *
+ * @author dengsixing
+ * @since 2022/2/15
+ **/
+@Data
+public class SystemBaseEntity implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 创建人id
+     */
+    @TableField("creater_id")
+    private Long createrId;
+
+    /**
+     * 创建时间
+     */
+    @TableField("create_time")
+    private Date createTime;
+
+    /**
+     * 修改人id
+     */
+    @TableField("updater_id")
+    private Long updaterId;
+
+    /**
+     * 修改时间
+     */
+    @TableField("update_time")
+    private Date updateTime;
+
+    /**
+     * 0-有效,1-删除, 2-禁用
+     */
+    @TableField("tb_status")
+    @TableLogic
+    private Integer tbStatus;
+
+}

+ 29 - 0
src/main/java/com/fdkankan/openApi/entity/system/User.java

@@ -0,0 +1,29 @@
+package com.fdkankan.openApi.entity.system;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+/**
+ * @author Xiewj
+ * @date 2022/12/19
+ */
+@Data
+@TableName("t_users")
+public class User extends SystemBaseEntity {
+   @TableId(value = "id", type = IdType.AUTO)
+   private Integer id;
+
+   /**
+    * 账号
+    */
+   @TableField("user_name")
+   private String userName;
+
+   @TableField("head")
+   private String head;
+
+
+}

+ 45 - 0
src/main/java/com/fdkankan/openApi/exception/GlobalExceptionHandler.java

@@ -0,0 +1,45 @@
+package com.fdkankan.openApi.exception;
+
+import cn.dev33.satoken.exception.SaTokenException;
+import cn.hutool.core.util.NumberUtil;
+import com.fdkankan.common.constant.ErrorCode;
+import com.fdkankan.common.exception.BusinessException;
+import com.fdkankan.web.response.ResultData;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+
+/**
+ * 全局异常处理器
+ */
+@RestControllerAdvice
+@Slf4j
+public class GlobalExceptionHandler {
+
+    /**
+     * 处理未知异常
+     */
+    @ResponseBody
+    @ExceptionHandler(value = Exception.class)
+    public ResultData exceptionHandler(Exception e) throws Exception {
+        log.error("服务错误:", e);
+        return ResultData.error( 500, "系统错误");
+    }
+    @ExceptionHandler(SaTokenException.class)
+    public ResultData handlerSaTokenException(SaTokenException e) {
+        if( NumberUtil.equals(e.getCode() , 11012)|| NumberUtil.equals(e.getCode() , 11011)) {
+            return ResultData.error(ErrorCode.USER_NOT_LOGIN);
+        }
+        return ResultData.error(e.getCode(),e.getMessage());
+    }
+    /**
+     * 处理业务异常
+     */
+    @ResponseBody
+    @ExceptionHandler(value = BusinessException.class)
+    public ResultData businessExceptionHandler(BusinessException e) {
+        log.error("业务异常code:{},message:{}", e.getCode(), e.getMessage());
+        return ResultData.error(e.getCode(), e.getMessage());
+    }
+}

+ 22 - 0
src/main/java/com/fdkankan/openApi/mapper/laser/SceneMapper.java

@@ -0,0 +1,22 @@
+package com.fdkankan.openApi.mapper.laser;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fdkankan.openApi.entity.laser.SceneEntity;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Update;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * 参数配置 数据层
+ *
+ * @author fdkk
+ */
+@Mapper
+@Component("SceneMapper")
+public interface SceneMapper extends BaseMapper<SceneEntity> {
+
+}

+ 20 - 0
src/main/java/com/fdkankan/openApi/mapper/system/IUserMapper.java

@@ -0,0 +1,20 @@
+package com.fdkankan.openApi.mapper.system;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fdkankan.openApi.entity.system.User;
+import org.apache.ibatis.annotations.Mapper;
+import org.springframework.stereotype.Component;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2023年2月10日14:38:33
+ */
+@Mapper
+@Component("IUserMapper")
+public interface IUserMapper extends BaseMapper<User> {
+
+}

+ 16 - 0
src/main/java/com/fdkankan/openApi/service/laser/SceneService.java

@@ -0,0 +1,16 @@
+package com.fdkankan.openApi.service.laser;
+
+import cn.hutool.core.date.DateTime;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fdkankan.openApi.entity.laser.SceneEntity;
+
+import java.io.Serializable;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Created by Xiewj on 2021/7/28 0028 9:10
+ */
+public interface SceneService extends IService<SceneEntity> {
+    SceneEntity findBySceneCode(String sceneCode);
+}

+ 53 - 0
src/main/java/com/fdkankan/openApi/service/laser/impl/SceneServiceImpl.java

@@ -0,0 +1,53 @@
+package com.fdkankan.openApi.service.laser.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.ConcurrentHashSet;
+import cn.hutool.core.date.DateField;
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.file.FileReader;
+import cn.hutool.core.io.file.FileWriter;
+import cn.hutool.core.thread.ThreadUtil;
+import cn.hutool.core.util.ArrayUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.core.util.ZipUtil;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.dynamic.datasource.annotation.DS;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fdkankan.openApi.entity.laser.SceneEntity;
+import com.fdkankan.openApi.mapper.laser.SceneMapper;
+import com.fdkankan.openApi.service.laser.SceneService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.Serializable;
+import java.util.*;
+import java.util.concurrent.TimeUnit;
+import java.util.regex.Matcher;
+
+
+/**
+ * Created by Xiewj on 2021/7/28 0028 9:10
+ */
+@Slf4j
+@DS("laser")
+@Service
+public class SceneServiceImpl extends ServiceImpl<SceneMapper, SceneEntity> implements SceneService {
+    @Override
+    public SceneEntity findBySceneCode(String sceneCode) {
+        LambdaQueryWrapper<SceneEntity> wrapper=new LambdaQueryWrapper<>();
+        wrapper.eq(SceneEntity::getSceneCode,sceneCode);
+        return getOne((wrapper));
+    }
+}
+

+ 21 - 0
src/main/java/com/fdkankan/openApi/service/system/IUserService.java

@@ -0,0 +1,21 @@
+package com.fdkankan.openApi.service.system;
+
+import com.baomidou.dynamic.datasource.annotation.DS;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fdkankan.openApi.entity.system.User;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author 
+ * @since  2022年12月19日09:44:17
+ */
+public interface IUserService extends IService<User> {
+
+    User findByUserName(String userName);
+    User findByUserName(String userName,Integer fdkkId,String head);
+    User findByTokenCovUserName(String token);
+
+}

+ 57 - 0
src/main/java/com/fdkankan/openApi/service/system/impl/UserServiceImpl.java

@@ -0,0 +1,57 @@
+package com.fdkankan.openApi.service.system.impl;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.dynamic.datasource.annotation.DS;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fdkankan.openApi.entity.system.User;
+import com.fdkankan.openApi.mapper.system.IUserMapper;
+import com.fdkankan.openApi.service.system.IUserService;
+import com.fdkankan.openApi.util.JwtUtil;
+import org.springframework.stereotype.Service;
+
+@DS("system")
+@Service
+public class UserServiceImpl extends ServiceImpl<IUserMapper, User> implements IUserService {
+
+    @Override
+    public User findByUserName(String userName) {
+        LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
+        wrapper.in(User::getUserName,userName);
+        User one = this.getOne(wrapper);
+        if (ObjectUtil.isNotNull(one)){
+            return one;
+        }else {
+            User u=new User();
+            u.setUserName(userName);
+            boolean save = save(u);
+            return u;
+        }
+    }
+
+    @Override
+    public User findByUserName(String userName, Integer fdkkId,String head) {
+        LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
+        wrapper.in(User::getUserName,userName);
+        User one = this.getOne(wrapper);
+        if (ObjectUtil.isNotNull(one)){
+            if (ObjectUtil.isNull(one.getHead())){
+                one.setHead(head);
+                updateById(one);
+            }
+            return one;
+        }else {
+            User u=new User();
+            u.setUserName(userName);
+            u.setId(fdkkId);
+            boolean save = save(u);
+            return u;
+        }
+    }
+
+    @Override
+    public User findByTokenCovUserName(String token) {
+        String userName = JwtUtil.getUserName(token);
+        return findByUserName(userName);
+    }
+}

+ 140 - 0
src/main/java/com/fdkankan/openApi/util/JwtUtil.java

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

+ 32 - 0
src/main/java/com/fdkankan/openApi/util/TokenUtil.java

@@ -0,0 +1,32 @@
+package com.fdkankan.openApi.util;
+
+import cn.hutool.core.codec.Base64;
+import cn.hutool.core.util.IdUtil;
+
+/**
+ * @author Xiewj
+ * @date 2023/2/10
+ */
+public class TokenUtil {
+
+   public static void main(String[] args) {
+      String token=  IdUtil.getSnowflake().nextIdStr();
+      System.out.println("token++++"+token);
+      String Authorization = Base64.encode((token).getBytes());
+      System.out.println("Authorization++++"+Authorization);
+      String Authorizations = Base64.decodeStr(Authorization);
+      System.out.println("Authorizationsss++++"+Authorizations);
+
+   }
+   public static String createToken(){
+      String token=  IdUtil.getSnowflake().nextIdStr();
+      String Authorization = Base64.encode((token).getBytes());
+      return Authorization;
+   }
+   public static String decodeToken(String authorization){
+      return  Base64.decodeStr(authorization);
+   }
+   public static boolean validateToken(String authorization){
+      return  true;
+   }
+}

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

@@ -0,0 +1,43 @@
+spring:
+  application:
+    name: 4dkankan-center-openApi
+  cloud:
+    nacos:
+      config:
+        server-addr: 192.168.0.47:8848
+        file-extension: yaml
+        namespace: 4dkankan-dev
+        extension-configs:
+          - data-id: 4dkankan-center-openApi.yaml
+            group: DEFAULT_GROUP
+            refresh: true
+        shared-configs:
+          - data-id: common-db-config.yaml
+            group: DEFAULT_GROUP
+            refresh: true
+
+          - data-id: common-redis-config.yaml
+            group: DEFAULT_GROUP
+            refresh: true
+          
+          #          - data-id: common-mq-config.yaml
+          #            group: DEFAULT_GROUP
+          #            refresh: true
+
+          - data-id: rabbitmq-config.yaml
+            group: DEFAULT_GROUP
+            refresh: true
+
+          - data-id: other-config.yaml
+            group: DEFAULT_GROUP
+            refresh: true
+
+          - data-id: common-upload-config.yaml
+            group: DEFAULT_GROUP
+            refresh: true
+      discovery:
+        server-addr: 192.168.0.47:8848
+        namespace: 4dkankan-dev
+        metadata:
+          management:
+            context-path: ${server.servlet.context-path}/actuator

+ 83 - 0
src/main/resources/bootstrap-local.yml

@@ -0,0 +1,83 @@
+spring:
+  application:
+    name: 4dkankan-center-openApi
+  cloud:
+    nacos:
+      config:
+        server-addr: 120.24.144.164:8848
+        file-extension: yaml
+        namespace: 4dkankan-v4-test
+        extension-configs:
+          - data-id: 4dkankan-center-openApi.yaml
+            group: DEFAULT_GROUP
+            refresh: true
+
+          - data-id: common-db-config.yaml
+            group: DEFAULT_GROUP
+            refresh: true
+
+          - data-id: common-redis-config.yaml
+            group: DEFAULT_GROUP
+            refresh: true
+
+          - data-id: common-fyun-config.yaml
+            group: DEFAULT_GROUP
+            refresh: true
+
+          - data-id: common-config.yaml
+            group: DEFAULT_GROUP
+            refresh: true
+      discovery:
+        namespace: ${spring.cloud.nacos.namespace}
+#    sentinel:
+#      transport:
+#        dashboard: 120.24.144.164:8888
+#        heartbeat-interval-ms: 500
+#        port: 8719
+#      eager: true #取消sentinel控制台懒加载
+#      #sentinel配置持久化nacos
+#      datasource:
+#        #流控规则
+#        flow:
+#          nacos:
+#            server-addr: ${spring.cloud.nacos.config.server-addr}
+#            dataId: ${spring.application.name}-flow-rules
+#            groupId: SENTINEL_GROUP
+#            namespace: 4dkankan-test
+#            rule-type: flow
+#        #熔断规则
+#        degrade:
+#          nacos:
+#            server-addr: ${spring.cloud.nacos.config.server-addr}
+#            dataId: ${spring.application.name}-degrade-rules
+#            groupId: SENTINEL_GROUP
+#            namespace: 4dkankan-test
+#            rule-type: degrade
+#      log:
+#        dir: ./logs # 默认值${home}/logs/csp/
+#        switch-pid: true # 日志带上线程id
+
+#开启feign熔断降级,如果没有开启,feign调用链路不会显示再sentinel控制中
+#feign:
+#  sentinel:
+#    enabled: true
+
+feign:
+  httpclient:
+    connection-timeout: 200000
+
+server:
+  tomcat:
+    threads:
+      min-spare: 100  #最小工作线程数
+      max: 1000       #最大工作线程数,建议配置为cpu核心数的200~250倍
+    accept-count: 1000   #能够接受的最大等待数,默认100。如果等待队列也被放满了,新的请求会被tomcat拒绝(connection refused)
+    max-connections: 2000   #同一时间,tomcat能够接受的最大连接数。一般这个值要大于(max-threads)+(accept-count)
+    connection-timeout: 3000  #连接建立超时时间
+
+
+
+
+
+
+

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

@@ -0,0 +1,34 @@
+spring:
+  application:
+    name: 4dkankan-center-openApi
+  cloud:
+    nacos:
+      config:
+        server-addr: 172.20.1.63:8848
+        file-extension: yaml
+        namespace: 4dkankan-v4-prod
+        extension-configs:
+          - data-id: 4dkankan-center-openApi.yaml
+            group: DEFAULT_GROUP
+            refresh: true
+        shared-configs:
+          - data-id: common-redis-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
+
+#management:
+#  endpoints:
+#    web:
+#      exposure:
+#        include: '*'
+#  endpoint:
+#    health:
+#      show-details: ALWAYS

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

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

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

@@ -0,0 +1,3 @@
+spring:
+  profiles:
+    active: test