├── .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 |
24 |
25 |
--------------------------------------------------------------------------------
/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 |
15 |
16 |
17 |
18 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
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 |
23 |
24 |
25 |
26 |
27 | {{ data.day.split('-').slice(1).join('-') }}
28 | {{ data.isSelected ? '✔️' : '' }}
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
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 |
294 |
295 |
功能展示
296 |
297 | 展示协议信息
298 | 常用协议统计
299 | 展示端口信息
300 | 常用端口统计
301 | 应用统计结果
302 | 综合结果展示
303 | 清空数据库
304 |
305 |
306 |
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 |
--------------------------------------------------------------------------------