diff --git a/README.md b/README.md index 62cba4b1e..3841fda95 100644 --- a/README.md +++ b/README.md @@ -188,17 +188,17 @@ ps:核心功能已经实现,正在对接微信小程序中... | 框架 | 说明 | 版本 | 学习指南 | |---------------------------------------------------------------------------------------------|------------------|-------------|----------------------------------------------------------------| -| [Spring Boot](https://spring.io/projects/spring-boot) | 应用开发框架 | 2.7.6 | [文档](https://github.com/YunaiV/SpringBoot-Labs) | +| [Spring Boot](https://spring.io/projects/spring-boot) | 应用开发框架 | 2.7.7 | [文档](https://github.com/YunaiV/SpringBoot-Labs) | | [MySQL](https://www.mysql.com/cn/) | 数据库服务器 | 5.7 / 8.0+ | | | [Druid](https://github.com/alibaba/druid) | JDBC 连接池、监控组件 | 1.2.15 | [文档](http://www.iocoder.cn/Spring-Boot/datasource-pool/?yudao) | -| [MyBatis Plus](https://mp.baomidou.com/) | MyBatis 增强工具包 | 3.5.2 | [文档](http://www.iocoder.cn/Spring-Boot/MyBatis/?yudao) | -| [Dynamic Datasource](https://dynamic-datasource.com/) | 动态数据源 | 3.6.0 | [文档](http://www.iocoder.cn/Spring-Boot/datasource-pool/?yudao) | +| [MyBatis Plus](https://mp.baomidou.com/) | MyBatis 增强工具包 | 3.5.3 | [文档](http://www.iocoder.cn/Spring-Boot/MyBatis/?yudao) | +| [Dynamic Datasource](https://dynamic-datasource.com/) | 动态数据源 | 3.6.1 | [文档](http://www.iocoder.cn/Spring-Boot/datasource-pool/?yudao) | | [Redis](https://redis.io/) | key-value 数据库 | 5.0 / 6.0 | | | [Redisson](https://github.com/redisson/redisson) | Redis 客户端 | 3.18.0 | [文档](http://www.iocoder.cn/Spring-Boot/Redis/?yudao) | | [Spring MVC](https://github.com/spring-projects/spring-framework/tree/master/spring-webmvc) | MVC 框架 | 5.3.24 | [文档](http://www.iocoder.cn/SpringMVC/MVC/?yudao) | | [Spring Security](https://github.com/spring-projects/spring-security) | Spring 安全框架 | 5.7.5 | [文档](http://www.iocoder.cn/Spring-Boot/Spring-Security/?yudao) | | [Hibernate Validator](https://github.com/hibernate/hibernate-validator) | 参数校验组件 | 6.2.5 | [文档](http://www.iocoder.cn/Spring-Boot/Validation/?yudao) | -| [Flowable](https://github.com/flowable/flowable-engine) | 工作流引擎 | 6.7.2 | [文档](https://doc.iocoder.cn/bpm/) | +| [Flowable](https://github.com/flowable/flowable-engine) | 工作流引擎 | 6.8.0 | [文档](https://doc.iocoder.cn/bpm/) | | [Quartz](https://github.com/quartz-scheduler) | 任务调度组件 | 2.3.2 | [文档](http://www.iocoder.cn/Spring-Boot/Job/?yudao) | | [Knife4j](https://gitee.com/xiaoym/knife4j) | Swagger 增强 UI 实现 | 3.0.3 | [文档](http://www.iocoder.cn/Spring-Boot/Swagger/?yudao) | | [Resilience4j](https://github.com/resilience4j/resilience4j) | 服务保障组件 | 1.7.1 | [文档](http://www.iocoder.cn/Spring-Boot/Resilience4j/?yudao) | @@ -222,8 +222,8 @@ ps:核心功能已经实现,正在对接微信小程序中... | 框架 | 说明 | 版本 | |----------------------------------------------------------------------|:------------:|:------:| | [Vue](https://staging-cn.vuejs.org/) | Vue 框架 | 3.2.45 | -| [Vite](https://cn.vitejs.dev//) | 开发与构建工具 | 4.0.3 | -| [Element Plus](https://element-plus.org/zh-CN/) | Element Plus | 2.2.27 | +| [Vite](https://cn.vitejs.dev//) | 开发与构建工具 | 4.0.4 | +| [Element Plus](https://element-plus.org/zh-CN/) | Element Plus | 2.2.28 | | [TypeScript](https://www.typescriptlang.org/docs/) | TypeScript | 4.9.4 | | [pinia](https://pinia.vuejs.org/) | vuex5 | 2.0.28 | | [vue-i18n](https://kazupon.github.io/vue-i18n/zh/introduction.html/) | 国际化 | 9.2.2 | diff --git a/pom.xml b/pom.xml index ede33e741..e267a1536 100644 --- a/pom.xml +++ b/pom.xml @@ -30,7 +30,7 @@ <url>https://github.com/YunaiV/ruoyi-vue-pro</url> <properties> - <revision>1.6.5-snapshot</revision> + <revision>1.6.6-snapshot</revision> <!-- Maven 相关 --> <java.version>1.8</java.version> <maven.compiler.source>${java.version}</maven.compiler.source> diff --git a/sql/mysql/optional/vue3-menu.sql b/sql/mysql/optional/vue3-menu.sql index 3ba7242ff..dfe3a6123 100644 --- a/sql/mysql/optional/vue3-menu.sql +++ b/sql/mysql/optional/vue3-menu.sql @@ -262,5 +262,6 @@ INSERT INTO `system_menu` VALUES (1266, '客户端更新', 'system:oauth2-client INSERT INTO `system_menu` VALUES (1267, '客户端删除', 'system:oauth2-client:delete', 3, 4, 1263, '', '', '', 0, b'1', b'1', '', '2022-05-10 16:26:33', '1', '2022-05-11 00:31:33', b'0'); INSERT INTO `system_menu` VALUES (1281, '可视化报表', '', 1, 12, 0, '/visualization', 'ep:histogram', NULL, 0, b'1', b'1', '1', '2022-07-10 20:22:15', '1', '2022-07-10 20:33:30', b'0'); INSERT INTO `system_menu` VALUES (1282, '积木报表', '', 2, 1, 1281, 'jimu-report', 'ep:histogram', 'visualization/jmreport/index', 0, b'1', b'1', '1', '2022-07-10 20:26:36', '1', '2022-07-28 21:17:34', b'0'); +INSERT INTO `system_menu` VALUES (1283, 'webSocket连接', '', 2, 14, 2, 'webSocket', 'ep:turn-off', 'infra/webSocket/index', 0, b'1', b'1', '1', '2023-01-01 11:43:04', '1', '2023-01-01 11:43:04', b'0'); SET FOREIGN_KEY_CHECKS = 1; diff --git a/sql/mysql/ruoyi-vue-pro.sql b/sql/mysql/ruoyi-vue-pro.sql index 39cb52afe..7b08e86fe 100644 --- a/sql/mysql/ruoyi-vue-pro.sql +++ b/sql/mysql/ruoyi-vue-pro.sql @@ -1710,6 +1710,8 @@ INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_i INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `status`, `visible`, `keep_alive`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1267, '客户端删除', 'system:oauth2-client:delete', 3, 4, 1263, '', '', '', 0, b'1', b'1', '', '2022-05-10 16:26:33', '1', '2022-05-11 00:31:33', b'0'); INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `status`, `visible`, `keep_alive`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1281, '可视化报表', '', 1, 12, 0, '/visualization', 'chart', NULL, 0, b'1', b'1', '1', '2022-07-10 20:22:15', '1', '2022-07-10 20:33:30', b'0'); INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `status`, `visible`, `keep_alive`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1282, '积木报表', '', 2, 1, 1281, 'jimu-report', 'example', 'visualization/jmreport/index', 0, b'1', b'1', '1', '2022-07-10 20:26:36', '1', '2022-07-28 21:17:34', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `status`, `visible`, `keep_alive`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1283, 'webSocket连接', '', 2, 14, 2, 'webSocket', 'message', 'infra/webSocket/index', 0, b'1', b'1', '1', '2023-01-01 11:43:04', '1', '2023-01-01 11:43:04', b'0'); + COMMIT; -- ---------------------------- diff --git a/sql/optional/visualization/jimureport.mysql5.7.create.sql b/sql/optional/visualization/jimureport.mysql5.7.create.sql index e32134005..c90ea27d8 100644 --- a/sql/optional/visualization/jimureport.mysql5.7.create.sql +++ b/sql/optional/visualization/jimureport.mysql5.7.create.sql @@ -1344,6 +1344,7 @@ CREATE TABLE `jimu_report_share` ( `last_update_time` datetime NULL DEFAULT NULL COMMENT '最后更新时间', `term_of_validity` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '有效期(0:永久有效,1:1天,2:7天)', `status` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '是否过期(0未过期,1已过期)', + `preview_lock_status` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '密码锁状态', PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '积木报表预览权限表' ROW_FORMAT = Dynamic; diff --git a/yudao-dependencies/pom.xml b/yudao-dependencies/pom.xml index 809e7d16d..f4aa956fb 100644 --- a/yudao-dependencies/pom.xml +++ b/yudao-dependencies/pom.xml @@ -14,18 +14,18 @@ <url>https://github.com/YunaiV/ruoyi-vue-pro</url> <properties> - <revision>1.6.5-snapshot</revision> + <revision>1.6.6-snapshot</revision> <!-- 统一依赖管理 --> - <spring.boot.version>2.7.6</spring.boot.version> + <spring.boot.version>2.7.7</spring.boot.version> <!-- Web 相关 --> <knife4j.version>3.0.3</knife4j.version> <swagger-annotations.version>1.6.8</swagger-annotations.version> <servlet.versoin>2.5</servlet.versoin> <!-- DB 相关 --> <druid.version>1.2.15</druid.version> - <mybatis-plus.version>3.5.2</mybatis-plus.version> - <mybatis-plus-generator.version>3.5.2</mybatis-plus-generator.version> - <dynamic-datasource.version>3.6.0</dynamic-datasource.version> + <mybatis-plus.version>3.5.3.1</mybatis-plus.version> + <mybatis-plus-generator.version>3.5.3.1</mybatis-plus-generator.version> + <dynamic-datasource.version>3.6.1</dynamic-datasource.version> <redisson.version>3.18.0</redisson.version> <!-- 服务保障相关 --> <lock4j.version>2.2.3</lock4j.version> @@ -37,14 +37,14 @@ <!-- Test 测试相关 --> <podam.version>7.2.11.RELEASE</podam.version> <jedis-mock.version>1.0.5</jedis-mock.version> - <mockito-inline.version>4.8.0</mockito-inline.version> + <mockito-inline.version>4.11.0</mockito-inline.version> <!-- Bpm 工作流相关 --> - <flowable.version>6.7.2</flowable.version> + <flowable.version>6.8.0</flowable.version> <!-- 工具类相关 --> <lombok.version>1.18.24</lombok.version> <mapstruct.version>1.5.3.Final</mapstruct.version> - <hutool.version>5.8.10</hutool.version> - <easyexcel.verion>3.1.3</easyexcel.verion> + <hutool.version>5.8.11</hutool.version> + <easyexcel.verion>3.1.4</easyexcel.verion> <velocity.version>2.3</velocity.version> <screw.version>1.0.5</screw.version> <fastjson.version>1.2.83</fastjson.version> @@ -55,7 +55,7 @@ <jsch.version>0.1.55</jsch.version> <tika-core.version>2.6.0</tika-core.version> <aj-captcha.version>1.3.0</aj-captcha.version> - <netty-all.version>4.1.85.Final</netty-all.version> + <netty-all.version>4.1.86.Final</netty-all.version> <ip2region.version>2.6.6</ip2region.version> <!-- 三方云服务相关 --> <okio.version>3.0.0</okio.version> @@ -63,7 +63,7 @@ <minio.version>8.4.6</minio.version> <aliyun-java-sdk-core.version>4.6.3</aliyun-java-sdk-core.version> <aliyun-java-sdk-dysmsapi.version>2.2.1</aliyun-java-sdk-dysmsapi.version> - <tencentcloud-sdk-java.version>3.1.637</tencentcloud-sdk-java.version> + <tencentcloud-sdk-java.version>3.1.660</tencentcloud-sdk-java.version> <justauth.version>1.4.0</justauth.version> <jimureport.version>1.5.6</jimureport.version> <xercesImpl.version>2.12.2</xercesImpl.version> @@ -602,6 +602,12 @@ <artifactId>xercesImpl</artifactId> <version>${xercesImpl.version}</version> </dependency> + <!-- SpringBoot Websocket --> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-websocket</artifactId> + <version>${spring.boot.version}</version> + </dependency> </dependencies> </dependencyManagement> diff --git a/yudao-example/yudao-sso-demo-by-code/pom.xml b/yudao-example/yudao-sso-demo-by-code/pom.xml index f6a168f76..ef83df4ac 100644 --- a/yudao-example/yudao-sso-demo-by-code/pom.xml +++ b/yudao-example/yudao-sso-demo-by-code/pom.xml @@ -21,7 +21,7 @@ <maven.compiler.target>8</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <!-- 统一依赖管理 --> - <spring.boot.version>2.7.6</spring.boot.version> + <spring.boot.version>2.7.7</spring.boot.version> </properties> <dependencyManagement> @@ -52,7 +52,7 @@ <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> - <version>5.8.10</version> + <version>5.8.11</version> </dependency> <dependency> diff --git a/yudao-example/yudao-sso-demo-by-password/pom.xml b/yudao-example/yudao-sso-demo-by-password/pom.xml index c00032169..391358ee2 100644 --- a/yudao-example/yudao-sso-demo-by-password/pom.xml +++ b/yudao-example/yudao-sso-demo-by-password/pom.xml @@ -21,7 +21,7 @@ <maven.compiler.target>8</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <!-- 统一依赖管理 --> - <spring.boot.version>2.7.6</spring.boot.version> + <spring.boot.version>2.7.7</spring.boot.version> </properties> <dependencyManagement> @@ -52,7 +52,7 @@ <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> - <version>5.8.10</version> + <version>5.8.11</version> </dependency> <dependency> diff --git a/yudao-framework/pom.xml b/yudao-framework/pom.xml index 1928aa88c..3bfc020ba 100644 --- a/yudao-framework/pom.xml +++ b/yudao-framework/pom.xml @@ -40,6 +40,7 @@ <module>yudao-spring-boot-starter-flowable</module> <module>yudao-spring-boot-starter-captcha</module> + <module>yudao-spring-boot-starter-websocket</module> </modules> <artifactId>yudao-framework</artifactId> diff --git a/yudao-framework/yudao-spring-boot-starter-biz-pay/pom.xml b/yudao-framework/yudao-spring-boot-starter-biz-pay/pom.xml index 03f0013aa..06b127a0a 100644 --- a/yudao-framework/yudao-spring-boot-starter-biz-pay/pom.xml +++ b/yudao-framework/yudao-spring-boot-starter-biz-pay/pom.xml @@ -52,7 +52,7 @@ <dependency> <groupId>com.alipay.sdk</groupId> <artifactId>alipay-sdk-java</artifactId> - <version>4.35.0.ALL</version> + <version>4.35.9.ALL</version> <exclusions> <exclusion> <groupId>org.bouncycastle</groupId> diff --git a/yudao-framework/yudao-spring-boot-starter-file/src/main/java/cn/iocoder/yudao/framework/file/core/client/s3/S3FileClient.java b/yudao-framework/yudao-spring-boot-starter-file/src/main/java/cn/iocoder/yudao/framework/file/core/client/s3/S3FileClient.java index a2b11b1dc..f554e0b52 100644 --- a/yudao-framework/yudao-spring-boot-starter-file/src/main/java/cn/iocoder/yudao/framework/file/core/client/s3/S3FileClient.java +++ b/yudao-framework/yudao-spring-boot-starter-file/src/main/java/cn/iocoder/yudao/framework/file/core/client/s3/S3FileClient.java @@ -9,10 +9,11 @@ import io.minio.*; import java.io.ByteArrayInputStream; import static cn.iocoder.yudao.framework.file.core.client.s3.S3FileClientConfig.ENDPOINT_ALIYUN; +import static cn.iocoder.yudao.framework.file.core.client.s3.S3FileClientConfig.ENDPOINT_TENCENT; /** * 基于 S3 协议的文件客户端,实现 MinIO、阿里云、腾讯云、七牛云、华为云等云服务 - * + * <p> * S3 协议的客户端,采用亚马逊提供的 software.amazon.awssdk.s3 库 * * @author 芋道源码 @@ -78,6 +79,11 @@ public class S3FileClient extends AbstractFileClient<S3FileClientConfig> { .replaceAll("-internal", "")// 去除内网 Endpoint 的后缀 .replaceAll("https://", ""); } + // 腾讯云必须有 region,否则会报错 + if (config.getEndpoint().contains(ENDPOINT_TENCENT)) { + return StrUtil.subAfter(config.getEndpoint(), ".cos.", false) + .replaceAll("." + ENDPOINT_TENCENT, ""); // 去除 Endpoint + } return null; } diff --git a/yudao-framework/yudao-spring-boot-starter-file/src/main/java/cn/iocoder/yudao/framework/file/core/client/s3/S3FileClientConfig.java b/yudao-framework/yudao-spring-boot-starter-file/src/main/java/cn/iocoder/yudao/framework/file/core/client/s3/S3FileClientConfig.java index 151159f5e..0c46e8aa6 100644 --- a/yudao-framework/yudao-spring-boot-starter-file/src/main/java/cn/iocoder/yudao/framework/file/core/client/s3/S3FileClientConfig.java +++ b/yudao-framework/yudao-spring-boot-starter-file/src/main/java/cn/iocoder/yudao/framework/file/core/client/s3/S3FileClientConfig.java @@ -19,6 +19,7 @@ public class S3FileClientConfig implements FileClientConfig { public static final String ENDPOINT_QINIU = "qiniucs.com"; public static final String ENDPOINT_ALIYUN = "aliyuncs.com"; + public static final String ENDPOINT_TENCENT = "myqcloud.com"; /** * 节点地址 diff --git a/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/config/YudaoWebSecurityConfigurerAdapter.java b/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/config/YudaoWebSecurityConfigurerAdapter.java index c3715c185..082d84756 100644 --- a/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/config/YudaoWebSecurityConfigurerAdapter.java +++ b/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/config/YudaoWebSecurityConfigurerAdapter.java @@ -129,6 +129,8 @@ public class YudaoWebSecurityConfigurerAdapter { .antMatchers(buildAppApi("/**")).permitAll() // 1.5 验证码captcha 允许匿名访问 .antMatchers("/captcha/get", "/captcha/check").permitAll() + // 1.6 webSocket 允许匿名访问 + .antMatchers("/websocket/message").permitAll() // ②:每个项目的自定义规则 .and().authorizeRequests(registry -> // 下面,循环设置自定义规则 authorizeRequestsCustomizers.forEach(customizer -> customizer.customize(registry))) diff --git a/yudao-framework/yudao-spring-boot-starter-websocket/pom.xml b/yudao-framework/yudao-spring-boot-starter-websocket/pom.xml new file mode 100644 index 000000000..320e52c48 --- /dev/null +++ b/yudao-framework/yudao-spring-boot-starter-websocket/pom.xml @@ -0,0 +1,37 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project xmlns="http://maven.apache.org/POM/4.0.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <parent> + <groupId>cn.iocoder.boot</groupId> + <artifactId>yudao-framework</artifactId> + <version>${revision}</version> + </parent> + <modelVersion>4.0.0</modelVersion> + <artifactId>yudao-spring-boot-starter-websocket</artifactId> + <packaging>jar</packaging> + + <name>${project.artifactId}</name> + <description>WebSocket</description> + <url>https://github.com/YunaiV/ruoyi-vue-pro</url> + + + <dependencies> + + <dependency> + <groupId>cn.iocoder.boot</groupId> + <artifactId>yudao-common</artifactId> + </dependency> + + <dependency> + <groupId>cn.iocoder.boot</groupId> + <artifactId>yudao-spring-boot-starter-security</artifactId> + </dependency> + + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-websocket</artifactId> + </dependency> + </dependencies> + +</project> \ No newline at end of file diff --git a/yudao-framework/yudao-spring-boot-starter-websocket/src/main/java/cn/iocoder/yudao/framework/websocket/config/WebSocketHandlerConfig.java b/yudao-framework/yudao-spring-boot-starter-websocket/src/main/java/cn/iocoder/yudao/framework/websocket/config/WebSocketHandlerConfig.java new file mode 100644 index 000000000..02c3415d5 --- /dev/null +++ b/yudao-framework/yudao-spring-boot-starter-websocket/src/main/java/cn/iocoder/yudao/framework/websocket/config/WebSocketHandlerConfig.java @@ -0,0 +1,14 @@ +package cn.iocoder.yudao.framework.websocket.config; + +import cn.iocoder.yudao.framework.websocket.core.UserHandshakeInterceptor; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.web.socket.server.HandshakeInterceptor; + +@EnableConfigurationProperties(WebSocketProperties.class) +public class WebSocketHandlerConfig { + @Bean + public HandshakeInterceptor handshakeInterceptor() { + return new UserHandshakeInterceptor(); + } +} diff --git a/yudao-framework/yudao-spring-boot-starter-websocket/src/main/java/cn/iocoder/yudao/framework/websocket/config/WebSocketProperties.java b/yudao-framework/yudao-spring-boot-starter-websocket/src/main/java/cn/iocoder/yudao/framework/websocket/config/WebSocketProperties.java new file mode 100644 index 000000000..0ab1b498f --- /dev/null +++ b/yudao-framework/yudao-spring-boot-starter-websocket/src/main/java/cn/iocoder/yudao/framework/websocket/config/WebSocketProperties.java @@ -0,0 +1,29 @@ +package cn.iocoder.yudao.framework.websocket.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.validation.annotation.Validated; + +/** + * WebSocket 配置项 + * + * @author xingyu4j + */ +@ConfigurationProperties("yudao.websocket") +@Data +@Validated +public class WebSocketProperties { + + /** + * 路径 + */ + private String path = ""; + /** + * 默认最多允许同时在线用户数 + */ + private int maxOnlineCount = 0; + /** + * 是否保存session + */ + private boolean sessionMap = true; +} diff --git a/yudao-framework/yudao-spring-boot-starter-websocket/src/main/java/cn/iocoder/yudao/framework/websocket/config/YudaoWebSocketAutoConfiguration.java b/yudao-framework/yudao-spring-boot-starter-websocket/src/main/java/cn/iocoder/yudao/framework/websocket/config/YudaoWebSocketAutoConfiguration.java new file mode 100644 index 000000000..f8c50ae6a --- /dev/null +++ b/yudao-framework/yudao-spring-boot-starter-websocket/src/main/java/cn/iocoder/yudao/framework/websocket/config/YudaoWebSocketAutoConfiguration.java @@ -0,0 +1,34 @@ +package cn.iocoder.yudao.framework.websocket.config; + +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.web.socket.WebSocketHandler; +import org.springframework.web.socket.config.annotation.WebSocketConfigurer; +import org.springframework.web.socket.server.HandshakeInterceptor; + +import java.util.List; + +/** + * WebSocket 自动配置 + * + * @author xingyu4j + */ +@AutoConfiguration +// 允许使用 yudao.websocket.enable=false 禁用websocket +@ConditionalOnProperty(prefix = "yudao.websocket", value = "enable", matchIfMissing = true) +@EnableConfigurationProperties(WebSocketProperties.class) +public class YudaoWebSocketAutoConfiguration { + @Bean + @ConditionalOnMissingBean + public WebSocketConfigurer webSocketConfigurer(List<HandshakeInterceptor> handshakeInterceptor, + WebSocketHandler webSocketHandler, + WebSocketProperties webSocketProperties) { + + return registry -> registry + .addHandler(webSocketHandler, webSocketProperties.getPath()) + .addInterceptors(handshakeInterceptor.toArray(new HandshakeInterceptor[0])); + } +} diff --git a/yudao-framework/yudao-spring-boot-starter-websocket/src/main/java/cn/iocoder/yudao/framework/websocket/core/UserHandshakeInterceptor.java b/yudao-framework/yudao-spring-boot-starter-websocket/src/main/java/cn/iocoder/yudao/framework/websocket/core/UserHandshakeInterceptor.java new file mode 100644 index 000000000..3f2fa4ec3 --- /dev/null +++ b/yudao-framework/yudao-spring-boot-starter-websocket/src/main/java/cn/iocoder/yudao/framework/websocket/core/UserHandshakeInterceptor.java @@ -0,0 +1,24 @@ +package cn.iocoder.yudao.framework.websocket.core; + +import cn.iocoder.yudao.framework.security.core.LoginUser; +import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; +import org.springframework.http.server.ServerHttpRequest; +import org.springframework.http.server.ServerHttpResponse; +import org.springframework.web.socket.WebSocketHandler; +import org.springframework.web.socket.server.HandshakeInterceptor; + +import java.util.Map; + +public class UserHandshakeInterceptor implements HandshakeInterceptor { + @Override + public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object> attributes) throws Exception { + LoginUser loginUser = SecurityFrameworkUtils.getLoginUser(); + attributes.put(WebSocketKeyDefine.LOGIN_USER, loginUser); + return true; + } + + @Override + public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception exception) { + + } +} diff --git a/yudao-framework/yudao-spring-boot-starter-websocket/src/main/java/cn/iocoder/yudao/framework/websocket/core/WebSocketKeyDefine.java b/yudao-framework/yudao-spring-boot-starter-websocket/src/main/java/cn/iocoder/yudao/framework/websocket/core/WebSocketKeyDefine.java new file mode 100644 index 000000000..f75ebc41c --- /dev/null +++ b/yudao-framework/yudao-spring-boot-starter-websocket/src/main/java/cn/iocoder/yudao/framework/websocket/core/WebSocketKeyDefine.java @@ -0,0 +1,9 @@ +package cn.iocoder.yudao.framework.websocket.core; + + +import lombok.Data; + +@Data +public class WebSocketKeyDefine { + public static final String LOGIN_USER ="LOGIN_USER"; +} diff --git a/yudao-framework/yudao-spring-boot-starter-websocket/src/main/java/cn/iocoder/yudao/framework/websocket/core/WebSocketMessageDO.java b/yudao-framework/yudao-spring-boot-starter-websocket/src/main/java/cn/iocoder/yudao/framework/websocket/core/WebSocketMessageDO.java new file mode 100644 index 000000000..7bb348e99 --- /dev/null +++ b/yudao-framework/yudao-spring-boot-starter-websocket/src/main/java/cn/iocoder/yudao/framework/websocket/core/WebSocketMessageDO.java @@ -0,0 +1,24 @@ +package cn.iocoder.yudao.framework.websocket.core; + +import lombok.Data; +import lombok.experimental.Accessors; + +import java.util.List; + +@Data +@Accessors(chain = true) +public class WebSocketMessageDO { + /** + * 接收消息的seesion + */ + private List<Object> seesionKeyList; + /** + * 发送消息 + */ + private String msgText; + + public static WebSocketMessageDO build(List<Object> seesionKeyList, String msgText) { + return new WebSocketMessageDO().setMsgText(msgText).setSeesionKeyList(seesionKeyList); + } + +} diff --git a/yudao-framework/yudao-spring-boot-starter-websocket/src/main/java/cn/iocoder/yudao/framework/websocket/core/WebSocketSessionHandler.java b/yudao-framework/yudao-spring-boot-starter-websocket/src/main/java/cn/iocoder/yudao/framework/websocket/core/WebSocketSessionHandler.java new file mode 100644 index 000000000..2747f8192 --- /dev/null +++ b/yudao-framework/yudao-spring-boot-starter-websocket/src/main/java/cn/iocoder/yudao/framework/websocket/core/WebSocketSessionHandler.java @@ -0,0 +1,36 @@ +package cn.iocoder.yudao.framework.websocket.core; + +import org.springframework.web.socket.WebSocketSession; + +import java.util.Collection; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; + +public final class WebSocketSessionHandler { + private WebSocketSessionHandler() { + } + + private static final Map<String, WebSocketSession> SESSION_MAP = new ConcurrentHashMap<>(); + + public static void addSession(Object sessionKey, WebSocketSession session) { + SESSION_MAP.put(sessionKey.toString(), session); + } + + public static void removeSession(Object sessionKey) { + SESSION_MAP.remove(sessionKey.toString()); + } + + public static WebSocketSession getSession(Object sessionKey) { + return SESSION_MAP.get(sessionKey.toString()); + } + + public static Collection<WebSocketSession> getSessions() { + return SESSION_MAP.values(); + } + + public static Set<String> getSessionKeys() { + return SESSION_MAP.keySet(); + } + +} diff --git a/yudao-framework/yudao-spring-boot-starter-websocket/src/main/java/cn/iocoder/yudao/framework/websocket/core/WebSocketUtils.java b/yudao-framework/yudao-spring-boot-starter-websocket/src/main/java/cn/iocoder/yudao/framework/websocket/core/WebSocketUtils.java new file mode 100644 index 000000000..816e664cc --- /dev/null +++ b/yudao-framework/yudao-spring-boot-starter-websocket/src/main/java/cn/iocoder/yudao/framework/websocket/core/WebSocketUtils.java @@ -0,0 +1,31 @@ +package cn.iocoder.yudao.framework.websocket.core; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.socket.TextMessage; +import org.springframework.web.socket.WebSocketSession; + +import java.io.IOException; + +@Slf4j +public class WebSocketUtils { + public static boolean sendMessage(WebSocketSession seesion, String message) { + if (seesion == null) { + log.error("seesion 不存在"); + return false; + } + if (seesion.isOpen()) { + try { + seesion.sendMessage(new TextMessage(message)); + } catch (IOException e) { + log.error("WebSocket 消息发送异常 Session={} | msg= {} | exception={}", seesion, message, e); + return false; + } + } + return true; + } + + public static boolean sendMessage(Object sessionKey, String message) { + WebSocketSession session = WebSocketSessionHandler.getSession(sessionKey); + return sendMessage(session, message); + } +} diff --git a/yudao-framework/yudao-spring-boot-starter-websocket/src/main/java/cn/iocoder/yudao/framework/websocket/core/YudaoWebSocketHandlerDecorator.java b/yudao-framework/yudao-spring-boot-starter-websocket/src/main/java/cn/iocoder/yudao/framework/websocket/core/YudaoWebSocketHandlerDecorator.java new file mode 100644 index 000000000..dd8dc602e --- /dev/null +++ b/yudao-framework/yudao-spring-boot-starter-websocket/src/main/java/cn/iocoder/yudao/framework/websocket/core/YudaoWebSocketHandlerDecorator.java @@ -0,0 +1,49 @@ +package cn.iocoder.yudao.framework.websocket.core; + +import cn.iocoder.yudao.framework.security.core.LoginUser; +import org.springframework.web.socket.CloseStatus; +import org.springframework.web.socket.WebSocketHandler; +import org.springframework.web.socket.WebSocketSession; +import org.springframework.web.socket.handler.WebSocketHandlerDecorator; + +public class YudaoWebSocketHandlerDecorator extends WebSocketHandlerDecorator { + public YudaoWebSocketHandlerDecorator(WebSocketHandler delegate) { + super(delegate); + } + + /** + * websocket 连接时执行的动作 + * @param session websocket session 对象 + * @throws Exception 异常对象 + */ + @Override + public void afterConnectionEstablished(final WebSocketSession session) throws Exception { + Object sessionKey = sessionKeyGen(session); + WebSocketSessionHandler.addSession(sessionKey, session); + } + + /** + * websocket 关闭连接时执行的动作 + * @param session websocket session 对象 + * @param closeStatus 关闭状态对象 + * @throws Exception 异常对象 + */ + @Override + public void afterConnectionClosed(final WebSocketSession session, CloseStatus closeStatus) throws Exception { + Object sessionKey = sessionKeyGen(session); + WebSocketSessionHandler.removeSession(sessionKey); + } + + public Object sessionKeyGen(WebSocketSession webSocketSession) { + + Object obj = webSocketSession.getAttributes().get(WebSocketKeyDefine.LOGIN_USER); + + if (obj instanceof LoginUser) { + LoginUser loginUser = (LoginUser) obj; + // userId 作为唯一区分 + return String.valueOf(loginUser.getId()); + } + + return null; + } +} diff --git a/yudao-framework/yudao-spring-boot-starter-websocket/src/main/java/cn/iocoder/yudao/framework/websocket/package-info.java b/yudao-framework/yudao-spring-boot-starter-websocket/src/main/java/cn/iocoder/yudao/framework/websocket/package-info.java new file mode 100644 index 000000000..c771dfaac --- /dev/null +++ b/yudao-framework/yudao-spring-boot-starter-websocket/src/main/java/cn/iocoder/yudao/framework/websocket/package-info.java @@ -0,0 +1 @@ +package cn.iocoder.yudao.framework.websocket; diff --git a/yudao-framework/yudao-spring-boot-starter-websocket/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/yudao-framework/yudao-spring-boot-starter-websocket/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 000000000..6260e407e --- /dev/null +++ b/yudao-framework/yudao-spring-boot-starter-websocket/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1 @@ +cn.iocoder.yudao.framework.websocket.config.YudaoWebSocketAutoConfiguration \ No newline at end of file diff --git a/yudao-module-infra/yudao-module-infra-biz/pom.xml b/yudao-module-infra/yudao-module-infra-biz/pom.xml index db23e697d..6d7ac0cff 100644 --- a/yudao-module-infra/yudao-module-infra-biz/pom.xml +++ b/yudao-module-infra/yudao-module-infra-biz/pom.xml @@ -111,6 +111,12 @@ <groupId>cn.iocoder.boot</groupId> <artifactId>yudao-spring-boot-starter-file</artifactId> </dependency> + + <!-- WebSocket --> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-websocket</artifactId> + </dependency> </dependencies> </project> diff --git a/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/config/ConfigController.java b/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/config/ConfigController.java index 726a10498..493b5faa6 100644 --- a/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/config/ConfigController.java +++ b/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/config/ConfigController.java @@ -75,7 +75,7 @@ public class ConfigController { if (config == null) { return null; } - if (config.getVisible()) { + if (!config.getVisible()) { throw ServiceExceptionUtil.exception(ErrorCodeConstants.CONFIG_GET_VALUE_ERROR_IF_VISIBLE); } return success(config.getValue()); diff --git a/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/file/FileContentDAOImpl.java b/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/file/FileContentDAOImpl.java index c4dcfe8a0..2492c803d 100644 --- a/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/file/FileContentDAOImpl.java +++ b/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/file/FileContentDAOImpl.java @@ -1,11 +1,14 @@ package cn.iocoder.yudao.module.infra.dal.mysql.file; +import cn.hutool.core.collection.CollUtil; import cn.iocoder.yudao.framework.file.core.client.db.DBFileContentFrameworkDAO; import cn.iocoder.yudao.module.infra.dal.dataobject.file.FileContentDO; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import org.springframework.stereotype.Repository; import javax.annotation.Resource; +import java.util.List; +import java.util.Optional; @Repository public class FileContentDAOImpl implements DBFileContentFrameworkDAO { @@ -27,9 +30,11 @@ public class FileContentDAOImpl implements DBFileContentFrameworkDAO { @Override public byte[] selectContent(Long configId, String path) { - FileContentDO fileContentDO = fileContentMapper.selectOne( - buildQuery(configId, path).select(FileContentDO::getContent)); - return fileContentDO != null ? fileContentDO.getContent() : null; + List<FileContentDO> list = fileContentMapper.selectList( + buildQuery(configId, path).select(FileContentDO::getContent).orderByDesc(FileContentDO::getId)); + return Optional.ofNullable(CollUtil.getFirst(list)) + .map(FileContentDO::getContent) + .orElse(null); } private LambdaQueryWrapper<FileContentDO> buildQuery(Long configId, String path) { diff --git a/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/websocket/SemaphoreUtils.java b/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/websocket/SemaphoreUtils.java new file mode 100644 index 000000000..67a87f169 --- /dev/null +++ b/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/websocket/SemaphoreUtils.java @@ -0,0 +1,45 @@ +package cn.iocoder.yudao.module.infra.websocket; + +import lombok.extern.slf4j.Slf4j; + +import java.util.concurrent.Semaphore; + +/** + * 信号量相关处理 + * + */ +@Slf4j +public class SemaphoreUtils { + + /** + * 获取信号量 + * + * @param semaphore + * @return + */ + public static boolean tryAcquire(Semaphore semaphore) { + boolean flag = false; + + try { + flag = semaphore.tryAcquire(); + } catch (Exception e) { + log.error("获取信号量异常", e); + } + + return flag; + } + + /** + * 释放信号量 + * + * @param semaphore + */ + public static void release(Semaphore semaphore) { + + try { + semaphore.release(); + } catch (Exception e) { + log.error("释放信号量异常", e); + } + } +} diff --git a/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/websocket/WebSocketConfig.java b/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/websocket/WebSocketConfig.java new file mode 100644 index 000000000..380bc9317 --- /dev/null +++ b/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/websocket/WebSocketConfig.java @@ -0,0 +1,16 @@ +package cn.iocoder.yudao.module.infra.websocket; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.socket.server.standard.ServerEndpointExporter; + +/** + * websocket 配置 + */ +@Configuration +public class WebSocketConfig { + @Bean + public ServerEndpointExporter serverEndpointExporter() { + return new ServerEndpointExporter(); + } +} diff --git a/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/websocket/WebSocketServer.java b/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/websocket/WebSocketServer.java new file mode 100644 index 000000000..f0cfdd9dc --- /dev/null +++ b/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/websocket/WebSocketServer.java @@ -0,0 +1,86 @@ +package cn.iocoder.yudao.module.infra.websocket; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import javax.websocket.*; +import javax.websocket.server.ServerEndpoint; +import java.util.concurrent.Semaphore; + +/** + * websocket 消息处理 + */ +@Component +@ServerEndpoint("/websocket/message") +@Slf4j +public class WebSocketServer { + + /** + * 默认最多允许同时在线用户数100 + */ + public static int socketMaxOnlineCount = 100; + + private static final Semaphore SOCKET_SEMAPHORE = new Semaphore(socketMaxOnlineCount); + + /** + * 连接建立成功调用的方法 + */ + @OnOpen + public void onOpen(Session session) throws Exception { + // 尝试获取信号量 + boolean semaphoreFlag = SemaphoreUtils.tryAcquire(SOCKET_SEMAPHORE); + if (!semaphoreFlag) { + // 未获取到信号量 + log.error("当前在线人数超过限制数:{}", socketMaxOnlineCount); + WebSocketUsers.sendMessage(session, "当前在线人数超过限制数:" + socketMaxOnlineCount); + session.close(); + } else { + String userId = WebSocketUsers.getParam("userId", session); + if (userId != null) { + // 添加用户 + WebSocketUsers.addSession(userId, session); + log.info("用户【userId={}】建立连接,当前连接用户总数:{}", userId, WebSocketUsers.getUsers().size()); + WebSocketUsers.sendMessage(session, "接收内容:连接成功"); + } else { + WebSocketUsers.sendMessage(session, "接收内容:连接失败"); + } + } + } + + /** + * 连接关闭时处理 + */ + @OnClose + public void onClose(Session session) { + log.info("用户【sessionId={}】关闭连接!", session.getId()); + // 移除用户 + WebSocketUsers.removeSession(session); + // 获取到信号量则需释放 + SemaphoreUtils.release(SOCKET_SEMAPHORE); + } + + /** + * 抛出异常时处理 + */ + @OnError + public void onError(Session session, Throwable exception) throws Exception { + if (session.isOpen()) { + // 关闭连接 + session.close(); + } + String sessionId = session.getId(); + log.info("用户【sessionId={}】连接异常!异常信息:{}", sessionId, exception); + // 移出用户 + WebSocketUsers.removeSession(session); + // 获取到信号量则需释放 + SemaphoreUtils.release(SOCKET_SEMAPHORE); + } + + /** + * 收到客户端消息时调用的方法 + */ + @OnMessage + public void onMessage(Session session, String message) { + WebSocketUsers.sendMessage(session, "接收内容:" + message); + } +} diff --git a/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/websocket/WebSocketUsers.java b/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/websocket/WebSocketUsers.java new file mode 100644 index 000000000..281a97c7d --- /dev/null +++ b/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/websocket/WebSocketUsers.java @@ -0,0 +1,178 @@ +package cn.iocoder.yudao.module.infra.websocket; + +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.StrUtil; +import lombok.extern.slf4j.Slf4j; +import org.bouncycastle.util.Strings; + +import javax.validation.constraints.NotNull; +import javax.websocket.Session; +import java.io.IOException; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; + +/** + * websocket 客户端用户 + */ +@Slf4j +public class WebSocketUsers { + + /** + * 用户集 + * TODO 需要登录用户的session? + */ + private static final Map<String, Session> SESSION_MAP = new ConcurrentHashMap<>(); + + /** + * 存储用户 + * + * @param userId 唯一键 + * @param session 用户信息 + */ + public static void addSession(String userId, Session session) { + SESSION_MAP.put(userId, session); + } + + /** + * 移除用户 + * + * @param session 用户信息 + * @return 移除结果 + */ + public static boolean removeSession(Session session) { + String key = null; + boolean flag = SESSION_MAP.containsValue(session); + if (flag) { + Set<Map.Entry<String, Session>> entries = SESSION_MAP.entrySet(); + for (Map.Entry<String, Session> entry : entries) { + Session value = entry.getValue(); + if (value.equals(session)) { + key = entry.getKey(); + break; + } + } + } else { + return true; + } + return removeSession(key); + } + + /** + * 移出用户 + * + * @param userId 用户id + */ + public static boolean removeSession(String userId) { + log.info("用户【userId={}】退出", userId); + Session remove = SESSION_MAP.remove(userId); + if (remove != null) { + boolean containsValue = SESSION_MAP.containsValue(remove); + log.info("用户【userId={}】退出{},当前连接用户总数:{}", userId, containsValue ? "失败" : "成功", SESSION_MAP.size()); + return containsValue; + } else { + return true; + } + } + + /** + * 获取在线用户列表 + * + * @return 返回用户集合 + */ + public static Map<String, Session> getUsers() { + return SESSION_MAP; + } + + /** + * 向所有在线人发送消息 + * + * @param message 消息内容 + */ + public static void sendMessageToAll(String message) { + SESSION_MAP.forEach((userId, session) -> { + if (session.isOpen()) { + sendMessage(session, message); + } + }); + } + + /** + * 异步发送文本消息 + * + * @param session 用户session + * @param message 消息内容 + */ + public static void sendMessageAsync(Session session, String message) { + if (session.isOpen()) { + // TODO 需要加synchronized锁(synchronized(session))?单个session创建线程? + session.getAsyncRemote().sendText(message); + } else { + log.warn("用户【session={}】不在线", session.getId()); + } + } + + /** + * 同步发送文本消息 + * + * @param session 用户session + * @param message 消息内容 + */ + public static void sendMessage(Session session, String message) { + try { + if (session.isOpen()) { + // TODO 需要加synchronized锁(synchronized(session))?单个session创建线程? + session.getBasicRemote().sendText(message); + } else { + log.warn("用户【session={}】不在线", session.getId()); + } + } catch (IOException e) { + log.error("发送消息异常", e); + } + + } + + /** + * 根据用户id发送消息 + * + * @param userId 用户id + * @param message 消息内容 + */ + public static void sendMessage(String userId, String message) { + Session session = SESSION_MAP.get(userId); + //判断是否存在该用户的session,并且是否在线 + if (session == null || !session.isOpen()) { + return; + } + sendMessage(session, message); + } + + + /** + * 获取session中的指定参数值 + * + * @param key 参数key + * @param session 用户session + */ + public static String getParam(@NotNull String key, Session session) { + //TODO 目前只针对获取一个key的值,后期根据情况拓展多个 或者直接在onClose onOpen上获取参数? + String value = null; + Map<String, List<String>> parameters = session.getRequestParameterMap(); + if (MapUtil.isNotEmpty(parameters)) { + value = parameters.get(key).get(0); + } else { + String queryString = session.getQueryString(); + if (!StrUtil.isEmpty(queryString)) { + String[] params = Strings.split(queryString, '&'); + for (String paramPair : params) { + String[] nameValues = Strings.split(paramPair, '='); + if (key.equals(nameValues[0])) { + value = nameValues[1]; + } + } + } + } + return value; + } +} diff --git a/yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3/views/index.vue.vm b/yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3/views/index.vue.vm index 06fe3002a..6b520c2c3 100644 --- a/yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3/views/index.vue.vm +++ b/yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3/views/index.vue.vm @@ -1,7 +1,7 @@ <template> <ContentWrap> <!-- 列表 --> - <vxe-grid ref="xGrid" v-bind="gridOptions" class="xtable-scrollbar"> + <XTable @register="registerTable"> <template #toolbar_buttons> <!-- 操作:新增 --> <XButton @@ -17,7 +17,7 @@ preIcon="ep:download" :title="t('action.export')" v-hasPermi="['${permissionPrefix}:export']" - @click="handleExport()" + @click="exportList('${table.classComment}.xls')" /> </template> <template #actionbtns_default="{ row }"> @@ -40,10 +40,10 @@ preIcon="ep:delete" :title="t('action.del')" v-hasPermi="['${permissionPrefix}:delete']" - @click="handleDelete(row.id)" + @click="deleteData(row.id)" /> </template> - </vxe-grid> + </XTable> </ContentWrap> <!-- 弹窗 --> <XModal id="${classNameVar}Model" :loading="modelLoading" v-model="modelVisible" :title="modelTitle"> @@ -79,8 +79,7 @@ import { ref, unref } from 'vue' import { useI18n } from '@/hooks/web/useI18n' import { useMessage } from '@/hooks/web/useMessage' -import { useVxeGrid } from '@/hooks/web/useVxeGrid' -import { VxeGridInstance } from 'vxe-table' +import { useXTable } from '@/hooks/web/useXTable' import { FormExpose } from '@/components/Form' // 业务相关的 import import { rules, allSchemas } from './${classNameVar}.data' @@ -90,8 +89,7 @@ const { t } = useI18n() // 国际化 const message = useMessage() // 消息弹窗 // 列表相关的变量 -const xGrid = ref<VxeGridInstance>() // 列表 Grid Ref -const { gridOptions, getList, deleteData, exportList } = useVxeGrid<${simpleClassName}Api.${simpleClassName}VO>({ +const [registerTable, { reload, deleteData, exportList }] = useXTable({ allSchemas: allSchemas, getListApi: ${simpleClassName}Api.get${simpleClassName}PageApi, deleteApi: ${simpleClassName}Api.delete${simpleClassName}Api, @@ -121,11 +119,6 @@ const handleCreate = () => { modelLoading.value = false } -// 导出操作 -const handleExport = async () => { - await exportList(xGrid, '${table.classComment}.xls') -} - // 修改操作 const handleUpdate = async (rowId: number) => { setDialogTile('update') @@ -143,11 +136,6 @@ const handleDetail = async (rowId: number) => { modelLoading.value = false } -// 删除操作 -const handleDelete = async (rowId: number) => { - await deleteData(xGrid, rowId) -} - // 提交按钮 const submitForm = async () => { const elForm = unref(formRef)?.getElFormRef() @@ -169,7 +157,7 @@ const submitForm = async () => { } finally { actionLoading.value = false // 刷新列表 - await getList(xGrid) + await reload() } } }) diff --git a/yudao-module-visualization/yudao-module-visualization-biz/src/main/java/cn/iocoder/yudao/module/visualization/framework/jmreport/config/JmReportConfiguration.java b/yudao-module-visualization/yudao-module-visualization-biz/src/main/java/cn/iocoder/yudao/module/visualization/framework/jmreport/config/JmReportConfiguration.java index 59510b5ff..c679d1112 100644 --- a/yudao-module-visualization/yudao-module-visualization-biz/src/main/java/cn/iocoder/yudao/module/visualization/framework/jmreport/config/JmReportConfiguration.java +++ b/yudao-module-visualization/yudao-module-visualization-biz/src/main/java/cn/iocoder/yudao/module/visualization/framework/jmreport/config/JmReportConfiguration.java @@ -1,5 +1,6 @@ package cn.iocoder.yudao.module.visualization.framework.jmreport.config; +import cn.iocoder.yudao.framework.security.config.SecurityProperties; import cn.iocoder.yudao.module.system.api.oauth2.OAuth2TokenApi; import cn.iocoder.yudao.module.visualization.framework.jmreport.core.service.JmReportTokenServiceImpl; import org.jeecg.modules.jmreport.api.JmReportTokenServiceI; @@ -18,8 +19,8 @@ public class JmReportConfiguration { @Bean @SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection") - public JmReportTokenServiceI jmReportTokenService(OAuth2TokenApi oAuth2TokenApi) { - return new JmReportTokenServiceImpl(oAuth2TokenApi); + public JmReportTokenServiceI jmReportTokenService(OAuth2TokenApi oAuth2TokenApi, SecurityProperties securityProperties) { + return new JmReportTokenServiceImpl(oAuth2TokenApi, securityProperties); } } diff --git a/yudao-module-visualization/yudao-module-visualization-biz/src/main/java/cn/iocoder/yudao/module/visualization/framework/jmreport/core/service/JmReportTokenServiceImpl.java b/yudao-module-visualization/yudao-module-visualization-biz/src/main/java/cn/iocoder/yudao/module/visualization/framework/jmreport/core/service/JmReportTokenServiceImpl.java index 511465786..22c4a19c8 100644 --- a/yudao-module-visualization/yudao-module-visualization-biz/src/main/java/cn/iocoder/yudao/module/visualization/framework/jmreport/core/service/JmReportTokenServiceImpl.java +++ b/yudao-module-visualization/yudao-module-visualization-biz/src/main/java/cn/iocoder/yudao/module/visualization/framework/jmreport/core/service/JmReportTokenServiceImpl.java @@ -1,7 +1,10 @@ package cn.iocoder.yudao.module.visualization.framework.jmreport.core.service; +import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import cn.iocoder.yudao.framework.common.exception.ServiceException; +import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils; +import cn.iocoder.yudao.framework.security.config.SecurityProperties; import cn.iocoder.yudao.framework.security.core.LoginUser; import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder; @@ -10,6 +13,10 @@ import cn.iocoder.yudao.module.system.api.oauth2.OAuth2TokenApi; import cn.iocoder.yudao.module.system.api.oauth2.dto.OAuth2AccessTokenCheckRespDTO; import lombok.RequiredArgsConstructor; import org.jeecg.modules.jmreport.api.JmReportTokenServiceI; +import org.springframework.http.HttpHeaders; + +import javax.servlet.http.HttpServletRequest; +import java.util.Objects; /** * {@link JmReportTokenServiceI} 实现类,提供积木报表的 Token 校验、用户信息的查询等功能 @@ -19,8 +26,37 @@ import org.jeecg.modules.jmreport.api.JmReportTokenServiceI; @RequiredArgsConstructor public class JmReportTokenServiceImpl implements JmReportTokenServiceI { + /** + * 积木 token head 头 + */ + private static final String JM_TOKEN_HEADER = "X-Access-Token"; + /** + * auth 相关格式 + */ + private static final String AUTHORIZATION_FORMAT = SecurityFrameworkUtils.AUTHORIZATION_BEARER + " %s"; + private final OAuth2TokenApi oauth2TokenApi; + private final SecurityProperties securityProperties; + + /** + * 自定义 API 数据集appian自定义 Header,解决 Token 传递。 + * 参考 <a href="http://report.jeecg.com/2222224">api数据集token机制详解</a> 文档 + * + * @return 新 head + */ + @Override + public HttpHeaders customApiHeader() { + // 读取积木标标系统的 token + HttpServletRequest request = ServletUtils.getRequest(); + String token = request.getHeader(JM_TOKEN_HEADER); + + // 设置到 yudao 系统的 token + HttpHeaders headers = new HttpHeaders(); + headers.add(securityProperties.getTokenHeader(), String.format(AUTHORIZATION_FORMAT, token)); + return headers; + } + /** * 校验 Token 是否有效,即验证通过 * @@ -29,8 +65,40 @@ public class JmReportTokenServiceImpl implements JmReportTokenServiceI { */ @Override public Boolean verifyToken(String token) { + Long userId = SecurityFrameworkUtils.getLoginUserId(); + if (!Objects.isNull(userId)) { + return true; + } + return buildLoginUserByToken(token) != null; + } + + /** + * 获得用户编号 + * <p> + * 虽然方法名获得的是 username,实际对应到项目中是用户编号 + * + * @param token JmReport 前端传递的 token + * @return 用户编号 + */ + @Override + public String getUsername(String token) { + Long userId = SecurityFrameworkUtils.getLoginUserId(); + if (ObjectUtil.isNotNull(userId)) { + return String.valueOf(userId); + } + LoginUser user = buildLoginUserByToken(token); + return user == null ? null : String.valueOf(user.getId()); + } + + /** + * 基于 token 构建登录用户 + * + * @param token token + * @return 返回 token 对应的用户信息 + */ + private LoginUser buildLoginUserByToken(String token) { if (StrUtil.isEmpty(token)) { - return false; + return null; } // TODO 如下的实现不算特别优雅,主要咱是不想搞的太复杂,所以参考对应的 Filter 先实现了 @@ -41,7 +109,7 @@ public class JmReportTokenServiceImpl implements JmReportTokenServiceI { try { OAuth2AccessTokenCheckRespDTO accessToken = oauth2TokenApi.checkAccessToken(token); if (accessToken == null) { - return false; + return null; } user = new LoginUser().setId(accessToken.getUserId()).setUserType(accessToken.getUserType()) .setTenantId(accessToken.getTenantId()).setScopes(accessToken.getScopes()); @@ -49,7 +117,7 @@ public class JmReportTokenServiceImpl implements JmReportTokenServiceI { // do nothing:如果报错,说明认证失败,则返回 false 即可 } if (user == null) { - return false; + return null; } SecurityFrameworkUtils.setLoginUser(user, WebFrameworkUtils.getRequest()); @@ -57,21 +125,7 @@ public class JmReportTokenServiceImpl implements JmReportTokenServiceI { // 目的:基于 LoginUser 获得到的租户编号,设置到 Tenant 上下文,避免查询数据库时的报错 TenantContextHolder.setIgnore(false); TenantContextHolder.setTenantId(user.getTenantId()); - return true; - } - - /** - * 获得用户编号 - * - * 虽然方法名获得的是 username,实际对应到项目中是用户编号 - * - * @param token JmReport 前端传递的 token - * @return 用户编号 - */ - @Override - public String getUsername(String token) { - Long userId = SecurityFrameworkUtils.getLoginUserId(); - return userId != null ? String.valueOf(userId) : null; + return user; } } diff --git a/yudao-server/pom.xml b/yudao-server/pom.xml index 71839afe6..b95287812 100644 --- a/yudao-server/pom.xml +++ b/yudao-server/pom.xml @@ -111,7 +111,7 @@ <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> - <version>2.7.6</version> <!-- 如果 spring.boot.version 版本修改,则这里也要跟着修改 --> + <version>2.7.7</version> <!-- 如果 spring.boot.version 版本修改,则这里也要跟着修改 --> <configuration> <fork>true</fork> </configuration> diff --git a/yudao-server/src/main/resources/application.yaml b/yudao-server/src/main/resources/application.yaml index 247f23da9..325e88f42 100644 --- a/yudao-server/src/main/resources/application.yaml +++ b/yudao-server/src/main/resources/application.yaml @@ -93,6 +93,11 @@ yudao: permit-all_urls: - /admin-ui/** # /resources/admin-ui 目录下的静态资源 - /admin-api/mp/open/** # 微信公众号开放平台,微信回调接口,不需要登录 + websocket: + enable: true # websocket的开关 + path: /websocket/message # 路径 + maxOnlineCount: 0 # 最大连接人数 + sessionMap: true # 保存sessionMap swagger: title: 管理后台 description: 提供管理员管理的所有功能 diff --git a/yudao-ui-admin-vue3/README.md b/yudao-ui-admin-vue3/README.md index 10fb35e02..73561ec9b 100644 --- a/yudao-ui-admin-vue3/README.md +++ b/yudao-ui-admin-vue3/README.md @@ -26,19 +26,19 @@ ### 前端依赖 -| 框架 | 说明 | 版本 | -| --- | --- | --- | +| 框架 | 说明 | 版本 | +| --- | --- |--------| | [Vue](https://staging-cn.vuejs.org/) | vue 框架 | 3.2.45 | -| [Vite](https://cn.vitejs.dev//) | 开发与构建工具 | 4.0.3 | -| [Element Plus](https://element-plus.org/zh-CN/) | Element Plus | 2.2.27 | -| [TypeScript](https://www.typescriptlang.org/docs/) | JavaScript 的超集 | 4.9.4 | +| [Vite](https://cn.vitejs.dev//) | 开发与构建工具 | 4.0.4 | +| [Element Plus](https://element-plus.org/zh-CN/) | Element Plus | 2.2.28 | +| [TypeScript](https://www.typescriptlang.org/docs/) | JavaScript 的超集 | 4.9.4 | | [pinia](https://pinia.vuejs.org/) | Vue 存储库 替代 vuex5 | 2.0.28 | -| [vueuse](https://vueuse.org/) | 常用工具集 | 9.8.2 | -| [vxe-table](https://vxetable.cn/) | vue 最强表单 | 4.3.7 | -| [vue-i18n](https://kazupon.github.io/vue-i18n/zh/introduction.html/) | 国际化 | 9.2.2 | -| [vue-router](https://router.vuejs.org/) | vue 路由 | 4.1.6 | -| [windicss](https://cn.windicss.org/) | 下一代工具优先的 CSS 框架 | 3.5.6 | -| [iconify](https://icon-sets.iconify.design/) | 在线图标库 | 3.0.0 | +| [vueuse](https://vueuse.org/) | 常用工具集 | 9.10.0 | +| [vxe-table](https://vxetable.cn/) | vue 最强表单 | 4.3.7 | +| [vue-i18n](https://kazupon.github.io/vue-i18n/zh/introduction.html/) | 国际化 | 9.2.2 | +| [vue-router](https://router.vuejs.org/) | vue 路由 | 4.1.6 | +| [windicss](https://cn.windicss.org/) | 下一代工具优先的 CSS 框架 | 3.5.6 | +| [iconify](https://icon-sets.iconify.design/) | 在线图标库 | 3.0.1 | | [wangeditor](https://www.wangeditor.com/) | 富文本编辑器 | 5.1.23 | ### 推荐 VScode 开发,插件如下 diff --git a/yudao-ui-admin-vue3/package.json b/yudao-ui-admin-vue3/package.json index 4bc43875d..ac2e72ded 100644 --- a/yudao-ui-admin-vue3/package.json +++ b/yudao-ui-admin-vue3/package.json @@ -1,6 +1,6 @@ { "name": "yudao-ui-admin-vue3", - "version": "1.6.5.1879", + "version": "1.6.6-snapshot.1901", "description": "基于vue3、vite4、element-plus、typesScript", "author": "xingyu", "private": false, @@ -25,18 +25,18 @@ }, "dependencies": { "@iconify/iconify": "^3.0.1", - "@vueuse/core": "^9.9.0", + "@vueuse/core": "^9.10.0", "@wangeditor/editor": "^5.1.23", "@wangeditor/editor-for-vue": "^5.1.10", "@zxcvbn-ts/core": "^2.1.0", "animate.css": "^4.1.1", - "axios": "^1.2.1", + "axios": "^1.2.2", "cropperjs": "^1.5.13", "crypto-js": "^4.1.1", "dayjs": "^1.11.7", "echarts": "^5.4.1", "echarts-wordcloud": "^2.1.0", - "element-plus": "2.2.27", + "element-plus": "2.2.28", "intro.js": "^6.0.0", "jsencrypt": "^3.3.1", "lodash-es": "^4.17.21", @@ -55,27 +55,27 @@ "xe-utils": "^3.5.7" }, "devDependencies": { - "@commitlint/cli": "^17.3.0", - "@commitlint/config-conventional": "^17.3.0", - "@iconify/json": "^2.1.157", + "@commitlint/cli": "^17.4.0", + "@commitlint/config-conventional": "^17.4.0", + "@iconify/json": "^2.2.2", "@intlify/unplugin-vue-i18n": "^0.8.1", "@purge-icons/generated": "^0.9.0", "@types/intro.js": "^5.1.0", "@types/lodash-es": "^4.17.6", - "@types/node": "^18.11.17", + "@types/node": "^18.11.18", "@types/nprogress": "^0.2.0", "@types/qrcode": "^1.5.0", "@types/qs": "^6.9.7", - "@typescript-eslint/eslint-plugin": "^5.47.0", - "@typescript-eslint/parser": "^5.47.0", + "@typescript-eslint/eslint-plugin": "^5.48.0", + "@typescript-eslint/parser": "^5.48.0", "@vitejs/plugin-legacy": "^3.0.1", "@vitejs/plugin-vue": "^4.0.0", "@vitejs/plugin-vue-jsx": "^3.0.0", "autoprefixer": "^10.4.13", "consola": "^2.15.3", - "eslint": "^8.30.0", - "eslint-config-prettier": "^8.5.0", - "eslint-define-config": "^1.12.0", + "eslint": "^8.31.0", + "eslint-config-prettier": "^8.6.0", + "eslint-define-config": "^1.13.0", "eslint-plugin-prettier": "^4.2.1", "eslint-plugin-vue": "^9.8.0", "lint-staged": "^13.1.0", @@ -84,9 +84,9 @@ "postcss-scss": "^4.0.6", "prettier": "^2.8.1", "rimraf": "^3.0.2", - "rollup": "^3.8.1", + "rollup": "^3.9.1", "sass": "^1.57.1", - "stylelint": "^14.16.0", + "stylelint": "^14.16.1", "stylelint-config-html": "^1.1.0", "stylelint-config-prettier": "^9.0.4", "stylelint-config-recommended": "^9.0.0", @@ -94,7 +94,7 @@ "stylelint-order": "^5.0.0", "terser": "^5.16.1", "typescript": "4.9.4", - "vite": "4.0.3", + "vite": "4.0.4", "vite-plugin-compression": "^0.5.1", "vite-plugin-ejs": "^1.6.4", "vite-plugin-eslint": "^1.8.1", @@ -104,7 +104,7 @@ "vite-plugin-svg-icons": "^2.0.1", "vite-plugin-vue-setup-extend": "^0.4.0", "vite-plugin-windicss": "^1.8.10", - "vue-tsc": "^1.0.17", + "vue-tsc": "^1.0.22", "windicss": "^3.5.6" }, "engines": { diff --git a/yudao-ui-admin-vue3/pnpm-lock.yaml b/yudao-ui-admin-vue3/pnpm-lock.yaml index fd741a973..cb31c2c89 100644 --- a/yudao-ui-admin-vue3/pnpm-lock.yaml +++ b/yudao-ui-admin-vue3/pnpm-lock.yaml @@ -1,40 +1,40 @@ lockfileVersion: 5.4 specifiers: - '@commitlint/cli': ^17.3.0 - '@commitlint/config-conventional': ^17.3.0 + '@commitlint/cli': ^17.4.0 + '@commitlint/config-conventional': ^17.4.0 '@iconify/iconify': ^3.0.1 - '@iconify/json': ^2.1.156 + '@iconify/json': ^2.2.2 '@intlify/unplugin-vue-i18n': ^0.8.1 '@purge-icons/generated': ^0.9.0 '@types/intro.js': ^5.1.0 '@types/lodash-es': ^4.17.6 - '@types/node': ^18.11.17 + '@types/node': ^18.11.18 '@types/nprogress': ^0.2.0 '@types/qrcode': ^1.5.0 '@types/qs': ^6.9.7 - '@typescript-eslint/eslint-plugin': ^5.47.0 - '@typescript-eslint/parser': ^5.47.0 + '@typescript-eslint/eslint-plugin': ^5.48.0 + '@typescript-eslint/parser': ^5.48.0 '@vitejs/plugin-legacy': ^3.0.1 '@vitejs/plugin-vue': ^4.0.0 '@vitejs/plugin-vue-jsx': ^3.0.0 - '@vueuse/core': ^9.8.2 + '@vueuse/core': ^9.10.0 '@wangeditor/editor': ^5.1.23 '@wangeditor/editor-for-vue': ^5.1.10 '@zxcvbn-ts/core': ^2.1.0 animate.css: ^4.1.1 autoprefixer: ^10.4.13 - axios: ^1.2.1 + axios: ^1.2.2 consola: ^2.15.3 cropperjs: ^1.5.13 crypto-js: ^4.1.1 dayjs: ^1.11.7 echarts: ^5.4.1 echarts-wordcloud: ^2.1.0 - element-plus: 2.2.27 - eslint: ^8.30.0 - eslint-config-prettier: ^8.5.0 - eslint-define-config: ^1.12.0 + element-plus: 2.2.28 + eslint: ^8.31.0 + eslint-config-prettier: ^8.6.0 + eslint-define-config: ^1.13.0 eslint-plugin-prettier: ^4.2.1 eslint-plugin-vue: ^9.8.0 intro.js: ^6.0.0 @@ -51,9 +51,9 @@ specifiers: qrcode: ^1.5.1 qs: ^6.11.0 rimraf: ^3.0.2 - rollup: ^3.8.1 + rollup: ^3.9.1 sass: ^1.57.1 - stylelint: ^14.16.0 + stylelint: ^14.16.1 stylelint-config-html: ^1.1.0 stylelint-config-prettier: ^9.0.4 stylelint-config-recommended: ^9.0.0 @@ -62,7 +62,7 @@ specifiers: terser: ^5.16.1 typescript: 4.9.4 url: ^0.11.0 - vite: 4.0.3 + vite: 4.0.4 vite-plugin-compression: ^0.5.1 vite-plugin-ejs: ^1.6.4 vite-plugin-eslint: ^1.8.1 @@ -75,7 +75,7 @@ specifiers: vue: 3.2.45 vue-i18n: 9.2.2 vue-router: ^4.1.6 - vue-tsc: ^1.0.16 + vue-tsc: ^1.0.22 vue-types: ^5.0.2 vxe-table: ^4.3.7 web-storage-cache: ^1.1.1 @@ -84,24 +84,24 @@ specifiers: dependencies: '@iconify/iconify': 3.0.1 - '@vueuse/core': 9.8.2_vue@3.2.45 + '@vueuse/core': 9.10.0_vue@3.2.45 '@wangeditor/editor': 5.1.23 '@wangeditor/editor-for-vue': 5.1.12_3apfu3xbp6awzuex7ed3sbrv6y '@zxcvbn-ts/core': 2.1.0 animate.css: 4.1.1 - axios: 1.2.1 + axios: 1.2.2 cropperjs: 1.5.13 crypto-js: 4.1.1 dayjs: 1.11.7 - echarts: registry.npmmirror.com/echarts/5.4.1 + echarts: 5.4.1 echarts-wordcloud: 2.1.0_echarts@5.4.1 - element-plus: 2.2.27_vue@3.2.45 + element-plus: 2.2.28_vue@3.2.45 intro.js: 6.0.0 jsencrypt: 3.3.1 lodash-es: 4.17.21 mitt: 3.0.0 nprogress: 0.2.0 - pinia: registry.npmmirror.com/pinia/2.0.28_prq2uz4lho2pwp6irk4cfkrxwu + pinia: 2.0.28_prq2uz4lho2pwp6irk4cfkrxwu qrcode: 1.5.1 qs: 6.11.0 url: 0.11.0 @@ -109,89 +109,413 @@ dependencies: vue-i18n: 9.2.2_vue@3.2.45 vue-router: 4.1.6_vue@3.2.45 vue-types: 5.0.2_vue@3.2.45 - vxe-table: registry.npmmirror.com/vxe-table/4.3.7_vue@3.2.45+xe-utils@3.5.7 + vxe-table: 4.3.7_vue@3.2.45+xe-utils@3.5.7 web-storage-cache: 1.1.1 xe-utils: 3.5.7 devDependencies: - '@commitlint/cli': 17.3.0 - '@commitlint/config-conventional': 17.3.0 - '@iconify/json': 2.1.156 + '@commitlint/cli': 17.4.0_@types+node@18.11.18 + '@commitlint/config-conventional': 17.4.0 + '@iconify/json': 2.2.2 '@intlify/unplugin-vue-i18n': 0.8.1_vue-i18n@9.2.2 '@purge-icons/generated': 0.9.0 '@types/intro.js': 5.1.0 '@types/lodash-es': 4.17.6 - '@types/node': 18.11.17 + '@types/node': 18.11.18 '@types/nprogress': 0.2.0 '@types/qrcode': 1.5.0 '@types/qs': 6.9.7 - '@typescript-eslint/eslint-plugin': 5.47.0_ncmi6noazr3nzas7jxykisekym - '@typescript-eslint/parser': 5.47.0_lzzuuodtsqwxnvqeq4g4likcqa - '@vitejs/plugin-legacy': registry.npmmirror.com/@vitejs/plugin-legacy/3.0.1_terser@5.16.1+vite@4.0.3 - '@vitejs/plugin-vue': registry.npmmirror.com/@vitejs/plugin-vue/4.0.0_vite@4.0.3+vue@3.2.45 - '@vitejs/plugin-vue-jsx': registry.npmmirror.com/@vitejs/plugin-vue-jsx/3.0.0_vite@4.0.3+vue@3.2.45 + '@typescript-eslint/eslint-plugin': 5.48.0_k73wpmdolxikpyqun3p36akaaq + '@typescript-eslint/parser': 5.48.0_iukboom6ndih5an6iafl45j2fe + '@vitejs/plugin-legacy': 3.0.1_terser@5.16.1+vite@4.0.4 + '@vitejs/plugin-vue': 4.0.0_vite@4.0.4+vue@3.2.45 + '@vitejs/plugin-vue-jsx': 3.0.0_vite@4.0.4+vue@3.2.45 autoprefixer: 10.4.13_postcss@8.4.20 consola: 2.15.3 - eslint: 8.30.0 - eslint-config-prettier: 8.5.0_eslint@8.30.0 - eslint-define-config: 1.12.0 - eslint-plugin-prettier: 4.2.1_kl4pe43v5b43npmso5hoplpbyi - eslint-plugin-vue: 9.8.0_eslint@8.30.0 + eslint: 8.31.0 + eslint-config-prettier: 8.6.0_eslint@8.31.0 + eslint-define-config: 1.13.0 + eslint-plugin-prettier: 4.2.1_32m5uc2milwdw3tnkcq5del26y + eslint-plugin-vue: 9.8.0_eslint@8.31.0 lint-staged: 13.1.0 - postcss: registry.npmmirror.com/postcss/8.4.20 + postcss: 8.4.20 postcss-html: 1.5.0 postcss-scss: 4.0.6_postcss@8.4.20 prettier: 2.8.1 rimraf: 3.0.2 - rollup: 3.8.1 + rollup: 3.9.1 sass: 1.57.1 - stylelint: 14.16.0 - stylelint-config-html: 1.1.0_bto6pmslw3cibsiuq6smxboytq - stylelint-config-prettier: 9.0.4_stylelint@14.16.0 - stylelint-config-recommended: 9.0.0_stylelint@14.16.0 - stylelint-config-standard: 29.0.0_stylelint@14.16.0 - stylelint-order: 5.0.0_stylelint@14.16.0 + stylelint: 14.16.1 + stylelint-config-html: 1.1.0_kbto3rg3njmczth2rrsgfnlsqa + stylelint-config-prettier: 9.0.4_stylelint@14.16.1 + stylelint-config-recommended: 9.0.0_stylelint@14.16.1 + stylelint-config-standard: 29.0.0_stylelint@14.16.1 + stylelint-order: 5.0.0_stylelint@14.16.1 terser: 5.16.1 typescript: 4.9.4 - vite: 4.0.3_amyfslv6hdwxqbf7f4ldebbtce - vite-plugin-compression: 0.5.1_vite@4.0.3 + vite: 4.0.4_zxbrnrc4iyldik6mikh3pswz4i + vite-plugin-compression: 0.5.1_vite@4.0.4 vite-plugin-ejs: 1.6.4 - vite-plugin-eslint: 1.8.1_eslint@8.30.0+vite@4.0.3 - vite-plugin-progress: 0.0.6_vite@4.0.3 - vite-plugin-purge-icons: registry.npmmirror.com/vite-plugin-purge-icons/0.9.2_vite@4.0.3 - vite-plugin-style-import: 2.0.0_vite@4.0.3 - vite-plugin-svg-icons: 2.0.1_vite@4.0.3 - vite-plugin-vue-setup-extend: 0.4.0_vite@4.0.3 - vite-plugin-windicss: registry.npmmirror.com/vite-plugin-windicss/1.8.10_vite@4.0.3 - vue-tsc: 1.0.16_typescript@4.9.4 + vite-plugin-eslint: 1.8.1_eslint@8.31.0+vite@4.0.4 + vite-plugin-progress: 0.0.6_vite@4.0.4 + vite-plugin-purge-icons: 0.9.2_vite@4.0.4 + vite-plugin-style-import: 2.0.0_vite@4.0.4 + vite-plugin-svg-icons: 2.0.1_vite@4.0.4 + vite-plugin-vue-setup-extend: 0.4.0_vite@4.0.4 + vite-plugin-windicss: 1.8.10_vite@4.0.4 + vue-tsc: 1.0.22_typescript@4.9.4 windicss: 3.5.6 packages: + /@ampproject/remapping/2.2.0: + resolution: {integrity: sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@ampproject/remapping/-/remapping-2.2.0.tgz} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/gen-mapping': 0.1.1 + '@jridgewell/trace-mapping': 0.3.17 + dev: true + + /@antfu/utils/0.7.2: + resolution: {integrity: sha512-vy9fM3pIxZmX07dL+VX1aZe7ynZ+YyB0jY+jE6r3hOK6GNY2t6W8rzpFC4tgpbXUYABkFQwgJq2XYXlxbXAI0g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@antfu/utils/-/utils-0.7.2.tgz} + dev: true + + /@babel/code-frame/7.18.6: + resolution: {integrity: sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@babel/code-frame/-/code-frame-7.18.6.tgz} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.18.6 + dev: true + + /@babel/compat-data/7.20.1: + resolution: {integrity: sha512-EWZ4mE2diW3QALKvDMiXnbZpRvlj+nayZ112nK93SnhqOtpdsbVD4W+2tEoT3YNBAG9RBR0ISY758ZkOgsn6pQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@babel/compat-data/-/compat-data-7.20.1.tgz} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/core/7.20.5: + resolution: {integrity: sha512-UdOWmk4pNWTm/4DlPUl/Pt4Gz4rcEMb7CY0Y3eJl5Yz1vI8ZJGmHWaVE55LoxRjdpx0z259GE9U5STA9atUinQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@babel/core/-/core-7.20.5.tgz} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.2.0 + '@babel/code-frame': 7.18.6 + '@babel/generator': 7.20.5 + '@babel/helper-compilation-targets': 7.20.0_@babel+core@7.20.5 + '@babel/helper-module-transforms': 7.20.2 + '@babel/helpers': 7.20.6 + '@babel/parser': 7.20.5 + '@babel/template': 7.18.10 + '@babel/traverse': 7.20.5 + '@babel/types': 7.20.5 + convert-source-map: 1.9.0 + debug: 4.3.4 + gensync: 1.0.0-beta.2 + json5: 2.2.1 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/generator/7.20.5: + resolution: {integrity: sha512-jl7JY2Ykn9S0yj4DQP82sYvPU+T3g0HFcWTqDLqiuA9tGRNIj9VfbtXGAYTTkyNEnQk1jkMGOdYka8aG/lulCA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@babel/generator/-/generator-7.20.5.tgz} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.20.5 + '@jridgewell/gen-mapping': 0.3.2 + jsesc: 2.5.2 + dev: true + + /@babel/helper-annotate-as-pure/7.18.6: + resolution: {integrity: sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.20.5 + dev: true + + /@babel/helper-compilation-targets/7.20.0_@babel+core@7.20.5: + resolution: {integrity: sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/compat-data': 7.20.1 + '@babel/core': 7.20.5 + '@babel/helper-validator-option': 7.18.6 + browserslist: 4.21.4 + semver: 6.3.0 + dev: true + + /@babel/helper-create-class-features-plugin/7.20.2_@babel+core@7.20.5: + resolution: {integrity: sha512-k22GoYRAHPYr9I+Gvy2ZQlAe5mGy8BqWst2wRt8cwIufWTxrsVshhIBvYNqC80N0GSFWTsqRVexOtfzlgOEDvA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.2.tgz} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.20.5 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-function-name': 7.19.0 + '@babel/helper-member-expression-to-functions': 7.18.9 + '@babel/helper-optimise-call-expression': 7.18.6 + '@babel/helper-replace-supers': 7.19.1 + '@babel/helper-split-export-declaration': 7.18.6 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-environment-visitor/7.18.9: + resolution: {integrity: sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-function-name/7.19.0: + resolution: {integrity: sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.18.10 + '@babel/types': 7.20.5 + dev: true + + /@babel/helper-hoist-variables/7.18.6: + resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.20.5 + dev: true + + /@babel/helper-member-expression-to-functions/7.18.9: + resolution: {integrity: sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.20.5 + dev: true + + /@babel/helper-module-imports/7.18.6: + resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.20.5 + dev: true + + /@babel/helper-module-transforms/7.20.2: + resolution: {integrity: sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-module-imports': 7.18.6 + '@babel/helper-simple-access': 7.20.2 + '@babel/helper-split-export-declaration': 7.18.6 + '@babel/helper-validator-identifier': 7.19.1 + '@babel/template': 7.18.10 + '@babel/traverse': 7.20.5 + '@babel/types': 7.20.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-optimise-call-expression/7.18.6: + resolution: {integrity: sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.20.5 + dev: true + + /@babel/helper-plugin-utils/7.20.2: + resolution: {integrity: sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-replace-supers/7.19.1: + resolution: {integrity: sha512-T7ahH7wV0Hfs46SFh5Jz3s0B6+o8g3c+7TMxu7xKfmHikg7EAZ3I2Qk9LFhjxXq8sL7UkP5JflezNwoZa8WvWw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@babel/helper-replace-supers/-/helper-replace-supers-7.19.1.tgz} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-member-expression-to-functions': 7.18.9 + '@babel/helper-optimise-call-expression': 7.18.6 + '@babel/traverse': 7.20.5 + '@babel/types': 7.20.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-simple-access/7.20.2: + resolution: {integrity: sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.20.5 + dev: true + + /@babel/helper-split-export-declaration/7.18.6: + resolution: {integrity: sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.20.5 + dev: true + + /@babel/helper-string-parser/7.19.4: + resolution: {integrity: sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz} + engines: {node: '>=6.9.0'} + + /@babel/helper-validator-identifier/7.19.1: + resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz} + engines: {node: '>=6.9.0'} + + /@babel/helper-validator-option/7.18.6: + resolution: {integrity: sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helpers/7.20.6: + resolution: {integrity: sha512-Pf/OjgfgFRW5bApskEz5pvidpim7tEDPlFtKcNRXWmfHGn9IEI2W2flqRQXTFb7gIPTyK++N6rVHuwKut4XK6w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@babel/helpers/-/helpers-7.20.6.tgz} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.18.10 + '@babel/traverse': 7.20.5 + '@babel/types': 7.20.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/highlight/7.18.6: + resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@babel/highlight/-/highlight-7.18.6.tgz} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.19.1 + chalk: 2.4.2 + js-tokens: 4.0.0 + dev: true + /@babel/parser/7.20.3: resolution: {integrity: sha512-OP/s5a94frIPXwjzEcv5S/tpQfc6XhxYUnmWpgdqMWGgYCuErA3SzozaRAMQgSZWKeTJxht9aWAkUY+0UzvOFg==} engines: {node: '>=6.0.0'} hasBin: true dependencies: - '@babel/types': registry.npmmirror.com/@babel/types/7.20.5 + '@babel/types': 7.20.5 + + /@babel/parser/7.20.5: + resolution: {integrity: sha512-r27t/cy/m9uKLXQNWWebeCUHgnAZq0CpG1OwKRxzJMP1vpSU4bSIK2hq+/cp0bQxetkXx38n09rNu8jVkcK/zA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@babel/parser/-/parser-7.20.5.tgz} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.20.5 + + /@babel/plugin-syntax-jsx/7.18.6_@babel+core@7.20.5: + resolution: {integrity: sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.5 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-typescript/7.20.0_@babel+core@7.20.5: + resolution: {integrity: sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.5 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-typescript/7.20.2_@babel+core@7.20.5: + resolution: {integrity: sha512-jvS+ngBfrnTUBfOQq8NfGnSbF9BrqlR6hjJ2yVxMkmO5nL/cdifNbI30EfjRlN4g5wYWNnMPyj5Sa6R1pbLeag==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.20.2.tgz} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.5 + '@babel/helper-create-class-features-plugin': 7.20.2_@babel+core@7.20.5 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-typescript': 7.20.0_@babel+core@7.20.5 + transitivePeerDependencies: + - supports-color + dev: true /@babel/runtime/7.20.1: resolution: {integrity: sha512-mrzLkl6U9YLF8qpqI7TB82PESyEGjm/0Ly91jG575eVxMMlb8fYfOXFZIJ8XfLrJZQbm7dlKry2bJmXBUEkdFg==} engines: {node: '>=6.9.0'} dependencies: - regenerator-runtime: registry.npmmirror.com/regenerator-runtime/0.13.11 + regenerator-runtime: 0.13.11 dev: false - /@commitlint/cli/17.3.0: - resolution: {integrity: sha512-/H0md7TsKflKzVPz226VfXzVafJFO1f9+r2KcFvmBu08V0T56lZU1s8WL7/xlxqLMqBTVaBf7Ixtc4bskdEEZg==} + /@babel/standalone/7.20.6: + resolution: {integrity: sha512-u5at/CbBLETf7kx2LOY4XdhseD79Y099WZKAOMXeT8qvd9OSR515my2UNBBLY4qIht/Qi9KySeQHQwQwxJN4Sw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@babel/standalone/-/standalone-7.20.6.tgz} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/template/7.18.10: + resolution: {integrity: sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@babel/template/-/template-7.18.10.tgz} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.18.6 + '@babel/parser': 7.20.5 + '@babel/types': 7.20.5 + dev: true + + /@babel/traverse/7.20.1: + resolution: {integrity: sha512-d3tN8fkVJwFLkHkBN479SOsw4DMZnz8cdbL/gvuDuzy3TS6Nfw80HuQqhw1pITbIruHyh7d1fMA47kWzmcUEGA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@babel/traverse/-/traverse-7.20.1.tgz} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.18.6 + '@babel/generator': 7.20.5 + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-function-name': 7.19.0 + '@babel/helper-hoist-variables': 7.18.6 + '@babel/helper-split-export-declaration': 7.18.6 + '@babel/parser': 7.20.5 + '@babel/types': 7.20.5 + debug: 4.3.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/traverse/7.20.5: + resolution: {integrity: sha512-WM5ZNN3JITQIq9tFZaw1ojLU3WgWdtkxnhM1AegMS+PvHjkM5IXjmYEGY7yukz5XS4sJyEf2VzWjI8uAavhxBQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@babel/traverse/-/traverse-7.20.5.tgz} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.18.6 + '@babel/generator': 7.20.5 + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-function-name': 7.19.0 + '@babel/helper-hoist-variables': 7.18.6 + '@babel/helper-split-export-declaration': 7.18.6 + '@babel/parser': 7.20.5 + '@babel/types': 7.20.5 + debug: 4.3.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/types/7.20.2: + resolution: {integrity: sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@babel/types/-/types-7.20.2.tgz} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.19.4 + '@babel/helper-validator-identifier': 7.19.1 + to-fast-properties: 2.0.0 + dev: true + + /@babel/types/7.20.5: + resolution: {integrity: sha512-c9fst/h2/dcF7H+MJKZ2T0KjEQ8hY/BNnDk/H3XY8C4Aw/eWQXWn/lWntHF9ooUBnGmEvbfGrTgLWc+um0YDUg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@babel/types/-/types-7.20.5.tgz} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.19.4 + '@babel/helper-validator-identifier': 7.19.1 + to-fast-properties: 2.0.0 + + /@commitlint/cli/17.4.0_@types+node@18.11.18: + resolution: {integrity: sha512-SEY4sYe8yVlgxPP7X0wJb96DBAGBPsCsy6QbqJt/UECbIAjDeDV5xXBV4jnS7T/qMC10sk6Ub9kDhEX0VWvblw==} engines: {node: '>=v14'} hasBin: true dependencies: - '@commitlint/format': 17.0.0 - '@commitlint/lint': 17.3.0 - '@commitlint/load': 17.3.0 - '@commitlint/read': 17.2.0 - '@commitlint/types': 17.0.0 + '@commitlint/format': 17.4.0 + '@commitlint/lint': 17.4.0 + '@commitlint/load': 17.4.0_@types+node@18.11.18 + '@commitlint/read': 17.4.0 + '@commitlint/types': 17.4.0 execa: 5.1.1 lodash.isfunction: 3.0.9 resolve-from: 5.0.0 @@ -200,28 +524,29 @@ packages: transitivePeerDependencies: - '@swc/core' - '@swc/wasm' + - '@types/node' dev: true - /@commitlint/config-conventional/17.3.0: - resolution: {integrity: sha512-hgI+fN5xF8nhS9uG/V06xyT0nlcyvHHMkq0kwRSr96vl5BFlRGaL2C0/YY4kQagfU087tmj01bJkG9Ek98Wllw==} + /@commitlint/config-conventional/17.4.0: + resolution: {integrity: sha512-G4XBf45J4ZMspO4NwBFzY3g/1Kb+B42BcIxeikF8wucQxcyxcmhRdjeQpRpS1XEcBq5pdtEEQFipuB9IuiNFhw==} engines: {node: '>=v14'} dependencies: conventional-changelog-conventionalcommits: 5.0.0 dev: true - /@commitlint/config-validator/17.1.0: - resolution: {integrity: sha512-Q1rRRSU09ngrTgeTXHq6ePJs2KrI+axPTgkNYDWSJIuS1Op4w3J30vUfSXjwn5YEJHklK3fSqWNHmBhmTR7Vdg==} + /@commitlint/config-validator/17.4.0: + resolution: {integrity: sha512-Sa/+8KNpDXz4zT4bVbz2fpFjvgkPO6u2V2fP4TKgt6FjmOw2z3eEX859vtfeaTav/ukBw0/0jr+5ZTZp9zCBhA==} engines: {node: '>=v14'} dependencies: - '@commitlint/types': 17.0.0 + '@commitlint/types': 17.4.0 ajv: 8.11.2 dev: true - /@commitlint/ensure/17.3.0: - resolution: {integrity: sha512-kWbrQHDoW5veIUQx30gXoLOCjWvwC6OOEofhPCLl5ytRPBDAQObMbxTha1Bt2aSyNE/IrJ0s0xkdZ1Gi3wJwQg==} + /@commitlint/ensure/17.4.0: + resolution: {integrity: sha512-7oAxt25je0jeQ/E0O/M8L3ADb1Cvweu/5lc/kYF8g/kXatI0wxGE5La52onnAUAWeWlsuvBNar15WcrmDmr5Mw==} engines: {node: '>=v14'} dependencies: - '@commitlint/types': 17.0.0 + '@commitlint/types': 17.4.0 lodash.camelcase: 4.3.0 lodash.kebabcase: 4.1.1 lodash.snakecase: 4.1.1 @@ -229,122 +554,122 @@ packages: lodash.upperfirst: 4.3.1 dev: true - /@commitlint/execute-rule/17.0.0: - resolution: {integrity: sha512-nVjL/w/zuqjCqSJm8UfpNaw66V9WzuJtQvEnCrK4jDw6qKTmZB+1JQ8m6BQVZbNBcwfYdDNKnhIhqI0Rk7lgpQ==} + /@commitlint/execute-rule/17.4.0: + resolution: {integrity: sha512-LIgYXuCSO5Gvtc0t9bebAMSwd68ewzmqLypqI2Kke1rqOqqDbMpYcYfoPfFlv9eyLIh4jocHWwCK5FS7z9icUA==} engines: {node: '>=v14'} dev: true - /@commitlint/format/17.0.0: - resolution: {integrity: sha512-MZzJv7rBp/r6ZQJDEodoZvdRM0vXu1PfQvMTNWFb8jFraxnISMTnPBWMMjr2G/puoMashwaNM//fl7j8gGV5lA==} + /@commitlint/format/17.4.0: + resolution: {integrity: sha512-Z2bWAU5+f1YZh9W76c84J8iLIWIvvm+mzqogTz0Nsc1x6EHW0Z2gI38g5HAjB0r0I3ZjR15IDEJKhsxyblcyhA==} engines: {node: '>=v14'} dependencies: - '@commitlint/types': 17.0.0 + '@commitlint/types': 17.4.0 chalk: 4.1.2 dev: true - /@commitlint/is-ignored/17.2.0: - resolution: {integrity: sha512-rgUPUQraHxoMLxiE8GK430HA7/R2vXyLcOT4fQooNrZq9ERutNrP6dw3gdKLkq22Nede3+gEHQYUzL4Wu75ndg==} + /@commitlint/is-ignored/17.4.0: + resolution: {integrity: sha512-mkRuBlPUaBimvSvJyIHEHEW1/jP1SqEI7NOoaO9/eyJkMbsaiv5b1QgDYL4ZXlHdS64RMV7Y21MVVzuIceImDA==} engines: {node: '>=v14'} dependencies: - '@commitlint/types': 17.0.0 - semver: registry.npmmirror.com/semver/7.3.7 + '@commitlint/types': 17.4.0 + semver: 7.3.8 dev: true - /@commitlint/lint/17.3.0: - resolution: {integrity: sha512-VilOTPg0i9A7CCWM49E9bl5jytfTvfTxf9iwbWAWNjxJ/A5mhPKbm3sHuAdwJ87tDk1k4j8vomYfH23iaY+1Rw==} + /@commitlint/lint/17.4.0: + resolution: {integrity: sha512-HG2YT4TUbQKs9v8QvpQjJ6OK+fhflsDB8M+D5tLrY79hbQOWA9mDKdRkABsW/AAhpNI9+zeGUWF3jj245jSHKw==} engines: {node: '>=v14'} dependencies: - '@commitlint/is-ignored': 17.2.0 - '@commitlint/parse': 17.2.0 - '@commitlint/rules': 17.3.0 - '@commitlint/types': 17.0.0 + '@commitlint/is-ignored': 17.4.0 + '@commitlint/parse': 17.4.0 + '@commitlint/rules': 17.4.0 + '@commitlint/types': 17.4.0 dev: true - /@commitlint/load/17.3.0: - resolution: {integrity: sha512-u/pV6rCAJrCUN+HylBHLzZ4qj1Ew3+eN9GBPhNi9otGxtOfA8b+8nJSxaNbcC23Ins/kcpjGf9zPSVW7628Umw==} + /@commitlint/load/17.4.0_@types+node@18.11.18: + resolution: {integrity: sha512-wDKNvAJqukqZqKmhRlf3KNo/12QGo1AQcd80EbV01SxtGvyHOsJ/g+/IbrZpopZv8rvzmEVktcpfDYH6ITepFA==} engines: {node: '>=v14'} dependencies: - '@commitlint/config-validator': 17.1.0 - '@commitlint/execute-rule': 17.0.0 - '@commitlint/resolve-extends': 17.3.0 - '@commitlint/types': 17.0.0 - '@types/node': 14.18.33 + '@commitlint/config-validator': 17.4.0 + '@commitlint/execute-rule': 17.4.0 + '@commitlint/resolve-extends': 17.4.0 + '@commitlint/types': 17.4.0 chalk: 4.1.2 - cosmiconfig: 7.1.0 - cosmiconfig-typescript-loader: 4.2.0_wb7bklcl6jlvxijczjyxggip4a + cosmiconfig: 8.0.0 + cosmiconfig-typescript-loader: 4.2.0_bxtyj3et3xbsdyxhh3oblnfbj4 lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 lodash.uniq: 4.5.0 resolve-from: 5.0.0 - ts-node: 10.9.1_rju6pyblifsagdmqm3y74zsi6q + ts-node: 10.9.1_awa2wsr5thmg3i7jqycphctjfq typescript: 4.9.4 transitivePeerDependencies: - '@swc/core' - '@swc/wasm' + - '@types/node' dev: true - /@commitlint/message/17.2.0: - resolution: {integrity: sha512-/4l2KFKxBOuoEn1YAuuNNlAU05Zt7sNsC9H0mPdPm3chOrT4rcX0pOqrQcLtdMrMkJz0gC7b3SF80q2+LtdL9Q==} + /@commitlint/message/17.4.0: + resolution: {integrity: sha512-USGJDU9PPxcgQjKXCzvPUal65KAhxWq3hp+MrU1pNCN2itWM654CLIoY2LMIQ7rScTli9B5dTLH3vXhzbItmzA==} engines: {node: '>=v14'} dev: true - /@commitlint/parse/17.2.0: - resolution: {integrity: sha512-vLzLznK9Y21zQ6F9hf8D6kcIJRb2haAK5T/Vt1uW2CbHYOIfNsR/hJs0XnF/J9ctM20Tfsqv4zBitbYvVw7F6Q==} + /@commitlint/parse/17.4.0: + resolution: {integrity: sha512-x8opKc5p+Hgs+CrMbq3VAnW2L2foPAX6arW8u9c8nTzksldGgFsENT+XVyPmpSMLlVBswZ1tndcz1xyKiY9TJA==} engines: {node: '>=v14'} dependencies: - '@commitlint/types': 17.0.0 + '@commitlint/types': 17.4.0 conventional-changelog-angular: 5.0.13 conventional-commits-parser: 3.2.4 dev: true - /@commitlint/read/17.2.0: - resolution: {integrity: sha512-bbblBhrHkjxra3ptJNm0abxu7yeAaxumQ8ZtD6GIVqzURCETCP7Dm0tlVvGRDyXBuqX6lIJxh3W7oyKqllDsHQ==} + /@commitlint/read/17.4.0: + resolution: {integrity: sha512-pGDeZpbkyvhxK8ZoCDUacPPRpauKPWF3n2XpDBEnuGreqUF2clq2PVJpwMMaNN5cHW8iFKCbcoOjXhD01sln0A==} engines: {node: '>=v14'} dependencies: - '@commitlint/top-level': 17.0.0 - '@commitlint/types': 17.0.0 - fs-extra: 10.1.0 + '@commitlint/top-level': 17.4.0 + '@commitlint/types': 17.4.0 + fs-extra: 11.1.0 git-raw-commits: 2.0.11 minimist: 1.2.7 dev: true - /@commitlint/resolve-extends/17.3.0: - resolution: {integrity: sha512-Lf3JufJlc5yVEtJWC8o4IAZaB8FQAUaVlhlAHRACd0TTFizV2Lk2VH70et23KgvbQNf7kQzHs/2B4QZalBv6Cg==} + /@commitlint/resolve-extends/17.4.0: + resolution: {integrity: sha512-3JsmwkrCzoK8sO22AzLBvNEvC1Pmdn/65RKXzEtQMy6oYMl0Snrq97a5bQQEFETF0VsvbtUuKttLqqgn99OXRQ==} engines: {node: '>=v14'} dependencies: - '@commitlint/config-validator': 17.1.0 - '@commitlint/types': 17.0.0 + '@commitlint/config-validator': 17.4.0 + '@commitlint/types': 17.4.0 import-fresh: 3.3.0 lodash.mergewith: 4.6.2 resolve-from: 5.0.0 resolve-global: 1.0.0 dev: true - /@commitlint/rules/17.3.0: - resolution: {integrity: sha512-s2UhDjC5yP2utx3WWqsnZRzjgzAX8BMwr1nltC0u0p8T/nzpkx4TojEfhlsOUj1t7efxzZRjUAV0NxNwdJyk+g==} + /@commitlint/rules/17.4.0: + resolution: {integrity: sha512-lz3i1jet2NNjTWpAMwjjQjMZCPWBIHK1Kkja9o09UmUtMjRdALTb8uMLe8gCyeq3DiiZ5lLYOhbsoPK56xGQKA==} engines: {node: '>=v14'} dependencies: - '@commitlint/ensure': 17.3.0 - '@commitlint/message': 17.2.0 - '@commitlint/to-lines': 17.0.0 - '@commitlint/types': 17.0.0 + '@commitlint/ensure': 17.4.0 + '@commitlint/message': 17.4.0 + '@commitlint/to-lines': 17.4.0 + '@commitlint/types': 17.4.0 execa: 5.1.1 dev: true - /@commitlint/to-lines/17.0.0: - resolution: {integrity: sha512-nEi4YEz04Rf2upFbpnEorG8iymyH7o9jYIVFBG1QdzebbIFET3ir+8kQvCZuBE5pKCtViE4XBUsRZz139uFrRQ==} + /@commitlint/to-lines/17.4.0: + resolution: {integrity: sha512-LcIy/6ZZolsfwDUWfN1mJ+co09soSuNASfKEU5sCmgFCvX5iHwRYLiIuoqXzOVDYOy7E7IcHilr/KS0e5T+0Hg==} engines: {node: '>=v14'} dev: true - /@commitlint/top-level/17.0.0: - resolution: {integrity: sha512-dZrEP1PBJvodNWYPOYiLWf6XZergdksKQaT6i1KSROLdjf5Ai0brLOv5/P+CPxBeoj3vBxK4Ax8H1Pg9t7sHIQ==} + /@commitlint/top-level/17.4.0: + resolution: {integrity: sha512-/1loE/g+dTTQgHnjoCy0AexKAEFyHsR2zRB4NWrZ6lZSMIxAhBJnmCqwao7b4H8888PsfoTBCLBYIw8vGnej8g==} engines: {node: '>=v14'} dependencies: find-up: 5.0.0 dev: true - /@commitlint/types/17.0.0: - resolution: {integrity: sha512-hBAw6U+SkAT5h47zDMeOu3HSiD0SODw4Aq7rRNh1ceUmL7GyLKYhPbUvlRWqZ65XjBLPHZhFyQlRaPNz8qvUyQ==} + /@commitlint/types/17.4.0: + resolution: {integrity: sha512-2NjAnq5IcxY9kXtUeO2Ac0aPpvkuOmwbH/BxIm36XXK5LtWFObWJWjXOA+kcaABMrthjWu6la+FUpyYFMHRvbA==} engines: {node: '>=v14'} dependencies: chalk: 4.1.2 @@ -354,7 +679,7 @@ packages: resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} dependencies: - '@jridgewell/trace-mapping': registry.npmmirror.com/@jridgewell/trace-mapping/0.3.9 + '@jridgewell/trace-mapping': 0.3.9 dev: true /@csstools/selector-specificity/2.0.2_2xshye3abirqjlplmebvmaxyna: @@ -364,7 +689,7 @@ packages: postcss: ^8.2 postcss-selector-parser: ^6.0.10 dependencies: - postcss: registry.npmmirror.com/postcss/8.4.20 + postcss: 8.4.20 postcss-selector-parser: 6.0.11 dev: true @@ -579,8 +904,8 @@ packages: dev: true optional: true - /@eslint/eslintrc/1.4.0: - resolution: {integrity: sha512-7yfvXy6MWLgWSFsLhz5yH3iQ52St8cdUY6FoGieKkRDVxuxmrNuUetIuu6cmjNWwniUHiWXjxCr5tTXDrbYS5A==} + /@eslint/eslintrc/1.4.1: + resolution: {integrity: sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: ajv: 6.12.6 @@ -626,16 +951,24 @@ packages: resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} dev: true + /@iconify/iconify/2.1.2: + resolution: {integrity: sha512-QcUzFeEWkE/mW+BVtEGmcWATClcCOIJFiYUD/PiCWuTcdEA297o8D4oN6Ra44WrNOHu1wqNW4J0ioaDIiqaFOQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@iconify/iconify/-/iconify-2.1.2.tgz} + dependencies: + cross-fetch: 3.1.5 + transitivePeerDependencies: + - encoding + dev: true + /@iconify/iconify/3.0.1: resolution: {integrity: sha512-OPqVBTh8YsfrYZRVFv3OkmFNLqacM0dy/Oiw1h2wO+RZW5LieNGHlG2f9pzaeVRFWbEB8LHTeo8mcwgUTUbibQ==} dependencies: '@iconify/types': 2.0.0 - /@iconify/json/2.1.156: - resolution: {integrity: sha512-QaLf/XSPRe6i35Z9WIRBxlWOLykDXNnEGYFf+9E+GWLmRqVQ2VNyTsEo6CNZqP5eGQRDPJyNhd+2vH+gbehGDg==} + /@iconify/json/2.2.2: + resolution: {integrity: sha512-G9HVJz3uvQGNEirk9oI7xYnWb7ygEfTUZ+PVp81qgNp8bu5UOtXaxjTGw78NyNAC2OlryH5tSEp95Dqbt4LLQQ==} dependencies: '@iconify/types': 2.0.0 - pathe: 0.3.9 + pathe: 1.0.0 dev: true /@iconify/types/2.0.0: @@ -653,8 +986,8 @@ packages: vue-i18n: optional: true dependencies: - '@intlify/message-compiler': 9.3.0-beta.11 - '@intlify/shared': 9.3.0-beta.11 + '@intlify/message-compiler': 9.3.0-beta.12 + '@intlify/shared': 9.3.0-beta.12 jsonc-eslint-parser: 1.4.1 source-map: 0.6.1 vue-i18n: 9.2.2_vue@3.2.45 @@ -683,8 +1016,8 @@ packages: '@intlify/shared': 9.2.2 source-map: 0.6.1 - /@intlify/message-compiler/9.3.0-beta.11: - resolution: {integrity: sha512-gGGfBGzM7JBXp1Q9gbDAy5jELz9ho3ILqnpxp2yp64+gkqohrqc2YXIvCdwZoc6AtKIh/Zmv4sWVqxkvMsBWtQ==} + /@intlify/message-compiler/9.3.0-beta.12: + resolution: {integrity: sha512-A8/s7pb3v8nf6HG77qFPJntxgQKI9GXxGnkn7aO+b03/X/GkF/4WceDSAIk3i+yLeIgszeBn9GZ23tSg4sTEHA==} engines: {node: '>= 14'} dependencies: '@intlify/shared': 9.3.0-beta.11 @@ -700,6 +1033,11 @@ packages: engines: {node: '>= 14'} dev: true + /@intlify/shared/9.3.0-beta.12: + resolution: {integrity: sha512-WsmaS54sA8xuwezPKpa/OMoaX1v2VF2fCgAmYS6prDr2ir0CkUFWPm9A8ilmxzv4nkS61/v8+vf4lGGkn5uBdA==} + engines: {node: '>= 14'} + dev: true + /@intlify/unplugin-vue-i18n/0.8.1_vue-i18n@9.2.2: resolution: {integrity: sha512-BhigujPmP6JL1FSxmpogCaL+REozncHCVkJuUnefz4GWBu3X+pRe5O7PeJn8/g+Iml2ieQJz4ISPMmEbuGQjqQ==} engines: {node: '>= 14.16'} @@ -716,7 +1054,7 @@ packages: optional: true dependencies: '@intlify/bundle-utils': 3.4.0_vue-i18n@9.2.2 - '@intlify/shared': 9.3.0-beta.11 + '@intlify/shared': 9.3.0-beta.12 '@rollup/pluginutils': 4.2.1 '@vue/compiler-sfc': 3.2.45 debug: 4.3.4 @@ -739,13 +1077,31 @@ packages: '@intlify/core-base': 9.2.2 '@intlify/shared': 9.2.2 + /@jridgewell/gen-mapping/0.1.1: + resolution: {integrity: sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.14 + dev: true + /@jridgewell/gen-mapping/0.3.2: resolution: {integrity: sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==} engines: {node: '>=6.0.0'} dependencies: - '@jridgewell/set-array': registry.npmmirror.com/@jridgewell/set-array/1.1.2 - '@jridgewell/sourcemap-codec': registry.npmmirror.com/@jridgewell/sourcemap-codec/1.4.14 - '@jridgewell/trace-mapping': registry.npmmirror.com/@jridgewell/trace-mapping/0.3.17 + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.14 + '@jridgewell/trace-mapping': 0.3.17 + dev: true + + /@jridgewell/resolve-uri/3.1.0: + resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/set-array/1.1.2: + resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@jridgewell/set-array/-/set-array-1.1.2.tgz} + engines: {node: '>=6.0.0'} dev: true /@jridgewell/source-map/0.3.2: @@ -755,11 +1111,22 @@ packages: '@jridgewell/trace-mapping': 0.3.17 dev: true + /@jridgewell/sourcemap-codec/1.4.14: + resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} + dev: true + /@jridgewell/trace-mapping/0.3.17: resolution: {integrity: sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==} dependencies: - '@jridgewell/resolve-uri': registry.npmmirror.com/@jridgewell/resolve-uri/3.1.0 - '@jridgewell/sourcemap-codec': registry.npmmirror.com/@jridgewell/sourcemap-codec/1.4.14 + '@jridgewell/resolve-uri': 3.1.0 + '@jridgewell/sourcemap-codec': 1.4.14 + dev: true + + /@jridgewell/trace-mapping/0.3.9: + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + dependencies: + '@jridgewell/resolve-uri': 3.1.0 + '@jridgewell/sourcemap-codec': 1.4.14 dev: true /@nodelib/fs.scandir/2.1.5: @@ -783,6 +1150,19 @@ packages: fastq: 1.13.0 dev: true + /@purge-icons/core/0.9.1: + resolution: {integrity: sha512-sx8/a30MbbqQVEqhuMPE1wJpdVRRbEmwEPZpFzVkcDixzX4p+R2A0WVxqkb0xfHUBAVQwrSE2SeAyniIQLqbLw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@purge-icons/core/-/core-0.9.1.tgz} + dependencies: + '@iconify/iconify': 2.1.2 + axios: 0.26.1_debug@4.3.4 + debug: 4.3.4 + fast-glob: 3.2.12 + fs-extra: 10.1.0 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + /@purge-icons/generated/0.9.0: resolution: {integrity: sha512-s2t+1oVtGDV6KtqfCXtUOhxfeYvOdDF90IVm+nMs/6bUP0HeGZLslguuL/AibpwtfL4FA/oCsIu/RhwapgAdJw==} dependencies: @@ -865,12 +1245,8 @@ packages: resolution: {integrity: sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==} dev: true - /@types/node/14.18.33: - resolution: {integrity: sha512-qelS/Ra6sacc4loe/3MSjXNL1dNQ/GjxNHVzuChwMfmk7HuycRLVQN2qNY3XahK+fZc5E2szqQSKUyAF0E+2bg==} - dev: true - - /@types/node/18.11.17: - resolution: {integrity: sha512-HJSUJmni4BeDHhfzn6nF0sVmd1SMezP7/4F0Lq+aXzmp2xm9O7WXrUtHW/CHlYVtZUbByEvWidHqRtcJXGF2Ng==} + /@types/node/18.11.18: + resolution: {integrity: sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==} dev: true /@types/normalize-package-data/2.4.1: @@ -888,7 +1264,7 @@ packages: /@types/qrcode/1.5.0: resolution: {integrity: sha512-x5ilHXRxUPIMfjtM+1vf/GPTRWZ81nqscursm5gMznJeK9M0YnZ1c3bEvRLQ0zSSgedLx1J6MGL231ObQGGhaA==} dependencies: - '@types/node': 18.11.17 + '@types/node': 18.11.18 dev: true /@types/qs/6.9.7: @@ -902,15 +1278,15 @@ packages: /@types/svgo/2.6.4: resolution: {integrity: sha512-l4cmyPEckf8moNYHdJ+4wkHvFxjyW6ulm9l4YGaOxeyBWPhBOT0gvni1InpFPdzx1dKf/2s62qGITwxNWnPQng==} dependencies: - '@types/node': 18.11.17 + '@types/node': 18.11.18 dev: true /@types/web-bluetooth/0.0.16: resolution: {integrity: sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==} dev: false - /@typescript-eslint/eslint-plugin/5.47.0_ncmi6noazr3nzas7jxykisekym: - resolution: {integrity: sha512-AHZtlXAMGkDmyLuLZsRpH3p4G/1iARIwc/T0vIem2YB+xW6pZaXYXzCBnZSF/5fdM97R9QqZWZ+h3iW10XgevQ==} + /@typescript-eslint/eslint-plugin/5.48.0_k73wpmdolxikpyqun3p36akaaq: + resolution: {integrity: sha512-SVLafp0NXpoJY7ut6VFVUU9I+YeFsDzeQwtK0WZ+xbRN3mtxJ08je+6Oi2N89qDn087COdO0u3blKZNv9VetRQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: '@typescript-eslint/parser': ^5.0.0 @@ -920,12 +1296,12 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/parser': 5.47.0_lzzuuodtsqwxnvqeq4g4likcqa - '@typescript-eslint/scope-manager': 5.47.0 - '@typescript-eslint/type-utils': 5.47.0_lzzuuodtsqwxnvqeq4g4likcqa - '@typescript-eslint/utils': 5.47.0_lzzuuodtsqwxnvqeq4g4likcqa + '@typescript-eslint/parser': 5.48.0_iukboom6ndih5an6iafl45j2fe + '@typescript-eslint/scope-manager': 5.48.0 + '@typescript-eslint/type-utils': 5.48.0_iukboom6ndih5an6iafl45j2fe + '@typescript-eslint/utils': 5.48.0_iukboom6ndih5an6iafl45j2fe debug: 4.3.4 - eslint: 8.30.0 + eslint: 8.31.0 ignore: 5.2.1 natural-compare-lite: 1.4.0 regexpp: 3.2.0 @@ -936,8 +1312,8 @@ packages: - supports-color dev: true - /@typescript-eslint/parser/5.47.0_lzzuuodtsqwxnvqeq4g4likcqa: - resolution: {integrity: sha512-udPU4ckK+R1JWCGdQC4Qa27NtBg7w020ffHqGyAK8pAgOVuNw7YaKXGChk+udh+iiGIJf6/E/0xhVXyPAbsczw==} + /@typescript-eslint/parser/5.48.0_iukboom6ndih5an6iafl45j2fe: + resolution: {integrity: sha512-1mxNA8qfgxX8kBvRDIHEzrRGrKHQfQlbW6iHyfHYS0Q4X1af+S6mkLNtgCOsGVl8+/LUPrqdHMssAemkrQ01qg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -946,26 +1322,26 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 5.47.0 - '@typescript-eslint/types': 5.47.0 - '@typescript-eslint/typescript-estree': 5.47.0_typescript@4.9.4 + '@typescript-eslint/scope-manager': 5.48.0 + '@typescript-eslint/types': 5.48.0 + '@typescript-eslint/typescript-estree': 5.48.0_typescript@4.9.4 debug: 4.3.4 - eslint: 8.30.0 + eslint: 8.31.0 typescript: 4.9.4 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/scope-manager/5.47.0: - resolution: {integrity: sha512-dvJab4bFf7JVvjPuh3sfBUWsiD73aiftKBpWSfi3sUkysDQ4W8x+ZcFpNp7Kgv0weldhpmMOZBjx1wKN8uWvAw==} + /@typescript-eslint/scope-manager/5.48.0: + resolution: {integrity: sha512-0AA4LviDtVtZqlyUQnZMVHydDATpD9SAX/RC5qh6cBd3xmyWvmXYF+WT1oOmxkeMnWDlUVTwdODeucUnjz3gow==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - '@typescript-eslint/types': 5.47.0 - '@typescript-eslint/visitor-keys': 5.47.0 + '@typescript-eslint/types': 5.48.0 + '@typescript-eslint/visitor-keys': 5.48.0 dev: true - /@typescript-eslint/type-utils/5.47.0_lzzuuodtsqwxnvqeq4g4likcqa: - resolution: {integrity: sha512-1J+DFFrYoDUXQE1b7QjrNGARZE6uVhBqIvdaXTe5IN+NmEyD68qXR1qX1g2u4voA+nCaelQyG8w30SAOihhEYg==} + /@typescript-eslint/type-utils/5.48.0_iukboom6ndih5an6iafl45j2fe: + resolution: {integrity: sha512-vbtPO5sJyFjtHkGlGK4Sthmta0Bbls4Onv0bEqOGm7hP9h8UpRsHJwsrCiWtCUndTRNQO/qe6Ijz9rnT/DB+7g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: '*' @@ -974,23 +1350,23 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 5.47.0_typescript@4.9.4 - '@typescript-eslint/utils': 5.47.0_lzzuuodtsqwxnvqeq4g4likcqa + '@typescript-eslint/typescript-estree': 5.48.0_typescript@4.9.4 + '@typescript-eslint/utils': 5.48.0_iukboom6ndih5an6iafl45j2fe debug: 4.3.4 - eslint: 8.30.0 + eslint: 8.31.0 tsutils: 3.21.0_typescript@4.9.4 typescript: 4.9.4 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/types/5.47.0: - resolution: {integrity: sha512-eslFG0Qy8wpGzDdYKu58CEr3WLkjwC5Usa6XbuV89ce/yN5RITLe1O8e+WFEuxnfftHiJImkkOBADj58ahRxSg==} + /@typescript-eslint/types/5.48.0: + resolution: {integrity: sha512-UTe67B0Ypius0fnEE518NB2N8gGutIlTojeTg4nt0GQvikReVkurqxd2LvYa9q9M5MQ6rtpNyWTBxdscw40Xhw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /@typescript-eslint/typescript-estree/5.47.0_typescript@4.9.4: - resolution: {integrity: sha512-LxfKCG4bsRGq60Sqqu+34QT5qT2TEAHvSCCJ321uBWywgE2dS0LKcu5u+3sMGo+Vy9UmLOhdTw5JHzePV/1y4Q==} + /@typescript-eslint/typescript-estree/5.48.0_typescript@4.9.4: + resolution: {integrity: sha512-7pjd94vvIjI1zTz6aq/5wwE/YrfIyEPLtGJmRfyNR9NYIW+rOvzzUv3Cmq2hRKpvt6e9vpvPUQ7puzX7VSmsEw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: typescript: '*' @@ -998,8 +1374,8 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/types': 5.47.0 - '@typescript-eslint/visitor-keys': 5.47.0 + '@typescript-eslint/types': 5.48.0 + '@typescript-eslint/visitor-keys': 5.48.0 debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 @@ -1010,31 +1386,31 @@ packages: - supports-color dev: true - /@typescript-eslint/utils/5.47.0_lzzuuodtsqwxnvqeq4g4likcqa: - resolution: {integrity: sha512-U9xcc0N7xINrCdGVPwABjbAKqx4GK67xuMV87toI+HUqgXj26m6RBp9UshEXcTrgCkdGYFzgKLt8kxu49RilDw==} + /@typescript-eslint/utils/5.48.0_iukboom6ndih5an6iafl45j2fe: + resolution: {integrity: sha512-x2jrMcPaMfsHRRIkL+x96++xdzvrdBCnYRd5QiW5Wgo1OB4kDYPbC1XjWP/TNqlfK93K/lUL92erq5zPLgFScQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: '@types/json-schema': 7.0.11 '@types/semver': 7.3.13 - '@typescript-eslint/scope-manager': 5.47.0 - '@typescript-eslint/types': 5.47.0 - '@typescript-eslint/typescript-estree': 5.47.0_typescript@4.9.4 - eslint: 8.30.0 + '@typescript-eslint/scope-manager': 5.48.0 + '@typescript-eslint/types': 5.48.0 + '@typescript-eslint/typescript-estree': 5.48.0_typescript@4.9.4 + eslint: 8.31.0 eslint-scope: 5.1.1 - eslint-utils: 3.0.0_eslint@8.30.0 + eslint-utils: 3.0.0_eslint@8.31.0 semver: 7.3.8 transitivePeerDependencies: - supports-color - typescript dev: true - /@typescript-eslint/visitor-keys/5.47.0: - resolution: {integrity: sha512-ByPi5iMa6QqDXe/GmT/hR6MZtVPi0SqMQPDx15FczCBXJo/7M8T88xReOALAfpBLm+zxpPfmhuEvPb577JRAEg==} + /@typescript-eslint/visitor-keys/5.48.0: + resolution: {integrity: sha512-5motVPz5EgxQ0bHjut3chzBkJ3Z3sheYVcSwS5BpHZpLqSptSmELNtGixmgj65+rIfhvtQTz5i9OP2vtzdDH7Q==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - '@typescript-eslint/types': 5.47.0 + '@typescript-eslint/types': 5.48.0 eslint-visitor-keys: 3.3.0 dev: true @@ -1054,7 +1430,7 @@ packages: lodash.throttle: 4.1.1 mime-match: 1.0.2 namespace-emitter: 2.0.1 - nanoid: registry.npmmirror.com/nanoid/3.3.4 + nanoid: 3.3.4 preact: 10.11.3 dev: false @@ -1076,34 +1452,76 @@ packages: '@uppy/companion-client': 2.2.2 '@uppy/core': 2.3.4 '@uppy/utils': 4.1.3 - nanoid: registry.npmmirror.com/nanoid/3.3.4 + nanoid: 3.3.4 dev: false - /@volar/language-core/1.0.16: - resolution: {integrity: sha512-IGnOxWTs4DZ81TDcmxBAkCBxs97hUblwcjpBsTx/pOGGaSSDQRJPn0wL8NYTybEObU0i7lhEpKZ+0vJfdIy1Kg==} + /@vitejs/plugin-legacy/3.0.1_terser@5.16.1+vite@4.0.4: + resolution: {integrity: sha512-XCtEjxoR3rmy000ujYRBp5kggWqzHz9+F20/yIMUWOzbvu0+KW1e14Fvb8h7SpNn+bfjGW1RiAs1Vrgb7Js+iQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@vitejs/plugin-legacy/-/plugin-legacy-3.0.1.tgz} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + terser: ^5.4.0 + vite: ^4.0.0 dependencies: - '@volar/source-map': 1.0.16 - '@vue/reactivity': 3.2.45 + '@babel/standalone': 7.20.6 + core-js: 3.26.1 + magic-string: 0.27.0 + regenerator-runtime: 0.13.11 + systemjs: 6.13.0 + terser: 5.16.1 + vite: 4.0.4_zxbrnrc4iyldik6mikh3pswz4i + dev: true + + /@vitejs/plugin-vue-jsx/3.0.0_vite@4.0.4+vue@3.2.45: + resolution: {integrity: sha512-vurkuzgac5SYuxd2HUZqAFAWGTF10diKBwJNbCvnWijNZfXd+7jMtqjPFbGt7idOJUn584fP1Ar9j/GN2jQ3Ew==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@vitejs/plugin-vue-jsx/-/plugin-vue-jsx-3.0.0.tgz} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.0.0 + vue: ^3.0.0 + dependencies: + '@babel/core': 7.20.5 + '@babel/plugin-transform-typescript': 7.20.2_@babel+core@7.20.5 + '@vue/babel-plugin-jsx': 1.1.1_@babel+core@7.20.5 + vite: 4.0.4_zxbrnrc4iyldik6mikh3pswz4i + vue: 3.2.45 + transitivePeerDependencies: + - supports-color + dev: true + + /@vitejs/plugin-vue/4.0.0_vite@4.0.4+vue@3.2.45: + resolution: {integrity: sha512-e0X4jErIxAB5oLtDqbHvHpJe/uWNkdpYV83AOG2xo2tEVSzCzewgJMtREZM30wXnM5ls90hxiOtAuVU6H5JgbA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@vitejs/plugin-vue/-/plugin-vue-4.0.0.tgz} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.0.0 + vue: ^3.2.25 + dependencies: + vite: 4.0.4_zxbrnrc4iyldik6mikh3pswz4i + vue: 3.2.45 + dev: true + + /@volar/language-core/1.0.22: + resolution: {integrity: sha512-hiJeCOqxNdtG/04FRGLGI9H9DVz2l6cTqPDBzwqplHXAWfMxjzUaGUrn9sfTG7YMFNZUgK4EYxJnRfhqdtbSFQ==} + dependencies: + '@volar/source-map': 1.0.22 muggle-string: 0.1.0 dev: true - /@volar/source-map/1.0.16: - resolution: {integrity: sha512-PKjzmQcg8QOGC/1V9tmGh2jcy6bKLhkW5bGidElSr83iDbCzLvldt2/La/QlDxaRCHYLT0MeyuGJBZIChB1dYQ==} + /@volar/source-map/1.0.22: + resolution: {integrity: sha512-cv4gypHSP4MWVR82ed/+1IpI6794qAl0Q0+KJ+VGMVF8rVugsiF9QbyMCgjel9wNRsssQsazzsf6txOR9vHQiw==} dependencies: muggle-string: 0.1.0 dev: true - /@volar/typescript/1.0.16: - resolution: {integrity: sha512-Yov+n4oO3iYnuMt9QJAFpJabfTRCzc7KvjlAwBaSuZy+Gc/f9611MgtqAh5/SIGmltFN8dXn1Ijno8ro8I4lyw==} + /@volar/typescript/1.0.22: + resolution: {integrity: sha512-VPyEicealSD4gqlE5/UQ1j3ietsO6Hfat40KtUEh/K+XEZ7h02b1KgFV64YEuBkBOaZ5hgvRW/WXKtQgXCl7Iw==} dependencies: - '@volar/language-core': 1.0.16 + '@volar/language-core': 1.0.22 dev: true - /@volar/vue-language-core/1.0.16: - resolution: {integrity: sha512-sQ/aW1Vuiyy4OQuh2lthyYicruM3qh9VSk/aDh8/bFvM8GoohHZqVpMN3LYldEJ9eT/rN6u4xmYP54vc/EjX4Q==} + /@volar/vue-language-core/1.0.22: + resolution: {integrity: sha512-Ki0G/ZdBj2/GLw+/VVH3n9XR/JL6krMIth02EekFn6JV4PGN3mNxbvoh6lOPSDZLR6biOU5nJPnnjpKy8nuXhw==} dependencies: - '@volar/language-core': 1.0.16 - '@volar/source-map': 1.0.16 + '@volar/language-core': 1.0.22 + '@volar/source-map': 1.0.22 '@vue/compiler-dom': 3.2.45 '@vue/compiler-sfc': 3.2.45 '@vue/reactivity': 3.2.45 @@ -1112,19 +1530,40 @@ packages: vue-template-compiler: 2.7.14 dev: true - /@volar/vue-typescript/1.0.16: - resolution: {integrity: sha512-M018Ulg/o2FVktAdlr5b/z4K69bYzekxNUA1o39y5Ur6CObc/o+5eDCCS7gIYijWnx9iNKkSQpWWWblJFv7kHQ==} + /@volar/vue-typescript/1.0.22: + resolution: {integrity: sha512-2T1o5z86PAev31OMtVOv/qp4P3ZVl9ln/2KTmykQE8Fh4A5F+868MW4nf5J7XQ6RNyx7RH9LhzgjvbqJpAfiYw==} dependencies: - '@volar/typescript': 1.0.16 - '@volar/vue-language-core': 1.0.16 + '@volar/typescript': 1.0.22 + '@volar/vue-language-core': 1.0.22 + dev: true + + /@vue/babel-helper-vue-transform-on/1.0.2: + resolution: {integrity: sha512-hz4R8tS5jMn8lDq6iD+yWL6XNB699pGIVLk7WSJnn1dbpjaazsjZQkieJoRX6gW5zpYSCFqQ7jUquPNY65tQYA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.0.2.tgz} + dev: true + + /@vue/babel-plugin-jsx/1.1.1_@babel+core@7.20.5: + resolution: {integrity: sha512-j2uVfZjnB5+zkcbc/zsOc0fSNGCMMjaEXP52wdwdIfn0qjFfEYpYZBFKFg+HHnQeJCVrjOeO0YxgaL7DMrym9w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.1.1.tgz} + dependencies: + '@babel/helper-module-imports': 7.18.6 + '@babel/plugin-syntax-jsx': 7.18.6_@babel+core@7.20.5 + '@babel/template': 7.18.10 + '@babel/traverse': 7.20.1 + '@babel/types': 7.20.2 + '@vue/babel-helper-vue-transform-on': 1.0.2 + camelcase: 6.3.0 + html-tags: 3.2.0 + svg-tags: 1.0.0 + transitivePeerDependencies: + - '@babel/core' + - supports-color dev: true /@vue/compiler-core/3.2.45: resolution: {integrity: sha512-rcMj7H+PYe5wBV3iYeUgbCglC+pbpN8hBLTJvRiK2eKQiWqu+fG9F+8sW99JdL4LQi7Re178UOxn09puSXvn4A==} dependencies: - '@babel/parser': registry.npmmirror.com/@babel/parser/7.20.5 - '@vue/shared': registry.npmmirror.com/@vue/shared/3.2.45 - estree-walker: registry.npmmirror.com/estree-walker/2.0.2 + '@babel/parser': 7.20.5 + '@vue/shared': 3.2.45 + estree-walker: 2.0.2 source-map: 0.6.1 /@vue/compiler-dom/3.2.45: @@ -1143,39 +1582,38 @@ packages: '@vue/reactivity-transform': 3.2.45 '@vue/shared': 3.2.45 estree-walker: 2.0.2 - magic-string: registry.npmmirror.com/magic-string/0.25.9 - postcss: registry.npmmirror.com/postcss/8.4.20 + magic-string: 0.25.9 + postcss: 8.4.20 source-map: 0.6.1 /@vue/compiler-ssr/3.2.45: resolution: {integrity: sha512-6BRaggEGqhWht3lt24CrIbQSRD5O07MTmd+LjAn5fJj568+R9eUD2F7wMQJjX859seSlrYog7sUtrZSd7feqrQ==} dependencies: - '@vue/compiler-dom': registry.npmmirror.com/@vue/compiler-dom/3.2.45 - '@vue/shared': registry.npmmirror.com/@vue/shared/3.2.45 + '@vue/compiler-dom': 3.2.45 + '@vue/shared': 3.2.45 /@vue/devtools-api/6.4.5: - resolution: {integrity: sha512-JD5fcdIuFxU4fQyXUu3w2KpAJHzTVdN+p4iOX2lMWSHMOoQdMAcpFLZzm9Z/2nmsoZ1a96QEhZ26e50xLBsgOQ==} + resolution: {integrity: sha512-JD5fcdIuFxU4fQyXUu3w2KpAJHzTVdN+p4iOX2lMWSHMOoQdMAcpFLZzm9Z/2nmsoZ1a96QEhZ26e50xLBsgOQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@vue/devtools-api/-/devtools-api-6.4.5.tgz} /@vue/reactivity-transform/3.2.45: resolution: {integrity: sha512-BHVmzYAvM7vcU5WmuYqXpwaBHjsS8T63jlKGWVtHxAHIoMIlmaMyurUSEs1Zcg46M4AYT5MtB1U274/2aNzjJQ==} dependencies: - '@babel/parser': registry.npmmirror.com/@babel/parser/7.20.5 - '@vue/compiler-core': registry.npmmirror.com/@vue/compiler-core/3.2.45 - '@vue/shared': registry.npmmirror.com/@vue/shared/3.2.45 - estree-walker: registry.npmmirror.com/estree-walker/2.0.2 - magic-string: registry.npmmirror.com/magic-string/0.25.9 + '@babel/parser': 7.20.5 + '@vue/compiler-core': 3.2.45 + '@vue/shared': 3.2.45 + estree-walker: 2.0.2 + magic-string: 0.25.9 /@vue/reactivity/3.2.45: resolution: {integrity: sha512-PRvhCcQcyEVohW0P8iQ7HDcIOXRjZfAsOds3N99X/Dzewy8TVhTCT4uXpAHfoKjVTJRA0O0K+6QNkDIZAxNi3A==} dependencies: '@vue/shared': 3.2.45 - dev: true /@vue/runtime-core/3.2.45: resolution: {integrity: sha512-gzJiTA3f74cgARptqzYswmoQx0fIA+gGYBfokYVhF8YSXjWTUA2SngRzZRku2HbGbjzB6LBYSbKGIaK8IW+s0A==} dependencies: - '@vue/reactivity': registry.npmmirror.com/@vue/reactivity/3.2.45 - '@vue/shared': registry.npmmirror.com/@vue/shared/3.2.45 + '@vue/reactivity': 3.2.45 + '@vue/shared': 3.2.45 /@vue/runtime-dom/3.2.45: resolution: {integrity: sha512-cy88YpfP5Ue2bDBbj75Cb4bIEZUMM/mAkDMfqDTpUYVgTf/kuQ2VQ8LebuZ8k6EudgH8pYhsGWHlY0lcxlvTwA==} @@ -1196,24 +1634,24 @@ packages: /@vue/shared/3.2.45: resolution: {integrity: sha512-Ewzq5Yhimg7pSztDV+RH1UDKBzmtqieXQlpTVm2AwraoRL/Rks96mvd8Vgi7Lj+h+TH8dv7mXD3FRZR3TUvbSg==} - /@vueuse/core/9.8.2_vue@3.2.45: - resolution: {integrity: sha512-aWiCmcYIpPt7xjuqYiceODEMHchDYthrJ4AqI+FXPZrR23PZOqdiktbUVyQl2kGlR3H4i9UJ/uimQrwhz9UouQ==} + /@vueuse/core/9.10.0_vue@3.2.45: + resolution: {integrity: sha512-CxMewME07qeuzuT/AOIQGv0EhhDoojniqU6pC3F8m5VC76L47UT18DcX88kWlP3I7d3qMJ4u/PD8iSRsy3bmNA==} dependencies: '@types/web-bluetooth': 0.0.16 - '@vueuse/metadata': 9.8.2 - '@vueuse/shared': 9.8.2_vue@3.2.45 + '@vueuse/metadata': 9.10.0 + '@vueuse/shared': 9.10.0_vue@3.2.45 vue-demi: 0.13.11_vue@3.2.45 transitivePeerDependencies: - '@vue/composition-api' - vue dev: false - /@vueuse/metadata/9.8.2: - resolution: {integrity: sha512-N4E/BKS+9VsUeD4WLVRU1J2kCOLh+iikBcMtipFcTyL204132vDYHs27zLAVabJYGnhC0dIVGdhg9pbOZiY2TQ==} + /@vueuse/metadata/9.10.0: + resolution: {integrity: sha512-G5VZhgTCapzU9rv0Iq2HBrVOSGzOKb+OE668NxhXNcTjUjwYxULkEhAw70FtRLMZc+hxcFAzDZlKYA0xcwNMuw==} dev: false - /@vueuse/shared/9.8.2_vue@3.2.45: - resolution: {integrity: sha512-ACjrPQzowd5dnabNJt9EoGVobco9/ENiA5qP53vjiuxndlJYuc/UegwhXC7KdQbPX4F45a50+45K3g1wNqOzmA==} + /@vueuse/shared/9.10.0_vue@3.2.45: + resolution: {integrity: sha512-vakHJ2ZRklAzqmcVBL38RS7BxdBA4+5poG9NsSyqJxrt9kz0zX3P5CXMy0Hm6LFbZXUgvKdqAS3pUH1zX/5qTQ==} dependencies: vue-demi: 0.13.11_vue@3.2.45 transitivePeerDependencies: @@ -1407,6 +1845,30 @@ packages: snabbdom: 3.5.1 dev: false + /@windicss/config/1.8.10: + resolution: {integrity: sha512-O9SsC110b1Ik3YYa4Ck/0TWuCo7YFfA9KDrwD5sAeqscT5COIGK1HszdCT3oh0MJFej2wNrvpfyW9h6yQaW6PA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@windicss/config/-/config-1.8.10.tgz} + dependencies: + debug: 4.3.4 + jiti: 1.16.0 + windicss: 3.5.6 + transitivePeerDependencies: + - supports-color + dev: true + + /@windicss/plugin-utils/1.8.10: + resolution: {integrity: sha512-Phqk5OW1w+Mv+ry6t7BzAeDq3aMhbI94gR49j9vQCufFfDGCHndhhjtMK0sBv+NPJUsIAIh6qayb1iwBCXUGrw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@windicss/plugin-utils/-/plugin-utils-1.8.10.tgz} + dependencies: + '@antfu/utils': 0.7.2 + '@windicss/config': 1.8.10 + debug: 4.3.4 + fast-glob: 3.2.12 + magic-string: 0.27.0 + micromatch: 4.0.5 + windicss: 3.5.6 + transitivePeerDependencies: + - supports-color + dev: true + /@zxcvbn-ts/core/2.1.0: resolution: {integrity: sha512-doxol9xrO7LgyVJhguXe7vO0xthnIYmsOKoDwrLg0Ho2kkpQaVtM+AOQw+BkEiKIqNg1V48eUf4/cTzMElXdiA==} dev: false @@ -1503,12 +1965,23 @@ packages: engines: {node: '>=12'} dev: true + /ansi-styles/2.2.1: + resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==} + engines: {node: '>=0.10.0'} + dev: true + + /ansi-styles/3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + dependencies: + color-convert: 1.9.3 + dev: true + /ansi-styles/4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} dependencies: color-convert: 2.0.1 - dev: true /ansi-styles/6.2.1: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} @@ -1605,12 +2078,20 @@ packages: fraction.js: 4.2.0 normalize-range: 0.1.2 picocolors: 1.0.0 - postcss: registry.npmmirror.com/postcss/8.4.20 + postcss: 8.4.20 postcss-value-parser: 4.2.0 dev: true - /axios/1.2.1: - resolution: {integrity: sha512-I88cFiGu9ryt/tfVEi4kX2SITsvDddTajXTOFmt2uK1ZVA8LytjtdeyefdQWEf5PU8w+4SSJDoYnggflB5tW4A==} + /axios/0.26.1_debug@4.3.4: + resolution: {integrity: sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==} + dependencies: + follow-redirects: 1.15.2 + transitivePeerDependencies: + - debug + dev: true + + /axios/1.2.2: + resolution: {integrity: sha512-bz/J4gS2S3I7mpN/YZfGFTqhXTYzRho8Ay38w2otuuDR322KzFIWm/4W2K6gIwvWaws5n+mnb7D1lN9uD+QH6Q==} dependencies: follow-redirects: 1.15.2 form-data: 4.0.0 @@ -1670,11 +2151,29 @@ packages: balanced-match: 1.0.2 dev: true + /braces/2.3.2: + resolution: {integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/braces/-/braces-2.3.2.tgz} + engines: {node: '>=0.10.0'} + dependencies: + arr-flatten: 1.1.0 + array-unique: 0.3.2 + extend-shallow: 2.0.1 + fill-range: 4.0.0 + isobject: 3.0.1 + repeat-element: 1.1.4 + snapdragon: 0.8.2 + snapdragon-node: 2.1.1 + split-string: 3.1.0 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + dev: true + /braces/3.0.2: resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} engines: {node: '>=8'} dependencies: - fill-range: registry.npmmirror.com/fill-range/7.0.1 + fill-range: 7.0.1 dev: true /browserslist/4.21.4: @@ -1710,7 +2209,7 @@ packages: /call-bind/1.0.2: resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} dependencies: - function-bind: registry.npmmirror.com/function-bind/1.1.1 + function-bind: 1.1.1 get-intrinsic: 1.1.3 dev: false @@ -1723,18 +2222,27 @@ packages: resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} dependencies: pascal-case: 3.1.2 - tslib: registry.npmmirror.com/tslib/2.4.1 + tslib: 2.4.1 dev: true /camelcase-keys/6.2.2: resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} engines: {node: '>=8'} dependencies: - camelcase: registry.npmmirror.com/camelcase/5.3.1 + camelcase: 5.3.1 map-obj: 4.3.0 quick-lru: 4.0.1 dev: true + /camelcase/5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + + /camelcase/6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/camelcase/-/camelcase-6.3.0.tgz} + engines: {node: '>=10'} + dev: true + /caniuse-lite/1.0.30001431: resolution: {integrity: sha512-zBUoFU0ZcxpvSt9IU66dXVT/3ctO1cy4y9cscs1szkPlcWb6pasYM144GqrUygUbT+k7cmUCW61cvskjcv0enQ==} dev: true @@ -1743,7 +2251,7 @@ packages: resolution: {integrity: sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==} dependencies: no-case: 3.0.4 - tslib: registry.npmmirror.com/tslib/2.4.1 + tslib: 2.4.1 upper-case-first: 2.0.2 dev: true @@ -1751,20 +2259,20 @@ packages: resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==} engines: {node: '>=0.10.0'} dependencies: - ansi-styles: registry.npmmirror.com/ansi-styles/2.2.1 + ansi-styles: 2.2.1 escape-string-regexp: 1.0.5 has-ansi: 2.0.0 strip-ansi: 3.0.1 - supports-color: registry.npmmirror.com/supports-color/2.0.0 + supports-color: 2.0.0 dev: true /chalk/2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} dependencies: - ansi-styles: registry.npmmirror.com/ansi-styles/3.2.1 + ansi-styles: 3.2.1 escape-string-regexp: 1.0.5 - supports-color: registry.npmmirror.com/supports-color/5.5.0 + supports-color: 5.5.0 dev: true /chalk/4.1.2: @@ -1875,13 +2383,25 @@ packages: object-visit: 1.0.1 dev: true + /color-convert/1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + dependencies: + color-name: 1.1.3 + dev: true + /color-convert/2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} dependencies: - color-name: registry.npmmirror.com/color-name/1.1.4 + color-name: 1.1.4 + + /color-name/1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} dev: true + /color-name/1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + /colord/2.9.3: resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} dev: true @@ -1942,7 +2462,7 @@ packages: resolution: {integrity: sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==} dependencies: no-case: 3.0.4 - tslib: registry.npmmirror.com/tslib/2.4.1 + tslib: 2.4.1 upper-case: 2.0.2 dev: true @@ -1976,11 +2496,20 @@ packages: through2: 4.0.2 dev: true + /convert-source-map/1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/convert-source-map/-/convert-source-map-1.9.0.tgz} + dev: true + /copy-descriptor/0.1.1: resolution: {integrity: sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==} engines: {node: '>=0.10.0'} dev: true + /core-js/3.26.1: + resolution: {integrity: sha512-21491RRQVzUn0GGM9Z1Jrpr6PNPxPi+Za8OM9q4tksTSnlbXXGKK1nXNg/QvwFYettXvSX6zWKCtHHfjN4puyA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/core-js/-/core-js-3.26.1.tgz} + requiresBuild: true + dev: true + /cors/2.8.5: resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} engines: {node: '>= 0.10'} @@ -1989,7 +2518,7 @@ packages: vary: 1.1.2 dev: true - /cosmiconfig-typescript-loader/4.2.0_wb7bklcl6jlvxijczjyxggip4a: + /cosmiconfig-typescript-loader/4.2.0_bxtyj3et3xbsdyxhh3oblnfbj4: resolution: {integrity: sha512-NkANeMnaHrlaSSlpKGyvn2R4rqUDeE/9E5YHx+b4nwo0R8dZyAqcih8/gxpCZvqWP9Vf6xuLpMSzSgdVEIM78g==} engines: {node: '>=12', npm: '>=6'} peerDependencies: @@ -1998,9 +2527,9 @@ packages: ts-node: '>=10' typescript: '>=3' dependencies: - '@types/node': 14.18.33 - cosmiconfig: 7.1.0 - ts-node: 10.9.1_rju6pyblifsagdmqm3y74zsi6q + '@types/node': 18.11.18 + cosmiconfig: 8.0.0 + ts-node: 10.9.1_awa2wsr5thmg3i7jqycphctjfq typescript: 4.9.4 dev: true @@ -2015,6 +2544,16 @@ packages: yaml: 1.10.2 dev: true + /cosmiconfig/8.0.0: + resolution: {integrity: sha512-da1EafcpH6b/TD8vDRaWV7xFINlHlF6zKsGwS1TsuVJTZRkquaS5HTMq7uq6h31619QjbsYl21gVDOm32KM1vQ==} + engines: {node: '>=14'} + dependencies: + import-fresh: 3.3.0 + js-yaml: 4.1.0 + parse-json: 5.2.0 + path-type: 4.0.0 + dev: true + /create-require/1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} dev: true @@ -2023,6 +2562,14 @@ packages: resolution: {integrity: sha512-by7jKAo73y5/Do0K6sxdTKHgndY0NMjG2bEdgeJxycbcmHuCiMXqw8sxy5C5Y5WTOTcDGmbT7Sr5CgKOXR06OA==} dev: false + /cross-fetch/3.1.5: + resolution: {integrity: sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/cross-fetch/-/cross-fetch-3.1.5.tgz} + dependencies: + node-fetch: 2.6.7 + transitivePeerDependencies: + - encoding + dev: true + /cross-spawn/7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} @@ -2278,7 +2825,7 @@ packages: resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} dependencies: no-case: 3.0.4 - tslib: registry.npmmirror.com/tslib/2.4.1 + tslib: 2.4.1 dev: true /dot-prop/5.3.0: @@ -2297,7 +2844,14 @@ packages: peerDependencies: echarts: ^5.0.1 dependencies: - echarts: registry.npmmirror.com/echarts/5.4.1 + echarts: 5.4.1 + dev: false + + /echarts/5.4.1: + resolution: {integrity: sha512-9ltS3M2JB0w2EhcYjCdmtrJ+6haZcW6acBolMGIuf01Hql1yrIV01L1aRj7jsaaIULJslEP9Z3vKlEmnJaWJVQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/echarts/-/echarts-5.4.1.tgz} + dependencies: + tslib: 2.3.0 + zrender: 5.4.1 dev: false /ejs/3.1.8: @@ -2312,8 +2866,8 @@ packages: resolution: {integrity: sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==} dev: true - /element-plus/2.2.27_vue@3.2.45: - resolution: {integrity: sha512-P04HDOZBYDdvlYuleuCZRULzAc5xJVOBfLDK9xWxVo0vyo8ntdaXS5sTU+/76vrNzuO3FhLn9kvrsbiJEVa1jg==} + /element-plus/2.2.28_vue@3.2.45: + resolution: {integrity: sha512-BsxF7iEaBydmRfw1Tt++EO9jRBjbtJr7ZRIrnEwz4J3Cwa1IzHCNCcx3ZwcYTlJq9CYFxv94JnbNr1EbkTou3A==} peerDependencies: vue: ^3.2.0 dependencies: @@ -2323,7 +2877,7 @@ packages: '@popperjs/core': /@sxzz/popperjs-es/2.11.7 '@types/lodash': 4.14.189 '@types/lodash-es': 4.17.6 - '@vueuse/core': 9.8.2_vue@3.2.45 + '@vueuse/core': 9.10.0_vue@3.2.45 async-validator: 4.2.5 dayjs: 1.11.7 escape-html: 1.0.3 @@ -2450,21 +3004,21 @@ packages: engines: {node: '>=10'} dev: true - /eslint-config-prettier/8.5.0_eslint@8.30.0: - resolution: {integrity: sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==} + /eslint-config-prettier/8.6.0_eslint@8.31.0: + resolution: {integrity: sha512-bAF0eLpLVqP5oEVUFKpMA+NnRFICwn9X8B5jrR9FcqnYBuPbqWEjTEspPWMj5ye6czoSLDweCzSo3Ko7gGrZaA==} hasBin: true peerDependencies: eslint: '>=7.0.0' dependencies: - eslint: 8.30.0 + eslint: 8.31.0 dev: true - /eslint-define-config/1.12.0: - resolution: {integrity: sha512-Kt9TcMbgsY9VRt7jIuw76KE/2RuD31eWB4Ubv6btXgU8NTSsbT6gZ8qzeiU+rAih/8sOl8Kt89spAZBMElu6qQ==} + /eslint-define-config/1.13.0: + resolution: {integrity: sha512-d0BfmPGBcMusfiz6QY/piAhWaEyJriJtvk9SHfuJzI7am9k4ce07SfmPkpcR0ckXNyu4FBons10akOO2Tx+X+Q==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0, npm: '>=6.14.13', pnpm: '>= 7.0.0'} dev: true - /eslint-plugin-prettier/4.2.1_kl4pe43v5b43npmso5hoplpbyi: + /eslint-plugin-prettier/4.2.1_32m5uc2milwdw3tnkcq5del26y: resolution: {integrity: sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==} engines: {node: '>=12.0.0'} peerDependencies: @@ -2475,25 +3029,25 @@ packages: eslint-config-prettier: optional: true dependencies: - eslint: 8.30.0 - eslint-config-prettier: 8.5.0_eslint@8.30.0 + eslint: 8.31.0 + eslint-config-prettier: 8.6.0_eslint@8.31.0 prettier: 2.8.1 prettier-linter-helpers: 1.0.0 dev: true - /eslint-plugin-vue/9.8.0_eslint@8.30.0: + /eslint-plugin-vue/9.8.0_eslint@8.31.0: resolution: {integrity: sha512-E/AXwcTzunyzM83C2QqDHxepMzvI2y6x+mmeYHbVDQlKFqmKYvRrhaVixEeeG27uI44p9oKDFiyCRw4XxgtfHA==} engines: {node: ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.2.0 || ^7.0.0 || ^8.0.0 dependencies: - eslint: 8.30.0 - eslint-utils: 3.0.0_eslint@8.30.0 + eslint: 8.31.0 + eslint-utils: 3.0.0_eslint@8.31.0 natural-compare: 1.4.0 nth-check: 2.1.1 postcss-selector-parser: 6.0.10 semver: 7.3.8 - vue-eslint-parser: 9.1.0_eslint@8.30.0 + vue-eslint-parser: 9.1.0_eslint@8.31.0 xml-name-validator: 4.0.0 transitivePeerDependencies: - supports-color @@ -2522,13 +3076,13 @@ packages: eslint-visitor-keys: 1.3.0 dev: true - /eslint-utils/3.0.0_eslint@8.30.0: + /eslint-utils/3.0.0_eslint@8.31.0: resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} peerDependencies: eslint: '>=5' dependencies: - eslint: 8.30.0 + eslint: 8.31.0 eslint-visitor-keys: 2.1.0 dev: true @@ -2547,12 +3101,12 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /eslint/8.30.0: - resolution: {integrity: sha512-MGADB39QqYuzEGov+F/qb18r4i7DohCDOfatHaxI2iGlPuC65bwG2gxgO+7DkyL38dRFaRH7RaRAgU6JKL9rMQ==} + /eslint/8.31.0: + resolution: {integrity: sha512-0tQQEVdmPZ1UtUKXjX7EMm9BlgJ08G90IhWh0PKDCb3ZLsgAOHI8fYSIzYVZej92zsgq+ft0FGsxhJ3xo2tbuA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} hasBin: true dependencies: - '@eslint/eslintrc': 1.4.0 + '@eslint/eslintrc': 1.4.1 '@humanwhocodes/config-array': 0.11.8 '@humanwhocodes/module-importer': 1.0.1 '@nodelib/fs.walk': 1.2.8 @@ -2563,7 +3117,7 @@ packages: doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.1.1 - eslint-utils: 3.0.0_eslint@8.30.0 + eslint-utils: 3.0.0_eslint@8.31.0 eslint-visitor-keys: 3.3.0 espree: 9.4.1 esquery: 1.4.0 @@ -2787,7 +3341,24 @@ packages: /filelist/1.0.4: resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} dependencies: - minimatch: 5.1.0 + minimatch: 5.1.2 + dev: true + + /fill-range/4.0.0: + resolution: {integrity: sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/fill-range/-/fill-range-4.0.0.tgz} + engines: {node: '>=0.10.0'} + dependencies: + extend-shallow: 2.0.1 + is-number: 3.0.0 + repeat-string: 1.6.1 + to-regex-range: 2.1.1 + dev: true + + /fill-range/7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/fill-range/-/fill-range-7.0.1.tgz} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 dev: true /find-up/4.1.0: @@ -2825,7 +3396,6 @@ packages: peerDependenciesMeta: debug: optional: true - dev: false /for-in/1.0.2: resolution: {integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==} @@ -2861,6 +3431,15 @@ packages: universalify: 2.0.0 dev: true + /fs-extra/11.1.0: + resolution: {integrity: sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw==} + engines: {node: '>=14.14'} + dependencies: + graceful-fs: 4.2.10 + jsonfile: 6.1.0 + universalify: 2.0.0 + dev: true + /fs.realpath/1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} dev: true @@ -2875,6 +3454,10 @@ packages: /function-bind/1.1.1: resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + + /gensync/1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/gensync/-/gensync-1.0.0-beta.2.tgz} + engines: {node: '>=6.9.0'} dev: true /get-caller-file/2.0.5: @@ -2884,8 +3467,8 @@ packages: /get-intrinsic/1.1.3: resolution: {integrity: sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==} dependencies: - function-bind: registry.npmmirror.com/function-bind/1.1.1 - has: registry.npmmirror.com/has/1.0.3 + function-bind: 1.1.1 + has: 1.0.3 has-symbols: 1.0.3 dev: false @@ -3007,6 +3590,16 @@ packages: ansi-regex: 2.1.1 dev: true + /has-flag/1.0.0: + resolution: {integrity: sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==} + engines: {node: '>=0.10.0'} + dev: true + + /has-flag/3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + dev: true + /has-flag/4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} @@ -3044,7 +3637,7 @@ packages: resolution: {integrity: sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==} engines: {node: '>=0.10.0'} dependencies: - is-number: registry.npmmirror.com/is-number/3.0.0 + is-number: 3.0.0 kind-of: 4.0.0 dev: true @@ -3053,7 +3646,6 @@ packages: engines: {node: '>= 0.4.0'} dependencies: function-bind: 1.1.1 - dev: true /he/1.2.0: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} @@ -3064,7 +3656,7 @@ packages: resolution: {integrity: sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==} dependencies: capital-case: 1.0.4 - tslib: registry.npmmirror.com/tslib/2.4.1 + tslib: 2.4.1 dev: true /hosted-git-info/2.8.9: @@ -3075,7 +3667,7 @@ packages: resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} engines: {node: '>=10'} dependencies: - lru-cache: registry.npmmirror.com/lru-cache/6.0.0 + lru-cache: 6.0.0 dev: true /html-tags/3.2.0: @@ -3288,6 +3880,18 @@ packages: resolution: {integrity: sha512-UknnZK4RakDmTgz4PI1wIph5yxSs/mvChWs9ifnlXsKuXgWmOkY/hAE0H/k2MIqH0RlRye0i1oC07MCRSD28Mw==} dev: false + /is-number/3.0.0: + resolution: {integrity: sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/is-number/-/is-number-3.0.0.tgz} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 3.2.2 + dev: true + + /is-number/7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/is-number/-/is-number-7.0.0.tgz} + engines: {node: '>=0.12.0'} + dev: true + /is-obj/2.0.0: resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} engines: {node: '>=8'} @@ -3371,6 +3975,11 @@ packages: minimatch: 3.1.2 dev: true + /jiti/1.16.0: + resolution: {integrity: sha512-L3BJStEf5NAqNuzrpfbN71dp43mYIcBUlCRea/vdyv5dW/AYa1d4bpelko4SHdY3I6eN9Wzyasxirj1/vv5kmg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/jiti/-/jiti-1.16.0.tgz} + hasBin: true + dev: true + /js-base64/2.6.4: resolution: {integrity: sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==} dev: true @@ -3379,6 +3988,10 @@ packages: resolution: {integrity: sha512-08bOAKweV2NUC1wqTtf3qZlnpOX/R2DU9ikpjOHs0H+ibQv3zpncVQg6um4uYtRtrwIX8M4Nh3ytK4HGlYAq7Q==} dev: true + /js-tokens/4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/js-tokens/-/js-tokens-4.0.0.tgz} + dev: true + /js-tokens/8.0.0: resolution: {integrity: sha512-PC7MzqInq9OqKyTXfIvQNcjMkODJYC8A17kAaQgeW79yfhqTWSOfjHYQ2mDDcwJ96Iibtwkfh0C7R/OvqPlgVA==} dev: true @@ -3394,6 +4007,12 @@ packages: resolution: {integrity: sha512-dVvV54GdFuJgmEKn+oBiaifDMen4p6o6j/lJh0OVMcouME8sST0bJ7bldIgKBQk4za0zyGn0/pm4vOznR25mLw==} dev: false + /jsesc/2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/jsesc/-/jsesc-2.5.2.tgz} + engines: {node: '>=4'} + hasBin: true + dev: true + /json-parse-even-better-errors/2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} dev: true @@ -3437,7 +4056,7 @@ packages: /jsonfile/6.1.0: resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} dependencies: - universalify: registry.npmmirror.com/universalify/2.0.0 + universalify: 2.0.0 optionalDependencies: graceful-fs: 4.2.10 dev: true @@ -3475,6 +4094,10 @@ packages: resolution: {integrity: sha512-5FZRzrZzNTBruuurWpvZnvP9pum+fe0HcK8z/ooo+U+Hmp4vtbyp1/QDsqmufirXy4egGzbaH/y2uCZf+6W5Kg==} dev: true + /kolorist/1.6.0: + resolution: {integrity: sha512-dLkz37Ab97HWMx9KTes3Tbi3D1ln9fCAy2zr2YVExJasDRPGRaKcoE4fycWNtnCAJfjFqe0cnY+f8KT2JePEXQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/kolorist/-/kolorist-1.6.0.tgz} + dev: true + /levn/0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} @@ -3655,7 +4278,7 @@ packages: /lower-case/2.0.2: resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} dependencies: - tslib: registry.npmmirror.com/tslib/2.4.1 + tslib: 2.4.1 dev: true /lru-cache/6.0.0: @@ -3669,6 +4292,12 @@ packages: resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} dependencies: sourcemap-codec: 1.4.8 + + /magic-string/0.27.0: + resolution: {integrity: sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/magic-string/-/magic-string-0.27.0.tgz} + engines: {node: '>=12'} + dependencies: + '@jridgewell/sourcemap-codec': 1.4.14 dev: true /make-error/1.3.6: @@ -3766,7 +4395,7 @@ packages: dependencies: arr-diff: 4.0.0 array-unique: 0.3.2 - braces: registry.npmmirror.com/braces/2.3.2 + braces: 2.3.2 define-property: 1.0.0 extend-shallow: 2.0.1 extglob: 2.0.4 @@ -3828,13 +4457,6 @@ packages: brace-expansion: 1.1.11 dev: true - /minimatch/5.1.0: - resolution: {integrity: sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==} - engines: {node: '>=10'} - dependencies: - brace-expansion: 2.0.1 - dev: true - /minimatch/5.1.2: resolution: {integrity: sha512-bNH9mmM9qsJ2X4r2Nat1B//1dJVcn3+iBLa3IgqJ7EbGaDNepL9QSHOxN4ng33s52VMMhhIfgCYDk3C4ZmlDAg==} engines: {node: '>=10'} @@ -3884,7 +4506,7 @@ packages: dev: false /nanoid/3.3.4: - resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==} + resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/nanoid/-/nanoid-3.3.4.tgz} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true @@ -3923,7 +4545,19 @@ packages: resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} dependencies: lower-case: 2.0.2 - tslib: registry.npmmirror.com/tslib/2.4.1 + tslib: 2.4.1 + dev: true + + /node-fetch/2.6.7: + resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/node-fetch/-/node-fetch-2.6.7.tgz} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 dev: true /node-releases/2.0.6: @@ -3944,8 +4578,8 @@ packages: engines: {node: '>=10'} dependencies: hosted-git-info: 4.1.0 - is-core-module: registry.npmmirror.com/is-core-module/2.11.0 - semver: registry.npmmirror.com/semver/7.3.8 + is-core-module: 2.11.0 + semver: 7.3.8 validate-npm-package-license: 3.0.4 dev: true @@ -4091,7 +4725,7 @@ packages: resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} dependencies: dot-case: 3.0.4 - tslib: registry.npmmirror.com/tslib/2.4.1 + tslib: 2.4.1 dev: true /parent-module/1.0.1: @@ -4105,7 +4739,7 @@ packages: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} dependencies: - '@babel/code-frame': registry.npmmirror.com/@babel/code-frame/7.18.6 + '@babel/code-frame': 7.18.6 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 @@ -4115,7 +4749,7 @@ packages: resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} dependencies: no-case: 3.0.4 - tslib: registry.npmmirror.com/tslib/2.4.1 + tslib: 2.4.1 dev: true /pascalcase/0.1.1: @@ -4127,7 +4761,7 @@ packages: resolution: {integrity: sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==} dependencies: dot-case: 3.0.4 - tslib: registry.npmmirror.com/tslib/2.4.1 + tslib: 2.4.1 dev: true /path-exists/4.0.0: @@ -4162,17 +4796,12 @@ packages: resolution: {integrity: sha512-sTitTPYnn23esFR3RlqYBWn4c45WGeLcsKzQiUpXJAyfcWkolvlYpV8FLo7JishK946oQwMFUCHXQ9AjGPKExw==} dev: true - /pathe/0.3.9: - resolution: {integrity: sha512-6Y6s0vT112P3jD8dGfuS6r+lpa0qqNrLyHPOwvXMnyNTQaYiwgau2DP3aNDsR13xqtGj7rrPo+jFUATpU6/s+g==} - dev: true - /pathe/1.0.0: resolution: {integrity: sha512-nPdMG0Pd09HuSsr7QOKUXO2Jr9eqaDiZvDwdyIhNG5SHYujkQHYKDfGQkulBxvbDHz8oHLsTgKN86LSwYzSHAg==} dev: true /picocolors/1.0.0: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} - dev: true /picomatch/2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} @@ -4185,6 +4814,24 @@ packages: hasBin: true dev: true + /pinia/2.0.28_prq2uz4lho2pwp6irk4cfkrxwu: + resolution: {integrity: sha512-YClq9DkqCblq9rlyUual7ezMu/iICWdBtfJrDt4oWU9Zxpijyz7xB2xTwx57DaBQ96UGvvTMORzALr+iO5PVMw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/pinia/-/pinia-2.0.28.tgz} + peerDependencies: + '@vue/composition-api': ^1.4.0 + typescript: '>=4.4.4' + vue: ^2.6.14 || ^3.2.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + typescript: + optional: true + dependencies: + '@vue/devtools-api': 6.4.5 + typescript: 4.9.4 + vue: 3.2.45 + vue-demi: 0.13.11_vue@3.2.45 + dev: false + /pngjs/5.0.0: resolution: {integrity: sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==} engines: {node: '>=10.13.0'} @@ -4201,7 +4848,7 @@ packages: dependencies: htmlparser2: 8.0.1 js-tokens: 8.0.0 - postcss: registry.npmmirror.com/postcss/8.4.20 + postcss: 8.4.20 postcss-safe-parser: 6.0.0_postcss@8.4.20 dev: true @@ -4214,7 +4861,7 @@ packages: peerDependencies: postcss: '>4 <9' dependencies: - postcss: registry.npmmirror.com/postcss/5.2.18 + postcss: 5.2.18 dev: true /postcss-resolve-nested-selector/0.1.1: @@ -4227,7 +4874,7 @@ packages: peerDependencies: postcss: ^8.3.3 dependencies: - postcss: registry.npmmirror.com/postcss/8.4.20 + postcss: 8.4.20 dev: true /postcss-scss/4.0.6_postcss@8.4.20: @@ -4236,7 +4883,7 @@ packages: peerDependencies: postcss: ^8.4.19 dependencies: - postcss: registry.npmmirror.com/postcss/8.4.20 + postcss: 8.4.20 dev: true /postcss-selector-parser/6.0.10: @@ -4260,21 +4907,30 @@ packages: peerDependencies: postcss: ^8.3.9 dependencies: - postcss: registry.npmmirror.com/postcss/8.4.20 + postcss: 8.4.20 dev: true /postcss-value-parser/4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} dev: true + /postcss/5.2.18: + resolution: {integrity: sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==} + engines: {node: '>=0.12'} + dependencies: + chalk: 1.1.3 + js-base64: 2.6.4 + source-map: 0.5.7 + supports-color: 3.2.3 + dev: true + /postcss/8.4.20: - resolution: {integrity: sha512-6Q04AXR1212bXr5fh03u8aAwbLxAQNGQ/Q1LNa0VfOI06ZAlhPHtQvE4OIdpj4kLThXilalPnmDSOD65DcHt+g==} + resolution: {integrity: sha512-6Q04AXR1212bXr5fh03u8aAwbLxAQNGQ/Q1LNa0VfOI06ZAlhPHtQvE4OIdpj4kLThXilalPnmDSOD65DcHt+g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/postcss/-/postcss-8.4.20.tgz} engines: {node: ^10 || ^12 || >=14} dependencies: nanoid: 3.3.4 picocolors: 1.0.0 source-map-js: 1.0.2 - dev: true /posthtml-parser/0.2.1: resolution: {integrity: sha512-nPC53YMqJnc/+1x4fRYFfm81KV2V+G9NZY+hTohpYg64Ay7NemWWcV4UWuy/SgMupqQ3kJ88M/iRfZmSnxT+pw==} @@ -4451,6 +5107,9 @@ packages: strip-indent: 3.0.0 dev: true + /regenerator-runtime/0.13.11: + resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz} + /regex-not/1.0.2: resolution: {integrity: sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==} engines: {node: '>=0.10.0'} @@ -4547,6 +5206,17 @@ packages: glob: 7.2.3 dev: true + /rollup-plugin-purge-icons/0.9.1: + resolution: {integrity: sha512-hRDKBsPUz47UMdBufki2feTmBF2ClEJlYqL7N6vpVAHSLd7V2BJUaNKOF7YYbLMofVVF+9hm44YSkYO6k9hUgg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/rollup-plugin-purge-icons/-/rollup-plugin-purge-icons-0.9.1.tgz} + engines: {node: '>= 12'} + dependencies: + '@purge-icons/core': 0.9.1 + '@purge-icons/generated': 0.9.0 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + /rollup/2.79.1: resolution: {integrity: sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==} engines: {node: '>=10.0.0'} @@ -4555,8 +5225,8 @@ packages: fsevents: 2.3.2 dev: true - /rollup/3.8.1: - resolution: {integrity: sha512-4yh9eMW7byOroYcN8DlF9P/2jCpu6txVIHjEqquQVSx7DI0RgyCCN3tjrcy4ra6yVtV336aLBB3v2AarYAxePQ==} + /rollup/3.9.1: + resolution: {integrity: sha512-GswCYHXftN8ZKGVgQhTFUJB/NBXxrRGgO2NCy6E8s1rwEJ4Q9/VttNqcYfEvx4dTo4j58YqdC3OVztPzlKSX8w==} engines: {node: '>=14.18.0', npm: '>=8.0.0'} hasBin: true optionalDependencies: @@ -4572,7 +5242,7 @@ packages: /rxjs/7.5.7: resolution: {integrity: sha512-z9MzKh/UcOqB3i20H6rtrlaE/CgjLOvheWK/9ILrbhROGTweAi1BaFsTT9FbwZi5Trr1qNRs+MXkhmR06awzQA==} dependencies: - tslib: registry.npmmirror.com/tslib/2.4.1 + tslib: 2.4.1 dev: true /safe-buffer/5.2.1: @@ -4623,7 +5293,7 @@ packages: resolution: {integrity: sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==} dependencies: no-case: 3.0.4 - tslib: registry.npmmirror.com/tslib/2.4.1 + tslib: 2.4.1 upper-case-first: 2.0.2 dev: true @@ -4691,7 +5361,7 @@ packages: resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==} engines: {node: '>=8'} dependencies: - ansi-styles: registry.npmmirror.com/ansi-styles/4.3.0 + ansi-styles: 4.3.0 astral-regex: 2.0.0 is-fullwidth-code-point: 3.0.0 dev: true @@ -4700,7 +5370,7 @@ packages: resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} engines: {node: '>=10'} dependencies: - ansi-styles: registry.npmmirror.com/ansi-styles/4.3.0 + ansi-styles: 4.3.0 astral-regex: 2.0.0 is-fullwidth-code-point: 3.0.0 dev: true @@ -4722,7 +5392,7 @@ packages: resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} dependencies: dot-case: 3.0.4 - tslib: registry.npmmirror.com/tslib/2.4.1 + tslib: 2.4.1 dev: true /snapdragon-node/2.1.1: @@ -4758,9 +5428,8 @@ packages: dev: true /source-map-js/1.0.2: - resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/source-map-js/-/source-map-js-1.0.2.tgz} engines: {node: '>=0.10.0'} - dev: true /source-map-resolve/0.5.3: resolution: {integrity: sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==} @@ -4929,7 +5598,7 @@ packages: resolution: {integrity: sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg==} dev: true - /stylelint-config-html/1.1.0_bto6pmslw3cibsiuq6smxboytq: + /stylelint-config-html/1.1.0_kbto3rg3njmczth2rrsgfnlsqa: resolution: {integrity: sha512-IZv4IVESjKLumUGi+HWeb7skgO6/g4VMuAYrJdlqQFndgbj6WJAXPhaysvBiXefX79upBdQVumgYcdd17gCpjQ==} engines: {node: ^12 || >=14} peerDependencies: @@ -4937,48 +5606,48 @@ packages: stylelint: '>=14.0.0' dependencies: postcss-html: 1.5.0 - stylelint: 14.16.0 + stylelint: 14.16.1 dev: true - /stylelint-config-prettier/9.0.4_stylelint@14.16.0: + /stylelint-config-prettier/9.0.4_stylelint@14.16.1: resolution: {integrity: sha512-38nIGTGpFOiK5LjJ8Ma1yUgpKENxoKSOhbDNSemY7Ep0VsJoXIW9Iq/2hSt699oB9tReynfWicTAoIHiq8Rvbg==} engines: {node: '>= 12'} hasBin: true peerDependencies: stylelint: '>=11.0.0' dependencies: - stylelint: 14.16.0 + stylelint: 14.16.1 dev: true - /stylelint-config-recommended/9.0.0_stylelint@14.16.0: + /stylelint-config-recommended/9.0.0_stylelint@14.16.1: resolution: {integrity: sha512-9YQSrJq4NvvRuTbzDsWX3rrFOzOlYBmZP+o513BJN/yfEmGSr0AxdvrWs0P/ilSpVV/wisamAHu5XSk8Rcf4CQ==} peerDependencies: stylelint: ^14.10.0 dependencies: - stylelint: 14.16.0 + stylelint: 14.16.1 dev: true - /stylelint-config-standard/29.0.0_stylelint@14.16.0: + /stylelint-config-standard/29.0.0_stylelint@14.16.1: resolution: {integrity: sha512-uy8tZLbfq6ZrXy4JKu3W+7lYLgRQBxYTUUB88vPgQ+ZzAxdrvcaSUW9hOMNLYBnwH+9Kkj19M2DHdZ4gKwI7tg==} peerDependencies: stylelint: ^14.14.0 dependencies: - stylelint: 14.16.0 - stylelint-config-recommended: 9.0.0_stylelint@14.16.0 + stylelint: 14.16.1 + stylelint-config-recommended: 9.0.0_stylelint@14.16.1 dev: true - /stylelint-order/5.0.0_stylelint@14.16.0: + /stylelint-order/5.0.0_stylelint@14.16.1: resolution: {integrity: sha512-OWQ7pmicXufDw5BlRqzdz3fkGKJPgLyDwD1rFY3AIEfIH/LQY38Vu/85v8/up0I+VPiuGRwbc2Hg3zLAsJaiyw==} peerDependencies: stylelint: ^14.0.0 dependencies: - postcss: registry.npmmirror.com/postcss/8.4.20 + postcss: 8.4.20 postcss-sorting: 7.0.1_postcss@8.4.20 - stylelint: 14.16.0 + stylelint: 14.16.1 dev: true - /stylelint/14.16.0: - resolution: {integrity: sha512-X6uTi9DcxjzLV8ZUAjit1vsRtSwcls0nl07c9rqOPzvpA8IvTX/xWEkBRowS0ffevRrqkHa/ThDEu86u73FQDg==} + /stylelint/14.16.1: + resolution: {integrity: sha512-ErlzR/T3hhbV+a925/gbfc3f3Fep9/bnspMiJPorfGEmcBbXdS+oo6LrVtoUZ/w9fqD6o6k7PtUlCOsCRdjX/A==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} hasBin: true dependencies: @@ -5005,7 +5674,7 @@ packages: micromatch: 4.0.5 normalize-path: 3.0.0 picocolors: 1.0.0 - postcss: registry.npmmirror.com/postcss/8.4.20 + postcss: 8.4.20 postcss-media-query-parser: 0.2.3 postcss-resolve-nested-selector: 0.1.1 postcss-safe-parser: 6.0.0_postcss@8.4.20 @@ -5024,6 +5693,25 @@ packages: - supports-color dev: true + /supports-color/2.0.0: + resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==} + engines: {node: '>=0.8.0'} + dev: true + + /supports-color/3.2.3: + resolution: {integrity: sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==} + engines: {node: '>=0.8.0'} + dependencies: + has-flag: 1.0.0 + dev: true + + /supports-color/5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + dependencies: + has-flag: 3.0.0 + dev: true + /supports-color/7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} @@ -5054,7 +5742,7 @@ packages: loader-utils: 1.4.2 merge-options: 1.0.1 micromatch: 3.1.0 - postcss: registry.npmmirror.com/postcss/5.2.18 + postcss: 5.2.18 postcss-prefix-selector: 1.16.0_postcss@5.2.18 posthtml-rename-id: 1.0.12 posthtml-svg-mode: 1.0.3 @@ -5078,10 +5766,14 @@ packages: css-select: 4.3.0 css-tree: 1.1.3 csso: 4.2.0 - picocolors: registry.npmmirror.com/picocolors/1.0.0 + picocolors: 1.0.0 stable: 0.1.8 dev: true + /systemjs/6.13.0: + resolution: {integrity: sha512-P3cgh2bpaPvAO2NE3uRp/n6hmk4xPX4DQf+UzTlCAycssKdqhp6hjw+ENWe+aUS7TogKRFtptMosTSFeC6R55g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/systemjs/-/systemjs-6.13.0.tgz} + dev: true + /table/6.8.1: resolution: {integrity: sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==} engines: {node: '>=10.0.0'} @@ -5127,6 +5819,10 @@ packages: resolution: {integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==} dev: false + /to-fast-properties/2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz} + engines: {node: '>=4'} + /to-object-path/0.3.0: resolution: {integrity: sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==} engines: {node: '>=0.10.0'} @@ -5134,6 +5830,21 @@ packages: kind-of: 3.2.2 dev: true + /to-regex-range/2.1.1: + resolution: {integrity: sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/to-regex-range/-/to-regex-range-2.1.1.tgz} + engines: {node: '>=0.10.0'} + dependencies: + is-number: 3.0.0 + repeat-string: 1.6.1 + dev: true + + /to-regex-range/5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/to-regex-range/-/to-regex-range-5.0.1.tgz} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + dev: true + /to-regex/3.0.2: resolution: {integrity: sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==} engines: {node: '>=0.10.0'} @@ -5144,6 +5855,10 @@ packages: safe-regex: 1.1.0 dev: true + /tr46/0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/tr46/-/tr46-0.0.3.tgz} + dev: true + /traverse/0.6.7: resolution: {integrity: sha512-/y956gpUo9ZNCb99YjxG7OaslxZWHfCHAUUfshwqOXmxUIvqLjVO581BT+gM59+QV9tFe6/CGG53tsA1Y7RSdg==} dev: true @@ -5153,7 +5868,7 @@ packages: engines: {node: '>=8'} dev: true - /ts-node/10.9.1_rju6pyblifsagdmqm3y74zsi6q: + /ts-node/10.9.1_awa2wsr5thmg3i7jqycphctjfq: resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true peerDependencies: @@ -5172,7 +5887,7 @@ packages: '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.3 - '@types/node': 14.18.33 + '@types/node': 18.11.18 acorn: 8.8.1 acorn-walk: 8.2.0 arg: 4.1.3 @@ -5188,6 +5903,10 @@ packages: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} dev: true + /tslib/2.3.0: + resolution: {integrity: sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/tslib/-/tslib-2.3.0.tgz} + dev: false + /tslib/2.4.1: resolution: {integrity: sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==} dev: true @@ -5287,19 +6006,19 @@ packages: dependencies: browserslist: 4.21.4 escalade: 3.1.1 - picocolors: registry.npmmirror.com/picocolors/1.0.0 + picocolors: 1.0.0 dev: true /upper-case-first/2.0.2: resolution: {integrity: sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==} dependencies: - tslib: registry.npmmirror.com/tslib/2.4.1 + tslib: 2.4.1 dev: true /upper-case/2.0.2: resolution: {integrity: sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==} dependencies: - tslib: registry.npmmirror.com/tslib/2.4.1 + tslib: 2.4.1 dev: true /uri-js/4.4.1: @@ -5349,7 +6068,7 @@ packages: engines: {node: '>= 0.8'} dev: true - /vite-plugin-compression/0.5.1_vite@4.0.3: + /vite-plugin-compression/0.5.1_vite@4.0.4: resolution: {integrity: sha512-5QJKBDc+gNYVqL/skgFAP81Yuzo9R+EAf19d+EtsMF/i8kFUpNi3J/H01QD3Oo8zBQn+NzoCIFkpPLynoOzaJg==} peerDependencies: vite: '>=2.0.0' @@ -5357,7 +6076,7 @@ packages: chalk: 4.1.2 debug: 4.3.4 fs-extra: 10.1.0 - vite: 4.0.3_amyfslv6hdwxqbf7f4ldebbtce + vite: 4.0.4_zxbrnrc4iyldik6mikh3pswz4i transitivePeerDependencies: - supports-color dev: true @@ -5368,7 +6087,7 @@ packages: ejs: 3.1.8 dev: true - /vite-plugin-eslint/1.8.1_eslint@8.30.0+vite@4.0.3: + /vite-plugin-eslint/1.8.1_eslint@8.31.0+vite@4.0.4: resolution: {integrity: sha512-PqdMf3Y2fLO9FsNPmMX+//2BF5SF8nEWspZdgl4kSt7UvHDRHVVfHvxsD7ULYzZrJDGRxR81Nq7TOFgwMnUang==} peerDependencies: eslint: '>=7' @@ -5376,12 +6095,12 @@ packages: dependencies: '@rollup/pluginutils': 4.2.1 '@types/eslint': 8.4.10 - eslint: 8.30.0 + eslint: 8.31.0 rollup: 2.79.1 - vite: 4.0.3_amyfslv6hdwxqbf7f4ldebbtce + vite: 4.0.4_zxbrnrc4iyldik6mikh3pswz4i dev: true - /vite-plugin-progress/0.0.6_vite@4.0.3: + /vite-plugin-progress/0.0.6_vite@4.0.4: resolution: {integrity: sha512-pIK2TVEY4XFGrz10CQDdEufBBCDaV0geRHfXV3abGTBr+OF9O0Zmd3ZDrHJXDv4Rl3qAQP4BTCuPYQ3XqstmqA==} engines: {node: '>=14', pnpm: '>=7.0.0'} peerDependencies: @@ -5390,10 +6109,25 @@ packages: picocolors: 1.0.0 progress: 2.0.3 rd: 2.0.1 - vite: 4.0.3_amyfslv6hdwxqbf7f4ldebbtce + vite: 4.0.4_zxbrnrc4iyldik6mikh3pswz4i dev: true - /vite-plugin-style-import/2.0.0_vite@4.0.3: + /vite-plugin-purge-icons/0.9.2_vite@4.0.4: + resolution: {integrity: sha512-vxJEMyNyckqLr/4HPsW9P6BMLUvOVMvjjFz3jLl4Wke1KWE8ITJUxIUwodxaOmEp9L2lxVk5an3TYeycZCfqFw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/vite-plugin-purge-icons/-/vite-plugin-purge-icons-0.9.2.tgz} + engines: {node: '>= 12'} + peerDependencies: + vite: ^2.0.0 || ^3.0.0 || ^4.0.0 + dependencies: + '@purge-icons/core': 0.9.1 + '@purge-icons/generated': 0.9.0 + rollup-plugin-purge-icons: 0.9.1 + vite: 4.0.4_zxbrnrc4iyldik6mikh3pswz4i + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /vite-plugin-style-import/2.0.0_vite@4.0.4: resolution: {integrity: sha512-qtoHQae5dSUQPo/rYz/8p190VU5y19rtBaeV7ryLa/AYAU/e9CG89NrN/3+k7MR8mJy/GPIu91iJ3zk9foUOSA==} peerDependencies: vite: '>=2.0.0' @@ -5405,10 +6139,10 @@ packages: fs-extra: 10.1.0 magic-string: 0.25.9 pathe: 0.2.0 - vite: 4.0.3_amyfslv6hdwxqbf7f4ldebbtce + vite: 4.0.4_zxbrnrc4iyldik6mikh3pswz4i dev: true - /vite-plugin-svg-icons/2.0.1_vite@4.0.3: + /vite-plugin-svg-icons/2.0.1_vite@4.0.4: resolution: {integrity: sha512-6ktD+DhV6Rz3VtedYvBKKVA2eXF+sAQVaKkKLDSqGUfnhqXl3bj5PPkVTl3VexfTuZy66PmINi8Q6eFnVfRUmA==} peerDependencies: vite: '>=2.0.0' @@ -5421,23 +6155,37 @@ packages: pathe: 0.2.0 svg-baker: 1.7.0 svgo: 2.8.0 - vite: 4.0.3_amyfslv6hdwxqbf7f4ldebbtce + vite: 4.0.4_zxbrnrc4iyldik6mikh3pswz4i transitivePeerDependencies: - supports-color dev: true - /vite-plugin-vue-setup-extend/0.4.0_vite@4.0.3: + /vite-plugin-vue-setup-extend/0.4.0_vite@4.0.4: resolution: {integrity: sha512-WMbjPCui75fboFoUTHhdbXzu4Y/bJMv5N9QT9a7do3wNMNHHqrk+Tn2jrSJU0LS5fGl/EG+FEDBYVUeWIkDqXQ==} peerDependencies: vite: '>=2.0.0' dependencies: '@vue/compiler-sfc': 3.2.45 magic-string: 0.25.9 - vite: 4.0.3_amyfslv6hdwxqbf7f4ldebbtce + vite: 4.0.4_zxbrnrc4iyldik6mikh3pswz4i dev: true - /vite/4.0.3_amyfslv6hdwxqbf7f4ldebbtce: - resolution: {integrity: sha512-HvuNv1RdE7deIfQb8mPk51UKjqptO/4RXZ5yXSAvurd5xOckwS/gg8h9Tky3uSbnjYTgUm0hVCet1cyhKd73ZA==} + /vite-plugin-windicss/1.8.10_vite@4.0.4: + resolution: {integrity: sha512-scywsuzo46lcTBohspmF0WiwhWEte6p+OUVrX4yr7VMRvLHMHVfLtJReyD5pppjijG7YOwVsZn7XBWWZtF658Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/vite-plugin-windicss/-/vite-plugin-windicss-1.8.10.tgz} + peerDependencies: + vite: ^2.0.1 || ^3.0.0 || ^4.0.0 + dependencies: + '@windicss/plugin-utils': 1.8.10 + debug: 4.3.4 + kolorist: 1.6.0 + vite: 4.0.4_zxbrnrc4iyldik6mikh3pswz4i + windicss: 3.5.6 + transitivePeerDependencies: + - supports-color + dev: true + + /vite/4.0.4_zxbrnrc4iyldik6mikh3pswz4i: + resolution: {integrity: sha512-xevPU7M8FU0i/80DMR+YhgrzR5KS2ORy1B4xcX/cXLsvnUWvfHuqMmVU6N0YiJ4JWGRJJsLCgjEzKjG9/GKoSw==} engines: {node: ^14.18.0 || >=16.0.0} hasBin: true peerDependencies: @@ -5461,11 +6209,11 @@ packages: terser: optional: true dependencies: - '@types/node': 18.11.17 + '@types/node': 18.11.18 esbuild: 0.16.5 postcss: 8.4.20 resolve: 1.22.1 - rollup: 3.8.1 + rollup: 3.9.1 sass: 1.57.1 terser: 5.16.1 optionalDependencies: @@ -5487,14 +6235,14 @@ packages: vue: 3.2.45 dev: false - /vue-eslint-parser/9.1.0_eslint@8.30.0: + /vue-eslint-parser/9.1.0_eslint@8.31.0: resolution: {integrity: sha512-NGn/iQy8/Wb7RrRa4aRkokyCZfOUWk19OP5HP6JEozQFX5AoS/t+Z0ZN7FY4LlmWc4FNI922V7cvX28zctN8dQ==} engines: {node: ^14.17.0 || >=16.0.0} peerDependencies: eslint: '>=6.0.0' dependencies: debug: 4.3.4 - eslint: 8.30.0 + eslint: 8.31.0 eslint-scope: 7.1.1 eslint-visitor-keys: 3.3.0 espree: 9.4.1 @@ -5533,14 +6281,14 @@ packages: he: 1.2.0 dev: true - /vue-tsc/1.0.16_typescript@4.9.4: - resolution: {integrity: sha512-yZaiJBbcKR1rSLhiF9KryAFH7R63po+N/invr2EAHGXxMzZksE5j1zyQKvrYiqK47ZHLAlCR+re/PHqWp/UzTg==} + /vue-tsc/1.0.22_typescript@4.9.4: + resolution: {integrity: sha512-xSxwgWR3czhv7sLKHWu6lzj9Xq6AtsCURVL45AY4TLGFszv2L2YlMgygXvqslyCM5bz9cyoIKSaZnzHqHTHjzA==} hasBin: true peerDependencies: typescript: '*' dependencies: - '@volar/vue-language-core': 1.0.16 - '@volar/vue-typescript': 1.0.16 + '@volar/vue-language-core': 1.0.22 + '@volar/vue-typescript': 1.0.22 typescript: 4.9.4 dev: true @@ -5566,10 +6314,24 @@ packages: '@vue/server-renderer': 3.2.45_vue@3.2.45 '@vue/shared': 3.2.45 + /vxe-table/4.3.7_vue@3.2.45+xe-utils@3.5.7: + resolution: {integrity: sha512-v+d7eEQ5uqtVTQCts4xkW0S15LZcIuEukYHGXI53SdoUj2gLFggPYAxQr1y659CM/ESRWPz9LNVHpd97KkjGHw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/vxe-table/-/vxe-table-4.3.7.tgz} + peerDependencies: + vue: ^3.2.28 + xe-utils: ^3.5.0 + dependencies: + vue: 3.2.45 + xe-utils: 3.5.7 + dev: false + /web-storage-cache/1.1.1: resolution: {integrity: sha512-D0MieGooOs8RpsrK+vnejXnvh4OOv/+lTFB35JRkJJQt+uOjPE08XpaE0QBLMTRu47B1KGT/Nq3Gbag3Orinzw==} dev: false + /webidl-conversions/3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz} + dev: true + /webpack-sources/3.2.3: resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} engines: {node: '>=10.13.0'} @@ -5579,6 +6341,13 @@ packages: resolution: {integrity: sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw==} dev: true + /whatwg-url/5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/whatwg-url/-/whatwg-url-5.0.0.tgz} + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + dev: true + /which-module/2.0.0: resolution: {integrity: sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==} dev: false @@ -5617,7 +6386,7 @@ packages: resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} engines: {node: '>=8'} dependencies: - ansi-styles: registry.npmmirror.com/ansi-styles/4.3.0 + ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 @@ -5686,7 +6455,7 @@ packages: resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} engines: {node: '>=6'} dependencies: - camelcase: registry.npmmirror.com/camelcase/5.3.1 + camelcase: 5.3.1 decamelize: 1.2.0 dev: false @@ -5740,1398 +6509,8 @@ packages: engines: {node: '>=10'} dev: true - registry.npmmirror.com/@ampproject/remapping/2.2.0: - resolution: {integrity: sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@ampproject/remapping/-/remapping-2.2.0.tgz} - name: '@ampproject/remapping' - version: 2.2.0 - engines: {node: '>=6.0.0'} + /zrender/5.4.1: + resolution: {integrity: sha512-M4Z05BHWtajY2241EmMPHglDQAJ1UyHQcYsxDNzD9XLSkPDqMq4bB28v9Pb4mvHnVQ0GxyTklZ/69xCFP6RXBA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/zrender/-/zrender-5.4.1.tgz} dependencies: - '@jridgewell/gen-mapping': registry.npmmirror.com/@jridgewell/gen-mapping/0.1.1 - '@jridgewell/trace-mapping': registry.npmmirror.com/@jridgewell/trace-mapping/0.3.17 - dev: true - - registry.npmmirror.com/@antfu/utils/0.7.2: - resolution: {integrity: sha512-vy9fM3pIxZmX07dL+VX1aZe7ynZ+YyB0jY+jE6r3hOK6GNY2t6W8rzpFC4tgpbXUYABkFQwgJq2XYXlxbXAI0g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@antfu/utils/-/utils-0.7.2.tgz} - name: '@antfu/utils' - version: 0.7.2 - dev: true - - registry.npmmirror.com/@babel/code-frame/7.18.6: - resolution: {integrity: sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.18.6.tgz} - name: '@babel/code-frame' - version: 7.18.6 - engines: {node: '>=6.9.0'} - dependencies: - '@babel/highlight': registry.npmmirror.com/@babel/highlight/7.18.6 - dev: true - - registry.npmmirror.com/@babel/compat-data/7.20.1: - resolution: {integrity: sha512-EWZ4mE2diW3QALKvDMiXnbZpRvlj+nayZ112nK93SnhqOtpdsbVD4W+2tEoT3YNBAG9RBR0ISY758ZkOgsn6pQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.20.1.tgz} - name: '@babel/compat-data' - version: 7.20.1 - engines: {node: '>=6.9.0'} - dev: true - - registry.npmmirror.com/@babel/core/7.20.5: - resolution: {integrity: sha512-UdOWmk4pNWTm/4DlPUl/Pt4Gz4rcEMb7CY0Y3eJl5Yz1vI8ZJGmHWaVE55LoxRjdpx0z259GE9U5STA9atUinQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/core/-/core-7.20.5.tgz} - name: '@babel/core' - version: 7.20.5 - engines: {node: '>=6.9.0'} - dependencies: - '@ampproject/remapping': registry.npmmirror.com/@ampproject/remapping/2.2.0 - '@babel/code-frame': registry.npmmirror.com/@babel/code-frame/7.18.6 - '@babel/generator': registry.npmmirror.com/@babel/generator/7.20.5 - '@babel/helper-compilation-targets': registry.npmmirror.com/@babel/helper-compilation-targets/7.20.0_@babel+core@7.20.5 - '@babel/helper-module-transforms': registry.npmmirror.com/@babel/helper-module-transforms/7.20.2 - '@babel/helpers': registry.npmmirror.com/@babel/helpers/7.20.6 - '@babel/parser': registry.npmmirror.com/@babel/parser/7.20.5 - '@babel/template': registry.npmmirror.com/@babel/template/7.18.10 - '@babel/traverse': registry.npmmirror.com/@babel/traverse/7.20.5 - '@babel/types': registry.npmmirror.com/@babel/types/7.20.5 - convert-source-map: registry.npmmirror.com/convert-source-map/1.9.0 - debug: 4.3.4 - gensync: registry.npmmirror.com/gensync/1.0.0-beta.2 - json5: registry.npmmirror.com/json5/2.2.1 - semver: registry.npmmirror.com/semver/6.3.0 - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmmirror.com/@babel/generator/7.20.5: - resolution: {integrity: sha512-jl7JY2Ykn9S0yj4DQP82sYvPU+T3g0HFcWTqDLqiuA9tGRNIj9VfbtXGAYTTkyNEnQk1jkMGOdYka8aG/lulCA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/generator/-/generator-7.20.5.tgz} - name: '@babel/generator' - version: 7.20.5 - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': registry.npmmirror.com/@babel/types/7.20.5 - '@jridgewell/gen-mapping': registry.npmmirror.com/@jridgewell/gen-mapping/0.3.2 - jsesc: registry.npmmirror.com/jsesc/2.5.2 - dev: true - - registry.npmmirror.com/@babel/helper-annotate-as-pure/7.18.6: - resolution: {integrity: sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz} - name: '@babel/helper-annotate-as-pure' - version: 7.18.6 - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': registry.npmmirror.com/@babel/types/7.20.5 - dev: true - - registry.npmmirror.com/@babel/helper-compilation-targets/7.20.0_@babel+core@7.20.5: - resolution: {integrity: sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz} - id: registry.npmmirror.com/@babel/helper-compilation-targets/7.20.0 - name: '@babel/helper-compilation-targets' - version: 7.20.0 - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/compat-data': registry.npmmirror.com/@babel/compat-data/7.20.1 - '@babel/core': registry.npmmirror.com/@babel/core/7.20.5 - '@babel/helper-validator-option': registry.npmmirror.com/@babel/helper-validator-option/7.18.6 - browserslist: registry.npmmirror.com/browserslist/4.21.4 - semver: registry.npmmirror.com/semver/6.3.0 - dev: true - - registry.npmmirror.com/@babel/helper-create-class-features-plugin/7.20.2_@babel+core@7.20.5: - resolution: {integrity: sha512-k22GoYRAHPYr9I+Gvy2ZQlAe5mGy8BqWst2wRt8cwIufWTxrsVshhIBvYNqC80N0GSFWTsqRVexOtfzlgOEDvA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.2.tgz} - id: registry.npmmirror.com/@babel/helper-create-class-features-plugin/7.20.2 - name: '@babel/helper-create-class-features-plugin' - version: 7.20.2 - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': registry.npmmirror.com/@babel/core/7.20.5 - '@babel/helper-annotate-as-pure': registry.npmmirror.com/@babel/helper-annotate-as-pure/7.18.6 - '@babel/helper-environment-visitor': registry.npmmirror.com/@babel/helper-environment-visitor/7.18.9 - '@babel/helper-function-name': registry.npmmirror.com/@babel/helper-function-name/7.19.0 - '@babel/helper-member-expression-to-functions': registry.npmmirror.com/@babel/helper-member-expression-to-functions/7.18.9 - '@babel/helper-optimise-call-expression': registry.npmmirror.com/@babel/helper-optimise-call-expression/7.18.6 - '@babel/helper-replace-supers': registry.npmmirror.com/@babel/helper-replace-supers/7.19.1 - '@babel/helper-split-export-declaration': registry.npmmirror.com/@babel/helper-split-export-declaration/7.18.6 - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmmirror.com/@babel/helper-environment-visitor/7.18.9: - resolution: {integrity: sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz} - name: '@babel/helper-environment-visitor' - version: 7.18.9 - engines: {node: '>=6.9.0'} - dev: true - - registry.npmmirror.com/@babel/helper-function-name/7.19.0: - resolution: {integrity: sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz} - name: '@babel/helper-function-name' - version: 7.19.0 - engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': registry.npmmirror.com/@babel/template/7.18.10 - '@babel/types': registry.npmmirror.com/@babel/types/7.20.5 - dev: true - - registry.npmmirror.com/@babel/helper-hoist-variables/7.18.6: - resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz} - name: '@babel/helper-hoist-variables' - version: 7.18.6 - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': registry.npmmirror.com/@babel/types/7.20.5 - dev: true - - registry.npmmirror.com/@babel/helper-member-expression-to-functions/7.18.9: - resolution: {integrity: sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz} - name: '@babel/helper-member-expression-to-functions' - version: 7.18.9 - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': registry.npmmirror.com/@babel/types/7.20.5 - dev: true - - registry.npmmirror.com/@babel/helper-module-imports/7.18.6: - resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz} - name: '@babel/helper-module-imports' - version: 7.18.6 - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': registry.npmmirror.com/@babel/types/7.20.5 - dev: true - - registry.npmmirror.com/@babel/helper-module-transforms/7.20.2: - resolution: {integrity: sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz} - name: '@babel/helper-module-transforms' - version: 7.20.2 - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-environment-visitor': registry.npmmirror.com/@babel/helper-environment-visitor/7.18.9 - '@babel/helper-module-imports': registry.npmmirror.com/@babel/helper-module-imports/7.18.6 - '@babel/helper-simple-access': registry.npmmirror.com/@babel/helper-simple-access/7.20.2 - '@babel/helper-split-export-declaration': registry.npmmirror.com/@babel/helper-split-export-declaration/7.18.6 - '@babel/helper-validator-identifier': registry.npmmirror.com/@babel/helper-validator-identifier/7.19.1 - '@babel/template': registry.npmmirror.com/@babel/template/7.18.10 - '@babel/traverse': registry.npmmirror.com/@babel/traverse/7.20.5 - '@babel/types': registry.npmmirror.com/@babel/types/7.20.5 - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmmirror.com/@babel/helper-optimise-call-expression/7.18.6: - resolution: {integrity: sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz} - name: '@babel/helper-optimise-call-expression' - version: 7.18.6 - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': registry.npmmirror.com/@babel/types/7.20.5 - dev: true - - registry.npmmirror.com/@babel/helper-plugin-utils/7.20.2: - resolution: {integrity: sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz} - name: '@babel/helper-plugin-utils' - version: 7.20.2 - engines: {node: '>=6.9.0'} - dev: true - - registry.npmmirror.com/@babel/helper-replace-supers/7.19.1: - resolution: {integrity: sha512-T7ahH7wV0Hfs46SFh5Jz3s0B6+o8g3c+7TMxu7xKfmHikg7EAZ3I2Qk9LFhjxXq8sL7UkP5JflezNwoZa8WvWw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/helper-replace-supers/-/helper-replace-supers-7.19.1.tgz} - name: '@babel/helper-replace-supers' - version: 7.19.1 - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-environment-visitor': registry.npmmirror.com/@babel/helper-environment-visitor/7.18.9 - '@babel/helper-member-expression-to-functions': registry.npmmirror.com/@babel/helper-member-expression-to-functions/7.18.9 - '@babel/helper-optimise-call-expression': registry.npmmirror.com/@babel/helper-optimise-call-expression/7.18.6 - '@babel/traverse': registry.npmmirror.com/@babel/traverse/7.20.5 - '@babel/types': registry.npmmirror.com/@babel/types/7.20.5 - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmmirror.com/@babel/helper-simple-access/7.20.2: - resolution: {integrity: sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz} - name: '@babel/helper-simple-access' - version: 7.20.2 - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': registry.npmmirror.com/@babel/types/7.20.5 - dev: true - - registry.npmmirror.com/@babel/helper-split-export-declaration/7.18.6: - resolution: {integrity: sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz} - name: '@babel/helper-split-export-declaration' - version: 7.18.6 - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': registry.npmmirror.com/@babel/types/7.20.5 - dev: true - - registry.npmmirror.com/@babel/helper-string-parser/7.19.4: - resolution: {integrity: sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz} - name: '@babel/helper-string-parser' - version: 7.19.4 - engines: {node: '>=6.9.0'} - - registry.npmmirror.com/@babel/helper-validator-identifier/7.19.1: - resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz} - name: '@babel/helper-validator-identifier' - version: 7.19.1 - engines: {node: '>=6.9.0'} - - registry.npmmirror.com/@babel/helper-validator-option/7.18.6: - resolution: {integrity: sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz} - name: '@babel/helper-validator-option' - version: 7.18.6 - engines: {node: '>=6.9.0'} - dev: true - - registry.npmmirror.com/@babel/helpers/7.20.6: - resolution: {integrity: sha512-Pf/OjgfgFRW5bApskEz5pvidpim7tEDPlFtKcNRXWmfHGn9IEI2W2flqRQXTFb7gIPTyK++N6rVHuwKut4XK6w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/helpers/-/helpers-7.20.6.tgz} - name: '@babel/helpers' - version: 7.20.6 - engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': registry.npmmirror.com/@babel/template/7.18.10 - '@babel/traverse': registry.npmmirror.com/@babel/traverse/7.20.5 - '@babel/types': registry.npmmirror.com/@babel/types/7.20.5 - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmmirror.com/@babel/highlight/7.18.6: - resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/highlight/-/highlight-7.18.6.tgz} - name: '@babel/highlight' - version: 7.18.6 - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-validator-identifier': registry.npmmirror.com/@babel/helper-validator-identifier/7.19.1 - chalk: 2.4.2 - js-tokens: registry.npmmirror.com/js-tokens/4.0.0 - dev: true - - registry.npmmirror.com/@babel/parser/7.20.5: - resolution: {integrity: sha512-r27t/cy/m9uKLXQNWWebeCUHgnAZq0CpG1OwKRxzJMP1vpSU4bSIK2hq+/cp0bQxetkXx38n09rNu8jVkcK/zA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/parser/-/parser-7.20.5.tgz} - name: '@babel/parser' - version: 7.20.5 - engines: {node: '>=6.0.0'} - hasBin: true - dependencies: - '@babel/types': registry.npmmirror.com/@babel/types/7.20.5 - - registry.npmmirror.com/@babel/plugin-syntax-jsx/7.18.6_@babel+core@7.20.5: - resolution: {integrity: sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz} - id: registry.npmmirror.com/@babel/plugin-syntax-jsx/7.18.6 - name: '@babel/plugin-syntax-jsx' - version: 7.18.6 - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': registry.npmmirror.com/@babel/core/7.20.5 - '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils/7.20.2 - dev: true - - registry.npmmirror.com/@babel/plugin-syntax-typescript/7.20.0_@babel+core@7.20.5: - resolution: {integrity: sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz} - id: registry.npmmirror.com/@babel/plugin-syntax-typescript/7.20.0 - name: '@babel/plugin-syntax-typescript' - version: 7.20.0 - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': registry.npmmirror.com/@babel/core/7.20.5 - '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils/7.20.2 - dev: true - - registry.npmmirror.com/@babel/plugin-transform-typescript/7.20.2_@babel+core@7.20.5: - resolution: {integrity: sha512-jvS+ngBfrnTUBfOQq8NfGnSbF9BrqlR6hjJ2yVxMkmO5nL/cdifNbI30EfjRlN4g5wYWNnMPyj5Sa6R1pbLeag==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.20.2.tgz} - id: registry.npmmirror.com/@babel/plugin-transform-typescript/7.20.2 - name: '@babel/plugin-transform-typescript' - version: 7.20.2 - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': registry.npmmirror.com/@babel/core/7.20.5 - '@babel/helper-create-class-features-plugin': registry.npmmirror.com/@babel/helper-create-class-features-plugin/7.20.2_@babel+core@7.20.5 - '@babel/helper-plugin-utils': registry.npmmirror.com/@babel/helper-plugin-utils/7.20.2 - '@babel/plugin-syntax-typescript': registry.npmmirror.com/@babel/plugin-syntax-typescript/7.20.0_@babel+core@7.20.5 - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmmirror.com/@babel/standalone/7.20.6: - resolution: {integrity: sha512-u5at/CbBLETf7kx2LOY4XdhseD79Y099WZKAOMXeT8qvd9OSR515my2UNBBLY4qIht/Qi9KySeQHQwQwxJN4Sw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/standalone/-/standalone-7.20.6.tgz} - name: '@babel/standalone' - version: 7.20.6 - engines: {node: '>=6.9.0'} - dev: true - - registry.npmmirror.com/@babel/template/7.18.10: - resolution: {integrity: sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/template/-/template-7.18.10.tgz} - name: '@babel/template' - version: 7.18.10 - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': registry.npmmirror.com/@babel/code-frame/7.18.6 - '@babel/parser': registry.npmmirror.com/@babel/parser/7.20.5 - '@babel/types': registry.npmmirror.com/@babel/types/7.20.5 - dev: true - - registry.npmmirror.com/@babel/traverse/7.20.1: - resolution: {integrity: sha512-d3tN8fkVJwFLkHkBN479SOsw4DMZnz8cdbL/gvuDuzy3TS6Nfw80HuQqhw1pITbIruHyh7d1fMA47kWzmcUEGA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/traverse/-/traverse-7.20.1.tgz} - name: '@babel/traverse' - version: 7.20.1 - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': registry.npmmirror.com/@babel/code-frame/7.18.6 - '@babel/generator': registry.npmmirror.com/@babel/generator/7.20.5 - '@babel/helper-environment-visitor': registry.npmmirror.com/@babel/helper-environment-visitor/7.18.9 - '@babel/helper-function-name': registry.npmmirror.com/@babel/helper-function-name/7.19.0 - '@babel/helper-hoist-variables': registry.npmmirror.com/@babel/helper-hoist-variables/7.18.6 - '@babel/helper-split-export-declaration': registry.npmmirror.com/@babel/helper-split-export-declaration/7.18.6 - '@babel/parser': registry.npmmirror.com/@babel/parser/7.20.5 - '@babel/types': registry.npmmirror.com/@babel/types/7.20.5 - debug: 4.3.4 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmmirror.com/@babel/traverse/7.20.5: - resolution: {integrity: sha512-WM5ZNN3JITQIq9tFZaw1ojLU3WgWdtkxnhM1AegMS+PvHjkM5IXjmYEGY7yukz5XS4sJyEf2VzWjI8uAavhxBQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/traverse/-/traverse-7.20.5.tgz} - name: '@babel/traverse' - version: 7.20.5 - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': registry.npmmirror.com/@babel/code-frame/7.18.6 - '@babel/generator': registry.npmmirror.com/@babel/generator/7.20.5 - '@babel/helper-environment-visitor': registry.npmmirror.com/@babel/helper-environment-visitor/7.18.9 - '@babel/helper-function-name': registry.npmmirror.com/@babel/helper-function-name/7.19.0 - '@babel/helper-hoist-variables': registry.npmmirror.com/@babel/helper-hoist-variables/7.18.6 - '@babel/helper-split-export-declaration': registry.npmmirror.com/@babel/helper-split-export-declaration/7.18.6 - '@babel/parser': registry.npmmirror.com/@babel/parser/7.20.5 - '@babel/types': registry.npmmirror.com/@babel/types/7.20.5 - debug: 4.3.4 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmmirror.com/@babel/types/7.20.2: - resolution: {integrity: sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/types/-/types-7.20.2.tgz} - name: '@babel/types' - version: 7.20.2 - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-string-parser': registry.npmmirror.com/@babel/helper-string-parser/7.19.4 - '@babel/helper-validator-identifier': registry.npmmirror.com/@babel/helper-validator-identifier/7.19.1 - to-fast-properties: registry.npmmirror.com/to-fast-properties/2.0.0 - dev: true - - registry.npmmirror.com/@babel/types/7.20.5: - resolution: {integrity: sha512-c9fst/h2/dcF7H+MJKZ2T0KjEQ8hY/BNnDk/H3XY8C4Aw/eWQXWn/lWntHF9ooUBnGmEvbfGrTgLWc+um0YDUg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/types/-/types-7.20.5.tgz} - name: '@babel/types' - version: 7.20.5 - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-string-parser': registry.npmmirror.com/@babel/helper-string-parser/7.19.4 - '@babel/helper-validator-identifier': registry.npmmirror.com/@babel/helper-validator-identifier/7.19.1 - to-fast-properties: registry.npmmirror.com/to-fast-properties/2.0.0 - - registry.npmmirror.com/@iconify/iconify/2.1.2: - resolution: {integrity: sha512-QcUzFeEWkE/mW+BVtEGmcWATClcCOIJFiYUD/PiCWuTcdEA297o8D4oN6Ra44WrNOHu1wqNW4J0ioaDIiqaFOQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@iconify/iconify/-/iconify-2.1.2.tgz} - name: '@iconify/iconify' - version: 2.1.2 - dependencies: - cross-fetch: registry.npmmirror.com/cross-fetch/3.1.5 - transitivePeerDependencies: - - encoding - dev: true - - registry.npmmirror.com/@iconify/iconify/3.0.1: - resolution: {integrity: sha512-OPqVBTh8YsfrYZRVFv3OkmFNLqacM0dy/Oiw1h2wO+RZW5LieNGHlG2f9pzaeVRFWbEB8LHTeo8mcwgUTUbibQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@iconify/iconify/-/iconify-3.0.1.tgz} - name: '@iconify/iconify' - version: 3.0.1 - dependencies: - '@iconify/types': 2.0.0 - dev: true - - registry.npmmirror.com/@jridgewell/gen-mapping/0.1.1: - resolution: {integrity: sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz} - name: '@jridgewell/gen-mapping' - version: 0.1.1 - engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/set-array': registry.npmmirror.com/@jridgewell/set-array/1.1.2 - '@jridgewell/sourcemap-codec': registry.npmmirror.com/@jridgewell/sourcemap-codec/1.4.14 - dev: true - - registry.npmmirror.com/@jridgewell/gen-mapping/0.3.2: - resolution: {integrity: sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz} - name: '@jridgewell/gen-mapping' - version: 0.3.2 - engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/set-array': registry.npmmirror.com/@jridgewell/set-array/1.1.2 - '@jridgewell/sourcemap-codec': registry.npmmirror.com/@jridgewell/sourcemap-codec/1.4.14 - '@jridgewell/trace-mapping': registry.npmmirror.com/@jridgewell/trace-mapping/0.3.17 - dev: true - - registry.npmmirror.com/@jridgewell/resolve-uri/3.1.0: - resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz} - name: '@jridgewell/resolve-uri' - version: 3.1.0 - engines: {node: '>=6.0.0'} - dev: true - - registry.npmmirror.com/@jridgewell/set-array/1.1.2: - resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@jridgewell/set-array/-/set-array-1.1.2.tgz} - name: '@jridgewell/set-array' - version: 1.1.2 - engines: {node: '>=6.0.0'} - dev: true - - registry.npmmirror.com/@jridgewell/sourcemap-codec/1.4.14: - resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz} - name: '@jridgewell/sourcemap-codec' - version: 1.4.14 - dev: true - - registry.npmmirror.com/@jridgewell/trace-mapping/0.3.17: - resolution: {integrity: sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz} - name: '@jridgewell/trace-mapping' - version: 0.3.17 - dependencies: - '@jridgewell/resolve-uri': registry.npmmirror.com/@jridgewell/resolve-uri/3.1.0 - '@jridgewell/sourcemap-codec': registry.npmmirror.com/@jridgewell/sourcemap-codec/1.4.14 - dev: true - - registry.npmmirror.com/@jridgewell/trace-mapping/0.3.9: - resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz} - name: '@jridgewell/trace-mapping' - version: 0.3.9 - dependencies: - '@jridgewell/resolve-uri': registry.npmmirror.com/@jridgewell/resolve-uri/3.1.0 - '@jridgewell/sourcemap-codec': registry.npmmirror.com/@jridgewell/sourcemap-codec/1.4.14 - dev: true - - registry.npmmirror.com/@nodelib/fs.stat/2.0.5: - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz} - name: '@nodelib/fs.stat' - version: 2.0.5 - engines: {node: '>= 8'} - dev: true - - registry.npmmirror.com/@purge-icons/core/0.9.1: - resolution: {integrity: sha512-sx8/a30MbbqQVEqhuMPE1wJpdVRRbEmwEPZpFzVkcDixzX4p+R2A0WVxqkb0xfHUBAVQwrSE2SeAyniIQLqbLw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@purge-icons/core/-/core-0.9.1.tgz} - name: '@purge-icons/core' - version: 0.9.1 - dependencies: - '@iconify/iconify': registry.npmmirror.com/@iconify/iconify/2.1.2 - axios: registry.npmmirror.com/axios/0.26.1_debug@4.3.4 - debug: 4.3.4 - fast-glob: registry.npmmirror.com/fast-glob/3.2.12 - fs-extra: registry.npmmirror.com/fs-extra/10.1.0 - transitivePeerDependencies: - - encoding - - supports-color - dev: true - - registry.npmmirror.com/@purge-icons/generated/0.9.0: - resolution: {integrity: sha512-s2t+1oVtGDV6KtqfCXtUOhxfeYvOdDF90IVm+nMs/6bUP0HeGZLslguuL/AibpwtfL4FA/oCsIu/RhwapgAdJw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@purge-icons/generated/-/generated-0.9.0.tgz} - name: '@purge-icons/generated' - version: 0.9.0 - dependencies: - '@iconify/iconify': registry.npmmirror.com/@iconify/iconify/3.0.1 - dev: true - - registry.npmmirror.com/@vitejs/plugin-legacy/3.0.1_terser@5.16.1+vite@4.0.3: - resolution: {integrity: sha512-XCtEjxoR3rmy000ujYRBp5kggWqzHz9+F20/yIMUWOzbvu0+KW1e14Fvb8h7SpNn+bfjGW1RiAs1Vrgb7Js+iQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@vitejs/plugin-legacy/-/plugin-legacy-3.0.1.tgz} - id: registry.npmmirror.com/@vitejs/plugin-legacy/3.0.1 - name: '@vitejs/plugin-legacy' - version: 3.0.1 - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - terser: ^5.4.0 - vite: ^4.0.0 - dependencies: - '@babel/standalone': registry.npmmirror.com/@babel/standalone/7.20.6 - core-js: registry.npmmirror.com/core-js/3.26.1 - magic-string: registry.npmmirror.com/magic-string/0.27.0 - regenerator-runtime: registry.npmmirror.com/regenerator-runtime/0.13.11 - systemjs: registry.npmmirror.com/systemjs/6.13.0 - terser: 5.16.1 - vite: 4.0.3_amyfslv6hdwxqbf7f4ldebbtce - dev: true - - registry.npmmirror.com/@vitejs/plugin-vue-jsx/3.0.0_vite@4.0.3+vue@3.2.45: - resolution: {integrity: sha512-vurkuzgac5SYuxd2HUZqAFAWGTF10diKBwJNbCvnWijNZfXd+7jMtqjPFbGt7idOJUn584fP1Ar9j/GN2jQ3Ew==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@vitejs/plugin-vue-jsx/-/plugin-vue-jsx-3.0.0.tgz} - id: registry.npmmirror.com/@vitejs/plugin-vue-jsx/3.0.0 - name: '@vitejs/plugin-vue-jsx' - version: 3.0.0 - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - vite: ^4.0.0 - vue: ^3.0.0 - dependencies: - '@babel/core': registry.npmmirror.com/@babel/core/7.20.5 - '@babel/plugin-transform-typescript': registry.npmmirror.com/@babel/plugin-transform-typescript/7.20.2_@babel+core@7.20.5 - '@vue/babel-plugin-jsx': registry.npmmirror.com/@vue/babel-plugin-jsx/1.1.1_@babel+core@7.20.5 - vite: 4.0.3_amyfslv6hdwxqbf7f4ldebbtce - vue: 3.2.45 - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmmirror.com/@vitejs/plugin-vue/4.0.0_vite@4.0.3+vue@3.2.45: - resolution: {integrity: sha512-e0X4jErIxAB5oLtDqbHvHpJe/uWNkdpYV83AOG2xo2tEVSzCzewgJMtREZM30wXnM5ls90hxiOtAuVU6H5JgbA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-4.0.0.tgz} - id: registry.npmmirror.com/@vitejs/plugin-vue/4.0.0 - name: '@vitejs/plugin-vue' - version: 4.0.0 - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - vite: ^4.0.0 - vue: ^3.2.25 - dependencies: - vite: 4.0.3_amyfslv6hdwxqbf7f4ldebbtce - vue: 3.2.45 - dev: true - - registry.npmmirror.com/@vue/babel-helper-vue-transform-on/1.0.2: - resolution: {integrity: sha512-hz4R8tS5jMn8lDq6iD+yWL6XNB699pGIVLk7WSJnn1dbpjaazsjZQkieJoRX6gW5zpYSCFqQ7jUquPNY65tQYA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.0.2.tgz} - name: '@vue/babel-helper-vue-transform-on' - version: 1.0.2 - dev: true - - registry.npmmirror.com/@vue/babel-plugin-jsx/1.1.1_@babel+core@7.20.5: - resolution: {integrity: sha512-j2uVfZjnB5+zkcbc/zsOc0fSNGCMMjaEXP52wdwdIfn0qjFfEYpYZBFKFg+HHnQeJCVrjOeO0YxgaL7DMrym9w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.1.1.tgz} - id: registry.npmmirror.com/@vue/babel-plugin-jsx/1.1.1 - name: '@vue/babel-plugin-jsx' - version: 1.1.1 - dependencies: - '@babel/helper-module-imports': registry.npmmirror.com/@babel/helper-module-imports/7.18.6 - '@babel/plugin-syntax-jsx': registry.npmmirror.com/@babel/plugin-syntax-jsx/7.18.6_@babel+core@7.20.5 - '@babel/template': registry.npmmirror.com/@babel/template/7.18.10 - '@babel/traverse': registry.npmmirror.com/@babel/traverse/7.20.1 - '@babel/types': registry.npmmirror.com/@babel/types/7.20.2 - '@vue/babel-helper-vue-transform-on': registry.npmmirror.com/@vue/babel-helper-vue-transform-on/1.0.2 - camelcase: registry.npmmirror.com/camelcase/6.3.0 - html-tags: registry.npmmirror.com/html-tags/3.2.0 - svg-tags: registry.npmmirror.com/svg-tags/1.0.0 - transitivePeerDependencies: - - '@babel/core' - - supports-color - dev: true - - registry.npmmirror.com/@vue/compiler-core/3.2.45: - resolution: {integrity: sha512-rcMj7H+PYe5wBV3iYeUgbCglC+pbpN8hBLTJvRiK2eKQiWqu+fG9F+8sW99JdL4LQi7Re178UOxn09puSXvn4A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.2.45.tgz} - name: '@vue/compiler-core' - version: 3.2.45 - dependencies: - '@babel/parser': registry.npmmirror.com/@babel/parser/7.20.5 - '@vue/shared': registry.npmmirror.com/@vue/shared/3.2.45 - estree-walker: registry.npmmirror.com/estree-walker/2.0.2 - source-map: 0.6.1 - - registry.npmmirror.com/@vue/compiler-dom/3.2.45: - resolution: {integrity: sha512-tyYeUEuKqqZO137WrZkpwfPCdiiIeXYCcJ8L4gWz9vqaxzIQRccTSwSWZ/Axx5YR2z+LvpUbmPNXxuBU45lyRw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.2.45.tgz} - name: '@vue/compiler-dom' - version: 3.2.45 - dependencies: - '@vue/compiler-core': registry.npmmirror.com/@vue/compiler-core/3.2.45 - '@vue/shared': registry.npmmirror.com/@vue/shared/3.2.45 - - registry.npmmirror.com/@vue/devtools-api/6.4.5: - resolution: {integrity: sha512-JD5fcdIuFxU4fQyXUu3w2KpAJHzTVdN+p4iOX2lMWSHMOoQdMAcpFLZzm9Z/2nmsoZ1a96QEhZ26e50xLBsgOQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-6.4.5.tgz} - name: '@vue/devtools-api' - version: 6.4.5 - dev: false - - registry.npmmirror.com/@vue/reactivity/3.2.45: - resolution: {integrity: sha512-PRvhCcQcyEVohW0P8iQ7HDcIOXRjZfAsOds3N99X/Dzewy8TVhTCT4uXpAHfoKjVTJRA0O0K+6QNkDIZAxNi3A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.2.45.tgz} - name: '@vue/reactivity' - version: 3.2.45 - dependencies: - '@vue/shared': registry.npmmirror.com/@vue/shared/3.2.45 - - registry.npmmirror.com/@vue/shared/3.2.45: - resolution: {integrity: sha512-Ewzq5Yhimg7pSztDV+RH1UDKBzmtqieXQlpTVm2AwraoRL/Rks96mvd8Vgi7Lj+h+TH8dv7mXD3FRZR3TUvbSg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@vue/shared/-/shared-3.2.45.tgz} - name: '@vue/shared' - version: 3.2.45 - - registry.npmmirror.com/@windicss/config/1.8.10: - resolution: {integrity: sha512-O9SsC110b1Ik3YYa4Ck/0TWuCo7YFfA9KDrwD5sAeqscT5COIGK1HszdCT3oh0MJFej2wNrvpfyW9h6yQaW6PA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@windicss/config/-/config-1.8.10.tgz} - name: '@windicss/config' - version: 1.8.10 - dependencies: - debug: 4.3.4 - jiti: registry.npmmirror.com/jiti/1.16.0 - windicss: registry.npmmirror.com/windicss/3.5.6 - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmmirror.com/@windicss/plugin-utils/1.8.10: - resolution: {integrity: sha512-Phqk5OW1w+Mv+ry6t7BzAeDq3aMhbI94gR49j9vQCufFfDGCHndhhjtMK0sBv+NPJUsIAIh6qayb1iwBCXUGrw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@windicss/plugin-utils/-/plugin-utils-1.8.10.tgz} - name: '@windicss/plugin-utils' - version: 1.8.10 - dependencies: - '@antfu/utils': registry.npmmirror.com/@antfu/utils/0.7.2 - '@windicss/config': registry.npmmirror.com/@windicss/config/1.8.10 - debug: 4.3.4 - fast-glob: registry.npmmirror.com/fast-glob/3.2.12 - magic-string: registry.npmmirror.com/magic-string/0.27.0 - micromatch: registry.npmmirror.com/micromatch/4.0.5 - windicss: registry.npmmirror.com/windicss/3.5.6 - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmmirror.com/ansi-styles/2.2.1: - resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/ansi-styles/-/ansi-styles-2.2.1.tgz} - name: ansi-styles - version: 2.2.1 - engines: {node: '>=0.10.0'} - dev: true - - registry.npmmirror.com/ansi-styles/3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz} - name: ansi-styles - version: 3.2.1 - engines: {node: '>=4'} - dependencies: - color-convert: registry.npmmirror.com/color-convert/1.9.3 - dev: true - - registry.npmmirror.com/ansi-styles/4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz} - name: ansi-styles - version: 4.3.0 - engines: {node: '>=8'} - dependencies: - color-convert: registry.npmmirror.com/color-convert/2.0.1 - - registry.npmmirror.com/axios/0.26.1_debug@4.3.4: - resolution: {integrity: sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/axios/-/axios-0.26.1.tgz} - id: registry.npmmirror.com/axios/0.26.1 - name: axios - version: 0.26.1 - dependencies: - follow-redirects: registry.npmmirror.com/follow-redirects/1.15.2_debug@4.3.4 - transitivePeerDependencies: - - debug - dev: true - - registry.npmmirror.com/braces/2.3.2: - resolution: {integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/braces/-/braces-2.3.2.tgz} - name: braces - version: 2.3.2 - engines: {node: '>=0.10.0'} - dependencies: - arr-flatten: 1.1.0 - array-unique: 0.3.2 - extend-shallow: 2.0.1 - fill-range: registry.npmmirror.com/fill-range/4.0.0 - isobject: 3.0.1 - repeat-element: 1.1.4 - snapdragon: 0.8.2 - snapdragon-node: 2.1.1 - split-string: 3.1.0 - to-regex: 3.0.2 - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmmirror.com/braces/3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/braces/-/braces-3.0.2.tgz} - name: braces - version: 3.0.2 - engines: {node: '>=8'} - dependencies: - fill-range: registry.npmmirror.com/fill-range/7.0.1 - dev: true - - registry.npmmirror.com/browserslist/4.21.4: - resolution: {integrity: sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/browserslist/-/browserslist-4.21.4.tgz} - name: browserslist - version: 4.21.4 - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true - dependencies: - caniuse-lite: registry.npmmirror.com/caniuse-lite/1.0.30001431 - electron-to-chromium: registry.npmmirror.com/electron-to-chromium/1.4.284 - node-releases: registry.npmmirror.com/node-releases/2.0.6 - update-browserslist-db: registry.npmmirror.com/update-browserslist-db/1.0.10_browserslist@4.21.4 - dev: true - - registry.npmmirror.com/camelcase/5.3.1: - resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/camelcase/-/camelcase-5.3.1.tgz} - name: camelcase - version: 5.3.1 - engines: {node: '>=6'} - - registry.npmmirror.com/camelcase/6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/camelcase/-/camelcase-6.3.0.tgz} - name: camelcase - version: 6.3.0 - engines: {node: '>=10'} - dev: true - - registry.npmmirror.com/caniuse-lite/1.0.30001431: - resolution: {integrity: sha512-zBUoFU0ZcxpvSt9IU66dXVT/3ctO1cy4y9cscs1szkPlcWb6pasYM144GqrUygUbT+k7cmUCW61cvskjcv0enQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001431.tgz} - name: caniuse-lite - version: 1.0.30001431 - dev: true - - registry.npmmirror.com/color-convert/1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz} - name: color-convert - version: 1.9.3 - dependencies: - color-name: registry.npmmirror.com/color-name/1.1.3 - dev: true - - registry.npmmirror.com/color-convert/2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz} - name: color-convert - version: 2.0.1 - engines: {node: '>=7.0.0'} - dependencies: - color-name: registry.npmmirror.com/color-name/1.1.4 - - registry.npmmirror.com/color-name/1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz} - name: color-name - version: 1.1.3 - dev: true - - registry.npmmirror.com/color-name/1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz} - name: color-name - version: 1.1.4 - - registry.npmmirror.com/convert-source-map/1.9.0: - resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/convert-source-map/-/convert-source-map-1.9.0.tgz} - name: convert-source-map - version: 1.9.0 - dev: true - - registry.npmmirror.com/core-js/3.26.1: - resolution: {integrity: sha512-21491RRQVzUn0GGM9Z1Jrpr6PNPxPi+Za8OM9q4tksTSnlbXXGKK1nXNg/QvwFYettXvSX6zWKCtHHfjN4puyA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/core-js/-/core-js-3.26.1.tgz} - name: core-js - version: 3.26.1 - requiresBuild: true - dev: true - - registry.npmmirror.com/cross-fetch/3.1.5: - resolution: {integrity: sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/cross-fetch/-/cross-fetch-3.1.5.tgz} - name: cross-fetch - version: 3.1.5 - dependencies: - node-fetch: registry.npmmirror.com/node-fetch/2.6.7 - transitivePeerDependencies: - - encoding - dev: true - - registry.npmmirror.com/debug/4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz} - name: debug - version: 4.3.4 - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: registry.npmmirror.com/ms/2.1.2 - dev: true - - registry.npmmirror.com/echarts/5.4.1: - resolution: {integrity: sha512-9ltS3M2JB0w2EhcYjCdmtrJ+6haZcW6acBolMGIuf01Hql1yrIV01L1aRj7jsaaIULJslEP9Z3vKlEmnJaWJVQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/echarts/-/echarts-5.4.1.tgz} - name: echarts - version: 5.4.1 - dependencies: - tslib: registry.npmmirror.com/tslib/2.3.0 - zrender: registry.npmmirror.com/zrender/5.4.1 - dev: false - - registry.npmmirror.com/electron-to-chromium/1.4.284: - resolution: {integrity: sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz} - name: electron-to-chromium - version: 1.4.284 - dev: true - - registry.npmmirror.com/escalade/3.1.1: - resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/escalade/-/escalade-3.1.1.tgz} - name: escalade - version: 3.1.1 - engines: {node: '>=6'} - dev: true - - registry.npmmirror.com/estree-walker/2.0.2: - resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz} - name: estree-walker - version: 2.0.2 - - registry.npmmirror.com/fast-glob/3.2.12: - resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/fast-glob/-/fast-glob-3.2.12.tgz} - name: fast-glob - version: 3.2.12 - engines: {node: '>=8.6.0'} - dependencies: - '@nodelib/fs.stat': registry.npmmirror.com/@nodelib/fs.stat/2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: registry.npmmirror.com/merge2/1.4.1 - micromatch: registry.npmmirror.com/micromatch/4.0.5 - dev: true - - registry.npmmirror.com/fill-range/4.0.0: - resolution: {integrity: sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/fill-range/-/fill-range-4.0.0.tgz} - name: fill-range - version: 4.0.0 - engines: {node: '>=0.10.0'} - dependencies: - extend-shallow: 2.0.1 - is-number: registry.npmmirror.com/is-number/3.0.0 - repeat-string: 1.6.1 - to-regex-range: registry.npmmirror.com/to-regex-range/2.1.1 - dev: true - - registry.npmmirror.com/fill-range/7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/fill-range/-/fill-range-7.0.1.tgz} - name: fill-range - version: 7.0.1 - engines: {node: '>=8'} - dependencies: - to-regex-range: registry.npmmirror.com/to-regex-range/5.0.1 - dev: true - - registry.npmmirror.com/follow-redirects/1.15.2_debug@4.3.4: - resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.2.tgz} - id: registry.npmmirror.com/follow-redirects/1.15.2 - name: follow-redirects - version: 1.15.2 - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true - dependencies: - debug: 4.3.4 - dev: true - - registry.npmmirror.com/fs-extra/10.1.0: - resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/fs-extra/-/fs-extra-10.1.0.tgz} - name: fs-extra - version: 10.1.0 - engines: {node: '>=12'} - dependencies: - graceful-fs: registry.npmmirror.com/graceful-fs/4.2.10 - jsonfile: registry.npmmirror.com/jsonfile/6.1.0 - universalify: registry.npmmirror.com/universalify/2.0.0 - dev: true - - registry.npmmirror.com/function-bind/1.1.1: - resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/function-bind/-/function-bind-1.1.1.tgz} - name: function-bind - version: 1.1.1 - - registry.npmmirror.com/gensync/1.0.0-beta.2: - resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/gensync/-/gensync-1.0.0-beta.2.tgz} - name: gensync - version: 1.0.0-beta.2 - engines: {node: '>=6.9.0'} - dev: true - - registry.npmmirror.com/graceful-fs/4.2.10: - resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.10.tgz} - name: graceful-fs - version: 4.2.10 - dev: true - - registry.npmmirror.com/has-flag/1.0.0: - resolution: {integrity: sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/has-flag/-/has-flag-1.0.0.tgz} - name: has-flag - version: 1.0.0 - engines: {node: '>=0.10.0'} - dev: true - - registry.npmmirror.com/has-flag/3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/has-flag/-/has-flag-3.0.0.tgz} - name: has-flag - version: 3.0.0 - engines: {node: '>=4'} - dev: true - - registry.npmmirror.com/has/1.0.3: - resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/has/-/has-1.0.3.tgz} - name: has - version: 1.0.3 - engines: {node: '>= 0.4.0'} - dependencies: - function-bind: registry.npmmirror.com/function-bind/1.1.1 - - registry.npmmirror.com/html-tags/3.2.0: - resolution: {integrity: sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/html-tags/-/html-tags-3.2.0.tgz} - name: html-tags - version: 3.2.0 - engines: {node: '>=8'} - dev: true - - registry.npmmirror.com/is-core-module/2.11.0: - resolution: {integrity: sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-core-module/-/is-core-module-2.11.0.tgz} - name: is-core-module - version: 2.11.0 - dependencies: - has: registry.npmmirror.com/has/1.0.3 - dev: true - - registry.npmmirror.com/is-number/3.0.0: - resolution: {integrity: sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-number/-/is-number-3.0.0.tgz} - name: is-number - version: 3.0.0 - engines: {node: '>=0.10.0'} - dependencies: - kind-of: 3.2.2 - dev: true - - registry.npmmirror.com/is-number/7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz} - name: is-number - version: 7.0.0 - engines: {node: '>=0.12.0'} - dev: true - - registry.npmmirror.com/jiti/1.16.0: - resolution: {integrity: sha512-L3BJStEf5NAqNuzrpfbN71dp43mYIcBUlCRea/vdyv5dW/AYa1d4bpelko4SHdY3I6eN9Wzyasxirj1/vv5kmg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/jiti/-/jiti-1.16.0.tgz} - name: jiti - version: 1.16.0 - hasBin: true - dev: true - - registry.npmmirror.com/js-tokens/4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz} - name: js-tokens - version: 4.0.0 - dev: true - - registry.npmmirror.com/jsesc/2.5.2: - resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/jsesc/-/jsesc-2.5.2.tgz} - name: jsesc - version: 2.5.2 - engines: {node: '>=4'} - hasBin: true - dev: true - - registry.npmmirror.com/json5/2.2.1: - resolution: {integrity: sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/json5/-/json5-2.2.1.tgz} - name: json5 - version: 2.2.1 - engines: {node: '>=6'} - hasBin: true - dev: true - - registry.npmmirror.com/jsonfile/6.1.0: - resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/jsonfile/-/jsonfile-6.1.0.tgz} - name: jsonfile - version: 6.1.0 - dependencies: - universalify: registry.npmmirror.com/universalify/2.0.0 - optionalDependencies: - graceful-fs: 4.2.10 - dev: true - - registry.npmmirror.com/kolorist/1.6.0: - resolution: {integrity: sha512-dLkz37Ab97HWMx9KTes3Tbi3D1ln9fCAy2zr2YVExJasDRPGRaKcoE4fycWNtnCAJfjFqe0cnY+f8KT2JePEXQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/kolorist/-/kolorist-1.6.0.tgz} - name: kolorist - version: 1.6.0 - dev: true - - registry.npmmirror.com/lru-cache/6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz} - name: lru-cache - version: 6.0.0 - engines: {node: '>=10'} - dependencies: - yallist: registry.npmmirror.com/yallist/4.0.0 - dev: true - - registry.npmmirror.com/magic-string/0.25.9: - resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/magic-string/-/magic-string-0.25.9.tgz} - name: magic-string - version: 0.25.9 - dependencies: - sourcemap-codec: 1.4.8 - - registry.npmmirror.com/magic-string/0.27.0: - resolution: {integrity: sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/magic-string/-/magic-string-0.27.0.tgz} - name: magic-string - version: 0.27.0 - engines: {node: '>=12'} - dependencies: - '@jridgewell/sourcemap-codec': registry.npmmirror.com/@jridgewell/sourcemap-codec/1.4.14 - dev: true - - registry.npmmirror.com/merge2/1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/merge2/-/merge2-1.4.1.tgz} - name: merge2 - version: 1.4.1 - engines: {node: '>= 8'} - dev: true - - registry.npmmirror.com/micromatch/4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/micromatch/-/micromatch-4.0.5.tgz} - name: micromatch - version: 4.0.5 - engines: {node: '>=8.6'} - dependencies: - braces: registry.npmmirror.com/braces/3.0.2 - picomatch: registry.npmmirror.com/picomatch/2.3.1 - dev: true - - registry.npmmirror.com/ms/2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz} - name: ms - version: 2.1.2 - dev: true - - registry.npmmirror.com/nanoid/3.3.4: - resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/nanoid/-/nanoid-3.3.4.tgz} - name: nanoid - version: 3.3.4 - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - - registry.npmmirror.com/node-fetch/2.6.7: - resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/node-fetch/-/node-fetch-2.6.7.tgz} - name: node-fetch - version: 2.6.7 - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - dependencies: - whatwg-url: registry.npmmirror.com/whatwg-url/5.0.0 - dev: true - - registry.npmmirror.com/node-releases/2.0.6: - resolution: {integrity: sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/node-releases/-/node-releases-2.0.6.tgz} - name: node-releases - version: 2.0.6 - dev: true - - registry.npmmirror.com/picocolors/1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/picocolors/-/picocolors-1.0.0.tgz} - name: picocolors - version: 1.0.0 - - registry.npmmirror.com/picomatch/2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz} - name: picomatch - version: 2.3.1 - engines: {node: '>=8.6'} - dev: true - - registry.npmmirror.com/pinia/2.0.28_prq2uz4lho2pwp6irk4cfkrxwu: - resolution: {integrity: sha512-YClq9DkqCblq9rlyUual7ezMu/iICWdBtfJrDt4oWU9Zxpijyz7xB2xTwx57DaBQ96UGvvTMORzALr+iO5PVMw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/pinia/-/pinia-2.0.28.tgz} - id: registry.npmmirror.com/pinia/2.0.28 - name: pinia - version: 2.0.28 - peerDependencies: - '@vue/composition-api': ^1.4.0 - typescript: '>=4.4.4' - vue: ^2.6.14 || ^3.2.0 - peerDependenciesMeta: - '@vue/composition-api': - optional: true - typescript: - optional: true - dependencies: - '@vue/devtools-api': registry.npmmirror.com/@vue/devtools-api/6.4.5 - typescript: 4.9.4 - vue: 3.2.45 - vue-demi: registry.npmmirror.com/vue-demi/0.13.11_vue@3.2.45 - dev: false - - registry.npmmirror.com/postcss/5.2.18: - resolution: {integrity: sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/postcss/-/postcss-5.2.18.tgz} - name: postcss - version: 5.2.18 - engines: {node: '>=0.12'} - dependencies: - chalk: 1.1.3 - js-base64: 2.6.4 - source-map: 0.5.7 - supports-color: registry.npmmirror.com/supports-color/3.2.3 - dev: true - - registry.npmmirror.com/postcss/8.4.20: - resolution: {integrity: sha512-6Q04AXR1212bXr5fh03u8aAwbLxAQNGQ/Q1LNa0VfOI06ZAlhPHtQvE4OIdpj4kLThXilalPnmDSOD65DcHt+g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/postcss/-/postcss-8.4.20.tgz} - name: postcss - version: 8.4.20 - engines: {node: ^10 || ^12 || >=14} - dependencies: - nanoid: registry.npmmirror.com/nanoid/3.3.4 - picocolors: registry.npmmirror.com/picocolors/1.0.0 - source-map-js: registry.npmmirror.com/source-map-js/1.0.2 - - registry.npmmirror.com/regenerator-runtime/0.13.11: - resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz} - name: regenerator-runtime - version: 0.13.11 - - registry.npmmirror.com/rollup-plugin-purge-icons/0.9.1: - resolution: {integrity: sha512-hRDKBsPUz47UMdBufki2feTmBF2ClEJlYqL7N6vpVAHSLd7V2BJUaNKOF7YYbLMofVVF+9hm44YSkYO6k9hUgg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/rollup-plugin-purge-icons/-/rollup-plugin-purge-icons-0.9.1.tgz} - name: rollup-plugin-purge-icons - version: 0.9.1 - engines: {node: '>= 12'} - dependencies: - '@purge-icons/core': registry.npmmirror.com/@purge-icons/core/0.9.1 - '@purge-icons/generated': registry.npmmirror.com/@purge-icons/generated/0.9.0 - transitivePeerDependencies: - - encoding - - supports-color - dev: true - - registry.npmmirror.com/semver/6.3.0: - resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/semver/-/semver-6.3.0.tgz} - name: semver - version: 6.3.0 - hasBin: true - dev: true - - registry.npmmirror.com/semver/7.3.7: - resolution: {integrity: sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/semver/-/semver-7.3.7.tgz} - name: semver - version: 7.3.7 - engines: {node: '>=10'} - hasBin: true - dependencies: - lru-cache: registry.npmmirror.com/lru-cache/6.0.0 - dev: true - - registry.npmmirror.com/semver/7.3.8: - resolution: {integrity: sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/semver/-/semver-7.3.8.tgz} - name: semver - version: 7.3.8 - engines: {node: '>=10'} - hasBin: true - dependencies: - lru-cache: registry.npmmirror.com/lru-cache/6.0.0 - dev: true - - registry.npmmirror.com/source-map-js/1.0.2: - resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/source-map-js/-/source-map-js-1.0.2.tgz} - name: source-map-js - version: 1.0.2 - engines: {node: '>=0.10.0'} - - registry.npmmirror.com/supports-color/2.0.0: - resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/supports-color/-/supports-color-2.0.0.tgz} - name: supports-color - version: 2.0.0 - engines: {node: '>=0.8.0'} - dev: true - - registry.npmmirror.com/supports-color/3.2.3: - resolution: {integrity: sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/supports-color/-/supports-color-3.2.3.tgz} - name: supports-color - version: 3.2.3 - engines: {node: '>=0.8.0'} - dependencies: - has-flag: registry.npmmirror.com/has-flag/1.0.0 - dev: true - - registry.npmmirror.com/supports-color/5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz} - name: supports-color - version: 5.5.0 - engines: {node: '>=4'} - dependencies: - has-flag: registry.npmmirror.com/has-flag/3.0.0 - dev: true - - registry.npmmirror.com/svg-tags/1.0.0: - resolution: {integrity: sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/svg-tags/-/svg-tags-1.0.0.tgz} - name: svg-tags - version: 1.0.0 - dev: true - - registry.npmmirror.com/systemjs/6.13.0: - resolution: {integrity: sha512-P3cgh2bpaPvAO2NE3uRp/n6hmk4xPX4DQf+UzTlCAycssKdqhp6hjw+ENWe+aUS7TogKRFtptMosTSFeC6R55g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/systemjs/-/systemjs-6.13.0.tgz} - name: systemjs - version: 6.13.0 - dev: true - - registry.npmmirror.com/to-fast-properties/2.0.0: - resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz} - name: to-fast-properties - version: 2.0.0 - engines: {node: '>=4'} - - registry.npmmirror.com/to-regex-range/2.1.1: - resolution: {integrity: sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/to-regex-range/-/to-regex-range-2.1.1.tgz} - name: to-regex-range - version: 2.1.1 - engines: {node: '>=0.10.0'} - dependencies: - is-number: registry.npmmirror.com/is-number/3.0.0 - repeat-string: 1.6.1 - dev: true - - registry.npmmirror.com/to-regex-range/5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz} - name: to-regex-range - version: 5.0.1 - engines: {node: '>=8.0'} - dependencies: - is-number: registry.npmmirror.com/is-number/7.0.0 - dev: true - - registry.npmmirror.com/tr46/0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/tr46/-/tr46-0.0.3.tgz} - name: tr46 - version: 0.0.3 - dev: true - - registry.npmmirror.com/tslib/2.3.0: - resolution: {integrity: sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/tslib/-/tslib-2.3.0.tgz} - name: tslib - version: 2.3.0 - dev: false - - registry.npmmirror.com/tslib/2.4.1: - resolution: {integrity: sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/tslib/-/tslib-2.4.1.tgz} - name: tslib - version: 2.4.1 - dev: true - - registry.npmmirror.com/universalify/2.0.0: - resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/universalify/-/universalify-2.0.0.tgz} - name: universalify - version: 2.0.0 - engines: {node: '>= 10.0.0'} - dev: true - - registry.npmmirror.com/update-browserslist-db/1.0.10_browserslist@4.21.4: - resolution: {integrity: sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz} - id: registry.npmmirror.com/update-browserslist-db/1.0.10 - name: update-browserslist-db - version: 1.0.10 - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' - dependencies: - browserslist: registry.npmmirror.com/browserslist/4.21.4 - escalade: registry.npmmirror.com/escalade/3.1.1 - picocolors: 1.0.0 - dev: true - - registry.npmmirror.com/vite-plugin-purge-icons/0.9.2_vite@4.0.3: - resolution: {integrity: sha512-vxJEMyNyckqLr/4HPsW9P6BMLUvOVMvjjFz3jLl4Wke1KWE8ITJUxIUwodxaOmEp9L2lxVk5an3TYeycZCfqFw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/vite-plugin-purge-icons/-/vite-plugin-purge-icons-0.9.2.tgz} - id: registry.npmmirror.com/vite-plugin-purge-icons/0.9.2 - name: vite-plugin-purge-icons - version: 0.9.2 - engines: {node: '>= 12'} - peerDependencies: - vite: ^2.0.0 || ^3.0.0 || ^4.0.0 - dependencies: - '@purge-icons/core': registry.npmmirror.com/@purge-icons/core/0.9.1 - '@purge-icons/generated': registry.npmmirror.com/@purge-icons/generated/0.9.0 - rollup-plugin-purge-icons: registry.npmmirror.com/rollup-plugin-purge-icons/0.9.1 - vite: 4.0.3_amyfslv6hdwxqbf7f4ldebbtce - transitivePeerDependencies: - - encoding - - supports-color - dev: true - - registry.npmmirror.com/vite-plugin-windicss/1.8.10_vite@4.0.3: - resolution: {integrity: sha512-scywsuzo46lcTBohspmF0WiwhWEte6p+OUVrX4yr7VMRvLHMHVfLtJReyD5pppjijG7YOwVsZn7XBWWZtF658Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/vite-plugin-windicss/-/vite-plugin-windicss-1.8.10.tgz} - id: registry.npmmirror.com/vite-plugin-windicss/1.8.10 - name: vite-plugin-windicss - version: 1.8.10 - peerDependencies: - vite: ^2.0.1 || ^3.0.0 || ^4.0.0 - dependencies: - '@windicss/plugin-utils': registry.npmmirror.com/@windicss/plugin-utils/1.8.10 - debug: registry.npmmirror.com/debug/4.3.4 - kolorist: registry.npmmirror.com/kolorist/1.6.0 - vite: 4.0.3_amyfslv6hdwxqbf7f4ldebbtce - windicss: registry.npmmirror.com/windicss/3.5.6 - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmmirror.com/vue-demi/0.13.11_vue@3.2.45: - resolution: {integrity: sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/vue-demi/-/vue-demi-0.13.11.tgz} - id: registry.npmmirror.com/vue-demi/0.13.11 - name: vue-demi - version: 0.13.11 - engines: {node: '>=12'} - hasBin: true - requiresBuild: true - peerDependencies: - '@vue/composition-api': ^1.0.0-rc.1 - vue: ^3.0.0-0 || ^2.6.0 - peerDependenciesMeta: - '@vue/composition-api': - optional: true - dependencies: - vue: 3.2.45 - dev: false - - registry.npmmirror.com/vxe-table/4.3.7_vue@3.2.45+xe-utils@3.5.7: - resolution: {integrity: sha512-v+d7eEQ5uqtVTQCts4xkW0S15LZcIuEukYHGXI53SdoUj2gLFggPYAxQr1y659CM/ESRWPz9LNVHpd97KkjGHw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/vxe-table/-/vxe-table-4.3.7.tgz} - id: registry.npmmirror.com/vxe-table/4.3.7 - name: vxe-table - version: 4.3.7 - peerDependencies: - vue: ^3.2.28 - xe-utils: ^3.5.0 - dependencies: - vue: 3.2.45 - xe-utils: 3.5.7 - dev: false - - registry.npmmirror.com/webidl-conversions/3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz} - name: webidl-conversions - version: 3.0.1 - dev: true - - registry.npmmirror.com/whatwg-url/5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/whatwg-url/-/whatwg-url-5.0.0.tgz} - name: whatwg-url - version: 5.0.0 - dependencies: - tr46: registry.npmmirror.com/tr46/0.0.3 - webidl-conversions: registry.npmmirror.com/webidl-conversions/3.0.1 - dev: true - - registry.npmmirror.com/windicss/3.5.6: - resolution: {integrity: sha512-P1mzPEjgFMZLX0ZqfFht4fhV/FX8DTG7ERG1fBLiWvd34pTLVReS5CVsewKn9PApSgXnVfPWwvq+qUsRwpnwFA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/windicss/-/windicss-3.5.6.tgz} - name: windicss - version: 3.5.6 - engines: {node: '>= 12'} - hasBin: true - dev: true - - registry.npmmirror.com/yallist/4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz} - name: yallist - version: 4.0.0 - dev: true - - registry.npmmirror.com/zrender/5.4.1: - resolution: {integrity: sha512-M4Z05BHWtajY2241EmMPHglDQAJ1UyHQcYsxDNzD9XLSkPDqMq4bB28v9Pb4mvHnVQ0GxyTklZ/69xCFP6RXBA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/zrender/-/zrender-5.4.1.tgz} - name: zrender - version: 5.4.1 - dependencies: - tslib: registry.npmmirror.com/tslib/2.3.0 + tslib: 2.3.0 dev: false diff --git a/yudao-ui-admin-vue3/src/components/Crontab/src/Crontab.vue b/yudao-ui-admin-vue3/src/components/Crontab/src/Crontab.vue index a5a9e56a6..c620d719a 100644 --- a/yudao-ui-admin-vue3/src/components/Crontab/src/Crontab.vue +++ b/yudao-ui-admin-vue3/src/components/Crontab/src/Crontab.vue @@ -353,7 +353,6 @@ const select = ref() watch( () => select.value, () => { - console.info(select.value) if (select.value == 'custom') { open() } else { diff --git a/yudao-ui-admin-vue3/src/components/XTable/index.ts b/yudao-ui-admin-vue3/src/components/XTable/index.ts new file mode 100644 index 000000000..4abe968eb --- /dev/null +++ b/yudao-ui-admin-vue3/src/components/XTable/index.ts @@ -0,0 +1,3 @@ +import XTable from './src/XTable.vue' + +export { XTable } diff --git a/yudao-ui-admin-vue3/src/components/XTable/src/XTable.vue b/yudao-ui-admin-vue3/src/components/XTable/src/XTable.vue new file mode 100644 index 000000000..72d83d6fe --- /dev/null +++ b/yudao-ui-admin-vue3/src/components/XTable/src/XTable.vue @@ -0,0 +1,335 @@ +<template> + <VxeGrid v-bind="getProps" ref="xGrid" :class="`${prefixCls}`" class="xtable-scrollbar"> + <template #[item]="data" v-for="item in Object.keys($slots)" :key="item"> + <slot :name="item" v-bind="data || {}"></slot> + </template> + </VxeGrid> +</template> +<script lang="ts" setup name="XTable"> +import { computed, PropType, ref, unref, useAttrs, watch } from 'vue' +import { SizeType, VxeGridInstance } from 'vxe-table' +import { useAppStore } from '@/store/modules/app' +import { useDesign } from '@/hooks/web/useDesign' +import { XTableProps } from './type' +import { isBoolean, isFunction } from '@/utils/is' +import { useMessage } from '@/hooks/web/useMessage' +import download from '@/utils/download' +import { useI18n } from '@/hooks/web/useI18n' + +const { t } = useI18n() +const message = useMessage() // 消息弹窗 + +const appStore = useAppStore() + +const { getPrefixCls } = useDesign() +const prefixCls = getPrefixCls('x-vxe-table') + +const attrs = useAttrs() +const emit = defineEmits(['register']) + +watch( + () => appStore.getIsDark, + () => { + if (appStore.getIsDark == true) { + import('./style/dark.scss') + } + if (appStore.getIsDark == false) { + import('./style/light.scss') + } + }, + { immediate: true } +) + +const currentSize = computed(() => { + let resSize: SizeType = 'small' + const appsize = appStore.getCurrentSize + switch (appsize) { + case 'large': + resSize = 'medium' + break + case 'default': + resSize = 'small' + break + case 'small': + resSize = 'mini' + break + } + return resSize +}) + +const props = defineProps({ + options: { + type: Object as PropType<XTableProps>, + default: () => {} + } +}) +const innerProps = ref<Partial<XTableProps>>() + +const getProps = computed(() => { + const options = innerProps.value || props.options + options.size = currentSize as any + options.height = 700 + getOptionInitConfig(options) + getColumnsConfig(options) + getProxyConfig(options) + getPageConfig(options) + getToolBarConfig(options) + // console.log(options); + return { + ...options, + ...attrs + } +}) + +const xGrid = ref<VxeGridInstance>() // 列表 Grid Ref + +let proxyForm = false + +const getOptionInitConfig = (options: XTableProps) => { + options.size = currentSize as any + options.rowConfig = { + isCurrent: true, // 当鼠标点击行时,是否要高亮当前行 + isHover: true // 当鼠标移到行时,是否要高亮当前行 + } +} + +// columns +const getColumnsConfig = (options: XTableProps) => { + const { allSchemas } = options + if (!allSchemas) return + if (allSchemas.printSchema) { + options.printConfig = { + columns: allSchemas.printSchema + } + } + if (allSchemas.formSchema) { + proxyForm = true + options.formConfig = { + enabled: true, + titleWidth: 100, + titleAlign: 'right', + items: allSchemas.searchSchema + } + } + if (allSchemas.tableSchema) { + options.columns = allSchemas.tableSchema + } +} + +// 动态请求 +const getProxyConfig = (options: XTableProps) => { + const { getListApi, proxyConfig, data, isList } = options + if (proxyConfig || data) return + if (getListApi && isFunction(getListApi) && !isList) { + if (!isList) { + options.proxyConfig = { + seq: true, // 启用动态序号代理(分页之后索引自动计算为当前页的起始序号) + form: proxyForm, // 启用表单代理,当点击表单提交按钮时会自动触发 reload 行为 + props: { result: 'list', total: 'total' }, + ajax: { + query: async ({ page, form }) => { + let queryParams: any = Object.assign({}, JSON.parse(JSON.stringify(form))) + if (options.params) { + queryParams = Object.assign(queryParams, options.params) + } + if (!options?.treeConfig) { + queryParams.pageSize = page.pageSize + queryParams.pageNo = page.currentPage + } + return new Promise(async (resolve) => { + resolve(await getListApi(queryParams)) + }) + }, + delete: ({ body }) => { + return new Promise(async (resolve) => { + if (options.deleteApi) { + resolve(await options.deleteApi(JSON.stringify(body))) + } else { + Promise.reject('未设置deleteApi') + } + }) + }, + queryAll: ({ form }) => { + const queryParams = Object.assign({}, JSON.parse(JSON.stringify(form))) + return new Promise(async (resolve) => { + if (options.getAllListApi) { + resolve(await options.getAllListApi(queryParams)) + } else { + resolve(await getListApi(queryParams)) + } + }) + } + } + } + } else { + options.proxyConfig = { + seq: true, // 启用动态序号代理(分页之后索引自动计算为当前页的起始序号) + form: true, // 启用表单代理,当点击表单提交按钮时会自动触发 reload 行为 + props: { result: 'data' }, + ajax: { + query: ({ form }) => { + let queryParams: any = Object.assign({}, JSON.parse(JSON.stringify(form))) + if (options?.params) { + queryParams = Object.assign(queryParams, options.params) + } + return new Promise(async (resolve) => { + resolve(await getListApi(queryParams)) + }) + } + } + } + } + } + if (options.exportListApi) { + options.exportConfig = { + filename: options?.exportName, + // 默认选中类型 + type: 'csv', + // 自定义数据量列表 + modes: options?.getAllListApi ? ['current', 'all'] : ['current'], + columns: options?.allSchemas?.printSchema + } + } +} + +// 分页 +const getPageConfig = (options: XTableProps) => { + const { pagination, pagerConfig, treeConfig } = options + if (treeConfig) { + options.treeConfig = options.treeConfig + return + } + if (pagerConfig) return + if (pagination) { + if (isBoolean(pagination)) { + options.pagerConfig = { + border: false, // 带边框 + background: true, // 带背景颜色 + perfect: false, // 配套的样式 + pageSize: 10, // 每页大小 + pagerCount: 7, // 显示页码按钮的数量 + autoHidden: false, // 当只有一页时自动隐藏 + pageSizes: [5, 10, 20, 30, 50, 100], // 每页大小选项列表 + layouts: [ + 'PrevJump', + 'PrevPage', + 'JumpNumber', + 'NextPage', + 'NextJump', + 'Sizes', + 'FullJump', + 'Total' + ] + } + return + } + options.pagerConfig = pagination + } else { + if (pagination != false) { + options.pagerConfig = { + border: false, // 带边框 + background: true, // 带背景颜色 + perfect: false, // 配套的样式 + pageSize: 10, // 每页大小 + pagerCount: 7, // 显示页码按钮的数量 + autoHidden: false, // 当只有一页时自动隐藏 + pageSizes: [5, 10, 20, 30, 50, 100], // 每页大小选项列表 + layouts: [ + 'PrevJump', + 'PrevPage', + 'JumpNumber', + 'NextPage', + 'NextJump', + 'Sizes', + 'FullJump', + 'Total' + ] + } + } + } +} + +// tool bar +const getToolBarConfig = (options: XTableProps) => { + const { toolBar, toolbarConfig, topActionSlots } = options + if (toolbarConfig) return + if (toolBar) { + if (!isBoolean(toolBar)) { + options.toolbarConfig = toolBar + return + } + } else if (!topActionSlots) { + options.toolbarConfig = { + slots: { buttons: 'toolbar_buttons' } + } + } +} + +// 刷新列表 +const reload = () => { + const g = unref(xGrid) + if (!g) { + return + } + g.commitProxy('query') +} + +// 删除 +const deleteData = async (ids: string | number) => { + const g = unref(xGrid) + if (!g) { + return + } + const options = innerProps.value || props.options + if (!options.deleteApi) { + console.error('未传入delListApi') + return + } + return new Promise(async () => { + message.delConfirm().then(async () => { + await (options?.deleteApi && options?.deleteApi(ids)) + message.success(t('common.delSuccess')) + // 刷新列表 + reload() + }) + }) +} + +// 导出 +const exportList = async (fileName?: string) => { + const g = unref(xGrid) + if (!g) { + return + } + const options = innerProps.value || props.options + if (!options?.exportListApi) { + console.error('未传入exportListApi') + return + } + const queryParams = Object.assign({}, JSON.parse(JSON.stringify(g.getProxyInfo()?.form))) + message.exportConfirm().then(async () => { + const res = await (options?.exportListApi && options?.exportListApi(queryParams)) + download.excel(res as unknown as Blob, fileName ? fileName : 'excel.xls') + }) +} + +// 获取查询参数 +const getSearchData = () => { + const g = unref(xGrid) + if (!g) { + return + } + const queryParams = Object.assign({}, JSON.parse(JSON.stringify(g.getProxyInfo()?.form))) + return queryParams +} + +const setProps = (prop: Partial<XTableProps>) => { + innerProps.value = { ...unref(innerProps), ...prop } +} + +defineExpose({ reload, Ref: xGrid, getSearchData, deleteData, exportList }) +emit('register', { reload, getSearchData, setProps, deleteData, exportList }) +</script> +<style lang="scss"> +@import './style/index.scss'; +</style> diff --git a/yudao-ui-admin-vue3/src/components/XTable/src/style/dark.scss b/yudao-ui-admin-vue3/src/components/XTable/src/style/dark.scss new file mode 100644 index 000000000..4e87c4b39 --- /dev/null +++ b/yudao-ui-admin-vue3/src/components/XTable/src/style/dark.scss @@ -0,0 +1,81 @@ +// 修改样式变量 +//@import 'vxe-table/styles/variable.scss'; + +/*font*/ +$vxe-font-color: #e5e7eb; +// $vxe-font-size: 14px !default; +// $vxe-font-size-medium: 16px !default; +// $vxe-font-size-small: 14px !default; +// $vxe-font-size-mini: 12px !default; + +/*color*/ +$vxe-primary-color: #409eff !default; +$vxe-success-color: #67c23a !default; +$vxe-info-color: #909399 !default; +$vxe-warning-color: #e6a23c !default; +$vxe-danger-color: #f56c6c !default; +$vxe-disabled-color: #bfbfbf !default; +$vxe-primary-disabled-color: #c0c4cc !default; + +/*loading*/ +$vxe-loading-color: $vxe-primary-color !default; +$vxe-loading-background-color: #1d1e1f !default; +$vxe-loading-z-index: 999 !default; + +/*icon*/ +$vxe-icon-font-family: Verdana, Arial, Tahoma !default; +$vxe-icon-background-color: #e5e7eb !default; + +/*toolbar*/ +$vxe-toolbar-background-color: #1d1e1f !default; +$vxe-toolbar-button-border: #dcdfe6 !default; +$vxe-toolbar-custom-active-background-color: #d9dadb !default; +$vxe-toolbar-panel-background-color: #e5e7eb !default; + +$vxe-table-font-color: #e5e7eb; +$vxe-table-header-background-color: #1d1e1f; +$vxe-table-body-background-color: #141414; +$vxe-table-row-striped-background-color: #1d1d1d; +$vxe-table-row-hover-background-color: #1d1e1f; +$vxe-table-row-hover-striped-background-color: #1e1e1e; +$vxe-table-footer-background-color: #1d1e1f; +$vxe-table-row-current-background-color: #302d2d; +$vxe-table-column-current-background-color: #302d2d; +$vxe-table-column-hover-background-color: #302d2d; +$vxe-table-row-hover-current-background-color: #302d2d; +$vxe-table-row-checkbox-checked-background-color: #3e3c37 !default; +$vxe-table-row-hover-checkbox-checked-background-color: #615a4a !default; +$vxe-table-menu-background-color: #1d1e1f; +$vxe-table-border-width: 1px !default; +$vxe-table-border-color: #4c4d4f !default; +$vxe-table-fixed-left-scrolling-box-shadow: 8px 0px 10px -5px rgba(0, 0, 0, 0.12) !default; +$vxe-table-fixed-right-scrolling-box-shadow: -8px 0px 10px -5px rgba(0, 0, 0, 0.12) !default; + +$vxe-form-background-color: #141414; + +/*pager*/ +$vxe-pager-background-color: #1d1e1f !default; +$vxe-pager-perfect-background-color: #262727 !default; +$vxe-pager-perfect-button-background-color: #a7a3a3 !default; + +$vxe-input-background-color: #141414; +$vxe-input-border-color: #4c4d4f !default; + +$vxe-select-option-hover-background-color: #262626 !default; +$vxe-select-panel-background-color: #141414 !default; +$vxe-select-empty-color: #262626 !default; +$vxe-optgroup-title-color: #909399 !default; + +/*button*/ +$vxe-button-default-background-color: #262626; +$vxe-button-dropdown-panel-background-color: #141414; + +/*modal*/ +$vxe-modal-header-background-color: #141414; +$vxe-modal-body-background-color: #141414; +$vxe-modal-border-color: #3b3b3b; + +/*pulldown*/ +$vxe-pulldown-panel-background-color: #262626 !default; + +@import 'vxe-table/styles/index'; diff --git a/yudao-ui-admin-vue3/src/components/XTable/src/style/index.scss b/yudao-ui-admin-vue3/src/components/XTable/src/style/index.scss new file mode 100644 index 000000000..350ce0c09 --- /dev/null +++ b/yudao-ui-admin-vue3/src/components/XTable/src/style/index.scss @@ -0,0 +1,6 @@ +@import 'vxe-table/styles/variable.scss'; +@import 'vxe-table/styles/modules.scss'; +// @import './theme/light.scss'; +i { + border-color: initial; +} diff --git a/yudao-ui-admin-vue3/src/components/XTable/src/style/light.scss b/yudao-ui-admin-vue3/src/components/XTable/src/style/light.scss new file mode 100644 index 000000000..f979155ef --- /dev/null +++ b/yudao-ui-admin-vue3/src/components/XTable/src/style/light.scss @@ -0,0 +1,16 @@ +// 修改样式变量 +// /*font*/ +// $vxe-font-size: 12px !default; +// $vxe-font-size-medium: 16px !default; +// $vxe-font-size-small: 14px !default; +// $vxe-font-size-mini: 12px !default; +/*color*/ +$vxe-primary-color: #409eff !default; +$vxe-success-color: #67c23a !default; +$vxe-info-color: #909399 !default; +$vxe-warning-color: #e6a23c !default; +$vxe-danger-color: #f56c6c !default; +$vxe-disabled-color: #bfbfbf !default; +$vxe-primary-disabled-color: #c0c4cc !default; + +@import 'vxe-table/styles/index'; diff --git a/yudao-ui-admin-vue3/src/components/XTable/src/type.ts b/yudao-ui-admin-vue3/src/components/XTable/src/type.ts new file mode 100644 index 000000000..5214d62e4 --- /dev/null +++ b/yudao-ui-admin-vue3/src/components/XTable/src/type.ts @@ -0,0 +1,25 @@ +import { CrudSchema } from '@/hooks/web/useCrudSchemas' +import type { VxeGridProps, VxeGridPropTypes, VxeTablePropTypes } from 'vxe-table' + +export type XTableProps<D = any> = VxeGridProps<D> & { + allSchemas?: CrudSchema + height?: number // 高度 默认730 + topActionSlots?: boolean // 是否开启表格内顶部操作栏插槽 + treeConfig?: VxeTablePropTypes.TreeConfig // 树形表单配置 + isList?: boolean // 是否不带分页的list + getListApi?: Function // 获取列表接口 + getAllListApi?: Function // 获取全部数据接口 用于 vxe 导出 + deleteApi?: Function // 删除接口 + exportListApi?: Function // 导出接口 + exportName?: string // 导出文件夹名称 + params?: any // 其他查询参数 + pagination?: boolean | VxeGridPropTypes.PagerConfig // 分页配置参数 + toolBar?: boolean | VxeGridPropTypes.ToolbarConfig // 右侧工具栏配置参数 +} +export type XColumns = VxeGridPropTypes.Columns + +export type VxeTableColumn = { + field: string + title?: string + children?: VxeTableColumn[] +} & Recordable diff --git a/yudao-ui-admin-vue3/src/components/index.ts b/yudao-ui-admin-vue3/src/components/index.ts index 72facaa18..19b2aac69 100644 --- a/yudao-ui-admin-vue3/src/components/index.ts +++ b/yudao-ui-admin-vue3/src/components/index.ts @@ -4,6 +4,7 @@ import { Form } from '@/components/Form' import { Table } from '@/components/Table' import { Search } from '@/components/Search' import { XModal } from '@/components/XModal' +import { XTable } from '@/components/XTable' import { XButton, XTextButton } from '@/components/XButton' import { DictTag } from '@/components/DictTag' import { ContentWrap } from '@/components/ContentWrap' @@ -15,6 +16,7 @@ export const setupGlobCom = (app: App<Element>): void => { app.component('Table', Table) app.component('Search', Search) app.component('XModal', XModal) + app.component('XTable', XTable) app.component('XButton', XButton) app.component('XTextButton', XTextButton) app.component('DictTag', DictTag) diff --git a/yudao-ui-admin-vue3/src/hooks/web/useVxeCrudSchemas.ts b/yudao-ui-admin-vue3/src/hooks/web/useVxeCrudSchemas.ts index c799aae71..951ddd9c9 100644 --- a/yudao-ui-admin-vue3/src/hooks/web/useVxeCrudSchemas.ts +++ b/yudao-ui-admin-vue3/src/hooks/web/useVxeCrudSchemas.ts @@ -165,7 +165,7 @@ const filterSearchSchema = (crudSchema: VxeCrudSchema): VxeFormItemProps[] => { // 添加搜索按钮 const buttons: VxeFormItemProps = { span: 24, - align: 'center', + align: 'right', collapseNode: searchSchema.length > spanLength, itemRender: { name: '$buttons', diff --git a/yudao-ui-admin-vue3/src/hooks/web/useXTable.ts b/yudao-ui-admin-vue3/src/hooks/web/useXTable.ts new file mode 100644 index 000000000..524e5370d --- /dev/null +++ b/yudao-ui-admin-vue3/src/hooks/web/useXTable.ts @@ -0,0 +1,32 @@ +import { ref, unref } from 'vue' +import { XTableProps } from '@/components/XTable/src/type' + +export interface tableMethod { + reload: () => void + setProps: (props: XTableProps) => void + deleteData: (ids: string | number) => void + exportList: (fileName?: string) => void +} + +export const useXTable = (props: XTableProps): [Function, tableMethod] => { + const tableRef = ref<Nullable<tableMethod>>(null) + + const register = (instance) => { + tableRef.value = instance + props && instance.setProps(props) + } + const getInstance = (): tableMethod => { + const table = unref(tableRef) + if (!table) { + console.error('表格实例不存在') + } + return table as tableMethod + } + const methods: tableMethod = { + reload: () => getInstance().reload(), + setProps: (props) => getInstance().setProps(props), + deleteData: (ids: string | number) => getInstance().deleteData(ids), + exportList: (fileName?: string) => getInstance().exportList(fileName) + } + return [register, methods] +} diff --git a/yudao-ui-admin-vue3/src/main.ts b/yudao-ui-admin-vue3/src/main.ts index a7341b7ee..e7c935a28 100644 --- a/yudao-ui-admin-vue3/src/main.ts +++ b/yudao-ui-admin-vue3/src/main.ts @@ -26,10 +26,10 @@ import '@/styles/index.scss' import '@/plugins/animate.css' // 路由 -import { setupRouter } from './router' +import router, { setupRouter } from '@/router' // 权限 -import { setupAuth } from './directives' +import { setupAuth } from '@/directives' import { createApp } from 'vue' @@ -53,6 +53,8 @@ const setupAll = async () => { setupAuth(app) + await router.isReady() + app.mount('#app') } diff --git a/yudao-ui-admin-vue3/src/plugins/vxeTable/index.ts b/yudao-ui-admin-vue3/src/plugins/vxeTable/index.ts index 281c65edc..6ef317374 100644 --- a/yudao-ui-admin-vue3/src/plugins/vxeTable/index.ts +++ b/yudao-ui-admin-vue3/src/plugins/vxeTable/index.ts @@ -1,9 +1,7 @@ -import { App, unref, watch } from 'vue' +import { App, unref } from 'vue' import XEUtils from 'xe-utils' -import './index.scss' import './renderer' import { i18n } from '@/plugins/vueI18n' -import { useAppStore } from '@/store/modules/app' import zhCN from 'vxe-table/lib/locale/lang/zh-CN' import enUS from 'vxe-table/lib/locale/lang/en-US' import { @@ -46,21 +44,6 @@ import { Table } from 'vxe-table' -const appStore = useAppStore() -watch( - () => appStore.getIsDark, - () => { - if (appStore.getIsDark) { - import('./theme/dark.scss') - } else { - import('./theme/light.scss') - } - }, - { - deep: true, - immediate: true - } -) // 全局默认参数 VXETable.setup({ size: 'medium', // 全局尺寸 diff --git a/yudao-ui-admin-vue3/src/plugins/vxeTable/renderer/index.tsx b/yudao-ui-admin-vue3/src/plugins/vxeTable/renderer/index.tsx index 2a510c387..744e46c34 100644 --- a/yudao-ui-admin-vue3/src/plugins/vxeTable/renderer/index.tsx +++ b/yudao-ui-admin-vue3/src/plugins/vxeTable/renderer/index.tsx @@ -4,3 +4,4 @@ import './dict' import './html' import './link' import './img' +import './preview' diff --git a/yudao-ui-admin-vue3/src/plugins/vxeTable/renderer/preview.tsx b/yudao-ui-admin-vue3/src/plugins/vxeTable/renderer/preview.tsx new file mode 100644 index 000000000..3cb1270b7 --- /dev/null +++ b/yudao-ui-admin-vue3/src/plugins/vxeTable/renderer/preview.tsx @@ -0,0 +1,34 @@ +import { VXETable } from 'vxe-table' +import { ElImage, ElLink } from 'element-plus' + +// 图片渲染 +VXETable.renderer.add('XPreview', { + // 默认显示模板 + renderDefault(_renderOpts, params) { + const { row, column } = params + if (row.type.indexOf('image/') === 0) { + return ( + <ElImage + style="width: 80px; height: 50px" + src={row[column.field]} + key={row[column.field]} + preview-src-list={[row[column.field]]} + fit="contain" + lazy + ></ElImage> + ) + } else if (row.type.indexOf('video/') === 0) { + return ( + <video> + <source src={row[column.field]}></source> + </video> + ) + } else { + return ( + <ElLink href={row[column.field]} target="_blank"> + {row[column.field]} + </ElLink> + ) + } + } +}) diff --git a/yudao-ui-admin-vue3/src/router/index.ts b/yudao-ui-admin-vue3/src/router/index.ts index 4fe42b515..f5fb53dd6 100644 --- a/yudao-ui-admin-vue3/src/router/index.ts +++ b/yudao-ui-admin-vue3/src/router/index.ts @@ -6,15 +6,11 @@ import { isRelogin } from '@/config/axios/service' import { getAccessToken } from '@/utils/auth' import { useTitle } from '@/hooks/web/useTitle' import { useNProgress } from '@/hooks/web/useNProgress' -import { CACHE_KEY, useCache } from '@/hooks/web/useCache' import { usePageLoading } from '@/hooks/web/usePageLoading' import { useDictStoreWithOut } from '@/store/modules/dict' import { useUserStoreWithOut } from '@/store/modules/user' import { usePermissionStoreWithOut } from '@/store/modules/permission' import { getInfoApi } from '@/api/login' -import { listSimpleDictDataApi } from '@/api/system/dict/dict.data' - -const { wsCache } = useCache() const { start, done } = useNProgress() @@ -50,10 +46,8 @@ router.beforeEach(async (to, from, next) => { const dictStore = useDictStoreWithOut() const userStore = useUserStoreWithOut() const permissionStore = usePermissionStoreWithOut() - const dictMap = wsCache.get(CACHE_KEY.DICT_CACHE) - if (!dictMap) { - const res = await listSimpleDictDataApi() - dictStore.setDictMap(res) + if (!dictStore.getIsSetDict) { + dictStore.setDictMap() } if (!userStore.getIsSetUser) { isRelogin.show = true diff --git a/yudao-ui-admin-vue3/src/store/modules/dict.ts b/yudao-ui-admin-vue3/src/store/modules/dict.ts index 4b2d46413..2c80a0d52 100644 --- a/yudao-ui-admin-vue3/src/store/modules/dict.ts +++ b/yudao-ui-admin-vue3/src/store/modules/dict.ts @@ -3,6 +3,7 @@ import { store } from '../index' import { DictDataVO } from '@/api/system/dict/types' import { CACHE_KEY, useCache } from '@/hooks/web/useCache' const { wsCache } = useCache('sessionStorage') +import { listSimpleDictDataApi } from '@/api/system/dict/dict.data' export interface DictValueType { value: any @@ -16,45 +17,54 @@ export interface DictTypeType { } export interface DictState { dictMap: Map<string, any> + isSetDict: boolean } export const useDictStore = defineStore('dict', { state: (): DictState => ({ - dictMap: new Map<string, any>() + dictMap: new Map<string, any>(), + isSetDict: false }), getters: { getDictMap(): Recordable { const dictMap = wsCache.get(CACHE_KEY.DICT_CACHE) - return dictMap ? dictMap : this.dictMap - }, - getHasDictData(): boolean { - if (this.dictMap.size > 0) { - return true - } else { - return false + if (dictMap) { + this.dictMap = dictMap } + return this.dictMap + }, + getIsSetDict(): boolean { + return this.isSetDict } }, actions: { - setDictMap(dictMap: Recordable) { - // 设置数据 - const dictDataMap = new Map<string, any>() - dictMap.forEach((dictData: DictDataVO) => { - // 获得 dictType 层级 - const enumValueObj = dictDataMap[dictData.dictType] - if (!enumValueObj) { - dictDataMap[dictData.dictType] = [] - } - // 处理 dictValue 层级 - dictDataMap[dictData.dictType].push({ - value: dictData.value, - label: dictData.label, - colorType: dictData.colorType, - cssClass: dictData.cssClass + async setDictMap() { + const dictMap = wsCache.get(CACHE_KEY.DICT_CACHE) + if (dictMap) { + this.dictMap = dictMap + this.isSetDict = true + } else { + const res = await listSimpleDictDataApi() + // 设置数据 + const dictDataMap = new Map<string, any>() + res.forEach((dictData: DictDataVO) => { + // 获得 dictType 层级 + const enumValueObj = dictDataMap[dictData.dictType] + if (!enumValueObj) { + dictDataMap[dictData.dictType] = [] + } + // 处理 dictValue 层级 + dictDataMap[dictData.dictType].push({ + value: dictData.value, + label: dictData.label, + colorType: dictData.colorType, + cssClass: dictData.cssClass + }) }) - }) - this.dictMap = dictDataMap - wsCache.set(CACHE_KEY.DICT_CACHE, dictDataMap, { exp: 60 }) // 60 秒 过期 + this.dictMap = dictDataMap + this.isSetDict = true + wsCache.set(CACHE_KEY.DICT_CACHE, dictDataMap, { exp: 60 }) // 60 秒 过期 + } } } }) diff --git a/yudao-ui-admin-vue3/src/utils/auth.ts b/yudao-ui-admin-vue3/src/utils/auth.ts index be7ba91f4..b55d676d5 100644 --- a/yudao-ui-admin-vue3/src/utils/auth.ts +++ b/yudao-ui-admin-vue3/src/utils/auth.ts @@ -36,45 +36,30 @@ export const formatToken = (token: string): string => { } // ========== 账号相关 ========== -const UsernameKey = 'USERNAME' -const PasswordKey = 'PASSWORD' -const RememberMeKey = 'REMEMBER_ME' +const LoginFormKey = 'LOGINFORM' -export const getUsername = () => { - return wsCache.get(UsernameKey) +export type LoginFormType = { + tenantName: string + username: string + password: string + rememberMe: boolean } -export const setUsername = (username: string) => { - wsCache.set(UsernameKey, username, { exp: 30 * 24 * 60 * 60 }) +export const getLoginForm = () => { + const loginForm: LoginFormType = wsCache.get(LoginFormKey) + if (loginForm) { + loginForm.password = decrypt(loginForm.password) as string + } + return loginForm } -export const removeUsername = () => { - wsCache.delete(UsernameKey) +export const setLoginForm = (loginForm: LoginFormType) => { + loginForm.password = encrypt(loginForm.password) as string + wsCache.set(LoginFormKey, loginForm, { exp: 30 * 24 * 60 * 60 }) } -export const getPassword = () => { - const password = wsCache.get(PasswordKey) - return password ? decrypt(password) : undefined -} - -export const setPassword = (password: string) => { - wsCache.set(PasswordKey, encrypt(password), { exp: 30 * 24 * 60 * 60 }) -} - -export const removePassword = () => { - wsCache.delete(PasswordKey) -} - -export const getRememberMe = () => { - return wsCache.get(RememberMeKey) === true -} - -export const setRememberMe = (rememberMe: boolean) => { - wsCache.set(RememberMeKey, rememberMe, { exp: 30 * 24 * 60 * 60 }) -} - -export const removeRememberMe = () => { - wsCache.delete(RememberMeKey) +export const removeLoginForm = () => { + wsCache.delete(LoginFormKey) } // ========== 租户相关 ========== diff --git a/yudao-ui-admin-vue3/src/views/Login/components/LoginForm.vue b/yudao-ui-admin-vue3/src/views/Login/components/LoginForm.vue index aaac013bb..0953c0759 100644 --- a/yudao-ui-admin-vue3/src/views/Login/components/LoginForm.vue +++ b/yudao-ui-admin-vue3/src/views/Login/components/LoginForm.vue @@ -148,7 +148,6 @@ import { useIcon } from '@/hooks/web/useIcon' import { useMessage } from '@/hooks/web/useMessage' import { required } from '@/utils/formRules' import * as authUtil from '@/utils/auth' -import { decrypt } from '@/utils/jsencrypt' import { Verify } from '@/components/Verifition' import { usePermissionStore } from '@/store/modules/permission' import * as LoginApi from '@/api/login' @@ -180,10 +179,6 @@ const loginData = reactive({ isShowPassword: false, captchaEnable: import.meta.env.VITE_APP_CAPTCHA_ENABLE, tenantEnable: import.meta.env.VITE_APP_TENANT_ENABLE, - token: '', - loading: { - signIn: false - }, loginForm: { tenantName: '芋道源码', username: 'admin', @@ -194,22 +189,10 @@ const loginData = reactive({ }) const socialList = [ - { - icon: 'ant-design:github-filled', - type: 0 - }, - { - icon: 'ant-design:wechat-filled', - type: 30 - }, - { - icon: 'ant-design:alipay-circle-filled', - type: 0 - }, - { - icon: 'ant-design:dingtalk-circle-filled', - type: 20 - } + { icon: 'ant-design:github-filled', type: 0 }, + { icon: 'ant-design:wechat-filled', type: 30 }, + { icon: 'ant-design:alipay-circle-filled', type: 0 }, + { icon: 'ant-design:dingtalk-circle-filled', type: 20 } ] // 获取验证码 @@ -232,18 +215,15 @@ const getTenantId = async () => { } // 记住我 const getCookie = () => { - const username = authUtil.getUsername() - const password = authUtil.getPassword() - ? decrypt(authUtil.getPassword() as unknown as string) - : undefined - const rememberMe = authUtil.getRememberMe() - const tenantName = authUtil.getTenantName() - loginData.loginForm = { - ...loginData.loginForm, - username: username ? username : loginData.loginForm.username, - password: password ? password : loginData.loginForm.password, - rememberMe: rememberMe ? true : false, - tenantName: tenantName ? tenantName : loginData.loginForm.tenantName + const loginForm = authUtil.getLoginForm() + if (loginForm) { + loginData.loginForm = { + ...loginData.loginForm, + username: loginForm.username ? loginForm.username : loginData.loginForm.username, + password: loginForm.password ? loginForm.password : loginData.loginForm.password, + rememberMe: loginForm.rememberMe ? true : false, + tenantName: loginForm.tenantName ? loginForm.tenantName : loginData.loginForm.tenantName + } } } // 登录 @@ -266,15 +246,9 @@ const handleLogin = async (params) => { background: 'rgba(0, 0, 0, 0.7)' }) if (loginData.loginForm.rememberMe) { - authUtil.setUsername(loginData.loginForm.username) - authUtil.setPassword(loginData.loginForm.password) - authUtil.setRememberMe(loginData.loginForm.rememberMe) - authUtil.setTenantName(loginData.loginForm.tenantName) + authUtil.setLoginForm(loginData.loginForm) } else { - authUtil.removeUsername() - authUtil.removePassword() - authUtil.removeRememberMe() - authUtil.removeTenantName() + authUtil.removeLoginForm() } authUtil.setToken(res) if (!redirect.value) { diff --git a/yudao-ui-admin-vue3/src/views/infra/apiAccessLog/index.vue b/yudao-ui-admin-vue3/src/views/infra/apiAccessLog/index.vue index ae1aba8a1..14cf656aa 100644 --- a/yudao-ui-admin-vue3/src/views/infra/apiAccessLog/index.vue +++ b/yudao-ui-admin-vue3/src/views/infra/apiAccessLog/index.vue @@ -1,7 +1,7 @@ <template> <ContentWrap> <!-- 列表 --> - <vxe-grid ref="xGrid" v-bind="gridOptions" class="xtable-scrollbar"> + <XTable @register="registerTable"> <template #duration_default="{ row }"> <span>{{ row.duration + 'ms' }}</span> </template> @@ -17,7 +17,7 @@ @click="handleDetail(row)" /> </template> - </vxe-grid> + </XTable> </ContentWrap> <XModal v-model="dialogVisible" :title="dialogTitle"> <!-- 对话框(详情) --> @@ -38,15 +38,14 @@ <script setup lang="ts" name="ApiAccessLog"> import { ref } from 'vue' import { useI18n } from '@/hooks/web/useI18n' -import { useVxeGrid } from '@/hooks/web/useVxeGrid' -import { VxeGridInstance } from 'vxe-table' +import { useXTable } from '@/hooks/web/useXTable' import { allSchemas } from './apiAccessLog.data' import * as ApiAccessLogApi from '@/api/infra/apiAccessLog' + const { t } = useI18n() // 国际化 // 列表相关的变量 -const xGrid = ref<VxeGridInstance>() // 列表 Grid Ref -const { gridOptions } = useVxeGrid<ApiAccessLogApi.ApiAccessLogVO>({ +const [registerTable] = useXTable({ allSchemas: allSchemas, topActionSlots: false, getListApi: ApiAccessLogApi.getApiAccessLogPageApi diff --git a/yudao-ui-admin-vue3/src/views/infra/apiErrorLog/index.vue b/yudao-ui-admin-vue3/src/views/infra/apiErrorLog/index.vue index 6a05f063d..2fffc6efc 100644 --- a/yudao-ui-admin-vue3/src/views/infra/apiErrorLog/index.vue +++ b/yudao-ui-admin-vue3/src/views/infra/apiErrorLog/index.vue @@ -1,14 +1,14 @@ <template> <ContentWrap> <!-- 列表 --> - <vxe-grid ref="xGrid" v-bind="gridOptions" class="xtable-scrollbar"> + <XTable @register="registerTable"> <!-- 操作:导出 --> <template #toolbar_buttons> <XButton type="warning" preIcon="ep:download" :title="t('action.export')" - @click="handleExport()" + @click="exportList('错误数据.xls')" /> </template> <template #duration_default="{ row }"> @@ -40,7 +40,7 @@ @click="handleProcessClick(row, InfraApiErrorLogProcessStatusEnum.IGNORE, '已忽略')" /> </template> - </vxe-grid> + </XTable> </ContentWrap> <XModal v-model="dialogVisible" :title="dialogTitle"> <!-- 对话框(详情) --> @@ -54,18 +54,17 @@ <script setup lang="ts" name="ApiErrorLog"> import { ref } from 'vue' import { useI18n } from '@/hooks/web/useI18n' -import { useVxeGrid } from '@/hooks/web/useVxeGrid' -import { VxeGridInstance } from 'vxe-table' +import { useXTable } from '@/hooks/web/useXTable' import { allSchemas } from './apiErrorLog.data' import * as ApiErrorLogApi from '@/api/infra/apiErrorLog' import { InfraApiErrorLogProcessStatusEnum } from '@/utils/constants' import { useMessage } from '@/hooks/web/useMessage' -const message = useMessage() + const { t } = useI18n() // 国际化 +const message = useMessage() // ========== 列表相关 ========== -const xGrid = ref<VxeGridInstance>() // 列表 Grid Ref -const { gridOptions, getList, exportList } = useVxeGrid<ApiErrorLogApi.ApiErrorLogVO>({ +const [registerTable, { reload, exportList }] = useXTable({ allSchemas: allSchemas, getListApi: ApiErrorLogApi.getApiErrorLogPageApi, exportListApi: ApiErrorLogApi.exportApiErrorLogApi @@ -82,10 +81,7 @@ const handleDetail = (row: ApiErrorLogApi.ApiErrorLogVO) => { dialogTitle.value = t('action.detail') dialogVisible.value = true } -// 导出 -const handleExport = async () => { - await exportList(xGrid, '错误数据.xls') -} + // 异常处理操作 const handleProcessClick = ( row: ApiErrorLogApi.ApiErrorLogVO, @@ -100,7 +96,7 @@ const handleProcessClick = ( }) .finally(async () => { // 刷新列表 - await getList(xGrid) + await reload() }) .catch(() => {}) } diff --git a/yudao-ui-admin-vue3/src/views/infra/codegen/index.vue b/yudao-ui-admin-vue3/src/views/infra/codegen/index.vue index 68a214fd3..4e8ef8fa5 100644 --- a/yudao-ui-admin-vue3/src/views/infra/codegen/index.vue +++ b/yudao-ui-admin-vue3/src/views/infra/codegen/index.vue @@ -1,7 +1,7 @@ <template> <ContentWrap> <!-- 列表 --> - <vxe-grid ref="xGrid" v-bind="gridOptions" class="xtable-scrollbar"> + <XTable @register="registerTable"> <template #toolbar_buttons> <!-- 操作:导入 --> <XButton @@ -32,7 +32,7 @@ preIcon="ep:delete" :title="t('action.del')" v-hasPermi="['infra:codegen:delete']" - @click="handleDelete(row.id)" + @click="deleteData(row.id)" /> <!-- 操作:同步 --> <XTextButton @@ -49,20 +49,19 @@ @click="handleGenTable(row)" /> </template> - </vxe-grid> + </XTable> </ContentWrap> <!-- 弹窗:导入表 --> - <ImportTable ref="importRef" @ok="handleQuery()" /> + <ImportTable ref="importRef" @ok="reload()" /> <!-- 弹窗:预览代码 --> <Preview ref="previewRef" /> </template> <script setup lang="ts" name="Codegen"> import { ref } from 'vue' import { useRouter } from 'vue-router' -import { VxeGridInstance } from 'vxe-table' import { useI18n } from '@/hooks/web/useI18n' import { useMessage } from '@/hooks/web/useMessage' -import { useVxeGrid } from '@/hooks/web/useVxeGrid' +import { useXTable } from '@/hooks/web/useXTable' import download from '@/utils/download' import * as CodegenApi from '@/api/infra/codegen' import { CodegenTableVO } from '@/api/infra/codegen/types' @@ -73,8 +72,7 @@ const { t } = useI18n() // 国际化 const message = useMessage() // 消息弹窗 const { push } = useRouter() // 路由跳转 // 列表相关的变量 -const xGrid = ref<VxeGridInstance>() // 列表 Grid Ref -const { gridOptions, getList, deleteData } = useVxeGrid<CodegenTableVO>({ +const [registerTable, { reload, deleteData }] = useXTable({ allSchemas: allSchemas, getListApi: CodegenApi.getCodegenTablePageApi, deleteApi: CodegenApi.deleteCodegenTableApi @@ -105,17 +103,10 @@ const handleSynchDb = (row: CodegenTableVO) => { message.success('同步成功') }) } + // 生成代码操作 const handleGenTable = async (row: CodegenTableVO) => { const res = await CodegenApi.downloadCodegenApi(row.id) download.zip(res, 'codegen-' + row.className + '.zip') } -// 删除操作 -const handleDelete = async (rowId: number) => { - await deleteData(xGrid, rowId) -} -// 查询操作 -const handleQuery = async () => { - await getList(xGrid) -} </script> diff --git a/yudao-ui-admin-vue3/src/views/infra/config/index.vue b/yudao-ui-admin-vue3/src/views/infra/config/index.vue index 50a067fcb..e726ab8d9 100644 --- a/yudao-ui-admin-vue3/src/views/infra/config/index.vue +++ b/yudao-ui-admin-vue3/src/views/infra/config/index.vue @@ -1,7 +1,7 @@ <template> <ContentWrap> <!-- 列表 --> - <vxe-grid ref="xGrid" v-bind="gridOptions" class="xtable-scrollbar"> + <XTable @register="registerTable"> <template #toolbar_buttons> <!-- 操作:新增 --> <XButton @@ -17,7 +17,7 @@ preIcon="ep:download" :title="t('action.export')" v-hasPermi="['infra:config:export']" - @click="handleExport()" + @click="exportList('配置.xls')" /> </template> <template #visible_default="{ row }"> @@ -43,10 +43,10 @@ preIcon="ep:delete" :title="t('action.del')" v-hasPermi="['infra:config:delete']" - @click="handleDelete(row.id)" + @click="deleteData(row.id)" /> </template> - </vxe-grid> + </XTable> </ContentWrap> <XModal v-model="dialogVisible" :title="dialogTitle"> @@ -87,8 +87,7 @@ import { ref, unref } from 'vue' import { useI18n } from '@/hooks/web/useI18n' import { useMessage } from '@/hooks/web/useMessage' -import { useVxeGrid } from '@/hooks/web/useVxeGrid' -import { VxeGridInstance } from 'vxe-table' +import { useXTable } from '@/hooks/web/useXTable' import { FormExpose } from '@/components/Form' // 业务相关的 import import * as ConfigApi from '@/api/infra/config' @@ -97,8 +96,7 @@ import { rules, allSchemas } from './config.data' const { t } = useI18n() // 国际化 const message = useMessage() // 消息弹窗 // 列表相关的变量 -const xGrid = ref<VxeGridInstance>() // 列表 Grid Ref -const { gridOptions, getList, deleteData, exportList } = useVxeGrid<ConfigApi.ConfigVO>({ +const [registerTable, { reload, deleteData, exportList }] = useXTable({ allSchemas: allSchemas, getListApi: ConfigApi.getConfigPageApi, deleteApi: ConfigApi.deleteConfigApi, @@ -125,11 +123,6 @@ const handleCreate = () => { setDialogTile('create') } -// 导出操作 -const handleExport = async () => { - await exportList(xGrid, '配置.xls') -} - // 修改操作 const handleUpdate = async (rowId: number) => { setDialogTile('update') @@ -145,11 +138,6 @@ const handleDetail = async (rowId: number) => { detailData.value = res } -// 删除操作 -const handleDelete = async (rowId: number) => { - await deleteData(xGrid, rowId) -} - // 提交按钮 const submitForm = async () => { const elForm = unref(formRef)?.getElFormRef() @@ -171,7 +159,7 @@ const submitForm = async () => { } finally { actionLoading.value = false // 刷新列表 - await getList(xGrid) + await reload() } } }) diff --git a/yudao-ui-admin-vue3/src/views/infra/dataSourceConfig/index.vue b/yudao-ui-admin-vue3/src/views/infra/dataSourceConfig/index.vue index bb0937580..0326a386d 100644 --- a/yudao-ui-admin-vue3/src/views/infra/dataSourceConfig/index.vue +++ b/yudao-ui-admin-vue3/src/views/infra/dataSourceConfig/index.vue @@ -1,7 +1,7 @@ <template> <ContentWrap> <!-- 列表 --> - <vxe-grid ref="xGrid" v-bind="gridOptions" class="xtable-scrollbar"> + <XTable @register="registerTable"> <template #toolbar_buttons> <XButton type="primary" @@ -31,10 +31,10 @@ preIcon="ep:delete" :title="t('action.del')" v-hasPermi="['infra:data-source-config:delete']" - @click="handleDelete(row.id)" + @click="deleteData(row.id)" /> </template> - </vxe-grid> + </XTable> </ContentWrap> <XModal v-model="dialogVisible" :title="dialogTitle"> <!-- 对话框(添加 / 修改) --> @@ -69,9 +69,8 @@ // 全局相关的 import import { ref, unref } from 'vue' import { useI18n } from '@/hooks/web/useI18n' +import { useXTable } from '@/hooks/web/useXTable' import { useMessage } from '@/hooks/web/useMessage' -import { useVxeGrid } from '@/hooks/web/useVxeGrid' -import { VxeGridInstance } from 'vxe-table' import { FormExpose } from '@/components/Form' // 业务相关的 import import * as DataSourceConfiggApi from '@/api/infra/dataSourceConfig' @@ -80,8 +79,7 @@ import { rules, allSchemas } from './dataSourceConfig.data' const { t } = useI18n() // 国际化 const message = useMessage() // 消息弹窗 // 列表相关的变量 -const xGrid = ref<VxeGridInstance>() // 列表 Grid Ref -const { gridOptions, getList, deleteData } = useVxeGrid<DataSourceConfiggApi.DataSourceConfigVO>({ +const [registerTable, { reload, deleteData }] = useXTable({ allSchemas: allSchemas, isList: true, getListApi: DataSourceConfiggApi.getDataSourceConfigListApi, @@ -123,11 +121,6 @@ const handleDetail = async (rowId: number) => { setDialogTile('detail') } -// 删除操作 -const handleDelete = async (rowId: number) => { - await deleteData(xGrid, rowId) -} - // 提交按钮 const submitForm = async () => { const elForm = unref(formRef)?.getElFormRef() @@ -149,7 +142,7 @@ const submitForm = async () => { } finally { loading.value = false // 刷新列表 - await getList(xGrid) + await reload() } } }) diff --git a/yudao-ui-admin-vue3/src/views/infra/fileConfig/index.vue b/yudao-ui-admin-vue3/src/views/infra/fileConfig/index.vue index e50905e8b..227efab29 100644 --- a/yudao-ui-admin-vue3/src/views/infra/fileConfig/index.vue +++ b/yudao-ui-admin-vue3/src/views/infra/fileConfig/index.vue @@ -1,7 +1,7 @@ <template> <ContentWrap> <!-- 列表 --> - <vxe-grid ref="xGrid" v-bind="gridOptions" class="xtable-scrollbar"> + <XTable @register="registerTable"> <template #toolbar_buttons> <!-- 操作:新增 --> <XButton @@ -41,10 +41,10 @@ preIcon="ep:delete" :title="t('action.del')" v-hasPermi="['infra:file-config:delete']" - @click="handleDelete(row.id)" + @click="deleteData(row.id)" /> </template> - </vxe-grid> + </XTable> </ContentWrap> <XModal v-model="dialogVisible" :title="dialogTitle"> <!-- 对话框(添加 / 修改) --> @@ -173,8 +173,7 @@ import { } from 'element-plus' import { useI18n } from '@/hooks/web/useI18n' import { useMessage } from '@/hooks/web/useMessage' -import { useVxeGrid } from '@/hooks/web/useVxeGrid' -import { VxeGridInstance } from 'vxe-table' +import { useXTable } from '@/hooks/web/useXTable' // 业务相关的 import import * as FileConfigApi from '@/api/infra/fileConfig' import { rules, allSchemas } from './fileConfig.data' @@ -183,8 +182,7 @@ import { getIntDictOptions, DICT_TYPE } from '@/utils/dict' const { t } = useI18n() // 国际化 const message = useMessage() // 消息弹窗 // 列表相关的变量 -const xGrid = ref<VxeGridInstance>() // 列表 Grid Ref -const { gridOptions, getList, deleteData } = useVxeGrid<FileConfigApi.FileConfigVO>({ +const [registerTable, { reload, deleteData }] = useXTable({ allSchemas: allSchemas, getListApi: FileConfigApi.getFileConfigPageApi, deleteApi: FileConfigApi.deleteFileConfigApi @@ -276,7 +274,7 @@ const handleMaster = (row: FileConfigApi.FileConfigVO) => { .confirm('是否确认修改配置【 ' + row.name + ' 】为主配置?', t('common.reminder')) .then(async () => { await FileConfigApi.updateFileConfigMasterApi(row.id) - await getList(xGrid) + await reload() }) } @@ -285,11 +283,6 @@ const handleTest = async (rowId: number) => { message.alert('测试通过,上传文件成功!访问地址:' + res) } -// 删除操作 -const handleDelete = async (rowId: number) => { - await deleteData(xGrid, rowId) -} - // 提交按钮 const submitForm = async (formEl: FormInstance | undefined) => { if (!formEl) return @@ -308,7 +301,7 @@ const submitForm = async (formEl: FormInstance | undefined) => { dialogVisible.value = false } finally { actionLoading.value = false - await getList(xGrid) + await reload() } } }) diff --git a/yudao-ui-admin-vue3/src/views/infra/fileList/fileList.data.ts b/yudao-ui-admin-vue3/src/views/infra/fileList/fileList.data.ts index 509de4f48..cc0516014 100644 --- a/yudao-ui-admin-vue3/src/views/infra/fileList/fileList.data.ts +++ b/yudao-ui-admin-vue3/src/views/infra/fileList/fileList.data.ts @@ -23,7 +23,7 @@ const crudSchemas = reactive<VxeCrudSchema>({ field: 'url', table: { cellRender: { - name: 'XImg' + name: 'XPreview' } } }, diff --git a/yudao-ui-admin-vue3/src/views/infra/fileList/index.vue b/yudao-ui-admin-vue3/src/views/infra/fileList/index.vue index 5c6295845..946c165b7 100644 --- a/yudao-ui-admin-vue3/src/views/infra/fileList/index.vue +++ b/yudao-ui-admin-vue3/src/views/infra/fileList/index.vue @@ -1,7 +1,7 @@ <template> <ContentWrap> <!-- 列表 --> - <vxe-grid ref="xGrid" v-bind="gridOptions" class="xtable-scrollbar"> + <XTable @register="registerTable"> <template #toolbar_buttons> <XButton type="primary" @@ -21,10 +21,10 @@ preIcon="ep:delete" :title="t('action.del')" v-hasPermi="['infra:file:delete']" - @click="handleDelete(row.id)" + @click="deleteData(row.id)" /> </template> - </vxe-grid> + </XTable> </ContentWrap> <XModal v-model="dialogVisible" :title="dialogTitle"> <!-- 对话框(详情) --> @@ -85,8 +85,7 @@ import { ref, unref } from 'vue' import { useI18n } from '@/hooks/web/useI18n' import { useMessage } from '@/hooks/web/useMessage' -import { useVxeGrid } from '@/hooks/web/useVxeGrid' -import { VxeGridInstance } from 'vxe-table' +import { useXTable } from '@/hooks/web/useXTable' import { ElUpload, ElImage, UploadInstance, UploadRawFile } from 'element-plus' // 业务相关的 import import { allSchemas } from './fileList.data' @@ -98,8 +97,7 @@ const { t } = useI18n() // 国际化 const message = useMessage() // 消息弹窗 // 列表相关的变量 -const xGrid = ref<VxeGridInstance>() // 列表 Grid Ref -const { gridOptions, getList, deleteData } = useVxeGrid<FileApi.FileVO>({ +const [registerTable, { reload, deleteData }] = useXTable({ allSchemas: allSchemas, getListApi: FileApi.getFilePageApi, deleteApi: FileApi.deleteFileApi @@ -145,7 +143,7 @@ const handleFileSuccess = async (response: any): Promise<void> => { message.success('上传成功') uploadDialogVisible.value = false uploadDisabled.value = false - await getList(xGrid) + await reload() } // 文件数超出提示 const handleExceed = (): void => { @@ -164,11 +162,6 @@ const handleDetail = (row: FileApi.FileVO) => { dialogVisible.value = true } -// 删除操作 -const handleDelete = async (rowId: number) => { - await deleteData(xGrid, rowId) -} - // ========== 复制相关 ========== const handleCopy = async (text: string) => { const { copy, copied, isSupported } = useClipboard({ source: text }) diff --git a/yudao-ui-admin-vue3/src/views/infra/job/JobLog.vue b/yudao-ui-admin-vue3/src/views/infra/job/JobLog.vue index 94c33eb47..801b067de 100644 --- a/yudao-ui-admin-vue3/src/views/infra/job/JobLog.vue +++ b/yudao-ui-admin-vue3/src/views/infra/job/JobLog.vue @@ -1,14 +1,14 @@ <template> <ContentWrap> <!-- 列表 --> - <vxe-grid ref="xGrid" v-bind="gridOptions" class="xtable-scrollbar"> + <XTable @register="registerTable"> <template #toolbar_buttons> <XButton type="warning" preIcon="ep:download" :title="t('action.export')" v-hasPermi="['infra:job:export']" - @click="handleExport()" + @click="exportList('定时任务详情.xls')" /> </template> <template #beginTime_default="{ row }"> @@ -29,7 +29,7 @@ @click="handleDetail(row)" /> </template> - </vxe-grid> + </XTable> </ContentWrap> <XModal v-model="dialogVisible" :title="dialogTitle"> <!-- 对话框(详情) --> @@ -51,15 +51,13 @@ import { ref } from 'vue' import dayjs from 'dayjs' import { useI18n } from '@/hooks/web/useI18n' -import { useVxeGrid } from '@/hooks/web/useVxeGrid' -import { VxeGridInstance } from 'vxe-table' +import { useXTable } from '@/hooks/web/useXTable' import * as JobLogApi from '@/api/infra/jobLog' import { allSchemas } from './jobLog.data' const { t } = useI18n() // 国际化 // 列表相关的变量 -const xGrid = ref<VxeGridInstance>() // 列表 Grid Ref -const { gridOptions, exportList } = useVxeGrid<JobLogApi.JobLogVO>({ +const [registerTable, { exportList }] = useXTable({ allSchemas: allSchemas, getListApi: JobLogApi.getJobLogPageApi, exportListApi: JobLogApi.exportJobLogApi @@ -79,8 +77,4 @@ const handleDetail = async (row: JobLogApi.JobLogVO) => { dialogTitle.value = t('action.detail') dialogVisible.value = true } -// 导出操作 -const handleExport = async () => { - await exportList(xGrid, '定时任务详情.xls') -} </script> diff --git a/yudao-ui-admin-vue3/src/views/infra/job/index.vue b/yudao-ui-admin-vue3/src/views/infra/job/index.vue index ad02dfbe1..3d788cd2c 100644 --- a/yudao-ui-admin-vue3/src/views/infra/job/index.vue +++ b/yudao-ui-admin-vue3/src/views/infra/job/index.vue @@ -1,7 +1,7 @@ <template> <ContentWrap> <!-- 列表 --> - <vxe-grid ref="xGrid" v-bind="gridOptions" class="xtable-scrollbar"> + <XTable @register="registerTable"> <template #toolbar_buttons> <!-- 操作:新增 --> <XButton @@ -17,14 +17,14 @@ preIcon="ep:download" :title="t('action.export')" v-hasPermi="['infra:job:export']" - @click="handleExport()" + @click="exportList('定时任务.xls')" /> <XButton type="info" preIcon="ep:zoom-in" title="执行日志" v-hasPermi="['infra:job:query']" - @click="handleJobLog" + @click="handleJobLog()" /> </template> <template #actionbtns_default="{ row }"> @@ -46,7 +46,7 @@ preIcon="ep:delete" :title="t('action.del')" v-hasPermi="['infra:job:delete']" - @click="handleDelete(row.id)" + @click="deleteData(row.id)" /> <el-dropdown class="p-0.5" v-hasPermi="['infra:job:trigger', 'infra:job:query']"> <XTextButton :title="t('action.more')" postIcon="ep:arrow-down" /> @@ -83,7 +83,7 @@ </template> </el-dropdown> </template> - </vxe-grid> + </XTable> </ContentWrap> <XModal v-model="dialogVisible" :title="dialogTitle"> <!-- 对话框(添加 / 修改) --> @@ -134,8 +134,7 @@ import { useRouter } from 'vue-router' import { ElDropdown, ElDropdownMenu, ElDropdownItem } from 'element-plus' import { useI18n } from '@/hooks/web/useI18n' import { useMessage } from '@/hooks/web/useMessage' -import { useVxeGrid } from '@/hooks/web/useVxeGrid' -import { VxeGridInstance } from 'vxe-table' +import { useXTable } from '@/hooks/web/useXTable' import { FormExpose } from '@/components/Form' import { Crontab } from '@/components/Crontab' import * as JobApi from '@/api/infra/job' @@ -147,8 +146,7 @@ const message = useMessage() // 消息弹窗 const { push } = useRouter() // 列表相关的变量 -const xGrid = ref<VxeGridInstance>() // 列表 Grid Ref -const { gridOptions, getList, deleteData, exportList } = useVxeGrid<JobApi.JobVO>({ +const [registerTable, { reload, deleteData, exportList }] = useXTable({ allSchemas: allSchemas, getListApi: JobApi.getJobPageApi, deleteApi: JobApi.deleteJobApi, @@ -181,11 +179,6 @@ const handleCreate = () => { setDialogTile('create') } -// 导出操作 -const handleExport = async () => { - await exportList(xGrid, '定时任务.xls') -} - // 修改操作 const handleUpdate = async (rowId: number) => { setDialogTile('update') @@ -250,10 +243,6 @@ const parseTime = (time) => { return time_str } -// 删除操作 -const handleDelete = async (rowId: number) => { - await deleteData(xGrid, rowId) -} const handleChangeStatus = async (row: JobApi.JobVO) => { const text = row.status === InfraJobStatusEnum.STOP ? '开启' : '关闭' const status = @@ -267,7 +256,7 @@ const handleChangeStatus = async (row: JobApi.JobVO) => { : InfraJobStatusEnum.STOP await JobApi.updateJobStatusApi(row.id, status) message.success(text + '成功') - await getList(xGrid) + await reload() }) .catch(() => { row.status = @@ -277,7 +266,7 @@ const handleChangeStatus = async (row: JobApi.JobVO) => { }) } // 执行日志 -const handleJobLog = (rowId: number) => { +const handleJobLog = (rowId?: number) => { if (rowId) { push('/job/job-log?id=' + rowId) } else { @@ -289,7 +278,7 @@ const handleRun = (row: JobApi.JobVO) => { message.confirm('确认要立即执行一次' + row.name + '?', t('common.reminder')).then(async () => { await JobApi.runJobApi(row.id) message.success('执行成功') - await getList(xGrid) + await reload() }) } // 提交按钮 @@ -312,7 +301,7 @@ const submitForm = async () => { dialogVisible.value = false } finally { actionLoading.value = false - await getList(xGrid) + await reload() } } }) diff --git a/yudao-ui-admin-vue3/src/views/infra/webSocket/index.vue b/yudao-ui-admin-vue3/src/views/infra/webSocket/index.vue new file mode 100644 index 000000000..4820204a0 --- /dev/null +++ b/yudao-ui-admin-vue3/src/views/infra/webSocket/index.vue @@ -0,0 +1,118 @@ +<template> + <div class="flex"> + <el-card class="w-1/2" :gutter="12" shadow="always"> + <template #header> + <div class="card-header"> + <span>连接</span> + </div> + </template> + <div class="flex items-center"> + <span class="text-lg font-medium mr-4"> 连接状态: </span> + <el-tag :color="getTagColor">{{ status }}</el-tag> + </div> + <hr class="my-4" /> + + <div class="flex"> + <el-input v-model="server" disabled> + <template #prepend> 服务地址 </template> + </el-input> + <el-button :type="getIsOpen ? 'danger' : 'primary'" @click="toggle"> + {{ getIsOpen ? '关闭连接' : '开启连接' }} + </el-button> + </div> + <p class="text-lg font-medium mt-4">设置</p> + <hr class="my-4" /> + <el-input + v-model="sendValue" + :autosize="{ minRows: 2, maxRows: 4 }" + type="textarea" + :disabled="!getIsOpen" + clearable + /> + <el-button type="primary" block class="mt-4" :disabled="!getIsOpen" @click="handlerSend"> + 发送 + </el-button> + </el-card> + <el-card class="w-1/2" :gutter="12" shadow="always"> + <template #header> + <div class="card-header"> + <span>消息记录</span> + </div> + </template> + <div class="max-h-80 overflow-auto"> + <ul> + <li v-for="item in getList" class="mt-2" :key="item.time"> + <div class="flex items-center"> + <span class="mr-2 text-primary font-medium">收到消息:</span> + <span>{{ dayjs(item.time).format('YYYY-MM-DD HH:mm:ss') }}</span> + </div> + <div> + {{ item.res }} + </div> + </li> + </ul> + </div> + </el-card> + </div> +</template> +<script setup lang="ts"> +import { computed, reactive, ref, watchEffect } from 'vue' +import { ElCard, ElInput, ElTag } from 'element-plus' +import { useWebSocket } from '@vueuse/core' +import dayjs from 'dayjs' +import { useUserStore } from '@/store/modules/user' + +const userStore = useUserStore() + +const sendValue = ref('') + +const server = ref( + (import.meta.env.VITE_BASE_URL + '/websocket/message').replace('http', 'ws') + + '?userId=' + + userStore.getUser.id +) + +const state = reactive({ + recordList: [] as { id: number; time: number; res: string }[] +}) + +const { status, data, send, close, open } = useWebSocket(server.value, { + autoReconnect: false, + heartbeat: true +}) + +watchEffect(() => { + if (data.value) { + try { + const res = JSON.parse(data.value) + state.recordList.push(res) + } catch (error) { + state.recordList.push({ + res: data.value, + id: Math.ceil(Math.random() * 1000), + time: new Date().getTime() + }) + } + } +}) + +const getIsOpen = computed(() => status.value === 'OPEN') +const getTagColor = computed(() => (getIsOpen.value ? 'success' : 'red')) + +const getList = computed(() => { + return [...state.recordList].reverse() +}) + +function handlerSend() { + send(sendValue.value) + sendValue.value = '' +} + +function toggle() { + if (getIsOpen.value) { + close() + } else { + open() + } +} +</script> diff --git a/yudao-ui-admin-vue3/src/views/pay/app/index.vue b/yudao-ui-admin-vue3/src/views/pay/app/index.vue index 10f5286ec..227e3c05d 100644 --- a/yudao-ui-admin-vue3/src/views/pay/app/index.vue +++ b/yudao-ui-admin-vue3/src/views/pay/app/index.vue @@ -1,7 +1,7 @@ <template> <ContentWrap> <!-- 列表 --> - <vxe-grid ref="xGrid" v-bind="gridOptions" class="xtable-scrollbar"> + <XTable @register="registerTable"> <template #toolbar_buttons> <!-- 操作:新增 --> <XButton @@ -17,7 +17,7 @@ preIcon="ep:download" :title="t('action.export')" v-hasPermi="['pay:app:export']" - @click="handleExport()" + @click="exportList('应用信息.xls')" /> </template> <template #actionbtns_default="{ row }"> @@ -40,10 +40,10 @@ preIcon="ep:delete" :title="t('action.del')" v-hasPermi="['pay:app:delete']" - @click="handleDelete(row.id)" + @click="deleteData(row.id)" /> </template> - </vxe-grid> + </XTable> </ContentWrap> <XModal v-model="dialogVisible" :title="dialogTitle"> @@ -79,8 +79,7 @@ import { ref, unref } from 'vue' import { useI18n } from '@/hooks/web/useI18n' import { useMessage } from '@/hooks/web/useMessage' -import { useVxeGrid } from '@/hooks/web/useVxeGrid' -import { VxeGridInstance } from 'vxe-table' +import { useXTable } from '@/hooks/web/useXTable' import { FormExpose } from '@/components/Form' import { rules, allSchemas } from './app.data' import * as AppApi from '@/api/pay/app' @@ -89,8 +88,7 @@ const { t } = useI18n() // 国际化 const message = useMessage() // 消息弹窗 // 列表相关的变量 -const xGrid = ref<VxeGridInstance>() // 列表 Grid Ref -const { gridOptions, getList, deleteData, exportList } = useVxeGrid<AppApi.AppVO>({ +const [registerTable, { reload, deleteData, exportList }] = useXTable({ allSchemas: allSchemas, getListApi: AppApi.getAppPageApi, deleteApi: AppApi.deleteAppApi, @@ -117,11 +115,6 @@ const handleCreate = () => { setDialogTile('create') } -// 导出操作 -const handleExport = async () => { - await exportList(xGrid, '应用信息.xls') -} - // 修改操作 const handleUpdate = async (rowId: number) => { setDialogTile('update') @@ -137,11 +130,6 @@ const handleDetail = async (rowId: number) => { detailData.value = res } -// 删除操作 -const handleDelete = async (rowId: number) => { - await deleteData(xGrid, rowId) -} - // 提交按钮 const submitForm = async () => { const elForm = unref(formRef)?.getElFormRef() @@ -163,7 +151,7 @@ const submitForm = async () => { } finally { actionLoading.value = false // 刷新列表 - await getList(xGrid) + await reload() } } }) diff --git a/yudao-ui-admin-vue3/src/views/pay/merchant/index.vue b/yudao-ui-admin-vue3/src/views/pay/merchant/index.vue index 131f45e8e..18ea70771 100644 --- a/yudao-ui-admin-vue3/src/views/pay/merchant/index.vue +++ b/yudao-ui-admin-vue3/src/views/pay/merchant/index.vue @@ -1,7 +1,7 @@ <template> <ContentWrap> <!-- 列表 --> - <vxe-grid ref="xGrid" v-bind="gridOptions" class="xtable-scrollbar"> + <XTable @register="registerTable"> <template #toolbar_buttons> <!-- 操作:新增 --> <XButton @@ -17,7 +17,7 @@ preIcon="ep:download" :title="t('action.export')" v-hasPermi="['pay:merchant:export']" - @click="handleExport()" + @click="exportList('商户列表.xls')" /> </template> <template #actionbtns_default="{ row }"> @@ -40,10 +40,10 @@ preIcon="ep:delete" :title="t('action.del')" v-hasPermi="['pay:merchant:delete']" - @click="handleDelete(row.id)" + @click="deleteData(row.id)" /> </template> - </vxe-grid> + </XTable> </ContentWrap> <XModal v-model="dialogVisible" :title="dialogTitle"> <!-- 对话框(添加 / 修改) --> @@ -78,8 +78,7 @@ import { ref, unref } from 'vue' import { useI18n } from '@/hooks/web/useI18n' import { useMessage } from '@/hooks/web/useMessage' -import { useVxeGrid } from '@/hooks/web/useVxeGrid' -import { VxeGridInstance } from 'vxe-table' +import { useXTable } from '@/hooks/web/useXTable' import { FormExpose } from '@/components/Form' import { rules, allSchemas } from './merchant.data' import * as MerchantApi from '@/api/pay/merchant' @@ -87,8 +86,7 @@ import * as MerchantApi from '@/api/pay/merchant' const { t } = useI18n() // 国际化 const message = useMessage() // 消息弹窗 // 列表相关的变量 -const xGrid = ref<VxeGridInstance>() // 列表 Grid Ref -const { gridOptions, getList, deleteData, exportList } = useVxeGrid<MerchantApi.MerchantVO>({ +const [registerTable, { reload, deleteData, exportList }] = useXTable({ allSchemas: allSchemas, getListApi: MerchantApi.getMerchantPageApi, deleteApi: MerchantApi.deleteMerchantApi, @@ -115,11 +113,6 @@ const handleCreate = () => { setDialogTile('create') } -// 导出操作 -const handleExport = async () => { - await exportList(xGrid, '商户列表.xls') -} - // 修改操作 const handleUpdate = async (rowId: number) => { setDialogTile('update') @@ -135,11 +128,6 @@ const handleDetail = async (rowId: number) => { detailData.value = res } -// 删除操作 -const handleDelete = async (rowId: number) => { - await deleteData(xGrid, rowId) -} - // 提交按钮 const submitForm = async () => { const elForm = unref(formRef)?.getElFormRef() @@ -161,7 +149,7 @@ const submitForm = async () => { } finally { actionLoading.value = false // 刷新列表 - await getList(xGrid) + await reload() } } }) diff --git a/yudao-ui-admin-vue3/src/views/pay/order/index.vue b/yudao-ui-admin-vue3/src/views/pay/order/index.vue index e98c2c447..a0d82a41d 100644 --- a/yudao-ui-admin-vue3/src/views/pay/order/index.vue +++ b/yudao-ui-admin-vue3/src/views/pay/order/index.vue @@ -1,7 +1,7 @@ <template> <ContentWrap> <!-- 列表 --> - <vxe-grid ref="xGrid" v-bind="gridOptions" class="xtable-scrollbar"> + <XTable @register="registerTable"> <template #toolbar_buttons> <!-- 操作:新增 --> <XButton @@ -17,7 +17,7 @@ preIcon="ep:download" :title="t('action.export')" v-hasPermi="['pay:order:export']" - @click="handleExport()" + @click="exportList('订单数据.xls')" /> </template> <template #actionbtns_default="{ row }"> @@ -29,7 +29,7 @@ @click="handleDetail(row.id)" /> </template> - </vxe-grid> + </XTable> </ContentWrap> <XModal v-model="dialogVisible" :title="dialogTitle"> <!-- 对话框(详情) --> @@ -44,15 +44,13 @@ <script setup lang="ts" name="Order"> import { ref } from 'vue' import { useI18n } from '@/hooks/web/useI18n' -import { useVxeGrid } from '@/hooks/web/useVxeGrid' -import { VxeGridInstance } from 'vxe-table' +import { useXTable } from '@/hooks/web/useXTable' import { allSchemas } from './order.data' import * as OrderApi from '@/api/pay/order' const { t } = useI18n() // 国际化 // 列表相关的变量 -const xGrid = ref<VxeGridInstance>() // 列表 Grid Ref -const { gridOptions, exportList } = useVxeGrid<OrderApi.OrderVO>({ +const [registerTable, { exportList }] = useXTable({ allSchemas: allSchemas, getListApi: OrderApi.getOrderPageApi, exportListApi: OrderApi.exportOrderApi @@ -74,10 +72,6 @@ const setDialogTile = (type: string) => { const handleCreate = () => { setDialogTile('create') } -// 导出操作 -const handleExport = async () => { - await exportList(xGrid, '订单数据.xls') -} // 详情操作 const handleDetail = async (rowId: number) => { diff --git a/yudao-ui-admin-vue3/src/views/pay/refund/index.vue b/yudao-ui-admin-vue3/src/views/pay/refund/index.vue index 2c7856fa6..94da462b4 100644 --- a/yudao-ui-admin-vue3/src/views/pay/refund/index.vue +++ b/yudao-ui-admin-vue3/src/views/pay/refund/index.vue @@ -1,7 +1,7 @@ <template> <ContentWrap> <!-- 列表 --> - <vxe-grid ref="xGrid" v-bind="gridOptions" class="xtable-scrollbar"> + <XTable @register="registerTable"> <template #toolbar_buttons> <!-- 操作:导出 --> <XButton @@ -9,7 +9,7 @@ preIcon="ep:download" :title="t('action.export')" v-hasPermi="['pay:refund:export']" - @click="handleExport()" + @click="exportList('退款订单.xls')" /> </template> <template #actionbtns_default="{ row }"> @@ -21,7 +21,7 @@ @click="handleDetail(row.id)" /> </template> - </vxe-grid> + </XTable> </ContentWrap> <XModal v-model="dialogVisible" :title="t('action.detail')"> @@ -36,26 +36,19 @@ <script setup lang="ts" name="Refund"> import { ref } from 'vue' import { useI18n } from '@/hooks/web/useI18n' -import { useVxeGrid } from '@/hooks/web/useVxeGrid' -import { VxeGridInstance } from 'vxe-table' +import { useXTable } from '@/hooks/web/useXTable' import { allSchemas } from './refund.data' import * as RefundApi from '@/api/pay/refund' const { t } = useI18n() // 国际化 // 列表相关的变量 -const xGrid = ref<VxeGridInstance>() // 列表 Grid Ref -const { gridOptions, exportList } = useVxeGrid<RefundApi.RefundVO>({ +const [registerTable, { exportList }] = useXTable({ allSchemas: allSchemas, getListApi: RefundApi.getRefundPageApi, exportListApi: RefundApi.exportRefundApi }) -// 导出操作 -const handleExport = async () => { - await exportList(xGrid, '退款订单.xls') -} - // ========== CRUD 相关 ========== const dialogVisible = ref(false) // 是否显示弹出层 const detailData = ref() // 详情 Ref diff --git a/yudao-ui-admin-vue3/src/views/system/dept/index.vue b/yudao-ui-admin-vue3/src/views/system/dept/index.vue index 6a5b50e66..f6bd26d2b 100644 --- a/yudao-ui-admin-vue3/src/views/system/dept/index.vue +++ b/yudao-ui-admin-vue3/src/views/system/dept/index.vue @@ -1,7 +1,7 @@ <template> <ContentWrap> <!-- 列表 --> - <vxe-grid ref="xGrid" v-bind="gridOptions" show-overflow class="xtable-scrollbar"> + <XTable ref="xGrid" @register="registerTable" show-overflow> <template #toolbar_buttons> <!-- 操作:新增 --> <XButton @@ -11,8 +11,8 @@ v-hasPermi="['system:dept:create']" @click="handleCreate()" /> - <XButton title="展开所有" @click="xGrid?.setAllTreeExpand(true)" /> - <XButton title="关闭所有" @click="xGrid?.clearTreeExpand()" /> + <XButton title="展开所有" @click="xGrid?.Ref.setAllTreeExpand(true)" /> + <XButton title="关闭所有" @click="xGrid?.Ref.clearTreeExpand()" /> </template> <template #leaderUserId_default="{ row }"> <span>{{ userNicknameFormat(row) }}</span> @@ -30,10 +30,10 @@ preIcon="ep:delete" :title="t('action.del')" v-hasPermi="['system:dept:delete']" - @click="handleDelete(row.id)" + @click="deleteData(row.id)" /> </template> - </vxe-grid> + </XTable> </ContentWrap> <!-- 添加或修改菜单对话框 --> <XModal id="deptModel" v-model="dialogVisible" :title="dialogTitle"> @@ -77,11 +77,10 @@ <script setup lang="ts" name="Dept"> import { nextTick, onMounted, ref, unref } from 'vue' import { ElSelect, ElTreeSelect, ElOption } from 'element-plus' -import { VxeGridInstance } from 'vxe-table' import { handleTree, defaultProps } from '@/utils/tree' import { useI18n } from '@/hooks/web/useI18n' import { useMessage } from '@/hooks/web/useMessage' -import { useVxeGrid } from '@/hooks/web/useVxeGrid' +import { useXTable } from '@/hooks/web/useXTable' import { FormExpose } from '@/components/Form' import { allSchemas, rules } from './dept.data' import * as DeptApi from '@/api/system/dept' @@ -90,7 +89,7 @@ import { getListSimpleUsersApi, UserVO } from '@/api/system/user' const { t } = useI18n() // 国际化 const message = useMessage() // 消息弹窗 // 列表相关的变量 -const xGrid = ref<VxeGridInstance>() // 列表 Grid Ref +const xGrid = ref<any>() // 列表 Grid Ref const treeConfig = { transform: true, rowField: 'id', @@ -119,7 +118,7 @@ const getTree = async () => { dept.children = handleTree(res) deptOptions.value.push(dept) } -const { gridOptions, getList, deleteData } = useVxeGrid<DeptApi.DeptVO>({ +const [registerTable, { reload, deleteData }] = useXTable({ allSchemas: allSchemas, treeConfig: treeConfig, getListApi: DeptApi.getDeptPageApi, @@ -168,17 +167,12 @@ const submitForm = async () => { dialogVisible.value = false } finally { actionLoading.value = false - await getList(xGrid) + await reload() } } }) } -// 删除操作 -const handleDelete = async (rowId: number) => { - await deleteData(xGrid, rowId) -} - const userNicknameFormat = (row) => { if (!row || !row.leaderUserId) { return '未设置' diff --git a/yudao-ui-admin-vue3/src/views/system/dict/index.vue b/yudao-ui-admin-vue3/src/views/system/dict/index.vue index 2f0a83243..20dfa8f40 100644 --- a/yudao-ui-admin-vue3/src/views/system/dict/index.vue +++ b/yudao-ui-admin-vue3/src/views/system/dict/index.vue @@ -7,12 +7,7 @@ <span>字典分类</span> </div> </template> - <vxe-grid - ref="xTypeGrid" - v-bind="typeGridOptions" - @cell-click="cellClickEvent" - class="xtable-scrollbar" - > + <XTable @register="registerType" @cell-click="cellClickEvent"> <!-- 操作:新增类型 --> <template #toolbar_buttons> <XButton @@ -36,10 +31,10 @@ preIcon="ep:delete" :title="t('action.del')" v-hasPermi="['system:dict:delete']" - @click="handleTypeDelete(row.id)" + @click="typeDeleteData(row.id)" /> </template> - </vxe-grid> + </XTable> <!-- @星语:分页和列表重叠在一起了 --> </el-card> <!-- ====== 字典数据 ====== --> @@ -55,7 +50,7 @@ </div> <div v-if="tableTypeSelect"> <!-- 列表 --> - <vxe-grid ref="xDataGrid" v-bind="dataGridOptions" class="xtable-scrollbar"> + <XTable @register="registerData"> <!-- 操作:新增数据 --> <template #toolbar_buttons> <XButton @@ -79,10 +74,10 @@ v-hasPermi="['system:dict:delete']" preIcon="ep:delete" :title="t('action.del')" - @click="handleDataDelete(row.id)" + @click="dataDeleteData(row.id)" /> </template> - </vxe-grid> + </XTable> </div> </el-card> <XModal id="dictModel" v-model="dialogVisible" :title="dialogTitle"> @@ -130,8 +125,8 @@ import { ref, unref, reactive } from 'vue' import { useI18n } from '@/hooks/web/useI18n' import { useMessage } from '@/hooks/web/useMessage' -import { useVxeGrid } from '@/hooks/web/useVxeGrid' -import { VxeGridInstance, VxeTableEvents } from 'vxe-table' +import { useXTable } from '@/hooks/web/useXTable' +import { VxeTableEvents } from 'vxe-table' import { FormExpose } from '@/components/Form' import { ElInput, ElTag, ElCard } from 'element-plus' import * as DictTypeSchemas from './dict.type' @@ -143,28 +138,18 @@ import { DictDataVO, DictTypeVO } from '@/api/system/dict/types' const { t } = useI18n() // 国际化 const message = useMessage() // 消息弹窗 -const xTypeGrid = ref<VxeGridInstance>() // 列表 Grid Ref -const { - gridOptions: typeGridOptions, - getList: typeGetList, - deleteData: typeDeleteData -} = useVxeGrid<DictTypeVO>({ +const [registerType, { reload: typeGetList, deleteData: typeDeleteData }] = useXTable({ allSchemas: DictTypeSchemas.allSchemas, getListApi: DictTypeApi.getDictTypePageApi, deleteApi: DictTypeApi.deleteDictTypeApi }) -const xDataGrid = ref<VxeGridInstance>() // 列表 Grid Ref const queryParams = reactive({ dictType: null }) -const { - gridOptions: dataGridOptions, - getList: dataGetList, - deleteData: dataDeleteData -} = useVxeGrid<DictDataVO>({ +const [registerData, { reload: dataGetList, deleteData: dataDeleteData }] = useXTable({ allSchemas: DictDataSchemas.allSchemas, - queryParams: queryParams, + params: queryParams, getListApi: DictDataApi.getDictDataPageApi, deleteApi: DictDataApi.deleteDictDataApi }) @@ -199,7 +184,7 @@ const tableTypeSelect = ref(false) const cellClickEvent: VxeTableEvents.CellClick = async ({ row }) => { tableTypeSelect.value = true queryParams.dictType = row['type'] - await dataGetList(xDataGrid) + await dataGetList() parentType.value = row['type'] } // 弹出框 @@ -217,15 +202,6 @@ const setDialogTile = (type: string) => { dialogVisible.value = true } -// 删除操作 -const handleTypeDelete = async (rowId: number) => { - await typeDeleteData(xTypeGrid, rowId) -} - -const handleDataDelete = async (rowId: number) => { - await dataDeleteData(xDataGrid, rowId) -} - // 提交按钮 const submitTypeForm = async () => { const elForm = unref(typeFormRef)?.getElFormRef() @@ -247,7 +223,7 @@ const submitTypeForm = async () => { dialogVisible.value = false } finally { actionLoading.value = false - typeGetList(xTypeGrid) + typeGetList() } } }) @@ -272,7 +248,7 @@ const submitDataForm = async () => { dialogVisible.value = false } finally { actionLoading.value = false - dataGetList(xDataGrid) + dataGetList() } } }) diff --git a/yudao-ui-admin-vue3/src/views/system/errorCode/index.vue b/yudao-ui-admin-vue3/src/views/system/errorCode/index.vue index 2d987ca5d..316d26d17 100644 --- a/yudao-ui-admin-vue3/src/views/system/errorCode/index.vue +++ b/yudao-ui-admin-vue3/src/views/system/errorCode/index.vue @@ -1,7 +1,7 @@ <template> <ContentWrap> <!-- 列表 --> - <vxe-grid ref="xGrid" v-bind="gridOptions" class="xtable-scrollbar"> + <XTable @register="registerTable"> <!-- 操作:新增 --> <template #toolbar_buttons> <XButton @@ -32,10 +32,10 @@ preIcon="ep:delete" :title="t('action.del')" v-hasPermi="['system:error-code:delete']" - @click="handleDelete(row.id)" + @click="deleteData(row.id)" /> </template> - </vxe-grid> + </XTable> </ContentWrap> <!-- 弹窗 --> <XModal id="errorCodeModel" v-model="dialogVisible" :title="dialogTitle"> @@ -71,8 +71,7 @@ import { ref, unref } from 'vue' import { useI18n } from '@/hooks/web/useI18n' import { useMessage } from '@/hooks/web/useMessage' -import { useVxeGrid } from '@/hooks/web/useVxeGrid' -import { VxeGridInstance } from 'vxe-table' +import { useXTable } from '@/hooks/web/useXTable' import { FormExpose } from '@/components/Form' // 业务相关的 import import { rules, allSchemas } from './errorCode.data' @@ -81,8 +80,7 @@ import * as ErrorCodeApi from '@/api/system/errorCode' const { t } = useI18n() // 国际化 const message = useMessage() // 消息弹窗 // 列表相关的变量 -const xGrid = ref<VxeGridInstance>() // grid Ref -const { gridOptions, getList, deleteData } = useVxeGrid<ErrorCodeApi.ErrorCodeVO>({ +const [registerTable, { reload, deleteData }] = useXTable({ allSchemas: allSchemas, getListApi: ErrorCodeApi.getErrorCodePageApi, deleteApi: ErrorCodeApi.deleteErrorCodeApi @@ -123,11 +121,6 @@ const handleDetail = async (rowId: number) => { detailData.value = res } -// 删除操作 -const handleDelete = async (rowId: number) => { - await deleteData(xGrid, rowId) -} - // 提交新增/修改的表单 const submitForm = async () => { const elForm = unref(formRef)?.getElFormRef() @@ -149,7 +142,7 @@ const submitForm = async () => { } finally { actionLoading.value = false // 刷新列表 - await getList(xGrid) + await reload() } } }) diff --git a/yudao-ui-admin-vue3/src/views/system/loginlog/index.vue b/yudao-ui-admin-vue3/src/views/system/loginlog/index.vue index fc2f5dd68..3872107bb 100644 --- a/yudao-ui-admin-vue3/src/views/system/loginlog/index.vue +++ b/yudao-ui-admin-vue3/src/views/system/loginlog/index.vue @@ -1,21 +1,21 @@ <template> <ContentWrap> <!-- 列表 --> - <vxe-grid ref="xGrid" v-bind="gridOptions" class="xtable-scrollbar"> + <XTable @register="registerTable"> <!-- 操作:导出 --> <template #toolbar_buttons> <XButton type="warning" preIcon="ep:download" :title="t('action.export')" - @click="handleExport()" + @click="exportList('登录列表.xls')" /> </template> <template #actionbtns_default="{ row }"> <!-- 操作:详情 --> <XTextButton preIcon="ep:view" :title="t('action.detail')" @click="handleDetail(row)" /> </template> - </vxe-grid> + </XTable> </ContentWrap> <!-- 弹窗 --> <XModal id="postModel" v-model="dialogVisible" :title="dialogTitle"> @@ -31,16 +31,14 @@ // 全局相关的 import import { ref } from 'vue' import { useI18n } from '@/hooks/web/useI18n' -import { useVxeGrid } from '@/hooks/web/useVxeGrid' -import { VxeGridInstance } from 'vxe-table' +import { useXTable } from '@/hooks/web/useXTable' // 业务相关的 import import { allSchemas } from './loginLog.data' import { getLoginLogPageApi, exportLoginLogApi, LoginLogVO } from '@/api/system/loginLog' const { t } = useI18n() // 国际化 // 列表相关的变量 -const xGrid = ref<VxeGridInstance>() // 列表 Grid Ref -const { gridOptions, exportList } = useVxeGrid<LoginLogVO>({ +const [registerTable, { exportList }] = useXTable({ allSchemas: allSchemas, getListApi: getLoginLogPageApi, exportListApi: exportLoginLogApi @@ -56,9 +54,4 @@ const handleDetail = async (row: LoginLogVO) => { detailData.value = row dialogVisible.value = true } - -// 导出操作 -const handleExport = async () => { - await exportList(xGrid, '登录列表.xls') -} </script> diff --git a/yudao-ui-admin-vue3/src/views/system/menu/index.vue b/yudao-ui-admin-vue3/src/views/system/menu/index.vue index a27effc55..6bdda3176 100644 --- a/yudao-ui-admin-vue3/src/views/system/menu/index.vue +++ b/yudao-ui-admin-vue3/src/views/system/menu/index.vue @@ -1,7 +1,7 @@ <template> <ContentWrap> <!-- 列表 --> - <vxe-grid ref="xGrid" v-bind="gridOptions" show-overflow class="xtable-scrollbar"> + <XTable ref="xGrid" @register="registerTable" show-overflow> <template #toolbar_buttons> <!-- 操作:新增 --> <XButton @@ -11,8 +11,8 @@ v-hasPermi="['system:menu:create']" @click="handleCreate()" /> - <XButton title="展开所有" @click="xGrid?.setAllTreeExpand(true)" /> - <XButton title="关闭所有" @click="xGrid?.clearTreeExpand()" /> + <XButton title="展开所有" @click="xGrid?.Ref.setAllTreeExpand(true)" /> + <XButton title="关闭所有" @click="xGrid?.Ref.clearTreeExpand()" /> </template> <template #name_default="{ row }"> <Icon :icon="row.icon" /> @@ -31,10 +31,10 @@ preIcon="ep:delete" :title="t('action.del')" v-hasPermi="['system:menu:delete']" - @click="handleDelete(row.id)" + @click="deleteData(row.id)" /> </template> - </vxe-grid> + </XTable> </ContentWrap> <!-- 添加或修改菜单对话框 --> <XModal id="menuModel" v-model="dialogVisible" :title="dialogTitle"> @@ -194,28 +194,28 @@ import { } from 'element-plus' import { Tooltip } from '@/components/Tooltip' import { IconSelect } from '@/components/Icon' -import { VxeGridInstance } from 'vxe-table' // 业务相关的 import import { DICT_TYPE, getIntDictOptions } from '@/utils/dict' import { SystemMenuTypeEnum, CommonStatusEnum } from '@/utils/constants' import { handleTree, defaultProps } from '@/utils/tree' import * as MenuApi from '@/api/system/menu' import { allSchemas, rules } from './menu.data' -import { useVxeGrid } from '@/hooks/web/useVxeGrid' +import { useXTable } from '@/hooks/web/useXTable' const { t } = useI18n() // 国际化 const message = useMessage() // 消息弹窗 const { wsCache } = useCache() + +const xGrid = ref<any>(null) + // 列表相关的变量 -// 列表相关的变量 -const xGrid = ref<VxeGridInstance>() // 列表 Grid Ref const treeConfig = { transform: true, rowField: 'id', parentField: 'parentId', expandAll: false } -const { gridOptions, getList, deleteData } = useVxeGrid<MenuApi.MenuVO>({ +const [registerTable, { reload, deleteData }] = useXTable({ allSchemas: allSchemas, treeConfig: treeConfig, getListApi: MenuApi.getMenuListApi, @@ -326,7 +326,7 @@ const submitForm = async () => { actionLoading.value = false wsCache.delete(CACHE_KEY.ROLE_ROUTERS) // 操作成功,重新加载列表 - await getList(xGrid) + await reload() } } @@ -334,10 +334,4 @@ const submitForm = async () => { const isExternal = (path: string) => { return /^(https?:|mailto:|tel:)/.test(path) } - -// ========== 删除 ========== -// 删除操作 -const handleDelete = async (rowId: number) => { - await deleteData(xGrid, rowId) -} </script> diff --git a/yudao-ui-admin-vue3/src/views/system/notice/index.vue b/yudao-ui-admin-vue3/src/views/system/notice/index.vue index 239c0b414..4654b741b 100644 --- a/yudao-ui-admin-vue3/src/views/system/notice/index.vue +++ b/yudao-ui-admin-vue3/src/views/system/notice/index.vue @@ -1,7 +1,7 @@ <template> <ContentWrap> <!-- 列表 --> - <vxe-grid ref="xGrid" v-bind="gridOptions" class="xtable-scrollbar"> + <XTable @register="registerTable"> <!-- 操作:新增 --> <template #toolbar_buttons> <XButton @@ -32,10 +32,10 @@ preIcon="ep:delete" :title="t('action.del')" v-hasPermi="['system:notice:delete']" - @click="handleDelete(row.id)" + @click="deleteData(row.id)" /> </template> - </vxe-grid> + </XTable> </ContentWrap> <!-- 弹窗 --> <XModal id="noticeModel" v-model="dialogVisible" :title="dialogTitle"> @@ -75,8 +75,7 @@ import { ref, unref } from 'vue' import { useI18n } from '@/hooks/web/useI18n' import { useMessage } from '@/hooks/web/useMessage' -import { useVxeGrid } from '@/hooks/web/useVxeGrid' -import { VxeGridInstance } from 'vxe-table' +import { useXTable } from '@/hooks/web/useXTable' import { FormExpose } from '@/components/Form' // 业务相关的 import import * as NoticeApi from '@/api/system/notice' @@ -86,8 +85,7 @@ import { Editor } from '@/components/Editor' const { t } = useI18n() // 国际化 const message = useMessage() // 消息弹窗 // 列表相关的变量 -const xGrid = ref<VxeGridInstance>() // 列表 Grid Ref -const { gridOptions, getList, deleteData } = useVxeGrid<NoticeApi.NoticeVO>({ +const [registerTable, { reload, deleteData }] = useXTable({ allSchemas: allSchemas, getListApi: NoticeApi.getNoticePageApi, deleteApi: NoticeApi.deleteNoticeApi @@ -128,11 +126,6 @@ const handleDetail = async (rowId: number) => { detailData.value = res } -// 删除操作 -const handleDelete = async (rowId: number) => { - await deleteData(xGrid, rowId) -} - // 提交新增/修改的表单 const submitForm = async () => { const elForm = unref(formRef)?.getElFormRef() @@ -153,7 +146,7 @@ const submitForm = async () => { dialogVisible.value = false } finally { actionLoading.value = false - await getList(xGrid) + await reload() } } }) diff --git a/yudao-ui-admin-vue3/src/views/system/oauth2/client/index.vue b/yudao-ui-admin-vue3/src/views/system/oauth2/client/index.vue index 7e024fe1d..f9fcabd68 100644 --- a/yudao-ui-admin-vue3/src/views/system/oauth2/client/index.vue +++ b/yudao-ui-admin-vue3/src/views/system/oauth2/client/index.vue @@ -1,7 +1,7 @@ <template> <ContentWrap> <!-- 列表 --> - <vxe-grid ref="xGrid" v-bind="gridOptions" class="xtable-scrollbar"> + <XTable @register="registerTable"> <template #toolbar_buttons> <!-- 操作:新增 --> <XButton @@ -48,10 +48,10 @@ preIcon="ep:delete" :title="t('action.del')" v-hasPermi="['system:oauth2-client:delete']" - @click="handleDelete(row.id)" + @click="deleteData(row.id)" /> </template> - </vxe-grid> + </XTable> </ContentWrap> <!-- 弹窗 --> <XModal id="postModel" v-model="dialogVisible" :title="dialogTitle"> @@ -135,8 +135,7 @@ import { ref, unref } from 'vue' import { ElTag } from 'element-plus' import { useI18n } from '@/hooks/web/useI18n' import { useMessage } from '@/hooks/web/useMessage' -import { useVxeGrid } from '@/hooks/web/useVxeGrid' -import { VxeGridInstance } from 'vxe-table' +import { useXTable } from '@/hooks/web/useXTable' import { FormExpose } from '@/components/Form' // 业务相关的 import import * as ClientApi from '@/api/system/oauth2/client' @@ -146,8 +145,7 @@ const { t } = useI18n() // 国际化 const message = useMessage() // 消息弹窗 // 列表相关的变量 -const xGrid = ref<VxeGridInstance>() // 列表 Grid Ref -const { gridOptions, getList, deleteData } = useVxeGrid<ClientApi.OAuth2ClientVO>({ +const [registerTable, { reload, deleteData }] = useXTable({ allSchemas: allSchemas, getListApi: ClientApi.getOAuth2ClientPageApi, deleteApi: ClientApi.deleteOAuth2ClientApi @@ -186,11 +184,6 @@ const handleDetail = async (rowId: number) => { detailData.value = res } -// 删除操作 -const handleDelete = async (rowId: number) => { - await deleteData(xGrid, rowId) -} - // 提交新增/修改的表单 const submitForm = async () => { const elForm = unref(formRef)?.getElFormRef() @@ -212,7 +205,7 @@ const submitForm = async () => { } finally { actionLoading.value = false // 刷新列表 - await getList(xGrid) + await reload() } } }) diff --git a/yudao-ui-admin-vue3/src/views/system/oauth2/token/index.vue b/yudao-ui-admin-vue3/src/views/system/oauth2/token/index.vue index 2328d3071..9011ac80a 100644 --- a/yudao-ui-admin-vue3/src/views/system/oauth2/token/index.vue +++ b/yudao-ui-admin-vue3/src/views/system/oauth2/token/index.vue @@ -1,11 +1,11 @@ <template> <ContentWrap> <!-- 列表 --> - <vxe-grid ref="xGrid" v-bind="gridOptions" class="xtable-scrollbar"> + <XTable @register="registerTable"> <template #actionbtns_default="{ row }"> <!-- 操作:详情 --> <XTextButton preIcon="ep:view" :title="t('action.detail')" @click="handleDetail(row)" /> - <!-- 操作:删除 --> + <!-- 操作:登出 --> <XTextButton preIcon="ep:delete" :title="t('action.logout')" @@ -13,7 +13,7 @@ @click="handleForceLogout(row.id)" /> </template> - </vxe-grid> + </XTable> </ContentWrap> <XModal v-model="dialogVisible" :title="dialogTitle"> <!-- 对话框(详情) --> @@ -28,8 +28,7 @@ import { ref } from 'vue' import { useI18n } from '@/hooks/web/useI18n' import { useMessage } from '@/hooks/web/useMessage' -import { useVxeGrid } from '@/hooks/web/useVxeGrid' -import { VxeGridInstance } from 'vxe-table' +import { useXTable } from '@/hooks/web/useXTable' import { allSchemas } from './token.data' import * as TokenApi from '@/api/system/oauth2/token' @@ -37,8 +36,7 @@ import * as TokenApi from '@/api/system/oauth2/token' const { t } = useI18n() // 国际化 const message = useMessage() // 消息弹窗 // 列表相关的变量 -const xGrid = ref<VxeGridInstance>() // 列表 Grid Ref -const { gridOptions, getList } = useVxeGrid<TokenApi.OAuth2TokenVO>({ +const [registerTable, { reload }] = useXTable({ allSchemas: allSchemas, topActionSlots: false, getListApi: TokenApi.getAccessTokenPageApi @@ -65,7 +63,7 @@ const handleForceLogout = (rowId: number) => { }) .finally(async () => { // 刷新列表 - await getList(xGrid) + await reload() }) } </script> diff --git a/yudao-ui-admin-vue3/src/views/system/operatelog/index.vue b/yudao-ui-admin-vue3/src/views/system/operatelog/index.vue index a08019d0b..29a455559 100644 --- a/yudao-ui-admin-vue3/src/views/system/operatelog/index.vue +++ b/yudao-ui-admin-vue3/src/views/system/operatelog/index.vue @@ -1,7 +1,7 @@ <template> <ContentWrap> <!-- 列表 --> - <vxe-grid ref="xGrid" v-bind="gridOptions" class="xtable-scrollbar"> + <XTable @register="registerTable"> <template #toolbar_buttons> <!-- 操作:新增 --> <XButton @@ -9,7 +9,7 @@ preIcon="ep:download" :title="t('action.export')" v-hasPermi="['system:operate-log:export']" - @click="handleExport()" + @click="exportList('操作日志.xls')" /> </template> <template #duration="{ row }"> @@ -22,7 +22,7 @@ <!-- 操作:详情 --> <XTextButton preIcon="ep:view" :title="t('action.detail')" @click="handleDetail(row)" /> </template> - </vxe-grid> + </XTable> </ContentWrap> <!-- 弹窗 --> <XModal id="postModel" v-model="dialogVisible" :title="t('action.detail')"> @@ -45,16 +45,14 @@ // 全局相关的 import import { ref } from 'vue' import { useI18n } from '@/hooks/web/useI18n' -import { useVxeGrid } from '@/hooks/web/useVxeGrid' -import { VxeGridInstance } from 'vxe-table' +import { useXTable } from '@/hooks/web/useXTable' // 业务相关的 import import * as OperateLogApi from '@/api/system/operatelog' import { allSchemas } from './operatelog.data' const { t } = useI18n() // 国际化 // 列表相关的变量 -const xGrid = ref<VxeGridInstance>() // 列表 Grid Ref -const { gridOptions, exportList } = useVxeGrid<OperateLogApi.OperateLogVO>({ +const [registerTable, { exportList }] = useXTable({ allSchemas: allSchemas, getListApi: OperateLogApi.getOperateLogPageApi, exportListApi: OperateLogApi.exportOperateLogApi @@ -70,9 +68,4 @@ const handleDetail = (row: OperateLogApi.OperateLogVO) => { detailData.value = row dialogVisible.value = true } - -// 导出操作 -const handleExport = async () => { - await exportList(xGrid, '操作日志.xls') -} </script> diff --git a/yudao-ui-admin-vue3/src/views/system/post/index.vue b/yudao-ui-admin-vue3/src/views/system/post/index.vue index ecd190c34..81594343f 100644 --- a/yudao-ui-admin-vue3/src/views/system/post/index.vue +++ b/yudao-ui-admin-vue3/src/views/system/post/index.vue @@ -1,7 +1,7 @@ <template> <ContentWrap> <!-- 列表 --> - <vxe-grid ref="xGrid" v-bind="gridOptions" class="xtable-scrollbar"> + <XTable @register="registerTable"> <template #toolbar_buttons> <!-- 操作:新增 --> <XButton @@ -17,7 +17,7 @@ preIcon="ep:download" :title="t('action.export')" v-hasPermi="['system:post:export']" - @click="handleExport()" + @click="exportList('岗位列表.xls')" /> </template> <template #actionbtns_default="{ row }"> @@ -40,10 +40,10 @@ preIcon="ep:delete" :title="t('action.del')" v-hasPermi="['system:post:delete']" - @click="handleDelete(row.id)" + @click="deleteData(row.id)" /> </template> - </vxe-grid> + </XTable> </ContentWrap> <!-- 弹窗 --> <XModal id="postModel" :loading="modelLoading" v-model="modelVisible" :title="modelTitle"> @@ -79,8 +79,7 @@ import { ref, unref } from 'vue' import { useI18n } from '@/hooks/web/useI18n' import { useMessage } from '@/hooks/web/useMessage' -import { useVxeGrid } from '@/hooks/web/useVxeGrid' -import { VxeGridInstance } from 'vxe-table' +import { useXTable } from '@/hooks/web/useXTable' import { FormExpose } from '@/components/Form' // 业务相关的 import import * as PostApi from '@/api/system/post' @@ -89,8 +88,7 @@ import { rules, allSchemas } from './post.data' const { t } = useI18n() // 国际化 const message = useMessage() // 消息弹窗 // 列表相关的变量 -const xGrid = ref<VxeGridInstance>() // 列表 Grid Ref -const { gridOptions, getList, deleteData, exportList } = useVxeGrid<PostApi.PostVO>({ +const [registerTable, { reload, deleteData, exportList }] = useXTable({ allSchemas: allSchemas, getListApi: PostApi.getPostPageApi, deleteApi: PostApi.deletePostApi, @@ -119,11 +117,6 @@ const handleCreate = () => { modelLoading.value = false } -// 导出操作 -const handleExport = async () => { - await exportList(xGrid, '岗位列表.xls') -} - // 修改操作 const handleUpdate = async (rowId: number) => { setDialogTile('update') @@ -141,11 +134,6 @@ const handleDetail = async (rowId: number) => { modelLoading.value = false } -// 删除操作 -const handleDelete = async (rowId: number) => { - await deleteData(xGrid, rowId) -} - // 提交新增/修改的表单 const submitForm = async () => { const elForm = unref(formRef)?.getElFormRef() @@ -167,7 +155,7 @@ const submitForm = async () => { } finally { actionLoading.value = false // 刷新列表 - await getList(xGrid) + await reload() } } }) diff --git a/yudao-ui-admin-vue3/src/views/system/role/index.vue b/yudao-ui-admin-vue3/src/views/system/role/index.vue index 550c4af04..c9dc24874 100644 --- a/yudao-ui-admin-vue3/src/views/system/role/index.vue +++ b/yudao-ui-admin-vue3/src/views/system/role/index.vue @@ -1,7 +1,7 @@ <template> <ContentWrap> <!-- 列表 --> - <vxe-grid ref="xGrid" v-bind="gridOptions" class="xtable-scrollbar"> + <XTable @register="registerTable"> <!-- 操作:新增 --> <template #toolbar_buttons> <XButton @@ -46,10 +46,10 @@ preIcon="ep:delete" :title="t('action.del')" v-hasPermi="['system:role:delete']" - @click="handleDelete(row.id)" + @click="deleteData(row.id)" /> </template> - </vxe-grid> + </XTable> </ContentWrap> <XModal v-model="dialogVisible" :title="dialogTitle"> @@ -159,11 +159,10 @@ import { ElSwitch, ElTag } from 'element-plus' -import { VxeGridInstance } from 'vxe-table' import { FormExpose } from '@/components/Form' import { useI18n } from '@/hooks/web/useI18n' import { useMessage } from '@/hooks/web/useMessage' -import { useVxeGrid } from '@/hooks/web/useVxeGrid' +import { useXTable } from '@/hooks/web/useXTable' import { handleTree, defaultProps } from '@/utils/tree' import { SystemDataScopeEnum } from '@/utils/constants' import { DICT_TYPE, getIntDictOptions } from '@/utils/dict' @@ -176,8 +175,7 @@ import * as PermissionApi from '@/api/system/permission' const { t } = useI18n() // 国际化 const message = useMessage() // 消息弹窗 // 列表相关的变量 -const xGrid = ref<VxeGridInstance>() // 列表 Grid Ref -const { gridOptions, getList, deleteData } = useVxeGrid<RoleApi.RoleVO>({ +const [registerTable, { reload, deleteData }] = useXTable({ allSchemas: allSchemas, getListApi: RoleApi.getRolePageApi, deleteApi: RoleApi.deleteRoleApi @@ -219,11 +217,6 @@ const handleDetail = async (rowId: number) => { detailData.value = res } -// 删除操作 -const handleDelete = async (rowId: number) => { - await deleteData(xGrid, rowId) -} - // 提交按钮 const submitForm = async () => { const elForm = unref(formRef)?.getElFormRef() @@ -245,7 +238,7 @@ const submitForm = async () => { } finally { actionLoading.value = false // 刷新列表 - await getList(xGrid) + await reload() } } }) diff --git a/yudao-ui-admin-vue3/src/views/system/sensitiveWord/index.vue b/yudao-ui-admin-vue3/src/views/system/sensitiveWord/index.vue index f7b82e52e..77afad482 100644 --- a/yudao-ui-admin-vue3/src/views/system/sensitiveWord/index.vue +++ b/yudao-ui-admin-vue3/src/views/system/sensitiveWord/index.vue @@ -1,7 +1,7 @@ <template> <ContentWrap> <!-- 列表 --> - <vxe-grid ref="xGrid" v-bind="gridOptions" class="xtable-scrollbar"> + <XTable @register="registerTable"> <template #toolbar_buttons> <!-- 操作:新增 --> <XButton @@ -17,7 +17,7 @@ preIcon="ep:download" :title="t('action.export')" v-hasPermi="['system:sensitive-word:export']" - @click="handleExport()" + @click="exportList('敏感词数据.xls')" /> </template> <template #tags_default="{ row }"> @@ -50,10 +50,10 @@ preIcon="ep:delete" :title="t('action.del')" v-hasPermi="['system:sensitive-word:delete']" - @click="handleDelete(row.id)" + @click="deleteData(row.id)" /> </template> - </vxe-grid> + </XTable> </ContentWrap> <XModal v-model="dialogVisible" :title="dialogTitle"> @@ -106,8 +106,7 @@ import { onMounted, ref, unref } from 'vue' import { useI18n } from '@/hooks/web/useI18n' import { useMessage } from '@/hooks/web/useMessage' -import { useVxeGrid } from '@/hooks/web/useVxeGrid' -import { VxeGridInstance } from 'vxe-table' +import { useXTable } from '@/hooks/web/useXTable' import { FormExpose } from '@/components/Form' import { ElTag, ElSelect, ElOption } from 'element-plus' import * as SensitiveWordApi from '@/api/system/sensitiveWord' @@ -116,14 +115,12 @@ import { rules, allSchemas } from './sensitiveWord.data' const { t } = useI18n() // 国际化 const message = useMessage() // 消息弹窗 // 列表相关的变量 -const xGrid = ref<VxeGridInstance>() // 列表 Grid Ref -const { gridOptions, getList, deleteData, exportList } = - useVxeGrid<SensitiveWordApi.SensitiveWordVO>({ - allSchemas: allSchemas, - getListApi: SensitiveWordApi.getSensitiveWordPageApi, - deleteApi: SensitiveWordApi.deleteSensitiveWordApi, - exportListApi: SensitiveWordApi.exportSensitiveWordApi - }) +const [registerTable, { reload, deleteData, exportList }] = useXTable({ + allSchemas: allSchemas, + getListApi: SensitiveWordApi.getSensitiveWordPageApi, + deleteApi: SensitiveWordApi.deleteSensitiveWordApi, + exportListApi: SensitiveWordApi.exportSensitiveWordApi +}) const actionLoading = ref(false) // 遮罩层 const actionType = ref('') // 操作按钮的类型 const dialogVisible = ref(false) // 是否显示弹出层 @@ -150,11 +147,6 @@ const handleCreate = () => { setDialogTile('create') } -// 导出操作 -const handleExport = async () => { - await exportList(xGrid, '敏感词数据.xls') -} - // 修改操作 const handleUpdate = async (rowId: number) => { setDialogTile('update') @@ -170,11 +162,6 @@ const handleDetail = async (rowId: number) => { detailData.value = res } -// 删除操作 -const handleDelete = async (rowId: number) => { - await deleteData(xGrid, rowId) -} - // 提交按钮 const submitForm = async () => { const elForm = unref(formRef)?.getElFormRef() @@ -196,7 +183,7 @@ const submitForm = async () => { } finally { actionLoading.value = false // 刷新列表 - await getList(xGrid) + await reload() } } }) diff --git a/yudao-ui-admin-vue3/src/views/system/sms/smsChannel/index.vue b/yudao-ui-admin-vue3/src/views/system/sms/smsChannel/index.vue index 52f93d37a..0a4bb8bb9 100644 --- a/yudao-ui-admin-vue3/src/views/system/sms/smsChannel/index.vue +++ b/yudao-ui-admin-vue3/src/views/system/sms/smsChannel/index.vue @@ -1,7 +1,7 @@ <template> <ContentWrap> <!-- 列表 --> - <vxe-grid ref="xGrid" v-bind="gridOptions" class="xtable-scrollbar"> + <XTable @register="registerTable"> <!-- 操作:新增 --> <template #toolbar_buttons> <XButton @@ -32,10 +32,10 @@ preIcon="ep:delete" :title="t('action.del')" v-hasPermi="['system:sms-channel:delete']" - @click="handleDelete(row.id)" + @click="deleteData(row.id)" /> </template> - </vxe-grid> + </XTable> </ContentWrap> <XModal id="smsChannel" v-model="dialogVisible" :title="dialogTitle"> @@ -72,8 +72,7 @@ import { ref, unref } from 'vue' import { useI18n } from '@/hooks/web/useI18n' import { useMessage } from '@/hooks/web/useMessage' -import { useVxeGrid } from '@/hooks/web/useVxeGrid' -import { VxeGridInstance } from 'vxe-table' +import { useXTable } from '@/hooks/web/useXTable' import { FormExpose } from '@/components/Form' // 业务相关的 import import * as SmsChannelApi from '@/api/system/sms/smsChannel' @@ -83,8 +82,7 @@ const { t } = useI18n() // 国际化 const message = useMessage() // 消息弹窗 // 列表相关的变量 -const xGrid = ref<VxeGridInstance>() // 列表 Grid Ref -const { gridOptions, getList, deleteData } = useVxeGrid<SmsChannelApi.SmsChannelVO>({ +const [registerTable, { reload, deleteData }] = useXTable({ allSchemas: allSchemas, getListApi: SmsChannelApi.getSmsChannelPageApi, deleteApi: SmsChannelApi.deleteSmsChannelApi @@ -125,11 +123,6 @@ const handleDetail = async (rowId: number) => { detailData.value = res } -// 删除操作 -const handleDelete = async (rowId: number) => { - await deleteData(xGrid, rowId) -} - // 提交按钮 const submitForm = async () => { const elForm = unref(formRef)?.getElFormRef() @@ -151,7 +144,7 @@ const submitForm = async () => { } finally { actionLoading.value = false // 刷新列表 - await getList(xGrid) + await reload() } } }) diff --git a/yudao-ui-admin-vue3/src/views/system/sms/smsLog/index.vue b/yudao-ui-admin-vue3/src/views/system/sms/smsLog/index.vue index d38f17baf..293dadfe4 100644 --- a/yudao-ui-admin-vue3/src/views/system/sms/smsLog/index.vue +++ b/yudao-ui-admin-vue3/src/views/system/sms/smsLog/index.vue @@ -1,20 +1,20 @@ <template> <ContentWrap> <!-- 列表 --> - <vxe-grid ref="xGrid" v-bind="gridOptions" class="xtable-scrollbar"> + <XTable @register="registerTable"> <!-- 操作:导出 --> <template #toolbar_buttons> <XButton type="warning" preIcon="ep:download" :title="t('action.export')" - @click="handleExport()" + @click="exportList('短信日志.xls')" /> </template> <template #actionbtns_default="{ row }"> <XTextButton preIcon="ep:view" :title="t('action.detail')" @click="handleDetail(row)" /> </template> - </vxe-grid> + </XTable> </ContentWrap> <XModal id="smsLog" v-model="dialogVisible" :title="dialogTitle"> @@ -34,15 +34,13 @@ // 全局相关的 import import { ref } from 'vue' import { useI18n } from '@/hooks/web/useI18n' -import { useVxeGrid } from '@/hooks/web/useVxeGrid' -import { VxeGridInstance } from 'vxe-table' +import { useXTable } from '@/hooks/web/useXTable' import { allSchemas } from './sms.log.data' import * as SmsLoglApi from '@/api/system/sms/smsLog' const { t } = useI18n() // 国际化 // 列表相关的变量 -const xGrid = ref<VxeGridInstance>() // 列表 Grid Ref -const { gridOptions, exportList } = useVxeGrid<SmsLoglApi.SmsLogVO>({ +const [registerTable, { exportList }] = useXTable({ allSchemas: allSchemas, getListApi: SmsLoglApi.getSmsLogPageApi, exportListApi: SmsLoglApi.exportSmsLogApi @@ -59,9 +57,4 @@ const handleDetail = (row: SmsLoglApi.SmsLogVO) => { detailData.value = row dialogVisible.value = true } - -// 导出操作 -const handleExport = async () => { - await exportList(xGrid, '短信日志.xls') -} </script> diff --git a/yudao-ui-admin-vue3/src/views/system/sms/smsTemplate/index.vue b/yudao-ui-admin-vue3/src/views/system/sms/smsTemplate/index.vue index 9edffe907..314f392ef 100644 --- a/yudao-ui-admin-vue3/src/views/system/sms/smsTemplate/index.vue +++ b/yudao-ui-admin-vue3/src/views/system/sms/smsTemplate/index.vue @@ -1,7 +1,7 @@ <template> <ContentWrap> <!-- 列表 --> - <vxe-grid ref="xGrid" v-bind="gridOptions" class="xtable-scrollbar"> + <XTable @register="registerTable"> <!-- 操作:新增 --> <template #toolbar_buttons> <XButton @@ -38,10 +38,10 @@ preIcon="ep:delete" :title="t('action.del')" v-hasPermi="['system:sms-template:delete']" - @click="handleDelete(row.id)" + @click="deleteData(row.id)" /> </template> - </vxe-grid> + </XTable> </ContentWrap> <XModal id="smsTemplate" v-model="dialogVisible" :title="dialogTitle"> <!-- 对话框(添加 / 修改) --> @@ -113,8 +113,7 @@ import { ref, unref } from 'vue' import { useI18n } from '@/hooks/web/useI18n' import { useMessage } from '@/hooks/web/useMessage' -import { useVxeGrid } from '@/hooks/web/useVxeGrid' -import { VxeGridInstance } from 'vxe-table' +import { useXTable } from '@/hooks/web/useXTable' import { FormExpose } from '@/components/Form' import { ElForm, ElFormItem, ElInput } from 'element-plus' // 业务相关的 import @@ -125,8 +124,7 @@ const { t } = useI18n() // 国际化 const message = useMessage() // 消息弹窗 // 列表相关的变量 -const xGrid = ref<VxeGridInstance>() // 列表 Grid Ref -const { gridOptions, getList, deleteData } = useVxeGrid<SmsTemplateApi.SmsTemplateVO>({ +const [registerTable, { reload, deleteData }] = useXTable({ allSchemas: allSchemas, getListApi: SmsTemplateApi.getSmsTemplatePageApi, deleteApi: SmsTemplateApi.deleteSmsTemplateApi @@ -168,11 +166,6 @@ const handleDetail = async (rowId: number) => { detailData.value = res } -// 删除操作 -const handleDelete = async (rowId: number) => { - await deleteData(xGrid, rowId) -} - // 提交按钮 const submitForm = async () => { const elForm = unref(formRef)?.getElFormRef() @@ -194,7 +187,7 @@ const submitForm = async () => { } finally { actionLoading.value = false // 刷新列表 - await getList(xGrid) + await reload() } } }) diff --git a/yudao-ui-admin-vue3/src/views/system/tenant/index.vue b/yudao-ui-admin-vue3/src/views/system/tenant/index.vue index f7cf6cab1..24f3c3781 100644 --- a/yudao-ui-admin-vue3/src/views/system/tenant/index.vue +++ b/yudao-ui-admin-vue3/src/views/system/tenant/index.vue @@ -1,7 +1,7 @@ <template> <ContentWrap> <!-- 列表 --> - <vxe-grid ref="xGrid" v-bind="gridOptions" class="xtable-scrollbar"> + <XTable @register="registerTable"> <template #toolbar_buttons> <!-- 操作:新增 --> <XButton @@ -16,7 +16,7 @@ preIcon="ep:download" :title="t('action.export')" v-hasPermi="['system:tenant:export']" - @click="handleExport()" + @click="exportList('租户列表.xls')" /> </template> <template #accountCount_default="{ row }"> @@ -46,10 +46,10 @@ preIcon="ep:delete" :title="t('action.del')" v-hasPermi="['system:tenant:delete']" - @click="handleDelete(row.id)" + @click="deleteData(row.id)" /> </template> - </vxe-grid> + </XTable> </ContentWrap> <XModal v-model="dialogVisible" :title="dialogTitle"> <!-- 对话框(添加 / 修改) --> @@ -89,8 +89,7 @@ import { ref, unref } from 'vue' import { useI18n } from '@/hooks/web/useI18n' import { useMessage } from '@/hooks/web/useMessage' -import { useVxeGrid } from '@/hooks/web/useVxeGrid' -import { VxeGridInstance } from 'vxe-table' +import { useXTable } from '@/hooks/web/useXTable' import { ElTag } from 'element-plus' import { FormExpose } from '@/components/Form' import * as TenantApi from '@/api/system/tenant' @@ -99,8 +98,7 @@ import { rules, allSchemas, tenantPackageOption } from './tenant.data' const { t } = useI18n() // 国际化 const message = useMessage() // 消息弹窗 // 列表相关的变量 -const xGrid = ref<VxeGridInstance>() // 列表 Grid Ref -const { gridOptions, getList, deleteData, exportList } = useVxeGrid<TenantApi.TenantVO>({ +const [registerTable, { reload, deleteData, exportList }] = useXTable({ allSchemas: allSchemas, getListApi: TenantApi.getTenantPageApi, deleteApi: TenantApi.deleteTenantApi, @@ -151,16 +149,6 @@ const handleDetail = async (rowId: number) => { setDialogTile('detail') } -// 删除操作 -const handleDelete = async (rowId: number) => { - await deleteData(xGrid, rowId) -} - -// 导出操作 -const handleExport = async () => { - await exportList(xGrid, '租户列表.xls') -} - // 提交按钮 const submitForm = async () => { const elForm = unref(formRef)?.getElFormRef() @@ -183,7 +171,7 @@ const submitForm = async () => { } finally { actionLoading.value = false // 刷新列表 - await getList(xGrid) + await reload() } } }) diff --git a/yudao-ui-admin-vue3/src/views/system/tenantPackage/index.vue b/yudao-ui-admin-vue3/src/views/system/tenantPackage/index.vue index c45e9adc0..9d5f57ec2 100644 --- a/yudao-ui-admin-vue3/src/views/system/tenantPackage/index.vue +++ b/yudao-ui-admin-vue3/src/views/system/tenantPackage/index.vue @@ -1,7 +1,7 @@ <template> <ContentWrap> <!-- 列表 --> - <vxe-grid ref="xGrid" v-bind="gridOptions" class="xtable-scrollbar"> + <XTable @register="registerTable"> <template #toolbar_buttons> <XButton type="primary" @@ -12,9 +12,9 @@ </template> <template #actionbtns_default="{ row }"> <XTextButton preIcon="ep:edit" :title="t('action.edit')" @click="handleUpdate(row.id)" /> - <XTextButton preIcon="ep:delete" :title="t('action.del')" @click="handleDelete(row.id)" /> + <XTextButton preIcon="ep:delete" :title="t('action.del')" @click="deleteData(row.id)" /> </template> - </vxe-grid> + </XTable> </ContentWrap> <XModal v-model="dialogVisible" :title="dialogTitle"> <!-- 对话框(添加 / 修改) --> @@ -69,8 +69,7 @@ import { onMounted, ref, unref } from 'vue' import { handleTree, defaultProps } from '@/utils/tree' import { useI18n } from '@/hooks/web/useI18n' import { useMessage } from '@/hooks/web/useMessage' -import { useVxeGrid } from '@/hooks/web/useVxeGrid' -import { VxeGridInstance } from 'vxe-table' +import { useXTable } from '@/hooks/web/useXTable' import { FormExpose } from '@/components/Form' import { ElCard, ElSwitch, ElTree } from 'element-plus' // 业务相关的 import @@ -86,7 +85,6 @@ const menuExpand = ref(false) const menuNodeAll = ref(false) const treeRef = ref<InstanceType<typeof ElTree>>() const treeNodeAll = ref(false) -const xGrid = ref<VxeGridInstance>() // 列表 Grid Ref const formRef = ref<FormExpose>() // 表单 Ref const loading = ref(false) // 遮罩层 const actionType = ref('') // 操作按钮的类型 @@ -102,7 +100,7 @@ const getTree = async () => { menuOptions.value = handleTree(res) } -const { gridOptions, getList, deleteData } = useVxeGrid<TenantPackageApi.TenantPackageVO>({ +const [registerTable, { reload, deleteData }] = useXTable({ allSchemas: allSchemas, getListApi: TenantPackageApi.getTenantPackageTypePageApi, deleteApi: TenantPackageApi.deleteTenantPackageTypeApi @@ -134,11 +132,6 @@ const handleUpdate = async (rowId: number) => { unref(treeRef)?.setCheckedKeys(res.menuIds) } -// 删除操作 -const handleDelete = async (rowId: number) => { - await deleteData(xGrid, rowId) -} - // 提交按钮 const submitForm = async () => { const elForm = unref(formRef)?.getElFormRef() @@ -149,7 +142,10 @@ const submitForm = async () => { // 提交请求 try { const data = unref(formRef)?.formModel as TenantPackageApi.TenantPackageVO - data.menuIds = treeRef.value!.getCheckedKeys(false) as number[] + data.menuIds = [ + ...(treeRef.value!.getCheckedKeys(false) as unknown as Array<number>), + ...(treeRef.value!.getHalfCheckedKeys() as unknown as Array<number>) + ] if (actionType.value === 'create') { await TenantPackageApi.createTenantPackageTypeApi(data) message.success(t('common.createSuccess')) @@ -162,7 +158,7 @@ const submitForm = async () => { } finally { loading.value = false // 刷新列表 - await getList(xGrid) + await reload() } } }) diff --git a/yudao-ui-admin-vue3/src/views/system/user/index.vue b/yudao-ui-admin-vue3/src/views/system/user/index.vue index f694486f0..936a09602 100644 --- a/yudao-ui-admin-vue3/src/views/system/user/index.vue +++ b/yudao-ui-admin-vue3/src/views/system/user/index.vue @@ -27,7 +27,7 @@ </div> </template> <!-- 列表 --> - <vxe-grid ref="xGrid" v-bind="gridOptions" class="xtable-scrollbar"> + <XTable @register="registerTable"> <template #toolbar_buttons> <!-- 操作:新增 --> <XButton @@ -112,14 +112,14 @@ preIcon="ep:delete" :title="t('action.del')" v-hasPermi="['system:user:delete']" - @click="handleDelete(row.id)" + @click="deleteData(row.id)" /> </el-dropdown-item> </el-dropdown-menu> </template> </el-dropdown> </template> - </vxe-grid> + </XTable> </el-card> </div> <XModal v-model="dialogVisible" :title="dialogTitle"> @@ -283,14 +283,13 @@ import { UploadRawFile } from 'element-plus' import { useRouter } from 'vue-router' -import { VxeGridInstance } from 'vxe-table' import { handleTree, defaultProps } from '@/utils/tree' import download from '@/utils/download' import { CommonStatusEnum } from '@/utils/constants' import { getAccessToken, getTenantId } from '@/utils/auth' import { useI18n } from '@/hooks/web/useI18n' import { useMessage } from '@/hooks/web/useMessage' -import { useVxeGrid } from '@/hooks/web/useVxeGrid' +import { useXTable } from '@/hooks/web/useXTable' import { FormExpose } from '@/components/Form' import { rules, allSchemas } from './user.data' import * as UserApi from '@/api/system/user' @@ -312,10 +311,9 @@ const queryParams = reactive({ // ========== 列表相关 ========== const tableTitle = ref('用户列表') // 列表相关的变量 -const xGrid = ref<VxeGridInstance>() // 列表 Grid Ref -const { gridOptions, getList, deleteData, exportList } = useVxeGrid<UserApi.UserVO>({ +const [registerTable, { reload, deleteData, exportList }] = useXTable({ allSchemas: allSchemas, - queryParams: queryParams, + params: queryParams, getListApi: UserApi.getUserPageApi, deleteApi: UserApi.deleteUserApi, exportListApi: UserApi.exportUserApi @@ -334,7 +332,7 @@ const filterNode = (value: string, data: Tree) => { } const handleDeptNodeClick = async (row: { [key: string]: any }) => { queryParams.deptId = row.id - await getList(xGrid) + await reload() } const { push } = useRouter() const handleDeptEdit = () => { @@ -407,10 +405,7 @@ const handleDetail = async (rowId: number) => { detailData.value = res await setDialogTile('detail') } -// 删除操作 -const handleDelete = async (rowId: number) => { - await deleteData(xGrid, rowId) -} + // 提交按钮 const submitForm = async () => { loading.value = true @@ -428,7 +423,7 @@ const submitForm = async () => { } finally { // unref(formRef)?.setSchema(allSchemas.formSchema) // 刷新列表 - await getList(xGrid) + await reload() loading.value = false } } @@ -443,7 +438,7 @@ const handleStatusChange = async (row: UserApi.UserVO) => { await UserApi.updateUserStatusApi(row.id, row.status) message.success(text + '成功') // 刷新列表 - await getList(xGrid) + await reload() }) .catch(() => { row.status = @@ -544,7 +539,7 @@ const handleFileSuccess = async (response: any): Promise<void> => { text += '< ' + username + ': ' + data.failureUsernames[username] + ' >' } message.alert(text) - await getList(xGrid) + await reload() } // 文件数超出提示 const handleExceed = (): void => { diff --git a/yudao-ui-admin/package.json b/yudao-ui-admin/package.json index b59eb5041..0da185829 100644 --- a/yudao-ui-admin/package.json +++ b/yudao-ui-admin/package.json @@ -1,6 +1,6 @@ { "name": "yudao-ui-admin", - "version": "1.6.5-snapshot", + "version": "1.6.6-snapshot", "description": "芋道管理系统", "author": "芋道", "license": "MIT", diff --git a/yudao-ui-admin/src/views/infra/file/index.vue b/yudao-ui-admin/src/views/infra/file/index.vue index be76b5c18..bd569a377 100644 --- a/yudao-ui-admin/src/views/infra/file/index.vue +++ b/yudao-ui-admin/src/views/infra/file/index.vue @@ -1,14 +1,16 @@ <template> <div class="app-container"> - <doc-alert title="上传下载" url="https://doc.iocoder.cn/file/" /> + <doc-alert title="上传下载" url="https://doc.iocoder.cn/file/"/> <!-- 搜索工作栏 --> <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px"> <el-form-item label="文件路径" prop="path"> <el-input v-model="queryParams.path" placeholder="请输入文件路径" clearable @keyup.enter.native="handleQuery"/> </el-form-item> <el-form-item label="创建时间" prop="createTime"> - <el-date-picker v-model="queryParams.createTime" style="width: 240px" value-format="yyyy-MM-dd HH:mm:ss" type="daterange" - range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期" :default-time="['00:00:00', '23:59:59']" /> + <el-date-picker v-model="queryParams.createTime" style="width: 240px" value-format="yyyy-MM-dd HH:mm:ss" + type="daterange" + range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期" + :default-time="['00:00:00', '23:59:59']"/> </el-form-item> <el-form-item> <el-button type="primary" icon="el-icon-search" @click="handleQuery">搜索</el-button> @@ -35,6 +37,9 @@ <template v-slot="scope"> <image-preview v-if="scope.row.type&&scope.row.type.indexOf('image/') === 0" :src="scope.row.url" :width="'100px'"></image-preview> + <video v-else-if="scope.row.type&&scope.row.type.indexOf('video/') === 0" :width="'100px'"> + <source :src="scope.row.url"/> + </video> <i v-else>无法预览,点击 <el-link type="primary" :underline="false" style="font-size:12px;vertical-align: baseline;" target="_blank" :href="getFileUrl + scope.row.configId + '/get/' + scope.row.path">下载 @@ -118,7 +123,7 @@ export default { title: "", // 弹出层标题 isUploading: false, // 是否禁用上传 url: process.env.VUE_APP_BASE_API + "/admin-api/infra/file/upload", // 请求地址 - headers: { Authorization: "Bearer " + getAccessToken() }, // 设置上传的请求头部 + headers: {Authorization: "Bearer " + getAccessToken()}, // 设置上传的请求头部 data: {} // 上传的额外数据,用于文件名 }, }; @@ -189,19 +194,20 @@ export default { /** 删除按钮操作 */ handleDelete(row) { const id = row.id; - this.$modal.confirm('是否确认删除文件编号为"' + id + '"的数据项?').then(function() { + this.$modal.confirm('是否确认删除文件编号为"' + id + '"的数据项?').then(function () { return deleteFile(id); }).then(() => { this.getList(); this.$modal.msgSuccess("删除成功"); - }).catch(() => {}); + }).catch(() => { + }); }, // 用户昵称展示 sizeFormat(row, column) { - const unitArr = ["Bytes","KB","MB","GB","TB","PB","EB","ZB","YB"]; + const unitArr = ["Bytes", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"]; const srcSize = parseFloat(row.size); const index = Math.floor(Math.log(srcSize) / Math.log(1024)); - let size =srcSize/Math.pow(1024,index); + let size = srcSize / Math.pow(1024, index); size = size.toFixed(2);//保留的小数位数 return size + ' ' + unitArr[index]; }, diff --git a/yudao-ui-admin/src/views/infra/redis/index.vue b/yudao-ui-admin/src/views/infra/redis/index.vue index 0cbca999d..63be640bc 100644 --- a/yudao-ui-admin/src/views/infra/redis/index.vue +++ b/yudao-ui-admin/src/views/infra/redis/index.vue @@ -136,8 +136,8 @@ <script> import {getCache, getKeyDefineList, getKeyList, getKeyValue, deleteKey, deleteKeys} from "@/api/infra/redis"; -import echarts from "echarts"; - +import * as echarts from 'echarts' +require('echarts/theme/macarons') // echarts theme export default { name: "Server", data () { diff --git a/yudao-ui-admin/src/views/infra/webSocket/index.vue b/yudao-ui-admin/src/views/infra/webSocket/index.vue new file mode 100644 index 000000000..d48ffd3c1 --- /dev/null +++ b/yudao-ui-admin/src/views/infra/webSocket/index.vue @@ -0,0 +1,92 @@ +<template> + <div class="app-container"> + <el-form label-width="120px"> + <el-row type="flex" :gutter="0"> + <el-col :sm="12"> + <el-form-item label="WebSocket地址" size="small"> + <el-input v-model="url" type="text"/> + </el-form-item> + </el-col> + <el-col :offset="1"> + <el-form-item label="" label-width="0px" size="small"> + <el-button @click="connect" type="primary" :disabled="ws&&ws.readyState===1"> + {{ ws && ws.readyState === 1 ? "已连接" : "连接" }} + </el-button> + <el-button @click="exit" type="danger">断开</el-button> + </el-form-item> + </el-col> + </el-row> + <el-form-item label="发送内容" size="small"> + <el-input type="textarea" v-model="message" :rows="5"/> + </el-form-item> + <el-form-item label="" size="small"> + <el-button type="success" @click="send">发送消息</el-button> + </el-form-item> + <el-form-item label="接收内容" size="small"> + <el-input type="textarea" v-model="content" :rows="12" disabled/> + </el-form-item> + <el-form-item label="" size="small"> + <el-button type="info" @click="content=''">清空消息</el-button> + </el-form-item> + </el-form> + </div> +</template> + +<script> +import store from "@/store"; +import {getNowDateTime} from "@/utils/ruoyi"; + +export default { + data() { + return { + url: process.env.VUE_APP_BASE_API + "/websocket/message", + message: "", + content: "", + ws: null, + }; + }, + created() { + this.url = this.url.replace("http", "ws") + }, + methods: { + connect() { + if (!'WebSocket' in window) { + this.$modal.msgError("您的浏览器不支持WebSocket"); + return; + } + const userId = store.getters.userId; + this.ws = new WebSocket(this.url + "?userId=" + userId); + const self = this; + this.ws.onopen = function (event) { + self.content = self.content + "\n**********************连接开始**********************\n"; + }; + this.ws.onmessage = function (event) { + self.content = self.content + "接收时间:" + getNowDateTime() + "\n" + event.data + "\n"; + }; + this.ws.onclose = function (event) { + self.content = self.content + "**********************连接关闭**********************\n"; + }; + this.ws.error = function (event) { + self.content = self.content + "**********************连接异常**********************\n"; + }; + }, + exit() { + if (this.ws) { + this.ws.close(); + this.ws = null; + } + }, + send() { + if (!this.ws || this.ws.readyState !== 1) { + this.$modal.msgError("未连接到服务器"); + return; + } + if (!this.message) { + this.$modal.msgError("请输入发送内容"); + return; + } + this.ws.send(this.message); + } + }, +}; +</script> diff --git a/yudao-ui-app/utils/request/responseInterceptors.js b/yudao-ui-app/utils/request/responseInterceptors.js index 32b91875d..aa8c73a11 100644 --- a/yudao-ui-app/utils/request/responseInterceptors.js +++ b/yudao-ui-app/utils/request/responseInterceptors.js @@ -30,7 +30,7 @@ module.exports = vm => { if (!isRefreshToken) { isRefreshToken = true // 1. 如果获取不到刷新令牌,则只能执行登出操作 - if (!vm.$store.getters.refreshToken()) { + if (!vm.$store.getters.refreshToken) { vm.$store.commit('CLEAR_LOGIN_INFO') return Promise.reject(res) }