mirror of
https://gitee.com/huangge1199_admin/vue-pro.git
synced 2024-11-26 17:21:53 +08:00
Merge branch 'master' of https://gitee.com/zhijiantianya/ruoyi-vue-pro into issues/I62TCM
# Conflicts: # yudao-module-visualization/yudao-module-visualization-biz/src/main/java/cn/iocoder/yudao/module/visualization/framework/jmreport/core/service/JmReportTokenServiceImpl.java
This commit is contained in:
commit
94bf24ad45
@ -262,5 +262,6 @@ INSERT INTO `system_menu` VALUES (1266, '客户端更新', 'system:oauth2-client
|
|||||||
INSERT INTO `system_menu` VALUES (1267, '客户端删除', 'system:oauth2-client:delete', 3, 4, 1263, '', '', '', 0, b'1', b'1', '', '2022-05-10 16:26:33', '1', '2022-05-11 00:31:33', b'0');
|
INSERT INTO `system_menu` VALUES (1267, '客户端删除', 'system:oauth2-client:delete', 3, 4, 1263, '', '', '', 0, b'1', b'1', '', '2022-05-10 16:26:33', '1', '2022-05-11 00:31:33', b'0');
|
||||||
INSERT INTO `system_menu` VALUES (1281, '可视化报表', '', 1, 12, 0, '/visualization', 'ep:histogram', NULL, 0, b'1', b'1', '1', '2022-07-10 20:22:15', '1', '2022-07-10 20:33:30', b'0');
|
INSERT INTO `system_menu` VALUES (1281, '可视化报表', '', 1, 12, 0, '/visualization', 'ep:histogram', NULL, 0, b'1', b'1', '1', '2022-07-10 20:22:15', '1', '2022-07-10 20:33:30', b'0');
|
||||||
INSERT INTO `system_menu` VALUES (1282, '积木报表', '', 2, 1, 1281, 'jimu-report', 'ep:histogram', 'visualization/jmreport/index', 0, b'1', b'1', '1', '2022-07-10 20:26:36', '1', '2022-07-28 21:17:34', b'0');
|
INSERT INTO `system_menu` VALUES (1282, '积木报表', '', 2, 1, 1281, 'jimu-report', 'ep:histogram', 'visualization/jmreport/index', 0, b'1', b'1', '1', '2022-07-10 20:26:36', '1', '2022-07-28 21:17:34', b'0');
|
||||||
|
INSERT INTO `system_menu` VALUES (1283, 'webSocket连接', '', 2, 14, 2, 'webSocket', 'ep:turn-off', 'infra/webSocket/index', 0, b'1', b'1', '1', '2023-01-01 11:43:04', '1', '2023-01-01 11:43:04', b'0');
|
||||||
|
|
||||||
SET FOREIGN_KEY_CHECKS = 1;
|
SET FOREIGN_KEY_CHECKS = 1;
|
||||||
|
@ -1710,6 +1710,8 @@ INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_i
|
|||||||
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `status`, `visible`, `keep_alive`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1267, '客户端删除', 'system:oauth2-client:delete', 3, 4, 1263, '', '', '', 0, b'1', b'1', '', '2022-05-10 16:26:33', '1', '2022-05-11 00:31:33', b'0');
|
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `status`, `visible`, `keep_alive`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1267, '客户端删除', 'system:oauth2-client:delete', 3, 4, 1263, '', '', '', 0, b'1', b'1', '', '2022-05-10 16:26:33', '1', '2022-05-11 00:31:33', b'0');
|
||||||
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `status`, `visible`, `keep_alive`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1281, '可视化报表', '', 1, 12, 0, '/visualization', 'chart', NULL, 0, b'1', b'1', '1', '2022-07-10 20:22:15', '1', '2022-07-10 20:33:30', b'0');
|
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `status`, `visible`, `keep_alive`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1281, '可视化报表', '', 1, 12, 0, '/visualization', 'chart', NULL, 0, b'1', b'1', '1', '2022-07-10 20:22:15', '1', '2022-07-10 20:33:30', b'0');
|
||||||
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `status`, `visible`, `keep_alive`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1282, '积木报表', '', 2, 1, 1281, 'jimu-report', 'example', 'visualization/jmreport/index', 0, b'1', b'1', '1', '2022-07-10 20:26:36', '1', '2022-07-28 21:17:34', b'0');
|
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `status`, `visible`, `keep_alive`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1282, '积木报表', '', 2, 1, 1281, 'jimu-report', 'example', 'visualization/jmreport/index', 0, b'1', b'1', '1', '2022-07-10 20:26:36', '1', '2022-07-28 21:17:34', b'0');
|
||||||
|
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `status`, `visible`, `keep_alive`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1283, 'webSocket连接', '', 2, 14, 2, 'webSocket', 'message', 'infra/webSocket/index', 0, b'1', b'1', '1', '2023-01-01 11:43:04', '1', '2023-01-01 11:43:04', b'0');
|
||||||
|
|
||||||
COMMIT;
|
COMMIT;
|
||||||
|
|
||||||
-- ----------------------------
|
-- ----------------------------
|
||||||
|
@ -1344,6 +1344,7 @@ CREATE TABLE `jimu_report_share` (
|
|||||||
`last_update_time` datetime NULL DEFAULT NULL COMMENT '最后更新时间',
|
`last_update_time` datetime NULL DEFAULT NULL COMMENT '最后更新时间',
|
||||||
`term_of_validity` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '有效期(0:永久有效,1:1天,2:7天)',
|
`term_of_validity` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '有效期(0:永久有效,1:1天,2:7天)',
|
||||||
`status` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '是否过期(0未过期,1已过期)',
|
`status` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '是否过期(0未过期,1已过期)',
|
||||||
|
`preview_lock_status` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '密码锁状态',
|
||||||
PRIMARY KEY (`id`) USING BTREE
|
PRIMARY KEY (`id`) USING BTREE
|
||||||
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '积木报表预览权限表' ROW_FORMAT = Dynamic;
|
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '积木报表预览权限表' ROW_FORMAT = Dynamic;
|
||||||
|
|
||||||
|
@ -23,8 +23,8 @@
|
|||||||
<servlet.versoin>2.5</servlet.versoin>
|
<servlet.versoin>2.5</servlet.versoin>
|
||||||
<!-- DB 相关 -->
|
<!-- DB 相关 -->
|
||||||
<druid.version>1.2.15</druid.version>
|
<druid.version>1.2.15</druid.version>
|
||||||
<mybatis-plus.version>3.5.3</mybatis-plus.version>
|
<mybatis-plus.version>3.5.3.1</mybatis-plus.version>
|
||||||
<mybatis-plus-generator.version>3.5.2</mybatis-plus-generator.version>
|
<mybatis-plus-generator.version>3.5.3.1</mybatis-plus-generator.version>
|
||||||
<dynamic-datasource.version>3.6.1</dynamic-datasource.version>
|
<dynamic-datasource.version>3.6.1</dynamic-datasource.version>
|
||||||
<redisson.version>3.18.0</redisson.version>
|
<redisson.version>3.18.0</redisson.version>
|
||||||
<!-- 服务保障相关 -->
|
<!-- 服务保障相关 -->
|
||||||
@ -595,6 +595,12 @@
|
|||||||
<artifactId>xercesImpl</artifactId>
|
<artifactId>xercesImpl</artifactId>
|
||||||
<version>${xercesImpl.version}</version>
|
<version>${xercesImpl.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<!-- SpringBoot Websocket -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-websocket</artifactId>
|
||||||
|
<version>${spring.boot.version}</version>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
</dependencyManagement>
|
</dependencyManagement>
|
||||||
|
|
||||||
|
@ -40,6 +40,7 @@
|
|||||||
|
|
||||||
<module>yudao-spring-boot-starter-flowable</module>
|
<module>yudao-spring-boot-starter-flowable</module>
|
||||||
<module>yudao-spring-boot-starter-captcha</module>
|
<module>yudao-spring-boot-starter-captcha</module>
|
||||||
|
<module>yudao-spring-boot-starter-websocket</module>
|
||||||
</modules>
|
</modules>
|
||||||
|
|
||||||
<artifactId>yudao-framework</artifactId>
|
<artifactId>yudao-framework</artifactId>
|
||||||
|
@ -129,6 +129,8 @@ public class YudaoWebSecurityConfigurerAdapter {
|
|||||||
.antMatchers(buildAppApi("/**")).permitAll()
|
.antMatchers(buildAppApi("/**")).permitAll()
|
||||||
// 1.5 验证码captcha 允许匿名访问
|
// 1.5 验证码captcha 允许匿名访问
|
||||||
.antMatchers("/captcha/get", "/captcha/check").permitAll()
|
.antMatchers("/captcha/get", "/captcha/check").permitAll()
|
||||||
|
// 1.6 webSocket 允许匿名访问
|
||||||
|
.antMatchers("/websocket/message").permitAll()
|
||||||
// ②:每个项目的自定义规则
|
// ②:每个项目的自定义规则
|
||||||
.and().authorizeRequests(registry -> // 下面,循环设置自定义规则
|
.and().authorizeRequests(registry -> // 下面,循环设置自定义规则
|
||||||
authorizeRequestsCustomizers.forEach(customizer -> customizer.customize(registry)))
|
authorizeRequestsCustomizers.forEach(customizer -> customizer.customize(registry)))
|
||||||
|
37
yudao-framework/yudao-spring-boot-starter-websocket/pom.xml
Normal file
37
yudao-framework/yudao-spring-boot-starter-websocket/pom.xml
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<parent>
|
||||||
|
<groupId>cn.iocoder.boot</groupId>
|
||||||
|
<artifactId>yudao-framework</artifactId>
|
||||||
|
<version>${revision}</version>
|
||||||
|
</parent>
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<artifactId>yudao-spring-boot-starter-websocket</artifactId>
|
||||||
|
<packaging>jar</packaging>
|
||||||
|
|
||||||
|
<name>${project.artifactId}</name>
|
||||||
|
<description>WebSocket</description>
|
||||||
|
<url>https://github.com/YunaiV/ruoyi-vue-pro</url>
|
||||||
|
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>cn.iocoder.boot</groupId>
|
||||||
|
<artifactId>yudao-common</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>cn.iocoder.boot</groupId>
|
||||||
|
<artifactId>yudao-spring-boot-starter-security</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-websocket</artifactId>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
</project>
|
@ -0,0 +1,14 @@
|
|||||||
|
package cn.iocoder.yudao.framework.websocket.config;
|
||||||
|
|
||||||
|
import cn.iocoder.yudao.framework.websocket.core.UserHandshakeInterceptor;
|
||||||
|
import org.springframework.boot.context.properties.EnableConfigurationProperties;
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.web.socket.server.HandshakeInterceptor;
|
||||||
|
|
||||||
|
@EnableConfigurationProperties(WebSocketProperties.class)
|
||||||
|
public class WebSocketHandlerConfig {
|
||||||
|
@Bean
|
||||||
|
public HandshakeInterceptor handshakeInterceptor() {
|
||||||
|
return new UserHandshakeInterceptor();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,29 @@
|
|||||||
|
package cn.iocoder.yudao.framework.websocket.config;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
import org.springframework.boot.context.properties.ConfigurationProperties;
|
||||||
|
import org.springframework.validation.annotation.Validated;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* WebSocket 配置项
|
||||||
|
*
|
||||||
|
* @author xingyu4j
|
||||||
|
*/
|
||||||
|
@ConfigurationProperties("yudao.websocket")
|
||||||
|
@Data
|
||||||
|
@Validated
|
||||||
|
public class WebSocketProperties {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 路径
|
||||||
|
*/
|
||||||
|
private String path = "";
|
||||||
|
/**
|
||||||
|
* 默认最多允许同时在线用户数
|
||||||
|
*/
|
||||||
|
private int maxOnlineCount = 0;
|
||||||
|
/**
|
||||||
|
* 是否保存session
|
||||||
|
*/
|
||||||
|
private boolean sessionMap = true;
|
||||||
|
}
|
@ -0,0 +1,34 @@
|
|||||||
|
package cn.iocoder.yudao.framework.websocket.config;
|
||||||
|
|
||||||
|
import org.springframework.boot.autoconfigure.AutoConfiguration;
|
||||||
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
|
||||||
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
||||||
|
import org.springframework.boot.context.properties.EnableConfigurationProperties;
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.web.socket.WebSocketHandler;
|
||||||
|
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
|
||||||
|
import org.springframework.web.socket.server.HandshakeInterceptor;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* WebSocket 自动配置
|
||||||
|
*
|
||||||
|
* @author xingyu4j
|
||||||
|
*/
|
||||||
|
@AutoConfiguration
|
||||||
|
// 允许使用 yudao.websocket.enable=false 禁用websocket
|
||||||
|
@ConditionalOnProperty(prefix = "yudao.websocket", value = "enable", matchIfMissing = true)
|
||||||
|
@EnableConfigurationProperties(WebSocketProperties.class)
|
||||||
|
public class YudaoWebSocketAutoConfiguration {
|
||||||
|
@Bean
|
||||||
|
@ConditionalOnMissingBean
|
||||||
|
public WebSocketConfigurer webSocketConfigurer(List<HandshakeInterceptor> handshakeInterceptor,
|
||||||
|
WebSocketHandler webSocketHandler,
|
||||||
|
WebSocketProperties webSocketProperties) {
|
||||||
|
|
||||||
|
return registry -> registry
|
||||||
|
.addHandler(webSocketHandler, webSocketProperties.getPath())
|
||||||
|
.addInterceptors(handshakeInterceptor.toArray(new HandshakeInterceptor[0]));
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,24 @@
|
|||||||
|
package cn.iocoder.yudao.framework.websocket.core;
|
||||||
|
|
||||||
|
import cn.iocoder.yudao.framework.security.core.LoginUser;
|
||||||
|
import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
|
||||||
|
import org.springframework.http.server.ServerHttpRequest;
|
||||||
|
import org.springframework.http.server.ServerHttpResponse;
|
||||||
|
import org.springframework.web.socket.WebSocketHandler;
|
||||||
|
import org.springframework.web.socket.server.HandshakeInterceptor;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public class UserHandshakeInterceptor implements HandshakeInterceptor {
|
||||||
|
@Override
|
||||||
|
public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object> attributes) throws Exception {
|
||||||
|
LoginUser loginUser = SecurityFrameworkUtils.getLoginUser();
|
||||||
|
attributes.put(WebSocketKeyDefine.LOGIN_USER, loginUser);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception exception) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,9 @@
|
|||||||
|
package cn.iocoder.yudao.framework.websocket.core;
|
||||||
|
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class WebSocketKeyDefine {
|
||||||
|
public static final String LOGIN_USER ="LOGIN_USER";
|
||||||
|
}
|
@ -0,0 +1,24 @@
|
|||||||
|
package cn.iocoder.yudao.framework.websocket.core;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.experimental.Accessors;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@Accessors(chain = true)
|
||||||
|
public class WebSocketMessageDO {
|
||||||
|
/**
|
||||||
|
* 接收消息的seesion
|
||||||
|
*/
|
||||||
|
private List<Object> seesionKeyList;
|
||||||
|
/**
|
||||||
|
* 发送消息
|
||||||
|
*/
|
||||||
|
private String msgText;
|
||||||
|
|
||||||
|
public static WebSocketMessageDO build(List<Object> seesionKeyList, String msgText) {
|
||||||
|
return new WebSocketMessageDO().setMsgText(msgText).setSeesionKeyList(seesionKeyList);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,36 @@
|
|||||||
|
package cn.iocoder.yudao.framework.websocket.core;
|
||||||
|
|
||||||
|
import org.springframework.web.socket.WebSocketSession;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
|
||||||
|
public final class WebSocketSessionHandler {
|
||||||
|
private WebSocketSessionHandler() {
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final Map<String, WebSocketSession> SESSION_MAP = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
|
public static void addSession(Object sessionKey, WebSocketSession session) {
|
||||||
|
SESSION_MAP.put(sessionKey.toString(), session);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void removeSession(Object sessionKey) {
|
||||||
|
SESSION_MAP.remove(sessionKey.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static WebSocketSession getSession(Object sessionKey) {
|
||||||
|
return SESSION_MAP.get(sessionKey.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Collection<WebSocketSession> getSessions() {
|
||||||
|
return SESSION_MAP.values();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Set<String> getSessionKeys() {
|
||||||
|
return SESSION_MAP.keySet();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,31 @@
|
|||||||
|
package cn.iocoder.yudao.framework.websocket.core;
|
||||||
|
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.web.socket.TextMessage;
|
||||||
|
import org.springframework.web.socket.WebSocketSession;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
@Slf4j
|
||||||
|
public class WebSocketUtils {
|
||||||
|
public static boolean sendMessage(WebSocketSession seesion, String message) {
|
||||||
|
if (seesion == null) {
|
||||||
|
log.error("seesion 不存在");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (seesion.isOpen()) {
|
||||||
|
try {
|
||||||
|
seesion.sendMessage(new TextMessage(message));
|
||||||
|
} catch (IOException e) {
|
||||||
|
log.error("WebSocket 消息发送异常 Session={} | msg= {} | exception={}", seesion, message, e);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean sendMessage(Object sessionKey, String message) {
|
||||||
|
WebSocketSession session = WebSocketSessionHandler.getSession(sessionKey);
|
||||||
|
return sendMessage(session, message);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,49 @@
|
|||||||
|
package cn.iocoder.yudao.framework.websocket.core;
|
||||||
|
|
||||||
|
import cn.iocoder.yudao.framework.security.core.LoginUser;
|
||||||
|
import org.springframework.web.socket.CloseStatus;
|
||||||
|
import org.springframework.web.socket.WebSocketHandler;
|
||||||
|
import org.springframework.web.socket.WebSocketSession;
|
||||||
|
import org.springframework.web.socket.handler.WebSocketHandlerDecorator;
|
||||||
|
|
||||||
|
public class YudaoWebSocketHandlerDecorator extends WebSocketHandlerDecorator {
|
||||||
|
public YudaoWebSocketHandlerDecorator(WebSocketHandler delegate) {
|
||||||
|
super(delegate);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* websocket 连接时执行的动作
|
||||||
|
* @param session websocket session 对象
|
||||||
|
* @throws Exception 异常对象
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void afterConnectionEstablished(final WebSocketSession session) throws Exception {
|
||||||
|
Object sessionKey = sessionKeyGen(session);
|
||||||
|
WebSocketSessionHandler.addSession(sessionKey, session);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* websocket 关闭连接时执行的动作
|
||||||
|
* @param session websocket session 对象
|
||||||
|
* @param closeStatus 关闭状态对象
|
||||||
|
* @throws Exception 异常对象
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void afterConnectionClosed(final WebSocketSession session, CloseStatus closeStatus) throws Exception {
|
||||||
|
Object sessionKey = sessionKeyGen(session);
|
||||||
|
WebSocketSessionHandler.removeSession(sessionKey);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object sessionKeyGen(WebSocketSession webSocketSession) {
|
||||||
|
|
||||||
|
Object obj = webSocketSession.getAttributes().get(WebSocketKeyDefine.LOGIN_USER);
|
||||||
|
|
||||||
|
if (obj instanceof LoginUser) {
|
||||||
|
LoginUser loginUser = (LoginUser) obj;
|
||||||
|
// userId 作为唯一区分
|
||||||
|
return String.valueOf(loginUser.getId());
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1 @@
|
|||||||
|
package cn.iocoder.yudao.framework.websocket;
|
@ -0,0 +1 @@
|
|||||||
|
cn.iocoder.yudao.framework.websocket.config.YudaoWebSocketAutoConfiguration
|
@ -111,6 +111,12 @@
|
|||||||
<groupId>cn.iocoder.boot</groupId>
|
<groupId>cn.iocoder.boot</groupId>
|
||||||
<artifactId>yudao-spring-boot-starter-file</artifactId>
|
<artifactId>yudao-spring-boot-starter-file</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
<!-- WebSocket -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-websocket</artifactId>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
</project>
|
</project>
|
||||||
|
@ -0,0 +1,45 @@
|
|||||||
|
package cn.iocoder.yudao.module.infra.websocket;
|
||||||
|
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
|
||||||
|
import java.util.concurrent.Semaphore;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 信号量相关处理
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
@Slf4j
|
||||||
|
public class SemaphoreUtils {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取信号量
|
||||||
|
*
|
||||||
|
* @param semaphore
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static boolean tryAcquire(Semaphore semaphore) {
|
||||||
|
boolean flag = false;
|
||||||
|
|
||||||
|
try {
|
||||||
|
flag = semaphore.tryAcquire();
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("获取信号量异常", e);
|
||||||
|
}
|
||||||
|
|
||||||
|
return flag;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 释放信号量
|
||||||
|
*
|
||||||
|
* @param semaphore
|
||||||
|
*/
|
||||||
|
public static void release(Semaphore semaphore) {
|
||||||
|
|
||||||
|
try {
|
||||||
|
semaphore.release();
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("释放信号量异常", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,16 @@
|
|||||||
|
package cn.iocoder.yudao.module.infra.websocket;
|
||||||
|
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
import org.springframework.web.socket.server.standard.ServerEndpointExporter;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* websocket 配置
|
||||||
|
*/
|
||||||
|
@Configuration
|
||||||
|
public class WebSocketConfig {
|
||||||
|
@Bean
|
||||||
|
public ServerEndpointExporter serverEndpointExporter() {
|
||||||
|
return new ServerEndpointExporter();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,86 @@
|
|||||||
|
package cn.iocoder.yudao.module.infra.websocket;
|
||||||
|
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import javax.websocket.*;
|
||||||
|
import javax.websocket.server.ServerEndpoint;
|
||||||
|
import java.util.concurrent.Semaphore;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* websocket 消息处理
|
||||||
|
*/
|
||||||
|
@Component
|
||||||
|
@ServerEndpoint("/websocket/message")
|
||||||
|
@Slf4j
|
||||||
|
public class WebSocketServer {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 默认最多允许同时在线用户数100
|
||||||
|
*/
|
||||||
|
public static int socketMaxOnlineCount = 100;
|
||||||
|
|
||||||
|
private static final Semaphore SOCKET_SEMAPHORE = new Semaphore(socketMaxOnlineCount);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 连接建立成功调用的方法
|
||||||
|
*/
|
||||||
|
@OnOpen
|
||||||
|
public void onOpen(Session session) throws Exception {
|
||||||
|
// 尝试获取信号量
|
||||||
|
boolean semaphoreFlag = SemaphoreUtils.tryAcquire(SOCKET_SEMAPHORE);
|
||||||
|
if (!semaphoreFlag) {
|
||||||
|
// 未获取到信号量
|
||||||
|
log.error("当前在线人数超过限制数:{}", socketMaxOnlineCount);
|
||||||
|
WebSocketUsers.sendMessage(session, "当前在线人数超过限制数:" + socketMaxOnlineCount);
|
||||||
|
session.close();
|
||||||
|
} else {
|
||||||
|
String userId = WebSocketUsers.getParam("userId", session);
|
||||||
|
if (userId != null) {
|
||||||
|
// 添加用户
|
||||||
|
WebSocketUsers.addSession(userId, session);
|
||||||
|
log.info("用户【userId={}】建立连接,当前连接用户总数:{}", userId, WebSocketUsers.getUsers().size());
|
||||||
|
WebSocketUsers.sendMessage(session, "接收内容:连接成功");
|
||||||
|
} else {
|
||||||
|
WebSocketUsers.sendMessage(session, "接收内容:连接失败");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 连接关闭时处理
|
||||||
|
*/
|
||||||
|
@OnClose
|
||||||
|
public void onClose(Session session) {
|
||||||
|
log.info("用户【sessionId={}】关闭连接!", session.getId());
|
||||||
|
// 移除用户
|
||||||
|
WebSocketUsers.removeSession(session);
|
||||||
|
// 获取到信号量则需释放
|
||||||
|
SemaphoreUtils.release(SOCKET_SEMAPHORE);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 抛出异常时处理
|
||||||
|
*/
|
||||||
|
@OnError
|
||||||
|
public void onError(Session session, Throwable exception) throws Exception {
|
||||||
|
if (session.isOpen()) {
|
||||||
|
// 关闭连接
|
||||||
|
session.close();
|
||||||
|
}
|
||||||
|
String sessionId = session.getId();
|
||||||
|
log.info("用户【sessionId={}】连接异常!异常信息:{}", sessionId, exception);
|
||||||
|
// 移出用户
|
||||||
|
WebSocketUsers.removeSession(session);
|
||||||
|
// 获取到信号量则需释放
|
||||||
|
SemaphoreUtils.release(SOCKET_SEMAPHORE);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 收到客户端消息时调用的方法
|
||||||
|
*/
|
||||||
|
@OnMessage
|
||||||
|
public void onMessage(Session session, String message) {
|
||||||
|
WebSocketUsers.sendMessage(session, "接收内容:" + message);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,178 @@
|
|||||||
|
package cn.iocoder.yudao.module.infra.websocket;
|
||||||
|
|
||||||
|
import cn.hutool.core.map.MapUtil;
|
||||||
|
import cn.hutool.core.util.StrUtil;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.bouncycastle.util.Strings;
|
||||||
|
|
||||||
|
import javax.validation.constraints.NotNull;
|
||||||
|
import javax.websocket.Session;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* websocket 客户端用户
|
||||||
|
*/
|
||||||
|
@Slf4j
|
||||||
|
public class WebSocketUsers {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用户集
|
||||||
|
* TODO 需要登录用户的session?
|
||||||
|
*/
|
||||||
|
private static final Map<String, Session> SESSION_MAP = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 存储用户
|
||||||
|
*
|
||||||
|
* @param userId 唯一键
|
||||||
|
* @param session 用户信息
|
||||||
|
*/
|
||||||
|
public static void addSession(String userId, Session session) {
|
||||||
|
SESSION_MAP.put(userId, session);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 移除用户
|
||||||
|
*
|
||||||
|
* @param session 用户信息
|
||||||
|
* @return 移除结果
|
||||||
|
*/
|
||||||
|
public static boolean removeSession(Session session) {
|
||||||
|
String key = null;
|
||||||
|
boolean flag = SESSION_MAP.containsValue(session);
|
||||||
|
if (flag) {
|
||||||
|
Set<Map.Entry<String, Session>> entries = SESSION_MAP.entrySet();
|
||||||
|
for (Map.Entry<String, Session> entry : entries) {
|
||||||
|
Session value = entry.getValue();
|
||||||
|
if (value.equals(session)) {
|
||||||
|
key = entry.getKey();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return removeSession(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 移出用户
|
||||||
|
*
|
||||||
|
* @param userId 用户id
|
||||||
|
*/
|
||||||
|
public static boolean removeSession(String userId) {
|
||||||
|
log.info("用户【userId={}】退出", userId);
|
||||||
|
Session remove = SESSION_MAP.remove(userId);
|
||||||
|
if (remove != null) {
|
||||||
|
boolean containsValue = SESSION_MAP.containsValue(remove);
|
||||||
|
log.info("用户【userId={}】退出{},当前连接用户总数:{}", userId, containsValue ? "失败" : "成功", SESSION_MAP.size());
|
||||||
|
return containsValue;
|
||||||
|
} else {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取在线用户列表
|
||||||
|
*
|
||||||
|
* @return 返回用户集合
|
||||||
|
*/
|
||||||
|
public static Map<String, Session> getUsers() {
|
||||||
|
return SESSION_MAP;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 向所有在线人发送消息
|
||||||
|
*
|
||||||
|
* @param message 消息内容
|
||||||
|
*/
|
||||||
|
public static void sendMessageToAll(String message) {
|
||||||
|
SESSION_MAP.forEach((userId, session) -> {
|
||||||
|
if (session.isOpen()) {
|
||||||
|
sendMessage(session, message);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 异步发送文本消息
|
||||||
|
*
|
||||||
|
* @param session 用户session
|
||||||
|
* @param message 消息内容
|
||||||
|
*/
|
||||||
|
public static void sendMessageAsync(Session session, String message) {
|
||||||
|
if (session.isOpen()) {
|
||||||
|
// TODO 需要加synchronized锁(synchronized(session))?单个session创建线程?
|
||||||
|
session.getAsyncRemote().sendText(message);
|
||||||
|
} else {
|
||||||
|
log.warn("用户【session={}】不在线", session.getId());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 同步发送文本消息
|
||||||
|
*
|
||||||
|
* @param session 用户session
|
||||||
|
* @param message 消息内容
|
||||||
|
*/
|
||||||
|
public static void sendMessage(Session session, String message) {
|
||||||
|
try {
|
||||||
|
if (session.isOpen()) {
|
||||||
|
// TODO 需要加synchronized锁(synchronized(session))?单个session创建线程?
|
||||||
|
session.getBasicRemote().sendText(message);
|
||||||
|
} else {
|
||||||
|
log.warn("用户【session={}】不在线", session.getId());
|
||||||
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
log.error("发送消息异常", e);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据用户id发送消息
|
||||||
|
*
|
||||||
|
* @param userId 用户id
|
||||||
|
* @param message 消息内容
|
||||||
|
*/
|
||||||
|
public static void sendMessage(String userId, String message) {
|
||||||
|
Session session = SESSION_MAP.get(userId);
|
||||||
|
//判断是否存在该用户的session,并且是否在线
|
||||||
|
if (session == null || !session.isOpen()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
sendMessage(session, message);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取session中的指定参数值
|
||||||
|
*
|
||||||
|
* @param key 参数key
|
||||||
|
* @param session 用户session
|
||||||
|
*/
|
||||||
|
public static String getParam(@NotNull String key, Session session) {
|
||||||
|
//TODO 目前只针对获取一个key的值,后期根据情况拓展多个 或者直接在onClose onOpen上获取参数?
|
||||||
|
String value = null;
|
||||||
|
Map<String, List<String>> parameters = session.getRequestParameterMap();
|
||||||
|
if (MapUtil.isNotEmpty(parameters)) {
|
||||||
|
value = parameters.get(key).get(0);
|
||||||
|
} else {
|
||||||
|
String queryString = session.getQueryString();
|
||||||
|
if (!StrUtil.isEmpty(queryString)) {
|
||||||
|
String[] params = Strings.split(queryString, '&');
|
||||||
|
for (String paramPair : params) {
|
||||||
|
String[] nameValues = Strings.split(paramPair, '=');
|
||||||
|
if (key.equals(nameValues[0])) {
|
||||||
|
value = nameValues[1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
}
|
@ -1,8 +1,8 @@
|
|||||||
package cn.iocoder.yudao.module.visualization.framework.jmreport.core.service;
|
package cn.iocoder.yudao.module.visualization.framework.jmreport.core.service;
|
||||||
|
|
||||||
|
import cn.hutool.core.util.ObjectUtil;
|
||||||
import cn.hutool.core.util.StrUtil;
|
import cn.hutool.core.util.StrUtil;
|
||||||
import cn.iocoder.yudao.framework.common.exception.ServiceException;
|
import cn.iocoder.yudao.framework.common.exception.ServiceException;
|
||||||
import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils;
|
|
||||||
import cn.iocoder.yudao.framework.security.core.LoginUser;
|
import cn.iocoder.yudao.framework.security.core.LoginUser;
|
||||||
import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
|
import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
|
||||||
import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder;
|
import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder;
|
||||||
@ -11,9 +11,8 @@ import cn.iocoder.yudao.module.system.api.oauth2.OAuth2TokenApi;
|
|||||||
import cn.iocoder.yudao.module.system.api.oauth2.dto.OAuth2AccessTokenCheckRespDTO;
|
import cn.iocoder.yudao.module.system.api.oauth2.dto.OAuth2AccessTokenCheckRespDTO;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import org.jeecg.modules.jmreport.api.JmReportTokenServiceI;
|
import org.jeecg.modules.jmreport.api.JmReportTokenServiceI;
|
||||||
import org.springframework.http.HttpHeaders;
|
|
||||||
|
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import java.util.Objects;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* {@link JmReportTokenServiceI} 实现类,提供积木报表的 Token 校验、用户信息的查询等功能
|
* {@link JmReportTokenServiceI} 实现类,提供积木报表的 Token 校验、用户信息的查询等功能
|
||||||
@ -22,33 +21,9 @@ import javax.servlet.http.HttpServletRequest;
|
|||||||
*/
|
*/
|
||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
public class JmReportTokenServiceImpl implements JmReportTokenServiceI {
|
public class JmReportTokenServiceImpl implements JmReportTokenServiceI {
|
||||||
private static final String JM_TOKEN_HEADER = "X-Access-Token";
|
|
||||||
/**
|
|
||||||
* 系统内置请求头
|
|
||||||
*/
|
|
||||||
private static final String TOKEN_HEADER = "Authorization";
|
|
||||||
/**
|
|
||||||
* auth 相关格式
|
|
||||||
*/
|
|
||||||
private static final String AUTHORIZATION_FORMAT = "Bearer %s";
|
|
||||||
|
|
||||||
private final OAuth2TokenApi oauth2TokenApi;
|
private final OAuth2TokenApi oauth2TokenApi;
|
||||||
|
|
||||||
/**
|
|
||||||
* 修改请求的 head
|
|
||||||
*
|
|
||||||
* @return 新 head
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public HttpHeaders customApiHeader() {
|
|
||||||
HttpHeaders header = new HttpHeaders();
|
|
||||||
HttpServletRequest request = ServletUtils.getRequest();
|
|
||||||
String token = request.getHeader(JM_TOKEN_HEADER);
|
|
||||||
|
|
||||||
header.add(TOKEN_HEADER, String.format(AUTHORIZATION_FORMAT, token));
|
|
||||||
return header;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 校验 Token 是否有效,即验证通过
|
* 校验 Token 是否有效,即验证通过
|
||||||
*
|
*
|
||||||
@ -57,35 +32,11 @@ public class JmReportTokenServiceImpl implements JmReportTokenServiceI {
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public Boolean verifyToken(String token) {
|
public Boolean verifyToken(String token) {
|
||||||
if (StrUtil.isEmpty(token)) {
|
Long userId = SecurityFrameworkUtils.getLoginUserId();
|
||||||
return false;
|
if (!Objects.isNull(userId)) {
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
// TODO 如下的实现不算特别优雅,主要咱是不想搞的太复杂,所以参考对应的 Filter 先实现了
|
return buildLoginUserByToken(token) != null;
|
||||||
|
|
||||||
// ① 参考 TokenAuthenticationFilter 的认证逻辑(Security 的上下文清理,交给 Spring Security 完成)
|
|
||||||
// 目的:实现基于 JmReport 前端传递的 token,实现认证
|
|
||||||
TenantContextHolder.setIgnore(true); // 忽略租户,保证可查询到 token 信息
|
|
||||||
LoginUser user = null;
|
|
||||||
try {
|
|
||||||
OAuth2AccessTokenCheckRespDTO accessToken = oauth2TokenApi.checkAccessToken(token);
|
|
||||||
if (accessToken == null) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
user = new LoginUser().setId(accessToken.getUserId()).setUserType(accessToken.getUserType())
|
|
||||||
.setTenantId(accessToken.getTenantId()).setScopes(accessToken.getScopes());
|
|
||||||
} catch (ServiceException ignored) {
|
|
||||||
// do nothing:如果报错,说明认证失败,则返回 false 即可
|
|
||||||
}
|
|
||||||
if (user == null) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
SecurityFrameworkUtils.setLoginUser(user, WebFrameworkUtils.getRequest());
|
|
||||||
|
|
||||||
// ② 参考 TenantContextWebFilter 实现(Tenant 的上下文清理,交给 TenantContextWebFilter 完成)
|
|
||||||
// 目的:基于 LoginUser 获得到的租户编号,设置到 Tenant 上下文,避免查询数据库时的报错
|
|
||||||
TenantContextHolder.setIgnore(false);
|
|
||||||
TenantContextHolder.setTenantId(user.getTenantId());
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -99,7 +50,49 @@ public class JmReportTokenServiceImpl implements JmReportTokenServiceI {
|
|||||||
@Override
|
@Override
|
||||||
public String getUsername(String token) {
|
public String getUsername(String token) {
|
||||||
Long userId = SecurityFrameworkUtils.getLoginUserId();
|
Long userId = SecurityFrameworkUtils.getLoginUserId();
|
||||||
return userId != null ? String.valueOf(userId) : null;
|
if (ObjectUtil.isNotNull(userId)) {
|
||||||
|
return String.valueOf(userId);
|
||||||
|
}
|
||||||
|
LoginUser user = buildLoginUserByToken(token);
|
||||||
|
return user == null ? null : String.valueOf(user.getId());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 基于 token 构建登录用户
|
||||||
|
*
|
||||||
|
* @param token token
|
||||||
|
* @return 返回 token 对应的用户信息
|
||||||
|
*/
|
||||||
|
private LoginUser buildLoginUserByToken(String token) {
|
||||||
|
if (StrUtil.isEmpty(token)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
// TODO 如下的实现不算特别优雅,主要咱是不想搞的太复杂,所以参考对应的 Filter 先实现了
|
||||||
|
|
||||||
|
// ① 参考 TokenAuthenticationFilter 的认证逻辑(Security 的上下文清理,交给 Spring Security 完成)
|
||||||
|
// 目的:实现基于 JmReport 前端传递的 token,实现认证
|
||||||
|
TenantContextHolder.setIgnore(true); // 忽略租户,保证可查询到 token 信息
|
||||||
|
LoginUser user = null;
|
||||||
|
try {
|
||||||
|
OAuth2AccessTokenCheckRespDTO accessToken = oauth2TokenApi.checkAccessToken(token);
|
||||||
|
if (accessToken == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
user = new LoginUser().setId(accessToken.getUserId()).setUserType(accessToken.getUserType())
|
||||||
|
.setTenantId(accessToken.getTenantId()).setScopes(accessToken.getScopes());
|
||||||
|
} catch (ServiceException ignored) {
|
||||||
|
// do nothing:如果报错,说明认证失败,则返回 false 即可
|
||||||
|
}
|
||||||
|
if (user == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
SecurityFrameworkUtils.setLoginUser(user, WebFrameworkUtils.getRequest());
|
||||||
|
|
||||||
|
// ② 参考 TenantContextWebFilter 实现(Tenant 的上下文清理,交给 TenantContextWebFilter 完成)
|
||||||
|
// 目的:基于 LoginUser 获得到的租户编号,设置到 Tenant 上下文,避免查询数据库时的报错
|
||||||
|
TenantContextHolder.setIgnore(false);
|
||||||
|
TenantContextHolder.setTenantId(user.getTenantId());
|
||||||
|
return user;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -104,7 +104,7 @@
|
|||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.springframework.boot</groupId>
|
<groupId>org.springframework.boot</groupId>
|
||||||
<artifactId>spring-boot-maven-plugin</artifactId>
|
<artifactId>spring-boot-maven-plugin</artifactId>
|
||||||
<version>2.7.6</version> <!-- 如果 spring.boot.version 版本修改,则这里也要跟着修改 -->
|
<version>2.7.7</version> <!-- 如果 spring.boot.version 版本修改,则这里也要跟着修改 -->
|
||||||
<configuration>
|
<configuration>
|
||||||
<fork>true</fork>
|
<fork>true</fork>
|
||||||
</configuration>
|
</configuration>
|
||||||
|
@ -92,6 +92,11 @@ yudao:
|
|||||||
security:
|
security:
|
||||||
permit-all_urls:
|
permit-all_urls:
|
||||||
- /admin-ui/** # /resources/admin-ui 目录下的静态资源
|
- /admin-ui/** # /resources/admin-ui 目录下的静态资源
|
||||||
|
websocket:
|
||||||
|
enable: true # websocket的开关
|
||||||
|
path: /websocket/message # 路径
|
||||||
|
maxOnlineCount: 0 # 最大连接人数
|
||||||
|
sessionMap: true # 保存sessionMap
|
||||||
swagger:
|
swagger:
|
||||||
title: 管理后台
|
title: 管理后台
|
||||||
description: 提供管理员管理的所有功能
|
description: 提供管理员管理的所有功能
|
||||||
|
@ -104,7 +104,7 @@
|
|||||||
"vite-plugin-svg-icons": "^2.0.1",
|
"vite-plugin-svg-icons": "^2.0.1",
|
||||||
"vite-plugin-vue-setup-extend": "^0.4.0",
|
"vite-plugin-vue-setup-extend": "^0.4.0",
|
||||||
"vite-plugin-windicss": "^1.8.10",
|
"vite-plugin-windicss": "^1.8.10",
|
||||||
"vue-tsc": "^1.0.20",
|
"vue-tsc": "^1.0.22",
|
||||||
"windicss": "^3.5.6"
|
"windicss": "^3.5.6"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
|
@ -75,7 +75,7 @@ specifiers:
|
|||||||
vue: 3.2.45
|
vue: 3.2.45
|
||||||
vue-i18n: 9.2.2
|
vue-i18n: 9.2.2
|
||||||
vue-router: ^4.1.6
|
vue-router: ^4.1.6
|
||||||
vue-tsc: ^1.0.20
|
vue-tsc: ^1.0.22
|
||||||
vue-types: ^5.0.2
|
vue-types: ^5.0.2
|
||||||
vxe-table: ^4.3.7
|
vxe-table: ^4.3.7
|
||||||
web-storage-cache: ^1.1.1
|
web-storage-cache: ^1.1.1
|
||||||
@ -163,13 +163,13 @@ devDependencies:
|
|||||||
vite-plugin-svg-icons: 2.0.1_vite@4.0.4
|
vite-plugin-svg-icons: 2.0.1_vite@4.0.4
|
||||||
vite-plugin-vue-setup-extend: 0.4.0_vite@4.0.4
|
vite-plugin-vue-setup-extend: 0.4.0_vite@4.0.4
|
||||||
vite-plugin-windicss: 1.8.10_vite@4.0.4
|
vite-plugin-windicss: 1.8.10_vite@4.0.4
|
||||||
vue-tsc: 1.0.20_typescript@4.9.4
|
vue-tsc: 1.0.22_typescript@4.9.4
|
||||||
windicss: 3.5.6
|
windicss: 3.5.6
|
||||||
|
|
||||||
packages:
|
packages:
|
||||||
|
|
||||||
/@ampproject/remapping/2.2.0:
|
/@ampproject/remapping/2.2.0:
|
||||||
resolution: {integrity: sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==, registry: https://registry.npm.taobao.org/}
|
resolution: {integrity: sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@ampproject/remapping/-/remapping-2.2.0.tgz}
|
||||||
engines: {node: '>=6.0.0'}
|
engines: {node: '>=6.0.0'}
|
||||||
dependencies:
|
dependencies:
|
||||||
'@jridgewell/gen-mapping': 0.1.1
|
'@jridgewell/gen-mapping': 0.1.1
|
||||||
@ -177,23 +177,23 @@ packages:
|
|||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/@antfu/utils/0.7.2:
|
/@antfu/utils/0.7.2:
|
||||||
resolution: {integrity: sha512-vy9fM3pIxZmX07dL+VX1aZe7ynZ+YyB0jY+jE6r3hOK6GNY2t6W8rzpFC4tgpbXUYABkFQwgJq2XYXlxbXAI0g==, registry: https://registry.npm.taobao.org/}
|
resolution: {integrity: sha512-vy9fM3pIxZmX07dL+VX1aZe7ynZ+YyB0jY+jE6r3hOK6GNY2t6W8rzpFC4tgpbXUYABkFQwgJq2XYXlxbXAI0g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@antfu/utils/-/utils-0.7.2.tgz}
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/@babel/code-frame/7.18.6:
|
/@babel/code-frame/7.18.6:
|
||||||
resolution: {integrity: sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==, registry: https://registry.npm.taobao.org/}
|
resolution: {integrity: sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@babel/code-frame/-/code-frame-7.18.6.tgz}
|
||||||
engines: {node: '>=6.9.0'}
|
engines: {node: '>=6.9.0'}
|
||||||
dependencies:
|
dependencies:
|
||||||
'@babel/highlight': 7.18.6
|
'@babel/highlight': 7.18.6
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/@babel/compat-data/7.20.1:
|
/@babel/compat-data/7.20.1:
|
||||||
resolution: {integrity: sha512-EWZ4mE2diW3QALKvDMiXnbZpRvlj+nayZ112nK93SnhqOtpdsbVD4W+2tEoT3YNBAG9RBR0ISY758ZkOgsn6pQ==, registry: https://registry.npm.taobao.org/}
|
resolution: {integrity: sha512-EWZ4mE2diW3QALKvDMiXnbZpRvlj+nayZ112nK93SnhqOtpdsbVD4W+2tEoT3YNBAG9RBR0ISY758ZkOgsn6pQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@babel/compat-data/-/compat-data-7.20.1.tgz}
|
||||||
engines: {node: '>=6.9.0'}
|
engines: {node: '>=6.9.0'}
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/@babel/core/7.20.5:
|
/@babel/core/7.20.5:
|
||||||
resolution: {integrity: sha512-UdOWmk4pNWTm/4DlPUl/Pt4Gz4rcEMb7CY0Y3eJl5Yz1vI8ZJGmHWaVE55LoxRjdpx0z259GE9U5STA9atUinQ==, registry: https://registry.npm.taobao.org/}
|
resolution: {integrity: sha512-UdOWmk4pNWTm/4DlPUl/Pt4Gz4rcEMb7CY0Y3eJl5Yz1vI8ZJGmHWaVE55LoxRjdpx0z259GE9U5STA9atUinQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@babel/core/-/core-7.20.5.tgz}
|
||||||
engines: {node: '>=6.9.0'}
|
engines: {node: '>=6.9.0'}
|
||||||
dependencies:
|
dependencies:
|
||||||
'@ampproject/remapping': 2.2.0
|
'@ampproject/remapping': 2.2.0
|
||||||
@ -216,7 +216,7 @@ packages:
|
|||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/@babel/generator/7.20.5:
|
/@babel/generator/7.20.5:
|
||||||
resolution: {integrity: sha512-jl7JY2Ykn9S0yj4DQP82sYvPU+T3g0HFcWTqDLqiuA9tGRNIj9VfbtXGAYTTkyNEnQk1jkMGOdYka8aG/lulCA==, registry: https://registry.npm.taobao.org/}
|
resolution: {integrity: sha512-jl7JY2Ykn9S0yj4DQP82sYvPU+T3g0HFcWTqDLqiuA9tGRNIj9VfbtXGAYTTkyNEnQk1jkMGOdYka8aG/lulCA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@babel/generator/-/generator-7.20.5.tgz}
|
||||||
engines: {node: '>=6.9.0'}
|
engines: {node: '>=6.9.0'}
|
||||||
dependencies:
|
dependencies:
|
||||||
'@babel/types': 7.20.5
|
'@babel/types': 7.20.5
|
||||||
@ -225,14 +225,14 @@ packages:
|
|||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/@babel/helper-annotate-as-pure/7.18.6:
|
/@babel/helper-annotate-as-pure/7.18.6:
|
||||||
resolution: {integrity: sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==, registry: https://registry.npm.taobao.org/}
|
resolution: {integrity: sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz}
|
||||||
engines: {node: '>=6.9.0'}
|
engines: {node: '>=6.9.0'}
|
||||||
dependencies:
|
dependencies:
|
||||||
'@babel/types': 7.20.5
|
'@babel/types': 7.20.5
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/@babel/helper-compilation-targets/7.20.0_@babel+core@7.20.5:
|
/@babel/helper-compilation-targets/7.20.0_@babel+core@7.20.5:
|
||||||
resolution: {integrity: sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==, registry: https://registry.npm.taobao.org/}
|
resolution: {integrity: sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz}
|
||||||
engines: {node: '>=6.9.0'}
|
engines: {node: '>=6.9.0'}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
'@babel/core': ^7.0.0
|
'@babel/core': ^7.0.0
|
||||||
@ -245,7 +245,7 @@ packages:
|
|||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/@babel/helper-create-class-features-plugin/7.20.2_@babel+core@7.20.5:
|
/@babel/helper-create-class-features-plugin/7.20.2_@babel+core@7.20.5:
|
||||||
resolution: {integrity: sha512-k22GoYRAHPYr9I+Gvy2ZQlAe5mGy8BqWst2wRt8cwIufWTxrsVshhIBvYNqC80N0GSFWTsqRVexOtfzlgOEDvA==, registry: https://registry.npm.taobao.org/}
|
resolution: {integrity: sha512-k22GoYRAHPYr9I+Gvy2ZQlAe5mGy8BqWst2wRt8cwIufWTxrsVshhIBvYNqC80N0GSFWTsqRVexOtfzlgOEDvA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.2.tgz}
|
||||||
engines: {node: '>=6.9.0'}
|
engines: {node: '>=6.9.0'}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
'@babel/core': ^7.0.0
|
'@babel/core': ^7.0.0
|
||||||
@ -263,12 +263,12 @@ packages:
|
|||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/@babel/helper-environment-visitor/7.18.9:
|
/@babel/helper-environment-visitor/7.18.9:
|
||||||
resolution: {integrity: sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==, registry: https://registry.npm.taobao.org/}
|
resolution: {integrity: sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz}
|
||||||
engines: {node: '>=6.9.0'}
|
engines: {node: '>=6.9.0'}
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/@babel/helper-function-name/7.19.0:
|
/@babel/helper-function-name/7.19.0:
|
||||||
resolution: {integrity: sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==, registry: https://registry.npm.taobao.org/}
|
resolution: {integrity: sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz}
|
||||||
engines: {node: '>=6.9.0'}
|
engines: {node: '>=6.9.0'}
|
||||||
dependencies:
|
dependencies:
|
||||||
'@babel/template': 7.18.10
|
'@babel/template': 7.18.10
|
||||||
@ -276,28 +276,28 @@ packages:
|
|||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/@babel/helper-hoist-variables/7.18.6:
|
/@babel/helper-hoist-variables/7.18.6:
|
||||||
resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==, registry: https://registry.npm.taobao.org/}
|
resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz}
|
||||||
engines: {node: '>=6.9.0'}
|
engines: {node: '>=6.9.0'}
|
||||||
dependencies:
|
dependencies:
|
||||||
'@babel/types': 7.20.5
|
'@babel/types': 7.20.5
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/@babel/helper-member-expression-to-functions/7.18.9:
|
/@babel/helper-member-expression-to-functions/7.18.9:
|
||||||
resolution: {integrity: sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==, registry: https://registry.npm.taobao.org/}
|
resolution: {integrity: sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz}
|
||||||
engines: {node: '>=6.9.0'}
|
engines: {node: '>=6.9.0'}
|
||||||
dependencies:
|
dependencies:
|
||||||
'@babel/types': 7.20.5
|
'@babel/types': 7.20.5
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/@babel/helper-module-imports/7.18.6:
|
/@babel/helper-module-imports/7.18.6:
|
||||||
resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==, registry: https://registry.npm.taobao.org/}
|
resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz}
|
||||||
engines: {node: '>=6.9.0'}
|
engines: {node: '>=6.9.0'}
|
||||||
dependencies:
|
dependencies:
|
||||||
'@babel/types': 7.20.5
|
'@babel/types': 7.20.5
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/@babel/helper-module-transforms/7.20.2:
|
/@babel/helper-module-transforms/7.20.2:
|
||||||
resolution: {integrity: sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA==, registry: https://registry.npm.taobao.org/}
|
resolution: {integrity: sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz}
|
||||||
engines: {node: '>=6.9.0'}
|
engines: {node: '>=6.9.0'}
|
||||||
dependencies:
|
dependencies:
|
||||||
'@babel/helper-environment-visitor': 7.18.9
|
'@babel/helper-environment-visitor': 7.18.9
|
||||||
@ -313,19 +313,19 @@ packages:
|
|||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/@babel/helper-optimise-call-expression/7.18.6:
|
/@babel/helper-optimise-call-expression/7.18.6:
|
||||||
resolution: {integrity: sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==, registry: https://registry.npm.taobao.org/}
|
resolution: {integrity: sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz}
|
||||||
engines: {node: '>=6.9.0'}
|
engines: {node: '>=6.9.0'}
|
||||||
dependencies:
|
dependencies:
|
||||||
'@babel/types': 7.20.5
|
'@babel/types': 7.20.5
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/@babel/helper-plugin-utils/7.20.2:
|
/@babel/helper-plugin-utils/7.20.2:
|
||||||
resolution: {integrity: sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==, registry: https://registry.npm.taobao.org/}
|
resolution: {integrity: sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz}
|
||||||
engines: {node: '>=6.9.0'}
|
engines: {node: '>=6.9.0'}
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/@babel/helper-replace-supers/7.19.1:
|
/@babel/helper-replace-supers/7.19.1:
|
||||||
resolution: {integrity: sha512-T7ahH7wV0Hfs46SFh5Jz3s0B6+o8g3c+7TMxu7xKfmHikg7EAZ3I2Qk9LFhjxXq8sL7UkP5JflezNwoZa8WvWw==, registry: https://registry.npm.taobao.org/}
|
resolution: {integrity: sha512-T7ahH7wV0Hfs46SFh5Jz3s0B6+o8g3c+7TMxu7xKfmHikg7EAZ3I2Qk9LFhjxXq8sL7UkP5JflezNwoZa8WvWw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@babel/helper-replace-supers/-/helper-replace-supers-7.19.1.tgz}
|
||||||
engines: {node: '>=6.9.0'}
|
engines: {node: '>=6.9.0'}
|
||||||
dependencies:
|
dependencies:
|
||||||
'@babel/helper-environment-visitor': 7.18.9
|
'@babel/helper-environment-visitor': 7.18.9
|
||||||
@ -338,34 +338,34 @@ packages:
|
|||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/@babel/helper-simple-access/7.20.2:
|
/@babel/helper-simple-access/7.20.2:
|
||||||
resolution: {integrity: sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==, registry: https://registry.npm.taobao.org/}
|
resolution: {integrity: sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz}
|
||||||
engines: {node: '>=6.9.0'}
|
engines: {node: '>=6.9.0'}
|
||||||
dependencies:
|
dependencies:
|
||||||
'@babel/types': 7.20.5
|
'@babel/types': 7.20.5
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/@babel/helper-split-export-declaration/7.18.6:
|
/@babel/helper-split-export-declaration/7.18.6:
|
||||||
resolution: {integrity: sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==, registry: https://registry.npm.taobao.org/}
|
resolution: {integrity: sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz}
|
||||||
engines: {node: '>=6.9.0'}
|
engines: {node: '>=6.9.0'}
|
||||||
dependencies:
|
dependencies:
|
||||||
'@babel/types': 7.20.5
|
'@babel/types': 7.20.5
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/@babel/helper-string-parser/7.19.4:
|
/@babel/helper-string-parser/7.19.4:
|
||||||
resolution: {integrity: sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==, registry: https://registry.npm.taobao.org/}
|
resolution: {integrity: sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz}
|
||||||
engines: {node: '>=6.9.0'}
|
engines: {node: '>=6.9.0'}
|
||||||
|
|
||||||
/@babel/helper-validator-identifier/7.19.1:
|
/@babel/helper-validator-identifier/7.19.1:
|
||||||
resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==, registry: https://registry.npm.taobao.org/}
|
resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz}
|
||||||
engines: {node: '>=6.9.0'}
|
engines: {node: '>=6.9.0'}
|
||||||
|
|
||||||
/@babel/helper-validator-option/7.18.6:
|
/@babel/helper-validator-option/7.18.6:
|
||||||
resolution: {integrity: sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==, registry: https://registry.npm.taobao.org/}
|
resolution: {integrity: sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz}
|
||||||
engines: {node: '>=6.9.0'}
|
engines: {node: '>=6.9.0'}
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/@babel/helpers/7.20.6:
|
/@babel/helpers/7.20.6:
|
||||||
resolution: {integrity: sha512-Pf/OjgfgFRW5bApskEz5pvidpim7tEDPlFtKcNRXWmfHGn9IEI2W2flqRQXTFb7gIPTyK++N6rVHuwKut4XK6w==, registry: https://registry.npm.taobao.org/}
|
resolution: {integrity: sha512-Pf/OjgfgFRW5bApskEz5pvidpim7tEDPlFtKcNRXWmfHGn9IEI2W2flqRQXTFb7gIPTyK++N6rVHuwKut4XK6w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@babel/helpers/-/helpers-7.20.6.tgz}
|
||||||
engines: {node: '>=6.9.0'}
|
engines: {node: '>=6.9.0'}
|
||||||
dependencies:
|
dependencies:
|
||||||
'@babel/template': 7.18.10
|
'@babel/template': 7.18.10
|
||||||
@ -376,7 +376,7 @@ packages:
|
|||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/@babel/highlight/7.18.6:
|
/@babel/highlight/7.18.6:
|
||||||
resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==, registry: https://registry.npm.taobao.org/}
|
resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@babel/highlight/-/highlight-7.18.6.tgz}
|
||||||
engines: {node: '>=6.9.0'}
|
engines: {node: '>=6.9.0'}
|
||||||
dependencies:
|
dependencies:
|
||||||
'@babel/helper-validator-identifier': 7.19.1
|
'@babel/helper-validator-identifier': 7.19.1
|
||||||
@ -392,14 +392,14 @@ packages:
|
|||||||
'@babel/types': 7.20.5
|
'@babel/types': 7.20.5
|
||||||
|
|
||||||
/@babel/parser/7.20.5:
|
/@babel/parser/7.20.5:
|
||||||
resolution: {integrity: sha512-r27t/cy/m9uKLXQNWWebeCUHgnAZq0CpG1OwKRxzJMP1vpSU4bSIK2hq+/cp0bQxetkXx38n09rNu8jVkcK/zA==, registry: https://registry.npm.taobao.org/}
|
resolution: {integrity: sha512-r27t/cy/m9uKLXQNWWebeCUHgnAZq0CpG1OwKRxzJMP1vpSU4bSIK2hq+/cp0bQxetkXx38n09rNu8jVkcK/zA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@babel/parser/-/parser-7.20.5.tgz}
|
||||||
engines: {node: '>=6.0.0'}
|
engines: {node: '>=6.0.0'}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
dependencies:
|
dependencies:
|
||||||
'@babel/types': 7.20.5
|
'@babel/types': 7.20.5
|
||||||
|
|
||||||
/@babel/plugin-syntax-jsx/7.18.6_@babel+core@7.20.5:
|
/@babel/plugin-syntax-jsx/7.18.6_@babel+core@7.20.5:
|
||||||
resolution: {integrity: sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==, registry: https://registry.npm.taobao.org/}
|
resolution: {integrity: sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz}
|
||||||
engines: {node: '>=6.9.0'}
|
engines: {node: '>=6.9.0'}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
'@babel/core': ^7.0.0-0
|
'@babel/core': ^7.0.0-0
|
||||||
@ -409,7 +409,7 @@ packages:
|
|||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/@babel/plugin-syntax-typescript/7.20.0_@babel+core@7.20.5:
|
/@babel/plugin-syntax-typescript/7.20.0_@babel+core@7.20.5:
|
||||||
resolution: {integrity: sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==, registry: https://registry.npm.taobao.org/}
|
resolution: {integrity: sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz}
|
||||||
engines: {node: '>=6.9.0'}
|
engines: {node: '>=6.9.0'}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
'@babel/core': ^7.0.0-0
|
'@babel/core': ^7.0.0-0
|
||||||
@ -419,7 +419,7 @@ packages:
|
|||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/@babel/plugin-transform-typescript/7.20.2_@babel+core@7.20.5:
|
/@babel/plugin-transform-typescript/7.20.2_@babel+core@7.20.5:
|
||||||
resolution: {integrity: sha512-jvS+ngBfrnTUBfOQq8NfGnSbF9BrqlR6hjJ2yVxMkmO5nL/cdifNbI30EfjRlN4g5wYWNnMPyj5Sa6R1pbLeag==, registry: https://registry.npm.taobao.org/}
|
resolution: {integrity: sha512-jvS+ngBfrnTUBfOQq8NfGnSbF9BrqlR6hjJ2yVxMkmO5nL/cdifNbI30EfjRlN4g5wYWNnMPyj5Sa6R1pbLeag==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.20.2.tgz}
|
||||||
engines: {node: '>=6.9.0'}
|
engines: {node: '>=6.9.0'}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
'@babel/core': ^7.0.0-0
|
'@babel/core': ^7.0.0-0
|
||||||
@ -440,12 +440,12 @@ packages:
|
|||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/@babel/standalone/7.20.6:
|
/@babel/standalone/7.20.6:
|
||||||
resolution: {integrity: sha512-u5at/CbBLETf7kx2LOY4XdhseD79Y099WZKAOMXeT8qvd9OSR515my2UNBBLY4qIht/Qi9KySeQHQwQwxJN4Sw==, registry: https://registry.npm.taobao.org/}
|
resolution: {integrity: sha512-u5at/CbBLETf7kx2LOY4XdhseD79Y099WZKAOMXeT8qvd9OSR515my2UNBBLY4qIht/Qi9KySeQHQwQwxJN4Sw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@babel/standalone/-/standalone-7.20.6.tgz}
|
||||||
engines: {node: '>=6.9.0'}
|
engines: {node: '>=6.9.0'}
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/@babel/template/7.18.10:
|
/@babel/template/7.18.10:
|
||||||
resolution: {integrity: sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==, registry: https://registry.npm.taobao.org/}
|
resolution: {integrity: sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@babel/template/-/template-7.18.10.tgz}
|
||||||
engines: {node: '>=6.9.0'}
|
engines: {node: '>=6.9.0'}
|
||||||
dependencies:
|
dependencies:
|
||||||
'@babel/code-frame': 7.18.6
|
'@babel/code-frame': 7.18.6
|
||||||
@ -454,7 +454,7 @@ packages:
|
|||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/@babel/traverse/7.20.1:
|
/@babel/traverse/7.20.1:
|
||||||
resolution: {integrity: sha512-d3tN8fkVJwFLkHkBN479SOsw4DMZnz8cdbL/gvuDuzy3TS6Nfw80HuQqhw1pITbIruHyh7d1fMA47kWzmcUEGA==, registry: https://registry.npm.taobao.org/}
|
resolution: {integrity: sha512-d3tN8fkVJwFLkHkBN479SOsw4DMZnz8cdbL/gvuDuzy3TS6Nfw80HuQqhw1pITbIruHyh7d1fMA47kWzmcUEGA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@babel/traverse/-/traverse-7.20.1.tgz}
|
||||||
engines: {node: '>=6.9.0'}
|
engines: {node: '>=6.9.0'}
|
||||||
dependencies:
|
dependencies:
|
||||||
'@babel/code-frame': 7.18.6
|
'@babel/code-frame': 7.18.6
|
||||||
@ -472,7 +472,7 @@ packages:
|
|||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/@babel/traverse/7.20.5:
|
/@babel/traverse/7.20.5:
|
||||||
resolution: {integrity: sha512-WM5ZNN3JITQIq9tFZaw1ojLU3WgWdtkxnhM1AegMS+PvHjkM5IXjmYEGY7yukz5XS4sJyEf2VzWjI8uAavhxBQ==, registry: https://registry.npm.taobao.org/}
|
resolution: {integrity: sha512-WM5ZNN3JITQIq9tFZaw1ojLU3WgWdtkxnhM1AegMS+PvHjkM5IXjmYEGY7yukz5XS4sJyEf2VzWjI8uAavhxBQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@babel/traverse/-/traverse-7.20.5.tgz}
|
||||||
engines: {node: '>=6.9.0'}
|
engines: {node: '>=6.9.0'}
|
||||||
dependencies:
|
dependencies:
|
||||||
'@babel/code-frame': 7.18.6
|
'@babel/code-frame': 7.18.6
|
||||||
@ -490,7 +490,7 @@ packages:
|
|||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/@babel/types/7.20.2:
|
/@babel/types/7.20.2:
|
||||||
resolution: {integrity: sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog==, registry: https://registry.npm.taobao.org/}
|
resolution: {integrity: sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@babel/types/-/types-7.20.2.tgz}
|
||||||
engines: {node: '>=6.9.0'}
|
engines: {node: '>=6.9.0'}
|
||||||
dependencies:
|
dependencies:
|
||||||
'@babel/helper-string-parser': 7.19.4
|
'@babel/helper-string-parser': 7.19.4
|
||||||
@ -499,7 +499,7 @@ packages:
|
|||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/@babel/types/7.20.5:
|
/@babel/types/7.20.5:
|
||||||
resolution: {integrity: sha512-c9fst/h2/dcF7H+MJKZ2T0KjEQ8hY/BNnDk/H3XY8C4Aw/eWQXWn/lWntHF9ooUBnGmEvbfGrTgLWc+um0YDUg==, registry: https://registry.npm.taobao.org/}
|
resolution: {integrity: sha512-c9fst/h2/dcF7H+MJKZ2T0KjEQ8hY/BNnDk/H3XY8C4Aw/eWQXWn/lWntHF9ooUBnGmEvbfGrTgLWc+um0YDUg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@babel/types/-/types-7.20.5.tgz}
|
||||||
engines: {node: '>=6.9.0'}
|
engines: {node: '>=6.9.0'}
|
||||||
dependencies:
|
dependencies:
|
||||||
'@babel/helper-string-parser': 7.19.4
|
'@babel/helper-string-parser': 7.19.4
|
||||||
@ -952,7 +952,7 @@ packages:
|
|||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/@iconify/iconify/2.1.2:
|
/@iconify/iconify/2.1.2:
|
||||||
resolution: {integrity: sha512-QcUzFeEWkE/mW+BVtEGmcWATClcCOIJFiYUD/PiCWuTcdEA297o8D4oN6Ra44WrNOHu1wqNW4J0ioaDIiqaFOQ==, registry: https://registry.npm.taobao.org/}
|
resolution: {integrity: sha512-QcUzFeEWkE/mW+BVtEGmcWATClcCOIJFiYUD/PiCWuTcdEA297o8D4oN6Ra44WrNOHu1wqNW4J0ioaDIiqaFOQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@iconify/iconify/-/iconify-2.1.2.tgz}
|
||||||
dependencies:
|
dependencies:
|
||||||
cross-fetch: 3.1.5
|
cross-fetch: 3.1.5
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
@ -1078,7 +1078,7 @@ packages:
|
|||||||
'@intlify/shared': 9.2.2
|
'@intlify/shared': 9.2.2
|
||||||
|
|
||||||
/@jridgewell/gen-mapping/0.1.1:
|
/@jridgewell/gen-mapping/0.1.1:
|
||||||
resolution: {integrity: sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==, registry: https://registry.npm.taobao.org/}
|
resolution: {integrity: sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz}
|
||||||
engines: {node: '>=6.0.0'}
|
engines: {node: '>=6.0.0'}
|
||||||
dependencies:
|
dependencies:
|
||||||
'@jridgewell/set-array': 1.1.2
|
'@jridgewell/set-array': 1.1.2
|
||||||
@ -1100,7 +1100,7 @@ packages:
|
|||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/@jridgewell/set-array/1.1.2:
|
/@jridgewell/set-array/1.1.2:
|
||||||
resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==, registry: https://registry.npm.taobao.org/}
|
resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@jridgewell/set-array/-/set-array-1.1.2.tgz}
|
||||||
engines: {node: '>=6.0.0'}
|
engines: {node: '>=6.0.0'}
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
@ -1151,7 +1151,7 @@ packages:
|
|||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/@purge-icons/core/0.9.1:
|
/@purge-icons/core/0.9.1:
|
||||||
resolution: {integrity: sha512-sx8/a30MbbqQVEqhuMPE1wJpdVRRbEmwEPZpFzVkcDixzX4p+R2A0WVxqkb0xfHUBAVQwrSE2SeAyniIQLqbLw==, registry: https://registry.npm.taobao.org/}
|
resolution: {integrity: sha512-sx8/a30MbbqQVEqhuMPE1wJpdVRRbEmwEPZpFzVkcDixzX4p+R2A0WVxqkb0xfHUBAVQwrSE2SeAyniIQLqbLw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@purge-icons/core/-/core-0.9.1.tgz}
|
||||||
dependencies:
|
dependencies:
|
||||||
'@iconify/iconify': 2.1.2
|
'@iconify/iconify': 2.1.2
|
||||||
axios: 0.26.1_debug@4.3.4
|
axios: 0.26.1_debug@4.3.4
|
||||||
@ -1456,7 +1456,7 @@ packages:
|
|||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/@vitejs/plugin-legacy/3.0.1_terser@5.16.1+vite@4.0.4:
|
/@vitejs/plugin-legacy/3.0.1_terser@5.16.1+vite@4.0.4:
|
||||||
resolution: {integrity: sha512-XCtEjxoR3rmy000ujYRBp5kggWqzHz9+F20/yIMUWOzbvu0+KW1e14Fvb8h7SpNn+bfjGW1RiAs1Vrgb7Js+iQ==, registry: https://registry.npm.taobao.org/}
|
resolution: {integrity: sha512-XCtEjxoR3rmy000ujYRBp5kggWqzHz9+F20/yIMUWOzbvu0+KW1e14Fvb8h7SpNn+bfjGW1RiAs1Vrgb7Js+iQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@vitejs/plugin-legacy/-/plugin-legacy-3.0.1.tgz}
|
||||||
engines: {node: ^14.18.0 || >=16.0.0}
|
engines: {node: ^14.18.0 || >=16.0.0}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
terser: ^5.4.0
|
terser: ^5.4.0
|
||||||
@ -1472,7 +1472,7 @@ packages:
|
|||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/@vitejs/plugin-vue-jsx/3.0.0_vite@4.0.4+vue@3.2.45:
|
/@vitejs/plugin-vue-jsx/3.0.0_vite@4.0.4+vue@3.2.45:
|
||||||
resolution: {integrity: sha512-vurkuzgac5SYuxd2HUZqAFAWGTF10diKBwJNbCvnWijNZfXd+7jMtqjPFbGt7idOJUn584fP1Ar9j/GN2jQ3Ew==, registry: https://registry.npm.taobao.org/}
|
resolution: {integrity: sha512-vurkuzgac5SYuxd2HUZqAFAWGTF10diKBwJNbCvnWijNZfXd+7jMtqjPFbGt7idOJUn584fP1Ar9j/GN2jQ3Ew==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@vitejs/plugin-vue-jsx/-/plugin-vue-jsx-3.0.0.tgz}
|
||||||
engines: {node: ^14.18.0 || >=16.0.0}
|
engines: {node: ^14.18.0 || >=16.0.0}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
vite: ^4.0.0
|
vite: ^4.0.0
|
||||||
@ -1488,7 +1488,7 @@ packages:
|
|||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/@vitejs/plugin-vue/4.0.0_vite@4.0.4+vue@3.2.45:
|
/@vitejs/plugin-vue/4.0.0_vite@4.0.4+vue@3.2.45:
|
||||||
resolution: {integrity: sha512-e0X4jErIxAB5oLtDqbHvHpJe/uWNkdpYV83AOG2xo2tEVSzCzewgJMtREZM30wXnM5ls90hxiOtAuVU6H5JgbA==, registry: https://registry.npm.taobao.org/}
|
resolution: {integrity: sha512-e0X4jErIxAB5oLtDqbHvHpJe/uWNkdpYV83AOG2xo2tEVSzCzewgJMtREZM30wXnM5ls90hxiOtAuVU6H5JgbA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@vitejs/plugin-vue/-/plugin-vue-4.0.0.tgz}
|
||||||
engines: {node: ^14.18.0 || >=16.0.0}
|
engines: {node: ^14.18.0 || >=16.0.0}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
vite: ^4.0.0
|
vite: ^4.0.0
|
||||||
@ -1498,30 +1498,30 @@ packages:
|
|||||||
vue: 3.2.45
|
vue: 3.2.45
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/@volar/language-core/1.0.20:
|
/@volar/language-core/1.0.22:
|
||||||
resolution: {integrity: sha512-FU6TC+xQDLkBmp226NTeZ454MTb8VFLga6CIzWP+TsxuxGwB9Exvzof9TKpilIhTdF4IGVJJ4X1aCP6ycnLMbg==}
|
resolution: {integrity: sha512-hiJeCOqxNdtG/04FRGLGI9H9DVz2l6cTqPDBzwqplHXAWfMxjzUaGUrn9sfTG7YMFNZUgK4EYxJnRfhqdtbSFQ==}
|
||||||
dependencies:
|
dependencies:
|
||||||
'@volar/source-map': 1.0.20
|
'@volar/source-map': 1.0.22
|
||||||
muggle-string: 0.1.0
|
muggle-string: 0.1.0
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/@volar/source-map/1.0.20:
|
/@volar/source-map/1.0.22:
|
||||||
resolution: {integrity: sha512-6wwrvAjuy7HepvHW7CqCw5b57YIFrj9mcfJvjic1WCX9TqjnXAcuHFqiUPid7EdZ4SCRKCYQbWmWreThYbHaZw==}
|
resolution: {integrity: sha512-cv4gypHSP4MWVR82ed/+1IpI6794qAl0Q0+KJ+VGMVF8rVugsiF9QbyMCgjel9wNRsssQsazzsf6txOR9vHQiw==}
|
||||||
dependencies:
|
dependencies:
|
||||||
muggle-string: 0.1.0
|
muggle-string: 0.1.0
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/@volar/typescript/1.0.20:
|
/@volar/typescript/1.0.22:
|
||||||
resolution: {integrity: sha512-98D2+rC4igqPL7emqIf0NtIx3UYXZ8xqILiP/ihwP7G2T4oyoGr2vKEOwo49sUzvgUvQl2AI5p8ZQ71mFJfP7w==}
|
resolution: {integrity: sha512-VPyEicealSD4gqlE5/UQ1j3ietsO6Hfat40KtUEh/K+XEZ7h02b1KgFV64YEuBkBOaZ5hgvRW/WXKtQgXCl7Iw==}
|
||||||
dependencies:
|
dependencies:
|
||||||
'@volar/language-core': 1.0.20
|
'@volar/language-core': 1.0.22
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/@volar/vue-language-core/1.0.20:
|
/@volar/vue-language-core/1.0.22:
|
||||||
resolution: {integrity: sha512-Zz6yuxtA6BG6YU8KPwV4qhO5kh3e2Et6+YOu0QC43SiDgjIw2Vzzi+qAqm8UYofg9UBn82OArO1L+VrZPCCK8A==}
|
resolution: {integrity: sha512-Ki0G/ZdBj2/GLw+/VVH3n9XR/JL6krMIth02EekFn6JV4PGN3mNxbvoh6lOPSDZLR6biOU5nJPnnjpKy8nuXhw==}
|
||||||
dependencies:
|
dependencies:
|
||||||
'@volar/language-core': 1.0.20
|
'@volar/language-core': 1.0.22
|
||||||
'@volar/source-map': 1.0.20
|
'@volar/source-map': 1.0.22
|
||||||
'@vue/compiler-dom': 3.2.45
|
'@vue/compiler-dom': 3.2.45
|
||||||
'@vue/compiler-sfc': 3.2.45
|
'@vue/compiler-sfc': 3.2.45
|
||||||
'@vue/reactivity': 3.2.45
|
'@vue/reactivity': 3.2.45
|
||||||
@ -1530,19 +1530,19 @@ packages:
|
|||||||
vue-template-compiler: 2.7.14
|
vue-template-compiler: 2.7.14
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/@volar/vue-typescript/1.0.20:
|
/@volar/vue-typescript/1.0.22:
|
||||||
resolution: {integrity: sha512-FxucnAIZc503CfkdEGmUSw8EQfT31gi0DST7YmCNBK3cWOqJTF7UaHaBDpejnYGbsB568KZQbWTLNSpid5S/lA==}
|
resolution: {integrity: sha512-2T1o5z86PAev31OMtVOv/qp4P3ZVl9ln/2KTmykQE8Fh4A5F+868MW4nf5J7XQ6RNyx7RH9LhzgjvbqJpAfiYw==}
|
||||||
dependencies:
|
dependencies:
|
||||||
'@volar/typescript': 1.0.20
|
'@volar/typescript': 1.0.22
|
||||||
'@volar/vue-language-core': 1.0.20
|
'@volar/vue-language-core': 1.0.22
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/@vue/babel-helper-vue-transform-on/1.0.2:
|
/@vue/babel-helper-vue-transform-on/1.0.2:
|
||||||
resolution: {integrity: sha512-hz4R8tS5jMn8lDq6iD+yWL6XNB699pGIVLk7WSJnn1dbpjaazsjZQkieJoRX6gW5zpYSCFqQ7jUquPNY65tQYA==, registry: https://registry.npm.taobao.org/}
|
resolution: {integrity: sha512-hz4R8tS5jMn8lDq6iD+yWL6XNB699pGIVLk7WSJnn1dbpjaazsjZQkieJoRX6gW5zpYSCFqQ7jUquPNY65tQYA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.0.2.tgz}
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/@vue/babel-plugin-jsx/1.1.1_@babel+core@7.20.5:
|
/@vue/babel-plugin-jsx/1.1.1_@babel+core@7.20.5:
|
||||||
resolution: {integrity: sha512-j2uVfZjnB5+zkcbc/zsOc0fSNGCMMjaEXP52wdwdIfn0qjFfEYpYZBFKFg+HHnQeJCVrjOeO0YxgaL7DMrym9w==, registry: https://registry.npm.taobao.org/}
|
resolution: {integrity: sha512-j2uVfZjnB5+zkcbc/zsOc0fSNGCMMjaEXP52wdwdIfn0qjFfEYpYZBFKFg+HHnQeJCVrjOeO0YxgaL7DMrym9w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.1.1.tgz}
|
||||||
dependencies:
|
dependencies:
|
||||||
'@babel/helper-module-imports': 7.18.6
|
'@babel/helper-module-imports': 7.18.6
|
||||||
'@babel/plugin-syntax-jsx': 7.18.6_@babel+core@7.20.5
|
'@babel/plugin-syntax-jsx': 7.18.6_@babel+core@7.20.5
|
||||||
@ -1593,7 +1593,7 @@ packages:
|
|||||||
'@vue/shared': 3.2.45
|
'@vue/shared': 3.2.45
|
||||||
|
|
||||||
/@vue/devtools-api/6.4.5:
|
/@vue/devtools-api/6.4.5:
|
||||||
resolution: {integrity: sha512-JD5fcdIuFxU4fQyXUu3w2KpAJHzTVdN+p4iOX2lMWSHMOoQdMAcpFLZzm9Z/2nmsoZ1a96QEhZ26e50xLBsgOQ==, registry: https://registry.npm.taobao.org/}
|
resolution: {integrity: sha512-JD5fcdIuFxU4fQyXUu3w2KpAJHzTVdN+p4iOX2lMWSHMOoQdMAcpFLZzm9Z/2nmsoZ1a96QEhZ26e50xLBsgOQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@vue/devtools-api/-/devtools-api-6.4.5.tgz}
|
||||||
|
|
||||||
/@vue/reactivity-transform/3.2.45:
|
/@vue/reactivity-transform/3.2.45:
|
||||||
resolution: {integrity: sha512-BHVmzYAvM7vcU5WmuYqXpwaBHjsS8T63jlKGWVtHxAHIoMIlmaMyurUSEs1Zcg46M4AYT5MtB1U274/2aNzjJQ==}
|
resolution: {integrity: sha512-BHVmzYAvM7vcU5WmuYqXpwaBHjsS8T63jlKGWVtHxAHIoMIlmaMyurUSEs1Zcg46M4AYT5MtB1U274/2aNzjJQ==}
|
||||||
@ -1846,7 +1846,7 @@ packages:
|
|||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/@windicss/config/1.8.10:
|
/@windicss/config/1.8.10:
|
||||||
resolution: {integrity: sha512-O9SsC110b1Ik3YYa4Ck/0TWuCo7YFfA9KDrwD5sAeqscT5COIGK1HszdCT3oh0MJFej2wNrvpfyW9h6yQaW6PA==, registry: https://registry.npm.taobao.org/}
|
resolution: {integrity: sha512-O9SsC110b1Ik3YYa4Ck/0TWuCo7YFfA9KDrwD5sAeqscT5COIGK1HszdCT3oh0MJFej2wNrvpfyW9h6yQaW6PA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@windicss/config/-/config-1.8.10.tgz}
|
||||||
dependencies:
|
dependencies:
|
||||||
debug: 4.3.4
|
debug: 4.3.4
|
||||||
jiti: 1.16.0
|
jiti: 1.16.0
|
||||||
@ -1856,7 +1856,7 @@ packages:
|
|||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/@windicss/plugin-utils/1.8.10:
|
/@windicss/plugin-utils/1.8.10:
|
||||||
resolution: {integrity: sha512-Phqk5OW1w+Mv+ry6t7BzAeDq3aMhbI94gR49j9vQCufFfDGCHndhhjtMK0sBv+NPJUsIAIh6qayb1iwBCXUGrw==, registry: https://registry.npm.taobao.org/}
|
resolution: {integrity: sha512-Phqk5OW1w+Mv+ry6t7BzAeDq3aMhbI94gR49j9vQCufFfDGCHndhhjtMK0sBv+NPJUsIAIh6qayb1iwBCXUGrw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@windicss/plugin-utils/-/plugin-utils-1.8.10.tgz}
|
||||||
dependencies:
|
dependencies:
|
||||||
'@antfu/utils': 0.7.2
|
'@antfu/utils': 0.7.2
|
||||||
'@windicss/config': 1.8.10
|
'@windicss/config': 1.8.10
|
||||||
@ -2152,7 +2152,7 @@ packages:
|
|||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/braces/2.3.2:
|
/braces/2.3.2:
|
||||||
resolution: {integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==, registry: https://registry.npm.taobao.org/}
|
resolution: {integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/braces/-/braces-2.3.2.tgz}
|
||||||
engines: {node: '>=0.10.0'}
|
engines: {node: '>=0.10.0'}
|
||||||
dependencies:
|
dependencies:
|
||||||
arr-flatten: 1.1.0
|
arr-flatten: 1.1.0
|
||||||
@ -2239,7 +2239,7 @@ packages:
|
|||||||
engines: {node: '>=6'}
|
engines: {node: '>=6'}
|
||||||
|
|
||||||
/camelcase/6.3.0:
|
/camelcase/6.3.0:
|
||||||
resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==, registry: https://registry.npm.taobao.org/}
|
resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/camelcase/-/camelcase-6.3.0.tgz}
|
||||||
engines: {node: '>=10'}
|
engines: {node: '>=10'}
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
@ -2497,7 +2497,7 @@ packages:
|
|||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/convert-source-map/1.9.0:
|
/convert-source-map/1.9.0:
|
||||||
resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==, registry: https://registry.npm.taobao.org/}
|
resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/convert-source-map/-/convert-source-map-1.9.0.tgz}
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/copy-descriptor/0.1.1:
|
/copy-descriptor/0.1.1:
|
||||||
@ -2506,7 +2506,7 @@ packages:
|
|||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/core-js/3.26.1:
|
/core-js/3.26.1:
|
||||||
resolution: {integrity: sha512-21491RRQVzUn0GGM9Z1Jrpr6PNPxPi+Za8OM9q4tksTSnlbXXGKK1nXNg/QvwFYettXvSX6zWKCtHHfjN4puyA==, registry: https://registry.npm.taobao.org/}
|
resolution: {integrity: sha512-21491RRQVzUn0GGM9Z1Jrpr6PNPxPi+Za8OM9q4tksTSnlbXXGKK1nXNg/QvwFYettXvSX6zWKCtHHfjN4puyA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/core-js/-/core-js-3.26.1.tgz}
|
||||||
requiresBuild: true
|
requiresBuild: true
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
@ -2563,7 +2563,7 @@ packages:
|
|||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/cross-fetch/3.1.5:
|
/cross-fetch/3.1.5:
|
||||||
resolution: {integrity: sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==, registry: https://registry.npm.taobao.org/}
|
resolution: {integrity: sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/cross-fetch/-/cross-fetch-3.1.5.tgz}
|
||||||
dependencies:
|
dependencies:
|
||||||
node-fetch: 2.6.7
|
node-fetch: 2.6.7
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
@ -2848,7 +2848,7 @@ packages:
|
|||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/echarts/5.4.1:
|
/echarts/5.4.1:
|
||||||
resolution: {integrity: sha512-9ltS3M2JB0w2EhcYjCdmtrJ+6haZcW6acBolMGIuf01Hql1yrIV01L1aRj7jsaaIULJslEP9Z3vKlEmnJaWJVQ==, registry: https://registry.npm.taobao.org/}
|
resolution: {integrity: sha512-9ltS3M2JB0w2EhcYjCdmtrJ+6haZcW6acBolMGIuf01Hql1yrIV01L1aRj7jsaaIULJslEP9Z3vKlEmnJaWJVQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/echarts/-/echarts-5.4.1.tgz}
|
||||||
dependencies:
|
dependencies:
|
||||||
tslib: 2.3.0
|
tslib: 2.3.0
|
||||||
zrender: 5.4.1
|
zrender: 5.4.1
|
||||||
@ -3345,7 +3345,7 @@ packages:
|
|||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/fill-range/4.0.0:
|
/fill-range/4.0.0:
|
||||||
resolution: {integrity: sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==, registry: https://registry.npm.taobao.org/}
|
resolution: {integrity: sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/fill-range/-/fill-range-4.0.0.tgz}
|
||||||
engines: {node: '>=0.10.0'}
|
engines: {node: '>=0.10.0'}
|
||||||
dependencies:
|
dependencies:
|
||||||
extend-shallow: 2.0.1
|
extend-shallow: 2.0.1
|
||||||
@ -3355,7 +3355,7 @@ packages:
|
|||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/fill-range/7.0.1:
|
/fill-range/7.0.1:
|
||||||
resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==, registry: https://registry.npm.taobao.org/}
|
resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/fill-range/-/fill-range-7.0.1.tgz}
|
||||||
engines: {node: '>=8'}
|
engines: {node: '>=8'}
|
||||||
dependencies:
|
dependencies:
|
||||||
to-regex-range: 5.0.1
|
to-regex-range: 5.0.1
|
||||||
@ -3456,7 +3456,7 @@ packages:
|
|||||||
resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==}
|
resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==}
|
||||||
|
|
||||||
/gensync/1.0.0-beta.2:
|
/gensync/1.0.0-beta.2:
|
||||||
resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==, registry: https://registry.npm.taobao.org/}
|
resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/gensync/-/gensync-1.0.0-beta.2.tgz}
|
||||||
engines: {node: '>=6.9.0'}
|
engines: {node: '>=6.9.0'}
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
@ -3881,14 +3881,14 @@ packages:
|
|||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/is-number/3.0.0:
|
/is-number/3.0.0:
|
||||||
resolution: {integrity: sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==, registry: https://registry.npm.taobao.org/}
|
resolution: {integrity: sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/is-number/-/is-number-3.0.0.tgz}
|
||||||
engines: {node: '>=0.10.0'}
|
engines: {node: '>=0.10.0'}
|
||||||
dependencies:
|
dependencies:
|
||||||
kind-of: 3.2.2
|
kind-of: 3.2.2
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/is-number/7.0.0:
|
/is-number/7.0.0:
|
||||||
resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==, registry: https://registry.npm.taobao.org/}
|
resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/is-number/-/is-number-7.0.0.tgz}
|
||||||
engines: {node: '>=0.12.0'}
|
engines: {node: '>=0.12.0'}
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
@ -3976,7 +3976,7 @@ packages:
|
|||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/jiti/1.16.0:
|
/jiti/1.16.0:
|
||||||
resolution: {integrity: sha512-L3BJStEf5NAqNuzrpfbN71dp43mYIcBUlCRea/vdyv5dW/AYa1d4bpelko4SHdY3I6eN9Wzyasxirj1/vv5kmg==, registry: https://registry.npm.taobao.org/}
|
resolution: {integrity: sha512-L3BJStEf5NAqNuzrpfbN71dp43mYIcBUlCRea/vdyv5dW/AYa1d4bpelko4SHdY3I6eN9Wzyasxirj1/vv5kmg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/jiti/-/jiti-1.16.0.tgz}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
@ -3989,7 +3989,7 @@ packages:
|
|||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/js-tokens/4.0.0:
|
/js-tokens/4.0.0:
|
||||||
resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==, registry: https://registry.npm.taobao.org/}
|
resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/js-tokens/-/js-tokens-4.0.0.tgz}
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/js-tokens/8.0.0:
|
/js-tokens/8.0.0:
|
||||||
@ -4008,7 +4008,7 @@ packages:
|
|||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/jsesc/2.5.2:
|
/jsesc/2.5.2:
|
||||||
resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==, registry: https://registry.npm.taobao.org/}
|
resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/jsesc/-/jsesc-2.5.2.tgz}
|
||||||
engines: {node: '>=4'}
|
engines: {node: '>=4'}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
dev: true
|
dev: true
|
||||||
@ -4095,7 +4095,7 @@ packages:
|
|||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/kolorist/1.6.0:
|
/kolorist/1.6.0:
|
||||||
resolution: {integrity: sha512-dLkz37Ab97HWMx9KTes3Tbi3D1ln9fCAy2zr2YVExJasDRPGRaKcoE4fycWNtnCAJfjFqe0cnY+f8KT2JePEXQ==, registry: https://registry.npm.taobao.org/}
|
resolution: {integrity: sha512-dLkz37Ab97HWMx9KTes3Tbi3D1ln9fCAy2zr2YVExJasDRPGRaKcoE4fycWNtnCAJfjFqe0cnY+f8KT2JePEXQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/kolorist/-/kolorist-1.6.0.tgz}
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/levn/0.4.1:
|
/levn/0.4.1:
|
||||||
@ -4294,7 +4294,7 @@ packages:
|
|||||||
sourcemap-codec: 1.4.8
|
sourcemap-codec: 1.4.8
|
||||||
|
|
||||||
/magic-string/0.27.0:
|
/magic-string/0.27.0:
|
||||||
resolution: {integrity: sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==, registry: https://registry.npm.taobao.org/}
|
resolution: {integrity: sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/magic-string/-/magic-string-0.27.0.tgz}
|
||||||
engines: {node: '>=12'}
|
engines: {node: '>=12'}
|
||||||
dependencies:
|
dependencies:
|
||||||
'@jridgewell/sourcemap-codec': 1.4.14
|
'@jridgewell/sourcemap-codec': 1.4.14
|
||||||
@ -4506,7 +4506,7 @@ packages:
|
|||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/nanoid/3.3.4:
|
/nanoid/3.3.4:
|
||||||
resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==, registry: https://registry.npm.taobao.org/}
|
resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/nanoid/-/nanoid-3.3.4.tgz}
|
||||||
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
|
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
|
|
||||||
@ -4549,7 +4549,7 @@ packages:
|
|||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/node-fetch/2.6.7:
|
/node-fetch/2.6.7:
|
||||||
resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==, registry: https://registry.npm.taobao.org/}
|
resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/node-fetch/-/node-fetch-2.6.7.tgz}
|
||||||
engines: {node: 4.x || >=6.0.0}
|
engines: {node: 4.x || >=6.0.0}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
encoding: ^0.1.0
|
encoding: ^0.1.0
|
||||||
@ -4815,7 +4815,7 @@ packages:
|
|||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/pinia/2.0.28_prq2uz4lho2pwp6irk4cfkrxwu:
|
/pinia/2.0.28_prq2uz4lho2pwp6irk4cfkrxwu:
|
||||||
resolution: {integrity: sha512-YClq9DkqCblq9rlyUual7ezMu/iICWdBtfJrDt4oWU9Zxpijyz7xB2xTwx57DaBQ96UGvvTMORzALr+iO5PVMw==, registry: https://registry.npm.taobao.org/}
|
resolution: {integrity: sha512-YClq9DkqCblq9rlyUual7ezMu/iICWdBtfJrDt4oWU9Zxpijyz7xB2xTwx57DaBQ96UGvvTMORzALr+iO5PVMw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/pinia/-/pinia-2.0.28.tgz}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
'@vue/composition-api': ^1.4.0
|
'@vue/composition-api': ^1.4.0
|
||||||
typescript: '>=4.4.4'
|
typescript: '>=4.4.4'
|
||||||
@ -4925,7 +4925,7 @@ packages:
|
|||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/postcss/8.4.20:
|
/postcss/8.4.20:
|
||||||
resolution: {integrity: sha512-6Q04AXR1212bXr5fh03u8aAwbLxAQNGQ/Q1LNa0VfOI06ZAlhPHtQvE4OIdpj4kLThXilalPnmDSOD65DcHt+g==, registry: https://registry.npm.taobao.org/}
|
resolution: {integrity: sha512-6Q04AXR1212bXr5fh03u8aAwbLxAQNGQ/Q1LNa0VfOI06ZAlhPHtQvE4OIdpj4kLThXilalPnmDSOD65DcHt+g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/postcss/-/postcss-8.4.20.tgz}
|
||||||
engines: {node: ^10 || ^12 || >=14}
|
engines: {node: ^10 || ^12 || >=14}
|
||||||
dependencies:
|
dependencies:
|
||||||
nanoid: 3.3.4
|
nanoid: 3.3.4
|
||||||
@ -5108,7 +5108,7 @@ packages:
|
|||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/regenerator-runtime/0.13.11:
|
/regenerator-runtime/0.13.11:
|
||||||
resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==, registry: https://registry.npm.taobao.org/}
|
resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz}
|
||||||
|
|
||||||
/regex-not/1.0.2:
|
/regex-not/1.0.2:
|
||||||
resolution: {integrity: sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==}
|
resolution: {integrity: sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==}
|
||||||
@ -5207,7 +5207,7 @@ packages:
|
|||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/rollup-plugin-purge-icons/0.9.1:
|
/rollup-plugin-purge-icons/0.9.1:
|
||||||
resolution: {integrity: sha512-hRDKBsPUz47UMdBufki2feTmBF2ClEJlYqL7N6vpVAHSLd7V2BJUaNKOF7YYbLMofVVF+9hm44YSkYO6k9hUgg==, registry: https://registry.npm.taobao.org/}
|
resolution: {integrity: sha512-hRDKBsPUz47UMdBufki2feTmBF2ClEJlYqL7N6vpVAHSLd7V2BJUaNKOF7YYbLMofVVF+9hm44YSkYO6k9hUgg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/rollup-plugin-purge-icons/-/rollup-plugin-purge-icons-0.9.1.tgz}
|
||||||
engines: {node: '>= 12'}
|
engines: {node: '>= 12'}
|
||||||
dependencies:
|
dependencies:
|
||||||
'@purge-icons/core': 0.9.1
|
'@purge-icons/core': 0.9.1
|
||||||
@ -5428,7 +5428,7 @@ packages:
|
|||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/source-map-js/1.0.2:
|
/source-map-js/1.0.2:
|
||||||
resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==, registry: https://registry.npm.taobao.org/}
|
resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/source-map-js/-/source-map-js-1.0.2.tgz}
|
||||||
engines: {node: '>=0.10.0'}
|
engines: {node: '>=0.10.0'}
|
||||||
|
|
||||||
/source-map-resolve/0.5.3:
|
/source-map-resolve/0.5.3:
|
||||||
@ -5771,7 +5771,7 @@ packages:
|
|||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/systemjs/6.13.0:
|
/systemjs/6.13.0:
|
||||||
resolution: {integrity: sha512-P3cgh2bpaPvAO2NE3uRp/n6hmk4xPX4DQf+UzTlCAycssKdqhp6hjw+ENWe+aUS7TogKRFtptMosTSFeC6R55g==, registry: https://registry.npm.taobao.org/}
|
resolution: {integrity: sha512-P3cgh2bpaPvAO2NE3uRp/n6hmk4xPX4DQf+UzTlCAycssKdqhp6hjw+ENWe+aUS7TogKRFtptMosTSFeC6R55g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/systemjs/-/systemjs-6.13.0.tgz}
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/table/6.8.1:
|
/table/6.8.1:
|
||||||
@ -5820,7 +5820,7 @@ packages:
|
|||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/to-fast-properties/2.0.0:
|
/to-fast-properties/2.0.0:
|
||||||
resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==, registry: https://registry.npm.taobao.org/}
|
resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz}
|
||||||
engines: {node: '>=4'}
|
engines: {node: '>=4'}
|
||||||
|
|
||||||
/to-object-path/0.3.0:
|
/to-object-path/0.3.0:
|
||||||
@ -5831,7 +5831,7 @@ packages:
|
|||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/to-regex-range/2.1.1:
|
/to-regex-range/2.1.1:
|
||||||
resolution: {integrity: sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==, registry: https://registry.npm.taobao.org/}
|
resolution: {integrity: sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/to-regex-range/-/to-regex-range-2.1.1.tgz}
|
||||||
engines: {node: '>=0.10.0'}
|
engines: {node: '>=0.10.0'}
|
||||||
dependencies:
|
dependencies:
|
||||||
is-number: 3.0.0
|
is-number: 3.0.0
|
||||||
@ -5839,7 +5839,7 @@ packages:
|
|||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/to-regex-range/5.0.1:
|
/to-regex-range/5.0.1:
|
||||||
resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==, registry: https://registry.npm.taobao.org/}
|
resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/to-regex-range/-/to-regex-range-5.0.1.tgz}
|
||||||
engines: {node: '>=8.0'}
|
engines: {node: '>=8.0'}
|
||||||
dependencies:
|
dependencies:
|
||||||
is-number: 7.0.0
|
is-number: 7.0.0
|
||||||
@ -5856,7 +5856,7 @@ packages:
|
|||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/tr46/0.0.3:
|
/tr46/0.0.3:
|
||||||
resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==, registry: https://registry.npm.taobao.org/}
|
resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/tr46/-/tr46-0.0.3.tgz}
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/traverse/0.6.7:
|
/traverse/0.6.7:
|
||||||
@ -5904,7 +5904,7 @@ packages:
|
|||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/tslib/2.3.0:
|
/tslib/2.3.0:
|
||||||
resolution: {integrity: sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==, registry: https://registry.npm.taobao.org/}
|
resolution: {integrity: sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/tslib/-/tslib-2.3.0.tgz}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/tslib/2.4.1:
|
/tslib/2.4.1:
|
||||||
@ -6113,7 +6113,7 @@ packages:
|
|||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/vite-plugin-purge-icons/0.9.2_vite@4.0.4:
|
/vite-plugin-purge-icons/0.9.2_vite@4.0.4:
|
||||||
resolution: {integrity: sha512-vxJEMyNyckqLr/4HPsW9P6BMLUvOVMvjjFz3jLl4Wke1KWE8ITJUxIUwodxaOmEp9L2lxVk5an3TYeycZCfqFw==, registry: https://registry.npm.taobao.org/}
|
resolution: {integrity: sha512-vxJEMyNyckqLr/4HPsW9P6BMLUvOVMvjjFz3jLl4Wke1KWE8ITJUxIUwodxaOmEp9L2lxVk5an3TYeycZCfqFw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/vite-plugin-purge-icons/-/vite-plugin-purge-icons-0.9.2.tgz}
|
||||||
engines: {node: '>= 12'}
|
engines: {node: '>= 12'}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
vite: ^2.0.0 || ^3.0.0 || ^4.0.0
|
vite: ^2.0.0 || ^3.0.0 || ^4.0.0
|
||||||
@ -6171,7 +6171,7 @@ packages:
|
|||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/vite-plugin-windicss/1.8.10_vite@4.0.4:
|
/vite-plugin-windicss/1.8.10_vite@4.0.4:
|
||||||
resolution: {integrity: sha512-scywsuzo46lcTBohspmF0WiwhWEte6p+OUVrX4yr7VMRvLHMHVfLtJReyD5pppjijG7YOwVsZn7XBWWZtF658Q==, registry: https://registry.npm.taobao.org/}
|
resolution: {integrity: sha512-scywsuzo46lcTBohspmF0WiwhWEte6p+OUVrX4yr7VMRvLHMHVfLtJReyD5pppjijG7YOwVsZn7XBWWZtF658Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/vite-plugin-windicss/-/vite-plugin-windicss-1.8.10.tgz}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
vite: ^2.0.1 || ^3.0.0 || ^4.0.0
|
vite: ^2.0.1 || ^3.0.0 || ^4.0.0
|
||||||
dependencies:
|
dependencies:
|
||||||
@ -6281,14 +6281,14 @@ packages:
|
|||||||
he: 1.2.0
|
he: 1.2.0
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/vue-tsc/1.0.20_typescript@4.9.4:
|
/vue-tsc/1.0.22_typescript@4.9.4:
|
||||||
resolution: {integrity: sha512-AApewYXozAD7v4Iz9I0QzQebSVgvlUvpfbGe2e9TwtBdcw5gBsGiX8Oj5BdxRRiGnOdDG3BHPK8msl7Qhmy/1A==}
|
resolution: {integrity: sha512-xSxwgWR3czhv7sLKHWu6lzj9Xq6AtsCURVL45AY4TLGFszv2L2YlMgygXvqslyCM5bz9cyoIKSaZnzHqHTHjzA==}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
typescript: '*'
|
typescript: '*'
|
||||||
dependencies:
|
dependencies:
|
||||||
'@volar/vue-language-core': 1.0.20
|
'@volar/vue-language-core': 1.0.22
|
||||||
'@volar/vue-typescript': 1.0.20
|
'@volar/vue-typescript': 1.0.22
|
||||||
typescript: 4.9.4
|
typescript: 4.9.4
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
@ -6315,7 +6315,7 @@ packages:
|
|||||||
'@vue/shared': 3.2.45
|
'@vue/shared': 3.2.45
|
||||||
|
|
||||||
/vxe-table/4.3.7_vue@3.2.45+xe-utils@3.5.7:
|
/vxe-table/4.3.7_vue@3.2.45+xe-utils@3.5.7:
|
||||||
resolution: {integrity: sha512-v+d7eEQ5uqtVTQCts4xkW0S15LZcIuEukYHGXI53SdoUj2gLFggPYAxQr1y659CM/ESRWPz9LNVHpd97KkjGHw==, registry: https://registry.npm.taobao.org/}
|
resolution: {integrity: sha512-v+d7eEQ5uqtVTQCts4xkW0S15LZcIuEukYHGXI53SdoUj2gLFggPYAxQr1y659CM/ESRWPz9LNVHpd97KkjGHw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/vxe-table/-/vxe-table-4.3.7.tgz}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
vue: ^3.2.28
|
vue: ^3.2.28
|
||||||
xe-utils: ^3.5.0
|
xe-utils: ^3.5.0
|
||||||
@ -6329,7 +6329,7 @@ packages:
|
|||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/webidl-conversions/3.0.1:
|
/webidl-conversions/3.0.1:
|
||||||
resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==, registry: https://registry.npm.taobao.org/}
|
resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz}
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/webpack-sources/3.2.3:
|
/webpack-sources/3.2.3:
|
||||||
@ -6342,7 +6342,7 @@ packages:
|
|||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/whatwg-url/5.0.0:
|
/whatwg-url/5.0.0:
|
||||||
resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==, registry: https://registry.npm.taobao.org/}
|
resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/whatwg-url/-/whatwg-url-5.0.0.tgz}
|
||||||
dependencies:
|
dependencies:
|
||||||
tr46: 0.0.3
|
tr46: 0.0.3
|
||||||
webidl-conversions: 3.0.1
|
webidl-conversions: 3.0.1
|
||||||
@ -6510,7 +6510,7 @@ packages:
|
|||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/zrender/5.4.1:
|
/zrender/5.4.1:
|
||||||
resolution: {integrity: sha512-M4Z05BHWtajY2241EmMPHglDQAJ1UyHQcYsxDNzD9XLSkPDqMq4bB28v9Pb4mvHnVQ0GxyTklZ/69xCFP6RXBA==, registry: https://registry.npm.taobao.org/}
|
resolution: {integrity: sha512-M4Z05BHWtajY2241EmMPHglDQAJ1UyHQcYsxDNzD9XLSkPDqMq4bB28v9Pb4mvHnVQ0GxyTklZ/69xCFP6RXBA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/zrender/-/zrender-5.4.1.tgz}
|
||||||
dependencies:
|
dependencies:
|
||||||
tslib: 2.3.0
|
tslib: 2.3.0
|
||||||
dev: false
|
dev: false
|
||||||
|
@ -353,7 +353,6 @@ const select = ref()
|
|||||||
watch(
|
watch(
|
||||||
() => select.value,
|
() => select.value,
|
||||||
() => {
|
() => {
|
||||||
console.info(select.value)
|
|
||||||
if (select.value == 'custom') {
|
if (select.value == 'custom') {
|
||||||
open()
|
open()
|
||||||
} else {
|
} else {
|
||||||
|
@ -165,7 +165,7 @@ const filterSearchSchema = (crudSchema: VxeCrudSchema): VxeFormItemProps[] => {
|
|||||||
// 添加搜索按钮
|
// 添加搜索按钮
|
||||||
const buttons: VxeFormItemProps = {
|
const buttons: VxeFormItemProps = {
|
||||||
span: 24,
|
span: 24,
|
||||||
align: 'center',
|
align: 'right',
|
||||||
collapseNode: searchSchema.length > spanLength,
|
collapseNode: searchSchema.length > spanLength,
|
||||||
itemRender: {
|
itemRender: {
|
||||||
name: '$buttons',
|
name: '$buttons',
|
||||||
|
@ -26,10 +26,10 @@ import '@/styles/index.scss'
|
|||||||
import '@/plugins/animate.css'
|
import '@/plugins/animate.css'
|
||||||
|
|
||||||
// 路由
|
// 路由
|
||||||
import { setupRouter } from './router'
|
import router, { setupRouter } from '@/router'
|
||||||
|
|
||||||
// 权限
|
// 权限
|
||||||
import { setupAuth } from './directives'
|
import { setupAuth } from '@/directives'
|
||||||
|
|
||||||
import { createApp } from 'vue'
|
import { createApp } from 'vue'
|
||||||
|
|
||||||
@ -53,6 +53,8 @@ const setupAll = async () => {
|
|||||||
|
|
||||||
setupAuth(app)
|
setupAuth(app)
|
||||||
|
|
||||||
|
await router.isReady()
|
||||||
|
|
||||||
app.mount('#app')
|
app.mount('#app')
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4,3 +4,4 @@ import './dict'
|
|||||||
import './html'
|
import './html'
|
||||||
import './link'
|
import './link'
|
||||||
import './img'
|
import './img'
|
||||||
|
import './preview'
|
||||||
|
@ -0,0 +1,34 @@
|
|||||||
|
import { VXETable } from 'vxe-table'
|
||||||
|
import { ElImage, ElLink } from 'element-plus'
|
||||||
|
|
||||||
|
// 图片渲染
|
||||||
|
VXETable.renderer.add('XPreview', {
|
||||||
|
// 默认显示模板
|
||||||
|
renderDefault(_renderOpts, params) {
|
||||||
|
const { row, column } = params
|
||||||
|
if (row.type.indexOf('image/') === 0) {
|
||||||
|
return (
|
||||||
|
<ElImage
|
||||||
|
style="width: 80px; height: 50px"
|
||||||
|
src={row[column.field]}
|
||||||
|
key={row[column.field]}
|
||||||
|
preview-src-list={[row[column.field]]}
|
||||||
|
fit="contain"
|
||||||
|
lazy
|
||||||
|
></ElImage>
|
||||||
|
)
|
||||||
|
} else if (row.type.indexOf('video/') === 0) {
|
||||||
|
return (
|
||||||
|
<video>
|
||||||
|
<source src={row[column.field]}></source>
|
||||||
|
</video>
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
return (
|
||||||
|
<ElLink href={row[column.field]} target="_blank">
|
||||||
|
{row[column.field]}
|
||||||
|
</ElLink>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
@ -6,15 +6,11 @@ import { isRelogin } from '@/config/axios/service'
|
|||||||
import { getAccessToken } from '@/utils/auth'
|
import { getAccessToken } from '@/utils/auth'
|
||||||
import { useTitle } from '@/hooks/web/useTitle'
|
import { useTitle } from '@/hooks/web/useTitle'
|
||||||
import { useNProgress } from '@/hooks/web/useNProgress'
|
import { useNProgress } from '@/hooks/web/useNProgress'
|
||||||
import { CACHE_KEY, useCache } from '@/hooks/web/useCache'
|
|
||||||
import { usePageLoading } from '@/hooks/web/usePageLoading'
|
import { usePageLoading } from '@/hooks/web/usePageLoading'
|
||||||
import { useDictStoreWithOut } from '@/store/modules/dict'
|
import { useDictStoreWithOut } from '@/store/modules/dict'
|
||||||
import { useUserStoreWithOut } from '@/store/modules/user'
|
import { useUserStoreWithOut } from '@/store/modules/user'
|
||||||
import { usePermissionStoreWithOut } from '@/store/modules/permission'
|
import { usePermissionStoreWithOut } from '@/store/modules/permission'
|
||||||
import { getInfoApi } from '@/api/login'
|
import { getInfoApi } from '@/api/login'
|
||||||
import { listSimpleDictDataApi } from '@/api/system/dict/dict.data'
|
|
||||||
|
|
||||||
const { wsCache } = useCache()
|
|
||||||
|
|
||||||
const { start, done } = useNProgress()
|
const { start, done } = useNProgress()
|
||||||
|
|
||||||
@ -50,10 +46,8 @@ router.beforeEach(async (to, from, next) => {
|
|||||||
const dictStore = useDictStoreWithOut()
|
const dictStore = useDictStoreWithOut()
|
||||||
const userStore = useUserStoreWithOut()
|
const userStore = useUserStoreWithOut()
|
||||||
const permissionStore = usePermissionStoreWithOut()
|
const permissionStore = usePermissionStoreWithOut()
|
||||||
const dictMap = wsCache.get(CACHE_KEY.DICT_CACHE)
|
if (!dictStore.getIsSetDict) {
|
||||||
if (!dictMap) {
|
dictStore.setDictMap()
|
||||||
const res = await listSimpleDictDataApi()
|
|
||||||
dictStore.setDictMap(res)
|
|
||||||
}
|
}
|
||||||
if (!userStore.getIsSetUser) {
|
if (!userStore.getIsSetUser) {
|
||||||
isRelogin.show = true
|
isRelogin.show = true
|
||||||
|
@ -3,6 +3,7 @@ import { store } from '../index'
|
|||||||
import { DictDataVO } from '@/api/system/dict/types'
|
import { DictDataVO } from '@/api/system/dict/types'
|
||||||
import { CACHE_KEY, useCache } from '@/hooks/web/useCache'
|
import { CACHE_KEY, useCache } from '@/hooks/web/useCache'
|
||||||
const { wsCache } = useCache('sessionStorage')
|
const { wsCache } = useCache('sessionStorage')
|
||||||
|
import { listSimpleDictDataApi } from '@/api/system/dict/dict.data'
|
||||||
|
|
||||||
export interface DictValueType {
|
export interface DictValueType {
|
||||||
value: any
|
value: any
|
||||||
@ -16,45 +17,54 @@ export interface DictTypeType {
|
|||||||
}
|
}
|
||||||
export interface DictState {
|
export interface DictState {
|
||||||
dictMap: Map<string, any>
|
dictMap: Map<string, any>
|
||||||
|
isSetDict: boolean
|
||||||
}
|
}
|
||||||
|
|
||||||
export const useDictStore = defineStore('dict', {
|
export const useDictStore = defineStore('dict', {
|
||||||
state: (): DictState => ({
|
state: (): DictState => ({
|
||||||
dictMap: new Map<string, any>()
|
dictMap: new Map<string, any>(),
|
||||||
|
isSetDict: false
|
||||||
}),
|
}),
|
||||||
getters: {
|
getters: {
|
||||||
getDictMap(): Recordable {
|
getDictMap(): Recordable {
|
||||||
const dictMap = wsCache.get(CACHE_KEY.DICT_CACHE)
|
const dictMap = wsCache.get(CACHE_KEY.DICT_CACHE)
|
||||||
return dictMap ? dictMap : this.dictMap
|
if (dictMap) {
|
||||||
},
|
this.dictMap = dictMap
|
||||||
getHasDictData(): boolean {
|
|
||||||
if (this.dictMap.size > 0) {
|
|
||||||
return true
|
|
||||||
} else {
|
|
||||||
return false
|
|
||||||
}
|
}
|
||||||
|
return this.dictMap
|
||||||
|
},
|
||||||
|
getIsSetDict(): boolean {
|
||||||
|
return this.isSetDict
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
actions: {
|
actions: {
|
||||||
setDictMap(dictMap: Recordable) {
|
async setDictMap() {
|
||||||
// 设置数据
|
const dictMap = wsCache.get(CACHE_KEY.DICT_CACHE)
|
||||||
const dictDataMap = new Map<string, any>()
|
if (dictMap) {
|
||||||
dictMap.forEach((dictData: DictDataVO) => {
|
this.dictMap = dictMap
|
||||||
// 获得 dictType 层级
|
this.isSetDict = true
|
||||||
const enumValueObj = dictDataMap[dictData.dictType]
|
} else {
|
||||||
if (!enumValueObj) {
|
const res = await listSimpleDictDataApi()
|
||||||
dictDataMap[dictData.dictType] = []
|
// 设置数据
|
||||||
}
|
const dictDataMap = new Map<string, any>()
|
||||||
// 处理 dictValue 层级
|
res.forEach((dictData: DictDataVO) => {
|
||||||
dictDataMap[dictData.dictType].push({
|
// 获得 dictType 层级
|
||||||
value: dictData.value,
|
const enumValueObj = dictDataMap[dictData.dictType]
|
||||||
label: dictData.label,
|
if (!enumValueObj) {
|
||||||
colorType: dictData.colorType,
|
dictDataMap[dictData.dictType] = []
|
||||||
cssClass: dictData.cssClass
|
}
|
||||||
|
// 处理 dictValue 层级
|
||||||
|
dictDataMap[dictData.dictType].push({
|
||||||
|
value: dictData.value,
|
||||||
|
label: dictData.label,
|
||||||
|
colorType: dictData.colorType,
|
||||||
|
cssClass: dictData.cssClass
|
||||||
|
})
|
||||||
})
|
})
|
||||||
})
|
this.dictMap = dictDataMap
|
||||||
this.dictMap = dictDataMap
|
this.isSetDict = true
|
||||||
wsCache.set(CACHE_KEY.DICT_CACHE, dictDataMap, { exp: 60 }) // 60 秒 过期
|
wsCache.set(CACHE_KEY.DICT_CACHE, dictDataMap, { exp: 60 }) // 60 秒 过期
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
@ -36,45 +36,30 @@ export const formatToken = (token: string): string => {
|
|||||||
}
|
}
|
||||||
// ========== 账号相关 ==========
|
// ========== 账号相关 ==========
|
||||||
|
|
||||||
const UsernameKey = 'USERNAME'
|
const LoginFormKey = 'LOGINFORM'
|
||||||
const PasswordKey = 'PASSWORD'
|
|
||||||
const RememberMeKey = 'REMEMBER_ME'
|
|
||||||
|
|
||||||
export const getUsername = () => {
|
export type LoginFormType = {
|
||||||
return wsCache.get(UsernameKey)
|
tenantName: string
|
||||||
|
username: string
|
||||||
|
password: string
|
||||||
|
rememberMe: boolean
|
||||||
}
|
}
|
||||||
|
|
||||||
export const setUsername = (username: string) => {
|
export const getLoginForm = () => {
|
||||||
wsCache.set(UsernameKey, username, { exp: 30 * 24 * 60 * 60 })
|
const loginForm: LoginFormType = wsCache.get(LoginFormKey)
|
||||||
|
if (loginForm) {
|
||||||
|
loginForm.password = decrypt(loginForm.password) as string
|
||||||
|
}
|
||||||
|
return loginForm
|
||||||
}
|
}
|
||||||
|
|
||||||
export const removeUsername = () => {
|
export const setLoginForm = (loginForm: LoginFormType) => {
|
||||||
wsCache.delete(UsernameKey)
|
loginForm.password = encrypt(loginForm.password) as string
|
||||||
|
wsCache.set(LoginFormKey, loginForm, { exp: 30 * 24 * 60 * 60 })
|
||||||
}
|
}
|
||||||
|
|
||||||
export const getPassword = () => {
|
export const removeLoginForm = () => {
|
||||||
const password = wsCache.get(PasswordKey)
|
wsCache.delete(LoginFormKey)
|
||||||
return password ? decrypt(password) : undefined
|
|
||||||
}
|
|
||||||
|
|
||||||
export const setPassword = (password: string) => {
|
|
||||||
wsCache.set(PasswordKey, encrypt(password), { exp: 30 * 24 * 60 * 60 })
|
|
||||||
}
|
|
||||||
|
|
||||||
export const removePassword = () => {
|
|
||||||
wsCache.delete(PasswordKey)
|
|
||||||
}
|
|
||||||
|
|
||||||
export const getRememberMe = () => {
|
|
||||||
return wsCache.get(RememberMeKey) === true
|
|
||||||
}
|
|
||||||
|
|
||||||
export const setRememberMe = (rememberMe: boolean) => {
|
|
||||||
wsCache.set(RememberMeKey, rememberMe, { exp: 30 * 24 * 60 * 60 })
|
|
||||||
}
|
|
||||||
|
|
||||||
export const removeRememberMe = () => {
|
|
||||||
wsCache.delete(RememberMeKey)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// ========== 租户相关 ==========
|
// ========== 租户相关 ==========
|
||||||
|
@ -148,7 +148,6 @@ import { useIcon } from '@/hooks/web/useIcon'
|
|||||||
import { useMessage } from '@/hooks/web/useMessage'
|
import { useMessage } from '@/hooks/web/useMessage'
|
||||||
import { required } from '@/utils/formRules'
|
import { required } from '@/utils/formRules'
|
||||||
import * as authUtil from '@/utils/auth'
|
import * as authUtil from '@/utils/auth'
|
||||||
import { decrypt } from '@/utils/jsencrypt'
|
|
||||||
import { Verify } from '@/components/Verifition'
|
import { Verify } from '@/components/Verifition'
|
||||||
import { usePermissionStore } from '@/store/modules/permission'
|
import { usePermissionStore } from '@/store/modules/permission'
|
||||||
import * as LoginApi from '@/api/login'
|
import * as LoginApi from '@/api/login'
|
||||||
@ -180,10 +179,6 @@ const loginData = reactive({
|
|||||||
isShowPassword: false,
|
isShowPassword: false,
|
||||||
captchaEnable: import.meta.env.VITE_APP_CAPTCHA_ENABLE,
|
captchaEnable: import.meta.env.VITE_APP_CAPTCHA_ENABLE,
|
||||||
tenantEnable: import.meta.env.VITE_APP_TENANT_ENABLE,
|
tenantEnable: import.meta.env.VITE_APP_TENANT_ENABLE,
|
||||||
token: '',
|
|
||||||
loading: {
|
|
||||||
signIn: false
|
|
||||||
},
|
|
||||||
loginForm: {
|
loginForm: {
|
||||||
tenantName: '芋道源码',
|
tenantName: '芋道源码',
|
||||||
username: 'admin',
|
username: 'admin',
|
||||||
@ -194,22 +189,10 @@ const loginData = reactive({
|
|||||||
})
|
})
|
||||||
|
|
||||||
const socialList = [
|
const socialList = [
|
||||||
{
|
{ icon: 'ant-design:github-filled', type: 0 },
|
||||||
icon: 'ant-design:github-filled',
|
{ icon: 'ant-design:wechat-filled', type: 30 },
|
||||||
type: 0
|
{ icon: 'ant-design:alipay-circle-filled', type: 0 },
|
||||||
},
|
{ icon: 'ant-design:dingtalk-circle-filled', type: 20 }
|
||||||
{
|
|
||||||
icon: 'ant-design:wechat-filled',
|
|
||||||
type: 30
|
|
||||||
},
|
|
||||||
{
|
|
||||||
icon: 'ant-design:alipay-circle-filled',
|
|
||||||
type: 0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
icon: 'ant-design:dingtalk-circle-filled',
|
|
||||||
type: 20
|
|
||||||
}
|
|
||||||
]
|
]
|
||||||
|
|
||||||
// 获取验证码
|
// 获取验证码
|
||||||
@ -232,18 +215,15 @@ const getTenantId = async () => {
|
|||||||
}
|
}
|
||||||
// 记住我
|
// 记住我
|
||||||
const getCookie = () => {
|
const getCookie = () => {
|
||||||
const username = authUtil.getUsername()
|
const loginForm = authUtil.getLoginForm()
|
||||||
const password = authUtil.getPassword()
|
if (loginForm) {
|
||||||
? decrypt(authUtil.getPassword() as unknown as string)
|
loginData.loginForm = {
|
||||||
: undefined
|
...loginData.loginForm,
|
||||||
const rememberMe = authUtil.getRememberMe()
|
username: loginForm.username ? loginForm.username : loginData.loginForm.username,
|
||||||
const tenantName = authUtil.getTenantName()
|
password: loginForm.password ? loginForm.password : loginData.loginForm.password,
|
||||||
loginData.loginForm = {
|
rememberMe: loginForm.rememberMe ? true : false,
|
||||||
...loginData.loginForm,
|
tenantName: loginForm.tenantName ? loginForm.tenantName : loginData.loginForm.tenantName
|
||||||
username: username ? username : loginData.loginForm.username,
|
}
|
||||||
password: password ? password : loginData.loginForm.password,
|
|
||||||
rememberMe: rememberMe ? true : false,
|
|
||||||
tenantName: tenantName ? tenantName : loginData.loginForm.tenantName
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// 登录
|
// 登录
|
||||||
@ -266,15 +246,9 @@ const handleLogin = async (params) => {
|
|||||||
background: 'rgba(0, 0, 0, 0.7)'
|
background: 'rgba(0, 0, 0, 0.7)'
|
||||||
})
|
})
|
||||||
if (loginData.loginForm.rememberMe) {
|
if (loginData.loginForm.rememberMe) {
|
||||||
authUtil.setUsername(loginData.loginForm.username)
|
authUtil.setLoginForm(loginData.loginForm)
|
||||||
authUtil.setPassword(loginData.loginForm.password)
|
|
||||||
authUtil.setRememberMe(loginData.loginForm.rememberMe)
|
|
||||||
authUtil.setTenantName(loginData.loginForm.tenantName)
|
|
||||||
} else {
|
} else {
|
||||||
authUtil.removeUsername()
|
authUtil.removeLoginForm()
|
||||||
authUtil.removePassword()
|
|
||||||
authUtil.removeRememberMe()
|
|
||||||
authUtil.removeTenantName()
|
|
||||||
}
|
}
|
||||||
authUtil.setToken(res)
|
authUtil.setToken(res)
|
||||||
if (!redirect.value) {
|
if (!redirect.value) {
|
||||||
|
@ -23,7 +23,7 @@ const crudSchemas = reactive<VxeCrudSchema>({
|
|||||||
field: 'url',
|
field: 'url',
|
||||||
table: {
|
table: {
|
||||||
cellRender: {
|
cellRender: {
|
||||||
name: 'XImg'
|
name: 'XPreview'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
118
yudao-ui-admin-vue3/src/views/infra/webSocket/index.vue
Normal file
118
yudao-ui-admin-vue3/src/views/infra/webSocket/index.vue
Normal file
@ -0,0 +1,118 @@
|
|||||||
|
<template>
|
||||||
|
<div class="flex">
|
||||||
|
<el-card class="w-1/2" :gutter="12" shadow="always">
|
||||||
|
<template #header>
|
||||||
|
<div class="card-header">
|
||||||
|
<span>连接</span>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<div class="flex items-center">
|
||||||
|
<span class="text-lg font-medium mr-4"> 连接状态: </span>
|
||||||
|
<el-tag :color="getTagColor">{{ status }}</el-tag>
|
||||||
|
</div>
|
||||||
|
<hr class="my-4" />
|
||||||
|
|
||||||
|
<div class="flex">
|
||||||
|
<el-input v-model="server" disabled>
|
||||||
|
<template #prepend> 服务地址 </template>
|
||||||
|
</el-input>
|
||||||
|
<el-button :type="getIsOpen ? 'danger' : 'primary'" @click="toggle">
|
||||||
|
{{ getIsOpen ? '关闭连接' : '开启连接' }}
|
||||||
|
</el-button>
|
||||||
|
</div>
|
||||||
|
<p class="text-lg font-medium mt-4">设置</p>
|
||||||
|
<hr class="my-4" />
|
||||||
|
<el-input
|
||||||
|
v-model="sendValue"
|
||||||
|
:autosize="{ minRows: 2, maxRows: 4 }"
|
||||||
|
type="textarea"
|
||||||
|
:disabled="!getIsOpen"
|
||||||
|
clearable
|
||||||
|
/>
|
||||||
|
<el-button type="primary" block class="mt-4" :disabled="!getIsOpen" @click="handlerSend">
|
||||||
|
发送
|
||||||
|
</el-button>
|
||||||
|
</el-card>
|
||||||
|
<el-card class="w-1/2" :gutter="12" shadow="always">
|
||||||
|
<template #header>
|
||||||
|
<div class="card-header">
|
||||||
|
<span>消息记录</span>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<div class="max-h-80 overflow-auto">
|
||||||
|
<ul>
|
||||||
|
<li v-for="item in getList" class="mt-2" :key="item.time">
|
||||||
|
<div class="flex items-center">
|
||||||
|
<span class="mr-2 text-primary font-medium">收到消息:</span>
|
||||||
|
<span>{{ dayjs(item.time).format('YYYY-MM-DD HH:mm:ss') }}</span>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
{{ item.res }}
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</el-card>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { computed, reactive, ref, watchEffect } from 'vue'
|
||||||
|
import { ElCard, ElInput, ElTag } from 'element-plus'
|
||||||
|
import { useWebSocket } from '@vueuse/core'
|
||||||
|
import dayjs from 'dayjs'
|
||||||
|
import { useUserStore } from '@/store/modules/user'
|
||||||
|
|
||||||
|
const userStore = useUserStore()
|
||||||
|
|
||||||
|
const sendValue = ref('')
|
||||||
|
|
||||||
|
const server = ref(
|
||||||
|
(import.meta.env.VITE_BASE_URL + '/websocket/message').replace('http', 'ws') +
|
||||||
|
'?userId=' +
|
||||||
|
userStore.getUser.id
|
||||||
|
)
|
||||||
|
|
||||||
|
const state = reactive({
|
||||||
|
recordList: [] as { id: number; time: number; res: string }[]
|
||||||
|
})
|
||||||
|
|
||||||
|
const { status, data, send, close, open } = useWebSocket(server.value, {
|
||||||
|
autoReconnect: false,
|
||||||
|
heartbeat: true
|
||||||
|
})
|
||||||
|
|
||||||
|
watchEffect(() => {
|
||||||
|
if (data.value) {
|
||||||
|
try {
|
||||||
|
const res = JSON.parse(data.value)
|
||||||
|
state.recordList.push(res)
|
||||||
|
} catch (error) {
|
||||||
|
state.recordList.push({
|
||||||
|
res: data.value,
|
||||||
|
id: Math.ceil(Math.random() * 1000),
|
||||||
|
time: new Date().getTime()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
const getIsOpen = computed(() => status.value === 'OPEN')
|
||||||
|
const getTagColor = computed(() => (getIsOpen.value ? 'success' : 'red'))
|
||||||
|
|
||||||
|
const getList = computed(() => {
|
||||||
|
return [...state.recordList].reverse()
|
||||||
|
})
|
||||||
|
|
||||||
|
function handlerSend() {
|
||||||
|
send(sendValue.value)
|
||||||
|
sendValue.value = ''
|
||||||
|
}
|
||||||
|
|
||||||
|
function toggle() {
|
||||||
|
if (getIsOpen.value) {
|
||||||
|
close()
|
||||||
|
} else {
|
||||||
|
open()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
@ -146,7 +146,6 @@ const submitForm = async () => {
|
|||||||
...(treeRef.value!.getCheckedKeys(false) as unknown as Array<number>),
|
...(treeRef.value!.getCheckedKeys(false) as unknown as Array<number>),
|
||||||
...(treeRef.value!.getHalfCheckedKeys() as unknown as Array<number>)
|
...(treeRef.value!.getHalfCheckedKeys() as unknown as Array<number>)
|
||||||
]
|
]
|
||||||
console.info(data.menuIds)
|
|
||||||
if (actionType.value === 'create') {
|
if (actionType.value === 'create') {
|
||||||
await TenantPackageApi.createTenantPackageTypeApi(data)
|
await TenantPackageApi.createTenantPackageTypeApi(data)
|
||||||
message.success(t('common.createSuccess'))
|
message.success(t('common.createSuccess'))
|
||||||
|
@ -136,8 +136,8 @@
|
|||||||
|
|
||||||
<script>
|
<script>
|
||||||
import {getCache, getKeyDefineList, getKeyList, getKeyValue, deleteKey, deleteKeys} from "@/api/infra/redis";
|
import {getCache, getKeyDefineList, getKeyList, getKeyValue, deleteKey, deleteKeys} from "@/api/infra/redis";
|
||||||
import echarts from "echarts";
|
import * as echarts from 'echarts'
|
||||||
|
require('echarts/theme/macarons') // echarts theme
|
||||||
export default {
|
export default {
|
||||||
name: "Server",
|
name: "Server",
|
||||||
data () {
|
data () {
|
||||||
|
92
yudao-ui-admin/src/views/infra/webSocket/index.vue
Normal file
92
yudao-ui-admin/src/views/infra/webSocket/index.vue
Normal file
@ -0,0 +1,92 @@
|
|||||||
|
<template>
|
||||||
|
<div class="app-container">
|
||||||
|
<el-form label-width="120px">
|
||||||
|
<el-row type="flex" :gutter="0">
|
||||||
|
<el-col :sm="12">
|
||||||
|
<el-form-item label="WebSocket地址" size="small">
|
||||||
|
<el-input v-model="url" type="text"/>
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
<el-col :offset="1">
|
||||||
|
<el-form-item label="" label-width="0px" size="small">
|
||||||
|
<el-button @click="connect" type="primary" :disabled="ws&&ws.readyState===1">
|
||||||
|
{{ ws && ws.readyState === 1 ? "已连接" : "连接" }}
|
||||||
|
</el-button>
|
||||||
|
<el-button @click="exit" type="danger">断开</el-button>
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
<el-form-item label="发送内容" size="small">
|
||||||
|
<el-input type="textarea" v-model="message" :rows="5"/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="" size="small">
|
||||||
|
<el-button type="success" @click="send">发送消息</el-button>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="接收内容" size="small">
|
||||||
|
<el-input type="textarea" v-model="content" :rows="12" disabled/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="" size="small">
|
||||||
|
<el-button type="info" @click="content=''">清空消息</el-button>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import store from "@/store";
|
||||||
|
import {getNowDateTime} from "@/utils/ruoyi";
|
||||||
|
|
||||||
|
export default {
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
url: process.env.VUE_APP_BASE_API + "/websocket/message",
|
||||||
|
message: "",
|
||||||
|
content: "",
|
||||||
|
ws: null,
|
||||||
|
};
|
||||||
|
},
|
||||||
|
created() {
|
||||||
|
this.url = this.url.replace("http", "ws")
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
connect() {
|
||||||
|
if (!'WebSocket' in window) {
|
||||||
|
this.$modal.msgError("您的浏览器不支持WebSocket");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const userId = store.getters.userId;
|
||||||
|
this.ws = new WebSocket(this.url + "?userId=" + userId);
|
||||||
|
const self = this;
|
||||||
|
this.ws.onopen = function (event) {
|
||||||
|
self.content = self.content + "\n**********************连接开始**********************\n";
|
||||||
|
};
|
||||||
|
this.ws.onmessage = function (event) {
|
||||||
|
self.content = self.content + "接收时间:" + getNowDateTime() + "\n" + event.data + "\n";
|
||||||
|
};
|
||||||
|
this.ws.onclose = function (event) {
|
||||||
|
self.content = self.content + "**********************连接关闭**********************\n";
|
||||||
|
};
|
||||||
|
this.ws.error = function (event) {
|
||||||
|
self.content = self.content + "**********************连接异常**********************\n";
|
||||||
|
};
|
||||||
|
},
|
||||||
|
exit() {
|
||||||
|
if (this.ws) {
|
||||||
|
this.ws.close();
|
||||||
|
this.ws = null;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
send() {
|
||||||
|
if (!this.ws || this.ws.readyState !== 1) {
|
||||||
|
this.$modal.msgError("未连接到服务器");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!this.message) {
|
||||||
|
this.$modal.msgError("请输入发送内容");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.ws.send(this.message);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
};
|
||||||
|
</script>
|
@ -30,7 +30,7 @@ module.exports = vm => {
|
|||||||
if (!isRefreshToken) {
|
if (!isRefreshToken) {
|
||||||
isRefreshToken = true
|
isRefreshToken = true
|
||||||
// 1. 如果获取不到刷新令牌,则只能执行登出操作
|
// 1. 如果获取不到刷新令牌,则只能执行登出操作
|
||||||
if (!vm.$store.getters.refreshToken()) {
|
if (!vm.$store.getters.refreshToken) {
|
||||||
vm.$store.commit('CLEAR_LOGIN_INFO')
|
vm.$store.commit('CLEAR_LOGIN_INFO')
|
||||||
return Promise.reject(res)
|
return Promise.reject(res)
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user