Commit 70970eeb1834249a57a0c639d223d9a43f56fee8

Authored by xingyu
2 parents 7645e8a9 3df82503

Merge remote-tracking branch 'origin/dev' into dev

Showing 24 changed files with 517 additions and 282 deletions
README.md
@@ -191,19 +191,19 @@ ps:核心功能已经实现,正在对接微信小程序中... @@ -191,19 +191,19 @@ ps:核心功能已经实现,正在对接微信小程序中...
191 | [Spring Boot](https://spring.io/projects/spring-boot) | 应用开发框架 | 2.7.7 | [文档](https://github.com/YunaiV/SpringBoot-Labs) | 191 | [Spring Boot](https://spring.io/projects/spring-boot) | 应用开发框架 | 2.7.7 | [文档](https://github.com/YunaiV/SpringBoot-Labs) |
192 | [MySQL](https://www.mysql.com/cn/) | 数据库服务器 | 5.7 / 8.0+ | | 192 | [MySQL](https://www.mysql.com/cn/) | 数据库服务器 | 5.7 / 8.0+ | |
193 | [Druid](https://github.com/alibaba/druid) | JDBC 连接池、监控组件 | 1.2.15 | [文档](http://www.iocoder.cn/Spring-Boot/datasource-pool/?yudao) | 193 | [Druid](https://github.com/alibaba/druid) | JDBC 连接池、监控组件 | 1.2.15 | [文档](http://www.iocoder.cn/Spring-Boot/datasource-pool/?yudao) |
194 -| [MyBatis Plus](https://mp.baomidou.com/) | MyBatis 增强工具包 | 3.5.3 | [文档](http://www.iocoder.cn/Spring-Boot/MyBatis/?yudao) | 194 +| [MyBatis Plus](https://mp.baomidou.com/) | MyBatis 增强工具包 | 3.5.3.1 | [文档](http://www.iocoder.cn/Spring-Boot/MyBatis/?yudao) |
195 | [Dynamic Datasource](https://dynamic-datasource.com/) | 动态数据源 | 3.6.1 | [文档](http://www.iocoder.cn/Spring-Boot/datasource-pool/?yudao) | 195 | [Dynamic Datasource](https://dynamic-datasource.com/) | 动态数据源 | 3.6.1 | [文档](http://www.iocoder.cn/Spring-Boot/datasource-pool/?yudao) |
196 | [Redis](https://redis.io/) | key-value 数据库 | 5.0 / 6.0 | | 196 | [Redis](https://redis.io/) | key-value 数据库 | 5.0 / 6.0 | |
197 | [Redisson](https://github.com/redisson/redisson) | Redis 客户端 | 3.18.0 | [文档](http://www.iocoder.cn/Spring-Boot/Redis/?yudao) | 197 | [Redisson](https://github.com/redisson/redisson) | Redis 客户端 | 3.18.0 | [文档](http://www.iocoder.cn/Spring-Boot/Redis/?yudao) |
198 | [Spring MVC](https://github.com/spring-projects/spring-framework/tree/master/spring-webmvc) | MVC 框架 | 5.3.24 | [文档](http://www.iocoder.cn/SpringMVC/MVC/?yudao) | 198 | [Spring MVC](https://github.com/spring-projects/spring-framework/tree/master/spring-webmvc) | MVC 框架 | 5.3.24 | [文档](http://www.iocoder.cn/SpringMVC/MVC/?yudao) |
199 -| [Spring Security](https://github.com/spring-projects/spring-security) | Spring 安全框架 | 5.7.5 | [文档](http://www.iocoder.cn/Spring-Boot/Spring-Security/?yudao) | 199 +| [Spring Security](https://github.com/spring-projects/spring-security) | Spring 安全框架 | 5.7.6 | [文档](http://www.iocoder.cn/Spring-Boot/Spring-Security/?yudao) |
200 | [Hibernate Validator](https://github.com/hibernate/hibernate-validator) | 参数校验组件 | 6.2.5 | [文档](http://www.iocoder.cn/Spring-Boot/Validation/?yudao) | 200 | [Hibernate Validator](https://github.com/hibernate/hibernate-validator) | 参数校验组件 | 6.2.5 | [文档](http://www.iocoder.cn/Spring-Boot/Validation/?yudao) |
201 | [Flowable](https://github.com/flowable/flowable-engine) | 工作流引擎 | 6.8.0 | [文档](https://doc.iocoder.cn/bpm/) | 201 | [Flowable](https://github.com/flowable/flowable-engine) | 工作流引擎 | 6.8.0 | [文档](https://doc.iocoder.cn/bpm/) |
202 | [Quartz](https://github.com/quartz-scheduler) | 任务调度组件 | 2.3.2 | [文档](http://www.iocoder.cn/Spring-Boot/Job/?yudao) | 202 | [Quartz](https://github.com/quartz-scheduler) | 任务调度组件 | 2.3.2 | [文档](http://www.iocoder.cn/Spring-Boot/Job/?yudao) |
203 | [Knife4j](https://gitee.com/xiaoym/knife4j) | Swagger 增强 UI 实现 | 3.0.3 | [文档](http://www.iocoder.cn/Spring-Boot/Swagger/?yudao) | 203 | [Knife4j](https://gitee.com/xiaoym/knife4j) | Swagger 增强 UI 实现 | 3.0.3 | [文档](http://www.iocoder.cn/Spring-Boot/Swagger/?yudao) |
204 | [Resilience4j](https://github.com/resilience4j/resilience4j) | 服务保障组件 | 1.7.1 | [文档](http://www.iocoder.cn/Spring-Boot/Resilience4j/?yudao) | 204 | [Resilience4j](https://github.com/resilience4j/resilience4j) | 服务保障组件 | 1.7.1 | [文档](http://www.iocoder.cn/Spring-Boot/Resilience4j/?yudao) |
205 | [SkyWalking](https://skywalking.apache.org/) | 分布式应用追踪系统 | 8.12.0 | [文档](http://www.iocoder.cn/Spring-Boot/SkyWalking/?yudao) | 205 | [SkyWalking](https://skywalking.apache.org/) | 分布式应用追踪系统 | 8.12.0 | [文档](http://www.iocoder.cn/Spring-Boot/SkyWalking/?yudao) |
206 -| [Spring Boot Admin](https://github.com/codecentric/spring-boot-admin) | Spring Boot 监控平台 | 2.7.9 | [文档](http://www.iocoder.cn/Spring-Boot/Admin/?yudao) | 206 +| [Spring Boot Admin](https://github.com/codecentric/spring-boot-admin) | Spring Boot 监控平台 | 2.7.10 | [文档](http://www.iocoder.cn/Spring-Boot/Admin/?yudao) |
207 | [Jackson](https://github.com/FasterXML/jackson) | JSON 工具库 | 2.13.3 | | 207 | [Jackson](https://github.com/FasterXML/jackson) | JSON 工具库 | 2.13.3 | |
208 | [MapStruct](https://mapstruct.org/) | Java Bean 转换 | 1.5.3.Final | [文档](http://www.iocoder.cn/Spring-Boot/MapStruct/?yudao) | 208 | [MapStruct](https://mapstruct.org/) | Java Bean 转换 | 1.5.3.Final | [文档](http://www.iocoder.cn/Spring-Boot/MapStruct/?yudao) |
209 | [Lombok](https://projectlombok.org/) | 消除冗长的 Java 代码 | 1.18.24 | [文档](http://www.iocoder.cn/Spring-Boot/Lombok/?yudao) | 209 | [Lombok](https://projectlombok.org/) | 消除冗长的 Java 代码 | 1.18.24 | [文档](http://www.iocoder.cn/Spring-Boot/Lombok/?yudao) |
@@ -227,7 +227,7 @@ ps:核心功能已经实现,正在对接微信小程序中... @@ -227,7 +227,7 @@ ps:核心功能已经实现,正在对接微信小程序中...
227 | [TypeScript](https://www.typescriptlang.org/docs/) | TypeScript | 4.9.4 | 227 | [TypeScript](https://www.typescriptlang.org/docs/) | TypeScript | 4.9.4 |
228 | [pinia](https://pinia.vuejs.org/) | vuex5 | 2.0.28 | 228 | [pinia](https://pinia.vuejs.org/) | vuex5 | 2.0.28 |
229 | [vue-i18n](https://kazupon.github.io/vue-i18n/zh/introduction.html/) | 国际化 | 9.2.2 | 229 | [vue-i18n](https://kazupon.github.io/vue-i18n/zh/introduction.html/) | 国际化 | 9.2.2 |
230 -| [vxe-table](https://vxetable.cn/) | vue最强表单 | 4.3.7 | 230 +| [vxe-table](https://vxetable.cn/) | vue最强表单 | 4.3.9 |
231 231
232 ### [管理后台 uni-app 跨端](./yudao-ui-admin-uniapp) 232 ### [管理后台 uni-app 跨端](./yudao-ui-admin-uniapp)
233 233
sql/optional/visualization/jimureport.mysql5.7.create.sql
@@ -1344,6 +1344,7 @@ CREATE TABLE `jimu_report_share` ( @@ -1344,6 +1344,7 @@ CREATE TABLE `jimu_report_share` (
1344 `last_update_time` datetime NULL DEFAULT NULL COMMENT '最后更新时间', 1344 `last_update_time` datetime NULL DEFAULT NULL COMMENT '最后更新时间',
1345 `term_of_validity` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '有效期(0:永久有效,1:1天,2:7天)', 1345 `term_of_validity` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '有效期(0:永久有效,1:1天,2:7天)',
1346 `status` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '是否过期(0未过期,1已过期)', 1346 `status` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '是否过期(0未过期,1已过期)',
  1347 + `preview_lock_status` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '密码锁状态',
1347 PRIMARY KEY (`id`) USING BTREE 1348 PRIMARY KEY (`id`) USING BTREE
1348 ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '积木报表预览权限表' ROW_FORMAT = Dynamic; 1349 ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '积木报表预览权限表' ROW_FORMAT = Dynamic;
1349 1350
yudao-dependencies/pom.xml
@@ -32,7 +32,7 @@ @@ -32,7 +32,7 @@
32 <resilience4j.version>1.7.1</resilience4j.version> 32 <resilience4j.version>1.7.1</resilience4j.version>
33 <!-- 监控相关 --> 33 <!-- 监控相关 -->
34 <skywalking.version>8.12.0</skywalking.version> 34 <skywalking.version>8.12.0</skywalking.version>
35 - <spring-boot-admin.version>2.7.9</spring-boot-admin.version> 35 + <spring-boot-admin.version>2.7.10</spring-boot-admin.version>
36 <opentracing.version>0.33.0</opentracing.version> 36 <opentracing.version>0.33.0</opentracing.version>
37 <!-- Test 测试相关 --> 37 <!-- Test 测试相关 -->
38 <podam.version>7.2.11.RELEASE</podam.version> 38 <podam.version>7.2.11.RELEASE</podam.version>
@@ -41,10 +41,11 @@ @@ -41,10 +41,11 @@
41 <!-- Bpm 工作流相关 --> 41 <!-- Bpm 工作流相关 -->
42 <flowable.version>6.8.0</flowable.version> 42 <flowable.version>6.8.0</flowable.version>
43 <!-- 工具类相关 --> 43 <!-- 工具类相关 -->
  44 + <jsoup.version>1.15.3</jsoup.version>
44 <lombok.version>1.18.24</lombok.version> 45 <lombok.version>1.18.24</lombok.version>
45 <mapstruct.version>1.5.3.Final</mapstruct.version> 46 <mapstruct.version>1.5.3.Final</mapstruct.version>
46 <hutool.version>5.8.11</hutool.version> 47 <hutool.version>5.8.11</hutool.version>
47 - <easyexcel.verion>3.1.4</easyexcel.verion> 48 + <easyexcel.verion>3.1.5</easyexcel.verion>
48 <velocity.version>2.3</velocity.version> 49 <velocity.version>2.3</velocity.version>
49 <screw.version>1.0.5</screw.version> 50 <screw.version>1.0.5</screw.version>
50 <fastjson.version>1.2.83</fastjson.version> 51 <fastjson.version>1.2.83</fastjson.version>
@@ -63,7 +64,7 @@ @@ -63,7 +64,7 @@
63 <minio.version>8.4.6</minio.version> 64 <minio.version>8.4.6</minio.version>
64 <aliyun-java-sdk-core.version>4.6.3</aliyun-java-sdk-core.version> 65 <aliyun-java-sdk-core.version>4.6.3</aliyun-java-sdk-core.version>
65 <aliyun-java-sdk-dysmsapi.version>2.2.1</aliyun-java-sdk-dysmsapi.version> 66 <aliyun-java-sdk-dysmsapi.version>2.2.1</aliyun-java-sdk-dysmsapi.version>
66 - <tencentcloud-sdk-java.version>3.1.660</tencentcloud-sdk-java.version> 67 + <tencentcloud-sdk-java.version>3.1.667</tencentcloud-sdk-java.version>
67 <justauth.version>1.4.0</justauth.version> 68 <justauth.version>1.4.0</justauth.version>
68 <jimureport.version>1.5.6</jimureport.version> 69 <jimureport.version>1.5.6</jimureport.version>
69 <xercesImpl.version>2.12.2</xercesImpl.version> 70 <xercesImpl.version>2.12.2</xercesImpl.version>
@@ -522,6 +523,12 @@ @@ -522,6 +523,12 @@
522 <version>${ip2region.version}</version> 523 <version>${ip2region.version}</version>
523 </dependency> 524 </dependency>
524 525
  526 + <dependency>
  527 + <groupId>org.jsoup</groupId>
  528 + <artifactId>jsoup</artifactId>
  529 + <version>${jsoup.version}</version>
  530 + </dependency>
  531 +
525 <!-- 三方云服务相关 --> 532 <!-- 三方云服务相关 -->
526 <dependency> 533 <dependency>
527 <groupId>com.squareup.okio</groupId> 534 <groupId>com.squareup.okio</groupId>
yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/core/mapper/BaseMapperX.java
@@ -2,7 +2,6 @@ package cn.iocoder.yudao.framework.mybatis.core.mapper; @@ -2,7 +2,6 @@ package cn.iocoder.yudao.framework.mybatis.core.mapper;
2 2
3 import cn.iocoder.yudao.framework.common.pojo.PageParam; 3 import cn.iocoder.yudao.framework.common.pojo.PageParam;
4 import cn.iocoder.yudao.framework.common.pojo.PageResult; 4 import cn.iocoder.yudao.framework.common.pojo.PageResult;
5 -import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;  
6 import cn.iocoder.yudao.framework.mybatis.core.util.MyBatisUtils; 5 import cn.iocoder.yudao.framework.mybatis.core.util.MyBatisUtils;
7 import com.baomidou.mybatisplus.core.conditions.Wrapper; 6 import com.baomidou.mybatisplus.core.conditions.Wrapper;
8 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; 7 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@@ -10,6 +9,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -10,6 +9,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
10 import com.baomidou.mybatisplus.core.mapper.BaseMapper; 9 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
11 import com.baomidou.mybatisplus.core.metadata.IPage; 10 import com.baomidou.mybatisplus.core.metadata.IPage;
12 import com.baomidou.mybatisplus.core.toolkit.support.SFunction; 11 import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
  12 +import com.baomidou.mybatisplus.extension.toolkit.Db;
13 import org.apache.ibatis.annotations.Param; 13 import org.apache.ibatis.annotations.Param;
14 14
15 import java.util.Collection; 15 import java.util.Collection;
@@ -92,8 +92,22 @@ public interface BaseMapperX&lt;T&gt; extends BaseMapper&lt;T&gt; { @@ -92,8 +92,22 @@ public interface BaseMapperX&lt;T&gt; extends BaseMapper&lt;T&gt; {
92 entities.forEach(this::insert); 92 entities.forEach(this::insert);
93 } 93 }
94 94
  95 + /**
  96 + * 批量插入,适合大量数据插入
  97 + *
  98 + * @param entities 实体们
  99 + * @param size 插入数量 Db.saveBatch 默认为1000
  100 + */
  101 + default void insertBatch(Collection<T> entities, int size) {
  102 + Db.saveBatch(entities, size);
  103 + }
  104 +
95 default void updateBatch(T update) { 105 default void updateBatch(T update) {
96 update(update, new QueryWrapper<>()); 106 update(update, new QueryWrapper<>());
97 } 107 }
98 108
  109 + default void updateBatch(Collection<T> entities, int size) {
  110 + Db.updateBatchById(entities, size);
  111 + }
  112 +
99 } 113 }
yudao-framework/yudao-spring-boot-starter-web/pom.xml
@@ -67,6 +67,11 @@ @@ -67,6 +67,11 @@
67 <scope>provided</scope> <!-- 设置为 provided,主要是 GlobalExceptionHandler 使用 --> 67 <scope>provided</scope> <!-- 设置为 provided,主要是 GlobalExceptionHandler 使用 -->
68 </dependency> 68 </dependency>
69 69
  70 + <!-- xss -->
  71 + <dependency>
  72 + <groupId>org.jsoup</groupId>
  73 + <artifactId>jsoup</artifactId>
  74 + </dependency>
70 </dependencies> 75 </dependencies>
71 76
72 </project> 77 </project>
yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/config/YudaoWebAutoConfiguration.java
@@ -2,15 +2,22 @@ package cn.iocoder.yudao.framework.web.config; @@ -2,15 +2,22 @@ package cn.iocoder.yudao.framework.web.config;
2 2
3 import cn.iocoder.yudao.framework.apilog.core.service.ApiErrorLogFrameworkService; 3 import cn.iocoder.yudao.framework.apilog.core.service.ApiErrorLogFrameworkService;
4 import cn.iocoder.yudao.framework.common.enums.WebFilterOrderEnum; 4 import cn.iocoder.yudao.framework.common.enums.WebFilterOrderEnum;
  5 +import cn.iocoder.yudao.framework.web.core.clean.JsoupXssCleaner;
  6 +import cn.iocoder.yudao.framework.web.core.clean.XssCleaner;
5 import cn.iocoder.yudao.framework.web.core.filter.CacheRequestBodyFilter; 7 import cn.iocoder.yudao.framework.web.core.filter.CacheRequestBodyFilter;
6 import cn.iocoder.yudao.framework.web.core.filter.DemoFilter; 8 import cn.iocoder.yudao.framework.web.core.filter.DemoFilter;
7 import cn.iocoder.yudao.framework.web.core.filter.XssFilter; 9 import cn.iocoder.yudao.framework.web.core.filter.XssFilter;
8 import cn.iocoder.yudao.framework.web.core.handler.GlobalExceptionHandler; 10 import cn.iocoder.yudao.framework.web.core.handler.GlobalExceptionHandler;
9 import cn.iocoder.yudao.framework.web.core.handler.GlobalResponseBodyHandler; 11 import cn.iocoder.yudao.framework.web.core.handler.GlobalResponseBodyHandler;
  12 +import cn.iocoder.yudao.framework.web.core.json.XssStringJsonDeserializer;
10 import cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils; 13 import cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils;
  14 +import com.fasterxml.jackson.databind.ObjectMapper;
11 import org.springframework.beans.factory.annotation.Value; 15 import org.springframework.beans.factory.annotation.Value;
12 import org.springframework.boot.autoconfigure.AutoConfiguration; 16 import org.springframework.boot.autoconfigure.AutoConfiguration;
  17 +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
  18 +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
13 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; 19 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
  20 +import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
14 import org.springframework.boot.context.properties.EnableConfigurationProperties; 21 import org.springframework.boot.context.properties.EnableConfigurationProperties;
15 import org.springframework.boot.web.servlet.FilterRegistrationBean; 22 import org.springframework.boot.web.servlet.FilterRegistrationBean;
16 import org.springframework.context.annotation.Bean; 23 import org.springframework.context.annotation.Bean;
@@ -48,7 +55,7 @@ public class YudaoWebAutoConfiguration implements WebMvcConfigurer { @@ -48,7 +55,7 @@ public class YudaoWebAutoConfiguration implements WebMvcConfigurer {
48 * 设置 API 前缀,仅仅匹配 controller 包下的 55 * 设置 API 前缀,仅仅匹配 controller 包下的
49 * 56 *
50 * @param configurer 配置 57 * @param configurer 配置
51 - * @param api API 配置 58 + * @param api API 配置
52 */ 59 */
53 private void configurePathMatch(PathMatchConfigurer configurer, WebProperties.Api api) { 60 private void configurePathMatch(PathMatchConfigurer configurer, WebProperties.Api api) {
54 AntPathMatcher antPathMatcher = new AntPathMatcher("."); 61 AntPathMatcher antPathMatcher = new AntPathMatcher(".");
@@ -104,8 +111,9 @@ public class YudaoWebAutoConfiguration implements WebMvcConfigurer { @@ -104,8 +111,9 @@ public class YudaoWebAutoConfiguration implements WebMvcConfigurer {
104 * 创建 XssFilter Bean,解决 Xss 安全问题 111 * 创建 XssFilter Bean,解决 Xss 安全问题
105 */ 112 */
106 @Bean 113 @Bean
107 - public FilterRegistrationBean<XssFilter> xssFilter(XssProperties properties, PathMatcher pathMatcher) {  
108 - return createFilterBean(new XssFilter(properties, pathMatcher), WebFilterOrderEnum.XSS_FILTER); 114 + @ConditionalOnBean(XssCleaner.class)
  115 + public FilterRegistrationBean<XssFilter> xssFilter(XssProperties properties, PathMatcher pathMatcher, XssCleaner xssCleaner) {
  116 + return createFilterBean(new XssFilter(properties, pathMatcher, xssCleaner), WebFilterOrderEnum.XSS_FILTER);
109 } 117 }
110 118
111 /** 119 /**
@@ -117,6 +125,32 @@ public class YudaoWebAutoConfiguration implements WebMvcConfigurer { @@ -117,6 +125,32 @@ public class YudaoWebAutoConfiguration implements WebMvcConfigurer {
117 return createFilterBean(new DemoFilter(), WebFilterOrderEnum.DEMO_FILTER); 125 return createFilterBean(new DemoFilter(), WebFilterOrderEnum.DEMO_FILTER);
118 } 126 }
119 127
  128 +
  129 + /**
  130 + * Xss 清理者
  131 + *
  132 + * @return XssCleaner
  133 + */
  134 + @Bean
  135 + @ConditionalOnMissingBean(XssCleaner.class)
  136 + public XssCleaner xssCleaner() {
  137 + return new JsoupXssCleaner();
  138 + }
  139 +
  140 + /**
  141 + * 注册 Jackson 的序列化器,用于处理 json 类型参数的 xss 过滤
  142 + *
  143 + * @return Jackson2ObjectMapperBuilderCustomizer
  144 + */
  145 + @Bean
  146 + @ConditionalOnMissingBean(name = "xssJacksonCustomizer")
  147 + @ConditionalOnBean(ObjectMapper.class)
  148 + @ConditionalOnProperty(value = "yudao.xss.enable", havingValue = "true")
  149 + public Jackson2ObjectMapperBuilderCustomizer xssJacksonCustomizer(XssCleaner xssCleaner) {
  150 + // 在反序列化时进行 xss 过滤,可以替换使用 XssStringJsonSerializer,在序列化时进行处理
  151 + return builder -> builder.deserializerByType(String.class, new XssStringJsonDeserializer(xssCleaner));
  152 + }
  153 +
120 private static <T extends Filter> FilterRegistrationBean<T> createFilterBean(T filter, Integer order) { 154 private static <T extends Filter> FilterRegistrationBean<T> createFilterBean(T filter, Integer order) {
121 FilterRegistrationBean<T> bean = new FilterRegistrationBean<>(filter); 155 FilterRegistrationBean<T> bean = new FilterRegistrationBean<>(filter);
122 bean.setOrder(order); 156 bean.setOrder(order);
yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/core/clean/JsoupXssCleaner.java 0 → 100644
  1 +package cn.iocoder.yudao.framework.web.core.clean;
  2 +
  3 +import org.jsoup.Jsoup;
  4 +import org.jsoup.nodes.Document;
  5 +import org.jsoup.safety.Safelist;
  6 +
  7 +/**
  8 + * jsonp 过滤字符串
  9 + */
  10 +public class JsoupXssCleaner implements XssCleaner {
  11 +
  12 + private final Safelist safelist;
  13 +
  14 + /**
  15 + * 用于在 src 属性使用相对路径时,强制转换为绝对路径。 为空时不处理,值应为绝对路径的前缀(包含协议部分)
  16 + */
  17 + private final String baseUri;
  18 +
  19 + /**
  20 + * 无参构造,默认使用 {@link JsoupXssCleaner#buildSafelist} 方法构建一个安全列表
  21 + */
  22 + public JsoupXssCleaner() {
  23 + this.safelist = buildSafelist();
  24 + this.baseUri = "";
  25 + }
  26 +
  27 + public JsoupXssCleaner(Safelist safelist) {
  28 + this.safelist = safelist;
  29 + this.baseUri = "";
  30 + }
  31 +
  32 + public JsoupXssCleaner(String baseUri) {
  33 + this.safelist = buildSafelist();
  34 + this.baseUri = baseUri;
  35 + }
  36 +
  37 + public JsoupXssCleaner(Safelist safelist, String baseUri) {
  38 + this.safelist = safelist;
  39 + this.baseUri = baseUri;
  40 + }
  41 +
  42 + /**
  43 + * 构建一个 Xss 清理的 Safelist 规则。
  44 + * 基于 Safelist#relaxed() 的基础上:
  45 + * 1. 扩展支持了 style 和 class 属性
  46 + * 2. a 标签额外支持了 target 属性
  47 + * 3. img 标签额外支持了 data 协议,便于支持 base64
  48 + *
  49 + * @return Safelist
  50 + */
  51 + private Safelist buildSafelist() {
  52 + // 使用 jsoup 提供的默认的
  53 + Safelist relaxedSafelist = Safelist.relaxed();
  54 + // 富文本编辑时一些样式是使用 style 来进行实现的
  55 + // 比如红色字体 style="color:red;", 所以需要给所有标签添加 style 属性
  56 + // 注意:style 属性会有注入风险 <img STYLE="background-image:url(javascript:alert('XSS'))">
  57 + relaxedSafelist.addAttributes(":all", "style", "class");
  58 + // 保留 a 标签的 target 属性
  59 + relaxedSafelist.addAttributes("a", "target");
  60 + // 支持img 为base64
  61 + relaxedSafelist.addProtocols("img", "src", "data");
  62 +
  63 + // 保留相对路径, 保留相对路径时,必须提供对应的 baseUri 属性,否则依然会被删除
  64 + // WHITELIST.preserveRelativeLinks(false);
  65 +
  66 + // 移除 a 标签和 img 标签的一些协议限制,这会导致 xss 防注入失效,如 <img src=javascript:alert("xss")>
  67 + // 虽然可以重写 WhiteList#isSafeAttribute 来处理,但是有隐患,所以暂时不支持相对路径
  68 + // WHITELIST.removeProtocols("a", "href", "ftp", "http", "https", "mailto");
  69 + // WHITELIST.removeProtocols("img", "src", "http", "https");
  70 +
  71 + return relaxedSafelist;
  72 + }
  73 +
  74 + @Override
  75 + public String clean(String html) {
  76 + return Jsoup.clean(html, baseUri, safelist, new Document.OutputSettings().prettyPrint(false));
  77 + }
  78 +
  79 +}
  80 +
yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/core/clean/XssCleaner.java 0 → 100644
  1 +package cn.iocoder.yudao.framework.web.core.clean;
  2 +
  3 +/**
  4 + * 对 html 文本中的有 Xss 风险的数据进行清理
  5 + */
  6 +public interface XssCleaner {
  7 +
  8 + /**
  9 + * 清理有 Xss 风险的文本
  10 + *
  11 + * @param html 原 html
  12 + * @return 清理后的 html
  13 + */
  14 + String clean(String html);
  15 +}
yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/core/filter/XssFilter.java
1 package cn.iocoder.yudao.framework.web.core.filter; 1 package cn.iocoder.yudao.framework.web.core.filter;
2 2
3 import cn.iocoder.yudao.framework.web.config.XssProperties; 3 import cn.iocoder.yudao.framework.web.config.XssProperties;
  4 +import cn.iocoder.yudao.framework.web.core.clean.XssCleaner;
4 import lombok.AllArgsConstructor; 5 import lombok.AllArgsConstructor;
5 import org.springframework.util.PathMatcher; 6 import org.springframework.util.PathMatcher;
6 import org.springframework.web.filter.OncePerRequestFilter; 7 import org.springframework.web.filter.OncePerRequestFilter;
@@ -13,7 +14,7 @@ import java.io.IOException; @@ -13,7 +14,7 @@ import java.io.IOException;
13 14
14 /** 15 /**
15 * Xss 过滤器 16 * Xss 过滤器
16 - * 17 + * <p>
17 * 对 Xss 不了解的胖友,可以看看 http://www.iocoder.cn/Fight/The-new-girl-asked-me-why-AJAX-requests-are-not-secure-I-did-not-answer/ 18 * 对 Xss 不了解的胖友,可以看看 http://www.iocoder.cn/Fight/The-new-girl-asked-me-why-AJAX-requests-are-not-secure-I-did-not-answer/
18 * 19 *
19 * @author 芋道源码 20 * @author 芋道源码
@@ -30,10 +31,12 @@ public class XssFilter extends OncePerRequestFilter { @@ -30,10 +31,12 @@ public class XssFilter extends OncePerRequestFilter {
30 */ 31 */
31 private final PathMatcher pathMatcher; 32 private final PathMatcher pathMatcher;
32 33
  34 + private final XssCleaner xssCleaner;
  35 +
33 @Override 36 @Override
34 protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) 37 protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
35 throws IOException, ServletException { 38 throws IOException, ServletException {
36 - filterChain.doFilter(new XssRequestWrapper(request), response); 39 + filterChain.doFilter(new XssRequestWrapper(request, xssCleaner), response);
37 } 40 }
38 41
39 @Override 42 @Override
yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/core/filter/XssRequestWrapper.java
1 package cn.iocoder.yudao.framework.web.core.filter; 1 package cn.iocoder.yudao.framework.web.core.filter;
2 2
3 -import cn.hutool.core.collection.CollUtil;  
4 -import cn.hutool.core.io.IoUtil;  
5 -import cn.hutool.core.util.ArrayUtil;  
6 -import cn.hutool.core.util.ReflectUtil;  
7 -import cn.hutool.core.util.StrUtil;  
8 -import cn.hutool.http.HTMLFilter;  
9 -import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils; 3 +import cn.iocoder.yudao.framework.web.core.clean.XssCleaner;
10 4
11 -import javax.servlet.ReadListener;  
12 -import javax.servlet.ServletInputStream;  
13 import javax.servlet.http.HttpServletRequest; 5 import javax.servlet.http.HttpServletRequest;
14 import javax.servlet.http.HttpServletRequestWrapper; 6 import javax.servlet.http.HttpServletRequestWrapper;
15 -import java.io.BufferedReader;  
16 -import java.io.ByteArrayInputStream;  
17 -import java.io.IOException;  
18 -import java.io.InputStreamReader; 7 +import java.util.LinkedHashMap;
19 import java.util.Map; 8 import java.util.Map;
20 9
21 /** 10 /**
@@ -24,113 +13,79 @@ import java.util.Map; @@ -24,113 +13,79 @@ import java.util.Map;
24 * @author 芋道源码 13 * @author 芋道源码
25 */ 14 */
26 public class XssRequestWrapper extends HttpServletRequestWrapper { 15 public class XssRequestWrapper extends HttpServletRequestWrapper {
  16 + private final XssCleaner xssCleaner;
27 17
28 - /**  
29 - * 基于线程级别的 HTMLFilter 对象,因为它线程非安全  
30 - */  
31 - private static final ThreadLocal<HTMLFilter> HTML_FILTER = ThreadLocal.withInitial(() -> {  
32 - HTMLFilter htmlFilter = new HTMLFilter();  
33 - // 反射修改 encodeQuotes 属性为 false,避免 " 被转移成 &quot; 字符  
34 - ReflectUtil.setFieldValue(htmlFilter, "encodeQuotes", false);  
35 - return htmlFilter;  
36 - });  
37 -  
38 - public XssRequestWrapper(HttpServletRequest request) { 18 + public XssRequestWrapper(HttpServletRequest request, XssCleaner xssCleaner) {
39 super(request); 19 super(request);
  20 + this.xssCleaner = xssCleaner;
40 } 21 }
41 22
42 - private static String filterXss(String content) {  
43 - if (StrUtil.isEmpty(content)) {  
44 - return content;  
45 - }  
46 - return HTML_FILTER.get().filter(content);  
47 - }  
48 -  
49 - // ========== IO 流相关 ==========  
50 - 23 + // ============================ parameter ============================
51 @Override 24 @Override
52 - public BufferedReader getReader() throws IOException {  
53 - return new BufferedReader(new InputStreamReader(this.getInputStream())); 25 + public Map<String, String[]> getParameterMap() {
  26 + Map<String, String[]> map = new LinkedHashMap<>();
  27 + Map<String, String[]> parameters = super.getParameterMap();
  28 + for (Map.Entry<String, String[]> entry : parameters.entrySet()) {
  29 + String[] values = entry.getValue();
  30 + for (int i = 0; i < values.length; i++) {
  31 + values[i] = xssCleaner.clean(values[i]);
  32 + }
  33 + map.put(entry.getKey(), values);
  34 + }
  35 + return map;
54 } 36 }
55 37
56 @Override 38 @Override
57 - public ServletInputStream getInputStream() throws IOException {  
58 - // 如果非 json 请求,不进行 Xss 处理  
59 - if (!ServletUtils.isJsonRequest(this)) {  
60 - return super.getInputStream(); 39 + public String[] getParameterValues(String name) {
  40 + String[] values = super.getParameterValues(name);
  41 + if (values == null) {
  42 + return null;
61 } 43 }
62 -  
63 - // 读取内容,并过滤  
64 - String content = IoUtil.readUtf8(super.getInputStream());  
65 - content = filterXss(content);  
66 - final ByteArrayInputStream newInputStream = new ByteArrayInputStream(content.getBytes());  
67 - // 返回 ServletInputStream  
68 - return new ServletInputStream() {  
69 -  
70 - @Override  
71 - public int read() {  
72 - return newInputStream.read();  
73 - }  
74 -  
75 - @Override  
76 - public boolean isFinished() {  
77 - return true;  
78 - }  
79 -  
80 - @Override  
81 - public boolean isReady() {  
82 - return true;  
83 - }  
84 -  
85 - @Override  
86 - public void setReadListener(ReadListener readListener) {}  
87 -  
88 - }; 44 + int count = values.length;
  45 + String[] encodedValues = new String[count];
  46 + for (int i = 0; i < count; i++) {
  47 + encodedValues[i] = xssCleaner.clean(values[i]);
  48 + }
  49 + return encodedValues;
89 } 50 }
90 51
91 - // ========== Param 相关 ==========  
92 -  
93 @Override 52 @Override
94 public String getParameter(String name) { 53 public String getParameter(String name) {
95 String value = super.getParameter(name); 54 String value = super.getParameter(name);
96 - return filterXss(value); 55 + if (value == null) {
  56 + return null;
  57 + }
  58 + return xssCleaner.clean(value);
97 } 59 }
98 60
  61 + // ============================ attribute ============================
99 @Override 62 @Override
100 - public String[] getParameterValues(String name) {  
101 - String[] values = super.getParameterValues(name);  
102 - if (ArrayUtil.isEmpty(values)) {  
103 - return values;  
104 - }  
105 - // 过滤处理  
106 - for (int i = 0; i < values.length; i++) {  
107 - values[i] = filterXss(values[i]); 63 + public Object getAttribute(String name) {
  64 + Object value = super.getAttribute(name);
  65 + if (value instanceof String) {
  66 + xssCleaner.clean((String) value);
108 } 67 }
109 - return values; 68 + return value;
110 } 69 }
111 70
  71 + // ============================ header ============================
112 @Override 72 @Override
113 - public Map<String, String[]> getParameterMap() {  
114 - Map<String, String[]> valueMap = super.getParameterMap();  
115 - if (CollUtil.isEmpty(valueMap)) {  
116 - return valueMap;  
117 - }  
118 - // 过滤处理  
119 - for (Map.Entry<String, String[]> entry : valueMap.entrySet()) {  
120 - String[] values = entry.getValue();  
121 - for (int i = 0; i < values.length; i++) {  
122 - values[i] = filterXss(values[i]);  
123 - } 73 + public String getHeader(String name) {
  74 + String value = super.getHeader(name);
  75 + if (value == null) {
  76 + return null;
124 } 77 }
125 - return valueMap; 78 + return xssCleaner.clean(value);
126 } 79 }
127 80
128 - // ========== Header 相关 ==========  
129 - 81 + // ============================ queryString ============================
130 @Override 82 @Override
131 - public String getHeader(String name) {  
132 - String value = super.getHeader(name);  
133 - return filterXss(value); 83 + public String getQueryString() {
  84 + String value = super.getQueryString();
  85 + if (value == null) {
  86 + return null;
  87 + }
  88 + return xssCleaner.clean(value);
134 } 89 }
135 90
136 } 91 }
yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/core/json/XssStringJsonDeserializer.java 0 → 100644
  1 +package cn.iocoder.yudao.framework.web.core.json;
  2 +
  3 +import cn.iocoder.yudao.framework.web.core.clean.XssCleaner;
  4 +import com.fasterxml.jackson.core.JsonParser;
  5 +import com.fasterxml.jackson.core.JsonToken;
  6 +import com.fasterxml.jackson.databind.DeserializationContext;
  7 +import com.fasterxml.jackson.databind.deser.std.StringDeserializer;
  8 +import lombok.AllArgsConstructor;
  9 +import lombok.extern.slf4j.Slf4j;
  10 +
  11 +import java.io.IOException;
  12 +
  13 +/**
  14 + * XSS 过滤 jackson 反序列化器。
  15 + * 在反序列化的过程中,会对字符串进行 XSS 过滤。
  16 + *
  17 + * @author Hccake
  18 + */
  19 +@Slf4j
  20 +@AllArgsConstructor
  21 +public class XssStringJsonDeserializer extends StringDeserializer {
  22 +
  23 + private final XssCleaner xssCleaner;
  24 +
  25 + @Override
  26 + public String deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
  27 + if (p.hasToken(JsonToken.VALUE_STRING)) {
  28 + return xssCleaner.clean(p.getText());
  29 + }
  30 + JsonToken t = p.currentToken();
  31 + // [databind#381]
  32 + if (t == JsonToken.START_ARRAY) {
  33 + return _deserializeFromArray(p, ctxt);
  34 + }
  35 + // need to gracefully handle byte[] data, as base64
  36 + if (t == JsonToken.VALUE_EMBEDDED_OBJECT) {
  37 + Object ob = p.getEmbeddedObject();
  38 + if (ob == null) {
  39 + return null;
  40 + }
  41 + if (ob instanceof byte[]) {
  42 + return ctxt.getBase64Variant().encode((byte[]) ob, false);
  43 + }
  44 + // otherwise, try conversion using toString()...
  45 + return ob.toString();
  46 + }
  47 + // 29-Jun-2020, tatu: New! "Scalar from Object" (mostly for XML)
  48 + if (t == JsonToken.START_OBJECT) {
  49 + return ctxt.extractScalarFromObject(p, this, _valueClass);
  50 + }
  51 +
  52 + if (t.isScalarValue()) {
  53 + String text = p.getValueAsString();
  54 + return xssCleaner.clean(text);
  55 + }
  56 + return (String) ctxt.handleUnexpectedToken(_valueClass, p);
  57 + }
  58 +}
  59 +
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/convert/codegen/CodegenConvert.java
@@ -11,9 +11,11 @@ import cn.iocoder.yudao.module.infra.dal.dataobject.codegen.CodegenColumnDO; @@ -11,9 +11,11 @@ import cn.iocoder.yudao.module.infra.dal.dataobject.codegen.CodegenColumnDO;
11 import cn.iocoder.yudao.module.infra.dal.dataobject.codegen.CodegenTableDO; 11 import cn.iocoder.yudao.module.infra.dal.dataobject.codegen.CodegenTableDO;
12 import com.baomidou.mybatisplus.generator.config.po.TableField; 12 import com.baomidou.mybatisplus.generator.config.po.TableField;
13 import com.baomidou.mybatisplus.generator.config.po.TableInfo; 13 import com.baomidou.mybatisplus.generator.config.po.TableInfo;
  14 +import com.baomidou.mybatisplus.generator.config.rules.IColumnType;
14 import org.mapstruct.Mapper; 15 import org.mapstruct.Mapper;
15 import org.mapstruct.Mapping; 16 import org.mapstruct.Mapping;
16 import org.mapstruct.Mappings; 17 import org.mapstruct.Mappings;
  18 +import org.mapstruct.Named;
17 import org.mapstruct.factory.Mappers; 19 import org.mapstruct.factory.Mappers;
18 20
19 import java.util.List; 21 import java.util.List;
@@ -37,7 +39,7 @@ public interface CodegenConvert { @@ -37,7 +39,7 @@ public interface CodegenConvert {
37 39
38 @Mappings({ 40 @Mappings({
39 @Mapping(source = "name", target = "columnName"), 41 @Mapping(source = "name", target = "columnName"),
40 - @Mapping(source = "type", target = "dataType"), 42 + @Mapping(source = "columnType", target = "dataType", qualifiedByName = "getType"),
41 @Mapping(source = "comment", target = "columnComment"), 43 @Mapping(source = "comment", target = "columnComment"),
42 @Mapping(source = "metaInfo.nullable", target = "nullable"), 44 @Mapping(source = "metaInfo.nullable", target = "nullable"),
43 @Mapping(source = "keyFlag", target = "primaryKey"), 45 @Mapping(source = "keyFlag", target = "primaryKey"),
@@ -47,6 +49,11 @@ public interface CodegenConvert { @@ -47,6 +49,11 @@ public interface CodegenConvert {
47 }) 49 })
48 CodegenColumnDO convert(TableField bean); 50 CodegenColumnDO convert(TableField bean);
49 51
  52 + @Named("getType")
  53 + default String getType(IColumnType jdbcType) {
  54 + return jdbcType.getType();
  55 + }
  56 +
50 // ========== CodegenTableDO 相关 ========== 57 // ========== CodegenTableDO 相关 ==========
51 58
52 // List<CodegenTableRespVO> convertList02(List<CodegenTableDO> list); 59 // List<CodegenTableRespVO> convertList02(List<CodegenTableDO> list);
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/codegen/CodegenColumnDO.java
@@ -6,6 +6,7 @@ import cn.iocoder.yudao.module.infra.enums.codegen.CodegenColumnListConditionEnu @@ -6,6 +6,7 @@ import cn.iocoder.yudao.module.infra.enums.codegen.CodegenColumnListConditionEnu
6 import com.baomidou.mybatisplus.annotation.KeySequence; 6 import com.baomidou.mybatisplus.annotation.KeySequence;
7 import com.baomidou.mybatisplus.annotation.TableId; 7 import com.baomidou.mybatisplus.annotation.TableId;
8 import com.baomidou.mybatisplus.annotation.TableName; 8 import com.baomidou.mybatisplus.annotation.TableName;
  9 +import com.baomidou.mybatisplus.generator.config.po.TableField;
9 import lombok.Data; 10 import lombok.Data;
10 import lombok.EqualsAndHashCode; 11 import lombok.EqualsAndHashCode;
11 import lombok.experimental.Accessors; 12 import lombok.experimental.Accessors;
@@ -42,6 +43,7 @@ public class CodegenColumnDO extends BaseDO { @@ -42,6 +43,7 @@ public class CodegenColumnDO extends BaseDO {
42 private String columnName; 43 private String columnName;
43 /** 44 /**
44 * 字段类型 45 * 字段类型
  46 + * 关联 {@link TableField#getColumnType()}}
45 */ 47 */
46 private String dataType; 48 private String dataType;
47 /** 49 /**
yudao-module-infra/yudao-module-infra-biz/src/test/java/cn/iocoder/yudao/module/infra/service/DefaultDatabaseQueryTest.java
1 package cn.iocoder.yudao.module.infra.service; 1 package cn.iocoder.yudao.module.infra.service;
2 2
3 import cn.hutool.core.util.StrUtil; 3 import cn.hutool.core.util.StrUtil;
4 -import com.baomidou.mybatisplus.generator.IDatabaseQuery.DefaultDatabaseQuery; 4 +import com.baomidou.mybatisplus.generator.query.DefaultQuery;
5 import com.baomidou.mybatisplus.generator.config.DataSourceConfig; 5 import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
6 import com.baomidou.mybatisplus.generator.config.builder.ConfigBuilder; 6 import com.baomidou.mybatisplus.generator.config.builder.ConfigBuilder;
7 import com.baomidou.mybatisplus.generator.config.po.TableInfo; 7 import com.baomidou.mybatisplus.generator.config.po.TableInfo;
@@ -19,7 +19,7 @@ public class DefaultDatabaseQueryTest { @@ -19,7 +19,7 @@ public class DefaultDatabaseQueryTest {
19 19
20 ConfigBuilder builder = new ConfigBuilder(null, dataSourceConfig, null, null, null, null); 20 ConfigBuilder builder = new ConfigBuilder(null, dataSourceConfig, null, null, null, null);
21 21
22 - DefaultDatabaseQuery query = new DefaultDatabaseQuery(builder); 22 + DefaultQuery query = new DefaultQuery(builder);
23 23
24 long time = System.currentTimeMillis(); 24 long time = System.currentTimeMillis();
25 List<TableInfo> tableInfos = query.queryTables(); 25 List<TableInfo> tableInfos = query.queryTables();
yudao-module-visualization/yudao-module-visualization-biz/src/main/java/cn/iocoder/yudao/module/visualization/framework/jmreport/config/JmReportConfiguration.java
1 package cn.iocoder.yudao.module.visualization.framework.jmreport.config; 1 package cn.iocoder.yudao.module.visualization.framework.jmreport.config;
2 2
  3 +import cn.iocoder.yudao.framework.security.config.SecurityProperties;
3 import cn.iocoder.yudao.module.system.api.oauth2.OAuth2TokenApi; 4 import cn.iocoder.yudao.module.system.api.oauth2.OAuth2TokenApi;
4 import cn.iocoder.yudao.module.visualization.framework.jmreport.core.service.JmReportTokenServiceImpl; 5 import cn.iocoder.yudao.module.visualization.framework.jmreport.core.service.JmReportTokenServiceImpl;
5 import org.jeecg.modules.jmreport.api.JmReportTokenServiceI; 6 import org.jeecg.modules.jmreport.api.JmReportTokenServiceI;
@@ -18,8 +19,8 @@ public class JmReportConfiguration { @@ -18,8 +19,8 @@ public class JmReportConfiguration {
18 19
19 @Bean 20 @Bean
20 @SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection") 21 @SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
21 - public JmReportTokenServiceI jmReportTokenService(OAuth2TokenApi oAuth2TokenApi) {  
22 - return new JmReportTokenServiceImpl(oAuth2TokenApi); 22 + public JmReportTokenServiceI jmReportTokenService(OAuth2TokenApi oAuth2TokenApi, SecurityProperties securityProperties) {
  23 + return new JmReportTokenServiceImpl(oAuth2TokenApi, securityProperties);
23 } 24 }
24 25
25 } 26 }
yudao-module-visualization/yudao-module-visualization-biz/src/main/java/cn/iocoder/yudao/module/visualization/framework/jmreport/core/service/JmReportTokenServiceImpl.java
1 package cn.iocoder.yudao.module.visualization.framework.jmreport.core.service; 1 package cn.iocoder.yudao.module.visualization.framework.jmreport.core.service;
2 2
  3 +import cn.hutool.core.util.ObjectUtil;
3 import cn.hutool.core.util.StrUtil; 4 import cn.hutool.core.util.StrUtil;
4 import cn.iocoder.yudao.framework.common.exception.ServiceException; 5 import cn.iocoder.yudao.framework.common.exception.ServiceException;
  6 +import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils;
  7 +import cn.iocoder.yudao.framework.security.config.SecurityProperties;
5 import cn.iocoder.yudao.framework.security.core.LoginUser; 8 import cn.iocoder.yudao.framework.security.core.LoginUser;
6 import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; 9 import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
7 import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder; 10 import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder;
@@ -10,6 +13,10 @@ import cn.iocoder.yudao.module.system.api.oauth2.OAuth2TokenApi; @@ -10,6 +13,10 @@ import cn.iocoder.yudao.module.system.api.oauth2.OAuth2TokenApi;
10 import cn.iocoder.yudao.module.system.api.oauth2.dto.OAuth2AccessTokenCheckRespDTO; 13 import cn.iocoder.yudao.module.system.api.oauth2.dto.OAuth2AccessTokenCheckRespDTO;
11 import lombok.RequiredArgsConstructor; 14 import lombok.RequiredArgsConstructor;
12 import org.jeecg.modules.jmreport.api.JmReportTokenServiceI; 15 import org.jeecg.modules.jmreport.api.JmReportTokenServiceI;
  16 +import org.springframework.http.HttpHeaders;
  17 +
  18 +import javax.servlet.http.HttpServletRequest;
  19 +import java.util.Objects;
13 20
14 /** 21 /**
15 * {@link JmReportTokenServiceI} 实现类,提供积木报表的 Token 校验、用户信息的查询等功能 22 * {@link JmReportTokenServiceI} 实现类,提供积木报表的 Token 校验、用户信息的查询等功能
@@ -19,8 +26,37 @@ import org.jeecg.modules.jmreport.api.JmReportTokenServiceI; @@ -19,8 +26,37 @@ import org.jeecg.modules.jmreport.api.JmReportTokenServiceI;
19 @RequiredArgsConstructor 26 @RequiredArgsConstructor
20 public class JmReportTokenServiceImpl implements JmReportTokenServiceI { 27 public class JmReportTokenServiceImpl implements JmReportTokenServiceI {
21 28
  29 + /**
  30 + * 积木 token head 头
  31 + */
  32 + private static final String JM_TOKEN_HEADER = "X-Access-Token";
  33 + /**
  34 + * auth 相关格式
  35 + */
  36 + private static final String AUTHORIZATION_FORMAT = SecurityFrameworkUtils.AUTHORIZATION_BEARER + " %s";
  37 +
22 private final OAuth2TokenApi oauth2TokenApi; 38 private final OAuth2TokenApi oauth2TokenApi;
23 39
  40 + private final SecurityProperties securityProperties;
  41 +
  42 + /**
  43 + * 自定义 API 数据集appian自定义 Header,解决 Token 传递。
  44 + * 参考 <a href="http://report.jeecg.com/2222224">api数据集token机制详解</a> 文档
  45 + *
  46 + * @return 新 head
  47 + */
  48 + @Override
  49 + public HttpHeaders customApiHeader() {
  50 + // 读取积木标标系统的 token
  51 + HttpServletRequest request = ServletUtils.getRequest();
  52 + String token = request.getHeader(JM_TOKEN_HEADER);
  53 +
  54 + // 设置到 yudao 系统的 token
  55 + HttpHeaders headers = new HttpHeaders();
  56 + headers.add(securityProperties.getTokenHeader(), String.format(AUTHORIZATION_FORMAT, token));
  57 + return headers;
  58 + }
  59 +
24 /** 60 /**
25 * 校验 Token 是否有效,即验证通过 61 * 校验 Token 是否有效,即验证通过
26 * 62 *
@@ -29,8 +65,40 @@ public class JmReportTokenServiceImpl implements JmReportTokenServiceI { @@ -29,8 +65,40 @@ public class JmReportTokenServiceImpl implements JmReportTokenServiceI {
29 */ 65 */
30 @Override 66 @Override
31 public Boolean verifyToken(String token) { 67 public Boolean verifyToken(String token) {
  68 + Long userId = SecurityFrameworkUtils.getLoginUserId();
  69 + if (!Objects.isNull(userId)) {
  70 + return true;
  71 + }
  72 + return buildLoginUserByToken(token) != null;
  73 + }
  74 +
  75 + /**
  76 + * 获得用户编号
  77 + * <p>
  78 + * 虽然方法名获得的是 username,实际对应到项目中是用户编号
  79 + *
  80 + * @param token JmReport 前端传递的 token
  81 + * @return 用户编号
  82 + */
  83 + @Override
  84 + public String getUsername(String token) {
  85 + Long userId = SecurityFrameworkUtils.getLoginUserId();
  86 + if (ObjectUtil.isNotNull(userId)) {
  87 + return String.valueOf(userId);
  88 + }
  89 + LoginUser user = buildLoginUserByToken(token);
  90 + return user == null ? null : String.valueOf(user.getId());
  91 + }
  92 +
  93 + /**
  94 + * 基于 token 构建登录用户
  95 + *
  96 + * @param token token
  97 + * @return 返回 token 对应的用户信息
  98 + */
  99 + private LoginUser buildLoginUserByToken(String token) {
32 if (StrUtil.isEmpty(token)) { 100 if (StrUtil.isEmpty(token)) {
33 - return false; 101 + return null;
34 } 102 }
35 // TODO 如下的实现不算特别优雅,主要咱是不想搞的太复杂,所以参考对应的 Filter 先实现了 103 // TODO 如下的实现不算特别优雅,主要咱是不想搞的太复杂,所以参考对应的 Filter 先实现了
36 104
@@ -41,7 +109,7 @@ public class JmReportTokenServiceImpl implements JmReportTokenServiceI { @@ -41,7 +109,7 @@ public class JmReportTokenServiceImpl implements JmReportTokenServiceI {
41 try { 109 try {
42 OAuth2AccessTokenCheckRespDTO accessToken = oauth2TokenApi.checkAccessToken(token); 110 OAuth2AccessTokenCheckRespDTO accessToken = oauth2TokenApi.checkAccessToken(token);
43 if (accessToken == null) { 111 if (accessToken == null) {
44 - return false; 112 + return null;
45 } 113 }
46 user = new LoginUser().setId(accessToken.getUserId()).setUserType(accessToken.getUserType()) 114 user = new LoginUser().setId(accessToken.getUserId()).setUserType(accessToken.getUserType())
47 .setTenantId(accessToken.getTenantId()).setScopes(accessToken.getScopes()); 115 .setTenantId(accessToken.getTenantId()).setScopes(accessToken.getScopes());
@@ -49,7 +117,7 @@ public class JmReportTokenServiceImpl implements JmReportTokenServiceI { @@ -49,7 +117,7 @@ public class JmReportTokenServiceImpl implements JmReportTokenServiceI {
49 // do nothing:如果报错,说明认证失败,则返回 false 即可 117 // do nothing:如果报错,说明认证失败,则返回 false 即可
50 } 118 }
51 if (user == null) { 119 if (user == null) {
52 - return false; 120 + return null;
53 } 121 }
54 SecurityFrameworkUtils.setLoginUser(user, WebFrameworkUtils.getRequest()); 122 SecurityFrameworkUtils.setLoginUser(user, WebFrameworkUtils.getRequest());
55 123
@@ -57,21 +125,7 @@ public class JmReportTokenServiceImpl implements JmReportTokenServiceI { @@ -57,21 +125,7 @@ public class JmReportTokenServiceImpl implements JmReportTokenServiceI {
57 // 目的:基于 LoginUser 获得到的租户编号,设置到 Tenant 上下文,避免查询数据库时的报错 125 // 目的:基于 LoginUser 获得到的租户编号,设置到 Tenant 上下文,避免查询数据库时的报错
58 TenantContextHolder.setIgnore(false); 126 TenantContextHolder.setIgnore(false);
59 TenantContextHolder.setTenantId(user.getTenantId()); 127 TenantContextHolder.setTenantId(user.getTenantId());
60 - return true;  
61 - }  
62 -  
63 - /**  
64 - * 获得用户编号  
65 - *  
66 - * 虽然方法名获得的是 username,实际对应到项目中是用户编号  
67 - *  
68 - * @param token JmReport 前端传递的 token  
69 - * @return 用户编号  
70 - */  
71 - @Override  
72 - public String getUsername(String token) {  
73 - Long userId = SecurityFrameworkUtils.getLoginUserId();  
74 - return userId != null ? String.valueOf(userId) : null; 128 + return user;
75 } 129 }
76 130
77 } 131 }
yudao-ui-admin-vue3/README.md
@@ -34,7 +34,7 @@ @@ -34,7 +34,7 @@
34 | [TypeScript](https://www.typescriptlang.org/docs/) | JavaScript 的超集 | 4.9.4 | 34 | [TypeScript](https://www.typescriptlang.org/docs/) | JavaScript 的超集 | 4.9.4 |
35 | [pinia](https://pinia.vuejs.org/) | Vue 存储库 替代 vuex5 | 2.0.28 | 35 | [pinia](https://pinia.vuejs.org/) | Vue 存储库 替代 vuex5 | 2.0.28 |
36 | [vueuse](https://vueuse.org/) | 常用工具集 | 9.10.0 | 36 | [vueuse](https://vueuse.org/) | 常用工具集 | 9.10.0 |
37 -| [vxe-table](https://vxetable.cn/) | vue 最强表单 | 4.3.7 | 37 +| [vxe-table](https://vxetable.cn/) | vue 最强表单 | 4.3.9 |
38 | [vue-i18n](https://kazupon.github.io/vue-i18n/zh/introduction.html/) | 国际化 | 9.2.2 | 38 | [vue-i18n](https://kazupon.github.io/vue-i18n/zh/introduction.html/) | 国际化 | 9.2.2 |
39 | [vue-router](https://router.vuejs.org/) | vue 路由 | 4.1.6 | 39 | [vue-router](https://router.vuejs.org/) | vue 路由 | 4.1.6 |
40 | [windicss](https://cn.windicss.org/) | 下一代工具优先的 CSS 框架 | 3.5.6 | 40 | [windicss](https://cn.windicss.org/) | 下一代工具优先的 CSS 框架 | 3.5.6 |
yudao-ui-admin-vue3/package.json
1 { 1 {
2 "name": "yudao-ui-admin-vue3", 2 "name": "yudao-ui-admin-vue3",
3 - "version": "1.6.6-snapshot.1901", 3 + "version": "1.6.6-snapshot.1911",
4 "description": "基于vue3、vite4、element-plus、typesScript", 4 "description": "基于vue3、vite4、element-plus、typesScript",
5 "author": "xingyu", 5 "author": "xingyu",
6 "private": false, 6 "private": false,
@@ -50,14 +50,14 @@ @@ -50,14 +50,14 @@
50 "vue-i18n": "9.2.2", 50 "vue-i18n": "9.2.2",
51 "vue-router": "^4.1.6", 51 "vue-router": "^4.1.6",
52 "vue-types": "^5.0.2", 52 "vue-types": "^5.0.2",
53 - "vxe-table": "^4.3.7", 53 + "vxe-table": "^4.3.9",
54 "web-storage-cache": "^1.1.1", 54 "web-storage-cache": "^1.1.1",
55 "xe-utils": "^3.5.7" 55 "xe-utils": "^3.5.7"
56 }, 56 },
57 "devDependencies": { 57 "devDependencies": {
58 - "@commitlint/cli": "^17.4.0", 58 + "@commitlint/cli": "^17.4.1",
59 "@commitlint/config-conventional": "^17.4.0", 59 "@commitlint/config-conventional": "^17.4.0",
60 - "@iconify/json": "^2.2.2", 60 + "@iconify/json": "^2.2.5",
61 "@intlify/unplugin-vue-i18n": "^0.8.1", 61 "@intlify/unplugin-vue-i18n": "^0.8.1",
62 "@purge-icons/generated": "^0.9.0", 62 "@purge-icons/generated": "^0.9.0",
63 "@types/intro.js": "^5.1.0", 63 "@types/intro.js": "^5.1.0",
@@ -66,8 +66,8 @@ @@ -66,8 +66,8 @@
66 "@types/nprogress": "^0.2.0", 66 "@types/nprogress": "^0.2.0",
67 "@types/qrcode": "^1.5.0", 67 "@types/qrcode": "^1.5.0",
68 "@types/qs": "^6.9.7", 68 "@types/qs": "^6.9.7",
69 - "@typescript-eslint/eslint-plugin": "^5.48.0",  
70 - "@typescript-eslint/parser": "^5.48.0", 69 + "@typescript-eslint/eslint-plugin": "^5.48.1",
  70 + "@typescript-eslint/parser": "^5.48.1",
71 "@vitejs/plugin-legacy": "^3.0.1", 71 "@vitejs/plugin-legacy": "^3.0.1",
72 "@vitejs/plugin-vue": "^4.0.0", 72 "@vitejs/plugin-vue": "^4.0.0",
73 "@vitejs/plugin-vue-jsx": "^3.0.0", 73 "@vitejs/plugin-vue-jsx": "^3.0.0",
@@ -75,14 +75,14 @@ @@ -75,14 +75,14 @@
75 "consola": "^2.15.3", 75 "consola": "^2.15.3",
76 "eslint": "^8.31.0", 76 "eslint": "^8.31.0",
77 "eslint-config-prettier": "^8.6.0", 77 "eslint-config-prettier": "^8.6.0",
78 - "eslint-define-config": "^1.13.0", 78 + "eslint-define-config": "^1.14.0",
79 "eslint-plugin-prettier": "^4.2.1", 79 "eslint-plugin-prettier": "^4.2.1",
80 "eslint-plugin-vue": "^9.8.0", 80 "eslint-plugin-vue": "^9.8.0",
81 "lint-staged": "^13.1.0", 81 "lint-staged": "^13.1.0",
82 - "postcss": "^8.4.20", 82 + "postcss": "^8.4.21",
83 "postcss-html": "^1.5.0", 83 "postcss-html": "^1.5.0",
84 "postcss-scss": "^4.0.6", 84 "postcss-scss": "^4.0.6",
85 - "prettier": "^2.8.1", 85 + "prettier": "^2.8.2",
86 "rimraf": "^3.0.2", 86 "rimraf": "^3.0.2",
87 "rollup": "^3.9.1", 87 "rollup": "^3.9.1",
88 "sass": "^1.57.1", 88 "sass": "^1.57.1",
@@ -91,7 +91,7 @@ @@ -91,7 +91,7 @@
91 "stylelint-config-prettier": "^9.0.4", 91 "stylelint-config-prettier": "^9.0.4",
92 "stylelint-config-recommended": "^9.0.0", 92 "stylelint-config-recommended": "^9.0.0",
93 "stylelint-config-standard": "^29.0.0", 93 "stylelint-config-standard": "^29.0.0",
94 - "stylelint-order": "^5.0.0", 94 + "stylelint-order": "^6.0.1",
95 "terser": "^5.16.1", 95 "terser": "^5.16.1",
96 "typescript": "4.9.4", 96 "typescript": "4.9.4",
97 "vite": "4.0.4", 97 "vite": "4.0.4",
@@ -104,7 +104,7 @@ @@ -104,7 +104,7 @@
104 "vite-plugin-svg-icons": "^2.0.1", 104 "vite-plugin-svg-icons": "^2.0.1",
105 "vite-plugin-vue-setup-extend": "^0.4.0", 105 "vite-plugin-vue-setup-extend": "^0.4.0",
106 "vite-plugin-windicss": "^1.8.10", 106 "vite-plugin-windicss": "^1.8.10",
107 - "vue-tsc": "^1.0.22", 107 + "vue-tsc": "^1.0.24",
108 "windicss": "^3.5.6" 108 "windicss": "^3.5.6"
109 }, 109 },
110 "engines": { 110 "engines": {
yudao-ui-admin-vue3/pnpm-lock.yaml
1 lockfileVersion: 5.4 1 lockfileVersion: 5.4
2 2
3 specifiers: 3 specifiers:
4 - '@commitlint/cli': ^17.4.0 4 + '@commitlint/cli': ^17.4.1
5 '@commitlint/config-conventional': ^17.4.0 5 '@commitlint/config-conventional': ^17.4.0
6 '@iconify/iconify': ^3.0.1 6 '@iconify/iconify': ^3.0.1
7 - '@iconify/json': ^2.2.2 7 + '@iconify/json': ^2.2.5
8 '@intlify/unplugin-vue-i18n': ^0.8.1 8 '@intlify/unplugin-vue-i18n': ^0.8.1
9 '@purge-icons/generated': ^0.9.0 9 '@purge-icons/generated': ^0.9.0
10 '@types/intro.js': ^5.1.0 10 '@types/intro.js': ^5.1.0
@@ -13,8 +13,8 @@ specifiers: @@ -13,8 +13,8 @@ specifiers:
13 '@types/nprogress': ^0.2.0 13 '@types/nprogress': ^0.2.0
14 '@types/qrcode': ^1.5.0 14 '@types/qrcode': ^1.5.0
15 '@types/qs': ^6.9.7 15 '@types/qs': ^6.9.7
16 - '@typescript-eslint/eslint-plugin': ^5.48.0  
17 - '@typescript-eslint/parser': ^5.48.0 16 + '@typescript-eslint/eslint-plugin': ^5.48.1
  17 + '@typescript-eslint/parser': ^5.48.1
18 '@vitejs/plugin-legacy': ^3.0.1 18 '@vitejs/plugin-legacy': ^3.0.1
19 '@vitejs/plugin-vue': ^4.0.0 19 '@vitejs/plugin-vue': ^4.0.0
20 '@vitejs/plugin-vue-jsx': ^3.0.0 20 '@vitejs/plugin-vue-jsx': ^3.0.0
@@ -34,7 +34,7 @@ specifiers: @@ -34,7 +34,7 @@ specifiers:
34 element-plus: 2.2.28 34 element-plus: 2.2.28
35 eslint: ^8.31.0 35 eslint: ^8.31.0
36 eslint-config-prettier: ^8.6.0 36 eslint-config-prettier: ^8.6.0
37 - eslint-define-config: ^1.13.0 37 + eslint-define-config: ^1.14.0
38 eslint-plugin-prettier: ^4.2.1 38 eslint-plugin-prettier: ^4.2.1
39 eslint-plugin-vue: ^9.8.0 39 eslint-plugin-vue: ^9.8.0
40 intro.js: ^6.0.0 40 intro.js: ^6.0.0
@@ -44,10 +44,10 @@ specifiers: @@ -44,10 +44,10 @@ specifiers:
44 mitt: ^3.0.0 44 mitt: ^3.0.0
45 nprogress: ^0.2.0 45 nprogress: ^0.2.0
46 pinia: ^2.0.28 46 pinia: ^2.0.28
47 - postcss: ^8.4.20 47 + postcss: ^8.4.21
48 postcss-html: ^1.5.0 48 postcss-html: ^1.5.0
49 postcss-scss: ^4.0.6 49 postcss-scss: ^4.0.6
50 - prettier: ^2.8.1 50 + prettier: ^2.8.2
51 qrcode: ^1.5.1 51 qrcode: ^1.5.1
52 qs: ^6.11.0 52 qs: ^6.11.0
53 rimraf: ^3.0.2 53 rimraf: ^3.0.2
@@ -58,7 +58,7 @@ specifiers: @@ -58,7 +58,7 @@ specifiers:
58 stylelint-config-prettier: ^9.0.4 58 stylelint-config-prettier: ^9.0.4
59 stylelint-config-recommended: ^9.0.0 59 stylelint-config-recommended: ^9.0.0
60 stylelint-config-standard: ^29.0.0 60 stylelint-config-standard: ^29.0.0
61 - stylelint-order: ^5.0.0 61 + stylelint-order: ^6.0.1
62 terser: ^5.16.1 62 terser: ^5.16.1
63 typescript: 4.9.4 63 typescript: 4.9.4
64 url: ^0.11.0 64 url: ^0.11.0
@@ -75,9 +75,9 @@ specifiers: @@ -75,9 +75,9 @@ specifiers:
75 vue: 3.2.45 75 vue: 3.2.45
76 vue-i18n: 9.2.2 76 vue-i18n: 9.2.2
77 vue-router: ^4.1.6 77 vue-router: ^4.1.6
78 - vue-tsc: ^1.0.22 78 + vue-tsc: ^1.0.24
79 vue-types: ^5.0.2 79 vue-types: ^5.0.2
80 - vxe-table: ^4.3.7 80 + vxe-table: ^4.3.9
81 web-storage-cache: ^1.1.1 81 web-storage-cache: ^1.1.1
82 windicss: ^3.5.6 82 windicss: ^3.5.6
83 xe-utils: ^3.5.7 83 xe-utils: ^3.5.7
@@ -109,14 +109,14 @@ dependencies: @@ -109,14 +109,14 @@ dependencies:
109 vue-i18n: 9.2.2_vue@3.2.45 109 vue-i18n: 9.2.2_vue@3.2.45
110 vue-router: 4.1.6_vue@3.2.45 110 vue-router: 4.1.6_vue@3.2.45
111 vue-types: 5.0.2_vue@3.2.45 111 vue-types: 5.0.2_vue@3.2.45
112 - vxe-table: 4.3.7_vue@3.2.45+xe-utils@3.5.7 112 + vxe-table: 4.3.9_vue@3.2.45+xe-utils@3.5.7
113 web-storage-cache: 1.1.1 113 web-storage-cache: 1.1.1
114 xe-utils: 3.5.7 114 xe-utils: 3.5.7
115 115
116 devDependencies: 116 devDependencies:
117 - '@commitlint/cli': 17.4.0_@types+node@18.11.18 117 + '@commitlint/cli': 17.4.1
118 '@commitlint/config-conventional': 17.4.0 118 '@commitlint/config-conventional': 17.4.0
119 - '@iconify/json': 2.2.2 119 + '@iconify/json': 2.2.5
120 '@intlify/unplugin-vue-i18n': 0.8.1_vue-i18n@9.2.2 120 '@intlify/unplugin-vue-i18n': 0.8.1_vue-i18n@9.2.2
121 '@purge-icons/generated': 0.9.0 121 '@purge-icons/generated': 0.9.0
122 '@types/intro.js': 5.1.0 122 '@types/intro.js': 5.1.0
@@ -125,23 +125,23 @@ devDependencies: @@ -125,23 +125,23 @@ devDependencies:
125 '@types/nprogress': 0.2.0 125 '@types/nprogress': 0.2.0
126 '@types/qrcode': 1.5.0 126 '@types/qrcode': 1.5.0
127 '@types/qs': 6.9.7 127 '@types/qs': 6.9.7
128 - '@typescript-eslint/eslint-plugin': 5.48.0_k73wpmdolxikpyqun3p36akaaq  
129 - '@typescript-eslint/parser': 5.48.0_iukboom6ndih5an6iafl45j2fe 128 + '@typescript-eslint/eslint-plugin': 5.48.1_3jon24igvnqaqexgwtxk6nkpse
  129 + '@typescript-eslint/parser': 5.48.1_iukboom6ndih5an6iafl45j2fe
130 '@vitejs/plugin-legacy': 3.0.1_terser@5.16.1+vite@4.0.4 130 '@vitejs/plugin-legacy': 3.0.1_terser@5.16.1+vite@4.0.4
131 '@vitejs/plugin-vue': 4.0.0_vite@4.0.4+vue@3.2.45 131 '@vitejs/plugin-vue': 4.0.0_vite@4.0.4+vue@3.2.45
132 '@vitejs/plugin-vue-jsx': 3.0.0_vite@4.0.4+vue@3.2.45 132 '@vitejs/plugin-vue-jsx': 3.0.0_vite@4.0.4+vue@3.2.45
133 - autoprefixer: 10.4.13_postcss@8.4.20 133 + autoprefixer: 10.4.13_postcss@8.4.21
134 consola: 2.15.3 134 consola: 2.15.3
135 eslint: 8.31.0 135 eslint: 8.31.0
136 eslint-config-prettier: 8.6.0_eslint@8.31.0 136 eslint-config-prettier: 8.6.0_eslint@8.31.0
137 - eslint-define-config: 1.13.0  
138 - eslint-plugin-prettier: 4.2.1_32m5uc2milwdw3tnkcq5del26y 137 + eslint-define-config: 1.14.0
  138 + eslint-plugin-prettier: 4.2.1_iu5s7nk6dw7o3tajefwfiqfmge
139 eslint-plugin-vue: 9.8.0_eslint@8.31.0 139 eslint-plugin-vue: 9.8.0_eslint@8.31.0
140 lint-staged: 13.1.0 140 lint-staged: 13.1.0
141 - postcss: 8.4.20 141 + postcss: 8.4.21
142 postcss-html: 1.5.0 142 postcss-html: 1.5.0
143 - postcss-scss: 4.0.6_postcss@8.4.20  
144 - prettier: 2.8.1 143 + postcss-scss: 4.0.6_postcss@8.4.21
  144 + prettier: 2.8.2
145 rimraf: 3.0.2 145 rimraf: 3.0.2
146 rollup: 3.9.1 146 rollup: 3.9.1
147 sass: 1.57.1 147 sass: 1.57.1
@@ -150,7 +150,7 @@ devDependencies: @@ -150,7 +150,7 @@ devDependencies:
150 stylelint-config-prettier: 9.0.4_stylelint@14.16.1 150 stylelint-config-prettier: 9.0.4_stylelint@14.16.1
151 stylelint-config-recommended: 9.0.0_stylelint@14.16.1 151 stylelint-config-recommended: 9.0.0_stylelint@14.16.1
152 stylelint-config-standard: 29.0.0_stylelint@14.16.1 152 stylelint-config-standard: 29.0.0_stylelint@14.16.1
153 - stylelint-order: 5.0.0_stylelint@14.16.1 153 + stylelint-order: 6.0.1_stylelint@14.16.1
154 terser: 5.16.1 154 terser: 5.16.1
155 typescript: 4.9.4 155 typescript: 4.9.4
156 vite: 4.0.4_zxbrnrc4iyldik6mikh3pswz4i 156 vite: 4.0.4_zxbrnrc4iyldik6mikh3pswz4i
@@ -163,7 +163,7 @@ devDependencies: @@ -163,7 +163,7 @@ devDependencies:
163 vite-plugin-svg-icons: 2.0.1_vite@4.0.4 163 vite-plugin-svg-icons: 2.0.1_vite@4.0.4
164 vite-plugin-vue-setup-extend: 0.4.0_vite@4.0.4 164 vite-plugin-vue-setup-extend: 0.4.0_vite@4.0.4
165 vite-plugin-windicss: 1.8.10_vite@4.0.4 165 vite-plugin-windicss: 1.8.10_vite@4.0.4
166 - vue-tsc: 1.0.22_typescript@4.9.4 166 + vue-tsc: 1.0.24_typescript@4.9.4
167 windicss: 3.5.6 167 windicss: 3.5.6
168 168
169 packages: 169 packages:
@@ -506,14 +506,14 @@ packages: @@ -506,14 +506,14 @@ packages:
506 '@babel/helper-validator-identifier': 7.19.1 506 '@babel/helper-validator-identifier': 7.19.1
507 to-fast-properties: 2.0.0 507 to-fast-properties: 2.0.0
508 508
509 - /@commitlint/cli/17.4.0_@types+node@18.11.18:  
510 - resolution: {integrity: sha512-SEY4sYe8yVlgxPP7X0wJb96DBAGBPsCsy6QbqJt/UECbIAjDeDV5xXBV4jnS7T/qMC10sk6Ub9kDhEX0VWvblw==} 509 + /@commitlint/cli/17.4.1:
  510 + resolution: {integrity: sha512-W8OJwz+izY+fVwyUt1HveCDmABMZNRVZHSVPw/Bh9Y62tp11SmmQaycgbsYLMiMy7JGn4mAJqEGlSHS9Uti9ZQ==}
511 engines: {node: '>=v14'} 511 engines: {node: '>=v14'}
512 hasBin: true 512 hasBin: true
513 dependencies: 513 dependencies:
514 '@commitlint/format': 17.4.0 514 '@commitlint/format': 17.4.0
515 '@commitlint/lint': 17.4.0 515 '@commitlint/lint': 17.4.0
516 - '@commitlint/load': 17.4.0_@types+node@18.11.18 516 + '@commitlint/load': 17.4.1
517 '@commitlint/read': 17.4.0 517 '@commitlint/read': 17.4.0
518 '@commitlint/types': 17.4.0 518 '@commitlint/types': 17.4.0
519 execa: 5.1.1 519 execa: 5.1.1
@@ -524,7 +524,6 @@ packages: @@ -524,7 +524,6 @@ packages:
524 transitivePeerDependencies: 524 transitivePeerDependencies:
525 - '@swc/core' 525 - '@swc/core'
526 - '@swc/wasm' 526 - '@swc/wasm'
527 - - '@types/node'  
528 dev: true 527 dev: true
529 528
530 /@commitlint/config-conventional/17.4.0: 529 /@commitlint/config-conventional/17.4.0:
@@ -585,14 +584,15 @@ packages: @@ -585,14 +584,15 @@ packages:
585 '@commitlint/types': 17.4.0 584 '@commitlint/types': 17.4.0
586 dev: true 585 dev: true
587 586
588 - /@commitlint/load/17.4.0_@types+node@18.11.18:  
589 - resolution: {integrity: sha512-wDKNvAJqukqZqKmhRlf3KNo/12QGo1AQcd80EbV01SxtGvyHOsJ/g+/IbrZpopZv8rvzmEVktcpfDYH6ITepFA==} 587 + /@commitlint/load/17.4.1:
  588 + resolution: {integrity: sha512-6A7/LhIaQpL4ieciIDcVvK2d5z/UI1GBrtDaHm6sQSCL0265clB2/F7XKQNTJHXv9yG4LByT2r+QCpM4GugIfw==}
590 engines: {node: '>=v14'} 589 engines: {node: '>=v14'}
591 dependencies: 590 dependencies:
592 '@commitlint/config-validator': 17.4.0 591 '@commitlint/config-validator': 17.4.0
593 '@commitlint/execute-rule': 17.4.0 592 '@commitlint/execute-rule': 17.4.0
594 '@commitlint/resolve-extends': 17.4.0 593 '@commitlint/resolve-extends': 17.4.0
595 '@commitlint/types': 17.4.0 594 '@commitlint/types': 17.4.0
  595 + '@types/node': 18.11.18
596 chalk: 4.1.2 596 chalk: 4.1.2
597 cosmiconfig: 8.0.0 597 cosmiconfig: 8.0.0
598 cosmiconfig-typescript-loader: 4.2.0_bxtyj3et3xbsdyxhh3oblnfbj4 598 cosmiconfig-typescript-loader: 4.2.0_bxtyj3et3xbsdyxhh3oblnfbj4
@@ -605,7 +605,6 @@ packages: @@ -605,7 +605,6 @@ packages:
605 transitivePeerDependencies: 605 transitivePeerDependencies:
606 - '@swc/core' 606 - '@swc/core'
607 - '@swc/wasm' 607 - '@swc/wasm'
608 - - '@types/node'  
609 dev: true 608 dev: true
610 609
611 /@commitlint/message/17.4.0: 610 /@commitlint/message/17.4.0:
@@ -682,14 +681,14 @@ packages: @@ -682,14 +681,14 @@ packages:
682 '@jridgewell/trace-mapping': 0.3.9 681 '@jridgewell/trace-mapping': 0.3.9
683 dev: true 682 dev: true
684 683
685 - /@csstools/selector-specificity/2.0.2_2xshye3abirqjlplmebvmaxyna: 684 + /@csstools/selector-specificity/2.0.2_wajs5nedgkikc5pcuwett7legi:
686 resolution: {integrity: sha512-IkpVW/ehM1hWKln4fCA3NzJU8KwD+kIOvPZA4cqxoJHtE21CCzjyp+Kxbu0i5I4tBNOlXPL9mjwnWlL0VEG4Fg==} 685 resolution: {integrity: sha512-IkpVW/ehM1hWKln4fCA3NzJU8KwD+kIOvPZA4cqxoJHtE21CCzjyp+Kxbu0i5I4tBNOlXPL9mjwnWlL0VEG4Fg==}
687 engines: {node: ^12 || ^14 || >=16} 686 engines: {node: ^12 || ^14 || >=16}
688 peerDependencies: 687 peerDependencies:
689 postcss: ^8.2 688 postcss: ^8.2
690 postcss-selector-parser: ^6.0.10 689 postcss-selector-parser: ^6.0.10
691 dependencies: 690 dependencies:
692 - postcss: 8.4.20 691 + postcss: 8.4.21
693 postcss-selector-parser: 6.0.11 692 postcss-selector-parser: 6.0.11
694 dev: true 693 dev: true
695 694
@@ -964,8 +963,8 @@ packages: @@ -964,8 +963,8 @@ packages:
964 dependencies: 963 dependencies:
965 '@iconify/types': 2.0.0 964 '@iconify/types': 2.0.0
966 965
967 - /@iconify/json/2.2.2:  
968 - resolution: {integrity: sha512-G9HVJz3uvQGNEirk9oI7xYnWb7ygEfTUZ+PVp81qgNp8bu5UOtXaxjTGw78NyNAC2OlryH5tSEp95Dqbt4LLQQ==} 966 + /@iconify/json/2.2.5:
  967 + resolution: {integrity: sha512-AIbJTRF9HJz7FJ8t7058huwDXHaFEY4a4f6uuPtctEQ8/I3ybrX66iZMgoLD1kLaamU4tzZPlZ6tSpA3pM8LZg==}
969 dependencies: 968 dependencies:
970 '@iconify/types': 2.0.0 969 '@iconify/types': 2.0.0
971 pathe: 1.0.0 970 pathe: 1.0.0
@@ -986,8 +985,8 @@ packages: @@ -986,8 +985,8 @@ packages:
986 vue-i18n: 985 vue-i18n:
987 optional: true 986 optional: true
988 dependencies: 987 dependencies:
989 - '@intlify/message-compiler': 9.3.0-beta.12  
990 - '@intlify/shared': 9.3.0-beta.12 988 + '@intlify/message-compiler': 9.3.0-beta.14
  989 + '@intlify/shared': 9.3.0-beta.14
991 jsonc-eslint-parser: 1.4.1 990 jsonc-eslint-parser: 1.4.1
992 source-map: 0.6.1 991 source-map: 0.6.1
993 vue-i18n: 9.2.2_vue@3.2.45 992 vue-i18n: 9.2.2_vue@3.2.45
@@ -1016,11 +1015,11 @@ packages: @@ -1016,11 +1015,11 @@ packages:
1016 '@intlify/shared': 9.2.2 1015 '@intlify/shared': 9.2.2
1017 source-map: 0.6.1 1016 source-map: 0.6.1
1018 1017
1019 - /@intlify/message-compiler/9.3.0-beta.12:  
1020 - resolution: {integrity: sha512-A8/s7pb3v8nf6HG77qFPJntxgQKI9GXxGnkn7aO+b03/X/GkF/4WceDSAIk3i+yLeIgszeBn9GZ23tSg4sTEHA==} 1018 + /@intlify/message-compiler/9.3.0-beta.14:
  1019 + resolution: {integrity: sha512-PlZ3pl+YYuql54Nq+26wv6ohIa8Ig6ALrvQI+f2zZKUtkupb49M4wyVN3bDQbFlgYVE7/u3n19BJSY8lEuX5Eg==}
1021 engines: {node: '>= 14'} 1020 engines: {node: '>= 14'}
1022 dependencies: 1021 dependencies:
1023 - '@intlify/shared': 9.3.0-beta.11 1022 + '@intlify/shared': 9.3.0-beta.14
1024 source-map: 0.6.1 1023 source-map: 0.6.1
1025 dev: true 1024 dev: true
1026 1025
@@ -1028,13 +1027,8 @@ packages: @@ -1028,13 +1027,8 @@ packages:
1028 resolution: {integrity: sha512-wRwTpsslgZS5HNyM7uDQYZtxnbI12aGiBZURX3BTR9RFIKKRWpllTsgzHWvj3HKm3Y2Sh5LPC1r0PDCKEhVn9Q==} 1027 resolution: {integrity: sha512-wRwTpsslgZS5HNyM7uDQYZtxnbI12aGiBZURX3BTR9RFIKKRWpllTsgzHWvj3HKm3Y2Sh5LPC1r0PDCKEhVn9Q==}
1029 engines: {node: '>= 14'} 1028 engines: {node: '>= 14'}
1030 1029
1031 - /@intlify/shared/9.3.0-beta.11:  
1032 - resolution: {integrity: sha512-CtbotesxTRiC3bRyXyv1NG39fkqJ790f8z8xFaeIXSZpOdiyxoh5BIyypCzSFQZDGLwz0Q9gyWbW1XpxQJm68Q==}  
1033 - engines: {node: '>= 14'}  
1034 - dev: true  
1035 -  
1036 - /@intlify/shared/9.3.0-beta.12:  
1037 - resolution: {integrity: sha512-WsmaS54sA8xuwezPKpa/OMoaX1v2VF2fCgAmYS6prDr2ir0CkUFWPm9A8ilmxzv4nkS61/v8+vf4lGGkn5uBdA==} 1030 + /@intlify/shared/9.3.0-beta.14:
  1031 + resolution: {integrity: sha512-mJ/rFan+4uVsBAQSCAJnpQaPvSjQ49mJMNmGelTUbTDAmgf0oexYxwqtKOlFFyY3hmQ8lUDYaGQKuYrFgRuHnA==}
1038 engines: {node: '>= 14'} 1032 engines: {node: '>= 14'}
1039 dev: true 1033 dev: true
1040 1034
@@ -1054,7 +1048,7 @@ packages: @@ -1054,7 +1048,7 @@ packages:
1054 optional: true 1048 optional: true
1055 dependencies: 1049 dependencies:
1056 '@intlify/bundle-utils': 3.4.0_vue-i18n@9.2.2 1050 '@intlify/bundle-utils': 3.4.0_vue-i18n@9.2.2
1057 - '@intlify/shared': 9.3.0-beta.12 1051 + '@intlify/shared': 9.3.0-beta.14
1058 '@rollup/pluginutils': 4.2.1 1052 '@rollup/pluginutils': 4.2.1
1059 '@vue/compiler-sfc': 3.2.45 1053 '@vue/compiler-sfc': 3.2.45
1060 debug: 4.3.4 1054 debug: 4.3.4
@@ -1285,8 +1279,8 @@ packages: @@ -1285,8 +1279,8 @@ packages:
1285 resolution: {integrity: sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==} 1279 resolution: {integrity: sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==}
1286 dev: false 1280 dev: false
1287 1281
1288 - /@typescript-eslint/eslint-plugin/5.48.0_k73wpmdolxikpyqun3p36akaaq:  
1289 - resolution: {integrity: sha512-SVLafp0NXpoJY7ut6VFVUU9I+YeFsDzeQwtK0WZ+xbRN3mtxJ08je+6Oi2N89qDn087COdO0u3blKZNv9VetRQ==} 1282 + /@typescript-eslint/eslint-plugin/5.48.1_3jon24igvnqaqexgwtxk6nkpse:
  1283 + resolution: {integrity: sha512-9nY5K1Rp2ppmpb9s9S2aBiF3xo5uExCehMDmYmmFqqyxgenbHJ3qbarcLt4ITgaD6r/2ypdlcFRdcuVPnks+fQ==}
1290 engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1284 engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
1291 peerDependencies: 1285 peerDependencies:
1292 '@typescript-eslint/parser': ^5.0.0 1286 '@typescript-eslint/parser': ^5.0.0
@@ -1296,10 +1290,10 @@ packages: @@ -1296,10 +1290,10 @@ packages:
1296 typescript: 1290 typescript:
1297 optional: true 1291 optional: true
1298 dependencies: 1292 dependencies:
1299 - '@typescript-eslint/parser': 5.48.0_iukboom6ndih5an6iafl45j2fe  
1300 - '@typescript-eslint/scope-manager': 5.48.0  
1301 - '@typescript-eslint/type-utils': 5.48.0_iukboom6ndih5an6iafl45j2fe  
1302 - '@typescript-eslint/utils': 5.48.0_iukboom6ndih5an6iafl45j2fe 1293 + '@typescript-eslint/parser': 5.48.1_iukboom6ndih5an6iafl45j2fe
  1294 + '@typescript-eslint/scope-manager': 5.48.1
  1295 + '@typescript-eslint/type-utils': 5.48.1_iukboom6ndih5an6iafl45j2fe
  1296 + '@typescript-eslint/utils': 5.48.1_iukboom6ndih5an6iafl45j2fe
1303 debug: 4.3.4 1297 debug: 4.3.4
1304 eslint: 8.31.0 1298 eslint: 8.31.0
1305 ignore: 5.2.1 1299 ignore: 5.2.1
@@ -1312,8 +1306,8 @@ packages: @@ -1312,8 +1306,8 @@ packages:
1312 - supports-color 1306 - supports-color
1313 dev: true 1307 dev: true
1314 1308
1315 - /@typescript-eslint/parser/5.48.0_iukboom6ndih5an6iafl45j2fe:  
1316 - resolution: {integrity: sha512-1mxNA8qfgxX8kBvRDIHEzrRGrKHQfQlbW6iHyfHYS0Q4X1af+S6mkLNtgCOsGVl8+/LUPrqdHMssAemkrQ01qg==} 1309 + /@typescript-eslint/parser/5.48.1_iukboom6ndih5an6iafl45j2fe:
  1310 + resolution: {integrity: sha512-4yg+FJR/V1M9Xoq56SF9Iygqm+r5LMXvheo6DQ7/yUWynQ4YfCRnsKuRgqH4EQ5Ya76rVwlEpw4Xu+TgWQUcdA==}
1317 engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1311 engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
1318 peerDependencies: 1312 peerDependencies:
1319 eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 1313 eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
@@ -1322,9 +1316,9 @@ packages: @@ -1322,9 +1316,9 @@ packages:
1322 typescript: 1316 typescript:
1323 optional: true 1317 optional: true
1324 dependencies: 1318 dependencies:
1325 - '@typescript-eslint/scope-manager': 5.48.0  
1326 - '@typescript-eslint/types': 5.48.0  
1327 - '@typescript-eslint/typescript-estree': 5.48.0_typescript@4.9.4 1319 + '@typescript-eslint/scope-manager': 5.48.1
  1320 + '@typescript-eslint/types': 5.48.1
  1321 + '@typescript-eslint/typescript-estree': 5.48.1_typescript@4.9.4
1328 debug: 4.3.4 1322 debug: 4.3.4
1329 eslint: 8.31.0 1323 eslint: 8.31.0
1330 typescript: 4.9.4 1324 typescript: 4.9.4
@@ -1332,16 +1326,16 @@ packages: @@ -1332,16 +1326,16 @@ packages:
1332 - supports-color 1326 - supports-color
1333 dev: true 1327 dev: true
1334 1328
1335 - /@typescript-eslint/scope-manager/5.48.0:  
1336 - resolution: {integrity: sha512-0AA4LviDtVtZqlyUQnZMVHydDATpD9SAX/RC5qh6cBd3xmyWvmXYF+WT1oOmxkeMnWDlUVTwdODeucUnjz3gow==} 1329 + /@typescript-eslint/scope-manager/5.48.1:
  1330 + resolution: {integrity: sha512-S035ueRrbxRMKvSTv9vJKIWgr86BD8s3RqoRZmsSh/s8HhIs90g6UlK8ZabUSjUZQkhVxt7nmZ63VJ9dcZhtDQ==}
1337 engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1331 engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
1338 dependencies: 1332 dependencies:
1339 - '@typescript-eslint/types': 5.48.0  
1340 - '@typescript-eslint/visitor-keys': 5.48.0 1333 + '@typescript-eslint/types': 5.48.1
  1334 + '@typescript-eslint/visitor-keys': 5.48.1
1341 dev: true 1335 dev: true
1342 1336
1343 - /@typescript-eslint/type-utils/5.48.0_iukboom6ndih5an6iafl45j2fe:  
1344 - resolution: {integrity: sha512-vbtPO5sJyFjtHkGlGK4Sthmta0Bbls4Onv0bEqOGm7hP9h8UpRsHJwsrCiWtCUndTRNQO/qe6Ijz9rnT/DB+7g==} 1337 + /@typescript-eslint/type-utils/5.48.1_iukboom6ndih5an6iafl45j2fe:
  1338 + resolution: {integrity: sha512-Hyr8HU8Alcuva1ppmqSYtM/Gp0q4JOp1F+/JH5D1IZm/bUBrV0edoewQZiEc1r6I8L4JL21broddxK8HAcZiqQ==}
1345 engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1339 engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
1346 peerDependencies: 1340 peerDependencies:
1347 eslint: '*' 1341 eslint: '*'
@@ -1350,8 +1344,8 @@ packages: @@ -1350,8 +1344,8 @@ packages:
1350 typescript: 1344 typescript:
1351 optional: true 1345 optional: true
1352 dependencies: 1346 dependencies:
1353 - '@typescript-eslint/typescript-estree': 5.48.0_typescript@4.9.4  
1354 - '@typescript-eslint/utils': 5.48.0_iukboom6ndih5an6iafl45j2fe 1347 + '@typescript-eslint/typescript-estree': 5.48.1_typescript@4.9.4
  1348 + '@typescript-eslint/utils': 5.48.1_iukboom6ndih5an6iafl45j2fe
1355 debug: 4.3.4 1349 debug: 4.3.4
1356 eslint: 8.31.0 1350 eslint: 8.31.0
1357 tsutils: 3.21.0_typescript@4.9.4 1351 tsutils: 3.21.0_typescript@4.9.4
@@ -1360,13 +1354,13 @@ packages: @@ -1360,13 +1354,13 @@ packages:
1360 - supports-color 1354 - supports-color
1361 dev: true 1355 dev: true
1362 1356
1363 - /@typescript-eslint/types/5.48.0:  
1364 - resolution: {integrity: sha512-UTe67B0Ypius0fnEE518NB2N8gGutIlTojeTg4nt0GQvikReVkurqxd2LvYa9q9M5MQ6rtpNyWTBxdscw40Xhw==} 1357 + /@typescript-eslint/types/5.48.1:
  1358 + resolution: {integrity: sha512-xHyDLU6MSuEEdIlzrrAerCGS3T7AA/L8Hggd0RCYBi0w3JMvGYxlLlXHeg50JI9Tfg5MrtsfuNxbS/3zF1/ATg==}
1365 engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1359 engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
1366 dev: true 1360 dev: true
1367 1361
1368 - /@typescript-eslint/typescript-estree/5.48.0_typescript@4.9.4:  
1369 - resolution: {integrity: sha512-7pjd94vvIjI1zTz6aq/5wwE/YrfIyEPLtGJmRfyNR9NYIW+rOvzzUv3Cmq2hRKpvt6e9vpvPUQ7puzX7VSmsEw==} 1362 + /@typescript-eslint/typescript-estree/5.48.1_typescript@4.9.4:
  1363 + resolution: {integrity: sha512-Hut+Osk5FYr+sgFh8J/FHjqX6HFcDzTlWLrFqGoK5kVUN3VBHF/QzZmAsIXCQ8T/W9nQNBTqalxi1P3LSqWnRA==}
1370 engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1364 engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
1371 peerDependencies: 1365 peerDependencies:
1372 typescript: '*' 1366 typescript: '*'
@@ -1374,8 +1368,8 @@ packages: @@ -1374,8 +1368,8 @@ packages:
1374 typescript: 1368 typescript:
1375 optional: true 1369 optional: true
1376 dependencies: 1370 dependencies:
1377 - '@typescript-eslint/types': 5.48.0  
1378 - '@typescript-eslint/visitor-keys': 5.48.0 1371 + '@typescript-eslint/types': 5.48.1
  1372 + '@typescript-eslint/visitor-keys': 5.48.1
1379 debug: 4.3.4 1373 debug: 4.3.4
1380 globby: 11.1.0 1374 globby: 11.1.0
1381 is-glob: 4.0.3 1375 is-glob: 4.0.3
@@ -1386,17 +1380,17 @@ packages: @@ -1386,17 +1380,17 @@ packages:
1386 - supports-color 1380 - supports-color
1387 dev: true 1381 dev: true
1388 1382
1389 - /@typescript-eslint/utils/5.48.0_iukboom6ndih5an6iafl45j2fe:  
1390 - resolution: {integrity: sha512-x2jrMcPaMfsHRRIkL+x96++xdzvrdBCnYRd5QiW5Wgo1OB4kDYPbC1XjWP/TNqlfK93K/lUL92erq5zPLgFScQ==} 1383 + /@typescript-eslint/utils/5.48.1_iukboom6ndih5an6iafl45j2fe:
  1384 + resolution: {integrity: sha512-SmQuSrCGUOdmGMwivW14Z0Lj8dxG1mOFZ7soeJ0TQZEJcs3n5Ndgkg0A4bcMFzBELqLJ6GTHnEU+iIoaD6hFGA==}
1391 engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1385 engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
1392 peerDependencies: 1386 peerDependencies:
1393 eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 1387 eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
1394 dependencies: 1388 dependencies:
1395 '@types/json-schema': 7.0.11 1389 '@types/json-schema': 7.0.11
1396 '@types/semver': 7.3.13 1390 '@types/semver': 7.3.13
1397 - '@typescript-eslint/scope-manager': 5.48.0  
1398 - '@typescript-eslint/types': 5.48.0  
1399 - '@typescript-eslint/typescript-estree': 5.48.0_typescript@4.9.4 1391 + '@typescript-eslint/scope-manager': 5.48.1
  1392 + '@typescript-eslint/types': 5.48.1
  1393 + '@typescript-eslint/typescript-estree': 5.48.1_typescript@4.9.4
1400 eslint: 8.31.0 1394 eslint: 8.31.0
1401 eslint-scope: 5.1.1 1395 eslint-scope: 5.1.1
1402 eslint-utils: 3.0.0_eslint@8.31.0 1396 eslint-utils: 3.0.0_eslint@8.31.0
@@ -1406,11 +1400,11 @@ packages: @@ -1406,11 +1400,11 @@ packages:
1406 - typescript 1400 - typescript
1407 dev: true 1401 dev: true
1408 1402
1409 - /@typescript-eslint/visitor-keys/5.48.0:  
1410 - resolution: {integrity: sha512-5motVPz5EgxQ0bHjut3chzBkJ3Z3sheYVcSwS5BpHZpLqSptSmELNtGixmgj65+rIfhvtQTz5i9OP2vtzdDH7Q==} 1403 + /@typescript-eslint/visitor-keys/5.48.1:
  1404 + resolution: {integrity: sha512-Ns0XBwmfuX7ZknznfXozgnydyR8F6ev/KEGePP4i74uL3ArsKbEhJ7raeKr1JSa997DBDwol/4a0Y+At82c9dA==}
1411 engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1405 engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
1412 dependencies: 1406 dependencies:
1413 - '@typescript-eslint/types': 5.48.0 1407 + '@typescript-eslint/types': 5.48.1
1414 eslint-visitor-keys: 3.3.0 1408 eslint-visitor-keys: 3.3.0
1415 dev: true 1409 dev: true
1416 1410
@@ -1498,30 +1492,30 @@ packages: @@ -1498,30 +1492,30 @@ packages:
1498 vue: 3.2.45 1492 vue: 3.2.45
1499 dev: true 1493 dev: true
1500 1494
1501 - /@volar/language-core/1.0.22:  
1502 - resolution: {integrity: sha512-hiJeCOqxNdtG/04FRGLGI9H9DVz2l6cTqPDBzwqplHXAWfMxjzUaGUrn9sfTG7YMFNZUgK4EYxJnRfhqdtbSFQ==} 1495 + /@volar/language-core/1.0.24:
  1496 + resolution: {integrity: sha512-vTN+alJiWwK0Pax6POqrmevbtFW2dXhjwWiW/MW4f48eDYPLdyURWcr8TixO7EN/nHsUBj2udT7igFKPtjyAKg==}
1503 dependencies: 1497 dependencies:
1504 - '@volar/source-map': 1.0.22 1498 + '@volar/source-map': 1.0.24
1505 muggle-string: 0.1.0 1499 muggle-string: 0.1.0
1506 dev: true 1500 dev: true
1507 1501
1508 - /@volar/source-map/1.0.22:  
1509 - resolution: {integrity: sha512-cv4gypHSP4MWVR82ed/+1IpI6794qAl0Q0+KJ+VGMVF8rVugsiF9QbyMCgjel9wNRsssQsazzsf6txOR9vHQiw==} 1502 + /@volar/source-map/1.0.24:
  1503 + resolution: {integrity: sha512-Qsv/tkplx18pgBr8lKAbM1vcDqgkGKQzbChg6NW+v0CZc3G7FLmK+WrqEPzKlN7Cwdc6XVL559Nod8WKAfKr4A==}
1510 dependencies: 1504 dependencies:
1511 muggle-string: 0.1.0 1505 muggle-string: 0.1.0
1512 dev: true 1506 dev: true
1513 1507
1514 - /@volar/typescript/1.0.22:  
1515 - resolution: {integrity: sha512-VPyEicealSD4gqlE5/UQ1j3ietsO6Hfat40KtUEh/K+XEZ7h02b1KgFV64YEuBkBOaZ5hgvRW/WXKtQgXCl7Iw==} 1508 + /@volar/typescript/1.0.24:
  1509 + resolution: {integrity: sha512-f8hCSk+PfKR1/RQHxZ79V1NpDImHoivqoizK+mstphm25tn/YJ/JnKNjZHB+o21fuW0yKlI26NV3jkVb2Cc/7A==}
1516 dependencies: 1510 dependencies:
1517 - '@volar/language-core': 1.0.22 1511 + '@volar/language-core': 1.0.24
1518 dev: true 1512 dev: true
1519 1513
1520 - /@volar/vue-language-core/1.0.22:  
1521 - resolution: {integrity: sha512-Ki0G/ZdBj2/GLw+/VVH3n9XR/JL6krMIth02EekFn6JV4PGN3mNxbvoh6lOPSDZLR6biOU5nJPnnjpKy8nuXhw==} 1514 + /@volar/vue-language-core/1.0.24:
  1515 + resolution: {integrity: sha512-2NTJzSgrwKu6uYwPqLiTMuAzi7fAY3yFy5PJ255bGJc82If0Xr+cW8pC80vpjG0D/aVLmlwAdO4+Ya2BI8GdDg==}
1522 dependencies: 1516 dependencies:
1523 - '@volar/language-core': 1.0.22  
1524 - '@volar/source-map': 1.0.22 1517 + '@volar/language-core': 1.0.24
  1518 + '@volar/source-map': 1.0.24
1525 '@vue/compiler-dom': 3.2.45 1519 '@vue/compiler-dom': 3.2.45
1526 '@vue/compiler-sfc': 3.2.45 1520 '@vue/compiler-sfc': 3.2.45
1527 '@vue/reactivity': 3.2.45 1521 '@vue/reactivity': 3.2.45
@@ -1530,11 +1524,11 @@ packages: @@ -1530,11 +1524,11 @@ packages:
1530 vue-template-compiler: 2.7.14 1524 vue-template-compiler: 2.7.14
1531 dev: true 1525 dev: true
1532 1526
1533 - /@volar/vue-typescript/1.0.22:  
1534 - resolution: {integrity: sha512-2T1o5z86PAev31OMtVOv/qp4P3ZVl9ln/2KTmykQE8Fh4A5F+868MW4nf5J7XQ6RNyx7RH9LhzgjvbqJpAfiYw==} 1527 + /@volar/vue-typescript/1.0.24:
  1528 + resolution: {integrity: sha512-9a25oHDvGaNC0okRS47uqJI6FxY4hUQZUsxeOUFHcqVxZEv8s17LPuP/pMMXyz7jPygrZubB/qXqHY5jEu/akA==}
1535 dependencies: 1529 dependencies:
1536 - '@volar/typescript': 1.0.22  
1537 - '@volar/vue-language-core': 1.0.22 1530 + '@volar/typescript': 1.0.24
  1531 + '@volar/vue-language-core': 1.0.24
1538 dev: true 1532 dev: true
1539 1533
1540 /@vue/babel-helper-vue-transform-on/1.0.2: 1534 /@vue/babel-helper-vue-transform-on/1.0.2:
@@ -1583,7 +1577,7 @@ packages: @@ -1583,7 +1577,7 @@ packages:
1583 '@vue/shared': 3.2.45 1577 '@vue/shared': 3.2.45
1584 estree-walker: 2.0.2 1578 estree-walker: 2.0.2
1585 magic-string: 0.25.9 1579 magic-string: 0.25.9
1586 - postcss: 8.4.20 1580 + postcss: 8.4.21
1587 source-map: 0.6.1 1581 source-map: 0.6.1
1588 1582
1589 /@vue/compiler-ssr/3.2.45: 1583 /@vue/compiler-ssr/3.2.45:
@@ -2066,7 +2060,7 @@ packages: @@ -2066,7 +2060,7 @@ packages:
2066 hasBin: true 2060 hasBin: true
2067 dev: true 2061 dev: true
2068 2062
2069 - /autoprefixer/10.4.13_postcss@8.4.20: 2063 + /autoprefixer/10.4.13_postcss@8.4.21:
2070 resolution: {integrity: sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==} 2064 resolution: {integrity: sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==}
2071 engines: {node: ^10 || ^12 || >=14} 2065 engines: {node: ^10 || ^12 || >=14}
2072 hasBin: true 2066 hasBin: true
@@ -2078,7 +2072,7 @@ packages: @@ -2078,7 +2072,7 @@ packages:
2078 fraction.js: 4.2.0 2072 fraction.js: 4.2.0
2079 normalize-range: 0.1.2 2073 normalize-range: 0.1.2
2080 picocolors: 1.0.0 2074 picocolors: 1.0.0
2081 - postcss: 8.4.20 2075 + postcss: 8.4.21
2082 postcss-value-parser: 4.2.0 2076 postcss-value-parser: 4.2.0
2083 dev: true 2077 dev: true
2084 2078
@@ -3013,12 +3007,12 @@ packages: @@ -3013,12 +3007,12 @@ packages:
3013 eslint: 8.31.0 3007 eslint: 8.31.0
3014 dev: true 3008 dev: true
3015 3009
3016 - /eslint-define-config/1.13.0:  
3017 - resolution: {integrity: sha512-d0BfmPGBcMusfiz6QY/piAhWaEyJriJtvk9SHfuJzI7am9k4ce07SfmPkpcR0ckXNyu4FBons10akOO2Tx+X+Q==} 3010 + /eslint-define-config/1.14.0:
  3011 + resolution: {integrity: sha512-NREt5SzMwKmLAY28YdaqIiTSJxfPpuZ+1ZLJxY2Wbj02dYF4QX81z0q9MPMjZB8C+SlCu66qAhcPpFJyhXOiuA==}
3018 engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0, npm: '>=6.14.13', pnpm: '>= 7.0.0'} 3012 engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0, npm: '>=6.14.13', pnpm: '>= 7.0.0'}
3019 dev: true 3013 dev: true
3020 3014
3021 - /eslint-plugin-prettier/4.2.1_32m5uc2milwdw3tnkcq5del26y: 3015 + /eslint-plugin-prettier/4.2.1_iu5s7nk6dw7o3tajefwfiqfmge:
3022 resolution: {integrity: sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==} 3016 resolution: {integrity: sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==}
3023 engines: {node: '>=12.0.0'} 3017 engines: {node: '>=12.0.0'}
3024 peerDependencies: 3018 peerDependencies:
@@ -3031,7 +3025,7 @@ packages: @@ -3031,7 +3025,7 @@ packages:
3031 dependencies: 3025 dependencies:
3032 eslint: 8.31.0 3026 eslint: 8.31.0
3033 eslint-config-prettier: 8.6.0_eslint@8.31.0 3027 eslint-config-prettier: 8.6.0_eslint@8.31.0
3034 - prettier: 2.8.1 3028 + prettier: 2.8.2
3035 prettier-linter-helpers: 1.0.0 3029 prettier-linter-helpers: 1.0.0
3036 dev: true 3030 dev: true
3037 3031
@@ -4506,7 +4500,7 @@ packages: @@ -4506,7 +4500,7 @@ packages:
4506 dev: false 4500 dev: false
4507 4501
4508 /nanoid/3.3.4: 4502 /nanoid/3.3.4:
4509 - 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} 4503 + resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==}
4510 engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 4504 engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
4511 hasBin: true 4505 hasBin: true
4512 4506
@@ -4848,8 +4842,8 @@ packages: @@ -4848,8 +4842,8 @@ packages:
4848 dependencies: 4842 dependencies:
4849 htmlparser2: 8.0.1 4843 htmlparser2: 8.0.1
4850 js-tokens: 8.0.0 4844 js-tokens: 8.0.0
4851 - postcss: 8.4.20  
4852 - postcss-safe-parser: 6.0.0_postcss@8.4.20 4845 + postcss: 8.4.21
  4846 + postcss-safe-parser: 6.0.0_postcss@8.4.21
4853 dev: true 4847 dev: true
4854 4848
4855 /postcss-media-query-parser/0.2.3: 4849 /postcss-media-query-parser/0.2.3:
@@ -4868,22 +4862,22 @@ packages: @@ -4868,22 +4862,22 @@ packages:
4868 resolution: {integrity: sha512-HvExULSwLqHLgUy1rl3ANIqCsvMS0WHss2UOsXhXnQaZ9VCc2oBvIpXrl00IUFT5ZDITME0o6oiXeiHr2SAIfw==} 4862 resolution: {integrity: sha512-HvExULSwLqHLgUy1rl3ANIqCsvMS0WHss2UOsXhXnQaZ9VCc2oBvIpXrl00IUFT5ZDITME0o6oiXeiHr2SAIfw==}
4869 dev: true 4863 dev: true
4870 4864
4871 - /postcss-safe-parser/6.0.0_postcss@8.4.20: 4865 + /postcss-safe-parser/6.0.0_postcss@8.4.21:
4872 resolution: {integrity: sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==} 4866 resolution: {integrity: sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==}
4873 engines: {node: '>=12.0'} 4867 engines: {node: '>=12.0'}
4874 peerDependencies: 4868 peerDependencies:
4875 postcss: ^8.3.3 4869 postcss: ^8.3.3
4876 dependencies: 4870 dependencies:
4877 - postcss: 8.4.20 4871 + postcss: 8.4.21
4878 dev: true 4872 dev: true
4879 4873
4880 - /postcss-scss/4.0.6_postcss@8.4.20: 4874 + /postcss-scss/4.0.6_postcss@8.4.21:
4881 resolution: {integrity: sha512-rLDPhJY4z/i4nVFZ27j9GqLxj1pwxE80eAzUNRMXtcpipFYIeowerzBgG3yJhMtObGEXidtIgbUpQ3eLDsf5OQ==} 4875 resolution: {integrity: sha512-rLDPhJY4z/i4nVFZ27j9GqLxj1pwxE80eAzUNRMXtcpipFYIeowerzBgG3yJhMtObGEXidtIgbUpQ3eLDsf5OQ==}
4882 engines: {node: '>=12.0'} 4876 engines: {node: '>=12.0'}
4883 peerDependencies: 4877 peerDependencies:
4884 postcss: ^8.4.19 4878 postcss: ^8.4.19
4885 dependencies: 4879 dependencies:
4886 - postcss: 8.4.20 4880 + postcss: 8.4.21
4887 dev: true 4881 dev: true
4888 4882
4889 /postcss-selector-parser/6.0.10: 4883 /postcss-selector-parser/6.0.10:
@@ -4902,12 +4896,12 @@ packages: @@ -4902,12 +4896,12 @@ packages:
4902 util-deprecate: 1.0.2 4896 util-deprecate: 1.0.2
4903 dev: true 4897 dev: true
4904 4898
4905 - /postcss-sorting/7.0.1_postcss@8.4.20:  
4906 - resolution: {integrity: sha512-iLBFYz6VRYyLJEJsBJ8M3TCqNcckVzz4wFounSc5Oez35ogE/X+aoC5fFu103Ot7NyvjU3/xqIXn93Gp3kJk4g==} 4899 + /postcss-sorting/8.0.1_postcss@8.4.21:
  4900 + resolution: {integrity: sha512-go9Zoxx7KQH+uLrJ9xa5wRErFeXu01ydA6O8m7koPXkmAN7Ts//eRcIqjo0stBR4+Nir2gMYDOWAOx7O5EPUZA==}
4907 peerDependencies: 4901 peerDependencies:
4908 - postcss: ^8.3.9 4902 + postcss: ^8.4.20
4909 dependencies: 4903 dependencies:
4910 - postcss: 8.4.20 4904 + postcss: 8.4.21
4911 dev: true 4905 dev: true
4912 4906
4913 /postcss-value-parser/4.2.0: 4907 /postcss-value-parser/4.2.0:
@@ -4924,8 +4918,8 @@ packages: @@ -4924,8 +4918,8 @@ packages:
4924 supports-color: 3.2.3 4918 supports-color: 3.2.3
4925 dev: true 4919 dev: true
4926 4920
4927 - /postcss/8.4.20:  
4928 - resolution: {integrity: sha512-6Q04AXR1212bXr5fh03u8aAwbLxAQNGQ/Q1LNa0VfOI06ZAlhPHtQvE4OIdpj4kLThXilalPnmDSOD65DcHt+g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/postcss/-/postcss-8.4.20.tgz} 4921 + /postcss/8.4.21:
  4922 + resolution: {integrity: sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==}
4929 engines: {node: ^10 || ^12 || >=14} 4923 engines: {node: ^10 || ^12 || >=14}
4930 dependencies: 4924 dependencies:
4931 nanoid: 3.3.4 4925 nanoid: 3.3.4
@@ -4983,8 +4977,8 @@ packages: @@ -4983,8 +4977,8 @@ packages:
4983 fast-diff: 1.2.0 4977 fast-diff: 1.2.0
4984 dev: true 4978 dev: true
4985 4979
4986 - /prettier/2.8.1:  
4987 - resolution: {integrity: sha512-lqGoSJBQNJidqCHE80vqZJHWHRFoNYsSpP9AjFhlhi9ODCJA541svILes/+/1GM3VaL/abZi7cpFzOpdR9UPKg==} 4980 + /prettier/2.8.2:
  4981 + resolution: {integrity: sha512-BtRV9BcncDyI2tsuS19zzhzoxD8Dh8LiCx7j7tHzrkz8GFXAexeWFdi22mjE1d16dftH2qNaytVxqiRTGlMfpw==}
4988 engines: {node: '>=10.13.0'} 4982 engines: {node: '>=10.13.0'}
4989 hasBin: true 4983 hasBin: true
4990 dev: true 4984 dev: true
@@ -5428,7 +5422,7 @@ packages: @@ -5428,7 +5422,7 @@ packages:
5428 dev: true 5422 dev: true
5429 5423
5430 /source-map-js/1.0.2: 5424 /source-map-js/1.0.2:
5431 - 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} 5425 + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==}
5432 engines: {node: '>=0.10.0'} 5426 engines: {node: '>=0.10.0'}
5433 5427
5434 /source-map-resolve/0.5.3: 5428 /source-map-resolve/0.5.3:
@@ -5636,13 +5630,13 @@ packages: @@ -5636,13 +5630,13 @@ packages:
5636 stylelint-config-recommended: 9.0.0_stylelint@14.16.1 5630 stylelint-config-recommended: 9.0.0_stylelint@14.16.1
5637 dev: true 5631 dev: true
5638 5632
5639 - /stylelint-order/5.0.0_stylelint@14.16.1:  
5640 - resolution: {integrity: sha512-OWQ7pmicXufDw5BlRqzdz3fkGKJPgLyDwD1rFY3AIEfIH/LQY38Vu/85v8/up0I+VPiuGRwbc2Hg3zLAsJaiyw==} 5633 + /stylelint-order/6.0.1_stylelint@14.16.1:
  5634 + resolution: {integrity: sha512-C9gJDZArRBZvn+4MPgggwYTp7dK49WPnYa5+6tBEkZnW/YWj4xBVNJdQjIik14w5orlF9RqFpYDHN0FPWIFOSQ==}
5641 peerDependencies: 5635 peerDependencies:
5642 stylelint: ^14.0.0 5636 stylelint: ^14.0.0
5643 dependencies: 5637 dependencies:
5644 - postcss: 8.4.20  
5645 - postcss-sorting: 7.0.1_postcss@8.4.20 5638 + postcss: 8.4.21
  5639 + postcss-sorting: 8.0.1_postcss@8.4.21
5646 stylelint: 14.16.1 5640 stylelint: 14.16.1
5647 dev: true 5641 dev: true
5648 5642
@@ -5651,7 +5645,7 @@ packages: @@ -5651,7 +5645,7 @@ packages:
5651 engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 5645 engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
5652 hasBin: true 5646 hasBin: true
5653 dependencies: 5647 dependencies:
5654 - '@csstools/selector-specificity': 2.0.2_2xshye3abirqjlplmebvmaxyna 5648 + '@csstools/selector-specificity': 2.0.2_wajs5nedgkikc5pcuwett7legi
5655 balanced-match: 2.0.0 5649 balanced-match: 2.0.0
5656 colord: 2.9.3 5650 colord: 2.9.3
5657 cosmiconfig: 7.1.0 5651 cosmiconfig: 7.1.0
@@ -5674,10 +5668,10 @@ packages: @@ -5674,10 +5668,10 @@ packages:
5674 micromatch: 4.0.5 5668 micromatch: 4.0.5
5675 normalize-path: 3.0.0 5669 normalize-path: 3.0.0
5676 picocolors: 1.0.0 5670 picocolors: 1.0.0
5677 - postcss: 8.4.20 5671 + postcss: 8.4.21
5678 postcss-media-query-parser: 0.2.3 5672 postcss-media-query-parser: 0.2.3
5679 postcss-resolve-nested-selector: 0.1.1 5673 postcss-resolve-nested-selector: 0.1.1
5680 - postcss-safe-parser: 6.0.0_postcss@8.4.20 5674 + postcss-safe-parser: 6.0.0_postcss@8.4.21
5681 postcss-selector-parser: 6.0.11 5675 postcss-selector-parser: 6.0.11
5682 postcss-value-parser: 4.2.0 5676 postcss-value-parser: 4.2.0
5683 resolve-from: 5.0.0 5677 resolve-from: 5.0.0
@@ -6211,7 +6205,7 @@ packages: @@ -6211,7 +6205,7 @@ packages:
6211 dependencies: 6205 dependencies:
6212 '@types/node': 18.11.18 6206 '@types/node': 18.11.18
6213 esbuild: 0.16.5 6207 esbuild: 0.16.5
6214 - postcss: 8.4.20 6208 + postcss: 8.4.21
6215 resolve: 1.22.1 6209 resolve: 1.22.1
6216 rollup: 3.9.1 6210 rollup: 3.9.1
6217 sass: 1.57.1 6211 sass: 1.57.1
@@ -6281,14 +6275,14 @@ packages: @@ -6281,14 +6275,14 @@ packages:
6281 he: 1.2.0 6275 he: 1.2.0
6282 dev: true 6276 dev: true
6283 6277
6284 - /vue-tsc/1.0.22_typescript@4.9.4:  
6285 - resolution: {integrity: sha512-xSxwgWR3czhv7sLKHWu6lzj9Xq6AtsCURVL45AY4TLGFszv2L2YlMgygXvqslyCM5bz9cyoIKSaZnzHqHTHjzA==} 6278 + /vue-tsc/1.0.24_typescript@4.9.4:
  6279 + resolution: {integrity: sha512-mmU1s5SAqE1nByQAiQnao9oU4vX+mSdsgI8H57SfKH6UVzq/jP9+Dbi2GaV+0b4Cn361d2ln8m6xeU60ApiEXg==}
6286 hasBin: true 6280 hasBin: true
6287 peerDependencies: 6281 peerDependencies:
6288 typescript: '*' 6282 typescript: '*'
6289 dependencies: 6283 dependencies:
6290 - '@volar/vue-language-core': 1.0.22  
6291 - '@volar/vue-typescript': 1.0.22 6284 + '@volar/vue-language-core': 1.0.24
  6285 + '@volar/vue-typescript': 1.0.24
6292 typescript: 4.9.4 6286 typescript: 4.9.4
6293 dev: true 6287 dev: true
6294 6288
@@ -6314,8 +6308,8 @@ packages: @@ -6314,8 +6308,8 @@ packages:
6314 '@vue/server-renderer': 3.2.45_vue@3.2.45 6308 '@vue/server-renderer': 3.2.45_vue@3.2.45
6315 '@vue/shared': 3.2.45 6309 '@vue/shared': 3.2.45
6316 6310
6317 - /vxe-table/4.3.7_vue@3.2.45+xe-utils@3.5.7:  
6318 - 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} 6311 + /vxe-table/4.3.9_vue@3.2.45+xe-utils@3.5.7:
  6312 + resolution: {integrity: sha512-Ns7Ooa7lOHBpks90i0k0BMNyxfMpUo39ryxTgKE41X3xVnI9tGQs2U6+klfDlsuqYfmG3ibyzHN3OCrWbbKo4Q==}
6319 peerDependencies: 6313 peerDependencies:
6320 vue: ^3.2.28 6314 vue: ^3.2.28
6321 xe-utils: ^3.5.0 6315 xe-utils: ^3.5.0
yudao-ui-admin/src/styles/index.scss
@@ -129,7 +129,7 @@ input, textarea{ @@ -129,7 +129,7 @@ input, textarea{
129 } 129 }
130 130
131 .el-scrollbar__view{ 131 .el-scrollbar__view{
132 - overflow-x: hidden; 132 +// overflow-x: hidden;
133 } 133 }
134 134
135 .el-rate{ 135 .el-rate{
yudao-ui-admin/src/views/infra/redis/index.vue
@@ -136,8 +136,8 @@ @@ -136,8 +136,8 @@
136 136
137 <script> 137 <script>
138 import {getCache, getKeyDefineList, getKeyList, getKeyValue, deleteKey, deleteKeys} from "@/api/infra/redis"; 138 import {getCache, getKeyDefineList, getKeyList, getKeyValue, deleteKey, deleteKeys} from "@/api/infra/redis";
139 -import echarts from "echarts";  
140 - 139 +import * as echarts from 'echarts'
  140 +require('echarts/theme/macarons') // echarts theme
141 export default { 141 export default {
142 name: "Server", 142 name: "Server",
143 data () { 143 data () {
yudao-ui-app/api/auth.js
@@ -10,6 +10,6 @@ export const smsLogin = data =&gt; http.post(&#39;/member/auth/sms-login&#39;, data) @@ -10,6 +10,6 @@ export const smsLogin = data =&gt; http.post(&#39;/member/auth/sms-login&#39;, data)
10 //微信小程序的一键登录 10 //微信小程序的一键登录
11 export const weixinMiniAppLogin = data => http.post('/member/auth/weixin-mini-app-login', data) 11 export const weixinMiniAppLogin = data => http.post('/member/auth/weixin-mini-app-login', data)
12 //刷新令牌 12 //刷新令牌
13 -export const refreshToken = data => http.post('/member/auth/refresh-token', data) 13 +export const refreshToken = data => http.post('/member/auth/refresh-token', {data})
14 //退出登录 14 //退出登录
15 export const logout = data => http.post('/member/auth/logout', data) 15 export const logout = data => http.post('/member/auth/logout', data)
yudao-ui-app/store/getters.js
1 const getters = { 1 const getters = {
2 accessToken: state => state.user.accessToken, 2 accessToken: state => state.user.accessToken,
  3 + refreshToken: state => state.user.refreshToken,
3 userInfo: state => state.user.userInfo, 4 userInfo: state => state.user.userInfo,
4 hasLogin: state => !!state.user.accessToken 5 hasLogin: state => !!state.user.accessToken
5 } 6 }
yudao-ui-app/utils/request/responseInterceptors.js
@@ -30,13 +30,16 @@ module.exports = vm =&gt; { @@ -30,13 +30,16 @@ module.exports = vm =&gt; {
30 if (!isRefreshToken) { 30 if (!isRefreshToken) {
31 isRefreshToken = true 31 isRefreshToken = true
32 // 1. 如果获取不到刷新令牌,则只能执行登出操作 32 // 1. 如果获取不到刷新令牌,则只能执行登出操作
33 - if (!vm.$store.getters.refreshToken()) { 33 + if (!vm.$store.getters.refreshToken) {
34 vm.$store.commit('CLEAR_LOGIN_INFO') 34 vm.$store.commit('CLEAR_LOGIN_INFO')
35 return Promise.reject(res) 35 return Promise.reject(res)
36 } 36 }
37 // 2. 进行刷新访问令牌 37 // 2. 进行刷新访问令牌
38 try { 38 try {
39 - const refreshTokenRes = await refreshToken() 39 + let param = {}
  40 + let refreshToken = uni.getStorageSync('REFRESH_TOKEN');
  41 + param.refreshToken = refreshToken;
  42 + const refreshTokenRes = await refreshToken(param)
40 // 2.1 刷新成功,则回放队列的请求 + 当前请求 43 // 2.1 刷新成功,则回放队列的请求 + 当前请求
41 vm.$store.commit('SET_TOKEN', refreshTokenRes.data) 44 vm.$store.commit('SET_TOKEN', refreshTokenRes.data)
42 requestList.forEach(cb => cb()) 45 requestList.forEach(cb => cb())