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 191 | [Spring Boot](https://spring.io/projects/spring-boot) | 应用开发框架 | 2.7.7 | [文档](https://github.com/YunaiV/SpringBoot-Labs) |
192 192 | [MySQL](https://www.mysql.com/cn/) | 数据库服务器 | 5.7 / 8.0+ | |
193 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 195 | [Dynamic Datasource](https://dynamic-datasource.com/) | 动态数据源 | 3.6.1 | [文档](http://www.iocoder.cn/Spring-Boot/datasource-pool/?yudao) |
196 196 | [Redis](https://redis.io/) | key-value 数据库 | 5.0 / 6.0 | |
197 197 | [Redisson](https://github.com/redisson/redisson) | Redis 客户端 | 3.18.0 | [文档](http://www.iocoder.cn/Spring-Boot/Redis/?yudao) |
198 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 200 | [Hibernate Validator](https://github.com/hibernate/hibernate-validator) | 参数校验组件 | 6.2.5 | [文档](http://www.iocoder.cn/Spring-Boot/Validation/?yudao) |
201 201 | [Flowable](https://github.com/flowable/flowable-engine) | 工作流引擎 | 6.8.0 | [文档](https://doc.iocoder.cn/bpm/) |
202 202 | [Quartz](https://github.com/quartz-scheduler) | 任务调度组件 | 2.3.2 | [文档](http://www.iocoder.cn/Spring-Boot/Job/?yudao) |
203 203 | [Knife4j](https://gitee.com/xiaoym/knife4j) | Swagger 增强 UI 实现 | 3.0.3 | [文档](http://www.iocoder.cn/Spring-Boot/Swagger/?yudao) |
204 204 | [Resilience4j](https://github.com/resilience4j/resilience4j) | 服务保障组件 | 1.7.1 | [文档](http://www.iocoder.cn/Spring-Boot/Resilience4j/?yudao) |
205 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 207 | [Jackson](https://github.com/FasterXML/jackson) | JSON 工具库 | 2.13.3 | |
208 208 | [MapStruct](https://mapstruct.org/) | Java Bean 转换 | 1.5.3.Final | [文档](http://www.iocoder.cn/Spring-Boot/MapStruct/?yudao) |
209 209 | [Lombok](https://projectlombok.org/) | 消除冗长的 Java 代码 | 1.18.24 | [文档](http://www.iocoder.cn/Spring-Boot/Lombok/?yudao) |
... ... @@ -227,7 +227,7 @@ ps:核心功能已经实现,正在对接微信小程序中...
227 227 | [TypeScript](https://www.typescriptlang.org/docs/) | TypeScript | 4.9.4 |
228 228 | [pinia](https://pinia.vuejs.org/) | vuex5 | 2.0.28 |
229 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 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 1344 `last_update_time` datetime NULL DEFAULT NULL COMMENT '最后更新时间',
1345 1345 `term_of_validity` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '有效期(0:永久有效,1:1天,2:7天)',
1346 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 1348 PRIMARY KEY (`id`) USING BTREE
1348 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 32 <resilience4j.version>1.7.1</resilience4j.version>
33 33 <!-- 监控相关 -->
34 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 36 <opentracing.version>0.33.0</opentracing.version>
37 37 <!-- Test 测试相关 -->
38 38 <podam.version>7.2.11.RELEASE</podam.version>
... ... @@ -41,10 +41,11 @@
41 41 <!-- Bpm 工作流相关 -->
42 42 <flowable.version>6.8.0</flowable.version>
43 43 <!-- 工具类相关 -->
  44 + <jsoup.version>1.15.3</jsoup.version>
44 45 <lombok.version>1.18.24</lombok.version>
45 46 <mapstruct.version>1.5.3.Final</mapstruct.version>
46 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 49 <velocity.version>2.3</velocity.version>
49 50 <screw.version>1.0.5</screw.version>
50 51 <fastjson.version>1.2.83</fastjson.version>
... ... @@ -63,7 +64,7 @@
63 64 <minio.version>8.4.6</minio.version>
64 65 <aliyun-java-sdk-core.version>4.6.3</aliyun-java-sdk-core.version>
65 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 68 <justauth.version>1.4.0</justauth.version>
68 69 <jimureport.version>1.5.6</jimureport.version>
69 70 <xercesImpl.version>2.12.2</xercesImpl.version>
... ... @@ -522,6 +523,12 @@
522 523 <version>${ip2region.version}</version>
523 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 533 <dependency>
527 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 2  
3 3 import cn.iocoder.yudao.framework.common.pojo.PageParam;
4 4 import cn.iocoder.yudao.framework.common.pojo.PageResult;
5   -import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
6 5 import cn.iocoder.yudao.framework.mybatis.core.util.MyBatisUtils;
7 6 import com.baomidou.mybatisplus.core.conditions.Wrapper;
8 7 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
... ... @@ -10,6 +9,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
10 9 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
11 10 import com.baomidou.mybatisplus.core.metadata.IPage;
12 11 import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
  12 +import com.baomidou.mybatisplus.extension.toolkit.Db;
13 13 import org.apache.ibatis.annotations.Param;
14 14  
15 15 import java.util.Collection;
... ... @@ -92,8 +92,22 @@ public interface BaseMapperX&lt;T&gt; extends BaseMapper&lt;T&gt; {
92 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 105 default void updateBatch(T update) {
96 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 67 <scope>provided</scope> <!-- 设置为 provided,主要是 GlobalExceptionHandler 使用 -->
68 68 </dependency>
69 69  
  70 + <!-- xss -->
  71 + <dependency>
  72 + <groupId>org.jsoup</groupId>
  73 + <artifactId>jsoup</artifactId>
  74 + </dependency>
70 75 </dependencies>
71 76  
72 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 2  
3 3 import cn.iocoder.yudao.framework.apilog.core.service.ApiErrorLogFrameworkService;
4 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 7 import cn.iocoder.yudao.framework.web.core.filter.CacheRequestBodyFilter;
6 8 import cn.iocoder.yudao.framework.web.core.filter.DemoFilter;
7 9 import cn.iocoder.yudao.framework.web.core.filter.XssFilter;
8 10 import cn.iocoder.yudao.framework.web.core.handler.GlobalExceptionHandler;
9 11 import cn.iocoder.yudao.framework.web.core.handler.GlobalResponseBodyHandler;
  12 +import cn.iocoder.yudao.framework.web.core.json.XssStringJsonDeserializer;
10 13 import cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils;
  14 +import com.fasterxml.jackson.databind.ObjectMapper;
11 15 import org.springframework.beans.factory.annotation.Value;
12 16 import org.springframework.boot.autoconfigure.AutoConfiguration;
  17 +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
  18 +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
13 19 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
  20 +import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
14 21 import org.springframework.boot.context.properties.EnableConfigurationProperties;
15 22 import org.springframework.boot.web.servlet.FilterRegistrationBean;
16 23 import org.springframework.context.annotation.Bean;
... ... @@ -48,7 +55,7 @@ public class YudaoWebAutoConfiguration implements WebMvcConfigurer {
48 55 * 设置 API 前缀,仅仅匹配 controller 包下的
49 56 *
50 57 * @param configurer 配置
51   - * @param api API 配置
  58 + * @param api API 配置
52 59 */
53 60 private void configurePathMatch(PathMatchConfigurer configurer, WebProperties.Api api) {
54 61 AntPathMatcher antPathMatcher = new AntPathMatcher(".");
... ... @@ -104,8 +111,9 @@ public class YudaoWebAutoConfiguration implements WebMvcConfigurer {
104 111 * 创建 XssFilter Bean,解决 Xss 安全问题
105 112 */
106 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 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 154 private static <T extends Filter> FilterRegistrationBean<T> createFilterBean(T filter, Integer order) {
121 155 FilterRegistrationBean<T> bean = new FilterRegistrationBean<>(filter);
122 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 1 package cn.iocoder.yudao.framework.web.core.filter;
2 2  
3 3 import cn.iocoder.yudao.framework.web.config.XssProperties;
  4 +import cn.iocoder.yudao.framework.web.core.clean.XssCleaner;
4 5 import lombok.AllArgsConstructor;
5 6 import org.springframework.util.PathMatcher;
6 7 import org.springframework.web.filter.OncePerRequestFilter;
... ... @@ -13,7 +14,7 @@ import java.io.IOException;
13 14  
14 15 /**
15 16 * Xss 过滤器
16   - *
  17 + * <p>
17 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 20 * @author 芋道源码
... ... @@ -30,10 +31,12 @@ public class XssFilter extends OncePerRequestFilter {
30 31 */
31 32 private final PathMatcher pathMatcher;
32 33  
  34 + private final XssCleaner xssCleaner;
  35 +
33 36 @Override
34 37 protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
35 38 throws IOException, ServletException {
36   - filterChain.doFilter(new XssRequestWrapper(request), response);
  39 + filterChain.doFilter(new XssRequestWrapper(request, xssCleaner), response);
37 40 }
38 41  
39 42 @Override
... ...
yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/core/filter/XssRequestWrapper.java
1 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 5 import javax.servlet.http.HttpServletRequest;
14 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 8 import java.util.Map;
20 9  
21 10 /**
... ... @@ -24,113 +13,79 @@ import java.util.Map;
24 13 * @author 芋道源码
25 14 */
26 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 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 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 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 52 @Override
94 53 public String getParameter(String name) {
95 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 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 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 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 11 import cn.iocoder.yudao.module.infra.dal.dataobject.codegen.CodegenTableDO;
12 12 import com.baomidou.mybatisplus.generator.config.po.TableField;
13 13 import com.baomidou.mybatisplus.generator.config.po.TableInfo;
  14 +import com.baomidou.mybatisplus.generator.config.rules.IColumnType;
14 15 import org.mapstruct.Mapper;
15 16 import org.mapstruct.Mapping;
16 17 import org.mapstruct.Mappings;
  18 +import org.mapstruct.Named;
17 19 import org.mapstruct.factory.Mappers;
18 20  
19 21 import java.util.List;
... ... @@ -37,7 +39,7 @@ public interface CodegenConvert {
37 39  
38 40 @Mappings({
39 41 @Mapping(source = "name", target = "columnName"),
40   - @Mapping(source = "type", target = "dataType"),
  42 + @Mapping(source = "columnType", target = "dataType", qualifiedByName = "getType"),
41 43 @Mapping(source = "comment", target = "columnComment"),
42 44 @Mapping(source = "metaInfo.nullable", target = "nullable"),
43 45 @Mapping(source = "keyFlag", target = "primaryKey"),
... ... @@ -47,6 +49,11 @@ public interface CodegenConvert {
47 49 })
48 50 CodegenColumnDO convert(TableField bean);
49 51  
  52 + @Named("getType")
  53 + default String getType(IColumnType jdbcType) {
  54 + return jdbcType.getType();
  55 + }
  56 +
50 57 // ========== CodegenTableDO 相关 ==========
51 58  
52 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 import com.baomidou.mybatisplus.annotation.KeySequence;
7 7 import com.baomidou.mybatisplus.annotation.TableId;
8 8 import com.baomidou.mybatisplus.annotation.TableName;
  9 +import com.baomidou.mybatisplus.generator.config.po.TableField;
9 10 import lombok.Data;
10 11 import lombok.EqualsAndHashCode;
11 12 import lombok.experimental.Accessors;
... ... @@ -42,6 +43,7 @@ public class CodegenColumnDO extends BaseDO {
42 43 private String columnName;
43 44 /**
44 45 * 字段类型
  46 + * 关联 {@link TableField#getColumnType()}}
45 47 */
46 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 1 package cn.iocoder.yudao.module.infra.service;
2 2  
3 3 import cn.hutool.core.util.StrUtil;
4   -import com.baomidou.mybatisplus.generator.IDatabaseQuery.DefaultDatabaseQuery;
  4 +import com.baomidou.mybatisplus.generator.query.DefaultQuery;
5 5 import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
6 6 import com.baomidou.mybatisplus.generator.config.builder.ConfigBuilder;
7 7 import com.baomidou.mybatisplus.generator.config.po.TableInfo;
... ... @@ -19,7 +19,7 @@ public class DefaultDatabaseQueryTest {
19 19  
20 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 24 long time = System.currentTimeMillis();
25 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 1 package cn.iocoder.yudao.module.visualization.framework.jmreport.config;
2 2  
  3 +import cn.iocoder.yudao.framework.security.config.SecurityProperties;
3 4 import cn.iocoder.yudao.module.system.api.oauth2.OAuth2TokenApi;
4 5 import cn.iocoder.yudao.module.visualization.framework.jmreport.core.service.JmReportTokenServiceImpl;
5 6 import org.jeecg.modules.jmreport.api.JmReportTokenServiceI;
... ... @@ -18,8 +19,8 @@ public class JmReportConfiguration {
18 19  
19 20 @Bean
20 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 1 package cn.iocoder.yudao.module.visualization.framework.jmreport.core.service;
2 2  
  3 +import cn.hutool.core.util.ObjectUtil;
3 4 import cn.hutool.core.util.StrUtil;
4 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 8 import cn.iocoder.yudao.framework.security.core.LoginUser;
6 9 import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
7 10 import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder;
... ... @@ -10,6 +13,10 @@ import cn.iocoder.yudao.module.system.api.oauth2.OAuth2TokenApi;
10 13 import cn.iocoder.yudao.module.system.api.oauth2.dto.OAuth2AccessTokenCheckRespDTO;
11 14 import lombok.RequiredArgsConstructor;
12 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 22 * {@link JmReportTokenServiceI} 实现类,提供积木报表的 Token 校验、用户信息的查询等功能
... ... @@ -19,8 +26,37 @@ import org.jeecg.modules.jmreport.api.JmReportTokenServiceI;
19 26 @RequiredArgsConstructor
20 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 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 61 * 校验 Token 是否有效,即验证通过
26 62 *
... ... @@ -29,8 +65,40 @@ public class JmReportTokenServiceImpl implements JmReportTokenServiceI {
29 65 */
30 66 @Override
31 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 100 if (StrUtil.isEmpty(token)) {
33   - return false;
  101 + return null;
34 102 }
35 103 // TODO 如下的实现不算特别优雅,主要咱是不想搞的太复杂,所以参考对应的 Filter 先实现了
36 104  
... ... @@ -41,7 +109,7 @@ public class JmReportTokenServiceImpl implements JmReportTokenServiceI {
41 109 try {
42 110 OAuth2AccessTokenCheckRespDTO accessToken = oauth2TokenApi.checkAccessToken(token);
43 111 if (accessToken == null) {
44   - return false;
  112 + return null;
45 113 }
46 114 user = new LoginUser().setId(accessToken.getUserId()).setUserType(accessToken.getUserType())
47 115 .setTenantId(accessToken.getTenantId()).setScopes(accessToken.getScopes());
... ... @@ -49,7 +117,7 @@ public class JmReportTokenServiceImpl implements JmReportTokenServiceI {
49 117 // do nothing:如果报错,说明认证失败,则返回 false 即可
50 118 }
51 119 if (user == null) {
52   - return false;
  120 + return null;
53 121 }
54 122 SecurityFrameworkUtils.setLoginUser(user, WebFrameworkUtils.getRequest());
55 123  
... ... @@ -57,21 +125,7 @@ public class JmReportTokenServiceImpl implements JmReportTokenServiceI {
57 125 // 目的:基于 LoginUser 获得到的租户编号,设置到 Tenant 上下文,避免查询数据库时的报错
58 126 TenantContextHolder.setIgnore(false);
59 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 34 | [TypeScript](https://www.typescriptlang.org/docs/) | JavaScript 的超集 | 4.9.4 |
35 35 | [pinia](https://pinia.vuejs.org/) | Vue 存储库 替代 vuex5 | 2.0.28 |
36 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 38 | [vue-i18n](https://kazupon.github.io/vue-i18n/zh/introduction.html/) | 国际化 | 9.2.2 |
39 39 | [vue-router](https://router.vuejs.org/) | vue 路由 | 4.1.6 |
40 40 | [windicss](https://cn.windicss.org/) | 下一代工具优先的 CSS 框架 | 3.5.6 |
... ...
yudao-ui-admin-vue3/package.json
1 1 {
2 2 "name": "yudao-ui-admin-vue3",
3   - "version": "1.6.6-snapshot.1901",
  3 + "version": "1.6.6-snapshot.1911",
4 4 "description": "基于vue3、vite4、element-plus、typesScript",
5 5 "author": "xingyu",
6 6 "private": false,
... ... @@ -50,14 +50,14 @@
50 50 "vue-i18n": "9.2.2",
51 51 "vue-router": "^4.1.6",
52 52 "vue-types": "^5.0.2",
53   - "vxe-table": "^4.3.7",
  53 + "vxe-table": "^4.3.9",
54 54 "web-storage-cache": "^1.1.1",
55 55 "xe-utils": "^3.5.7"
56 56 },
57 57 "devDependencies": {
58   - "@commitlint/cli": "^17.4.0",
  58 + "@commitlint/cli": "^17.4.1",
59 59 "@commitlint/config-conventional": "^17.4.0",
60   - "@iconify/json": "^2.2.2",
  60 + "@iconify/json": "^2.2.5",
61 61 "@intlify/unplugin-vue-i18n": "^0.8.1",
62 62 "@purge-icons/generated": "^0.9.0",
63 63 "@types/intro.js": "^5.1.0",
... ... @@ -66,8 +66,8 @@
66 66 "@types/nprogress": "^0.2.0",
67 67 "@types/qrcode": "^1.5.0",
68 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 71 "@vitejs/plugin-legacy": "^3.0.1",
72 72 "@vitejs/plugin-vue": "^4.0.0",
73 73 "@vitejs/plugin-vue-jsx": "^3.0.0",
... ... @@ -75,14 +75,14 @@
75 75 "consola": "^2.15.3",
76 76 "eslint": "^8.31.0",
77 77 "eslint-config-prettier": "^8.6.0",
78   - "eslint-define-config": "^1.13.0",
  78 + "eslint-define-config": "^1.14.0",
79 79 "eslint-plugin-prettier": "^4.2.1",
80 80 "eslint-plugin-vue": "^9.8.0",
81 81 "lint-staged": "^13.1.0",
82   - "postcss": "^8.4.20",
  82 + "postcss": "^8.4.21",
83 83 "postcss-html": "^1.5.0",
84 84 "postcss-scss": "^4.0.6",
85   - "prettier": "^2.8.1",
  85 + "prettier": "^2.8.2",
86 86 "rimraf": "^3.0.2",
87 87 "rollup": "^3.9.1",
88 88 "sass": "^1.57.1",
... ... @@ -91,7 +91,7 @@
91 91 "stylelint-config-prettier": "^9.0.4",
92 92 "stylelint-config-recommended": "^9.0.0",
93 93 "stylelint-config-standard": "^29.0.0",
94   - "stylelint-order": "^5.0.0",
  94 + "stylelint-order": "^6.0.1",
95 95 "terser": "^5.16.1",
96 96 "typescript": "4.9.4",
97 97 "vite": "4.0.4",
... ... @@ -104,7 +104,7 @@
104 104 "vite-plugin-svg-icons": "^2.0.1",
105 105 "vite-plugin-vue-setup-extend": "^0.4.0",
106 106 "vite-plugin-windicss": "^1.8.10",
107   - "vue-tsc": "^1.0.22",
  107 + "vue-tsc": "^1.0.24",
108 108 "windicss": "^3.5.6"
109 109 },
110 110 "engines": {
... ...
yudao-ui-admin-vue3/pnpm-lock.yaml
1 1 lockfileVersion: 5.4
2 2  
3 3 specifiers:
4   - '@commitlint/cli': ^17.4.0
  4 + '@commitlint/cli': ^17.4.1
5 5 '@commitlint/config-conventional': ^17.4.0
6 6 '@iconify/iconify': ^3.0.1
7   - '@iconify/json': ^2.2.2
  7 + '@iconify/json': ^2.2.5
8 8 '@intlify/unplugin-vue-i18n': ^0.8.1
9 9 '@purge-icons/generated': ^0.9.0
10 10 '@types/intro.js': ^5.1.0
... ... @@ -13,8 +13,8 @@ specifiers:
13 13 '@types/nprogress': ^0.2.0
14 14 '@types/qrcode': ^1.5.0
15 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 18 '@vitejs/plugin-legacy': ^3.0.1
19 19 '@vitejs/plugin-vue': ^4.0.0
20 20 '@vitejs/plugin-vue-jsx': ^3.0.0
... ... @@ -34,7 +34,7 @@ specifiers:
34 34 element-plus: 2.2.28
35 35 eslint: ^8.31.0
36 36 eslint-config-prettier: ^8.6.0
37   - eslint-define-config: ^1.13.0
  37 + eslint-define-config: ^1.14.0
38 38 eslint-plugin-prettier: ^4.2.1
39 39 eslint-plugin-vue: ^9.8.0
40 40 intro.js: ^6.0.0
... ... @@ -44,10 +44,10 @@ specifiers:
44 44 mitt: ^3.0.0
45 45 nprogress: ^0.2.0
46 46 pinia: ^2.0.28
47   - postcss: ^8.4.20
  47 + postcss: ^8.4.21
48 48 postcss-html: ^1.5.0
49 49 postcss-scss: ^4.0.6
50   - prettier: ^2.8.1
  50 + prettier: ^2.8.2
51 51 qrcode: ^1.5.1
52 52 qs: ^6.11.0
53 53 rimraf: ^3.0.2
... ... @@ -58,7 +58,7 @@ specifiers:
58 58 stylelint-config-prettier: ^9.0.4
59 59 stylelint-config-recommended: ^9.0.0
60 60 stylelint-config-standard: ^29.0.0
61   - stylelint-order: ^5.0.0
  61 + stylelint-order: ^6.0.1
62 62 terser: ^5.16.1
63 63 typescript: 4.9.4
64 64 url: ^0.11.0
... ... @@ -75,9 +75,9 @@ specifiers:
75 75 vue: 3.2.45
76 76 vue-i18n: 9.2.2
77 77 vue-router: ^4.1.6
78   - vue-tsc: ^1.0.22
  78 + vue-tsc: ^1.0.24
79 79 vue-types: ^5.0.2
80   - vxe-table: ^4.3.7
  80 + vxe-table: ^4.3.9
81 81 web-storage-cache: ^1.1.1
82 82 windicss: ^3.5.6
83 83 xe-utils: ^3.5.7
... ... @@ -109,14 +109,14 @@ dependencies:
109 109 vue-i18n: 9.2.2_vue@3.2.45
110 110 vue-router: 4.1.6_vue@3.2.45
111 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 113 web-storage-cache: 1.1.1
114 114 xe-utils: 3.5.7
115 115  
116 116 devDependencies:
117   - '@commitlint/cli': 17.4.0_@types+node@18.11.18
  117 + '@commitlint/cli': 17.4.1
118 118 '@commitlint/config-conventional': 17.4.0
119   - '@iconify/json': 2.2.2
  119 + '@iconify/json': 2.2.5
120 120 '@intlify/unplugin-vue-i18n': 0.8.1_vue-i18n@9.2.2
121 121 '@purge-icons/generated': 0.9.0
122 122 '@types/intro.js': 5.1.0
... ... @@ -125,23 +125,23 @@ devDependencies:
125 125 '@types/nprogress': 0.2.0
126 126 '@types/qrcode': 1.5.0
127 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 130 '@vitejs/plugin-legacy': 3.0.1_terser@5.16.1+vite@4.0.4
131 131 '@vitejs/plugin-vue': 4.0.0_vite@4.0.4+vue@3.2.45
132 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 134 consola: 2.15.3
135 135 eslint: 8.31.0
136 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 139 eslint-plugin-vue: 9.8.0_eslint@8.31.0
140 140 lint-staged: 13.1.0
141   - postcss: 8.4.20
  141 + postcss: 8.4.21
142 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 145 rimraf: 3.0.2
146 146 rollup: 3.9.1
147 147 sass: 1.57.1
... ... @@ -150,7 +150,7 @@ devDependencies:
150 150 stylelint-config-prettier: 9.0.4_stylelint@14.16.1
151 151 stylelint-config-recommended: 9.0.0_stylelint@14.16.1
152 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 154 terser: 5.16.1
155 155 typescript: 4.9.4
156 156 vite: 4.0.4_zxbrnrc4iyldik6mikh3pswz4i
... ... @@ -163,7 +163,7 @@ devDependencies:
163 163 vite-plugin-svg-icons: 2.0.1_vite@4.0.4
164 164 vite-plugin-vue-setup-extend: 0.4.0_vite@4.0.4
165 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 167 windicss: 3.5.6
168 168  
169 169 packages:
... ... @@ -506,14 +506,14 @@ packages:
506 506 '@babel/helper-validator-identifier': 7.19.1
507 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 511 engines: {node: '>=v14'}
512 512 hasBin: true
513 513 dependencies:
514 514 '@commitlint/format': 17.4.0
515 515 '@commitlint/lint': 17.4.0
516   - '@commitlint/load': 17.4.0_@types+node@18.11.18
  516 + '@commitlint/load': 17.4.1
517 517 '@commitlint/read': 17.4.0
518 518 '@commitlint/types': 17.4.0
519 519 execa: 5.1.1
... ... @@ -524,7 +524,6 @@ packages:
524 524 transitivePeerDependencies:
525 525 - '@swc/core'
526 526 - '@swc/wasm'
527   - - '@types/node'
528 527 dev: true
529 528  
530 529 /@commitlint/config-conventional/17.4.0:
... ... @@ -585,14 +584,15 @@ packages:
585 584 '@commitlint/types': 17.4.0
586 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 589 engines: {node: '>=v14'}
591 590 dependencies:
592 591 '@commitlint/config-validator': 17.4.0
593 592 '@commitlint/execute-rule': 17.4.0
594 593 '@commitlint/resolve-extends': 17.4.0
595 594 '@commitlint/types': 17.4.0
  595 + '@types/node': 18.11.18
596 596 chalk: 4.1.2
597 597 cosmiconfig: 8.0.0
598 598 cosmiconfig-typescript-loader: 4.2.0_bxtyj3et3xbsdyxhh3oblnfbj4
... ... @@ -605,7 +605,6 @@ packages:
605 605 transitivePeerDependencies:
606 606 - '@swc/core'
607 607 - '@swc/wasm'
608   - - '@types/node'
609 608 dev: true
610 609  
611 610 /@commitlint/message/17.4.0:
... ... @@ -682,14 +681,14 @@ packages:
682 681 '@jridgewell/trace-mapping': 0.3.9
683 682 dev: true
684 683  
685   - /@csstools/selector-specificity/2.0.2_2xshye3abirqjlplmebvmaxyna:
  684 + /@csstools/selector-specificity/2.0.2_wajs5nedgkikc5pcuwett7legi:
686 685 resolution: {integrity: sha512-IkpVW/ehM1hWKln4fCA3NzJU8KwD+kIOvPZA4cqxoJHtE21CCzjyp+Kxbu0i5I4tBNOlXPL9mjwnWlL0VEG4Fg==}
687 686 engines: {node: ^12 || ^14 || >=16}
688 687 peerDependencies:
689 688 postcss: ^8.2
690 689 postcss-selector-parser: ^6.0.10
691 690 dependencies:
692   - postcss: 8.4.20
  691 + postcss: 8.4.21
693 692 postcss-selector-parser: 6.0.11
694 693 dev: true
695 694  
... ... @@ -964,8 +963,8 @@ packages:
964 963 dependencies:
965 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 968 dependencies:
970 969 '@iconify/types': 2.0.0
971 970 pathe: 1.0.0
... ... @@ -986,8 +985,8 @@ packages:
986 985 vue-i18n:
987 986 optional: true
988 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 990 jsonc-eslint-parser: 1.4.1
992 991 source-map: 0.6.1
993 992 vue-i18n: 9.2.2_vue@3.2.45
... ... @@ -1016,11 +1015,11 @@ packages:
1016 1015 '@intlify/shared': 9.2.2
1017 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 1020 engines: {node: '>= 14'}
1022 1021 dependencies:
1023   - '@intlify/shared': 9.3.0-beta.11
  1022 + '@intlify/shared': 9.3.0-beta.14
1024 1023 source-map: 0.6.1
1025 1024 dev: true
1026 1025  
... ... @@ -1028,13 +1027,8 @@ packages:
1028 1027 resolution: {integrity: sha512-wRwTpsslgZS5HNyM7uDQYZtxnbI12aGiBZURX3BTR9RFIKKRWpllTsgzHWvj3HKm3Y2Sh5LPC1r0PDCKEhVn9Q==}
1029 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 1032 engines: {node: '>= 14'}
1039 1033 dev: true
1040 1034  
... ... @@ -1054,7 +1048,7 @@ packages:
1054 1048 optional: true
1055 1049 dependencies:
1056 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 1052 '@rollup/pluginutils': 4.2.1
1059 1053 '@vue/compiler-sfc': 3.2.45
1060 1054 debug: 4.3.4
... ... @@ -1285,8 +1279,8 @@ packages:
1285 1279 resolution: {integrity: sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==}
1286 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 1284 engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
1291 1285 peerDependencies:
1292 1286 '@typescript-eslint/parser': ^5.0.0
... ... @@ -1296,10 +1290,10 @@ packages:
1296 1290 typescript:
1297 1291 optional: true
1298 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 1297 debug: 4.3.4
1304 1298 eslint: 8.31.0
1305 1299 ignore: 5.2.1
... ... @@ -1312,8 +1306,8 @@ packages:
1312 1306 - supports-color
1313 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 1311 engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
1318 1312 peerDependencies:
1319 1313 eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
... ... @@ -1322,9 +1316,9 @@ packages:
1322 1316 typescript:
1323 1317 optional: true
1324 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 1322 debug: 4.3.4
1329 1323 eslint: 8.31.0
1330 1324 typescript: 4.9.4
... ... @@ -1332,16 +1326,16 @@ packages:
1332 1326 - supports-color
1333 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 1331 engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
1338 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 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 1339 engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
1346 1340 peerDependencies:
1347 1341 eslint: '*'
... ... @@ -1350,8 +1344,8 @@ packages:
1350 1344 typescript:
1351 1345 optional: true
1352 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 1349 debug: 4.3.4
1356 1350 eslint: 8.31.0
1357 1351 tsutils: 3.21.0_typescript@4.9.4
... ... @@ -1360,13 +1354,13 @@ packages:
1360 1354 - supports-color
1361 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 1359 engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
1366 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 1364 engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
1371 1365 peerDependencies:
1372 1366 typescript: '*'
... ... @@ -1374,8 +1368,8 @@ packages:
1374 1368 typescript:
1375 1369 optional: true
1376 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 1373 debug: 4.3.4
1380 1374 globby: 11.1.0
1381 1375 is-glob: 4.0.3
... ... @@ -1386,17 +1380,17 @@ packages:
1386 1380 - supports-color
1387 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 1385 engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
1392 1386 peerDependencies:
1393 1387 eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
1394 1388 dependencies:
1395 1389 '@types/json-schema': 7.0.11
1396 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 1394 eslint: 8.31.0
1401 1395 eslint-scope: 5.1.1
1402 1396 eslint-utils: 3.0.0_eslint@8.31.0
... ... @@ -1406,11 +1400,11 @@ packages:
1406 1400 - typescript
1407 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 1405 engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
1412 1406 dependencies:
1413   - '@typescript-eslint/types': 5.48.0
  1407 + '@typescript-eslint/types': 5.48.1
1414 1408 eslint-visitor-keys: 3.3.0
1415 1409 dev: true
1416 1410  
... ... @@ -1498,30 +1492,30 @@ packages:
1498 1492 vue: 3.2.45
1499 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 1497 dependencies:
1504   - '@volar/source-map': 1.0.22
  1498 + '@volar/source-map': 1.0.24
1505 1499 muggle-string: 0.1.0
1506 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 1504 dependencies:
1511 1505 muggle-string: 0.1.0
1512 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 1510 dependencies:
1517   - '@volar/language-core': 1.0.22
  1511 + '@volar/language-core': 1.0.24
1518 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 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 1519 '@vue/compiler-dom': 3.2.45
1526 1520 '@vue/compiler-sfc': 3.2.45
1527 1521 '@vue/reactivity': 3.2.45
... ... @@ -1530,11 +1524,11 @@ packages:
1530 1524 vue-template-compiler: 2.7.14
1531 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 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 1532 dev: true
1539 1533  
1540 1534 /@vue/babel-helper-vue-transform-on/1.0.2:
... ... @@ -1583,7 +1577,7 @@ packages:
1583 1577 '@vue/shared': 3.2.45
1584 1578 estree-walker: 2.0.2
1585 1579 magic-string: 0.25.9
1586   - postcss: 8.4.20
  1580 + postcss: 8.4.21
1587 1581 source-map: 0.6.1
1588 1582  
1589 1583 /@vue/compiler-ssr/3.2.45:
... ... @@ -2066,7 +2060,7 @@ packages:
2066 2060 hasBin: true
2067 2061 dev: true
2068 2062  
2069   - /autoprefixer/10.4.13_postcss@8.4.20:
  2063 + /autoprefixer/10.4.13_postcss@8.4.21:
2070 2064 resolution: {integrity: sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==}
2071 2065 engines: {node: ^10 || ^12 || >=14}
2072 2066 hasBin: true
... ... @@ -2078,7 +2072,7 @@ packages:
2078 2072 fraction.js: 4.2.0
2079 2073 normalize-range: 0.1.2
2080 2074 picocolors: 1.0.0
2081   - postcss: 8.4.20
  2075 + postcss: 8.4.21
2082 2076 postcss-value-parser: 4.2.0
2083 2077 dev: true
2084 2078  
... ... @@ -3013,12 +3007,12 @@ packages:
3013 3007 eslint: 8.31.0
3014 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 3012 engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0, npm: '>=6.14.13', pnpm: '>= 7.0.0'}
3019 3013 dev: true
3020 3014  
3021   - /eslint-plugin-prettier/4.2.1_32m5uc2milwdw3tnkcq5del26y:
  3015 + /eslint-plugin-prettier/4.2.1_iu5s7nk6dw7o3tajefwfiqfmge:
3022 3016 resolution: {integrity: sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==}
3023 3017 engines: {node: '>=12.0.0'}
3024 3018 peerDependencies:
... ... @@ -3031,7 +3025,7 @@ packages:
3031 3025 dependencies:
3032 3026 eslint: 8.31.0
3033 3027 eslint-config-prettier: 8.6.0_eslint@8.31.0
3034   - prettier: 2.8.1
  3028 + prettier: 2.8.2
3035 3029 prettier-linter-helpers: 1.0.0
3036 3030 dev: true
3037 3031  
... ... @@ -4506,7 +4500,7 @@ packages:
4506 4500 dev: false
4507 4501  
4508 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 4504 engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
4511 4505 hasBin: true
4512 4506  
... ... @@ -4848,8 +4842,8 @@ packages:
4848 4842 dependencies:
4849 4843 htmlparser2: 8.0.1
4850 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 4847 dev: true
4854 4848  
4855 4849 /postcss-media-query-parser/0.2.3:
... ... @@ -4868,22 +4862,22 @@ packages:
4868 4862 resolution: {integrity: sha512-HvExULSwLqHLgUy1rl3ANIqCsvMS0WHss2UOsXhXnQaZ9VCc2oBvIpXrl00IUFT5ZDITME0o6oiXeiHr2SAIfw==}
4869 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 4866 resolution: {integrity: sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==}
4873 4867 engines: {node: '>=12.0'}
4874 4868 peerDependencies:
4875 4869 postcss: ^8.3.3
4876 4870 dependencies:
4877   - postcss: 8.4.20
  4871 + postcss: 8.4.21
4878 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 4875 resolution: {integrity: sha512-rLDPhJY4z/i4nVFZ27j9GqLxj1pwxE80eAzUNRMXtcpipFYIeowerzBgG3yJhMtObGEXidtIgbUpQ3eLDsf5OQ==}
4882 4876 engines: {node: '>=12.0'}
4883 4877 peerDependencies:
4884 4878 postcss: ^8.4.19
4885 4879 dependencies:
4886   - postcss: 8.4.20
  4880 + postcss: 8.4.21
4887 4881 dev: true
4888 4882  
4889 4883 /postcss-selector-parser/6.0.10:
... ... @@ -4902,12 +4896,12 @@ packages:
4902 4896 util-deprecate: 1.0.2
4903 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 4901 peerDependencies:
4908   - postcss: ^8.3.9
  4902 + postcss: ^8.4.20
4909 4903 dependencies:
4910   - postcss: 8.4.20
  4904 + postcss: 8.4.21
4911 4905 dev: true
4912 4906  
4913 4907 /postcss-value-parser/4.2.0:
... ... @@ -4924,8 +4918,8 @@ packages:
4924 4918 supports-color: 3.2.3
4925 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 4923 engines: {node: ^10 || ^12 || >=14}
4930 4924 dependencies:
4931 4925 nanoid: 3.3.4
... ... @@ -4983,8 +4977,8 @@ packages:
4983 4977 fast-diff: 1.2.0
4984 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 4982 engines: {node: '>=10.13.0'}
4989 4983 hasBin: true
4990 4984 dev: true
... ... @@ -5428,7 +5422,7 @@ packages:
5428 5422 dev: true
5429 5423  
5430 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 5426 engines: {node: '>=0.10.0'}
5433 5427  
5434 5428 /source-map-resolve/0.5.3:
... ... @@ -5636,13 +5630,13 @@ packages:
5636 5630 stylelint-config-recommended: 9.0.0_stylelint@14.16.1
5637 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 5635 peerDependencies:
5642 5636 stylelint: ^14.0.0
5643 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 5640 stylelint: 14.16.1
5647 5641 dev: true
5648 5642  
... ... @@ -5651,7 +5645,7 @@ packages:
5651 5645 engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
5652 5646 hasBin: true
5653 5647 dependencies:
5654   - '@csstools/selector-specificity': 2.0.2_2xshye3abirqjlplmebvmaxyna
  5648 + '@csstools/selector-specificity': 2.0.2_wajs5nedgkikc5pcuwett7legi
5655 5649 balanced-match: 2.0.0
5656 5650 colord: 2.9.3
5657 5651 cosmiconfig: 7.1.0
... ... @@ -5674,10 +5668,10 @@ packages:
5674 5668 micromatch: 4.0.5
5675 5669 normalize-path: 3.0.0
5676 5670 picocolors: 1.0.0
5677   - postcss: 8.4.20
  5671 + postcss: 8.4.21
5678 5672 postcss-media-query-parser: 0.2.3
5679 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 5675 postcss-selector-parser: 6.0.11
5682 5676 postcss-value-parser: 4.2.0
5683 5677 resolve-from: 5.0.0
... ... @@ -6211,7 +6205,7 @@ packages:
6211 6205 dependencies:
6212 6206 '@types/node': 18.11.18
6213 6207 esbuild: 0.16.5
6214   - postcss: 8.4.20
  6208 + postcss: 8.4.21
6215 6209 resolve: 1.22.1
6216 6210 rollup: 3.9.1
6217 6211 sass: 1.57.1
... ... @@ -6281,14 +6275,14 @@ packages:
6281 6275 he: 1.2.0
6282 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 6280 hasBin: true
6287 6281 peerDependencies:
6288 6282 typescript: '*'
6289 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 6286 typescript: 4.9.4
6293 6287 dev: true
6294 6288  
... ... @@ -6314,8 +6308,8 @@ packages:
6314 6308 '@vue/server-renderer': 3.2.45_vue@3.2.45
6315 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 6313 peerDependencies:
6320 6314 vue: ^3.2.28
6321 6315 xe-utils: ^3.5.0
... ...
yudao-ui-admin/src/styles/index.scss
... ... @@ -129,7 +129,7 @@ input, textarea{
129 129 }
130 130  
131 131 .el-scrollbar__view{
132   - overflow-x: hidden;
  132 +// overflow-x: hidden;
133 133 }
134 134  
135 135 .el-rate{
... ...
yudao-ui-admin/src/views/infra/redis/index.vue
... ... @@ -136,8 +136,8 @@
136 136  
137 137 <script>
138 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 141 export default {
142 142 name: "Server",
143 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 10 //微信小程序的一键登录
11 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 15 export const logout = data => http.post('/member/auth/logout', data)
... ...
yudao-ui-app/store/getters.js
1 1 const getters = {
2 2 accessToken: state => state.user.accessToken,
  3 + refreshToken: state => state.user.refreshToken,
3 4 userInfo: state => state.user.userInfo,
4 5 hasLogin: state => !!state.user.accessToken
5 6 }
... ...
yudao-ui-app/utils/request/responseInterceptors.js
... ... @@ -30,13 +30,16 @@ module.exports = vm =&gt; {
30 30 if (!isRefreshToken) {
31 31 isRefreshToken = true
32 32 // 1. 如果获取不到刷新令牌,则只能执行登出操作
33   - if (!vm.$store.getters.refreshToken()) {
  33 + if (!vm.$store.getters.refreshToken) {
34 34 vm.$store.commit('CLEAR_LOGIN_INFO')
35 35 return Promise.reject(res)
36 36 }
37 37 // 2. 进行刷新访问令牌
38 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 43 // 2.1 刷新成功,则回放队列的请求 + 当前请求
41 44 vm.$store.commit('SET_TOKEN', refreshTokenRes.data)
42 45 requestList.forEach(cb => cb())
... ...