CJ 1 anno fa
parent
commit
b04b0a0af2

+ 9 - 2
dtok-api/.idea/dataSources.xml

@@ -1,11 +1,18 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <project version="4">
   <component name="DataSourceManagerImpl" format="xml" multifile-model="true">
-    <data-source source="LOCAL" name="@rm-uf67t3vw28yp475tf1o.mysql.rds.aliyuncs.com" uuid="150fb651-f83e-421f-94c7-7a290165da30">
+    <data-source source="LOCAL" name="0@r-2ze1p354xrfsdettwkpd.tairpena.rds.aliyuncs.com" uuid="88a20a89-5ae0-4b29-8c24-2697af96bf02">
+      <driver-ref>redis</driver-ref>
+      <synchronize>true</synchronize>
+      <jdbc-driver>jdbc.RedisDriver</jdbc-driver>
+      <jdbc-url>jdbc:redis://r-2ze1p354xrfsdettwkpd.tairpena.rds.aliyuncs.com:6379/0</jdbc-url>
+      <working-dir>$ProjectFileDir$</working-dir>
+    </data-source>
+    <data-source source="LOCAL" name="dtok@rm-uf67t3vw28yp475tf1o.mysql.rds.aliyuncs.com" uuid="1599cdd0-c2b1-471d-bc7e-9dc5f424bb70">
       <driver-ref>mysql.8</driver-ref>
       <synchronize>true</synchronize>
       <jdbc-driver>com.mysql.cj.jdbc.Driver</jdbc-driver>
-      <jdbc-url>jdbc:mysql://rm-uf67t3vw28yp475tf1o.mysql.rds.aliyuncs.com:3306</jdbc-url>
+      <jdbc-url>jdbc:mysql://rm-uf67t3vw28yp475tf1o.mysql.rds.aliyuncs.com:3306/dtok?useUnicode=true&amp;characterEncoding=utf-8&amp;autoReconnect=true&amp;failOverReadOnly=false&amp;useSSL=false&amp;serverTimezone=GMT%2B8</jdbc-url>
       <working-dir>$ProjectFileDir$</working-dir>
     </data-source>
   </component>

+ 149 - 5
dtok-api/api/src/main/java/com/dtok/api/controller/ScriptController.java

@@ -1,13 +1,157 @@
 package com.dtok.api.controller;
 
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
+import cn.dev33.satoken.annotation.SaCheckRole;
+import cn.dev33.satoken.stp.StpUtil;
+import cn.hutool.core.lang.generator.UUIDGenerator;
+import com.dtok.entity.Account;
+import com.dtok.entity.LoginHistory;
+import com.dtok.entity.Script;
+import com.dtok.entity.ScriptHistory;
+import com.dtok.entity.params.ScriptFormData;
+import com.dtok.framework.base.BaseController;
+import com.dtok.framework.exception.BizExceptionEnum;
+import com.dtok.framework.response.ResponseData;
+import com.dtok.framework.util.ToolUtil;
+import com.dtok.repository.ScriptHistoryRepository;
+import com.dtok.repository.ScriptRepository;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.jpa.domain.Specification;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.persistence.Transient;
+import javax.persistence.criteria.Predicate;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.charset.StandardCharsets;
+import java.util.Date;
+import java.util.List;
+import java.util.Objects;
+import java.util.UUID;
 
 @RestController
 @RequestMapping("/script")
