diff --git a/ README.md b/ README.md
new file mode 100644
index 0000000..15f8f19
--- /dev/null
+++ b/ README.md
@@ -0,0 +1,81 @@
+## 六 天牛网盘
+### 6.1 数据字典
+
+#### 用户信息
+
+#### 文件信息
+
+编号、用户编号、文件名、目录编号 、类型、大小、位置、创建时间、状态、hash
+
+#### 目录信息
+
+编号、用户编号、目录名称、上级目录编号、目录路径、创建时间、状态
+
+#### 分享信息
+
+编号、用户编号、分享的数据编号、分类类型(file|folder)、提取码、分享有效期、状态
+
+### 6.2 技术架构
+
+```shell
+# 安装前端ui框架
+npm i element-plus @element-plus/icons-vue less less-loader
+```
+
+### 6.3 后端项目
+
+```yaml
+# 应用名称
+spring:
+ application:
+ name: Driver
+ # 数据库
+ datasource:
+ name: defaultDataSource
+ url: jdbc:mysql://localhost:3306/net_driver?serverTimezone=Asia/Shanghai
+ driver-class-name: com.mysql.cj.jdbc.Driver
+ username: root
+ password: 123456
+ # 添加druid数据库连接池
+ type: com.alibaba.druid.pool.DruidDataSource
+ #数据源配置
+ druid:
+ max-active: 1000
+ initial-size: 10
+ max-wait: 1000
+ min-idle: 10
+ time-between-eviction-runs-millis: 60000
+ min-evictable-idle-time-millis: 300000
+ validation-query: select 1
+ test-while-idle: true
+ test-on-borrow: false
+ test-on-return: false
+ max-pool-prepared-statement-per-connection-size: 0
+
+ #监控
+ stat-view-servlet:
+ url-pattern: /druid/*
+ reset-enable: false
+ login-username: admin
+ login-password: admin
+ allow: 127.0.0.1
+ # 是否启用
+ enabled: true
+ web-stat-filter:
+ url-pattern: /*
+ exclusions: /druid/*,*.js,*.css,*.html,*.png,*.jpg
+ # redis缓存
+ redis:
+ database: 1
+# 应用服务 WEB 访问端口
+server:
+ port: 8080
+# Actuator Web 访问端口
+#management.server.port=8081
+#management.endpoints.jmx.exposure.include=*
+#management.endpoints.web.exposure.include=*
+#management.endpoint.health.show-details=always
+
+
+```
+
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000..94a25f7
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/driver/pom.xml b/driver/pom.xml
index 6762a14..e0091c0 100644
--- a/driver/pom.xml
+++ b/driver/pom.xml
@@ -21,10 +21,10 @@
org.springframework.boot
spring-boot-starter-actuator
-
-
-
-
+
+
+
+
org.springframework.boot
spring-boot-starter-data-redis
@@ -74,11 +74,17 @@
spring-boot-starter-test
test
-
-
-
-
-
+
+
+ io.springfox
+ springfox-boot-starter
+ 3.0.0
+
+
+
+
+
+
diff --git a/driver/src/main/java/xyz/longicorn/driver/DriverApplication.java b/driver/src/main/java/xyz/longicorn/driver/DriverApplication.java
index fe54168..a0c7fab 100644
--- a/driver/src/main/java/xyz/longicorn/driver/DriverApplication.java
+++ b/driver/src/main/java/xyz/longicorn/driver/DriverApplication.java
@@ -2,6 +2,7 @@ package xyz.longicorn.driver;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.web.servlet.config.annotation.EnableWebMvc;
@SpringBootApplication
public class DriverApplication {
diff --git a/driver/src/main/java/xyz/longicorn/driver/config/BizException.java b/driver/src/main/java/xyz/longicorn/driver/config/BizException.java
index c5cff25..3e45bee 100644
--- a/driver/src/main/java/xyz/longicorn/driver/config/BizException.java
+++ b/driver/src/main/java/xyz/longicorn/driver/config/BizException.java
@@ -1,5 +1,8 @@
package xyz.longicorn.driver.config;
+import lombok.Data;
+
+@Data
public class BizException extends RuntimeException {
private int code;
diff --git a/driver/src/main/java/xyz/longicorn/driver/config/SwaggerConfiguration.java b/driver/src/main/java/xyz/longicorn/driver/config/SwaggerConfiguration.java
new file mode 100644
index 0000000..e6b14fd
--- /dev/null
+++ b/driver/src/main/java/xyz/longicorn/driver/config/SwaggerConfiguration.java
@@ -0,0 +1,80 @@
+package xyz.longicorn.driver.config;
+
+import org.springframework.beans.BeansException;
+import org.springframework.beans.factory.config.BeanPostProcessor;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.util.ReflectionUtils;
+import org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping;
+import springfox.documentation.builders.ApiInfoBuilder;
+import springfox.documentation.builders.PathSelectors;
+import springfox.documentation.builders.RequestHandlerSelectors;
+import springfox.documentation.oas.annotations.EnableOpenApi;
+import springfox.documentation.service.ApiInfo;
+import springfox.documentation.service.Contact;
+import springfox.documentation.spi.DocumentationType;
+import springfox.documentation.spring.web.plugins.Docket;
+import springfox.documentation.spring.web.plugins.WebFluxRequestHandlerProvider;
+import springfox.documentation.spring.web.plugins.WebMvcRequestHandlerProvider;
+
+import java.lang.reflect.Field;
+import java.util.List;
+import java.util.stream.Collectors;
+
+@Configuration
+@EnableOpenApi
+public class SwaggerConfiguration {
+
+ // 创建api文档信息
+ @Bean
+ public Docket createRestApi() {
+ return new Docket(DocumentationType.SWAGGER_2)
+ .apiInfo(apiInfo())
+ .select()
+ .apis(RequestHandlerSelectors.basePackage("xyz.longicorn.driver.controller"))
+ .paths(PathSelectors.any())
+ .build();
+ }
+
+ // API的信息
+ private ApiInfo apiInfo() {
+ return new ApiInfoBuilder().title("天牛网盘 API文档").description("天牛网盘 API文档")
+ .contact(new Contact("老王", "https://driver.longicorn.xyz/documents", "api@longicorn.xyz"))
+ .version("1.0").build();
+ }
+
+
+ // 解决swagger nullpointer
+ @Bean
+ public static BeanPostProcessor springfoxHandlerProviderBeanPostProcessor() {
+ return new BeanPostProcessor() {
+
+ @Override
+ public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
+ if (bean instanceof WebMvcRequestHandlerProvider || bean instanceof WebFluxRequestHandlerProvider) {
+ customizeSpringfoxHandlerMappings(getHandlerMappings(bean));
+ }
+ return bean;
+ }
+
+ private void customizeSpringfoxHandlerMappings(List mappings) {
+ List copy = mappings.stream()
+ .filter(mapping -> mapping.getPatternParser() == null)
+ .collect(Collectors.toList());
+ mappings.clear();
+ mappings.addAll(copy);
+ }
+
+ @SuppressWarnings("unchecked")
+ private List getHandlerMappings(Object bean) {
+ try {
+ Field field = ReflectionUtils.findField(bean.getClass(), "handlerMappings");
+ field.setAccessible(true);
+ return (List) field.get(bean);
+ } catch (IllegalArgumentException | IllegalAccessException e) {
+ throw new IllegalStateException(e);
+ }
+ }
+ };
+ }
+}
\ No newline at end of file
diff --git a/driver/src/main/java/xyz/longicorn/driver/config/WebConfig.java b/driver/src/main/java/xyz/longicorn/driver/config/WebConfig.java
index 34bb630..5d5a811 100644
--- a/driver/src/main/java/xyz/longicorn/driver/config/WebConfig.java
+++ b/driver/src/main/java/xyz/longicorn/driver/config/WebConfig.java
@@ -1,10 +1,12 @@
package xyz.longicorn.driver.config;
+import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
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 WebConfig implements WebMvcConfigurer {
@Override
@@ -13,7 +15,9 @@ public class WebConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
-
+ //映射static路径的请求到static目录下
+// registry.addResourceHandler("/static/**")
+// .addResourceLocations("classpath:/static/");
}
@Override
diff --git a/driver/src/main/java/xyz/longicorn/driver/controller/FolderController.java b/driver/src/main/java/xyz/longicorn/driver/controller/FolderController.java
index 99cce47..664c9f7 100644
--- a/driver/src/main/java/xyz/longicorn/driver/controller/FolderController.java
+++ b/driver/src/main/java/xyz/longicorn/driver/controller/FolderController.java
@@ -1,8 +1,13 @@
package xyz.longicorn.driver.controller;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
+import xyz.longicorn.driver.dto.ApiResult;
import xyz.longicorn.driver.pojo.FolderInfo;
import xyz.longicorn.driver.service.FolderService;
@@ -11,13 +16,21 @@ import java.util.List;
@RestController
@RequestMapping("/api/folder")
+@Api("目录操作")
public class FolderController {
@Resource
private FolderService folderService;
@RequestMapping("/list")
- // 查询相应目录下的所有文件(夹)信息
- public List listFolder(@RequestParam(required = false, defaultValue = "/") String folderPath) {
- return folderService.listFolder(1, folderPath);
+ //接口文档的名称
+ @ApiOperation(value = "查询目录信息", notes = "查询相应目录下的所有文件(夹)信息",httpMethod = "GET")
+ public ApiResult listFolder(@RequestParam(required = false, defaultValue = "/") String folderPath) {
+ return ApiResult.success(folderService.listFolder(1, folderPath));
+ }
+
+ // 创建目录
+ @ApiOperation(value = "创建目录", notes = "创建目录1")
+ public FolderInfo create(String parent, String name) {
+ return null;
}
}
diff --git a/driver/src/main/java/xyz/longicorn/driver/dto/ApiResult.java b/driver/src/main/java/xyz/longicorn/driver/dto/ApiResult.java
new file mode 100644
index 0000000..666a17e
--- /dev/null
+++ b/driver/src/main/java/xyz/longicorn/driver/dto/ApiResult.java
@@ -0,0 +1,34 @@
+package xyz.longicorn.driver.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.ToString;
+import lombok.experimental.Accessors;
+import xyz.longicorn.driver.config.BizException;
+
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+@Accessors(chain = true)
+@ToString
+@AllArgsConstructor
+@NoArgsConstructor
+public class ApiResult implements Serializable {
+ private int code;
+ private String message;
+ private Object data;
+
+ public static ApiResult success(Object data) {
+ return new ApiResult(0, "success", data);
+ }
+
+ public static ApiResult error(int code, String message) {
+ return new ApiResult(code, message, null);
+ }
+
+ public static ApiResult error(BizException e) {
+ return new ApiResult(e.getCode(), e.getMessage(), null);
+ }
+}
diff --git a/driver/src/main/resources/application.yml b/driver/src/main/resources/application.yml
index c6e3bd9..30468f0 100644
--- a/driver/src/main/resources/application.yml
+++ b/driver/src/main/resources/application.yml
@@ -40,6 +40,14 @@ spring:
# redis缓存
redis:
database: 1
+
+ mvc:
+ pathmatch:
+ # 因为Springfox使用的路径匹配是基于AntPathMatcher的,而Spring Boot 2.6.X使用的是PathPatternMatcher。
+ matching-strategy: ant_path_matcher
+springfox:
+ documentation:
+ enabled: true
# 应用服务 WEB 访问端口
server:
port: 8080
diff --git a/web/index.html b/web/index.html
index 030a6ff..2ad38c2 100644
--- a/web/index.html
+++ b/web/index.html
@@ -4,7 +4,7 @@
- Vite App
+ 天牛网盘
diff --git a/web/package-lock.json b/web/package-lock.json
index e599e6e..31a2c35 100644
--- a/web/package-lock.json
+++ b/web/package-lock.json
@@ -12,6 +12,7 @@
"element-plus": "^2.1.11",
"less": "^4.1.2",
"less-loader": "^10.2.0",
+ "qs": "^6.10.3",
"vue": "^3.2.25",
"vue-router": "^4.0.15"
},
@@ -514,6 +515,15 @@
"integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
"peer": true
},
+ "node_modules/call-bind": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/call-bind/-/call-bind-1.0.2.tgz",
+ "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
+ "dependencies": {
+ "function-bind": "^1.1.1",
+ "get-intrinsic": "^1.0.2"
+ }
+ },
"node_modules/caniuse-lite": {
"version": "1.0.30001336",
"resolved": "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001336.tgz",
@@ -1079,8 +1089,17 @@
"node_modules/function-bind": {
"version": "1.1.1",
"resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.1.tgz",
- "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
- "dev": true
+ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
+ },
+ "node_modules/get-intrinsic": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
+ "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
+ "dependencies": {
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3",
+ "has-symbols": "^1.0.1"
+ }
},
"node_modules/glob-to-regexp": {
"version": "0.4.1",
@@ -1097,7 +1116,6 @@
"version": "1.0.3",
"resolved": "https://registry.npmmirror.com/has/-/has-1.0.3.tgz",
"integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
- "dev": true,
"dependencies": {
"function-bind": "^1.1.1"
},
@@ -1114,6 +1132,14 @@
"node": ">=8"
}
},
+ "node_modules/has-symbols": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.0.3.tgz",
+ "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/iconv-lite": {
"version": "0.4.24",
"resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.4.24.tgz",
@@ -1377,6 +1403,11 @@
"resolved": "https://registry.npmmirror.com/normalize-wheel-es/-/normalize-wheel-es-1.1.2.tgz",
"integrity": "sha512-scX83plWJXYH1J4+BhAuIHadROzxX0UBF3+HuZNY2Ks8BciE7tSTQ+5JhTsvzjaO0/EJdm4JBGrfObKxFf3Png=="
},
+ "node_modules/object-inspect": {
+ "version": "1.12.0",
+ "resolved": "https://registry.npmmirror.com/object-inspect/-/object-inspect-1.12.0.tgz",
+ "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g=="
+ },
"node_modules/parse-node-version": {
"version": "1.0.1",
"resolved": "https://registry.npmmirror.com/parse-node-version/-/parse-node-version-1.0.1.tgz",
@@ -1433,6 +1464,17 @@
"node": ">=6"
}
},
+ "node_modules/qs": {
+ "version": "6.10.3",
+ "resolved": "https://registry.npmmirror.com/qs/-/qs-6.10.3.tgz",
+ "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==",
+ "dependencies": {
+ "side-channel": "^1.0.4"
+ },
+ "engines": {
+ "node": ">=0.6"
+ }
+ },
"node_modules/randombytes": {
"version": "2.1.0",
"resolved": "https://registry.npmmirror.com/randombytes/-/randombytes-2.1.0.tgz",
@@ -1521,6 +1563,16 @@
"randombytes": "^2.1.0"
}
},
+ "node_modules/side-channel": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmmirror.com/side-channel/-/side-channel-1.0.4.tgz",
+ "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
+ "dependencies": {
+ "call-bind": "^1.0.0",
+ "get-intrinsic": "^1.0.2",
+ "object-inspect": "^1.9.0"
+ }
+ },
"node_modules/source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz",
@@ -2264,6 +2316,15 @@
"integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
"peer": true
},
+ "call-bind": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/call-bind/-/call-bind-1.0.2.tgz",
+ "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
+ "requires": {
+ "function-bind": "^1.1.1",
+ "get-intrinsic": "^1.0.2"
+ }
+ },
"caniuse-lite": {
"version": "1.0.30001336",
"resolved": "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001336.tgz",
@@ -2607,8 +2668,17 @@
"function-bind": {
"version": "1.1.1",
"resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.1.tgz",
- "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
- "dev": true
+ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
+ },
+ "get-intrinsic": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
+ "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
+ "requires": {
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3",
+ "has-symbols": "^1.0.1"
+ }
},
"glob-to-regexp": {
"version": "0.4.1",
@@ -2625,7 +2695,6 @@
"version": "1.0.3",
"resolved": "https://registry.npmmirror.com/has/-/has-1.0.3.tgz",
"integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
- "dev": true,
"requires": {
"function-bind": "^1.1.1"
}
@@ -2636,6 +2705,11 @@
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
"peer": true
},
+ "has-symbols": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.0.3.tgz",
+ "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A=="
+ },
"iconv-lite": {
"version": "0.4.24",
"resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.4.24.tgz",
@@ -2835,6 +2909,11 @@
"resolved": "https://registry.npmmirror.com/normalize-wheel-es/-/normalize-wheel-es-1.1.2.tgz",
"integrity": "sha512-scX83plWJXYH1J4+BhAuIHadROzxX0UBF3+HuZNY2Ks8BciE7tSTQ+5JhTsvzjaO0/EJdm4JBGrfObKxFf3Png=="
},
+ "object-inspect": {
+ "version": "1.12.0",
+ "resolved": "https://registry.npmmirror.com/object-inspect/-/object-inspect-1.12.0.tgz",
+ "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g=="
+ },
"parse-node-version": {
"version": "1.0.1",
"resolved": "https://registry.npmmirror.com/parse-node-version/-/parse-node-version-1.0.1.tgz",
@@ -2879,6 +2958,14 @@
"integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
"peer": true
},
+ "qs": {
+ "version": "6.10.3",
+ "resolved": "https://registry.npmmirror.com/qs/-/qs-6.10.3.tgz",
+ "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==",
+ "requires": {
+ "side-channel": "^1.0.4"
+ }
+ },
"randombytes": {
"version": "2.1.0",
"resolved": "https://registry.npmmirror.com/randombytes/-/randombytes-2.1.0.tgz",
@@ -2952,6 +3039,16 @@
"randombytes": "^2.1.0"
}
},
+ "side-channel": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmmirror.com/side-channel/-/side-channel-1.0.4.tgz",
+ "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
+ "requires": {
+ "call-bind": "^1.0.0",
+ "get-intrinsic": "^1.0.2",
+ "object-inspect": "^1.9.0"
+ }
+ },
"source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz",
diff --git a/web/package.json b/web/package.json
index 848976c..3200035 100644
--- a/web/package.json
+++ b/web/package.json
@@ -12,6 +12,7 @@
"element-plus": "^2.1.11",
"less": "^4.1.2",
"less-loader": "^10.2.0",
+ "qs": "^6.10.3",
"vue": "^3.2.25",
"vue-router": "^4.0.15"
},
diff --git a/web/src/Main.vue b/web/src/Main.vue
index 79f07e5..c2ea036 100644
--- a/web/src/Main.vue
+++ b/web/src/Main.vue
@@ -1,80 +1,55 @@
-
-