├── .gitignore ├── display ├── front-end │ ├── vue-project │ │ ├── src │ │ │ ├── assets │ │ │ │ ├── main.css │ │ │ │ ├── logo.svg │ │ │ │ └── base.css │ │ │ ├── stores │ │ │ │ └── store.js │ │ │ ├── components │ │ │ │ ├── Main.vue │ │ │ │ ├── Display.vue │ │ │ │ └── Aside.vue │ │ │ ├── main.js │ │ │ └── App.vue │ │ ├── .vscode │ │ │ └── extensions.json │ │ ├── public │ │ │ └── favicon.ico │ │ ├── vite.config.js │ │ ├── index.html │ │ ├── .gitignore │ │ ├── package.json │ │ ├── README.md │ │ ├── yarn.lock │ │ └── package-lock.json │ ├── package.json │ ├── yarn.lock │ └── package-lock.json └── EncryptedTrafficRecognition │ └── EncryptedTrafficRecognition │ ├── src │ └── main │ │ ├── java │ │ └── com │ │ │ └── example │ │ │ └── EncryptedTrafficRecognition │ │ │ ├── request │ │ │ └── SinglePacket.java │ │ │ ├── dao │ │ │ ├── AppStaRepository.java │ │ │ ├── ComPortStaRepository.java │ │ │ ├── ComProStaRepository.java │ │ │ └── EncMsgRepository.java │ │ │ ├── response │ │ │ ├── appStaResponse.java │ │ │ ├── portStaResponse.java │ │ │ ├── Response.java │ │ │ ├── proStaResponse.java │ │ │ ├── compResponse.java │ │ │ ├── portResponse.java │ │ │ └── protocolResponse.java │ │ │ ├── config │ │ │ └── CorsConfig.java │ │ │ ├── domain │ │ │ ├── AppSta.java │ │ │ ├── EncryptedMessage.java │ │ │ ├── ComProSta.java │ │ │ └── ComPortSta.java │ │ │ └── controller │ │ │ └── Controller.java │ │ └── resources │ │ └── application.properties │ ├── .gitignore │ ├── pom.xml │ ├── mvnw.cmd │ └── mvnw ├── model └── tcdnn.pth ├── dataset ├── qq_test.pcap ├── wx_test.pcap ├── qq_train.pcap ├── wx_train.pcap ├── https_test.pcap └── https_train.pcap ├── model.py ├── LICENSE ├── capture.py ├── visualization.py ├── utils.py ├── train.py └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | *.zip -------------------------------------------------------------------------------- /display/front-end/vue-project/src/assets/main.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /model/tcdnn.pth: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/120L021602/EncryptedTrafficClassificationSystem/HEAD/model/tcdnn.pth -------------------------------------------------------------------------------- /dataset/qq_test.pcap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/120L021602/EncryptedTrafficClassificationSystem/HEAD/dataset/qq_test.pcap -------------------------------------------------------------------------------- /dataset/wx_test.pcap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/120L021602/EncryptedTrafficClassificationSystem/HEAD/dataset/wx_test.pcap -------------------------------------------------------------------------------- /dataset/qq_train.pcap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/120L021602/EncryptedTrafficClassificationSystem/HEAD/dataset/qq_train.pcap -------------------------------------------------------------------------------- /dataset/wx_train.pcap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/120L021602/EncryptedTrafficClassificationSystem/HEAD/dataset/wx_train.pcap -------------------------------------------------------------------------------- /dataset/https_test.pcap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/120L021602/EncryptedTrafficClassificationSystem/HEAD/dataset/https_test.pcap -------------------------------------------------------------------------------- /dataset/https_train.pcap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/120L021602/EncryptedTrafficClassificationSystem/HEAD/dataset/https_train.pcap -------------------------------------------------------------------------------- /display/front-end/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "dependencies": { 3 | "element-plus": "^2.3.6", 4 | "element-ui": "^2.15.13" 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /display/front-end/vue-project/.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": ["Vue.volar", "Vue.vscode-typescript-vue-plugin"] 3 | } 4 | -------------------------------------------------------------------------------- /display/front-end/vue-project/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/120L021602/EncryptedTrafficClassificationSystem/HEAD/display/front-end/vue-project/public/favicon.ico -------------------------------------------------------------------------------- /display/front-end/vue-project/src/assets/logo.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /display/EncryptedTrafficRecognition/EncryptedTrafficRecognition/src/main/java/com/example/EncryptedTrafficRecognition/request/SinglePacket.java: -------------------------------------------------------------------------------- 1 | package com.example.EncryptedTrafficRecognition.request; 2 | 3 | import lombok.Data; 4 | 5 | @Data 6 | public class SinglePacket { 7 | private String catalogue; 8 | 9 | private Integer port; 10 | 11 | private String protocol; 12 | } 13 | -------------------------------------------------------------------------------- /display/front-end/vue-project/src/stores/store.js: -------------------------------------------------------------------------------- 1 | import {defineStore} from 'pinia' 2 | export const useStore = defineStore('main', { 3 | state: () => ({ 4 | proInfo: [], 5 | proXData: [], 6 | proYData: [], 7 | portInfo: [], 8 | portXData: [], 9 | portYdata: [], 10 | compDis: [], 11 | type: 'showCalendar' 12 | }) 13 | }) -------------------------------------------------------------------------------- /display/front-end/vue-project/vite.config.js: -------------------------------------------------------------------------------- 1 | import { fileURLToPath, URL } from 'node:url' 2 | 3 | import { defineConfig } from 'vite' 4 | import vue from '@vitejs/plugin-vue' 5 | 6 | // https://vitejs.dev/config/ 7 | export default defineConfig({ 8 | plugins: [vue()], 9 | resolve: { 10 | alias: { 11 | '@': fileURLToPath(new URL('./src', import.meta.url)) 12 | } 13 | } 14 | }) 15 | -------------------------------------------------------------------------------- /display/front-end/vue-project/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Vite App 8 | 9 | 10 |
11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /display/front-end/vue-project/.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | .DS_Store 12 | dist 13 | dist-ssr 14 | coverage 15 | *.local 16 | 17 | /cypress/videos/ 18 | /cypress/screenshots/ 19 | 20 | # Editor directories and files 21 | .vscode/* 22 | !.vscode/extensions.json 23 | .idea 24 | *.suo 25 | *.ntvs* 26 | *.njsproj 27 | *.sln 28 | *.sw? 29 | -------------------------------------------------------------------------------- /display/EncryptedTrafficRecognition/EncryptedTrafficRecognition/src/main/java/com/example/EncryptedTrafficRecognition/dao/AppStaRepository.java: -------------------------------------------------------------------------------- 1 | package com.example.EncryptedTrafficRecognition.dao; 2 | 3 | import com.example.EncryptedTrafficRecognition.domain.AppSta; 4 | import com.example.EncryptedTrafficRecognition.domain.ComPortSta; 5 | import org.springframework.data.jpa.repository.JpaRepository; 6 | 7 | public interface AppStaRepository extends JpaRepository { 8 | } 9 | -------------------------------------------------------------------------------- /display/EncryptedTrafficRecognition/EncryptedTrafficRecognition/src/main/java/com/example/EncryptedTrafficRecognition/dao/ComPortStaRepository.java: -------------------------------------------------------------------------------- 1 | package com.example.EncryptedTrafficRecognition.dao; 2 | 3 | import com.example.EncryptedTrafficRecognition.domain.ComPortSta; 4 | import org.springframework.data.jpa.repository.JpaRepository; 5 | import org.springframework.stereotype.Repository; 6 | 7 | @Repository 8 | public interface ComPortStaRepository extends JpaRepository { 9 | } 10 | -------------------------------------------------------------------------------- /display/EncryptedTrafficRecognition/EncryptedTrafficRecognition/src/main/java/com/example/EncryptedTrafficRecognition/dao/ComProStaRepository.java: -------------------------------------------------------------------------------- 1 | package com.example.EncryptedTrafficRecognition.dao; 2 | 3 | import com.example.EncryptedTrafficRecognition.domain.ComProSta; 4 | import org.springframework.data.jpa.repository.JpaRepository; 5 | import org.springframework.stereotype.Repository; 6 | 7 | @Repository 8 | public interface ComProStaRepository extends JpaRepository { 9 | } 10 | -------------------------------------------------------------------------------- /display/front-end/vue-project/src/components/Main.vue: -------------------------------------------------------------------------------- 1 | 22 | 23 | -------------------------------------------------------------------------------- /display/front-end/vue-project/src/main.js: -------------------------------------------------------------------------------- 1 | import './assets/main.css' 2 | 3 | 4 | import { createPinia } from "pinia"; 5 | import { createApp } from 'vue' 6 | import App from './App.vue' 7 | import ElementPlus from 'element-plus' 8 | import 'element-plus/dist/index.css' 9 | 10 | import axios from 'axios' 11 | // Vue.prototype.$axios = axios 12 | const pinia = createPinia() 13 | 14 | const app = createApp(App) 15 | // app.use(ElementPlus, { size: 'small', zIndex: 3000 }) 16 | 17 | app.use(ElementPlus) 18 | app.use(pinia) 19 | 20 | app.mount('#app') 21 | -------------------------------------------------------------------------------- /display/front-end/vue-project/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vue-project", 3 | "version": "0.0.0", 4 | "private": true, 5 | "scripts": { 6 | "dev": "vite", 7 | "build": "vite build", 8 | "preview": "vite preview" 9 | }, 10 | "dependencies": { 11 | "axios": "^1.4.0", 12 | "echarts": "^5.4.2", 13 | "element-plus": "^2.3.6", 14 | "pinia": "^2.1.3", 15 | "vue": "^3.3.2", 16 | "vue-router": "^4.2.0" 17 | }, 18 | "devDependencies": { 19 | "@vitejs/plugin-vue": "^4.2.3", 20 | "vite": "^4.3.5" 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /display/EncryptedTrafficRecognition/EncryptedTrafficRecognition/.gitignore: -------------------------------------------------------------------------------- 1 | HELP.md 2 | target/ 3 | !.mvn/wrapper/maven-wrapper.jar 4 | !**/src/main/**/target/ 5 | !**/src/test/**/target/ 6 | 7 | ### STS ### 8 | .apt_generated 9 | .classpath 10 | .factorypath 11 | .project 12 | .settings 13 | .springBeans 14 | .sts4-cache 15 | 16 | ### IntelliJ IDEA ### 17 | .idea 18 | *.iws 19 | *.iml 20 | *.ipr 21 | 22 | ### NetBeans ### 23 | /nbproject/private/ 24 | /nbbuild/ 25 | /dist/ 26 | /nbdist/ 27 | /.nb-gradle/ 28 | build/ 29 | !**/src/main/**/build/ 30 | !**/src/test/**/build/ 31 | 32 | ### VS Code ### 33 | .vscode/ 34 | -------------------------------------------------------------------------------- /model.py: -------------------------------------------------------------------------------- 1 | from torch import nn 2 | 3 | 4 | # Traffic Classification Deep Neural Network 5 | class TCDNN(nn.Module): 6 | def __init__(self): 7 | super(TCDNN, self).__init__() 8 | self.mlp = nn.Sequential( 9 | nn.Linear(100, 90), 10 | nn.ReLU(), 11 | nn.Linear(90, 70), 12 | nn.ReLU(), 13 | nn.Linear(70, 50), 14 | nn.ReLU(), 15 | nn.Linear(50, 30), 16 | nn.ReLU(), 17 | nn.Linear(30, 3), 18 | nn.Softmax(dim=1) 19 | ) 20 | 21 | def forward(self, x): 22 | return self.mlp(x) 23 | -------------------------------------------------------------------------------- /display/EncryptedTrafficRecognition/EncryptedTrafficRecognition/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | server.port=12345 2 | 3 | spring.jpa.hibernate.ddl-auto=update 4 | spring.datasource.url=jdbc:mysql://${MYSQL_HOST:localhost}:3306/infcontsecurity?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai 5 | spring.datasource.username=kevin 6 | spring.datasource.password=Kevin220419 7 | spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver 8 | spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl 9 | spring.jpa.show-sql=true 10 | 11 | logging.level.org.springframework.boot.autoconfigure=error 12 | 13 | -------------------------------------------------------------------------------- /display/EncryptedTrafficRecognition/EncryptedTrafficRecognition/src/main/java/com/example/EncryptedTrafficRecognition/response/appStaResponse.java: -------------------------------------------------------------------------------- 1 | package com.example.EncryptedTrafficRecognition.response; 2 | 3 | import com.example.EncryptedTrafficRecognition.domain.AppSta; 4 | import lombok.Data; 5 | import lombok.EqualsAndHashCode; 6 | 7 | @Data 8 | @EqualsAndHashCode(callSuper = true) 9 | public class appStaResponse extends Response{ 10 | 11 | private AppSta appSta; 12 | 13 | public appStaResponse() { 14 | } 15 | 16 | public AppSta getAppSta() { 17 | return appSta; 18 | } 19 | 20 | public void setAppSta(AppSta appSta) { 21 | this.appSta = appSta; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /display/EncryptedTrafficRecognition/EncryptedTrafficRecognition/src/main/java/com/example/EncryptedTrafficRecognition/response/portStaResponse.java: -------------------------------------------------------------------------------- 1 | package com.example.EncryptedTrafficRecognition.response; 2 | 3 | 4 | import com.example.EncryptedTrafficRecognition.domain.ComPortSta; 5 | import lombok.Data; 6 | import lombok.EqualsAndHashCode; 7 | 8 | @Data 9 | @EqualsAndHashCode(callSuper = true) 10 | public class portStaResponse extends Response{ 11 | 12 | private ComPortSta comPortSta; 13 | 14 | public ComPortSta getComPortSta() { 15 | return comPortSta; 16 | } 17 | 18 | public void setComPortSta(ComPortSta comPortSta) { 19 | this.comPortSta = comPortSta; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /display/EncryptedTrafficRecognition/EncryptedTrafficRecognition/src/main/java/com/example/EncryptedTrafficRecognition/response/Response.java: -------------------------------------------------------------------------------- 1 | package com.example.EncryptedTrafficRecognition.response; 2 | 3 | public class Response { 4 | private Boolean success; 5 | private String msg; 6 | 7 | public Response() { 8 | this.success = false; 9 | this.msg = ""; 10 | } 11 | 12 | public Boolean getSuccess() { 13 | return success; 14 | } 15 | 16 | public void setSuccess(Boolean success) { 17 | this.success = success; 18 | } 19 | 20 | public String getMsg() { 21 | return msg; 22 | } 23 | 24 | public void setMsg(String msg) { 25 | this.msg = msg; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /display/EncryptedTrafficRecognition/EncryptedTrafficRecognition/src/main/java/com/example/EncryptedTrafficRecognition/dao/EncMsgRepository.java: -------------------------------------------------------------------------------- 1 | package com.example.EncryptedTrafficRecognition.dao; 2 | 3 | import com.example.EncryptedTrafficRecognition.domain.EncryptedMessage; 4 | import org.springframework.data.jpa.repository.JpaRepository; 5 | import org.springframework.stereotype.Repository; 6 | 7 | import java.util.List; 8 | 9 | @Repository 10 | public interface EncMsgRepository extends JpaRepository { 11 | 12 | List findAllByPort(Integer port); 13 | 14 | List findAllByProtocol(String protocol); 15 | 16 | List findAllByCatalogue(String catalogue); 17 | } 18 | -------------------------------------------------------------------------------- /display/EncryptedTrafficRecognition/EncryptedTrafficRecognition/src/main/java/com/example/EncryptedTrafficRecognition/response/proStaResponse.java: -------------------------------------------------------------------------------- 1 | package com.example.EncryptedTrafficRecognition.response; 2 | 3 | 4 | import com.example.EncryptedTrafficRecognition.domain.ComPortSta; 5 | import com.example.EncryptedTrafficRecognition.domain.ComProSta; 6 | import lombok.Data; 7 | import lombok.EqualsAndHashCode; 8 | 9 | @Data 10 | @EqualsAndHashCode(callSuper = true) 11 | public class proStaResponse extends Response{ 12 | private ComProSta comProSta; 13 | 14 | public ComProSta getComProSta() { 15 | return comProSta; 16 | } 17 | 18 | public void setComProSta(ComProSta comProSta) { 19 | this.comProSta = comProSta; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /display/front-end/vue-project/README.md: -------------------------------------------------------------------------------- 1 | # vue-project 2 | 3 | This template should help get you started developing with Vue 3 in Vite. 4 | 5 | ## Recommended IDE Setup 6 | 7 | [VSCode](https://code.visualstudio.com/) + [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar) (and disable Vetur) + [TypeScript Vue Plugin (Volar)](https://marketplace.visualstudio.com/items?itemName=Vue.vscode-typescript-vue-plugin). 8 | 9 | ## Customize configuration 10 | 11 | See [Vite Configuration Reference](https://vitejs.dev/config/). 12 | 13 | ## Project Setup 14 | 15 | ```sh 16 | yarn 17 | ``` 18 | 19 | ### Compile and Hot-Reload for Development 20 | 21 | ```sh 22 | yarn dev 23 | ``` 24 | 25 | ### Compile and Minify for Production 26 | 27 | ```sh 28 | yarn build 29 | ``` 30 | -------------------------------------------------------------------------------- /display/EncryptedTrafficRecognition/EncryptedTrafficRecognition/src/main/java/com/example/EncryptedTrafficRecognition/response/compResponse.java: -------------------------------------------------------------------------------- 1 | package com.example.EncryptedTrafficRecognition.response; 2 | 3 | import com.example.EncryptedTrafficRecognition.domain.EncryptedMessage; 4 | import lombok.Data; 5 | import lombok.EqualsAndHashCode; 6 | 7 | import java.util.List; 8 | 9 | @Data 10 | @EqualsAndHashCode(callSuper = true) 11 | public class compResponse extends Response{ 12 | 13 | private List encMsgList; 14 | 15 | public compResponse() { 16 | } 17 | 18 | public List getEncMsgList() { 19 | return encMsgList; 20 | } 21 | 22 | public void setEncMsgList(List encMsgList) { 23 | this.encMsgList = encMsgList; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /display/EncryptedTrafficRecognition/EncryptedTrafficRecognition/src/main/java/com/example/EncryptedTrafficRecognition/config/CorsConfig.java: -------------------------------------------------------------------------------- 1 | package com.example.EncryptedTrafficRecognition.config; 2 | 3 | import org.springframework.context.annotation.Configuration; 4 | import org.springframework.web.servlet.config.annotation.CorsRegistry; 5 | import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; 6 | 7 | @Configuration 8 | public class CorsConfig implements WebMvcConfigurer { 9 | 10 | @Override 11 | public void addCorsMappings(CorsRegistry registry) { 12 | registry.addMapping("/**") 13 | .allowedOriginPatterns("*") 14 | .allowCredentials(true) 15 | .allowedMethods("GET", "POST", "DELETE", "PUT", "PATCH") 16 | .maxAge(3600); 17 | } 18 | 19 | } 20 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 Ernest Cui 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /display/EncryptedTrafficRecognition/EncryptedTrafficRecognition/src/main/java/com/example/EncryptedTrafficRecognition/response/portResponse.java: -------------------------------------------------------------------------------- 1 | package com.example.EncryptedTrafficRecognition.response; 2 | 3 | import lombok.Data; 4 | import lombok.EqualsAndHashCode; 5 | 6 | import java.util.ArrayList; 7 | 8 | @Data 9 | @EqualsAndHashCode(callSuper = true) 10 | public class portResponse extends Response{ 11 | 12 | //portList中按顺序保存所有的端口号 13 | private ArrayList portList; 14 | 15 | //idList中按顺序保存所有协议的编号 16 | private ArrayList idList; 17 | 18 | 19 | public portResponse() { 20 | portList = new ArrayList<>(); 21 | idList = new ArrayList<>(); 22 | } 23 | 24 | public ArrayList getPortList() { 25 | return portList; 26 | } 27 | 28 | public void setPortList(ArrayList portList) { 29 | this.portList = portList; 30 | } 31 | 32 | public ArrayList getIdList() { 33 | return idList; 34 | } 35 | 36 | public void setIdList(ArrayList idList) { 37 | this.idList = idList; 38 | } 39 | 40 | public void addIdList(Integer id){ 41 | this.idList.add(id); 42 | } 43 | 44 | public void addPortList(Integer port){ 45 | this.portList.add(port); 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /display/EncryptedTrafficRecognition/EncryptedTrafficRecognition/src/main/java/com/example/EncryptedTrafficRecognition/response/protocolResponse.java: -------------------------------------------------------------------------------- 1 | package com.example.EncryptedTrafficRecognition.response; 2 | 3 | import lombok.Data; 4 | import lombok.EqualsAndHashCode; 5 | 6 | import java.util.ArrayList; 7 | 8 | @Data 9 | @EqualsAndHashCode(callSuper = true) 10 | public class protocolResponse extends Response{ 11 | 12 | private ArrayList protocolList; 13 | 14 | private ArrayList idList; 15 | 16 | public protocolResponse() { 17 | this.idList = new ArrayList<>(); 18 | this.protocolList = new ArrayList<>(); 19 | } 20 | 21 | public ArrayList getProtocolList() { 22 | return protocolList; 23 | } 24 | 25 | public void setProtocolList(ArrayList protocolList) { 26 | this.protocolList = protocolList; 27 | } 28 | 29 | public ArrayList getIdList() { 30 | return idList; 31 | } 32 | 33 | public void setIdList(ArrayList idList) { 34 | this.idList = idList; 35 | } 36 | 37 | public void addIdList(Integer id){ 38 | this.idList.add(id); 39 | } 40 | 41 | public void addProtocolList(String protocol){ 42 | this.protocolList.add(protocol); 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /display/EncryptedTrafficRecognition/EncryptedTrafficRecognition/src/main/java/com/example/EncryptedTrafficRecognition/domain/AppSta.java: -------------------------------------------------------------------------------- 1 | package com.example.EncryptedTrafficRecognition.domain; 2 | 3 | import jakarta.persistence.*; 4 | 5 | @Entity 6 | @Table(name = "appSta") 7 | public class AppSta { 8 | 9 | @Id//这是主键 10 | @Column(name = "id")//数据库中的id对应属性中的id 11 | @GeneratedValue(strategy = GenerationType.IDENTITY) 12 | private Integer id; 13 | 14 | @Column(name = "wx") 15 | private Integer wx; 16 | 17 | @Column(name = "qq") 18 | private Integer qq; 19 | 20 | @Column(name = "https") 21 | private Integer https; 22 | 23 | public AppSta() { 24 | } 25 | 26 | public Integer getId() { 27 | return id; 28 | } 29 | 30 | public void setId(Integer id) { 31 | this.id = id; 32 | } 33 | 34 | public Integer getWx() { 35 | return wx; 36 | } 37 | 38 | public void setWx(Integer wx) { 39 | this.wx = wx; 40 | } 41 | 42 | public Integer getQq() { 43 | return qq; 44 | } 45 | 46 | public void setQq(Integer qq) { 47 | this.qq = qq; 48 | } 49 | 50 | public Integer getHttps() { 51 | return https; 52 | } 53 | 54 | public void setHttps(Integer https) { 55 | this.https = https; 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /display/EncryptedTrafficRecognition/EncryptedTrafficRecognition/src/main/java/com/example/EncryptedTrafficRecognition/domain/EncryptedMessage.java: -------------------------------------------------------------------------------- 1 | package com.example.EncryptedTrafficRecognition.domain; 2 | 3 | import jakarta.persistence.*; 4 | 5 | @Entity 6 | @Table(name = "encryptedmessage") 7 | public class EncryptedMessage { 8 | 9 | @Id//这是主键 10 | @Column(name = "id")//数据库中的id对应属性中的id 11 | @GeneratedValue(strategy = GenerationType.IDENTITY) 12 | private Integer id; 13 | 14 | @Column(name = "protocol") 15 | private String protocol; 16 | 17 | @Column(name = "port") 18 | private Integer port; 19 | 20 | @Column(name = "catalogue") 21 | private String catalogue; 22 | 23 | public Integer getId() { 24 | return id; 25 | } 26 | 27 | public void setId(Integer id) { 28 | this.id = id; 29 | } 30 | 31 | public String getProtocol() { 32 | return protocol; 33 | } 34 | 35 | public void setProtocol(String protocol) { 36 | this.protocol = protocol; 37 | } 38 | 39 | public Integer getPort() { 40 | return port; 41 | } 42 | 43 | public void setPort(Integer port) { 44 | this.port = port; 45 | } 46 | 47 | public String getCatalogue() { 48 | return catalogue; 49 | } 50 | 51 | public void setCatalogue(String catalogue) { 52 | this.catalogue = catalogue; 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /display/front-end/vue-project/src/App.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 33 | 34 | -------------------------------------------------------------------------------- /capture.py: -------------------------------------------------------------------------------- 1 | import threading 2 | import time 3 | import requests 4 | from scapy.all import * 5 | from scapy.layers.inet import * 6 | from utils import get_tcp_udp_slice 7 | import torch 8 | import numpy as np 9 | from model import TCDNN 10 | 11 | tcann = TCDNN() 12 | tcann.load_state_dict(torch.load("./model/tcdnn.pth")) 13 | tcann.eval() 14 | 15 | app_names = ["QQ", "WX", "HTTPS"] 16 | app_counts = [0, 0, 0] 17 | 18 | API_HOST = "172.20.29.80" 19 | API_PORT = 12345 20 | API_PREFIX = f"http://{API_HOST}:{API_PORT}/" 21 | 22 | accumulated_packets = [] 23 | SEND_INTERVAL_MS = 500 24 | 25 | 26 | def packet_handler(pkt: Packet): 27 | if TCP in pkt or UDP in pkt: 28 | packet_slice = get_tcp_udp_slice(pkt) 29 | pred = tcann(torch.tensor(np.array([packet_slice]), dtype=torch.float)).argmax(1).item() 30 | app_counts[pred] += 1 31 | print(", ".join([f"{app_names[x]}: {app_counts[x]}" for x in range(len(app_counts))])) 32 | 33 | accumulated_packets.append({ 34 | "protocol": "TCP" if TCP in pkt else "UDP", 35 | "port": pkt[TCP].dport if TCP in pkt else pkt[UDP].dport, 36 | "catalogue": app_names[pred] 37 | }) 38 | 39 | 40 | def send_accumulated_packets(): 41 | global accumulated_packets 42 | 43 | while True: 44 | if len(accumulated_packets) > 0: 45 | requests.post(API_PREFIX + "api/receive_data", 46 | json={"packets": accumulated_packets}) 47 | print(f"*** Sent {len(accumulated_packets)} ***") 48 | accumulated_packets = [] 49 | 50 | time.sleep(SEND_INTERVAL_MS/1000) 51 | 52 | 53 | threading.Thread(target=send_accumulated_packets).start() 54 | 55 | # Remove iface="WLAN" when using ethernet 56 | sniff(iface="WLAN", 57 | prn=packet_handler, 58 | filter=f"(tcp or udp) and (not port 53) and (not port 1900) and (not port {API_PORT})") 59 | -------------------------------------------------------------------------------- /visualization.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | from sklearn.preprocessing import StandardScaler 3 | from sklearn.decomposition import PCA 4 | from sklearn.manifold import TSNE 5 | from scapy.all import * 6 | from utils import get_tcp_udp_slices 7 | from matplotlib import pyplot as plt 8 | 9 | plt.rcParams["font.sans-serif"] = ["Microsoft YaHei"] 10 | plt.rcParams['axes.unicode_minus'] = False 11 | plt.rcParams['figure.figsize'] = (7, 7) 12 | 13 | 14 | def pca(data_std: np.ndarray, n_components) -> np.ndarray: 15 | pca = PCA(n_components=n_components, svd_solver='full') 16 | pca.fit_transform(data_std) 17 | return data_std @ pca.components_.T 18 | 19 | 20 | dataset_qq = rdpcap("./dataset/qq_train.pcap") 21 | dataset_wx = rdpcap("./dataset/wx_train.pcap") 22 | dataset_https = rdpcap("./dataset/https_train.pcap") 23 | 24 | headers_qq = get_tcp_udp_slices(dataset_qq) 25 | headers_wx = get_tcp_udp_slices(dataset_wx) 26 | headers_https = get_tcp_udp_slices(dataset_https) 27 | 28 | s = StandardScaler() 29 | std_qq = s.fit_transform(headers_qq) 30 | std_wx = s.fit_transform(headers_wx) 31 | std_https = s.fit_transform(headers_https) 32 | 33 | # PCA 34 | pc_qq = pca(std_qq, 10) 35 | pc_wx = pca(std_wx, 10) 36 | pc_https = pca(std_https, 10) 37 | 38 | plt.scatter(pc_qq[:, 0], pc_qq[:, 1], c='limegreen', s=0.5, label="qq") 39 | plt.scatter(pc_wx[:, 0], pc_wx[:, 1], c='dodgerblue', s=0.5, label="微信") 40 | plt.scatter(pc_https[:, 0], pc_https[:, 1], c='gold', s=0.5, label="https") 41 | plt.title("PCA投影") 42 | plt.legend() 43 | plt.show() 44 | 45 | plt.clf() 46 | 47 | # t-SNE 48 | tsne = TSNE(n_components=2, perplexity=30.0, n_iter=1000, random_state=0, verbose=2) 49 | tsne_qq = tsne.fit_transform(std_qq) 50 | tsne_wx = tsne.fit_transform(std_wx) 51 | tsne_https = tsne.fit_transform(std_https) 52 | 53 | plt.scatter(tsne_qq[:, 0], tsne_qq[:, 1], c='limegreen', s=0.5, label="qq") 54 | plt.scatter(tsne_wx[:, 0], tsne_wx[:, 1], c='dodgerblue', s=0.5, label="微信") 55 | plt.scatter(tsne_https[:, 0], tsne_https[:, 1], c='gold', s=0.5, label="https") 56 | plt.title("t-SNE投影") 57 | plt.legend() 58 | plt.show() 59 | -------------------------------------------------------------------------------- /utils.py: -------------------------------------------------------------------------------- 1 | from scapy.layers.inet import * 2 | from scapy.all import * 3 | import numpy as np 4 | 5 | 6 | def get_54_header(pkt: Packet) -> np.ndarray: 7 | TCP_SLICE_LENGTH = 54 8 | UDP_SLICE_LENGTH = 42 9 | 10 | if TCP in pkt: 11 | if len(raw(pkt)) < TCP_SLICE_LENGTH: 12 | raise RuntimeError(f"TCP packet size < {TCP_SLICE_LENGTH}") 13 | return np.array(np.frombuffer(raw(pkt)[:TCP_SLICE_LENGTH], dtype=np.uint8)) 14 | elif UDP in pkt: 15 | if len(raw(pkt)) < UDP_SLICE_LENGTH: 16 | raise RuntimeError(f"UDP packet size < {UDP_SLICE_LENGTH}") 17 | # Pad UDP with trailing zeros to make it 54-byte long 18 | return np.concatenate([ 19 | np.frombuffer(raw(pkt)[:UDP_SLICE_LENGTH], dtype=np.uint8), 20 | np.zeros(TCP_SLICE_LENGTH - UDP_SLICE_LENGTH, dtype=np.uint8)]) 21 | else: 22 | raise RuntimeError("packet is neither TCP nor UDP") 23 | 24 | 25 | def get_header_payload(pkt: Packet) -> np.ndarray: 26 | SLICE_LENGTH = 100 27 | 28 | if TCP in pkt or UDP in pkt: 29 | if len(raw(pkt)) >= SLICE_LENGTH: 30 | return np.array(np.frombuffer(raw(pkt)[:SLICE_LENGTH], dtype=np.uint8)) 31 | # Pad with trailing zeros 32 | return np.concatenate([ 33 | np.frombuffer(raw(pkt), dtype=np.uint8), 34 | np.zeros(SLICE_LENGTH - len(raw(pkt)), dtype=np.uint8)]) 35 | else: 36 | raise RuntimeError("packet is neither TCP nor UDP") 37 | 38 | 39 | def get_tcp_udp_slice(pkt: Packet) -> np.ndarray: 40 | if TCP in pkt or UDP in pkt: 41 | return get_header_payload(pkt) 42 | else: 43 | raise RuntimeError("packet is neither TCP nor UDP") 44 | 45 | 46 | def get_tcp_udp_slices(packets: PacketList) -> np.ndarray: 47 | tcp_udp_packets: list[Packet] = list(filter(lambda x: TCP in x or UDP in x, packets)) 48 | 49 | if len(tcp_udp_packets) == 0: 50 | return np.array([]) 51 | 52 | result: np.ndarray = np.array([get_tcp_udp_slice(tcp_udp_packets[0])]) 53 | 54 | for pkt in tcp_udp_packets[1:]: 55 | result = np.concatenate([result, np.array([get_tcp_udp_slice(pkt)])]) 56 | 57 | return result 58 | -------------------------------------------------------------------------------- /display/EncryptedTrafficRecognition/EncryptedTrafficRecognition/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 4.0.0 5 | 6 | org.springframework.boot 7 | spring-boot-starter-parent 8 | 3.1.0 9 | 10 | 11 | com.example 12 | EncryptedTrafficRecognition 13 | 0.0.1-SNAPSHOT 14 | EncryptedTrafficRecognition 15 | the lab of information content security course 16 | 17 | 17 18 | 19 | 20 | 21 | org.springframework.boot 22 | spring-boot-starter-data-jpa 23 | 24 | 25 | org.springframework.boot 26 | spring-boot-starter-web 27 | 28 | 29 | 30 | com.mysql 31 | mysql-connector-j 32 | runtime 33 | 34 | 35 | org.projectlombok 36 | lombok 37 | true 38 | 39 | 40 | org.springframework.boot 41 | spring-boot-starter-test 42 | test 43 | 44 | 45 | 46 | 47 | 48 | 49 | org.springframework.boot 50 | spring-boot-maven-plugin 51 | 52 | 53 | 54 | org.projectlombok 55 | lombok 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | -------------------------------------------------------------------------------- /display/front-end/vue-project/src/assets/base.css: -------------------------------------------------------------------------------- 1 | /* color palette from */ 2 | :root { 3 | --vt-c-white: #ffffff; 4 | --vt-c-white-soft: #f8f8f8; 5 | --vt-c-white-mute: #f2f2f2; 6 | 7 | --vt-c-black: #181818; 8 | --vt-c-black-soft: #222222; 9 | --vt-c-black-mute: #282828; 10 | 11 | --vt-c-indigo: #2c3e50; 12 | 13 | --vt-c-divider-light-1: rgba(60, 60, 60, 0.29); 14 | --vt-c-divider-light-2: rgba(60, 60, 60, 0.12); 15 | --vt-c-divider-dark-1: rgba(84, 84, 84, 0.65); 16 | --vt-c-divider-dark-2: rgba(84, 84, 84, 0.48); 17 | 18 | --vt-c-text-light-1: var(--vt-c-indigo); 19 | --vt-c-text-light-2: rgba(60, 60, 60, 0.66); 20 | --vt-c-text-dark-1: var(--vt-c-white); 21 | --vt-c-text-dark-2: rgba(235, 235, 235, 0.64); 22 | } 23 | 24 | /* semantic color variables for this project */ 25 | :root { 26 | --color-background: var(--vt-c-white); 27 | --color-background-soft: var(--vt-c-white-soft); 28 | --color-background-mute: var(--vt-c-white-mute); 29 | 30 | --color-border: var(--vt-c-divider-light-2); 31 | --color-border-hover: var(--vt-c-divider-light-1); 32 | 33 | --color-heading: var(--vt-c-text-light-1); 34 | --color-text: var(--vt-c-text-light-1); 35 | 36 | --section-gap: 160px; 37 | } 38 | 39 | @media (prefers-color-scheme: dark) { 40 | :root { 41 | --color-background: var(--vt-c-black); 42 | --color-background-soft: var(--vt-c-black-soft); 43 | --color-background-mute: var(--vt-c-black-mute); 44 | 45 | --color-border: var(--vt-c-divider-dark-2); 46 | --color-border-hover: var(--vt-c-divider-dark-1); 47 | 48 | --color-heading: var(--vt-c-text-dark-1); 49 | --color-text: var(--vt-c-text-dark-2); 50 | } 51 | } 52 | 53 | *, 54 | *::before, 55 | *::after { 56 | box-sizing: border-box; 57 | margin: 0; 58 | font-weight: normal; 59 | } 60 | 61 | body { 62 | min-height: 100vh; 63 | color: var(--color-text); 64 | background: var(--color-background); 65 | transition: color 0.5s, background-color 0.5s; 66 | line-height: 1.6; 67 | font-family: Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, 68 | Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; 69 | font-size: 15px; 70 | text-rendering: optimizeLegibility; 71 | -webkit-font-smoothing: antialiased; 72 | -moz-osx-font-smoothing: grayscale; 73 | } 74 | -------------------------------------------------------------------------------- /display/front-end/vue-project/src/components/Display.vue: -------------------------------------------------------------------------------- 1 | 21 | 22 | 68 | 69 | -------------------------------------------------------------------------------- /display/EncryptedTrafficRecognition/EncryptedTrafficRecognition/src/main/java/com/example/EncryptedTrafficRecognition/domain/ComProSta.java: -------------------------------------------------------------------------------- 1 | package com.example.EncryptedTrafficRecognition.domain; 2 | 3 | import jakarta.persistence.*; 4 | 5 | // 以下是十个常用的传输层协议,我对它们进行统计: 6 | // 1. TCP (Transmission Control Protocol)传输控制协议 7 | // 2. UDP (User Datagram Protocol)用户数据报协议 8 | // 3. SCTP (Stream Control Transmission Protocol)流控制传输协议 9 | // 4. DCCP (Datagram Congestion Control Protocol)数据包拥塞控制协议 10 | // 5. RSVP (Resource Reservation Protocol)资源预分配协议 11 | // 6. RUDP (Reliable User Datagram Protocol)可靠的用户数据报协议 12 | // 7. TLS (Transport Layer Security)传输层安全协议 13 | // 8. QUIC (Quick UDP Internet Connections)快速UDP网络连接协议 14 | // 9. SPX (Sequenced Packet Exchange)序列化数据包交换协议 15 | // 10. MPTCP (Multipath TCP)多路径传输控制协议 16 | @Entity 17 | @Table(name = "comprosta") 18 | public class ComProSta { 19 | 20 | @Id//这是主键 21 | @Column(name = "id")//数据库中的id对应属性中的id 22 | @GeneratedValue(strategy = GenerationType.IDENTITY) 23 | private Integer id; 24 | 25 | @Column(name="tcp") 26 | private Integer tcp; 27 | 28 | @Column(name="udp") 29 | private Integer udp; 30 | 31 | @Column(name="sctp") 32 | private Integer sctp; 33 | 34 | @Column(name="dccp") 35 | private Integer dccp; 36 | 37 | @Column(name="rsvp") 38 | private Integer rsvp; 39 | 40 | @Column(name="rudp") 41 | private Integer rudp; 42 | 43 | @Column(name="tls") 44 | private Integer tls; 45 | 46 | @Column(name="quic") 47 | private Integer quic; 48 | 49 | @Column(name="spx") 50 | private Integer spx; 51 | 52 | @Column(name="mptcp") 53 | private Integer mptcp; 54 | 55 | public Integer getId() { 56 | return id; 57 | } 58 | 59 | public void setId(Integer id) { 60 | this.id = id; 61 | } 62 | 63 | public Integer getTcp() { 64 | return tcp; 65 | } 66 | 67 | public void setTcp(Integer tcp) { 68 | this.tcp = tcp; 69 | } 70 | 71 | public Integer getUdp() { 72 | return udp; 73 | } 74 | 75 | public void setUdp(Integer udp) { 76 | this.udp = udp; 77 | } 78 | 79 | public Integer getSctp() { 80 | return sctp; 81 | } 82 | 83 | public void setSctp(Integer sctp) { 84 | this.sctp = sctp; 85 | } 86 | 87 | public Integer getDccp() { 88 | return dccp; 89 | } 90 | 91 | public void setDccp(Integer dccp) { 92 | this.dccp = dccp; 93 | } 94 | 95 | public Integer getRsvp() { 96 | return rsvp; 97 | } 98 | 99 | public void setRsvp(Integer rsvp) { 100 | this.rsvp = rsvp; 101 | } 102 | 103 | public Integer getRudp() { 104 | return rudp; 105 | } 106 | 107 | public void setRudp(Integer rudp) { 108 | this.rudp = rudp; 109 | } 110 | 111 | public Integer getTls() { 112 | return tls; 113 | } 114 | 115 | public void setTls(Integer tls) { 116 | this.tls = tls; 117 | } 118 | 119 | public Integer getQuic() { 120 | return quic; 121 | } 122 | 123 | public void setQuic(Integer quic) { 124 | this.quic = quic; 125 | } 126 | 127 | public Integer getSpx() { 128 | return spx; 129 | } 130 | 131 | public void setSpx(Integer spx) { 132 | this.spx = spx; 133 | } 134 | 135 | public Integer getMptcp() { 136 | return mptcp; 137 | } 138 | 139 | public void setMptcp(Integer mptcp) { 140 | this.mptcp = mptcp; 141 | } 142 | 143 | public ComProSta() { 144 | } 145 | } 146 | -------------------------------------------------------------------------------- /train.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | from matplotlib import pyplot as plt 3 | import torch.optim 4 | from torch import nn 5 | from torch.utils.data.dataset import Dataset 6 | from torch.utils.data import DataLoader 7 | from scapy.all import * 8 | from utils import get_tcp_udp_slices 9 | from model import TCDNN 10 | 11 | 12 | class PcapDataset(Dataset): 13 | def __init__(self, file_paths, classes): 14 | headers = [get_tcp_udp_slices(rdpcap(x)) for x in file_paths] 15 | self.packets = torch.from_numpy(np.concatenate(headers)).type(torch.float) 16 | expanded_classes = [np.empty(len(x)) for x in headers] 17 | for i, ie in enumerate(classes): 18 | expanded_classes[i].fill(ie) 19 | self.classes = torch.from_numpy(np.concatenate(expanded_classes)).type(torch.long) 20 | 21 | # Shuffle 22 | for i in range(len(self.classes)): 23 | index1 = np.random.randint(0, len(self.classes)) 24 | index2 = np.random.randint(0, len(self.classes)) 25 | 26 | if index1 == index2: 27 | continue 28 | 29 | temp = self.packets[index1] 30 | self.packets[index1] = self.packets[index2] 31 | self.packets[index2] = temp 32 | 33 | temp = self.classes[index1] 34 | self.classes[index1] = self.classes[index2] 35 | self.classes[index2] = temp 36 | 37 | def __len__(self): 38 | return len(self.packets) 39 | 40 | def __getitem__(self, item): 41 | return self.packets[item], self.classes[item] 42 | 43 | 44 | CLASS_QQ = 0 45 | CLASS_WX = 1 46 | CLASS_HTTPS = 2 47 | 48 | dataset_train = PcapDataset(["./dataset/qq_train.pcap", 49 | "./dataset/wx_train.pcap", 50 | "./dataset/https_train.pcap"], 51 | [CLASS_QQ, CLASS_WX, CLASS_HTTPS]) 52 | 53 | dataset_test = PcapDataset(["./dataset/qq_test.pcap", 54 | "./dataset/wx_test.pcap", 55 | "./dataset/https_test.pcap"], 56 | [CLASS_QQ, CLASS_WX, CLASS_HTTPS]) 57 | 58 | batch_size = 64 59 | 60 | dataloader_train = DataLoader(dataset_train, batch_size) 61 | dataloader_test = DataLoader(dataset_test, batch_size) 62 | 63 | device = "cuda" 64 | 65 | model = TCDNN().to(device) 66 | loss_fn = nn.CrossEntropyLoss() 67 | optimizer = torch.optim.SGD(model.parameters(), lr=1e-03) 68 | 69 | 70 | def train(dataloader: DataLoader, 71 | model: nn.Module, 72 | loss_fn: nn.Module, 73 | optimizer: torch.optim.Optimizer): 74 | model.train() 75 | for i, (x, y) in enumerate(dataloader): 76 | x, y = x.to(device), y.to(device) 77 | 78 | pred = model(x) 79 | 80 | loss = loss_fn(pred, y) 81 | 82 | loss.backward() 83 | optimizer.step() 84 | optimizer.zero_grad() 85 | 86 | # if i % 100 == 0: 87 | # print(f"Loss: {loss.item():>5f} {i * len(x)}/{len(dataloader.dataset)}") 88 | 89 | 90 | accuracies = [] 91 | losses = [] 92 | 93 | 94 | def test(dataloader: DataLoader, 95 | model: nn.Module, 96 | loss_fn: nn.Module): 97 | model.eval() 98 | loss = 0 99 | correct = 0 100 | 101 | with torch.no_grad(): 102 | for (x, y) in dataloader: 103 | x, y = x.to(device), y.to(device) 104 | 105 | pred = model(x) 106 | 107 | loss += loss_fn(pred, y).item() 108 | 109 | correct += (pred.argmax(1) == y).type(torch.float).sum().item() 110 | 111 | loss /= len(dataloader) 112 | correct /= len(dataloader.dataset) 113 | 114 | accuracies.append(correct) 115 | losses.append(loss) 116 | 117 | print(f"Test Accuracy: {100 * correct:>0.1f}% | Test Loss: {loss}") 118 | 119 | 120 | epoch_count = 300 121 | for i in range(epoch_count): 122 | print(f"Epoch {i + 1}") 123 | train(dataloader_train, model, loss_fn, optimizer) 124 | test(dataloader_test, model, loss_fn) 125 | 126 | torch.save(model.state_dict(), "./model/tcdnn.pth") 127 | 128 | plt.plot(np.arange(0, epoch_count), accuracies, c="royalblue") 129 | plt.title("Accuracy") 130 | plt.xlabel("Epoch") 131 | plt.ylabel("Accu") 132 | plt.show() 133 | 134 | plt.plot(np.arange(0, epoch_count), losses, c="firebrick") 135 | plt.title("Loss") 136 | plt.xlabel("Epoch") 137 | plt.ylabel("Loss") 138 | plt.show() 139 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 加密流量分类识别系统 (Encrypted Traffic Classification System) 2 | 3 | 一个基于深度神经网络的加密流量分类识别系统,能够实时捕获网络数据包并识别QQ、微信和HTTPS流量。该系统包含完整的机器学习模型训练、实时流量捕获、Web展示界面和后端API服务。 4 | 5 | ## 🚀 项目特性 6 | 7 | - **实时流量捕获**: 使用Scapy库实时捕获网络数据包 8 | - **深度学习分类**: 基于DNN模型,准确率达到92.1% 9 | - **多协议支持**: 支持TCP/UDP协议分析 10 | - **Web可视化**: 提供实时数据展示和统计分析 11 | - **RESTful API**: 完整的后端服务接口 12 | - **数据持久化**: MySQL数据库存储分析结果 13 | 14 | ## 📁 项目结构 15 | 16 | ``` 17 | EncryptedTrafficClassificationSystem/ 18 | ├── capture.py # 实时流量捕获和分类 19 | ├── model.py # 深度学习模型定义 20 | ├── train.py # 模型训练脚本 21 | ├── utils.py # 工具函数 22 | ├── visualization.py # 数据可视化脚本 23 | ├── model/ # 训练好的模型文件 24 | │ └── tcdnn.pth 25 | ├── dataset/ # 训练和测试数据集 26 | │ ├── qq_train.pcap # QQ训练数据 27 | │ ├── qq_test.pcap # QQ测试数据 28 | │ ├── wx_train.pcap # 微信训练数据 29 | │ ├── wx_test.pcap # 微信测试数据 30 | │ ├── https_train.pcap # HTTPS训练数据 31 | │ └── https_test.pcap # HTTPS测试数据 32 | └── display/ # Web展示系统 33 | ├── EncryptedTrafficRecognition/ # Spring Boot后端 34 | │ ├── src/main/java/ # Java源代码 35 | │ ├── pom.xml # Maven配置 36 | │ └── target/ # 编译输出 37 | └── front-end/ # Vue.js前端 38 | └── vue-project/ # Vue项目 39 | ├── src/ # 源代码 40 | ├── package.json # 依赖配置 41 | └── vite.config.js # Vite配置 42 | ``` 43 | 44 | ## 🛠️ 技术栈 45 | 46 | ### 机器学习 47 | - **PyTorch**: 深度学习框架 48 | - **Scapy**: 网络数据包处理 49 | - **NumPy**: 数值计算 50 | - **Matplotlib**: 数据可视化 51 | 52 | ### 后端服务 53 | - **Spring Boot 3.1.0**: Java Web框架 54 | - **Spring Data JPA**: 数据持久化 55 | - **MySQL**: 数据库 56 | - **Maven**: 项目管理 57 | 58 | ### 前端界面 59 | - **Vue 3**: 前端框架 60 | - **Element Plus**: UI组件库 61 | - **ECharts**: 数据图表 62 | - **Vite**: 构建工具 63 | 64 | ## 📦 安装要求 65 | 66 | ### 系统要求 67 | - Python 3.7+ 68 | - Java 17+ 69 | - MySQL 8.0+ 70 | - Node.js 16+ 71 | 72 | ### Python依赖 73 | ```bash 74 | pip install torch scapy numpy matplotlib scikit-learn requests 75 | ``` 76 | 77 | ### Java环境 78 | - JDK 17+ 79 | - Maven 3.6+ 80 | 81 | ### Node.js依赖 82 | ```bash 83 | cd display/front-end/vue-project 84 | npm install 85 | ``` 86 | 87 | ## 🚀 快速开始 88 | 89 | ### 1. 环境准备 90 | ```bash 91 | # 克隆项目 92 | git clone 93 | cd EncryptedTrafficClassificationSystem 94 | 95 | # 安装Python依赖 96 | pip install -r requirements.txt 97 | ``` 98 | 99 | ### 2. 数据库配置 100 | 在 `display/EncryptedTrafficRecognition/EncryptedTrafficRecognition/src/main/resources/application.properties` 中配置MySQL连接信息: 101 | 102 | ```properties 103 | spring.datasource.url=jdbc:mysql://localhost:3306/encrypted_traffic 104 | spring.datasource.username=your_username 105 | spring.datasource.password=your_password 106 | ``` 107 | 108 | ### 3. 启动后端服务 109 | ```bash 110 | cd display/EncryptedTrafficRecognition/EncryptedTrafficRecognition 111 | mvn spring-boot:run 112 | ``` 113 | 114 | ### 4. 启动前端服务 115 | ```bash 116 | cd display/front-end/vue-project 117 | npm run dev 118 | ``` 119 | 120 | ### 5. 运行流量捕获 121 | ```bash 122 | python capture.py 123 | ``` 124 | 125 | ## 📊 模型训练 126 | 127 | ### 训练数据 128 | 系统使用PCAP格式的数据包文件进行训练,包含: 129 | - QQ流量数据 130 | - 微信流量数据 131 | - HTTPS流量数据 132 | 133 | ### 训练过程 134 | ```bash 135 | python train.py 136 | ``` 137 | 138 | 训练参数: 139 | - 批次大小: 64 140 | - 学习率: 0.001 141 | - 训练轮数: 300 142 | - 优化器: SGD 143 | 144 | ### 模型架构 145 | - 输入层: 100个神经元(数据包前100字节) 146 | - 隐藏层: 90 → 70 → 50 → 30个神经元 147 | - 输出层: 3个神经元(QQ/微信/HTTPS分类) 148 | - 激活函数: ReLU + Softmax 149 | 150 | ## 🔍 实时流量分析 151 | 152 | ### 数据包处理流程 153 | 1. **捕获**: 使用Scapy实时捕获网络数据包 154 | 2. **预处理**: 提取TCP/UDP头部和前100字节 155 | 3. **分类**: 使用训练好的DNN模型进行分类 156 | 4. **统计**: 统计各类应用的流量数量 157 | 5. **存储**: 将结果发送到后端API并存储到数据库 158 | 159 | ### 支持的协议 160 | - TCP协议 161 | - UDP协议 162 | - 过滤端口: 53(DNS), 1900(SSDP), 12345(API) 163 | 164 | ## 🌐 Web界面功能 165 | 166 | ### 实时监控 167 | - 流量统计图表 168 | - 应用分类统计 169 | - 端口使用情况 170 | - 协议分布分析 171 | 172 | ### 数据展示 173 | - 综合信息展示 174 | - 端口统计信息 175 | - 协议统计信息 176 | - 应用统计信息 177 | 178 | ### 管理功能 179 | - 数据库清理 180 | - 历史数据查询 181 | - 实时数据更新 182 | 183 | ## 📡 API接口 184 | 185 | ### 数据接收 186 | - `POST /api/receive_data`: 接收流量分析数据 187 | 188 | ### 数据查询 189 | - `GET /api/port_information`: 获取端口信息 190 | - `GET /api/protocol_information`: 获取协议信息 191 | - `GET /api/app_statistics`: 获取应用统计 192 | - `GET /api/port_statistics`: 获取端口统计 193 | - `GET /api/protocol_statistics`: 获取协议统计 194 | - `GET /api/comprehensive_display`: 获取综合信息 195 | 196 | ### 数据管理 197 | - `GET /api/clear_database`: 清空数据库 198 | 199 | ## 📈 性能指标 200 | 201 | - **分类准确率**: 92.1% 202 | - **实时处理**: 支持毫秒级数据包分析 203 | - **并发处理**: 多线程数据包处理 204 | - **数据吞吐**: 500ms批量发送间隔 205 | 206 | ## 🔧 配置说明 207 | 208 | ### 网络接口配置 209 | 在 `capture.py` 中修改网络接口名称: 210 | ```python 211 | # 使用以太网时移除 iface="WLAN" 212 | sniff(iface="WLAN", ...) 213 | ``` 214 | 215 | ### API服务配置 216 | 在 `capture.py` 中配置后端服务地址: 217 | ```python 218 | API_HOST = "172.20.29.80" 219 | API_PORT = 12345 220 | ``` 221 | 222 | ### 数据发送间隔 223 | ```python 224 | SEND_INTERVAL_MS = 500 # 500毫秒发送一次数据 225 | ``` 226 | 227 | ## 🐛 故障排除 228 | 229 | ### 常见问题 230 | 1. **权限不足**: 确保以管理员权限运行流量捕获 231 | 2. **网络接口错误**: 检查网络接口名称是否正确 232 | 3. **数据库连接失败**: 验证MySQL服务状态和连接配置 233 | 4. **模型加载失败**: 确认模型文件路径和PyTorch版本兼容性 234 | 235 | ### 日志查看 236 | - 后端日志: 查看Spring Boot控制台输出 237 | - 前端日志: 浏览器开发者工具控制台 238 | - 捕获日志: Python脚本控制台输出 239 | 240 | ## 🤝 贡献指南 241 | 242 | 1. Fork 项目 243 | 2. 创建特性分支 (`git checkout -b feature/AmazingFeature`) 244 | 3. 提交更改 (`git commit -m 'Add some AmazingFeature'`) 245 | 4. 推送到分支 (`git push origin feature/AmazingFeature`) 246 | 5. 开启 Pull Request 247 | 248 | ## 📄 许可证 249 | 250 | 本项目采用 MIT 许可证 - 查看 [LICENSE](LICENSE) 文件了解详情 251 | 252 | ## 📞 联系方式 253 | 254 | 如有问题或建议,请通过以下方式联系: 255 | - 提交 Issue 256 | - 发送邮件 257 | - 项目讨论区 258 | 259 | ## 🙏 致谢 260 | 261 | 感谢所有为项目做出贡献的开发者和研究人员。 262 | 263 | --- 264 | 265 | **注意**: 本项目仅用于教育和研究目的,请遵守相关法律法规和网络使用规范。 -------------------------------------------------------------------------------- /display/EncryptedTrafficRecognition/EncryptedTrafficRecognition/src/main/java/com/example/EncryptedTrafficRecognition/domain/ComPortSta.java: -------------------------------------------------------------------------------- 1 | package com.example.EncryptedTrafficRecognition.domain; 2 | 3 | import jakarta.persistence.*; 4 | 5 | // 以下是17个传输层的常用端口: 6 | // 1. HTTP - 80 (TCP) 2. HTTPS - 443 (TCP) 7 | // 3. FTP - 20 (TCP)、21 (TCP) 4. SSH - 22 (TCP) 5. Telnet - 23 (TCP) 8 | // 6. SMTP - 25 (TCP) 7. POP3 - 110 (TCP) 8. IMAP - 143 (TCP) 9. DNS - 53 (TCP/UDP) 9 | // 10. SNMP - 161 (UDP) 11. NTP - 123 (UDP) 12. DHCP - 67 (UDP)、68 (UDP) 10 | // 13. TFTP - 69 (UDP) 14. RDP - 3389 (TCP) 15. SIP - 5060 (TCP/UDP) 11 | 12 | @Entity 13 | @Table(name = "comportsta") 14 | public class ComPortSta { 15 | 16 | @Id//这是主键 17 | @Column(name = "id")//数据库中的id对应属性中的id 18 | @GeneratedValue(strategy = GenerationType.IDENTITY) 19 | private Integer id; 20 | 21 | @Column(name="port_80") 22 | private Integer port_80; 23 | 24 | @Column(name="port_443") 25 | private Integer port_443; 26 | 27 | @Column(name="port_20") 28 | private Integer port_20; 29 | 30 | @Column(name="port_21") 31 | private Integer port_21; 32 | 33 | @Column(name="port_22") 34 | private Integer port_22; 35 | 36 | @Column(name="port_23") 37 | private Integer port_23; 38 | 39 | @Column(name="port_25") 40 | private Integer port_25; 41 | 42 | @Column(name="port_110") 43 | private Integer port_110; 44 | 45 | @Column(name="port_143") 46 | private Integer port_143; 47 | 48 | @Column(name="port_53") 49 | private Integer port_53; 50 | 51 | @Column(name="port_161") 52 | private Integer port_161; 53 | 54 | @Column(name="port_123") 55 | private Integer port_123; 56 | 57 | @Column(name="port_67") 58 | private Integer port_67; 59 | 60 | @Column(name="port_68") 61 | private Integer port_68; 62 | 63 | @Column(name="port_69") 64 | private Integer port_69; 65 | 66 | @Column(name="port_3389") 67 | private Integer port_3389; 68 | 69 | @Column(name="port_5060") 70 | private Integer port_5060; 71 | 72 | @Column(name="port_8000") 73 | private Integer port_8000; 74 | 75 | public Integer getId() { 76 | return id; 77 | } 78 | 79 | public void setId(Integer id) { 80 | this.id = id; 81 | } 82 | 83 | public Integer getPort_80() { 84 | return port_80; 85 | } 86 | 87 | public void setPort_80(Integer port_80) { 88 | this.port_80 = port_80; 89 | } 90 | 91 | public Integer getPort_443() { 92 | return port_443; 93 | } 94 | 95 | public void setPort_443(Integer port_443) { 96 | this.port_443 = port_443; 97 | } 98 | 99 | public Integer getPort_20() { 100 | return port_20; 101 | } 102 | 103 | public void setPort_20(Integer port_20) { 104 | this.port_20 = port_20; 105 | } 106 | 107 | public Integer getPort_21() { 108 | return port_21; 109 | } 110 | 111 | public void setPort_21(Integer port_21) { 112 | this.port_21 = port_21; 113 | } 114 | 115 | public Integer getPort_22() { 116 | return port_22; 117 | } 118 | 119 | public void setPort_22(Integer port_22) { 120 | this.port_22 = port_22; 121 | } 122 | 123 | public Integer getPort_23() { 124 | return port_23; 125 | } 126 | 127 | public void setPort_23(Integer port_23) { 128 | this.port_23 = port_23; 129 | } 130 | 131 | public Integer getPort_25() { 132 | return port_25; 133 | } 134 | 135 | public void setPort_25(Integer port_25) { 136 | this.port_25 = port_25; 137 | } 138 | 139 | public Integer getPort_110() { 140 | return port_110; 141 | } 142 | 143 | public void setPort_110(Integer port_110) { 144 | this.port_110 = port_110; 145 | } 146 | 147 | public Integer getPort_143() { 148 | return port_143; 149 | } 150 | 151 | public void setPort_143(Integer port_143) { 152 | this.port_143 = port_143; 153 | } 154 | 155 | public Integer getPort_53() { 156 | return port_53; 157 | } 158 | 159 | public void setPort_53(Integer port_53) { 160 | this.port_53 = port_53; 161 | } 162 | 163 | public Integer getPort_161() { 164 | return port_161; 165 | } 166 | 167 | public void setPort_161(Integer port_161) { 168 | this.port_161 = port_161; 169 | } 170 | 171 | public Integer getPort_123() { 172 | return port_123; 173 | } 174 | 175 | public void setPort_123(Integer port_123) { 176 | this.port_123 = port_123; 177 | } 178 | 179 | public Integer getPort_67() { 180 | return port_67; 181 | } 182 | 183 | public void setPort_67(Integer port_67) { 184 | this.port_67 = port_67; 185 | } 186 | 187 | public Integer getPort_68() { 188 | return port_68; 189 | } 190 | 191 | public void setPort_68(Integer port_68) { 192 | this.port_68 = port_68; 193 | } 194 | 195 | public Integer getPort_69() { 196 | return port_69; 197 | } 198 | 199 | public void setPort_69(Integer port_69) { 200 | this.port_69 = port_69; 201 | } 202 | 203 | public Integer getPort_3389() { 204 | return port_3389; 205 | } 206 | 207 | public void setPort_3389(Integer port_3389) { 208 | this.port_3389 = port_3389; 209 | } 210 | 211 | public Integer getPort_5060() { 212 | return port_5060; 213 | } 214 | 215 | public void setPort_5060(Integer port_5060) { 216 | this.port_5060 = port_5060; 217 | } 218 | 219 | public Integer getPort_8000() { 220 | return port_8000; 221 | } 222 | 223 | public void setPort_8000(Integer port_8000) { 224 | this.port_8000 = port_8000; 225 | } 226 | 227 | public ComPortSta() { 228 | this.port_20 = 0; 229 | this.port_21 = 0; 230 | this.port_22 = 0; 231 | this.port_23 = 0; 232 | this.port_25 = 0; 233 | this.port_53 = 0; 234 | this.port_67 = 0; 235 | this.port_68 = 0; 236 | this.port_69 = 0; 237 | this.port_80 = 0; 238 | this.port_110 = 0; 239 | this.port_123 = 0; 240 | this.port_143 = 0; 241 | this.port_161 = 0; 242 | this.port_443 = 0; 243 | this.port_3389 = 0; 244 | this.port_5060 = 0; 245 | this.port_8000 = 0; 246 | } 247 | 248 | 249 | } 250 | -------------------------------------------------------------------------------- /display/EncryptedTrafficRecognition/EncryptedTrafficRecognition/mvnw.cmd: -------------------------------------------------------------------------------- 1 | @REM ---------------------------------------------------------------------------- 2 | @REM Licensed to the Apache Software Foundation (ASF) under one 3 | @REM or more contributor license agreements. See the NOTICE file 4 | @REM distributed with this work for additional information 5 | @REM regarding copyright ownership. The ASF licenses this file 6 | @REM to you under the Apache License, Version 2.0 (the 7 | @REM "License"); you may not use this file except in compliance 8 | @REM with the License. You may obtain a copy of the License at 9 | @REM 10 | @REM https://www.apache.org/licenses/LICENSE-2.0 11 | @REM 12 | @REM Unless required by applicable law or agreed to in writing, 13 | @REM software distributed under the License is distributed on an 14 | @REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 15 | @REM KIND, either express or implied. See the License for the 16 | @REM specific language governing permissions and limitations 17 | @REM under the License. 18 | @REM ---------------------------------------------------------------------------- 19 | 20 | @REM ---------------------------------------------------------------------------- 21 | @REM Apache Maven Wrapper startup batch script, version 3.2.0 22 | @REM 23 | @REM Required ENV vars: 24 | @REM JAVA_HOME - location of a JDK home dir 25 | @REM 26 | @REM Optional ENV vars 27 | @REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands 28 | @REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending 29 | @REM MAVEN_OPTS - parameters passed to the Java VM when running Maven 30 | @REM e.g. to debug Maven itself, use 31 | @REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 32 | @REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files 33 | @REM ---------------------------------------------------------------------------- 34 | 35 | @REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' 36 | @echo off 37 | @REM set title of command window 38 | title %0 39 | @REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' 40 | @if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% 41 | 42 | @REM set %HOME% to equivalent of $HOME 43 | if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") 44 | 45 | @REM Execute a user defined script before this one 46 | if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre 47 | @REM check for pre script, once with legacy .bat ending and once with .cmd ending 48 | if exist "%USERPROFILE%\mavenrc_pre.bat" call "%USERPROFILE%\mavenrc_pre.bat" %* 49 | if exist "%USERPROFILE%\mavenrc_pre.cmd" call "%USERPROFILE%\mavenrc_pre.cmd" %* 50 | :skipRcPre 51 | 52 | @setlocal 53 | 54 | set ERROR_CODE=0 55 | 56 | @REM To isolate internal variables from possible post scripts, we use another setlocal 57 | @setlocal 58 | 59 | @REM ==== START VALIDATION ==== 60 | if not "%JAVA_HOME%" == "" goto OkJHome 61 | 62 | echo. 63 | echo Error: JAVA_HOME not found in your environment. >&2 64 | echo Please set the JAVA_HOME variable in your environment to match the >&2 65 | echo location of your Java installation. >&2 66 | echo. 67 | goto error 68 | 69 | :OkJHome 70 | if exist "%JAVA_HOME%\bin\java.exe" goto init 71 | 72 | echo. 73 | echo Error: JAVA_HOME is set to an invalid directory. >&2 74 | echo JAVA_HOME = "%JAVA_HOME%" >&2 75 | echo Please set the JAVA_HOME variable in your environment to match the >&2 76 | echo location of your Java installation. >&2 77 | echo. 78 | goto error 79 | 80 | @REM ==== END VALIDATION ==== 81 | 82 | :init 83 | 84 | @REM Find the project base dir, i.e. the directory that contains the folder ".mvn". 85 | @REM Fallback to current working directory if not found. 86 | 87 | set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% 88 | IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir 89 | 90 | set EXEC_DIR=%CD% 91 | set WDIR=%EXEC_DIR% 92 | :findBaseDir 93 | IF EXIST "%WDIR%"\.mvn goto baseDirFound 94 | cd .. 95 | IF "%WDIR%"=="%CD%" goto baseDirNotFound 96 | set WDIR=%CD% 97 | goto findBaseDir 98 | 99 | :baseDirFound 100 | set MAVEN_PROJECTBASEDIR=%WDIR% 101 | cd "%EXEC_DIR%" 102 | goto endDetectBaseDir 103 | 104 | :baseDirNotFound 105 | set MAVEN_PROJECTBASEDIR=%EXEC_DIR% 106 | cd "%EXEC_DIR%" 107 | 108 | :endDetectBaseDir 109 | 110 | IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig 111 | 112 | @setlocal EnableExtensions EnableDelayedExpansion 113 | for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a 114 | @endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% 115 | 116 | :endReadAdditionalConfig 117 | 118 | SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" 119 | set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" 120 | set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain 121 | 122 | set WRAPPER_URL="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar" 123 | 124 | FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( 125 | IF "%%A"=="wrapperUrl" SET WRAPPER_URL=%%B 126 | ) 127 | 128 | @REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central 129 | @REM This allows using the maven wrapper in projects that prohibit checking in binary data. 130 | if exist %WRAPPER_JAR% ( 131 | if "%MVNW_VERBOSE%" == "true" ( 132 | echo Found %WRAPPER_JAR% 133 | ) 134 | ) else ( 135 | if not "%MVNW_REPOURL%" == "" ( 136 | SET WRAPPER_URL="%MVNW_REPOURL%/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar" 137 | ) 138 | if "%MVNW_VERBOSE%" == "true" ( 139 | echo Couldn't find %WRAPPER_JAR%, downloading it ... 140 | echo Downloading from: %WRAPPER_URL% 141 | ) 142 | 143 | powershell -Command "&{"^ 144 | "$webclient = new-object System.Net.WebClient;"^ 145 | "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ 146 | "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ 147 | "}"^ 148 | "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%WRAPPER_URL%', '%WRAPPER_JAR%')"^ 149 | "}" 150 | if "%MVNW_VERBOSE%" == "true" ( 151 | echo Finished downloading %WRAPPER_JAR% 152 | ) 153 | ) 154 | @REM End of extension 155 | 156 | @REM If specified, validate the SHA-256 sum of the Maven wrapper jar file 157 | SET WRAPPER_SHA_256_SUM="" 158 | FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( 159 | IF "%%A"=="wrapperSha256Sum" SET WRAPPER_SHA_256_SUM=%%B 160 | ) 161 | IF NOT %WRAPPER_SHA_256_SUM%=="" ( 162 | powershell -Command "&{"^ 163 | "$hash = (Get-FileHash \"%WRAPPER_JAR%\" -Algorithm SHA256).Hash.ToLower();"^ 164 | "If('%WRAPPER_SHA_256_SUM%' -ne $hash){"^ 165 | " Write-Output 'Error: Failed to validate Maven wrapper SHA-256, your Maven wrapper might be compromised.';"^ 166 | " Write-Output 'Investigate or delete %WRAPPER_JAR% to attempt a clean download.';"^ 167 | " Write-Output 'If you updated your Maven version, you need to update the specified wrapperSha256Sum property.';"^ 168 | " exit 1;"^ 169 | "}"^ 170 | "}" 171 | if ERRORLEVEL 1 goto error 172 | ) 173 | 174 | @REM Provide a "standardized" way to retrieve the CLI args that will 175 | @REM work with both Windows and non-Windows executions. 176 | set MAVEN_CMD_LINE_ARGS=%* 177 | 178 | %MAVEN_JAVA_EXE% ^ 179 | %JVM_CONFIG_MAVEN_PROPS% ^ 180 | %MAVEN_OPTS% ^ 181 | %MAVEN_DEBUG_OPTS% ^ 182 | -classpath %WRAPPER_JAR% ^ 183 | "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" ^ 184 | %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* 185 | if ERRORLEVEL 1 goto error 186 | goto end 187 | 188 | :error 189 | set ERROR_CODE=1 190 | 191 | :end 192 | @endlocal & set ERROR_CODE=%ERROR_CODE% 193 | 194 | if not "%MAVEN_SKIP_RC%"=="" goto skipRcPost 195 | @REM check for post script, once with legacy .bat ending and once with .cmd ending 196 | if exist "%USERPROFILE%\mavenrc_post.bat" call "%USERPROFILE%\mavenrc_post.bat" 197 | if exist "%USERPROFILE%\mavenrc_post.cmd" call "%USERPROFILE%\mavenrc_post.cmd" 198 | :skipRcPost 199 | 200 | @REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' 201 | if "%MAVEN_BATCH_PAUSE%"=="on" pause 202 | 203 | if "%MAVEN_TERMINATE_CMD%"=="on" exit %ERROR_CODE% 204 | 205 | cmd /C exit /B %ERROR_CODE% 206 | -------------------------------------------------------------------------------- /display/front-end/yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@ctrl/tinycolor@^3.4.1": 6 | version "3.6.0" 7 | resolved "https://registry.yarnpkg.com/@ctrl/tinycolor/-/tinycolor-3.6.0.tgz#53fa5fe9c34faee89469e48f91d51a3766108bc8" 8 | integrity sha512-/Z3l6pXthq0JvMYdUFyX9j0MaCltlIn6mfh9jLyQwg5aPKxkyNa0PTHtU1AlFXLNk55ZuAeJRcpvq+tmLfKmaQ== 9 | 10 | "@element-plus/icons-vue@^2.0.6": 11 | version "2.1.0" 12 | resolved "https://registry.yarnpkg.com/@element-plus/icons-vue/-/icons-vue-2.1.0.tgz#7ad90d08a8c0d5fd3af31c4f73264ca89614397a" 13 | integrity sha512-PSBn3elNoanENc1vnCfh+3WA9fimRC7n+fWkf3rE5jvv+aBohNHABC/KAR5KWPecxWxDTVT1ERpRbOMRcOV/vA== 14 | 15 | "@floating-ui/core@^1.2.6": 16 | version "1.2.6" 17 | resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.2.6.tgz#d21ace437cc919cdd8f1640302fa8851e65e75c0" 18 | integrity sha512-EvYTiXet5XqweYGClEmpu3BoxmsQ4hkj3QaYA6qEnigCWffTP3vNRwBReTdrwDwo7OoJ3wM8Uoe9Uk4n+d4hfg== 19 | 20 | "@floating-ui/dom@^1.0.1": 21 | version "1.2.9" 22 | resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.2.9.tgz#b9ed1c15d30963419a6736f1b7feb350dd49c603" 23 | integrity sha512-sosQxsqgxMNkV3C+3UqTS6LxP7isRLwX8WMepp843Rb3/b0Wz8+MdUkxJksByip3C2WwLugLHN1b4ibn//zKwQ== 24 | dependencies: 25 | "@floating-ui/core" "^1.2.6" 26 | 27 | "@popperjs/core@npm:@sxzz/popperjs-es@^2.11.7": 28 | version "2.11.7" 29 | resolved "https://registry.yarnpkg.com/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz#a7f69e3665d3da9b115f9e71671dae1b97e13671" 30 | integrity sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ== 31 | 32 | "@types/lodash-es@^4.17.6": 33 | version "4.17.7" 34 | resolved "https://registry.yarnpkg.com/@types/lodash-es/-/lodash-es-4.17.7.tgz#22edcae9f44aff08546e71db8925f05b33c7cc40" 35 | integrity sha512-z0ptr6UI10VlU6l5MYhGwS4mC8DZyYer2mCoyysZtSF7p26zOX8UpbrV0YpNYLGS8K4PUFIyEr62IMFFjveSiQ== 36 | dependencies: 37 | "@types/lodash" "*" 38 | 39 | "@types/lodash@*", "@types/lodash@^4.14.182": 40 | version "4.14.195" 41 | resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.195.tgz#bafc975b252eb6cea78882ce8a7b6bf22a6de632" 42 | integrity sha512-Hwx9EUgdwf2GLarOjQp5ZH8ZmblzcbTBC2wtQWNKARBSxM9ezRIAUpeDTgoQRAFB0+8CNWXVA9+MaSOzOF3nPg== 43 | 44 | "@types/web-bluetooth@^0.0.16": 45 | version "0.0.16" 46 | resolved "https://registry.yarnpkg.com/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz#1d12873a8e49567371f2a75fe3e7f7edca6662d8" 47 | integrity sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ== 48 | 49 | "@vueuse/core@^9.1.0": 50 | version "9.13.0" 51 | resolved "https://registry.yarnpkg.com/@vueuse/core/-/core-9.13.0.tgz#2f69e66d1905c1e4eebc249a01759cf88ea00cf4" 52 | integrity sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw== 53 | dependencies: 54 | "@types/web-bluetooth" "^0.0.16" 55 | "@vueuse/metadata" "9.13.0" 56 | "@vueuse/shared" "9.13.0" 57 | vue-demi "*" 58 | 59 | "@vueuse/metadata@9.13.0": 60 | version "9.13.0" 61 | resolved "https://registry.yarnpkg.com/@vueuse/metadata/-/metadata-9.13.0.tgz#bc25a6cdad1b1a93c36ce30191124da6520539ff" 62 | integrity sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ== 63 | 64 | "@vueuse/shared@9.13.0": 65 | version "9.13.0" 66 | resolved "https://registry.yarnpkg.com/@vueuse/shared/-/shared-9.13.0.tgz#089ff4cc4e2e7a4015e57a8f32e4b39d096353b9" 67 | integrity sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw== 68 | dependencies: 69 | vue-demi "*" 70 | 71 | async-validator@^4.2.5: 72 | version "4.2.5" 73 | resolved "https://registry.yarnpkg.com/async-validator/-/async-validator-4.2.5.tgz#c96ea3332a521699d0afaaceed510a54656c6339" 74 | integrity sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg== 75 | 76 | async-validator@~1.8.1: 77 | version "1.8.5" 78 | resolved "https://registry.yarnpkg.com/async-validator/-/async-validator-1.8.5.tgz#dc3e08ec1fd0dddb67e60842f02c0cd1cec6d7f0" 79 | integrity sha512-tXBM+1m056MAX0E8TL2iCjg8WvSyXu0Zc8LNtYqrVeyoL3+esHRZ4SieE9fKQyyU09uONjnMEjrNBMqT0mbvmA== 80 | dependencies: 81 | babel-runtime "6.x" 82 | 83 | babel-helper-vue-jsx-merge-props@^2.0.0: 84 | version "2.0.3" 85 | resolved "https://registry.yarnpkg.com/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-2.0.3.tgz#22aebd3b33902328e513293a8e4992b384f9f1b6" 86 | integrity sha512-gsLiKK7Qrb7zYJNgiXKpXblxbV5ffSwR0f5whkPAaBAR4fhi6bwRZxX9wBlIc5M/v8CCkXUbXZL4N/nSE97cqg== 87 | 88 | babel-runtime@6.x: 89 | version "6.26.0" 90 | resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" 91 | integrity sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g== 92 | dependencies: 93 | core-js "^2.4.0" 94 | regenerator-runtime "^0.11.0" 95 | 96 | core-js@^2.4.0: 97 | version "2.6.12" 98 | resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec" 99 | integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== 100 | 101 | dayjs@^1.11.3: 102 | version "1.11.8" 103 | resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.8.tgz#4282f139c8c19dd6d0c7bd571e30c2d0ba7698ea" 104 | integrity sha512-LcgxzFoWMEPO7ggRv1Y2N31hUf2R0Vj7fuy/m+Bg1K8rr+KAs1AEy4y9jd5DXe8pbHgX+srkHNS7TH6Q6ZhYeQ== 105 | 106 | deepmerge@^1.2.0: 107 | version "1.5.2" 108 | resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-1.5.2.tgz#10499d868844cdad4fee0842df8c7f6f0c95a753" 109 | integrity sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ== 110 | 111 | element-plus@^2.3.6: 112 | version "2.3.6" 113 | resolved "https://registry.yarnpkg.com/element-plus/-/element-plus-2.3.6.tgz#848f8834ed70adfbae8f4dec5303a9126d472d28" 114 | integrity sha512-GLz0pXUYI2zRfIgyI6W7SWmHk6dSEikP9yR++hsQUyy63+WjutoiGpA3SZD4cGPSXUzRFeKfVr8CnYhK5LqXZw== 115 | dependencies: 116 | "@ctrl/tinycolor" "^3.4.1" 117 | "@element-plus/icons-vue" "^2.0.6" 118 | "@floating-ui/dom" "^1.0.1" 119 | "@popperjs/core" "npm:@sxzz/popperjs-es@^2.11.7" 120 | "@types/lodash" "^4.14.182" 121 | "@types/lodash-es" "^4.17.6" 122 | "@vueuse/core" "^9.1.0" 123 | async-validator "^4.2.5" 124 | dayjs "^1.11.3" 125 | escape-html "^1.0.3" 126 | lodash "^4.17.21" 127 | lodash-es "^4.17.21" 128 | lodash-unified "^1.0.2" 129 | memoize-one "^6.0.0" 130 | normalize-wheel-es "^1.2.0" 131 | 132 | element-ui@^2.15.13: 133 | version "2.15.13" 134 | resolved "https://registry.yarnpkg.com/element-ui/-/element-ui-2.15.13.tgz#380f019ee7d15b181105587b41fd5914c308a143" 135 | integrity sha512-LJoatEYX6WV74FqXBss8Xfho9fh9rjDSzrDrTyREdGb1h1R3uRvmLh5jqp2JU137aj4/BgqA3K06RQpQBX33Bg== 136 | dependencies: 137 | async-validator "~1.8.1" 138 | babel-helper-vue-jsx-merge-props "^2.0.0" 139 | deepmerge "^1.2.0" 140 | normalize-wheel "^1.0.1" 141 | resize-observer-polyfill "^1.5.0" 142 | throttle-debounce "^1.0.1" 143 | 144 | escape-html@^1.0.3: 145 | version "1.0.3" 146 | resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" 147 | integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== 148 | 149 | lodash-es@^4.17.21: 150 | version "4.17.21" 151 | resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee" 152 | integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== 153 | 154 | lodash-unified@^1.0.2: 155 | version "1.0.3" 156 | resolved "https://registry.yarnpkg.com/lodash-unified/-/lodash-unified-1.0.3.tgz#80b1eac10ed2eb02ed189f08614a29c27d07c894" 157 | integrity sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ== 158 | 159 | lodash@^4.17.21: 160 | version "4.17.21" 161 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" 162 | integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== 163 | 164 | memoize-one@^6.0.0: 165 | version "6.0.0" 166 | resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-6.0.0.tgz#b2591b871ed82948aee4727dc6abceeeac8c1045" 167 | integrity sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw== 168 | 169 | normalize-wheel-es@^1.2.0: 170 | version "1.2.0" 171 | resolved "https://registry.yarnpkg.com/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz#0fa2593d619f7245a541652619105ab076acf09e" 172 | integrity sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw== 173 | 174 | normalize-wheel@^1.0.1: 175 | version "1.0.1" 176 | resolved "https://registry.yarnpkg.com/normalize-wheel/-/normalize-wheel-1.0.1.tgz#aec886affdb045070d856447df62ecf86146ec45" 177 | integrity sha512-1OnlAPZ3zgrk8B91HyRj+eVv+kS5u+Z0SCsak6Xil/kmgEia50ga7zfkumayonZrImffAxPU/5WcyGhzetHNPA== 178 | 179 | regenerator-runtime@^0.11.0: 180 | version "0.11.1" 181 | resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" 182 | integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== 183 | 184 | resize-observer-polyfill@^1.5.0: 185 | version "1.5.1" 186 | resolved "https://registry.yarnpkg.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz#0e9020dd3d21024458d4ebd27e23e40269810464" 187 | integrity sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg== 188 | 189 | throttle-debounce@^1.0.1: 190 | version "1.1.0" 191 | resolved "https://registry.yarnpkg.com/throttle-debounce/-/throttle-debounce-1.1.0.tgz#51853da37be68a155cb6e827b3514a3c422e89cd" 192 | integrity sha512-XH8UiPCQcWNuk2LYePibW/4qL97+ZQ1AN3FNXwZRBNPPowo/NRU5fAlDCSNBJIYCKbioZfuYtMhG4quqoJhVzg== 193 | 194 | vue-demi@*: 195 | version "0.14.5" 196 | resolved "https://registry.yarnpkg.com/vue-demi/-/vue-demi-0.14.5.tgz#676d0463d1a1266d5ab5cba932e043d8f5f2fbd9" 197 | integrity sha512-o9NUVpl/YlsGJ7t+xuqJKx8EBGf1quRhCiT6D/J0pfwmk9zUwYkC7yrF4SZCe6fETvSM3UNL2edcbYrSyc4QHA== 198 | -------------------------------------------------------------------------------- /display/EncryptedTrafficRecognition/EncryptedTrafficRecognition/src/main/java/com/example/EncryptedTrafficRecognition/controller/Controller.java: -------------------------------------------------------------------------------- 1 | package com.example.EncryptedTrafficRecognition.controller; 2 | 3 | 4 | import com.example.EncryptedTrafficRecognition.dao.AppStaRepository; 5 | import com.example.EncryptedTrafficRecognition.dao.ComPortStaRepository; 6 | import com.example.EncryptedTrafficRecognition.dao.ComProStaRepository; 7 | import com.example.EncryptedTrafficRecognition.dao.EncMsgRepository; 8 | import com.example.EncryptedTrafficRecognition.domain.AppSta; 9 | import com.example.EncryptedTrafficRecognition.domain.ComPortSta; 10 | import com.example.EncryptedTrafficRecognition.domain.ComProSta; 11 | import com.example.EncryptedTrafficRecognition.domain.EncryptedMessage; 12 | import com.example.EncryptedTrafficRecognition.request.ReceiveDataRequest; 13 | import com.example.EncryptedTrafficRecognition.request.SinglePacket; 14 | import com.example.EncryptedTrafficRecognition.response.*; 15 | import org.springframework.beans.factory.annotation.Autowired; 16 | import org.springframework.web.bind.annotation.*; 17 | 18 | import java.util.ArrayList; 19 | import java.util.List; 20 | 21 | @RestController 22 | public class Controller { 23 | @Autowired 24 | EncMsgRepository encMsgRepository; 25 | 26 | @Autowired 27 | ComProStaRepository comProStaRepository; 28 | 29 | @Autowired 30 | ComPortStaRepository comPortStaRepository; 31 | 32 | @Autowired 33 | AppStaRepository appStaRepository; 34 | 35 | //从崔子那里接收数据 36 | @PostMapping("/api/receive_data") 37 | public @ResponseBody Response receiveData(@RequestBody ReceiveDataRequest recDataReq){ 38 | Response response = new Response(); 39 | List encMsgs = new ArrayList<>(); 40 | for(SinglePacket packet:recDataReq.getPackets()){ 41 | EncryptedMessage encryptedMessage=new EncryptedMessage(); 42 | encryptedMessage.setCatalogue(packet.getCatalogue()); 43 | encryptedMessage.setPort(packet.getPort()); 44 | encryptedMessage.setProtocol(packet.getProtocol()); 45 | encMsgs.add(encryptedMessage); 46 | } 47 | encMsgRepository.saveAll(encMsgs); 48 | response.setSuccess(true); 49 | response.setMsg("Successfully received your data!"); 50 | return response; 51 | } 52 | 53 | ///端口信息 54 | @GetMapping("/api/port_information") 55 | public @ResponseBody portResponse portInformation(){ 56 | portResponse portResponse = new portResponse(); 57 | //给portList和idList赋值 58 | List encMsgList = encMsgRepository.findAll(); 59 | for(EncryptedMessage encMsg : encMsgList){ 60 | portResponse.addIdList(encMsg.getId()); 61 | portResponse.addPortList(encMsg.getPort()); 62 | } 63 | portResponse.setSuccess(true); 64 | portResponse.setMsg("Successfully returned the information of ports."); 65 | return portResponse; 66 | } 67 | 68 | //常用端口统计 69 | @GetMapping("/api/port_statistics") 70 | public @ResponseBody portStaResponse portStatistics(){ 71 | portStaResponse portStaResponse = new portStaResponse(); 72 | //统计常用端口信息 73 | ComPortSta comPortSta = new ComPortSta(); 74 | comPortSta.setId(1); 75 | int cnt = 0; 76 | 77 | List list_20 = encMsgRepository.findAllByPort(20); 78 | cnt = list_20.size(); 79 | comPortSta.setPort_20(cnt); 80 | 81 | List list_21 = encMsgRepository.findAllByPort(21); 82 | cnt = list_21.size(); 83 | comPortSta.setPort_21(cnt); 84 | 85 | List list_23 = encMsgRepository.findAllByPort(23); 86 | cnt = list_23.size(); 87 | comPortSta.setPort_23(cnt); 88 | 89 | List list_25 = encMsgRepository.findAllByPort(25); 90 | cnt = list_25.size(); 91 | comPortSta.setPort_25(cnt); 92 | 93 | List list_123 = encMsgRepository.findAllByPort(123); 94 | cnt = list_123.size(); 95 | comPortSta.setPort_123(cnt); 96 | 97 | List list_443 = encMsgRepository.findAllByPort(443); 98 | cnt = list_443.size(); 99 | comPortSta.setPort_443(cnt); 100 | 101 | List list_161 = encMsgRepository.findAllByPort(161); 102 | cnt = list_161.size(); 103 | comPortSta.setPort_161(cnt); 104 | 105 | List list_3389 = encMsgRepository.findAllByPort(3389); 106 | cnt = list_3389.size(); 107 | comPortSta.setPort_3389(cnt); 108 | 109 | List list_53 = encMsgRepository.findAllByPort(53); 110 | cnt = list_53.size(); 111 | comPortSta.setPort_53(cnt); 112 | 113 | List list_5060 = encMsgRepository.findAllByPort(5060); 114 | cnt = list_5060.size(); 115 | comPortSta.setPort_5060(cnt); 116 | 117 | List list_67 = encMsgRepository.findAllByPort(67); 118 | cnt = list_67.size(); 119 | comPortSta.setPort_67(cnt); 120 | 121 | List list_68 = encMsgRepository.findAllByPort(68); 122 | cnt = list_68.size(); 123 | comPortSta.setPort_68(cnt); 124 | 125 | List list_69 = encMsgRepository.findAllByPort(69); 126 | cnt = list_69.size(); 127 | comPortSta.setPort_69(cnt); 128 | 129 | List list_80 = encMsgRepository.findAllByPort(80); 130 | cnt = list_80.size(); 131 | comPortSta.setPort_80(cnt); 132 | 133 | List list_110 = encMsgRepository.findAllByPort(110); 134 | cnt = list_110.size(); 135 | comPortSta.setPort_110(cnt); 136 | 137 | List list_22 = encMsgRepository.findAllByPort(22); 138 | cnt = list_22.size(); 139 | comPortSta.setPort_22(cnt); 140 | 141 | List list_143 = encMsgRepository.findAllByPort(143); 142 | cnt = list_143.size(); 143 | comPortSta.setPort_143(cnt); 144 | 145 | List list_8000 = encMsgRepository.findAllByPort(8000); 146 | cnt = list_8000.size(); 147 | comPortSta.setPort_8000(cnt); 148 | 149 | comPortStaRepository.save(comPortSta); 150 | 151 | portStaResponse.setComPortSta(comPortSta); 152 | portStaResponse.setSuccess(true); 153 | portStaResponse.setMsg("Successfully returned the statistics of common ports."); 154 | return portStaResponse; 155 | } 156 | 157 | //协议信息 158 | @GetMapping("/api/protocol_information") 159 | public @ResponseBody protocolResponse protocolInformation(){ 160 | protocolResponse protocolResponse = new protocolResponse(); 161 | //给protocolList和idList赋值 162 | List encMsgList = encMsgRepository.findAll(); 163 | for(EncryptedMessage encMsg : encMsgList){ 164 | protocolResponse.addIdList(encMsg.getId()); 165 | protocolResponse.addProtocolList(encMsg.getProtocol()); 166 | } 167 | protocolResponse.setSuccess(true); 168 | protocolResponse.setMsg("Successfully returned the information of protocol."); 169 | return protocolResponse; 170 | } 171 | 172 | //常用协议统计 173 | @GetMapping("/api/protocol_statistics") 174 | public @ResponseBody proStaResponse protocolStatistics(){ 175 | proStaResponse proStaResponse = new proStaResponse(); 176 | ComProSta comProSta = new ComProSta(); 177 | comProSta.setId(1); 178 | int cnt = 0; 179 | 180 | List tcpList = encMsgRepository.findAllByProtocol("tcp"); 181 | cnt = tcpList.size(); 182 | comProSta.setTcp(cnt); 183 | 184 | List udpList = encMsgRepository.findAllByProtocol("udp"); 185 | cnt = udpList.size(); 186 | comProSta.setUdp(cnt); 187 | 188 | List sctpList = encMsgRepository.findAllByProtocol("sctp"); 189 | cnt = sctpList.size(); 190 | comProSta.setSctp(cnt); 191 | 192 | List dccpList = encMsgRepository.findAllByProtocol("dccp"); 193 | cnt = dccpList.size(); 194 | comProSta.setDccp(cnt); 195 | 196 | List rsvpList = encMsgRepository.findAllByProtocol("rsvp"); 197 | cnt = rsvpList.size(); 198 | comProSta.setRsvp(cnt); 199 | 200 | List rudpList = encMsgRepository.findAllByProtocol("rudp"); 201 | cnt = rudpList.size(); 202 | comProSta.setRudp(cnt); 203 | 204 | List tlsList = encMsgRepository.findAllByProtocol("tls"); 205 | cnt = tlsList.size(); 206 | comProSta.setTls(cnt); 207 | 208 | List quicList = encMsgRepository.findAllByProtocol("quic"); 209 | cnt = quicList.size(); 210 | comProSta.setQuic(cnt); 211 | 212 | List spxList = encMsgRepository.findAllByProtocol("spx"); 213 | cnt = spxList.size(); 214 | comProSta.setSpx(cnt); 215 | 216 | List mptcpList = encMsgRepository.findAllByProtocol("mptcp"); 217 | cnt = mptcpList.size(); 218 | comProSta.setMptcp(cnt); 219 | 220 | comProStaRepository.save(comProSta); 221 | proStaResponse.setComProSta(comProSta); 222 | proStaResponse.setSuccess(true); 223 | proStaResponse.setMsg("Successfully returned the statistics of common protocol."); 224 | return proStaResponse; 225 | } 226 | 227 | @GetMapping("/api/comprehensive_display") 228 | public @ResponseBody compResponse compDisplay(){ 229 | compResponse compResponse = new compResponse(); 230 | List encMsgList = encMsgRepository.findAll(); 231 | compResponse.setEncMsgList(encMsgList); 232 | compResponse.setSuccess(true); 233 | compResponse.setMsg("Successfully returned the comprehensive information of encrypted messages."); 234 | return compResponse; 235 | } 236 | 237 | @GetMapping("/api/app_statistics") 238 | public @ResponseBody appStaResponse appStatistics(){ 239 | appStaResponse appStaResponse = new appStaResponse(); 240 | AppSta appSta = new AppSta(); 241 | appSta.setId(1); 242 | int cnt = 0; 243 | 244 | List wxList = encMsgRepository.findAllByCatalogue("wx"); 245 | cnt = wxList.size(); 246 | appSta.setWx(cnt); 247 | 248 | List qqList = encMsgRepository.findAllByCatalogue("qq"); 249 | cnt = qqList.size(); 250 | appSta.setQq(cnt); 251 | 252 | List httpsList = encMsgRepository.findAllByCatalogue("https"); 253 | cnt = httpsList.size(); 254 | appSta.setHttps(cnt); 255 | 256 | appStaRepository.save(appSta); 257 | appStaResponse.setAppSta(appSta); 258 | appStaResponse.setMsg("Successfully returned information of applications."); 259 | appStaResponse.setSuccess(true); 260 | 261 | return appStaResponse; 262 | } 263 | 264 | @GetMapping("/api/clear_database") 265 | public @ResponseBody boolean clearDatabase(){ 266 | try{ 267 | encMsgRepository.deleteAll(); 268 | appStaRepository.deleteAll(); 269 | comPortStaRepository.deleteAll(); 270 | comProStaRepository.deleteAll(); 271 | }catch(Exception e){ 272 | e.printStackTrace(); 273 | return false; 274 | } 275 | return true; 276 | } 277 | 278 | } 279 | -------------------------------------------------------------------------------- /display/EncryptedTrafficRecognition/EncryptedTrafficRecognition/mvnw: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # ---------------------------------------------------------------------------- 3 | # Licensed to the Apache Software Foundation (ASF) under one 4 | # or more contributor license agreements. See the NOTICE file 5 | # distributed with this work for additional information 6 | # regarding copyright ownership. The ASF licenses this file 7 | # to you under the Apache License, Version 2.0 (the 8 | # "License"); you may not use this file except in compliance 9 | # with the License. You may obtain a copy of the License at 10 | # 11 | # https://www.apache.org/licenses/LICENSE-2.0 12 | # 13 | # Unless required by applicable law or agreed to in writing, 14 | # software distributed under the License is distributed on an 15 | # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 | # KIND, either express or implied. See the License for the 17 | # specific language governing permissions and limitations 18 | # under the License. 19 | # ---------------------------------------------------------------------------- 20 | 21 | # ---------------------------------------------------------------------------- 22 | # Apache Maven Wrapper startup batch script, version 3.2.0 23 | # 24 | # Required ENV vars: 25 | # ------------------ 26 | # JAVA_HOME - location of a JDK home dir 27 | # 28 | # Optional ENV vars 29 | # ----------------- 30 | # MAVEN_OPTS - parameters passed to the Java VM when running Maven 31 | # e.g. to debug Maven itself, use 32 | # set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 33 | # MAVEN_SKIP_RC - flag to disable loading of mavenrc files 34 | # ---------------------------------------------------------------------------- 35 | 36 | if [ -z "$MAVEN_SKIP_RC" ] ; then 37 | 38 | if [ -f /usr/local/etc/mavenrc ] ; then 39 | . /usr/local/etc/mavenrc 40 | fi 41 | 42 | if [ -f /etc/mavenrc ] ; then 43 | . /etc/mavenrc 44 | fi 45 | 46 | if [ -f "$HOME/.mavenrc" ] ; then 47 | . "$HOME/.mavenrc" 48 | fi 49 | 50 | fi 51 | 52 | # OS specific support. $var _must_ be set to either true or false. 53 | cygwin=false; 54 | darwin=false; 55 | mingw=false 56 | case "$(uname)" in 57 | CYGWIN*) cygwin=true ;; 58 | MINGW*) mingw=true;; 59 | Darwin*) darwin=true 60 | # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home 61 | # See https://developer.apple.com/library/mac/qa/qa1170/_index.html 62 | if [ -z "$JAVA_HOME" ]; then 63 | if [ -x "/usr/libexec/java_home" ]; then 64 | JAVA_HOME="$(/usr/libexec/java_home)"; export JAVA_HOME 65 | else 66 | JAVA_HOME="/Library/Java/Home"; export JAVA_HOME 67 | fi 68 | fi 69 | ;; 70 | esac 71 | 72 | if [ -z "$JAVA_HOME" ] ; then 73 | if [ -r /etc/gentoo-release ] ; then 74 | JAVA_HOME=$(java-config --jre-home) 75 | fi 76 | fi 77 | 78 | # For Cygwin, ensure paths are in UNIX format before anything is touched 79 | if $cygwin ; then 80 | [ -n "$JAVA_HOME" ] && 81 | JAVA_HOME=$(cygpath --unix "$JAVA_HOME") 82 | [ -n "$CLASSPATH" ] && 83 | CLASSPATH=$(cygpath --path --unix "$CLASSPATH") 84 | fi 85 | 86 | # For Mingw, ensure paths are in UNIX format before anything is touched 87 | if $mingw ; then 88 | [ -n "$JAVA_HOME" ] && [ -d "$JAVA_HOME" ] && 89 | JAVA_HOME="$(cd "$JAVA_HOME" || (echo "cannot cd into $JAVA_HOME."; exit 1); pwd)" 90 | fi 91 | 92 | if [ -z "$JAVA_HOME" ]; then 93 | javaExecutable="$(which javac)" 94 | if [ -n "$javaExecutable" ] && ! [ "$(expr "\"$javaExecutable\"" : '\([^ ]*\)')" = "no" ]; then 95 | # readlink(1) is not available as standard on Solaris 10. 96 | readLink=$(which readlink) 97 | if [ ! "$(expr "$readLink" : '\([^ ]*\)')" = "no" ]; then 98 | if $darwin ; then 99 | javaHome="$(dirname "\"$javaExecutable\"")" 100 | javaExecutable="$(cd "\"$javaHome\"" && pwd -P)/javac" 101 | else 102 | javaExecutable="$(readlink -f "\"$javaExecutable\"")" 103 | fi 104 | javaHome="$(dirname "\"$javaExecutable\"")" 105 | javaHome=$(expr "$javaHome" : '\(.*\)/bin') 106 | JAVA_HOME="$javaHome" 107 | export JAVA_HOME 108 | fi 109 | fi 110 | fi 111 | 112 | if [ -z "$JAVACMD" ] ; then 113 | if [ -n "$JAVA_HOME" ] ; then 114 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 115 | # IBM's JDK on AIX uses strange locations for the executables 116 | JAVACMD="$JAVA_HOME/jre/sh/java" 117 | else 118 | JAVACMD="$JAVA_HOME/bin/java" 119 | fi 120 | else 121 | JAVACMD="$(\unset -f command 2>/dev/null; \command -v java)" 122 | fi 123 | fi 124 | 125 | if [ ! -x "$JAVACMD" ] ; then 126 | echo "Error: JAVA_HOME is not defined correctly." >&2 127 | echo " We cannot execute $JAVACMD" >&2 128 | exit 1 129 | fi 130 | 131 | if [ -z "$JAVA_HOME" ] ; then 132 | echo "Warning: JAVA_HOME environment variable is not set." 133 | fi 134 | 135 | # traverses directory structure from process work directory to filesystem root 136 | # first directory with .mvn subdirectory is considered project base directory 137 | find_maven_basedir() { 138 | if [ -z "$1" ] 139 | then 140 | echo "Path not specified to find_maven_basedir" 141 | return 1 142 | fi 143 | 144 | basedir="$1" 145 | wdir="$1" 146 | while [ "$wdir" != '/' ] ; do 147 | if [ -d "$wdir"/.mvn ] ; then 148 | basedir=$wdir 149 | break 150 | fi 151 | # workaround for JBEAP-8937 (on Solaris 10/Sparc) 152 | if [ -d "${wdir}" ]; then 153 | wdir=$(cd "$wdir/.." || exit 1; pwd) 154 | fi 155 | # end of workaround 156 | done 157 | printf '%s' "$(cd "$basedir" || exit 1; pwd)" 158 | } 159 | 160 | # concatenates all lines of a file 161 | concat_lines() { 162 | if [ -f "$1" ]; then 163 | # Remove \r in case we run on Windows within Git Bash 164 | # and check out the repository with auto CRLF management 165 | # enabled. Otherwise, we may read lines that are delimited with 166 | # \r\n and produce $'-Xarg\r' rather than -Xarg due to word 167 | # splitting rules. 168 | tr -s '\r\n' ' ' < "$1" 169 | fi 170 | } 171 | 172 | log() { 173 | if [ "$MVNW_VERBOSE" = true ]; then 174 | printf '%s\n' "$1" 175 | fi 176 | } 177 | 178 | BASE_DIR=$(find_maven_basedir "$(dirname "$0")") 179 | if [ -z "$BASE_DIR" ]; then 180 | exit 1; 181 | fi 182 | 183 | MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}; export MAVEN_PROJECTBASEDIR 184 | log "$MAVEN_PROJECTBASEDIR" 185 | 186 | ########################################################################################## 187 | # Extension to allow automatically downloading the maven-wrapper.jar from Maven-central 188 | # This allows using the maven wrapper in projects that prohibit checking in binary data. 189 | ########################################################################################## 190 | wrapperJarPath="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" 191 | if [ -r "$wrapperJarPath" ]; then 192 | log "Found $wrapperJarPath" 193 | else 194 | log "Couldn't find $wrapperJarPath, downloading it ..." 195 | 196 | if [ -n "$MVNW_REPOURL" ]; then 197 | wrapperUrl="$MVNW_REPOURL/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar" 198 | else 199 | wrapperUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar" 200 | fi 201 | while IFS="=" read -r key value; do 202 | # Remove '\r' from value to allow usage on windows as IFS does not consider '\r' as a separator ( considers space, tab, new line ('\n'), and custom '=' ) 203 | safeValue=$(echo "$value" | tr -d '\r') 204 | case "$key" in (wrapperUrl) wrapperUrl="$safeValue"; break ;; 205 | esac 206 | done < "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.properties" 207 | log "Downloading from: $wrapperUrl" 208 | 209 | if $cygwin; then 210 | wrapperJarPath=$(cygpath --path --windows "$wrapperJarPath") 211 | fi 212 | 213 | if command -v wget > /dev/null; then 214 | log "Found wget ... using wget" 215 | [ "$MVNW_VERBOSE" = true ] && QUIET="" || QUIET="--quiet" 216 | if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then 217 | wget $QUIET "$wrapperUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" 218 | else 219 | wget $QUIET --http-user="$MVNW_USERNAME" --http-password="$MVNW_PASSWORD" "$wrapperUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" 220 | fi 221 | elif command -v curl > /dev/null; then 222 | log "Found curl ... using curl" 223 | [ "$MVNW_VERBOSE" = true ] && QUIET="" || QUIET="--silent" 224 | if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then 225 | curl $QUIET -o "$wrapperJarPath" "$wrapperUrl" -f -L || rm -f "$wrapperJarPath" 226 | else 227 | curl $QUIET --user "$MVNW_USERNAME:$MVNW_PASSWORD" -o "$wrapperJarPath" "$wrapperUrl" -f -L || rm -f "$wrapperJarPath" 228 | fi 229 | else 230 | log "Falling back to using Java to download" 231 | javaSource="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/MavenWrapperDownloader.java" 232 | javaClass="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/MavenWrapperDownloader.class" 233 | # For Cygwin, switch paths to Windows format before running javac 234 | if $cygwin; then 235 | javaSource=$(cygpath --path --windows "$javaSource") 236 | javaClass=$(cygpath --path --windows "$javaClass") 237 | fi 238 | if [ -e "$javaSource" ]; then 239 | if [ ! -e "$javaClass" ]; then 240 | log " - Compiling MavenWrapperDownloader.java ..." 241 | ("$JAVA_HOME/bin/javac" "$javaSource") 242 | fi 243 | if [ -e "$javaClass" ]; then 244 | log " - Running MavenWrapperDownloader.java ..." 245 | ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$wrapperUrl" "$wrapperJarPath") || rm -f "$wrapperJarPath" 246 | fi 247 | fi 248 | fi 249 | fi 250 | ########################################################################################## 251 | # End of extension 252 | ########################################################################################## 253 | 254 | # If specified, validate the SHA-256 sum of the Maven wrapper jar file 255 | wrapperSha256Sum="" 256 | while IFS="=" read -r key value; do 257 | case "$key" in (wrapperSha256Sum) wrapperSha256Sum=$value; break ;; 258 | esac 259 | done < "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.properties" 260 | if [ -n "$wrapperSha256Sum" ]; then 261 | wrapperSha256Result=false 262 | if command -v sha256sum > /dev/null; then 263 | if echo "$wrapperSha256Sum $wrapperJarPath" | sha256sum -c > /dev/null 2>&1; then 264 | wrapperSha256Result=true 265 | fi 266 | elif command -v shasum > /dev/null; then 267 | if echo "$wrapperSha256Sum $wrapperJarPath" | shasum -a 256 -c > /dev/null 2>&1; then 268 | wrapperSha256Result=true 269 | fi 270 | else 271 | echo "Checksum validation was requested but neither 'sha256sum' or 'shasum' are available." 272 | echo "Please install either command, or disable validation by removing 'wrapperSha256Sum' from your maven-wrapper.properties." 273 | exit 1 274 | fi 275 | if [ $wrapperSha256Result = false ]; then 276 | echo "Error: Failed to validate Maven wrapper SHA-256, your Maven wrapper might be compromised." >&2 277 | echo "Investigate or delete $wrapperJarPath to attempt a clean download." >&2 278 | echo "If you updated your Maven version, you need to update the specified wrapperSha256Sum property." >&2 279 | exit 1 280 | fi 281 | fi 282 | 283 | MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" 284 | 285 | # For Cygwin, switch paths to Windows format before running java 286 | if $cygwin; then 287 | [ -n "$JAVA_HOME" ] && 288 | JAVA_HOME=$(cygpath --path --windows "$JAVA_HOME") 289 | [ -n "$CLASSPATH" ] && 290 | CLASSPATH=$(cygpath --path --windows "$CLASSPATH") 291 | [ -n "$MAVEN_PROJECTBASEDIR" ] && 292 | MAVEN_PROJECTBASEDIR=$(cygpath --path --windows "$MAVEN_PROJECTBASEDIR") 293 | fi 294 | 295 | # Provide a "standardized" way to retrieve the CLI args that will 296 | # work with both Windows and non-Windows executions. 297 | MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $*" 298 | export MAVEN_CMD_LINE_ARGS 299 | 300 | WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain 301 | 302 | # shellcheck disable=SC2086 # safe args 303 | exec "$JAVACMD" \ 304 | $MAVEN_OPTS \ 305 | $MAVEN_DEBUG_OPTS \ 306 | -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ 307 | "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ 308 | ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" 309 | -------------------------------------------------------------------------------- /display/front-end/vue-project/src/components/Aside.vue: -------------------------------------------------------------------------------- 1 | 292 | 293 | 307 | 308 | -------------------------------------------------------------------------------- /display/front-end/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "front-end", 3 | "lockfileVersion": 2, 4 | "requires": true, 5 | "packages": { 6 | "": { 7 | "dependencies": { 8 | "element-ui": "^2.15.13" 9 | } 10 | }, 11 | "node_modules/@babel/parser": { 12 | "version": "7.22.4", 13 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.4.tgz", 14 | "integrity": "sha512-VLLsx06XkEYqBtE5YGPwfSGwfrjnyPP5oiGty3S8pQLFDFLaS8VwWSIxkTXpcvr5zeYLE6+MBNl2npl/YnfofA==", 15 | "peer": true, 16 | "bin": { 17 | "parser": "bin/babel-parser.js" 18 | }, 19 | "engines": { 20 | "node": ">=6.0.0" 21 | } 22 | }, 23 | "node_modules/@vue/compiler-sfc": { 24 | "version": "2.7.14", 25 | "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-2.7.14.tgz", 26 | "integrity": "sha512-aNmNHyLPsw+sVvlQFQ2/8sjNuLtK54TC6cuKnVzAY93ks4ZBrvwQSnkkIh7bsbNhum5hJBS00wSDipQ937f5DA==", 27 | "peer": true, 28 | "dependencies": { 29 | "@babel/parser": "^7.18.4", 30 | "postcss": "^8.4.14", 31 | "source-map": "^0.6.1" 32 | } 33 | }, 34 | "node_modules/async-validator": { 35 | "version": "1.8.5", 36 | "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-1.8.5.tgz", 37 | "integrity": "sha512-tXBM+1m056MAX0E8TL2iCjg8WvSyXu0Zc8LNtYqrVeyoL3+esHRZ4SieE9fKQyyU09uONjnMEjrNBMqT0mbvmA==", 38 | "dependencies": { 39 | "babel-runtime": "6.x" 40 | } 41 | }, 42 | "node_modules/babel-helper-vue-jsx-merge-props": { 43 | "version": "2.0.3", 44 | "resolved": "https://registry.npmjs.org/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-2.0.3.tgz", 45 | "integrity": "sha512-gsLiKK7Qrb7zYJNgiXKpXblxbV5ffSwR0f5whkPAaBAR4fhi6bwRZxX9wBlIc5M/v8CCkXUbXZL4N/nSE97cqg==" 46 | }, 47 | "node_modules/babel-runtime": { 48 | "version": "6.26.0", 49 | "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", 50 | "integrity": "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==", 51 | "dependencies": { 52 | "core-js": "^2.4.0", 53 | "regenerator-runtime": "^0.11.0" 54 | } 55 | }, 56 | "node_modules/core-js": { 57 | "version": "2.6.12", 58 | "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", 59 | "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", 60 | "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.", 61 | "hasInstallScript": true 62 | }, 63 | "node_modules/csstype": { 64 | "version": "3.1.2", 65 | "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", 66 | "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==", 67 | "peer": true 68 | }, 69 | "node_modules/deepmerge": { 70 | "version": "1.5.2", 71 | "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-1.5.2.tgz", 72 | "integrity": "sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ==", 73 | "engines": { 74 | "node": ">=0.10.0" 75 | } 76 | }, 77 | "node_modules/element-ui": { 78 | "version": "2.15.13", 79 | "resolved": "https://registry.npmjs.org/element-ui/-/element-ui-2.15.13.tgz", 80 | "integrity": "sha512-LJoatEYX6WV74FqXBss8Xfho9fh9rjDSzrDrTyREdGb1h1R3uRvmLh5jqp2JU137aj4/BgqA3K06RQpQBX33Bg==", 81 | "dependencies": { 82 | "async-validator": "~1.8.1", 83 | "babel-helper-vue-jsx-merge-props": "^2.0.0", 84 | "deepmerge": "^1.2.0", 85 | "normalize-wheel": "^1.0.1", 86 | "resize-observer-polyfill": "^1.5.0", 87 | "throttle-debounce": "^1.0.1" 88 | }, 89 | "peerDependencies": { 90 | "vue": "^2.5.17" 91 | } 92 | }, 93 | "node_modules/nanoid": { 94 | "version": "3.3.6", 95 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", 96 | "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", 97 | "funding": [ 98 | { 99 | "type": "github", 100 | "url": "https://github.com/sponsors/ai" 101 | } 102 | ], 103 | "peer": true, 104 | "bin": { 105 | "nanoid": "bin/nanoid.cjs" 106 | }, 107 | "engines": { 108 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 109 | } 110 | }, 111 | "node_modules/normalize-wheel": { 112 | "version": "1.0.1", 113 | "resolved": "https://registry.npmjs.org/normalize-wheel/-/normalize-wheel-1.0.1.tgz", 114 | "integrity": "sha512-1OnlAPZ3zgrk8B91HyRj+eVv+kS5u+Z0SCsak6Xil/kmgEia50ga7zfkumayonZrImffAxPU/5WcyGhzetHNPA==" 115 | }, 116 | "node_modules/picocolors": { 117 | "version": "1.0.0", 118 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", 119 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", 120 | "peer": true 121 | }, 122 | "node_modules/postcss": { 123 | "version": "8.4.24", 124 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.24.tgz", 125 | "integrity": "sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg==", 126 | "funding": [ 127 | { 128 | "type": "opencollective", 129 | "url": "https://opencollective.com/postcss/" 130 | }, 131 | { 132 | "type": "tidelift", 133 | "url": "https://tidelift.com/funding/github/npm/postcss" 134 | }, 135 | { 136 | "type": "github", 137 | "url": "https://github.com/sponsors/ai" 138 | } 139 | ], 140 | "peer": true, 141 | "dependencies": { 142 | "nanoid": "^3.3.6", 143 | "picocolors": "^1.0.0", 144 | "source-map-js": "^1.0.2" 145 | }, 146 | "engines": { 147 | "node": "^10 || ^12 || >=14" 148 | } 149 | }, 150 | "node_modules/regenerator-runtime": { 151 | "version": "0.11.1", 152 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", 153 | "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" 154 | }, 155 | "node_modules/resize-observer-polyfill": { 156 | "version": "1.5.1", 157 | "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", 158 | "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" 159 | }, 160 | "node_modules/source-map": { 161 | "version": "0.6.1", 162 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 163 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 164 | "peer": true, 165 | "engines": { 166 | "node": ">=0.10.0" 167 | } 168 | }, 169 | "node_modules/source-map-js": { 170 | "version": "1.0.2", 171 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", 172 | "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", 173 | "peer": true, 174 | "engines": { 175 | "node": ">=0.10.0" 176 | } 177 | }, 178 | "node_modules/throttle-debounce": { 179 | "version": "1.1.0", 180 | "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-1.1.0.tgz", 181 | "integrity": "sha512-XH8UiPCQcWNuk2LYePibW/4qL97+ZQ1AN3FNXwZRBNPPowo/NRU5fAlDCSNBJIYCKbioZfuYtMhG4quqoJhVzg==", 182 | "engines": { 183 | "node": ">=4" 184 | } 185 | }, 186 | "node_modules/vue": { 187 | "version": "2.7.14", 188 | "resolved": "https://registry.npmjs.org/vue/-/vue-2.7.14.tgz", 189 | "integrity": "sha512-b2qkFyOM0kwqWFuQmgd4o+uHGU7T+2z3T+WQp8UBjADfEv2n4FEMffzBmCKNP0IGzOEEfYjvtcC62xaSKeQDrQ==", 190 | "peer": true, 191 | "dependencies": { 192 | "@vue/compiler-sfc": "2.7.14", 193 | "csstype": "^3.1.0" 194 | } 195 | } 196 | }, 197 | "dependencies": { 198 | "@babel/parser": { 199 | "version": "7.22.4", 200 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.4.tgz", 201 | "integrity": "sha512-VLLsx06XkEYqBtE5YGPwfSGwfrjnyPP5oiGty3S8pQLFDFLaS8VwWSIxkTXpcvr5zeYLE6+MBNl2npl/YnfofA==", 202 | "peer": true 203 | }, 204 | "@vue/compiler-sfc": { 205 | "version": "2.7.14", 206 | "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-2.7.14.tgz", 207 | "integrity": "sha512-aNmNHyLPsw+sVvlQFQ2/8sjNuLtK54TC6cuKnVzAY93ks4ZBrvwQSnkkIh7bsbNhum5hJBS00wSDipQ937f5DA==", 208 | "peer": true, 209 | "requires": { 210 | "@babel/parser": "^7.18.4", 211 | "postcss": "^8.4.14", 212 | "source-map": "^0.6.1" 213 | } 214 | }, 215 | "async-validator": { 216 | "version": "1.8.5", 217 | "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-1.8.5.tgz", 218 | "integrity": "sha512-tXBM+1m056MAX0E8TL2iCjg8WvSyXu0Zc8LNtYqrVeyoL3+esHRZ4SieE9fKQyyU09uONjnMEjrNBMqT0mbvmA==", 219 | "requires": { 220 | "babel-runtime": "6.x" 221 | } 222 | }, 223 | "babel-helper-vue-jsx-merge-props": { 224 | "version": "2.0.3", 225 | "resolved": "https://registry.npmjs.org/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-2.0.3.tgz", 226 | "integrity": "sha512-gsLiKK7Qrb7zYJNgiXKpXblxbV5ffSwR0f5whkPAaBAR4fhi6bwRZxX9wBlIc5M/v8CCkXUbXZL4N/nSE97cqg==" 227 | }, 228 | "babel-runtime": { 229 | "version": "6.26.0", 230 | "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", 231 | "integrity": "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==", 232 | "requires": { 233 | "core-js": "^2.4.0", 234 | "regenerator-runtime": "^0.11.0" 235 | } 236 | }, 237 | "core-js": { 238 | "version": "2.6.12", 239 | "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", 240 | "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==" 241 | }, 242 | "csstype": { 243 | "version": "3.1.2", 244 | "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", 245 | "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==", 246 | "peer": true 247 | }, 248 | "deepmerge": { 249 | "version": "1.5.2", 250 | "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-1.5.2.tgz", 251 | "integrity": "sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ==" 252 | }, 253 | "element-ui": { 254 | "version": "2.15.13", 255 | "resolved": "https://registry.npmjs.org/element-ui/-/element-ui-2.15.13.tgz", 256 | "integrity": "sha512-LJoatEYX6WV74FqXBss8Xfho9fh9rjDSzrDrTyREdGb1h1R3uRvmLh5jqp2JU137aj4/BgqA3K06RQpQBX33Bg==", 257 | "requires": { 258 | "async-validator": "~1.8.1", 259 | "babel-helper-vue-jsx-merge-props": "^2.0.0", 260 | "deepmerge": "^1.2.0", 261 | "normalize-wheel": "^1.0.1", 262 | "resize-observer-polyfill": "^1.5.0", 263 | "throttle-debounce": "^1.0.1" 264 | } 265 | }, 266 | "nanoid": { 267 | "version": "3.3.6", 268 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", 269 | "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", 270 | "peer": true 271 | }, 272 | "normalize-wheel": { 273 | "version": "1.0.1", 274 | "resolved": "https://registry.npmjs.org/normalize-wheel/-/normalize-wheel-1.0.1.tgz", 275 | "integrity": "sha512-1OnlAPZ3zgrk8B91HyRj+eVv+kS5u+Z0SCsak6Xil/kmgEia50ga7zfkumayonZrImffAxPU/5WcyGhzetHNPA==" 276 | }, 277 | "picocolors": { 278 | "version": "1.0.0", 279 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", 280 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", 281 | "peer": true 282 | }, 283 | "postcss": { 284 | "version": "8.4.24", 285 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.24.tgz", 286 | "integrity": "sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg==", 287 | "peer": true, 288 | "requires": { 289 | "nanoid": "^3.3.6", 290 | "picocolors": "^1.0.0", 291 | "source-map-js": "^1.0.2" 292 | } 293 | }, 294 | "regenerator-runtime": { 295 | "version": "0.11.1", 296 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", 297 | "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" 298 | }, 299 | "resize-observer-polyfill": { 300 | "version": "1.5.1", 301 | "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", 302 | "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" 303 | }, 304 | "source-map": { 305 | "version": "0.6.1", 306 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 307 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 308 | "peer": true 309 | }, 310 | "source-map-js": { 311 | "version": "1.0.2", 312 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", 313 | "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", 314 | "peer": true 315 | }, 316 | "throttle-debounce": { 317 | "version": "1.1.0", 318 | "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-1.1.0.tgz", 319 | "integrity": "sha512-XH8UiPCQcWNuk2LYePibW/4qL97+ZQ1AN3FNXwZRBNPPowo/NRU5fAlDCSNBJIYCKbioZfuYtMhG4quqoJhVzg==" 320 | }, 321 | "vue": { 322 | "version": "2.7.14", 323 | "resolved": "https://registry.npmjs.org/vue/-/vue-2.7.14.tgz", 324 | "integrity": "sha512-b2qkFyOM0kwqWFuQmgd4o+uHGU7T+2z3T+WQp8UBjADfEv2n4FEMffzBmCKNP0IGzOEEfYjvtcC62xaSKeQDrQ==", 325 | "peer": true, 326 | "requires": { 327 | "@vue/compiler-sfc": "2.7.14", 328 | "csstype": "^3.1.0" 329 | } 330 | } 331 | } 332 | } 333 | -------------------------------------------------------------------------------- /display/front-end/vue-project/yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@babel/parser@^7.20.15", "@babel/parser@^7.21.3": 6 | "integrity" "sha512-q5PNg/Bi1OpGgx5jYlvWZwAorZepEudDMCLtj967aeS7WMont7dUZI46M2XwcIQqvUlMxWfdLFu4S/qSxeUu5g==" 7 | "resolved" "https://registry.npmjs.org/@babel/parser/-/parser-7.21.9.tgz" 8 | "version" "7.21.9" 9 | 10 | "@ctrl/tinycolor@^3.4.1": 11 | "integrity" "sha512-/Z3l6pXthq0JvMYdUFyX9j0MaCltlIn6mfh9jLyQwg5aPKxkyNa0PTHtU1AlFXLNk55ZuAeJRcpvq+tmLfKmaQ==" 12 | "resolved" "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.6.0.tgz" 13 | "version" "3.6.0" 14 | 15 | "@element-plus/icons-vue@^2.0.6": 16 | "integrity" "sha512-PSBn3elNoanENc1vnCfh+3WA9fimRC7n+fWkf3rE5jvv+aBohNHABC/KAR5KWPecxWxDTVT1ERpRbOMRcOV/vA==" 17 | "resolved" "https://registry.npmjs.org/@element-plus/icons-vue/-/icons-vue-2.1.0.tgz" 18 | "version" "2.1.0" 19 | 20 | "@esbuild/win32-x64@0.17.19": 21 | "integrity" "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==" 22 | "resolved" "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz" 23 | "version" "0.17.19" 24 | 25 | "@floating-ui/core@^1.2.6": 26 | "integrity" "sha512-EvYTiXet5XqweYGClEmpu3BoxmsQ4hkj3QaYA6qEnigCWffTP3vNRwBReTdrwDwo7OoJ3wM8Uoe9Uk4n+d4hfg==" 27 | "resolved" "https://registry.npmjs.org/@floating-ui/core/-/core-1.2.6.tgz" 28 | "version" "1.2.6" 29 | 30 | "@floating-ui/dom@^1.0.1": 31 | "integrity" "sha512-sosQxsqgxMNkV3C+3UqTS6LxP7isRLwX8WMepp843Rb3/b0Wz8+MdUkxJksByip3C2WwLugLHN1b4ibn//zKwQ==" 32 | "resolved" "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.2.9.tgz" 33 | "version" "1.2.9" 34 | dependencies: 35 | "@floating-ui/core" "^1.2.6" 36 | 37 | "@jridgewell/sourcemap-codec@^1.4.13": 38 | "integrity" "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" 39 | "resolved" "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz" 40 | "version" "1.4.15" 41 | 42 | "@popperjs/core@npm:@sxzz/popperjs-es@^2.11.7": 43 | "integrity" "sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ==" 44 | "resolved" "https://registry.npmjs.org/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz" 45 | "version" "2.11.7" 46 | 47 | "@types/lodash-es@*", "@types/lodash-es@^4.17.6": 48 | "integrity" "sha512-z0ptr6UI10VlU6l5MYhGwS4mC8DZyYer2mCoyysZtSF7p26zOX8UpbrV0YpNYLGS8K4PUFIyEr62IMFFjveSiQ==" 49 | "resolved" "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.7.tgz" 50 | "version" "4.17.7" 51 | dependencies: 52 | "@types/lodash" "*" 53 | 54 | "@types/lodash@*", "@types/lodash@^4.14.182": 55 | "integrity" "sha512-Hwx9EUgdwf2GLarOjQp5ZH8ZmblzcbTBC2wtQWNKARBSxM9ezRIAUpeDTgoQRAFB0+8CNWXVA9+MaSOzOF3nPg==" 56 | "resolved" "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.195.tgz" 57 | "version" "4.14.195" 58 | 59 | "@types/web-bluetooth@^0.0.16": 60 | "integrity" "sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==" 61 | "resolved" "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz" 62 | "version" "0.0.16" 63 | 64 | "@vitejs/plugin-vue@^4.2.3": 65 | "integrity" "sha512-R6JDUfiZbJA9cMiguQ7jxALsgiprjBeHL5ikpXfJCH62pPHtI+JdJ5xWj6Ev73yXSlYl86+blXn1kZHQ7uElxw==" 66 | "resolved" "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-4.2.3.tgz" 67 | "version" "4.2.3" 68 | 69 | "@vue/compiler-core@3.3.4": 70 | "integrity" "sha512-cquyDNvZ6jTbf/+x+AgM2Arrp6G4Dzbb0R64jiG804HRMfRiFXWI6kqUVqZ6ZR0bQhIoQjB4+2bhNtVwndW15g==" 71 | "resolved" "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.3.4.tgz" 72 | "version" "3.3.4" 73 | dependencies: 74 | "@babel/parser" "^7.21.3" 75 | "@vue/shared" "3.3.4" 76 | "estree-walker" "^2.0.2" 77 | "source-map-js" "^1.0.2" 78 | 79 | "@vue/compiler-dom@3.3.4": 80 | "integrity" "sha512-wyM+OjOVpuUukIq6p5+nwHYtj9cFroz9cwkfmP9O1nzH68BenTTv0u7/ndggT8cIQlnBeOo6sUT/gvHcIkLA5w==" 81 | "resolved" "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.3.4.tgz" 82 | "version" "3.3.4" 83 | dependencies: 84 | "@vue/compiler-core" "3.3.4" 85 | "@vue/shared" "3.3.4" 86 | 87 | "@vue/compiler-sfc@3.3.4": 88 | "integrity" "sha512-6y/d8uw+5TkCuzBkgLS0v3lSM3hJDntFEiUORM11pQ/hKvkhSKZrXW6i69UyXlJQisJxuUEJKAWEqWbWsLeNKQ==" 89 | "resolved" "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.3.4.tgz" 90 | "version" "3.3.4" 91 | dependencies: 92 | "@babel/parser" "^7.20.15" 93 | "@vue/compiler-core" "3.3.4" 94 | "@vue/compiler-dom" "3.3.4" 95 | "@vue/compiler-ssr" "3.3.4" 96 | "@vue/reactivity-transform" "3.3.4" 97 | "@vue/shared" "3.3.4" 98 | "estree-walker" "^2.0.2" 99 | "magic-string" "^0.30.0" 100 | "postcss" "^8.1.10" 101 | "source-map-js" "^1.0.2" 102 | 103 | "@vue/compiler-ssr@3.3.4": 104 | "integrity" "sha512-m0v6oKpup2nMSehwA6Uuu+j+wEwcy7QmwMkVNVfrV9P2qE5KshC6RwOCq8fjGS/Eak/uNb8AaWekfiXxbBB6gQ==" 105 | "resolved" "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.3.4.tgz" 106 | "version" "3.3.4" 107 | dependencies: 108 | "@vue/compiler-dom" "3.3.4" 109 | "@vue/shared" "3.3.4" 110 | 111 | "@vue/devtools-api@^6.5.0": 112 | "integrity" "sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q==" 113 | "resolved" "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.5.0.tgz" 114 | "version" "6.5.0" 115 | 116 | "@vue/reactivity-transform@3.3.4": 117 | "integrity" "sha512-MXgwjako4nu5WFLAjpBnCj/ieqcjE2aJBINUNQzkZQfzIZA4xn+0fV1tIYBJvvva3N3OvKGofRLvQIwEQPpaXw==" 118 | "resolved" "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.3.4.tgz" 119 | "version" "3.3.4" 120 | dependencies: 121 | "@babel/parser" "^7.20.15" 122 | "@vue/compiler-core" "3.3.4" 123 | "@vue/shared" "3.3.4" 124 | "estree-walker" "^2.0.2" 125 | "magic-string" "^0.30.0" 126 | 127 | "@vue/reactivity@3.3.4": 128 | "integrity" "sha512-kLTDLwd0B1jG08NBF3R5rqULtv/f8x3rOFByTDz4J53ttIQEDmALqKqXY0J+XQeN0aV2FBxY8nJDf88yvOPAqQ==" 129 | "resolved" "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.3.4.tgz" 130 | "version" "3.3.4" 131 | dependencies: 132 | "@vue/shared" "3.3.4" 133 | 134 | "@vue/runtime-core@3.3.4": 135 | "integrity" "sha512-R+bqxMN6pWO7zGI4OMlmvePOdP2c93GsHFM/siJI7O2nxFRzj55pLwkpCedEY+bTMgp5miZ8CxfIZo3S+gFqvA==" 136 | "resolved" "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.3.4.tgz" 137 | "version" "3.3.4" 138 | dependencies: 139 | "@vue/reactivity" "3.3.4" 140 | "@vue/shared" "3.3.4" 141 | 142 | "@vue/runtime-dom@3.3.4": 143 | "integrity" "sha512-Aj5bTJ3u5sFsUckRghsNjVTtxZQ1OyMWCr5dZRAPijF/0Vy4xEoRCwLyHXcj4D0UFbJ4lbx3gPTgg06K/GnPnQ==" 144 | "resolved" "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.3.4.tgz" 145 | "version" "3.3.4" 146 | dependencies: 147 | "@vue/runtime-core" "3.3.4" 148 | "@vue/shared" "3.3.4" 149 | "csstype" "^3.1.1" 150 | 151 | "@vue/server-renderer@3.3.4": 152 | "integrity" "sha512-Q6jDDzR23ViIb67v+vM1Dqntu+HUexQcsWKhhQa4ARVzxOY2HbC7QRW/ggkDBd5BU+uM1sV6XOAP0b216o34JQ==" 153 | "resolved" "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.3.4.tgz" 154 | "version" "3.3.4" 155 | dependencies: 156 | "@vue/compiler-ssr" "3.3.4" 157 | "@vue/shared" "3.3.4" 158 | 159 | "@vue/shared@3.3.4": 160 | "integrity" "sha512-7OjdcV8vQ74eiz1TZLzZP4JwqM5fA94K6yntPS5Z25r9HDuGNzaGdgvwKYq6S+MxwF0TFRwe50fIR/MYnakdkQ==" 161 | "resolved" "https://registry.npmjs.org/@vue/shared/-/shared-3.3.4.tgz" 162 | "version" "3.3.4" 163 | 164 | "@vueuse/core@^9.1.0": 165 | "integrity" "sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==" 166 | "resolved" "https://registry.npmjs.org/@vueuse/core/-/core-9.13.0.tgz" 167 | "version" "9.13.0" 168 | dependencies: 169 | "@types/web-bluetooth" "^0.0.16" 170 | "@vueuse/metadata" "9.13.0" 171 | "@vueuse/shared" "9.13.0" 172 | "vue-demi" "*" 173 | 174 | "@vueuse/metadata@9.13.0": 175 | "integrity" "sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==" 176 | "resolved" "https://registry.npmjs.org/@vueuse/metadata/-/metadata-9.13.0.tgz" 177 | "version" "9.13.0" 178 | 179 | "@vueuse/shared@9.13.0": 180 | "integrity" "sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==" 181 | "resolved" "https://registry.npmjs.org/@vueuse/shared/-/shared-9.13.0.tgz" 182 | "version" "9.13.0" 183 | dependencies: 184 | "vue-demi" "*" 185 | 186 | "async-validator@^4.2.5": 187 | "integrity" "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==" 188 | "resolved" "https://registry.npmjs.org/async-validator/-/async-validator-4.2.5.tgz" 189 | "version" "4.2.5" 190 | 191 | "asynckit@^0.4.0": 192 | "integrity" "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" 193 | "resolved" "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" 194 | "version" "0.4.0" 195 | 196 | "axios@^1.4.0": 197 | "integrity" "sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==" 198 | "resolved" "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz" 199 | "version" "1.4.0" 200 | dependencies: 201 | "follow-redirects" "^1.15.0" 202 | "form-data" "^4.0.0" 203 | "proxy-from-env" "^1.1.0" 204 | 205 | "combined-stream@^1.0.8": 206 | "integrity" "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==" 207 | "resolved" "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" 208 | "version" "1.0.8" 209 | dependencies: 210 | "delayed-stream" "~1.0.0" 211 | 212 | "csstype@^3.1.1": 213 | "integrity" "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" 214 | "resolved" "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz" 215 | "version" "3.1.2" 216 | 217 | "dayjs@^1.11.3": 218 | "integrity" "sha512-LcgxzFoWMEPO7ggRv1Y2N31hUf2R0Vj7fuy/m+Bg1K8rr+KAs1AEy4y9jd5DXe8pbHgX+srkHNS7TH6Q6ZhYeQ==" 219 | "resolved" "https://registry.npmjs.org/dayjs/-/dayjs-1.11.8.tgz" 220 | "version" "1.11.8" 221 | 222 | "delayed-stream@~1.0.0": 223 | "integrity" "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" 224 | "resolved" "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" 225 | "version" "1.0.0" 226 | 227 | "echarts@^5.4.2": 228 | "integrity" "sha512-2W3vw3oI2tWJdyAz+b8DuWS0nfXtSDqlDmqgin/lfzbkB01cuMEN66KWBlmur3YMp5nEDEEt5s23pllnAzB4EA==" 229 | "resolved" "https://registry.npmjs.org/echarts/-/echarts-5.4.2.tgz" 230 | "version" "5.4.2" 231 | dependencies: 232 | "tslib" "2.3.0" 233 | "zrender" "5.4.3" 234 | 235 | "element-plus@^2.3.6": 236 | "integrity" "sha512-GLz0pXUYI2zRfIgyI6W7SWmHk6dSEikP9yR++hsQUyy63+WjutoiGpA3SZD4cGPSXUzRFeKfVr8CnYhK5LqXZw==" 237 | "resolved" "https://registry.npmjs.org/element-plus/-/element-plus-2.3.6.tgz" 238 | "version" "2.3.6" 239 | dependencies: 240 | "@ctrl/tinycolor" "^3.4.1" 241 | "@element-plus/icons-vue" "^2.0.6" 242 | "@floating-ui/dom" "^1.0.1" 243 | "@popperjs/core" "npm:@sxzz/popperjs-es@^2.11.7" 244 | "@types/lodash" "^4.14.182" 245 | "@types/lodash-es" "^4.17.6" 246 | "@vueuse/core" "^9.1.0" 247 | "async-validator" "^4.2.5" 248 | "dayjs" "^1.11.3" 249 | "escape-html" "^1.0.3" 250 | "lodash" "^4.17.21" 251 | "lodash-es" "^4.17.21" 252 | "lodash-unified" "^1.0.2" 253 | "memoize-one" "^6.0.0" 254 | "normalize-wheel-es" "^1.2.0" 255 | 256 | "esbuild@^0.17.5": 257 | "integrity" "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==" 258 | "resolved" "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz" 259 | "version" "0.17.19" 260 | optionalDependencies: 261 | "@esbuild/android-arm" "0.17.19" 262 | "@esbuild/android-arm64" "0.17.19" 263 | "@esbuild/android-x64" "0.17.19" 264 | "@esbuild/darwin-arm64" "0.17.19" 265 | "@esbuild/darwin-x64" "0.17.19" 266 | "@esbuild/freebsd-arm64" "0.17.19" 267 | "@esbuild/freebsd-x64" "0.17.19" 268 | "@esbuild/linux-arm" "0.17.19" 269 | "@esbuild/linux-arm64" "0.17.19" 270 | "@esbuild/linux-ia32" "0.17.19" 271 | "@esbuild/linux-loong64" "0.17.19" 272 | "@esbuild/linux-mips64el" "0.17.19" 273 | "@esbuild/linux-ppc64" "0.17.19" 274 | "@esbuild/linux-riscv64" "0.17.19" 275 | "@esbuild/linux-s390x" "0.17.19" 276 | "@esbuild/linux-x64" "0.17.19" 277 | "@esbuild/netbsd-x64" "0.17.19" 278 | "@esbuild/openbsd-x64" "0.17.19" 279 | "@esbuild/sunos-x64" "0.17.19" 280 | "@esbuild/win32-arm64" "0.17.19" 281 | "@esbuild/win32-ia32" "0.17.19" 282 | "@esbuild/win32-x64" "0.17.19" 283 | 284 | "escape-html@^1.0.3": 285 | "integrity" "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" 286 | "resolved" "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" 287 | "version" "1.0.3" 288 | 289 | "estree-walker@^2.0.2": 290 | "integrity" "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" 291 | "resolved" "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz" 292 | "version" "2.0.2" 293 | 294 | "follow-redirects@^1.15.0": 295 | "integrity" "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" 296 | "resolved" "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz" 297 | "version" "1.15.2" 298 | 299 | "form-data@^4.0.0": 300 | "integrity" "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==" 301 | "resolved" "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz" 302 | "version" "4.0.0" 303 | dependencies: 304 | "asynckit" "^0.4.0" 305 | "combined-stream" "^1.0.8" 306 | "mime-types" "^2.1.12" 307 | 308 | "lodash-es@*", "lodash-es@^4.17.21": 309 | "integrity" "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" 310 | "resolved" "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz" 311 | "version" "4.17.21" 312 | 313 | "lodash-unified@^1.0.2": 314 | "integrity" "sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==" 315 | "resolved" "https://registry.npmjs.org/lodash-unified/-/lodash-unified-1.0.3.tgz" 316 | "version" "1.0.3" 317 | 318 | "lodash@*", "lodash@^4.17.21": 319 | "integrity" "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" 320 | "resolved" "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" 321 | "version" "4.17.21" 322 | 323 | "magic-string@^0.30.0": 324 | "integrity" "sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==" 325 | "resolved" "https://registry.npmjs.org/magic-string/-/magic-string-0.30.0.tgz" 326 | "version" "0.30.0" 327 | dependencies: 328 | "@jridgewell/sourcemap-codec" "^1.4.13" 329 | 330 | "memoize-one@^6.0.0": 331 | "integrity" "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==" 332 | "resolved" "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz" 333 | "version" "6.0.0" 334 | 335 | "mime-db@1.52.0": 336 | "integrity" "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" 337 | "resolved" "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" 338 | "version" "1.52.0" 339 | 340 | "mime-types@^2.1.12": 341 | "integrity" "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==" 342 | "resolved" "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" 343 | "version" "2.1.35" 344 | dependencies: 345 | "mime-db" "1.52.0" 346 | 347 | "nanoid@^3.3.6": 348 | "integrity" "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==" 349 | "resolved" "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz" 350 | "version" "3.3.6" 351 | 352 | "normalize-wheel-es@^1.2.0": 353 | "integrity" "sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==" 354 | "resolved" "https://registry.npmjs.org/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz" 355 | "version" "1.2.0" 356 | 357 | "picocolors@^1.0.0": 358 | "integrity" "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" 359 | "resolved" "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" 360 | "version" "1.0.0" 361 | 362 | "pinia@^2.1.3": 363 | "integrity" "sha512-XNA/z/ye4P5rU1pieVmh0g/hSuDO98/a5UC8oSP0DNdvt6YtetJNHTrXwpwsQuflkGT34qKxAEcp7lSxXNjf/A==" 364 | "resolved" "https://registry.npmjs.org/pinia/-/pinia-2.1.3.tgz" 365 | "version" "2.1.3" 366 | dependencies: 367 | "@vue/devtools-api" "^6.5.0" 368 | "vue-demi" ">=0.14.5" 369 | 370 | "postcss@^8.1.10", "postcss@^8.4.23": 371 | "integrity" "sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA==" 372 | "resolved" "https://registry.npmjs.org/postcss/-/postcss-8.4.23.tgz" 373 | "version" "8.4.23" 374 | dependencies: 375 | "nanoid" "^3.3.6" 376 | "picocolors" "^1.0.0" 377 | "source-map-js" "^1.0.2" 378 | 379 | "proxy-from-env@^1.1.0": 380 | "integrity" "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" 381 | "resolved" "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz" 382 | "version" "1.1.0" 383 | 384 | "rollup@^3.21.0": 385 | "integrity" "sha512-h31UlwEi7FHihLe1zbk+3Q7z1k/84rb9BSwmBSr/XjOCEaBJ2YyedQDuM0t/kfOS0IxM+vk1/zI9XxYj9V+NJQ==" 386 | "resolved" "https://registry.npmjs.org/rollup/-/rollup-3.23.0.tgz" 387 | "version" "3.23.0" 388 | optionalDependencies: 389 | "fsevents" "~2.3.2" 390 | 391 | "source-map-js@^1.0.2": 392 | "integrity" "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==" 393 | "resolved" "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz" 394 | "version" "1.0.2" 395 | 396 | "tslib@2.3.0": 397 | "integrity" "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" 398 | "resolved" "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz" 399 | "version" "2.3.0" 400 | 401 | "vite@^4.0.0", "vite@^4.3.5": 402 | "integrity" "sha512-qsTNZjO9NoJNW7KnOrgYwczm0WctJ8m/yqYAMAK9Lxt4SoySUfS5S8ia9K7JHpa3KEeMfyF8LoJ3c5NeBJy6pg==" 403 | "resolved" "https://registry.npmjs.org/vite/-/vite-4.3.9.tgz" 404 | "version" "4.3.9" 405 | dependencies: 406 | "esbuild" "^0.17.5" 407 | "postcss" "^8.4.23" 408 | "rollup" "^3.21.0" 409 | optionalDependencies: 410 | "fsevents" "~2.3.2" 411 | 412 | "vue-demi@*", "vue-demi@>=0.14.5": 413 | "integrity" "sha512-o9NUVpl/YlsGJ7t+xuqJKx8EBGf1quRhCiT6D/J0pfwmk9zUwYkC7yrF4SZCe6fETvSM3UNL2edcbYrSyc4QHA==" 414 | "resolved" "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.5.tgz" 415 | "version" "0.14.5" 416 | 417 | "vue-router@^4.2.0": 418 | "integrity" "sha512-nW28EeifEp8Abc5AfmAShy5ZKGsGzjcnZ3L1yc2DYUo+MqbBClrRP9yda3dIekM4I50/KnEwo1wkBLf7kHH5Cw==" 419 | "resolved" "https://registry.npmjs.org/vue-router/-/vue-router-4.2.1.tgz" 420 | "version" "4.2.1" 421 | dependencies: 422 | "@vue/devtools-api" "^6.5.0" 423 | 424 | "vue@^2.6.14 || ^3.3.0", "vue@^3.0.0-0 || ^2.6.0", "vue@^3.2.0", "vue@^3.2.25", "vue@^3.3.2", "vue@3.3.4": 425 | "integrity" "sha512-VTyEYn3yvIeY1Py0WaYGZsXnz3y5UnGi62GjVEqvEGPl6nxbOrCXbVOTQWBEJUqAyTUk2uJ5JLVnYJ6ZzGbrSw==" 426 | "resolved" "https://registry.npmjs.org/vue/-/vue-3.3.4.tgz" 427 | "version" "3.3.4" 428 | dependencies: 429 | "@vue/compiler-dom" "3.3.4" 430 | "@vue/compiler-sfc" "3.3.4" 431 | "@vue/runtime-dom" "3.3.4" 432 | "@vue/server-renderer" "3.3.4" 433 | "@vue/shared" "3.3.4" 434 | 435 | "zrender@5.4.3": 436 | "integrity" "sha512-DRUM4ZLnoaT0PBVvGBDO9oWIDBKFdAVieNWxWwK0niYzJCMwGchRk21/hsE+RKkIveH3XHCyvXcJDkgLVvfizQ==" 437 | "resolved" "https://registry.npmjs.org/zrender/-/zrender-5.4.3.tgz" 438 | "version" "5.4.3" 439 | dependencies: 440 | "tslib" "2.3.0" 441 | -------------------------------------------------------------------------------- /display/front-end/vue-project/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vue-project", 3 | "version": "0.0.0", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "vue-project", 9 | "version": "0.0.0", 10 | "dependencies": { 11 | "axios": "^1.4.0", 12 | "echarts": "^5.4.2", 13 | "element-plus": "^2.3.6", 14 | "pinia": "^2.1.3", 15 | "vue": "^3.3.2", 16 | "vue-router": "^4.2.0" 17 | }, 18 | "devDependencies": { 19 | "@vitejs/plugin-vue": "^4.2.3", 20 | "vite": "^4.3.5" 21 | } 22 | }, 23 | "node_modules/@babel/parser": { 24 | "version": "7.21.9", 25 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.9.tgz", 26 | "integrity": "sha512-q5PNg/Bi1OpGgx5jYlvWZwAorZepEudDMCLtj967aeS7WMont7dUZI46M2XwcIQqvUlMxWfdLFu4S/qSxeUu5g==", 27 | "license": "MIT", 28 | "bin": { 29 | "parser": "bin/babel-parser.js" 30 | }, 31 | "engines": { 32 | "node": ">=6.0.0" 33 | } 34 | }, 35 | "node_modules/@ctrl/tinycolor": { 36 | "version": "3.6.0", 37 | "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.6.0.tgz", 38 | "integrity": "sha512-/Z3l6pXthq0JvMYdUFyX9j0MaCltlIn6mfh9jLyQwg5aPKxkyNa0PTHtU1AlFXLNk55ZuAeJRcpvq+tmLfKmaQ==", 39 | "license": "MIT", 40 | "engines": { 41 | "node": ">=10" 42 | } 43 | }, 44 | "node_modules/@element-plus/icons-vue": { 45 | "version": "2.1.0", 46 | "resolved": "https://registry.npmjs.org/@element-plus/icons-vue/-/icons-vue-2.1.0.tgz", 47 | "integrity": "sha512-PSBn3elNoanENc1vnCfh+3WA9fimRC7n+fWkf3rE5jvv+aBohNHABC/KAR5KWPecxWxDTVT1ERpRbOMRcOV/vA==", 48 | "license": "MIT", 49 | "peerDependencies": { 50 | "vue": "^3.2.0" 51 | } 52 | }, 53 | "node_modules/@esbuild/win32-x64": { 54 | "version": "0.17.19", 55 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz", 56 | "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==", 57 | "cpu": [ 58 | "x64" 59 | ], 60 | "dev": true, 61 | "license": "MIT", 62 | "optional": true, 63 | "os": [ 64 | "win32" 65 | ], 66 | "engines": { 67 | "node": ">=12" 68 | } 69 | }, 70 | "node_modules/@floating-ui/core": { 71 | "version": "1.2.6", 72 | "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.2.6.tgz", 73 | "integrity": "sha512-EvYTiXet5XqweYGClEmpu3BoxmsQ4hkj3QaYA6qEnigCWffTP3vNRwBReTdrwDwo7OoJ3wM8Uoe9Uk4n+d4hfg==", 74 | "license": "MIT" 75 | }, 76 | "node_modules/@floating-ui/dom": { 77 | "version": "1.2.9", 78 | "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.2.9.tgz", 79 | "integrity": "sha512-sosQxsqgxMNkV3C+3UqTS6LxP7isRLwX8WMepp843Rb3/b0Wz8+MdUkxJksByip3C2WwLugLHN1b4ibn//zKwQ==", 80 | "license": "MIT", 81 | "dependencies": { 82 | "@floating-ui/core": "^1.2.6" 83 | } 84 | }, 85 | "node_modules/@jridgewell/sourcemap-codec": { 86 | "version": "1.4.15", 87 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", 88 | "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", 89 | "license": "MIT" 90 | }, 91 | "node_modules/@popperjs/core": { 92 | "name": "@sxzz/popperjs-es", 93 | "version": "2.11.7", 94 | "resolved": "https://registry.npmjs.org/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz", 95 | "integrity": "sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ==", 96 | "license": "MIT", 97 | "funding": { 98 | "type": "opencollective", 99 | "url": "https://opencollective.com/popperjs" 100 | } 101 | }, 102 | "node_modules/@types/lodash": { 103 | "version": "4.14.195", 104 | "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.195.tgz", 105 | "integrity": "sha512-Hwx9EUgdwf2GLarOjQp5ZH8ZmblzcbTBC2wtQWNKARBSxM9ezRIAUpeDTgoQRAFB0+8CNWXVA9+MaSOzOF3nPg==", 106 | "license": "MIT" 107 | }, 108 | "node_modules/@types/lodash-es": { 109 | "version": "4.17.7", 110 | "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.7.tgz", 111 | "integrity": "sha512-z0ptr6UI10VlU6l5MYhGwS4mC8DZyYer2mCoyysZtSF7p26zOX8UpbrV0YpNYLGS8K4PUFIyEr62IMFFjveSiQ==", 112 | "license": "MIT", 113 | "dependencies": { 114 | "@types/lodash": "*" 115 | } 116 | }, 117 | "node_modules/@types/web-bluetooth": { 118 | "version": "0.0.16", 119 | "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz", 120 | "integrity": "sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==", 121 | "license": "MIT" 122 | }, 123 | "node_modules/@vitejs/plugin-vue": { 124 | "version": "4.2.3", 125 | "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-4.2.3.tgz", 126 | "integrity": "sha512-R6JDUfiZbJA9cMiguQ7jxALsgiprjBeHL5ikpXfJCH62pPHtI+JdJ5xWj6Ev73yXSlYl86+blXn1kZHQ7uElxw==", 127 | "dev": true, 128 | "license": "MIT", 129 | "engines": { 130 | "node": "^14.18.0 || >=16.0.0" 131 | }, 132 | "peerDependencies": { 133 | "vite": "^4.0.0", 134 | "vue": "^3.2.25" 135 | } 136 | }, 137 | "node_modules/@vue/compiler-core": { 138 | "version": "3.3.4", 139 | "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.3.4.tgz", 140 | "integrity": "sha512-cquyDNvZ6jTbf/+x+AgM2Arrp6G4Dzbb0R64jiG804HRMfRiFXWI6kqUVqZ6ZR0bQhIoQjB4+2bhNtVwndW15g==", 141 | "license": "MIT", 142 | "dependencies": { 143 | "@babel/parser": "^7.21.3", 144 | "@vue/shared": "3.3.4", 145 | "estree-walker": "^2.0.2", 146 | "source-map-js": "^1.0.2" 147 | } 148 | }, 149 | "node_modules/@vue/compiler-dom": { 150 | "version": "3.3.4", 151 | "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.3.4.tgz", 152 | "integrity": "sha512-wyM+OjOVpuUukIq6p5+nwHYtj9cFroz9cwkfmP9O1nzH68BenTTv0u7/ndggT8cIQlnBeOo6sUT/gvHcIkLA5w==", 153 | "license": "MIT", 154 | "dependencies": { 155 | "@vue/compiler-core": "3.3.4", 156 | "@vue/shared": "3.3.4" 157 | } 158 | }, 159 | "node_modules/@vue/compiler-sfc": { 160 | "version": "3.3.4", 161 | "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.3.4.tgz", 162 | "integrity": "sha512-6y/d8uw+5TkCuzBkgLS0v3lSM3hJDntFEiUORM11pQ/hKvkhSKZrXW6i69UyXlJQisJxuUEJKAWEqWbWsLeNKQ==", 163 | "license": "MIT", 164 | "dependencies": { 165 | "@babel/parser": "^7.20.15", 166 | "@vue/compiler-core": "3.3.4", 167 | "@vue/compiler-dom": "3.3.4", 168 | "@vue/compiler-ssr": "3.3.4", 169 | "@vue/reactivity-transform": "3.3.4", 170 | "@vue/shared": "3.3.4", 171 | "estree-walker": "^2.0.2", 172 | "magic-string": "^0.30.0", 173 | "postcss": "^8.1.10", 174 | "source-map-js": "^1.0.2" 175 | } 176 | }, 177 | "node_modules/@vue/compiler-ssr": { 178 | "version": "3.3.4", 179 | "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.3.4.tgz", 180 | "integrity": "sha512-m0v6oKpup2nMSehwA6Uuu+j+wEwcy7QmwMkVNVfrV9P2qE5KshC6RwOCq8fjGS/Eak/uNb8AaWekfiXxbBB6gQ==", 181 | "license": "MIT", 182 | "dependencies": { 183 | "@vue/compiler-dom": "3.3.4", 184 | "@vue/shared": "3.3.4" 185 | } 186 | }, 187 | "node_modules/@vue/devtools-api": { 188 | "version": "6.5.0", 189 | "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.5.0.tgz", 190 | "integrity": "sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q==", 191 | "license": "MIT" 192 | }, 193 | "node_modules/@vue/reactivity": { 194 | "version": "3.3.4", 195 | "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.3.4.tgz", 196 | "integrity": "sha512-kLTDLwd0B1jG08NBF3R5rqULtv/f8x3rOFByTDz4J53ttIQEDmALqKqXY0J+XQeN0aV2FBxY8nJDf88yvOPAqQ==", 197 | "license": "MIT", 198 | "dependencies": { 199 | "@vue/shared": "3.3.4" 200 | } 201 | }, 202 | "node_modules/@vue/reactivity-transform": { 203 | "version": "3.3.4", 204 | "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.3.4.tgz", 205 | "integrity": "sha512-MXgwjako4nu5WFLAjpBnCj/ieqcjE2aJBINUNQzkZQfzIZA4xn+0fV1tIYBJvvva3N3OvKGofRLvQIwEQPpaXw==", 206 | "license": "MIT", 207 | "dependencies": { 208 | "@babel/parser": "^7.20.15", 209 | "@vue/compiler-core": "3.3.4", 210 | "@vue/shared": "3.3.4", 211 | "estree-walker": "^2.0.2", 212 | "magic-string": "^0.30.0" 213 | } 214 | }, 215 | "node_modules/@vue/runtime-core": { 216 | "version": "3.3.4", 217 | "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.3.4.tgz", 218 | "integrity": "sha512-R+bqxMN6pWO7zGI4OMlmvePOdP2c93GsHFM/siJI7O2nxFRzj55pLwkpCedEY+bTMgp5miZ8CxfIZo3S+gFqvA==", 219 | "license": "MIT", 220 | "dependencies": { 221 | "@vue/reactivity": "3.3.4", 222 | "@vue/shared": "3.3.4" 223 | } 224 | }, 225 | "node_modules/@vue/runtime-dom": { 226 | "version": "3.3.4", 227 | "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.3.4.tgz", 228 | "integrity": "sha512-Aj5bTJ3u5sFsUckRghsNjVTtxZQ1OyMWCr5dZRAPijF/0Vy4xEoRCwLyHXcj4D0UFbJ4lbx3gPTgg06K/GnPnQ==", 229 | "license": "MIT", 230 | "dependencies": { 231 | "@vue/runtime-core": "3.3.4", 232 | "@vue/shared": "3.3.4", 233 | "csstype": "^3.1.1" 234 | } 235 | }, 236 | "node_modules/@vue/server-renderer": { 237 | "version": "3.3.4", 238 | "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.3.4.tgz", 239 | "integrity": "sha512-Q6jDDzR23ViIb67v+vM1Dqntu+HUexQcsWKhhQa4ARVzxOY2HbC7QRW/ggkDBd5BU+uM1sV6XOAP0b216o34JQ==", 240 | "license": "MIT", 241 | "dependencies": { 242 | "@vue/compiler-ssr": "3.3.4", 243 | "@vue/shared": "3.3.4" 244 | }, 245 | "peerDependencies": { 246 | "vue": "3.3.4" 247 | } 248 | }, 249 | "node_modules/@vue/shared": { 250 | "version": "3.3.4", 251 | "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.3.4.tgz", 252 | "integrity": "sha512-7OjdcV8vQ74eiz1TZLzZP4JwqM5fA94K6yntPS5Z25r9HDuGNzaGdgvwKYq6S+MxwF0TFRwe50fIR/MYnakdkQ==", 253 | "license": "MIT" 254 | }, 255 | "node_modules/@vueuse/core": { 256 | "version": "9.13.0", 257 | "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-9.13.0.tgz", 258 | "integrity": "sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==", 259 | "license": "MIT", 260 | "dependencies": { 261 | "@types/web-bluetooth": "^0.0.16", 262 | "@vueuse/metadata": "9.13.0", 263 | "@vueuse/shared": "9.13.0", 264 | "vue-demi": "*" 265 | }, 266 | "funding": { 267 | "url": "https://github.com/sponsors/antfu" 268 | } 269 | }, 270 | "node_modules/@vueuse/metadata": { 271 | "version": "9.13.0", 272 | "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-9.13.0.tgz", 273 | "integrity": "sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==", 274 | "license": "MIT", 275 | "funding": { 276 | "url": "https://github.com/sponsors/antfu" 277 | } 278 | }, 279 | "node_modules/@vueuse/shared": { 280 | "version": "9.13.0", 281 | "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-9.13.0.tgz", 282 | "integrity": "sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==", 283 | "license": "MIT", 284 | "dependencies": { 285 | "vue-demi": "*" 286 | }, 287 | "funding": { 288 | "url": "https://github.com/sponsors/antfu" 289 | } 290 | }, 291 | "node_modules/async-validator": { 292 | "version": "4.2.5", 293 | "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-4.2.5.tgz", 294 | "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==", 295 | "license": "MIT" 296 | }, 297 | "node_modules/asynckit": { 298 | "version": "0.4.0", 299 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 300 | "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" 301 | }, 302 | "node_modules/axios": { 303 | "version": "1.4.0", 304 | "resolved": "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz", 305 | "integrity": "sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==", 306 | "dependencies": { 307 | "follow-redirects": "^1.15.0", 308 | "form-data": "^4.0.0", 309 | "proxy-from-env": "^1.1.0" 310 | } 311 | }, 312 | "node_modules/combined-stream": { 313 | "version": "1.0.8", 314 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 315 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 316 | "dependencies": { 317 | "delayed-stream": "~1.0.0" 318 | }, 319 | "engines": { 320 | "node": ">= 0.8" 321 | } 322 | }, 323 | "node_modules/csstype": { 324 | "version": "3.1.2", 325 | "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", 326 | "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==", 327 | "license": "MIT" 328 | }, 329 | "node_modules/dayjs": { 330 | "version": "1.11.8", 331 | "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.8.tgz", 332 | "integrity": "sha512-LcgxzFoWMEPO7ggRv1Y2N31hUf2R0Vj7fuy/m+Bg1K8rr+KAs1AEy4y9jd5DXe8pbHgX+srkHNS7TH6Q6ZhYeQ==", 333 | "license": "MIT" 334 | }, 335 | "node_modules/delayed-stream": { 336 | "version": "1.0.0", 337 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 338 | "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", 339 | "engines": { 340 | "node": ">=0.4.0" 341 | } 342 | }, 343 | "node_modules/echarts": { 344 | "version": "5.4.2", 345 | "resolved": "https://registry.npmjs.org/echarts/-/echarts-5.4.2.tgz", 346 | "integrity": "sha512-2W3vw3oI2tWJdyAz+b8DuWS0nfXtSDqlDmqgin/lfzbkB01cuMEN66KWBlmur3YMp5nEDEEt5s23pllnAzB4EA==", 347 | "dependencies": { 348 | "tslib": "2.3.0", 349 | "zrender": "5.4.3" 350 | } 351 | }, 352 | "node_modules/element-plus": { 353 | "version": "2.3.6", 354 | "resolved": "https://registry.npmjs.org/element-plus/-/element-plus-2.3.6.tgz", 355 | "integrity": "sha512-GLz0pXUYI2zRfIgyI6W7SWmHk6dSEikP9yR++hsQUyy63+WjutoiGpA3SZD4cGPSXUzRFeKfVr8CnYhK5LqXZw==", 356 | "license": "MIT", 357 | "dependencies": { 358 | "@ctrl/tinycolor": "^3.4.1", 359 | "@element-plus/icons-vue": "^2.0.6", 360 | "@floating-ui/dom": "^1.0.1", 361 | "@popperjs/core": "npm:@sxzz/popperjs-es@^2.11.7", 362 | "@types/lodash": "^4.14.182", 363 | "@types/lodash-es": "^4.17.6", 364 | "@vueuse/core": "^9.1.0", 365 | "async-validator": "^4.2.5", 366 | "dayjs": "^1.11.3", 367 | "escape-html": "^1.0.3", 368 | "lodash": "^4.17.21", 369 | "lodash-es": "^4.17.21", 370 | "lodash-unified": "^1.0.2", 371 | "memoize-one": "^6.0.0", 372 | "normalize-wheel-es": "^1.2.0" 373 | }, 374 | "peerDependencies": { 375 | "vue": "^3.2.0" 376 | } 377 | }, 378 | "node_modules/esbuild": { 379 | "version": "0.17.19", 380 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", 381 | "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", 382 | "dev": true, 383 | "hasInstallScript": true, 384 | "license": "MIT", 385 | "bin": { 386 | "esbuild": "bin/esbuild" 387 | }, 388 | "engines": { 389 | "node": ">=12" 390 | }, 391 | "optionalDependencies": { 392 | "@esbuild/android-arm": "0.17.19", 393 | "@esbuild/android-arm64": "0.17.19", 394 | "@esbuild/android-x64": "0.17.19", 395 | "@esbuild/darwin-arm64": "0.17.19", 396 | "@esbuild/darwin-x64": "0.17.19", 397 | "@esbuild/freebsd-arm64": "0.17.19", 398 | "@esbuild/freebsd-x64": "0.17.19", 399 | "@esbuild/linux-arm": "0.17.19", 400 | "@esbuild/linux-arm64": "0.17.19", 401 | "@esbuild/linux-ia32": "0.17.19", 402 | "@esbuild/linux-loong64": "0.17.19", 403 | "@esbuild/linux-mips64el": "0.17.19", 404 | "@esbuild/linux-ppc64": "0.17.19", 405 | "@esbuild/linux-riscv64": "0.17.19", 406 | "@esbuild/linux-s390x": "0.17.19", 407 | "@esbuild/linux-x64": "0.17.19", 408 | "@esbuild/netbsd-x64": "0.17.19", 409 | "@esbuild/openbsd-x64": "0.17.19", 410 | "@esbuild/sunos-x64": "0.17.19", 411 | "@esbuild/win32-arm64": "0.17.19", 412 | "@esbuild/win32-ia32": "0.17.19", 413 | "@esbuild/win32-x64": "0.17.19" 414 | } 415 | }, 416 | "node_modules/escape-html": { 417 | "version": "1.0.3", 418 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 419 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", 420 | "license": "MIT" 421 | }, 422 | "node_modules/estree-walker": { 423 | "version": "2.0.2", 424 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", 425 | "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", 426 | "license": "MIT" 427 | }, 428 | "node_modules/follow-redirects": { 429 | "version": "1.15.2", 430 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", 431 | "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", 432 | "funding": [ 433 | { 434 | "type": "individual", 435 | "url": "https://github.com/sponsors/RubenVerborgh" 436 | } 437 | ], 438 | "engines": { 439 | "node": ">=4.0" 440 | }, 441 | "peerDependenciesMeta": { 442 | "debug": { 443 | "optional": true 444 | } 445 | } 446 | }, 447 | "node_modules/form-data": { 448 | "version": "4.0.0", 449 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", 450 | "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", 451 | "dependencies": { 452 | "asynckit": "^0.4.0", 453 | "combined-stream": "^1.0.8", 454 | "mime-types": "^2.1.12" 455 | }, 456 | "engines": { 457 | "node": ">= 6" 458 | } 459 | }, 460 | "node_modules/fsevents": { 461 | "version": "2.3.2", 462 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 463 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 464 | "dev": true, 465 | "hasInstallScript": true, 466 | "optional": true, 467 | "os": [ 468 | "darwin" 469 | ], 470 | "engines": { 471 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 472 | } 473 | }, 474 | "node_modules/lodash": { 475 | "version": "4.17.21", 476 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 477 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", 478 | "license": "MIT" 479 | }, 480 | "node_modules/lodash-es": { 481 | "version": "4.17.21", 482 | "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", 483 | "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", 484 | "license": "MIT" 485 | }, 486 | "node_modules/lodash-unified": { 487 | "version": "1.0.3", 488 | "resolved": "https://registry.npmjs.org/lodash-unified/-/lodash-unified-1.0.3.tgz", 489 | "integrity": "sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==", 490 | "license": "MIT", 491 | "peerDependencies": { 492 | "@types/lodash-es": "*", 493 | "lodash": "*", 494 | "lodash-es": "*" 495 | } 496 | }, 497 | "node_modules/magic-string": { 498 | "version": "0.30.0", 499 | "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.0.tgz", 500 | "integrity": "sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==", 501 | "license": "MIT", 502 | "dependencies": { 503 | "@jridgewell/sourcemap-codec": "^1.4.13" 504 | }, 505 | "engines": { 506 | "node": ">=12" 507 | } 508 | }, 509 | "node_modules/memoize-one": { 510 | "version": "6.0.0", 511 | "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", 512 | "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==", 513 | "license": "MIT" 514 | }, 515 | "node_modules/mime-db": { 516 | "version": "1.52.0", 517 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 518 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 519 | "engines": { 520 | "node": ">= 0.6" 521 | } 522 | }, 523 | "node_modules/mime-types": { 524 | "version": "2.1.35", 525 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 526 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 527 | "dependencies": { 528 | "mime-db": "1.52.0" 529 | }, 530 | "engines": { 531 | "node": ">= 0.6" 532 | } 533 | }, 534 | "node_modules/nanoid": { 535 | "version": "3.3.6", 536 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", 537 | "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", 538 | "funding": [ 539 | { 540 | "type": "github", 541 | "url": "https://github.com/sponsors/ai" 542 | } 543 | ], 544 | "license": "MIT", 545 | "bin": { 546 | "nanoid": "bin/nanoid.cjs" 547 | }, 548 | "engines": { 549 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 550 | } 551 | }, 552 | "node_modules/normalize-wheel-es": { 553 | "version": "1.2.0", 554 | "resolved": "https://registry.npmjs.org/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz", 555 | "integrity": "sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==", 556 | "license": "BSD-3-Clause" 557 | }, 558 | "node_modules/picocolors": { 559 | "version": "1.0.0", 560 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", 561 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", 562 | "license": "ISC" 563 | }, 564 | "node_modules/pinia": { 565 | "version": "2.1.3", 566 | "resolved": "https://registry.npmjs.org/pinia/-/pinia-2.1.3.tgz", 567 | "integrity": "sha512-XNA/z/ye4P5rU1pieVmh0g/hSuDO98/a5UC8oSP0DNdvt6YtetJNHTrXwpwsQuflkGT34qKxAEcp7lSxXNjf/A==", 568 | "license": "MIT", 569 | "dependencies": { 570 | "@vue/devtools-api": "^6.5.0", 571 | "vue-demi": ">=0.14.5" 572 | }, 573 | "funding": { 574 | "url": "https://github.com/sponsors/posva" 575 | }, 576 | "peerDependencies": { 577 | "@vue/composition-api": "^1.4.0", 578 | "typescript": ">=4.4.4", 579 | "vue": "^2.6.14 || ^3.3.0" 580 | }, 581 | "peerDependenciesMeta": { 582 | "@vue/composition-api": { 583 | "optional": true 584 | }, 585 | "typescript": { 586 | "optional": true 587 | } 588 | } 589 | }, 590 | "node_modules/postcss": { 591 | "version": "8.4.23", 592 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.23.tgz", 593 | "integrity": "sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA==", 594 | "funding": [ 595 | { 596 | "type": "opencollective", 597 | "url": "https://opencollective.com/postcss/" 598 | }, 599 | { 600 | "type": "tidelift", 601 | "url": "https://tidelift.com/funding/github/npm/postcss" 602 | }, 603 | { 604 | "type": "github", 605 | "url": "https://github.com/sponsors/ai" 606 | } 607 | ], 608 | "license": "MIT", 609 | "dependencies": { 610 | "nanoid": "^3.3.6", 611 | "picocolors": "^1.0.0", 612 | "source-map-js": "^1.0.2" 613 | }, 614 | "engines": { 615 | "node": "^10 || ^12 || >=14" 616 | } 617 | }, 618 | "node_modules/proxy-from-env": { 619 | "version": "1.1.0", 620 | "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", 621 | "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" 622 | }, 623 | "node_modules/rollup": { 624 | "version": "3.23.0", 625 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.23.0.tgz", 626 | "integrity": "sha512-h31UlwEi7FHihLe1zbk+3Q7z1k/84rb9BSwmBSr/XjOCEaBJ2YyedQDuM0t/kfOS0IxM+vk1/zI9XxYj9V+NJQ==", 627 | "dev": true, 628 | "license": "MIT", 629 | "bin": { 630 | "rollup": "dist/bin/rollup" 631 | }, 632 | "engines": { 633 | "node": ">=14.18.0", 634 | "npm": ">=8.0.0" 635 | }, 636 | "optionalDependencies": { 637 | "fsevents": "~2.3.2" 638 | } 639 | }, 640 | "node_modules/source-map-js": { 641 | "version": "1.0.2", 642 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", 643 | "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", 644 | "license": "BSD-3-Clause", 645 | "engines": { 646 | "node": ">=0.10.0" 647 | } 648 | }, 649 | "node_modules/tslib": { 650 | "version": "2.3.0", 651 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", 652 | "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" 653 | }, 654 | "node_modules/vite": { 655 | "version": "4.3.9", 656 | "resolved": "https://registry.npmjs.org/vite/-/vite-4.3.9.tgz", 657 | "integrity": "sha512-qsTNZjO9NoJNW7KnOrgYwczm0WctJ8m/yqYAMAK9Lxt4SoySUfS5S8ia9K7JHpa3KEeMfyF8LoJ3c5NeBJy6pg==", 658 | "dev": true, 659 | "dependencies": { 660 | "esbuild": "^0.17.5", 661 | "postcss": "^8.4.23", 662 | "rollup": "^3.21.0" 663 | }, 664 | "bin": { 665 | "vite": "bin/vite.js" 666 | }, 667 | "engines": { 668 | "node": "^14.18.0 || >=16.0.0" 669 | }, 670 | "optionalDependencies": { 671 | "fsevents": "~2.3.2" 672 | }, 673 | "peerDependencies": { 674 | "@types/node": ">= 14", 675 | "less": "*", 676 | "sass": "*", 677 | "stylus": "*", 678 | "sugarss": "*", 679 | "terser": "^5.4.0" 680 | }, 681 | "peerDependenciesMeta": { 682 | "@types/node": { 683 | "optional": true 684 | }, 685 | "less": { 686 | "optional": true 687 | }, 688 | "sass": { 689 | "optional": true 690 | }, 691 | "stylus": { 692 | "optional": true 693 | }, 694 | "sugarss": { 695 | "optional": true 696 | }, 697 | "terser": { 698 | "optional": true 699 | } 700 | } 701 | }, 702 | "node_modules/vue": { 703 | "version": "3.3.4", 704 | "resolved": "https://registry.npmjs.org/vue/-/vue-3.3.4.tgz", 705 | "integrity": "sha512-VTyEYn3yvIeY1Py0WaYGZsXnz3y5UnGi62GjVEqvEGPl6nxbOrCXbVOTQWBEJUqAyTUk2uJ5JLVnYJ6ZzGbrSw==", 706 | "license": "MIT", 707 | "dependencies": { 708 | "@vue/compiler-dom": "3.3.4", 709 | "@vue/compiler-sfc": "3.3.4", 710 | "@vue/runtime-dom": "3.3.4", 711 | "@vue/server-renderer": "3.3.4", 712 | "@vue/shared": "3.3.4" 713 | } 714 | }, 715 | "node_modules/vue-demi": { 716 | "version": "0.14.5", 717 | "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.5.tgz", 718 | "integrity": "sha512-o9NUVpl/YlsGJ7t+xuqJKx8EBGf1quRhCiT6D/J0pfwmk9zUwYkC7yrF4SZCe6fETvSM3UNL2edcbYrSyc4QHA==", 719 | "hasInstallScript": true, 720 | "license": "MIT", 721 | "bin": { 722 | "vue-demi-fix": "bin/vue-demi-fix.js", 723 | "vue-demi-switch": "bin/vue-demi-switch.js" 724 | }, 725 | "engines": { 726 | "node": ">=12" 727 | }, 728 | "funding": { 729 | "url": "https://github.com/sponsors/antfu" 730 | }, 731 | "peerDependencies": { 732 | "@vue/composition-api": "^1.0.0-rc.1", 733 | "vue": "^3.0.0-0 || ^2.6.0" 734 | }, 735 | "peerDependenciesMeta": { 736 | "@vue/composition-api": { 737 | "optional": true 738 | } 739 | } 740 | }, 741 | "node_modules/vue-router": { 742 | "version": "4.2.1", 743 | "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.2.1.tgz", 744 | "integrity": "sha512-nW28EeifEp8Abc5AfmAShy5ZKGsGzjcnZ3L1yc2DYUo+MqbBClrRP9yda3dIekM4I50/KnEwo1wkBLf7kHH5Cw==", 745 | "license": "MIT", 746 | "dependencies": { 747 | "@vue/devtools-api": "^6.5.0" 748 | }, 749 | "funding": { 750 | "url": "https://github.com/sponsors/posva" 751 | }, 752 | "peerDependencies": { 753 | "vue": "^3.2.0" 754 | } 755 | }, 756 | "node_modules/zrender": { 757 | "version": "5.4.3", 758 | "resolved": "https://registry.npmjs.org/zrender/-/zrender-5.4.3.tgz", 759 | "integrity": "sha512-DRUM4ZLnoaT0PBVvGBDO9oWIDBKFdAVieNWxWwK0niYzJCMwGchRk21/hsE+RKkIveH3XHCyvXcJDkgLVvfizQ==", 760 | "dependencies": { 761 | "tslib": "2.3.0" 762 | } 763 | } 764 | }, 765 | "dependencies": { 766 | "@babel/parser": { 767 | "version": "7.21.9", 768 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.9.tgz", 769 | "integrity": "sha512-q5PNg/Bi1OpGgx5jYlvWZwAorZepEudDMCLtj967aeS7WMont7dUZI46M2XwcIQqvUlMxWfdLFu4S/qSxeUu5g==" 770 | }, 771 | "@ctrl/tinycolor": { 772 | "version": "3.6.0", 773 | "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.6.0.tgz", 774 | "integrity": "sha512-/Z3l6pXthq0JvMYdUFyX9j0MaCltlIn6mfh9jLyQwg5aPKxkyNa0PTHtU1AlFXLNk55ZuAeJRcpvq+tmLfKmaQ==" 775 | }, 776 | "@element-plus/icons-vue": { 777 | "version": "2.1.0", 778 | "resolved": "https://registry.npmjs.org/@element-plus/icons-vue/-/icons-vue-2.1.0.tgz", 779 | "integrity": "sha512-PSBn3elNoanENc1vnCfh+3WA9fimRC7n+fWkf3rE5jvv+aBohNHABC/KAR5KWPecxWxDTVT1ERpRbOMRcOV/vA==", 780 | "requires": {} 781 | }, 782 | "@esbuild/win32-x64": { 783 | "version": "0.17.19", 784 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz", 785 | "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==", 786 | "dev": true, 787 | "optional": true 788 | }, 789 | "@floating-ui/core": { 790 | "version": "1.2.6", 791 | "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.2.6.tgz", 792 | "integrity": "sha512-EvYTiXet5XqweYGClEmpu3BoxmsQ4hkj3QaYA6qEnigCWffTP3vNRwBReTdrwDwo7OoJ3wM8Uoe9Uk4n+d4hfg==" 793 | }, 794 | "@floating-ui/dom": { 795 | "version": "1.2.9", 796 | "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.2.9.tgz", 797 | "integrity": "sha512-sosQxsqgxMNkV3C+3UqTS6LxP7isRLwX8WMepp843Rb3/b0Wz8+MdUkxJksByip3C2WwLugLHN1b4ibn//zKwQ==", 798 | "requires": { 799 | "@floating-ui/core": "^1.2.6" 800 | } 801 | }, 802 | "@jridgewell/sourcemap-codec": { 803 | "version": "1.4.15", 804 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", 805 | "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" 806 | }, 807 | "@popperjs/core": { 808 | "version": "npm:@sxzz/popperjs-es@2.11.7", 809 | "resolved": "https://registry.npmjs.org/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz", 810 | "integrity": "sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ==" 811 | }, 812 | "@types/lodash": { 813 | "version": "4.14.195", 814 | "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.195.tgz", 815 | "integrity": "sha512-Hwx9EUgdwf2GLarOjQp5ZH8ZmblzcbTBC2wtQWNKARBSxM9ezRIAUpeDTgoQRAFB0+8CNWXVA9+MaSOzOF3nPg==" 816 | }, 817 | "@types/lodash-es": { 818 | "version": "4.17.7", 819 | "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.7.tgz", 820 | "integrity": "sha512-z0ptr6UI10VlU6l5MYhGwS4mC8DZyYer2mCoyysZtSF7p26zOX8UpbrV0YpNYLGS8K4PUFIyEr62IMFFjveSiQ==", 821 | "requires": { 822 | "@types/lodash": "*" 823 | } 824 | }, 825 | "@types/web-bluetooth": { 826 | "version": "0.0.16", 827 | "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz", 828 | "integrity": "sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==" 829 | }, 830 | "@vitejs/plugin-vue": { 831 | "version": "4.2.3", 832 | "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-4.2.3.tgz", 833 | "integrity": "sha512-R6JDUfiZbJA9cMiguQ7jxALsgiprjBeHL5ikpXfJCH62pPHtI+JdJ5xWj6Ev73yXSlYl86+blXn1kZHQ7uElxw==", 834 | "dev": true, 835 | "requires": {} 836 | }, 837 | "@vue/compiler-core": { 838 | "version": "3.3.4", 839 | "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.3.4.tgz", 840 | "integrity": "sha512-cquyDNvZ6jTbf/+x+AgM2Arrp6G4Dzbb0R64jiG804HRMfRiFXWI6kqUVqZ6ZR0bQhIoQjB4+2bhNtVwndW15g==", 841 | "requires": { 842 | "@babel/parser": "^7.21.3", 843 | "@vue/shared": "3.3.4", 844 | "estree-walker": "^2.0.2", 845 | "source-map-js": "^1.0.2" 846 | } 847 | }, 848 | "@vue/compiler-dom": { 849 | "version": "3.3.4", 850 | "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.3.4.tgz", 851 | "integrity": "sha512-wyM+OjOVpuUukIq6p5+nwHYtj9cFroz9cwkfmP9O1nzH68BenTTv0u7/ndggT8cIQlnBeOo6sUT/gvHcIkLA5w==", 852 | "requires": { 853 | "@vue/compiler-core": "3.3.4", 854 | "@vue/shared": "3.3.4" 855 | } 856 | }, 857 | "@vue/compiler-sfc": { 858 | "version": "3.3.4", 859 | "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.3.4.tgz", 860 | "integrity": "sha512-6y/d8uw+5TkCuzBkgLS0v3lSM3hJDntFEiUORM11pQ/hKvkhSKZrXW6i69UyXlJQisJxuUEJKAWEqWbWsLeNKQ==", 861 | "requires": { 862 | "@babel/parser": "^7.20.15", 863 | "@vue/compiler-core": "3.3.4", 864 | "@vue/compiler-dom": "3.3.4", 865 | "@vue/compiler-ssr": "3.3.4", 866 | "@vue/reactivity-transform": "3.3.4", 867 | "@vue/shared": "3.3.4", 868 | "estree-walker": "^2.0.2", 869 | "magic-string": "^0.30.0", 870 | "postcss": "^8.1.10", 871 | "source-map-js": "^1.0.2" 872 | } 873 | }, 874 | "@vue/compiler-ssr": { 875 | "version": "3.3.4", 876 | "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.3.4.tgz", 877 | "integrity": "sha512-m0v6oKpup2nMSehwA6Uuu+j+wEwcy7QmwMkVNVfrV9P2qE5KshC6RwOCq8fjGS/Eak/uNb8AaWekfiXxbBB6gQ==", 878 | "requires": { 879 | "@vue/compiler-dom": "3.3.4", 880 | "@vue/shared": "3.3.4" 881 | } 882 | }, 883 | "@vue/devtools-api": { 884 | "version": "6.5.0", 885 | "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.5.0.tgz", 886 | "integrity": "sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q==" 887 | }, 888 | "@vue/reactivity": { 889 | "version": "3.3.4", 890 | "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.3.4.tgz", 891 | "integrity": "sha512-kLTDLwd0B1jG08NBF3R5rqULtv/f8x3rOFByTDz4J53ttIQEDmALqKqXY0J+XQeN0aV2FBxY8nJDf88yvOPAqQ==", 892 | "requires": { 893 | "@vue/shared": "3.3.4" 894 | } 895 | }, 896 | "@vue/reactivity-transform": { 897 | "version": "3.3.4", 898 | "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.3.4.tgz", 899 | "integrity": "sha512-MXgwjako4nu5WFLAjpBnCj/ieqcjE2aJBINUNQzkZQfzIZA4xn+0fV1tIYBJvvva3N3OvKGofRLvQIwEQPpaXw==", 900 | "requires": { 901 | "@babel/parser": "^7.20.15", 902 | "@vue/compiler-core": "3.3.4", 903 | "@vue/shared": "3.3.4", 904 | "estree-walker": "^2.0.2", 905 | "magic-string": "^0.30.0" 906 | } 907 | }, 908 | "@vue/runtime-core": { 909 | "version": "3.3.4", 910 | "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.3.4.tgz", 911 | "integrity": "sha512-R+bqxMN6pWO7zGI4OMlmvePOdP2c93GsHFM/siJI7O2nxFRzj55pLwkpCedEY+bTMgp5miZ8CxfIZo3S+gFqvA==", 912 | "requires": { 913 | "@vue/reactivity": "3.3.4", 914 | "@vue/shared": "3.3.4" 915 | } 916 | }, 917 | "@vue/runtime-dom": { 918 | "version": "3.3.4", 919 | "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.3.4.tgz", 920 | "integrity": "sha512-Aj5bTJ3u5sFsUckRghsNjVTtxZQ1OyMWCr5dZRAPijF/0Vy4xEoRCwLyHXcj4D0UFbJ4lbx3gPTgg06K/GnPnQ==", 921 | "requires": { 922 | "@vue/runtime-core": "3.3.4", 923 | "@vue/shared": "3.3.4", 924 | "csstype": "^3.1.1" 925 | } 926 | }, 927 | "@vue/server-renderer": { 928 | "version": "3.3.4", 929 | "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.3.4.tgz", 930 | "integrity": "sha512-Q6jDDzR23ViIb67v+vM1Dqntu+HUexQcsWKhhQa4ARVzxOY2HbC7QRW/ggkDBd5BU+uM1sV6XOAP0b216o34JQ==", 931 | "requires": { 932 | "@vue/compiler-ssr": "3.3.4", 933 | "@vue/shared": "3.3.4" 934 | } 935 | }, 936 | "@vue/shared": { 937 | "version": "3.3.4", 938 | "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.3.4.tgz", 939 | "integrity": "sha512-7OjdcV8vQ74eiz1TZLzZP4JwqM5fA94K6yntPS5Z25r9HDuGNzaGdgvwKYq6S+MxwF0TFRwe50fIR/MYnakdkQ==" 940 | }, 941 | "@vueuse/core": { 942 | "version": "9.13.0", 943 | "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-9.13.0.tgz", 944 | "integrity": "sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==", 945 | "requires": { 946 | "@types/web-bluetooth": "^0.0.16", 947 | "@vueuse/metadata": "9.13.0", 948 | "@vueuse/shared": "9.13.0", 949 | "vue-demi": "*" 950 | } 951 | }, 952 | "@vueuse/metadata": { 953 | "version": "9.13.0", 954 | "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-9.13.0.tgz", 955 | "integrity": "sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==" 956 | }, 957 | "@vueuse/shared": { 958 | "version": "9.13.0", 959 | "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-9.13.0.tgz", 960 | "integrity": "sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==", 961 | "requires": { 962 | "vue-demi": "*" 963 | } 964 | }, 965 | "async-validator": { 966 | "version": "4.2.5", 967 | "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-4.2.5.tgz", 968 | "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==" 969 | }, 970 | "asynckit": { 971 | "version": "0.4.0", 972 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 973 | "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" 974 | }, 975 | "axios": { 976 | "version": "1.4.0", 977 | "resolved": "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz", 978 | "integrity": "sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==", 979 | "requires": { 980 | "follow-redirects": "^1.15.0", 981 | "form-data": "^4.0.0", 982 | "proxy-from-env": "^1.1.0" 983 | } 984 | }, 985 | "combined-stream": { 986 | "version": "1.0.8", 987 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 988 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 989 | "requires": { 990 | "delayed-stream": "~1.0.0" 991 | } 992 | }, 993 | "csstype": { 994 | "version": "3.1.2", 995 | "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", 996 | "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" 997 | }, 998 | "dayjs": { 999 | "version": "1.11.8", 1000 | "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.8.tgz", 1001 | "integrity": "sha512-LcgxzFoWMEPO7ggRv1Y2N31hUf2R0Vj7fuy/m+Bg1K8rr+KAs1AEy4y9jd5DXe8pbHgX+srkHNS7TH6Q6ZhYeQ==" 1002 | }, 1003 | "delayed-stream": { 1004 | "version": "1.0.0", 1005 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 1006 | "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" 1007 | }, 1008 | "echarts": { 1009 | "version": "5.4.2", 1010 | "resolved": "https://registry.npmjs.org/echarts/-/echarts-5.4.2.tgz", 1011 | "integrity": "sha512-2W3vw3oI2tWJdyAz+b8DuWS0nfXtSDqlDmqgin/lfzbkB01cuMEN66KWBlmur3YMp5nEDEEt5s23pllnAzB4EA==", 1012 | "requires": { 1013 | "tslib": "2.3.0", 1014 | "zrender": "5.4.3" 1015 | } 1016 | }, 1017 | "element-plus": { 1018 | "version": "2.3.6", 1019 | "resolved": "https://registry.npmjs.org/element-plus/-/element-plus-2.3.6.tgz", 1020 | "integrity": "sha512-GLz0pXUYI2zRfIgyI6W7SWmHk6dSEikP9yR++hsQUyy63+WjutoiGpA3SZD4cGPSXUzRFeKfVr8CnYhK5LqXZw==", 1021 | "requires": { 1022 | "@ctrl/tinycolor": "^3.4.1", 1023 | "@element-plus/icons-vue": "^2.0.6", 1024 | "@floating-ui/dom": "^1.0.1", 1025 | "@popperjs/core": "npm:@sxzz/popperjs-es@^2.11.7", 1026 | "@types/lodash": "^4.14.182", 1027 | "@types/lodash-es": "^4.17.6", 1028 | "@vueuse/core": "^9.1.0", 1029 | "async-validator": "^4.2.5", 1030 | "dayjs": "^1.11.3", 1031 | "escape-html": "^1.0.3", 1032 | "lodash": "^4.17.21", 1033 | "lodash-es": "^4.17.21", 1034 | "lodash-unified": "^1.0.2", 1035 | "memoize-one": "^6.0.0", 1036 | "normalize-wheel-es": "^1.2.0" 1037 | } 1038 | }, 1039 | "esbuild": { 1040 | "version": "0.17.19", 1041 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", 1042 | "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", 1043 | "dev": true, 1044 | "requires": { 1045 | "@esbuild/android-arm": "0.17.19", 1046 | "@esbuild/android-arm64": "0.17.19", 1047 | "@esbuild/android-x64": "0.17.19", 1048 | "@esbuild/darwin-arm64": "0.17.19", 1049 | "@esbuild/darwin-x64": "0.17.19", 1050 | "@esbuild/freebsd-arm64": "0.17.19", 1051 | "@esbuild/freebsd-x64": "0.17.19", 1052 | "@esbuild/linux-arm": "0.17.19", 1053 | "@esbuild/linux-arm64": "0.17.19", 1054 | "@esbuild/linux-ia32": "0.17.19", 1055 | "@esbuild/linux-loong64": "0.17.19", 1056 | "@esbuild/linux-mips64el": "0.17.19", 1057 | "@esbuild/linux-ppc64": "0.17.19", 1058 | "@esbuild/linux-riscv64": "0.17.19", 1059 | "@esbuild/linux-s390x": "0.17.19", 1060 | "@esbuild/linux-x64": "0.17.19", 1061 | "@esbuild/netbsd-x64": "0.17.19", 1062 | "@esbuild/openbsd-x64": "0.17.19", 1063 | "@esbuild/sunos-x64": "0.17.19", 1064 | "@esbuild/win32-arm64": "0.17.19", 1065 | "@esbuild/win32-ia32": "0.17.19", 1066 | "@esbuild/win32-x64": "0.17.19" 1067 | } 1068 | }, 1069 | "escape-html": { 1070 | "version": "1.0.3", 1071 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 1072 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" 1073 | }, 1074 | "estree-walker": { 1075 | "version": "2.0.2", 1076 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", 1077 | "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" 1078 | }, 1079 | "follow-redirects": { 1080 | "version": "1.15.2", 1081 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", 1082 | "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" 1083 | }, 1084 | "form-data": { 1085 | "version": "4.0.0", 1086 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", 1087 | "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", 1088 | "requires": { 1089 | "asynckit": "^0.4.0", 1090 | "combined-stream": "^1.0.8", 1091 | "mime-types": "^2.1.12" 1092 | } 1093 | }, 1094 | "fsevents": { 1095 | "version": "2.3.2", 1096 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 1097 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 1098 | "dev": true, 1099 | "optional": true 1100 | }, 1101 | "lodash": { 1102 | "version": "4.17.21", 1103 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 1104 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" 1105 | }, 1106 | "lodash-es": { 1107 | "version": "4.17.21", 1108 | "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", 1109 | "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" 1110 | }, 1111 | "lodash-unified": { 1112 | "version": "1.0.3", 1113 | "resolved": "https://registry.npmjs.org/lodash-unified/-/lodash-unified-1.0.3.tgz", 1114 | "integrity": "sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==", 1115 | "requires": {} 1116 | }, 1117 | "magic-string": { 1118 | "version": "0.30.0", 1119 | "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.0.tgz", 1120 | "integrity": "sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==", 1121 | "requires": { 1122 | "@jridgewell/sourcemap-codec": "^1.4.13" 1123 | } 1124 | }, 1125 | "memoize-one": { 1126 | "version": "6.0.0", 1127 | "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", 1128 | "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==" 1129 | }, 1130 | "mime-db": { 1131 | "version": "1.52.0", 1132 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 1133 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" 1134 | }, 1135 | "mime-types": { 1136 | "version": "2.1.35", 1137 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 1138 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 1139 | "requires": { 1140 | "mime-db": "1.52.0" 1141 | } 1142 | }, 1143 | "nanoid": { 1144 | "version": "3.3.6", 1145 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", 1146 | "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==" 1147 | }, 1148 | "normalize-wheel-es": { 1149 | "version": "1.2.0", 1150 | "resolved": "https://registry.npmjs.org/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz", 1151 | "integrity": "sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==" 1152 | }, 1153 | "picocolors": { 1154 | "version": "1.0.0", 1155 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", 1156 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" 1157 | }, 1158 | "pinia": { 1159 | "version": "2.1.3", 1160 | "resolved": "https://registry.npmjs.org/pinia/-/pinia-2.1.3.tgz", 1161 | "integrity": "sha512-XNA/z/ye4P5rU1pieVmh0g/hSuDO98/a5UC8oSP0DNdvt6YtetJNHTrXwpwsQuflkGT34qKxAEcp7lSxXNjf/A==", 1162 | "requires": { 1163 | "@vue/devtools-api": "^6.5.0", 1164 | "vue-demi": ">=0.14.5" 1165 | } 1166 | }, 1167 | "postcss": { 1168 | "version": "8.4.23", 1169 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.23.tgz", 1170 | "integrity": "sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA==", 1171 | "requires": { 1172 | "nanoid": "^3.3.6", 1173 | "picocolors": "^1.0.0", 1174 | "source-map-js": "^1.0.2" 1175 | } 1176 | }, 1177 | "proxy-from-env": { 1178 | "version": "1.1.0", 1179 | "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", 1180 | "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" 1181 | }, 1182 | "rollup": { 1183 | "version": "3.23.0", 1184 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.23.0.tgz", 1185 | "integrity": "sha512-h31UlwEi7FHihLe1zbk+3Q7z1k/84rb9BSwmBSr/XjOCEaBJ2YyedQDuM0t/kfOS0IxM+vk1/zI9XxYj9V+NJQ==", 1186 | "dev": true, 1187 | "requires": { 1188 | "fsevents": "~2.3.2" 1189 | } 1190 | }, 1191 | "source-map-js": { 1192 | "version": "1.0.2", 1193 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", 1194 | "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==" 1195 | }, 1196 | "tslib": { 1197 | "version": "2.3.0", 1198 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", 1199 | "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" 1200 | }, 1201 | "vite": { 1202 | "version": "4.3.9", 1203 | "resolved": "https://registry.npmjs.org/vite/-/vite-4.3.9.tgz", 1204 | "integrity": "sha512-qsTNZjO9NoJNW7KnOrgYwczm0WctJ8m/yqYAMAK9Lxt4SoySUfS5S8ia9K7JHpa3KEeMfyF8LoJ3c5NeBJy6pg==", 1205 | "dev": true, 1206 | "requires": { 1207 | "esbuild": "^0.17.5", 1208 | "fsevents": "~2.3.2", 1209 | "postcss": "^8.4.23", 1210 | "rollup": "^3.21.0" 1211 | } 1212 | }, 1213 | "vue": { 1214 | "version": "3.3.4", 1215 | "resolved": "https://registry.npmjs.org/vue/-/vue-3.3.4.tgz", 1216 | "integrity": "sha512-VTyEYn3yvIeY1Py0WaYGZsXnz3y5UnGi62GjVEqvEGPl6nxbOrCXbVOTQWBEJUqAyTUk2uJ5JLVnYJ6ZzGbrSw==", 1217 | "requires": { 1218 | "@vue/compiler-dom": "3.3.4", 1219 | "@vue/compiler-sfc": "3.3.4", 1220 | "@vue/runtime-dom": "3.3.4", 1221 | "@vue/server-renderer": "3.3.4", 1222 | "@vue/shared": "3.3.4" 1223 | } 1224 | }, 1225 | "vue-demi": { 1226 | "version": "0.14.5", 1227 | "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.5.tgz", 1228 | "integrity": "sha512-o9NUVpl/YlsGJ7t+xuqJKx8EBGf1quRhCiT6D/J0pfwmk9zUwYkC7yrF4SZCe6fETvSM3UNL2edcbYrSyc4QHA==", 1229 | "requires": {} 1230 | }, 1231 | "vue-router": { 1232 | "version": "4.2.1", 1233 | "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.2.1.tgz", 1234 | "integrity": "sha512-nW28EeifEp8Abc5AfmAShy5ZKGsGzjcnZ3L1yc2DYUo+MqbBClrRP9yda3dIekM4I50/KnEwo1wkBLf7kHH5Cw==", 1235 | "requires": { 1236 | "@vue/devtools-api": "^6.5.0" 1237 | } 1238 | }, 1239 | "zrender": { 1240 | "version": "5.4.3", 1241 | "resolved": "https://registry.npmjs.org/zrender/-/zrender-5.4.3.tgz", 1242 | "integrity": "sha512-DRUM4ZLnoaT0PBVvGBDO9oWIDBKFdAVieNWxWwK0niYzJCMwGchRk21/hsE+RKkIveH3XHCyvXcJDkgLVvfizQ==", 1243 | "requires": { 1244 | "tslib": "2.3.0" 1245 | } 1246 | } 1247 | } 1248 | } 1249 | --------------------------------------------------------------------------------