-public class ScriptController {
+@SaCheckRole(type = Account.FINAL_ROLE)
+public class ScriptController extends BaseController {
+
+    @Autowired
+    ScriptRepository scriptRepository;
+
+
+    @Autowired
+    ScriptHistoryRepository scriptHistoryRepository;
+
+
+    @GetMapping("/search")
+    public ResponseData search(@RequestParam("app") String app, @RequestParam("module") String module) {
+        Specification<Script> query = (root, query1, criteriaBuilder) -> {
+            Predicate predicate = criteriaBuilder.conjunction();
+            if (ToolUtil.isNotEmpty(app)) {
+                predicate.getExpressions().add(criteriaBuilder.or(criteriaBuilder.like(root.get("app"), app)));
+            }
+            if (ToolUtil.isNotEmpty(module)) {
+                predicate.getExpressions().add(criteriaBuilder.or(criteriaBuilder.like(root.get("name"), module)));
+            }
+            return predicate;
+        };
+        List<Script> result = scriptRepository.findAll(query);
+        return ResponseData.success(result);
+    }
+
+    @PostMapping("/add")
+    public ResponseData add(@RequestBody ScriptFormData scriptFormData) throws IOException {
+        if (Objects.isNull(scriptFormData.getFile())) {
+            throw new NullPointerException("文件不能为空");
+        }
+        if (StringUtils.hasLength(scriptFormData.getModule())) {
+            throw new NullPointerException("模块不能为空");
+        }
+        if (StringUtils.hasLength(scriptFormData.getGroupName())) {
+            throw new NullPointerException("组不能为空");
+        }
+        if (StringUtils.hasLength(scriptFormData.getApp())) {
+            throw new NullPointerException("APP不能为空");
+        }
+        MultipartFile multipartFile = scriptFormData.getFile();
+        InputStream inputStream = multipartFile.getInputStream();
+        byte[] bytes = new byte[inputStream.available()];
+        String content = new String(bytes, StandardCharsets.UTF_8);
+        scriptFormData.setScriptContent(content);
+        Script script = new Script();
+        BeanUtils.copyProperties(script, scriptFormData);
+        script.setUuid(new UUIDGenerator().next());
+        script.setCreatedTime(new Date());
+        script.setCallCount(0L);
+        script.setVersion(1000L);
+        scriptRepository.save(script);
+        return ResponseData.success("添加成功");
+    }
+
+    @PostMapping("/update/{id}")
+    public ResponseData update(@RequestBody ScriptFormData scriptFormData, @PathVariable String id) throws IOException {
+        if (StringUtils.hasLength(scriptFormData.getModule())) {
+            throw new NullPointerException("模块不能为空");
+        }
+        if (StringUtils.hasLength(scriptFormData.getGroupName())) {
+            throw new NullPointerException("组不能为空");
+        }
+        if (StringUtils.hasLength(scriptFormData.getApp())) {
+            throw new NullPointerException("APP不能为空");
+        }
+        Script script = scriptRepository.findFirstByUuid(id);
+        if (Objects.isNull(script)) {
+            throw new NullPointerException(BizExceptionEnum.FILE_NOT_FOUND.getMessage());
+        }
+        script.setApp(scriptFormData.getApp());
+        script.setModule(script.getModule());
+        script.setGroupName(script.getGroupName());
+        script.setEncrypt(scriptFormData.getEncrypt());
+        scriptRepository.save(script);
+        return ResponseData.success("添加成功");
+    }
+
+
+    @PostMapping("/versionChange/{id}")
+    @Transactional(rollbackFor = Exception.class)
+    public ResponseData versionChange(String scriptContent, @PathVariable String id) {
+        if (!StringUtils.hasLength(scriptContent)) {
+            throw new NullPointerException("内容不能为空");
+        }
+        Script script = scriptRepository.findFirstByUuid(id);
+        if (Objects.isNull(script)) {
+            throw new NullPointerException("没有找到脚本");
+        }
+        ScriptHistory scriptHistory = new ScriptHistory();
+        scriptHistory.setApp(script.getApp());
+        scriptHistory.setVersion(script.getVersion());
+        scriptHistory.setCreatedAt(new Date());
+        scriptHistory.setScriptId(script.getUuid());
+        scriptHistory.setScriptContent(script.getScriptContent());
+
+        script.setVersion(script.getVersion() + 1L);
+        script.setScriptContent(scriptContent);
+
+        scriptHistoryRepository.save(scriptHistory);
+        scriptRepository.save(script);
+
+        return ResponseData.success("变更完成");
+    }
+
+    @DeleteMapping("/delete/{id}")
+    @Transactional(rollbackFor = Exception.class)
+    public ResponseData delete(@PathVariable String id) {
+        Script script = scriptRepository.findFirstByUuid(id);
+        if (!Objects.isNull(script)) {
+            throw new NullPointerException("没有找到脚本");
+        }
+
+        scriptHistoryRepository.deleteAllByScriptId(id);
+        scriptRepository.deleteById(id);
 
+        return ResponseData.success("删除成功");
+    }
 
-    @RequestParam("/")
 }

+ 26 - 0
dtok-api/api/src/main/java/com/dtok/api/ws/WebSocketSever.java

@@ -0,0 +1,26 @@
+package com.dtok.api.ws;
+
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import javax.websocket.Session;
+import javax.websocket.server.ServerEndpoint;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.CopyOnWriteArraySet;
+
+@ServerEndpoint("/websocket/{userId}")
+@Component
+@Slf4j
+public class WebSocketSever {
+
+    // session集合,存放对应的session
+    private static ConcurrentHashMap<Integer, Session> sessionPool = new ConcurrentHashMap<>();
+
+    // concurrent包的线程安全Set,用来存放每个客户端对应的WebSocket对象。
+    private static CopyOnWriteArraySet<WebSocketSever> webSocketSet = new CopyOnWriteArraySet<>();
+
+
+
+
+}

+ 1 - 1
dtok-api/entity/entity.iml

@@ -6,7 +6,7 @@
         <setting name="validation-enabled" value="true" />
         <setting name="provider-name" value="Hibernate" />
         <datasource-mapping>
-          <factory-entry name="entityManagerFactory" value="150fb651-f83e-421f-94c7-7a290165da30" />
+          <factory-entry name="entityManagerFactory" value="1599cdd0-c2b1-471d-bc7e-9dc5f424bb70" />
         </datasource-mapping>
         <naming-strategy-map />
       </configuration>

+ 6 - 8
dtok-api/entity/src/main/java/com/dtok/entity/Script.java

@@ -52,12 +52,6 @@ public class Script implements Serializable {
     @Column(name = "script_content")
     private String scriptContent;
 
-    /**
-     * 1 生效
-     * 0 失效
-     */
-    @Column(name = "status")
-    private Integer status;
 
     /**
      * 调用次数
@@ -68,7 +62,11 @@ public class Script implements Serializable {
     @Column(name = "encrypt")
     private Boolean encrypt;
 
-    @Column(name = "created_at")
-    private Date createdAt;
+
+    @Column(name = "group_name")
+    private String groupName;
+
+    @Column(name = "created_time")
+    private Date createdTime;
 
 }

+ 30 - 0
dtok-api/entity/src/main/java/com/dtok/entity/params/ScriptFormData.java

@@ -0,0 +1,30 @@
+package com.dtok.entity.params;
+
+import lombok.Data;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.persistence.Column;
+import javax.persistence.Transient;
+import java.util.Date;
+
+@Data
+public class ScriptFormData {
+
+    private String app;
+
+    private String module;
+
+    private Long version;
+
+    @Transient
+    private MultipartFile file;
+
+    private String scriptContent;
+
+
+    private Boolean encrypt;
+
+
+    private String groupName;
+
+}

+ 28 - 0
dtok-api/framework/src/main/java/com/dtok/framework/configure/WebSocketConfig.java

@@ -0,0 +1,28 @@
+package com.dtok.framework.configure;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.boot.web.servlet.ServletContextInitializer;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.socket.server.standard.ServerEndpointExporter;
+
+import javax.servlet.ServletContext;
+import javax.servlet.ServletException;
+
+@Configuration
+@Slf4j
+public class WebSocketConfig implements ServletContextInitializer {
+    /**
+     * 这个bean的注册,用于扫描带有@ServerEndpoint的注解成为websocket,如果你使用外置的tomcat就不需要该配置文件
+     */
+    @Bean
+    public ServerEndpointExporter serverEndpointExporter() {
+        return new ServerEndpointExporter();
+    }
+
+
+    @Override
+    public void onStartup(ServletContext servletContext) throws ServletException {
+        log.info("WebSocket Start ...");
+    }
+}

+ 5 - 0
dtok-api/repository/src/main/java/com/dtok/repository/ScriptHistoryRepository.java

@@ -2,6 +2,8 @@ package com.dtok.repository;
 import com.dtok.entity.ScriptHistory;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.repository.query.Param;
+
 import java.util.Date;
 
 /**
@@ -12,4 +14,7 @@ import java.util.Date;
 
 public interface ScriptHistoryRepository  extends JpaRepository<ScriptHistory, String>, JpaSpecificationExecutor<ScriptHistory> {
 
+
+
+    void deleteAllByScriptId(@Param("scriptId") String scriptId);
 }

+ 4 - 0
dtok-api/repository/src/main/java/com/dtok/repository/ScriptRepository.java

@@ -2,6 +2,8 @@ package com.dtok.repository;
 import com.dtok.entity.Script;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.repository.query.Param;
+
 import java.util.Date;
 
 /**
@@ -12,4 +14,6 @@ import java.util.Date;
 
 public interface ScriptRepository  extends JpaRepository<Script, String>, JpaSpecificationExecutor<Script> {
 
+
+    Script findFirstByUuid(@Param("uuid") String uuid);
 }