init:初始化1.0.1版本代码
|
|
@ -0,0 +1,19 @@
|
|||
# 基于java镜像创建新镜像
|
||||
FROM java:8
|
||||
# 作者
|
||||
MAINTAINER xiaose
|
||||
|
||||
RUN mkdir -p /bcrjl/miwifi-agent
|
||||
|
||||
WORKDIR /bcrjl/miwifi-agent
|
||||
|
||||
EXPOSE 24317
|
||||
|
||||
ADD ./target/miwifi-agent.jar /bcrjl/miwifi-agent/miwifi-agent.jar
|
||||
|
||||
ENV BMW_URL = 192.168.31.1
|
||||
ENV BMW_PASSWORD = 123456
|
||||
ENV WEB_PASSWORD = 123456
|
||||
|
||||
CMD java -Djava.security.egd=file:/dev/./urandom -jar /bcrjl/miwifi-agent/miwifi-agent.jar --bmw.url=$BMW_URL --bmw.password=$BMW_PASSWORD --bmw.web-password=$WEB_PASSWORD
|
||||
|
||||
|
|
@ -0,0 +1,47 @@
|
|||
# Mi-Wifi-Agent 服务
|
||||
|
||||
## 简介
|
||||
|
||||
基于官方(小米/红米路由器)固件API接口实现的第三方管理服务。
|
||||
|
||||
在内网的服务器中,部署一个 docker 镜像,通过容器中的 Agent 服务对路由器的 API 接口进行转发。
|
||||
|
||||
## 效果展示
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
## Docker部署
|
||||
|
||||
```bash
|
||||
docker pull bcrjl/miwifi-agent
|
||||
|
||||
docker run -d --name miwifi-agent \
|
||||
--restart always \
|
||||
-p 24317:24317 \
|
||||
-e BMW_URL=192.168.31.1 \
|
||||
-e BMW_PASSWORD=123456 \
|
||||
-e WEB_PASSWORD=123456 \
|
||||
miwifi-agent
|
||||
```
|
||||
|
||||
`BMW_URL` 指路由器IP地址;`BMW_PASSWORD` 指路由器密码;`WEB_PASSWORD` 平台设置的密码
|
||||
|
||||
运行成功后访问 `http://[IP]:24317`,输入(平台密码)密码回车即可。
|
||||
|
||||
## 更新日志
|
||||
|
||||
### 1.0.1 [2024-04-10]
|
||||
|
||||
- 登录页优化:增加回车登录;
|
||||
- 首页优化:增加设备网络和基础信息,调整布局等;
|
||||
- 端口转发:修复ip地址随便填写bug、新增映射失败bug;
|
||||
|
||||
### 1.0.0 [2024-03-25]
|
||||
|
||||
- 基础框架搭建,对接认证服务;
|
||||
- 首页状态对接;
|
||||
- 端口转发页面对接;
|
||||
|
After Width: | Height: | Size: 544 KiB |
|
After Width: | Height: | Size: 114 KiB |
|
After Width: | Height: | Size: 65 KiB |
|
|
@ -0,0 +1,157 @@
|
|||
<?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">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<groupId>com.bcrjl.miwifi</groupId>
|
||||
<artifactId>miwifi-agent</artifactId>
|
||||
<version>1.0.1</version>
|
||||
<description>Mi-Wifi-Agent服务</description>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<properties>
|
||||
<maven.compiler.source>8</maven.compiler.source>
|
||||
<maven.compiler.target>8</maven.compiler.target>
|
||||
<maven.plugin.version>3.8.1</maven.plugin.version>
|
||||
<maven.assembly.plugin.version>3.3.0</maven.assembly.plugin.version>
|
||||
<maven.dependency.plugin.version>3.2.0</maven.dependency.plugin.version>
|
||||
<maven.resources.plugin.version>3.2.0</maven.resources.plugin.version>
|
||||
<java.version>1.8</java.version>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
<!-- 统一依赖管理 -->
|
||||
<spring.boot.version>2.7.18</spring.boot.version>
|
||||
<sa-token.version>1.37.0</sa-token.version>
|
||||
|
||||
<lombok.version>1.18.30</lombok.version>
|
||||
<hutool.version>5.8.26</hutool.version>
|
||||
</properties>
|
||||
|
||||
<dependencyManagement>
|
||||
<!-- SpringBoot的依赖配置-->
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-dependencies</artifactId>
|
||||
<version>${spring.boot.version}</version>
|
||||
<type>pom</type>
|
||||
<scope>import</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</dependencyManagement>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-web</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-thymeleaf</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-cache</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!-- Sa-Token 权限认证,在线文档:https://sa-token.cc -->
|
||||
<dependency>
|
||||
<groupId>cn.dev33</groupId>
|
||||
<artifactId>sa-token-spring-boot-starter</artifactId>
|
||||
<version>${sa-token.version}</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>commons-io</groupId>
|
||||
<artifactId>commons-io</artifactId>
|
||||
<version>2.11.0</version>
|
||||
</dependency>
|
||||
|
||||
<!-- HuTool -->
|
||||
<dependency>
|
||||
<groupId>cn.hutool</groupId>
|
||||
<artifactId>hutool-all</artifactId>
|
||||
<version>${hutool.version}</version>
|
||||
</dependency>
|
||||
<!-- lombok -->
|
||||
<dependency>
|
||||
<groupId>org.projectlombok</groupId>
|
||||
<artifactId>lombok</artifactId>
|
||||
<version>${lombok.version}</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<!-- Maven 插件配置 -->
|
||||
<repositories>
|
||||
<repository>
|
||||
<id>nexus</id>
|
||||
<name>nexus-developer</name>
|
||||
<url>https://nexus.ys.bcrjl.com:41010/repository/maven-public/</url>
|
||||
<releases>
|
||||
<enabled>true</enabled>
|
||||
</releases>
|
||||
</repository>
|
||||
</repositories>
|
||||
<pluginRepositories>
|
||||
<pluginRepository>
|
||||
<id>nexus</id>
|
||||
<url>https://nexus.ys.bcrjl.com:41010/repository/maven-public/</url>
|
||||
</pluginRepository>
|
||||
</pluginRepositories>
|
||||
|
||||
|
||||
<build>
|
||||
<finalName>${artifactId}</finalName>
|
||||
<resources>
|
||||
<resource>
|
||||
<directory>src/main/resources</directory>
|
||||
</resource>
|
||||
<resource>
|
||||
<directory>src/main/java</directory>
|
||||
<includes>
|
||||
<include>**/*.xml</include>
|
||||
</includes>
|
||||
</resource>
|
||||
</resources>
|
||||
<pluginManagement>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-maven-plugin</artifactId>
|
||||
<version>2.7.11</version>
|
||||
<configuration>
|
||||
<finalName>${project.build.finalName}</finalName>
|
||||
</configuration>
|
||||
<executions>
|
||||
<execution>
|
||||
<goals>
|
||||
<goal>repackage</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</pluginManagement>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-maven-plugin</artifactId>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
<version>${maven.plugin.version}</version>
|
||||
<configuration>
|
||||
<source>${java.version}</source>
|
||||
<target>${java.version}</target>
|
||||
<encoding>UTF-8</encoding>
|
||||
<compilerArgs>
|
||||
<arg>-parameters</arg>
|
||||
</compilerArgs>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
|
||||
</project>
|
||||
|
|
@ -0,0 +1,16 @@
|
|||
package com.bcrjl.miwifi;
|
||||
|
||||
import org.springframework.boot.SpringApplication;
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
|
||||
/**
|
||||
* 项目启动类
|
||||
*
|
||||
* @author yanqs
|
||||
*/
|
||||
@SpringBootApplication
|
||||
public class WebApplication {
|
||||
public static void main(String[] args) {
|
||||
SpringApplication.run(WebApplication.class, args);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,46 @@
|
|||
package com.bcrjl.miwifi.common.constant;
|
||||
|
||||
/**
|
||||
* 接口常量
|
||||
*
|
||||
* @author yanqs
|
||||
*/
|
||||
public interface ApiConstant {
|
||||
|
||||
String MIDDLE_URL = "/cgi-bin/luci/;stok=";
|
||||
/**
|
||||
* 登录接口
|
||||
*/
|
||||
String SYSTEM_LOGIN = "/cgi-bin/luci/api/xqsystem/login";
|
||||
|
||||
/**
|
||||
* 路由器状态
|
||||
*/
|
||||
String SYSTEM_STATUS = "/api/misystem/status";
|
||||
|
||||
/**
|
||||
* 网络—端口转发接口列表
|
||||
*/
|
||||
String NETWORK_PORT_FORWARD = "/api/xqnetwork/portforward";
|
||||
|
||||
/**
|
||||
* 添加映射 端口
|
||||
*/
|
||||
String NETWORK_ADD_REDIRECT = "/api/xqnetwork/add_redirect";
|
||||
|
||||
/**
|
||||
* 删除映射 端口
|
||||
*/
|
||||
String NETWORK_DELETE_REDIRECT = "/api/xqnetwork/delete_redirect";
|
||||
|
||||
/**
|
||||
* 添加范围转发规则
|
||||
*/
|
||||
String NETWORK_ADD_RANGE_REDIRECT = "/api/xqnetwork/add_range_redirect";
|
||||
|
||||
/**
|
||||
* 外网状态
|
||||
*/
|
||||
String PPPOE_STATUS = "/api/xqnetwork/pppoe_status";
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,12 @@
|
|||
package com.bcrjl.miwifi.common.constant;
|
||||
|
||||
/**
|
||||
* 系统常量
|
||||
*
|
||||
* @author yanqs
|
||||
*/
|
||||
public interface AppConstant {
|
||||
int INIT_MAP = 16;
|
||||
|
||||
String HTTP = "http://";
|
||||
}
|
||||
|
|
@ -0,0 +1,76 @@
|
|||
package com.bcrjl.miwifi.common.enums;
|
||||
|
||||
/**
|
||||
* 全局状态枚举
|
||||
*
|
||||
* @author yanqs
|
||||
*/
|
||||
public enum GlobalEnumCode {
|
||||
// 公共
|
||||
/* 成功状态码 */
|
||||
SUCCESS(200, "请求成功"),
|
||||
// 失败
|
||||
FAIL(400, "请求失败"),
|
||||
// 未认证(签名错误)
|
||||
UNAUTHORIZED(401, "未认证(签名错误)"),
|
||||
// 接口不存在
|
||||
NOT_FOUND(404, "接口不存在"),
|
||||
// 服务器内部错误
|
||||
INTERNAL_SERVER_ERROR(500, "服务器内部错误"),
|
||||
/* 业务错误:30001-39999 */
|
||||
SPECIFIED_QUESTIONED_USER_NOT_EXIST(30001, "某业务出现问题"),
|
||||
|
||||
/* 系统错误:40001-49999 */
|
||||
SYSTEM_INNER_ERROR(40001, "系统繁忙,请稍后重试"),
|
||||
|
||||
/* 数据错误:50001-599999 */
|
||||
RESULE_DATA_NONE(50001, "数据未找到"),
|
||||
DATA_IS_WRONG(50002, "数据有误"),
|
||||
DATA_ALREADY_EXISTED(50003, "数据已存在"),
|
||||
UN_VALID_TIMESTAMP(50004, "时间戳过期"),
|
||||
UN_SIGN(50005, "未传递签名"),
|
||||
UN_TOKEN(50006, "token未传递"),
|
||||
SIGN_ERROR(50007, "sign签名不正确"),
|
||||
|
||||
/* 接口错误:60001-69999 */
|
||||
INTERFACE_INNER_INVOKE_ERROR(60001, "内部系统接口调用异常"),
|
||||
|
||||
INTERFACE_OUTTER_INVOKE_ERROR(60002, "外部系统接口调用异常"),
|
||||
|
||||
INTERFACE_FORBID_VISIT(60003, "该接口禁止访问"),
|
||||
|
||||
INTERFACE_ADDRESS_INVALID(60004, "接口地址无效"),
|
||||
|
||||
INTERFACE_REQUEST_TIMEOUT(60005, "接口请求超时"),
|
||||
|
||||
INTERFACE_EXCEED_LOAD(60006, "接口负载过高"),
|
||||
|
||||
/* 权限错误:70001-79999 */
|
||||
PERMISSION_NO_ACCESS(40401, "无访问权限");
|
||||
|
||||
private int code;
|
||||
|
||||
private String msg;
|
||||
|
||||
GlobalEnumCode(int code, String msg) {
|
||||
this.code = code;
|
||||
this.msg = msg;
|
||||
}
|
||||
|
||||
public int getCode() {
|
||||
return code;
|
||||
}
|
||||
|
||||
public String getMsg() {
|
||||
return msg;
|
||||
}
|
||||
|
||||
public static GlobalEnumCode valueOf(int code) {
|
||||
for (GlobalEnumCode temp : GlobalEnumCode.values()) {
|
||||
if (temp.getCode() == code) {
|
||||
return temp;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,82 @@
|
|||
package com.bcrjl.miwifi.common.exceptions;
|
||||
|
||||
import cn.dev33.satoken.exception.NotLoginException;
|
||||
import cn.hutool.extra.servlet.ServletUtil;
|
||||
import cn.hutool.json.JSONUtil;
|
||||
import com.bcrjl.miwifi.common.enums.GlobalEnumCode;
|
||||
import com.bcrjl.miwifi.common.response.R;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.web.bind.annotation.ControllerAdvice;
|
||||
import org.springframework.web.bind.annotation.ExceptionHandler;
|
||||
import org.springframework.web.bind.annotation.ResponseBody;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import java.io.IOException;
|
||||
|
||||
/**
|
||||
* 全局异常处理类
|
||||
*
|
||||
* @author yanqs
|
||||
*/
|
||||
@Slf4j
|
||||
@ControllerAdvice
|
||||
public class GlobalExceptionHandler {
|
||||
|
||||
/**
|
||||
* 处理Exception异常
|
||||
* <p>
|
||||
* 全局异常
|
||||
*
|
||||
* @param req
|
||||
* @param e
|
||||
* @return
|
||||
*/
|
||||
@ExceptionHandler(value = Exception.class)
|
||||
@ResponseBody
|
||||
public void exceptionHandler(HttpServletResponse response, HttpServletRequest req, Exception e) {
|
||||
response.setStatus(HttpServletResponse.SC_OK);
|
||||
try {
|
||||
response.setContentType("application/json");
|
||||
ObjectMapper om = new ObjectMapper();
|
||||
om.writeValue(response.getOutputStream(), R.fail(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e.getMessage()));
|
||||
} catch (IOException ex) {
|
||||
ex.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Sa-Token 全局异常拦截(拦截项目中的NotLoginException异常)
|
||||
*
|
||||
* @param nle
|
||||
* @return
|
||||
*/
|
||||
@ExceptionHandler(NotLoginException.class)
|
||||
public void handlerNotLoginException(HttpServletResponse response,NotLoginException nle) {
|
||||
// 打印堆栈,以供调试
|
||||
// nle.printStackTrace();
|
||||
// 判断场景值,定制化异常信息
|
||||
String message = "";
|
||||
if (nle.getType().equals(NotLoginException.NOT_TOKEN)) {
|
||||
message = "未提供token";
|
||||
} else if (nle.getType().equals(NotLoginException.INVALID_TOKEN)) {
|
||||
message = "token无效";
|
||||
} else if (nle.getType().equals(NotLoginException.TOKEN_TIMEOUT)) {
|
||||
message = "token已过期";
|
||||
} else if (nle.getType().equals(NotLoginException.BE_REPLACED)) {
|
||||
message = "token已被顶下线";
|
||||
} else if (nle.getType().equals(NotLoginException.KICK_OUT)) {
|
||||
message = "token已被踢下线";
|
||||
} else {
|
||||
message = "当前会话未登录";
|
||||
}
|
||||
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
|
||||
response.setCharacterEncoding("utf-8");
|
||||
ServletUtil.write(response,
|
||||
JSONUtil.toJsonPrettyStr(R.fail(GlobalEnumCode.UNAUTHORIZED.getCode(), message)),
|
||||
"application/json");
|
||||
// 返回给前端
|
||||
//return R.failed(ServiceExceptionEnum.UNAUTHORIZED.getCode(), null, message);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,153 @@
|
|||
package com.bcrjl.miwifi.common.response;
|
||||
|
||||
import com.bcrjl.miwifi.common.enums.GlobalEnumCode;
|
||||
import lombok.Data;
|
||||
import lombok.experimental.Accessors;
|
||||
import org.springframework.lang.Nullable;
|
||||
import org.springframework.util.ObjectUtils;
|
||||
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import java.io.Serializable;
|
||||
import java.util.Optional;
|
||||
|
||||
/**
|
||||
* 统一API响应结果封装
|
||||
*
|
||||
* @author yanqs
|
||||
*/
|
||||
@Data
|
||||
@Accessors(chain = true)
|
||||
public class R<T> implements Serializable {
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
private int code;
|
||||
private boolean success;
|
||||
private T data;
|
||||
private String message;
|
||||
|
||||
private R(int code, T data, String message) {
|
||||
this.code = code;
|
||||
this.data = data;
|
||||
this.message = message;
|
||||
this.success = GlobalEnumCode.SUCCESS.getCode() == code;
|
||||
}
|
||||
|
||||
/**
|
||||
* 判断返回是否为成功
|
||||
*
|
||||
* @param result Result
|
||||
* @return 是否成功
|
||||
*/
|
||||
public static boolean isSuccess(@Nullable R<?> result) {
|
||||
return Optional.ofNullable(result)
|
||||
.map(x -> ObjectUtils.nullSafeEquals(GlobalEnumCode.SUCCESS.getCode(), x.code))
|
||||
.orElse(Boolean.FALSE);
|
||||
}
|
||||
|
||||
/**
|
||||
* 判断返回是否为成功
|
||||
*
|
||||
* @param result Result
|
||||
* @return 是否成功
|
||||
*/
|
||||
public static boolean isNotSuccess(@Nullable R<?> result) {
|
||||
return !R.isSuccess(result);
|
||||
}
|
||||
|
||||
/**
|
||||
* 返回R
|
||||
*
|
||||
* @param data 数据
|
||||
* @param <T> T 泛型标记
|
||||
* @return R
|
||||
*/
|
||||
public static <T> R<T> data(T data) {
|
||||
return data(data, GlobalEnumCode.SUCCESS.getMsg());
|
||||
}
|
||||
|
||||
/**
|
||||
* 返回R
|
||||
*
|
||||
* @param data 数据
|
||||
* @param message 消息
|
||||
* @param <T> T 泛型标记
|
||||
* @return R
|
||||
*/
|
||||
public static <T> R<T> data(T data, String message) {
|
||||
return data(HttpServletResponse.SC_OK, data, message);
|
||||
}
|
||||
|
||||
/**
|
||||
* 返回R
|
||||
*
|
||||
* @param code 状态码
|
||||
* @param data 数据
|
||||
* @param message 消息
|
||||
* @param <T> T 泛型标记
|
||||
* @return R
|
||||
*/
|
||||
public static <T> R<T> data(int code, T data, String message) {
|
||||
return new R<>(code, data, data == null ? "暂无承载数据" : message);
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public static <T> R<T> success() {
|
||||
return new R(GlobalEnumCode.SUCCESS.getCode(), null, GlobalEnumCode.SUCCESS.getMsg());
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public static <T> R<T> success(T data) {
|
||||
return new R(GlobalEnumCode.SUCCESS.getCode(), data, GlobalEnumCode.SUCCESS.getMsg());
|
||||
}
|
||||
|
||||
/**
|
||||
* 返回R
|
||||
*
|
||||
* @param message 消息
|
||||
* @param <T> T 泛型标记
|
||||
* @return R
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
public static <T> R<T> success(T data, String message) {
|
||||
return new R(GlobalEnumCode.SUCCESS.getCode(), data, message);
|
||||
}
|
||||
|
||||
|
||||
public static <T> R<T> fail() {
|
||||
return R.fail(GlobalEnumCode.FAIL.getCode(), GlobalEnumCode.FAIL.getMsg());
|
||||
}
|
||||
|
||||
/**
|
||||
* 返回R
|
||||
*
|
||||
* @param message 消息
|
||||
* @param <T> T 泛型标记
|
||||
* @return R
|
||||
*/
|
||||
public static <T> R<T> fail(String message) {
|
||||
return R.fail(GlobalEnumCode.FAIL.getCode(), message);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 返回R
|
||||
*
|
||||
* @param code 状态码
|
||||
* @param message 消息
|
||||
* @param <T> T 泛型标记
|
||||
* @return R
|
||||
*/
|
||||
public static <T> R<T> fail(int code, String message) {
|
||||
return new R<>(code, null, message);
|
||||
}
|
||||
|
||||
/**
|
||||
* 返回R
|
||||
*
|
||||
* @param flag 成功状态
|
||||
* @return R
|
||||
*/
|
||||
public static <T> R<T> status(boolean flag) {
|
||||
return flag ? success() : fail();
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,261 @@
|
|||
package com.bcrjl.miwifi.common.util;
|
||||
|
||||
import cn.hutool.http.ContentType;
|
||||
import cn.hutool.http.Header;
|
||||
import cn.hutool.http.HttpRequest;
|
||||
import cn.hutool.http.HttpResponse;
|
||||
import cn.hutool.json.JSONObject;
|
||||
import cn.hutool.json.JSONUtil;
|
||||
import com.bcrjl.miwifi.model.param.DeleteRedirectParam;
|
||||
import com.bcrjl.miwifi.model.param.RangeRedirectParam;
|
||||
import com.bcrjl.miwifi.model.param.RedirectParam;
|
||||
import com.bcrjl.miwifi.model.result.PppoeStatusResult;
|
||||
import com.bcrjl.miwifi.model.result.RangeRedirectResult;
|
||||
import com.bcrjl.miwifi.model.result.RedirectResult;
|
||||
import com.bcrjl.miwifi.model.result.StatusResult;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.net.HttpCookie;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static com.bcrjl.miwifi.common.constant.ApiConstant.*;
|
||||
import static com.bcrjl.miwifi.common.constant.AppConstant.HTTP;
|
||||
import static com.bcrjl.miwifi.common.constant.AppConstant.INIT_MAP;
|
||||
|
||||
/**
|
||||
* 小米/红米路由器 工具类
|
||||
*
|
||||
* @author yanqs
|
||||
*/
|
||||
@Slf4j
|
||||
@Component
|
||||
public class MiWifiUtil {
|
||||
|
||||
/**
|
||||
* 登录信息
|
||||
*/
|
||||
public static Map<String, Object> loginInfo = null;
|
||||
/**
|
||||
* token
|
||||
*/
|
||||
public static String token;
|
||||
/**
|
||||
* cookie
|
||||
*/
|
||||
public static List<HttpCookie> cookie;
|
||||
/**
|
||||
* 路由器地址
|
||||
*/
|
||||
@Value("${bmw.url:192.168.31.1}")
|
||||
private String WIFI_URL;
|
||||
/**
|
||||
* 路由器密码
|
||||
*/
|
||||
@Value("${bmw.password:123456}")
|
||||
private String WIFI_PASSWORD;
|
||||
|
||||
/**
|
||||
* 获取网关前缀
|
||||
*
|
||||
* @return 网关前缀
|
||||
*/
|
||||
public String getGatewayPrefix() {
|
||||
String gateWay = "";
|
||||
List<String> gateWayStrList = Arrays.stream(WIFI_URL.split("\\.")).collect(Collectors.toList());
|
||||
int lastIndex = gateWayStrList.size() - 1;
|
||||
if (lastIndex >= 0) {
|
||||
gateWayStrList = gateWayStrList.subList(0, lastIndex);
|
||||
}
|
||||
for (String s : gateWayStrList) {
|
||||
gateWay += s + ".";
|
||||
}
|
||||
return gateWay;
|
||||
}
|
||||
|
||||
/**
|
||||
* 外网状态
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
public PppoeStatusResult getPppoeStatus() {
|
||||
initLoginInfo();
|
||||
String url = HTTP + WIFI_URL + MIDDLE_URL + token + PPPOE_STATUS;
|
||||
HttpRequest request = HttpRequest.get(url).cookie(cookie);
|
||||
HttpResponse response = request.execute();
|
||||
log.info("外网状态:{}", response.body());
|
||||
JSONObject jsonObject = JSONUtil.parseObj(response.body());
|
||||
if (jsonObject.getInt("code") == 0) {
|
||||
return JSONUtil.toBean(response.body(), PppoeStatusResult.class);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除映射数据
|
||||
*
|
||||
* @param param 请求参数
|
||||
* @return map
|
||||
*/
|
||||
public Map<String, Object> deleteRedirect(DeleteRedirectParam param) {
|
||||
Map<String, Object> result = new HashMap<>(INIT_MAP);
|
||||
initLoginInfo();
|
||||
String url = HTTP + WIFI_URL + MIDDLE_URL + token + NETWORK_DELETE_REDIRECT;
|
||||
HttpRequest request = HttpRequest.post(url)
|
||||
.cookie(cookie)
|
||||
.form("port", param.getPort())
|
||||
.form("proto", param.getProto());
|
||||
HttpResponse response = request.execute();
|
||||
log.info("删除端口转发:{}", response.body());
|
||||
JSONObject jsonObject = JSONUtil.parseObj(response.body());
|
||||
if (jsonObject.getInt("code") == 0) {
|
||||
result.put("status", true);
|
||||
} else {
|
||||
result.put("status", false);
|
||||
result.put("msg", jsonObject.getStr("msg"));
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加端口(范围)转发
|
||||
*
|
||||
* @param param 参数
|
||||
* @return map
|
||||
*/
|
||||
public Map<String, Object> addRangeRedirect(RangeRedirectParam param) {
|
||||
Map<String, Object> result = new HashMap<>(INIT_MAP);
|
||||
initLoginInfo();
|
||||
String url = HTTP + WIFI_URL + MIDDLE_URL + token + NETWORK_ADD_RANGE_REDIRECT;
|
||||
HttpRequest request = HttpRequest.post(url)
|
||||
.form("name", param.getName())
|
||||
.form("proto", param.getProto())
|
||||
.form("fport", param.getFport())
|
||||
.form("tport", param.getTport())
|
||||
.form("ip", param.getIp())
|
||||
.cookie(cookie);
|
||||
// 发送请求并获取响应
|
||||
HttpResponse response = request.execute();
|
||||
log.info("添加端口范围转发:{}", response.body());
|
||||
JSONObject jsonObject = JSONUtil.parseObj(response.body());
|
||||
if (jsonObject.getInt("code") == 0) {
|
||||
result.put("status", true);
|
||||
result.put("data", jsonObject.get("data"));
|
||||
} else {
|
||||
result.put("status", false);
|
||||
result.put("msg", jsonObject.getStr("msg"));
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 添加端口(单端口)转发
|
||||
*
|
||||
* @param param 请求参数
|
||||
* @return map
|
||||
*/
|
||||
public Map<String, Object> addRedirect(RedirectParam param) {
|
||||
Map<String, Object> result = new HashMap<>(INIT_MAP);
|
||||
initLoginInfo();
|
||||
String url = HTTP + WIFI_URL + MIDDLE_URL + token + NETWORK_ADD_REDIRECT;
|
||||
HttpRequest request = HttpRequest.post(url)
|
||||
.form("name", param.getName())
|
||||
.form("proto", param.getProto())
|
||||
.form("sport", param.getSport())
|
||||
.form("ip", param.getIp())
|
||||
.form("dport", param.getDport())
|
||||
.cookie(cookie);
|
||||
// 发送请求并获取响应
|
||||
HttpResponse response = request.execute();
|
||||
log.info("添加端口转发:{}", response.body());
|
||||
JSONObject jsonObject = JSONUtil.parseObj(response.body());
|
||||
if (jsonObject.getInt("code") == 0) {
|
||||
result.put("status", true);
|
||||
} else {
|
||||
result.put("status", false);
|
||||
result.put("msg", jsonObject.getStr("msg"));
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取端口转发列表
|
||||
*
|
||||
* @param type 类型
|
||||
* @return List
|
||||
*/
|
||||
public List portForward(Integer type) {
|
||||
initLoginInfo();
|
||||
String url = HTTP + WIFI_URL + MIDDLE_URL + token + NETWORK_PORT_FORWARD + "?ftype=" + type;
|
||||
HttpResponse execute = HttpRequest.get(url).cookie(cookie).execute();
|
||||
log.info("端口转发列表:{}", execute.body());
|
||||
JSONObject jsonObject = JSONUtil.parseObj(execute.body());
|
||||
if (jsonObject.getInt("code") == 0 && jsonObject.getInt("status") != 0) {
|
||||
String list = jsonObject.getStr("list");
|
||||
if (type.equals(1)) {
|
||||
// 单端口转发
|
||||
return JSONUtil.toList(list, RedirectResult.class);
|
||||
} else if (type.equals(2)) {
|
||||
// 范围端口转发
|
||||
return JSONUtil.toList(list, RangeRedirectResult.class);
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取路由器信息
|
||||
*
|
||||
* @return StatusResult
|
||||
*/
|
||||
public StatusResult getStatus() {
|
||||
initLoginInfo();
|
||||
String url = HTTP + WIFI_URL + MIDDLE_URL + token + SYSTEM_STATUS;
|
||||
HttpResponse execute = HttpRequest.get(url).cookie(cookie).execute();
|
||||
log.info("系统状态:{}", execute.body());
|
||||
StatusResult result = JSONUtil.toBean(execute.body(), StatusResult.class);
|
||||
if (result.getCode() == 0) {
|
||||
return result;
|
||||
} else {
|
||||
getLoginInfo();
|
||||
return getStatus();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 登录路由器 获取配置信息
|
||||
*
|
||||
* @return Map
|
||||
*/
|
||||
public Map<String, Object> getLoginInfo() {
|
||||
Map<String, Object> formDate = new HashMap<>();
|
||||
formDate.put("username", "admin");
|
||||
formDate.put("password", WIFI_PASSWORD);
|
||||
String url = HTTP + WIFI_URL + SYSTEM_LOGIN;
|
||||
HttpResponse execute = HttpRequest.post(url).form(formDate)
|
||||
.header(Header.CONTENT_TYPE, ContentType.FORM_URLENCODED.toString())
|
||||
.execute();
|
||||
JSONObject jsonObject = JSONUtil.parseObj(execute.body());
|
||||
if (jsonObject.getInt("code") == 0) {
|
||||
loginInfo = new HashMap<>(INIT_MAP);
|
||||
loginInfo.put("token", jsonObject.getStr("token"));
|
||||
loginInfo.put("cookie", execute.getCookies());
|
||||
token = jsonObject.getStr("token");
|
||||
cookie = execute.getCookies();
|
||||
return loginInfo;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 初始化登录信息
|
||||
*/
|
||||
private void initLoginInfo() {
|
||||
if (Objects.isNull(MiWifiUtil.loginInfo)) {
|
||||
getLoginInfo();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,96 @@
|
|||
package com.bcrjl.miwifi.config;
|
||||
|
||||
import cn.dev33.satoken.interceptor.SaInterceptor;
|
||||
import cn.dev33.satoken.stp.StpUtil;
|
||||
import org.springframework.boot.web.servlet.FilterRegistrationBean;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.web.cors.CorsConfiguration;
|
||||
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
|
||||
import org.springframework.web.filter.CorsFilter;
|
||||
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
|
||||
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
|
||||
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* WebConfig 配置
|
||||
*
|
||||
* @author yanqs
|
||||
*/
|
||||
@Configuration
|
||||
public class WebConfigurer extends WebMvcConfigurationSupport {
|
||||
/**
|
||||
* 跨域过滤
|
||||
*
|
||||
* @return FilterRegistrationBean
|
||||
*/
|
||||
@Bean
|
||||
public FilterRegistrationBean corsFilter() {
|
||||
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
|
||||
source.registerCorsConfiguration("/**", corsConfig());
|
||||
FilterRegistrationBean bean = new FilterRegistrationBean(new CorsFilter(source));
|
||||
//*****这里设置了优先级*****
|
||||
bean.setOrder(1);
|
||||
return bean;
|
||||
}
|
||||
|
||||
private CorsConfiguration corsConfig() {
|
||||
CorsConfiguration corsConfiguration = new CorsConfiguration();
|
||||
//corsConfiguration.addAllowedOrigin("*");
|
||||
corsConfiguration.addAllowedOriginPattern("*");
|
||||
corsConfiguration.addAllowedHeader("*");
|
||||
corsConfiguration.addAllowedMethod("*");
|
||||
corsConfiguration.setAllowCredentials(true);
|
||||
corsConfiguration.setMaxAge(3600L);
|
||||
return corsConfiguration;
|
||||
}
|
||||
|
||||
/**
|
||||
* 资源映射
|
||||
*
|
||||
* @param registry registry
|
||||
*/
|
||||
@Override
|
||||
public void addResourceHandlers(ResourceHandlerRegistry registry) {
|
||||
registry.addResourceHandler("/index.html")
|
||||
.addResourceLocations("classpath:/static/index.html");
|
||||
registry.addResourceHandler("/favicon.ico")
|
||||
.addResourceLocations("classpath:/static/favicon.ico");
|
||||
registry.addResourceHandler("/css/**")
|
||||
.addResourceLocations("classpath:/static/css/");
|
||||
registry.addResourceHandler("/js/**")
|
||||
.addResourceLocations("classpath:/static/js/");
|
||||
registry.addResourceHandler("/config.js")
|
||||
.addResourceLocations("classpath:/static/config.js");
|
||||
registry.addResourceHandler("/img/**")
|
||||
.addResourceLocations("classpath:/static/img/");
|
||||
//registry.addResourceHandler("/web/**").addResourceLocations("classpath:/static/");
|
||||
super.addResourceHandlers(registry);
|
||||
}
|
||||
|
||||
/**
|
||||
* 过滤数据
|
||||
*
|
||||
* @return List<String>
|
||||
*/
|
||||
private List<String> filterList() {
|
||||
List<String> resources = new ArrayList<>();
|
||||
resources.add("/auth/login");
|
||||
//SaRouter.match("/admin/**", StpUtil::checkLogin);
|
||||
resources.add("/#/**");
|
||||
resources.add("/index.html");
|
||||
return resources;
|
||||
}
|
||||
|
||||
// 注册 Sa-Token 拦截器,打开注解式鉴权功能
|
||||
@Override
|
||||
public void addInterceptors(InterceptorRegistry registry) {
|
||||
// 注册 Sa-Token 拦截器,打开注解式鉴权功能
|
||||
registry.addInterceptor(new SaInterceptor(handle -> StpUtil.checkLogin()))
|
||||
.excludePathPatterns(filterList())
|
||||
.addPathPatterns("/api/**");
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,45 @@
|
|||
package com.bcrjl.miwifi.controller;
|
||||
|
||||
import cn.dev33.satoken.stp.StpUtil;
|
||||
import cn.hutool.crypto.SecureUtil;
|
||||
import com.bcrjl.miwifi.common.response.R;
|
||||
import com.bcrjl.miwifi.model.param.LoginParam;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.web.bind.annotation.PostMapping;
|
||||
import org.springframework.web.bind.annotation.RequestBody;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
/**
|
||||
* 鉴权服务
|
||||
*
|
||||
* @author yanqs
|
||||
*/
|
||||
@Slf4j
|
||||
@RestController
|
||||
@RequestMapping("/auth")
|
||||
public class AuthController {
|
||||
|
||||
/**
|
||||
* 系统密码
|
||||
*/
|
||||
@Value("${bmw.web-password:123456}")
|
||||
private String PASSWORD;
|
||||
|
||||
/**
|
||||
* 系统登录
|
||||
*
|
||||
* @param param 密码
|
||||
* @return token
|
||||
*/
|
||||
@PostMapping("/login")
|
||||
public R login(@RequestBody LoginParam param) {
|
||||
if (SecureUtil.md5(PASSWORD).equals(param.getPassword())) {
|
||||
StpUtil.login(10001);
|
||||
return R.data(StpUtil.getTokenInfo());
|
||||
} else {
|
||||
return R.fail("密码错误:");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,36 @@
|
|||
package com.bcrjl.miwifi.controller;
|
||||
|
||||
import org.apache.commons.io.IOUtils;
|
||||
import org.springframework.core.io.ClassPathResource;
|
||||
import org.springframework.http.MediaType;
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.ResponseBody;
|
||||
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
|
||||
/**
|
||||
* @author yanqs
|
||||
* @since 2024-03-23
|
||||
*/
|
||||
@Controller
|
||||
public class FrontIndexController {
|
||||
/**
|
||||
* 所有未找到的页面都跳转到首页, 用户解决 vue history 直接访问 404 的问题
|
||||
* 同时, 读取 index.html 文件, 修改 title 和 favicon 后返回.
|
||||
*
|
||||
* @return 转发到 /index.html
|
||||
*/
|
||||
@RequestMapping(value = {"/**/{[path:[^\\.]*}", "/"}, produces = MediaType.TEXT_HTML_VALUE + ";charset=UTF-8")
|
||||
@ResponseBody
|
||||
public String redirect() throws IOException {
|
||||
// 读取 resources/static/index.html 文件修改 title 和 favicon 后返回
|
||||
ClassPathResource resource = new ClassPathResource("static/index.html");
|
||||
InputStream inputStream = resource.getInputStream();
|
||||
String content = IOUtils.toString(inputStream, StandardCharsets.UTF_8);
|
||||
return content;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,92 @@
|
|||
package com.bcrjl.miwifi.controller;
|
||||
|
||||
import com.bcrjl.miwifi.common.response.R;
|
||||
import com.bcrjl.miwifi.common.util.MiWifiUtil;
|
||||
import com.bcrjl.miwifi.model.param.DeleteRedirectParam;
|
||||
import com.bcrjl.miwifi.model.param.RangeRedirectParam;
|
||||
import com.bcrjl.miwifi.model.param.RedirectParam;
|
||||
import lombok.AllArgsConstructor;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* @author yanqs
|
||||
*/
|
||||
@AllArgsConstructor
|
||||
@RestController
|
||||
@RequestMapping("/api/network")
|
||||
public class NetworkController {
|
||||
|
||||
/**
|
||||
* 网络工具类
|
||||
*/
|
||||
private final MiWifiUtil miWifiUtil;
|
||||
|
||||
/**
|
||||
* 获取外网状态
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
@GetMapping("pppoe-status")
|
||||
public R pppoeStatus() {
|
||||
return R.data(miWifiUtil.getPppoeStatus());
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 端口转发
|
||||
*
|
||||
* @param type 类型
|
||||
* @return 列表
|
||||
*/
|
||||
@GetMapping("/port-forward")
|
||||
public R portForward(Integer type) {
|
||||
return R.data(miWifiUtil.portForward(type));
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加端口转发
|
||||
*
|
||||
* @param param 请求参数
|
||||
* @return R
|
||||
*/
|
||||
@PostMapping("/add-redirect")
|
||||
public R addRedirect(@RequestBody RedirectParam param) {
|
||||
Map<String, Object> result = miWifiUtil.addRedirect(param);
|
||||
if (Boolean.parseBoolean(result.get("status").toString())) {
|
||||
return R.success();
|
||||
}
|
||||
return R.fail(result.get("msg").toString());
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加端口(范围)转发
|
||||
*
|
||||
* @param param 请求参数
|
||||
* @return R
|
||||
*/
|
||||
@PostMapping("/add-range-redirect")
|
||||
public R addRangeRedirect(@RequestBody RangeRedirectParam param) {
|
||||
Map<String, Object> result = miWifiUtil.addRangeRedirect(param);
|
||||
if (Boolean.parseBoolean(result.get("status").toString())) {
|
||||
return R.success();
|
||||
}
|
||||
return R.fail(result.get("msg").toString());
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除端口转发
|
||||
*
|
||||
* @param param 请求参数
|
||||
* @return R
|
||||
*/
|
||||
@PostMapping("/delete-redirect")
|
||||
public R deleteRedirect(@RequestBody DeleteRedirectParam param) {
|
||||
Map<String, Object> result = miWifiUtil.deleteRedirect(param);
|
||||
if (Boolean.parseBoolean(result.get("status").toString())) {
|
||||
return R.success();
|
||||
}
|
||||
return R.fail(result.get("msg").toString());
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,59 @@
|
|||
package com.bcrjl.miwifi.controller;
|
||||
|
||||
import com.bcrjl.miwifi.common.response.R;
|
||||
import com.bcrjl.miwifi.common.util.MiWifiUtil;
|
||||
import lombok.AllArgsConstructor;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
|
||||
/**
|
||||
* API接口
|
||||
*
|
||||
* @author yanqs
|
||||
*/
|
||||
@AllArgsConstructor
|
||||
@RestController
|
||||
@RequestMapping("/api/system/")
|
||||
public class SystemController {
|
||||
|
||||
private final MiWifiUtil miWifiUtil;
|
||||
|
||||
/**
|
||||
* 路由器状态
|
||||
*
|
||||
* @return 路由器状态
|
||||
*/
|
||||
@GetMapping("/status")
|
||||
public R status() {
|
||||
return R.data(miWifiUtil.getStatus());
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取网关前缀
|
||||
*
|
||||
* @return 网关前缀字符串
|
||||
*/
|
||||
@GetMapping("/gateway-prefix")
|
||||
public R getGatewayPrefix() {
|
||||
return R.data(miWifiUtil.getGatewayPrefix());
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 测试是否连通
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
@GetMapping("/test")
|
||||
public R test() {
|
||||
Map<String, Object> loginInfo = miWifiUtil.getLoginInfo();
|
||||
if (Objects.isNull(loginInfo)) {
|
||||
return R.fail("无法链接路由器信息");
|
||||
}
|
||||
return R.success("连接路由器成功");
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,42 @@
|
|||
package com.bcrjl.miwifi.model.domain;
|
||||
|
||||
import cn.hutool.core.annotation.Alias;
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* 端口转发 基础参数
|
||||
*
|
||||
* @author yanqs
|
||||
* <p> 范围转发端口参数
|
||||
* name:test
|
||||
* proto:3
|
||||
* fport:10000
|
||||
* tport:19999
|
||||
* ip:192.168.31.110
|
||||
* <p>
|
||||
* <p> 特定端口转发参数
|
||||
* name:test
|
||||
* proto:3
|
||||
* sport:10000
|
||||
* ip:192.168.31.110
|
||||
* dport:10000
|
||||
*/
|
||||
@Data
|
||||
public class Redirect implements Serializable {
|
||||
/**
|
||||
* 名称
|
||||
*/
|
||||
private String name;
|
||||
|
||||
/**
|
||||
* 协议 1 TCP 2 UDP 3 TCP和UDP
|
||||
*/
|
||||
private Integer proto;
|
||||
|
||||
/**
|
||||
* 设备(ip地址)
|
||||
*/
|
||||
private String ip;
|
||||
}
|
||||
|
|
@ -0,0 +1,12 @@
|
|||
package com.bcrjl.miwifi.model.param;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* @author yanqs
|
||||
*/
|
||||
@Data
|
||||
public class DeleteRedirectParam implements java.io.Serializable {
|
||||
private int port;
|
||||
private int proto;
|
||||
}
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
package com.bcrjl.miwifi.model.param;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* @author yanqs
|
||||
*/
|
||||
@Data
|
||||
public class LoginParam implements java.io.Serializable {
|
||||
private String password;
|
||||
}
|
||||
|
|
@ -0,0 +1,21 @@
|
|||
package com.bcrjl.miwifi.model.param;
|
||||
|
||||
import com.bcrjl.miwifi.model.domain.Redirect;
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* 端口转发(范围) 请求参数
|
||||
*
|
||||
* @author yanqs
|
||||
*/
|
||||
@Data
|
||||
public class RangeRedirectParam extends Redirect {
|
||||
/**
|
||||
* 范围转发() 起始端口
|
||||
*/
|
||||
private int fport;
|
||||
/**
|
||||
* 范围转发() 结束端口
|
||||
*/
|
||||
private int tport;
|
||||
}
|
||||
|
|
@ -0,0 +1,21 @@
|
|||
package com.bcrjl.miwifi.model.param;
|
||||
|
||||
import com.bcrjl.miwifi.model.domain.Redirect;
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* 指定端口转发
|
||||
*
|
||||
* @author yanqs
|
||||
*/
|
||||
@Data
|
||||
public class RedirectParam extends Redirect {
|
||||
/**
|
||||
* 外部端口
|
||||
*/
|
||||
private int sport;
|
||||
/**
|
||||
* 内部端口
|
||||
*/
|
||||
private int dport;
|
||||
}
|
||||
|
|
@ -0,0 +1,29 @@
|
|||
package com.bcrjl.miwifi.model.result;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonIgnore;
|
||||
import lombok.Data;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 外网状态返回值
|
||||
*
|
||||
* @author yanqs
|
||||
*/
|
||||
@Data
|
||||
public class PppoeStatusResult {
|
||||
@JsonIgnore
|
||||
private int code;
|
||||
|
||||
private List<String> dns;
|
||||
|
||||
private String gw;
|
||||
|
||||
private Ip ip;
|
||||
|
||||
@Data
|
||||
public class Ip{
|
||||
private String mask;
|
||||
private String address;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,22 @@
|
|||
package com.bcrjl.miwifi.model.result;
|
||||
|
||||
import cn.hutool.core.annotation.Alias;
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* 端口转发列表返回数据
|
||||
*
|
||||
* @author yanqs
|
||||
*/
|
||||
@Data
|
||||
public class RangeRedirectResult extends Redirect {
|
||||
|
||||
@Alias("srcport")
|
||||
private srcPort srcPort;
|
||||
|
||||
@Data
|
||||
public class srcPort {
|
||||
private int t;
|
||||
private int f;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,29 @@
|
|||
package com.bcrjl.miwifi.model.result;
|
||||
|
||||
import cn.hutool.core.annotation.Alias;
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* @author yanqs
|
||||
*/
|
||||
@Data
|
||||
public class Redirect {
|
||||
/**
|
||||
* 名称
|
||||
*/
|
||||
private String name;
|
||||
|
||||
/**
|
||||
* 协议 1 TCP 2 UDP 3 TCP和UDP
|
||||
*/
|
||||
private Integer proto;
|
||||
|
||||
|
||||
@Alias("destip")
|
||||
private String destIp;
|
||||
|
||||
@Alias("ftype")
|
||||
private Integer fType;
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,19 @@
|
|||
package com.bcrjl.miwifi.model.result;
|
||||
|
||||
import cn.hutool.core.annotation.Alias;
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* 特定端口转发
|
||||
*
|
||||
* @author yanqs
|
||||
*/
|
||||
@Data
|
||||
public class RedirectResult extends Redirect {
|
||||
|
||||
@Alias("destport")
|
||||
private String destPort;
|
||||
|
||||
@Alias("srcport")
|
||||
private int srcPort;
|
||||
}
|
||||
|
|
@ -0,0 +1,116 @@
|
|||
package com.bcrjl.miwifi.model.result;
|
||||
|
||||
import cn.hutool.core.annotation.Alias;
|
||||
import com.fasterxml.jackson.annotation.JsonIgnore;
|
||||
import lombok.Data;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author yanqs
|
||||
*/
|
||||
@Data
|
||||
public class StatusResult {
|
||||
private List<Dev> dev;
|
||||
|
||||
@JsonIgnore
|
||||
private int code;
|
||||
|
||||
private Mem mem;
|
||||
|
||||
private int temperature;
|
||||
|
||||
private Count count;
|
||||
|
||||
private Hardware hardware;
|
||||
|
||||
private String upTime;
|
||||
|
||||
private Cpu cpu;
|
||||
|
||||
private Wan wan;
|
||||
|
||||
@Data
|
||||
public class Count {
|
||||
@Alias("all_without_mash")
|
||||
private int allWithoutMash;
|
||||
|
||||
private int online;
|
||||
|
||||
private int all;
|
||||
|
||||
@Alias("online_without_mash")
|
||||
private int online_without_mash;
|
||||
}
|
||||
|
||||
@Data
|
||||
public class Mem {
|
||||
private double usage;
|
||||
|
||||
private String total;
|
||||
|
||||
private String hz;
|
||||
|
||||
private String type;
|
||||
}
|
||||
|
||||
@Data
|
||||
public class Dev {
|
||||
private String mac;
|
||||
@Alias("isap")
|
||||
private int isAp;
|
||||
private String upload;
|
||||
@Alias("upspeed")
|
||||
private String upSpeed;
|
||||
@Alias("downspeed")
|
||||
private String downSpeed;
|
||||
private String online;
|
||||
@Alias("devname")
|
||||
private String devName;
|
||||
@Alias("maxuploadspeed")
|
||||
private String maxUploadSpeed;
|
||||
@Alias("maxdownloadspeed")
|
||||
private String maxDownloadSpeed;
|
||||
private String download;
|
||||
}
|
||||
|
||||
@Data
|
||||
public class Wan {
|
||||
@Alias("downspeed")
|
||||
private String downSpeed;
|
||||
@Alias("maxdownloadspeed")
|
||||
private String maxDownloadSpeed;
|
||||
@Alias("devname")
|
||||
private String devName;
|
||||
|
||||
private String upload;
|
||||
@Alias("upspeed")
|
||||
private String upSpeed;
|
||||
@Alias("maxuploadspeed")
|
||||
private String maxUploadSpeed;
|
||||
|
||||
private String download;
|
||||
}
|
||||
|
||||
@Data
|
||||
public class Cpu {
|
||||
private int core;
|
||||
|
||||
private String hz;
|
||||
|
||||
private int load;
|
||||
}
|
||||
|
||||
@Data
|
||||
public class Hardware {
|
||||
private String mac;
|
||||
|
||||
private String platform;
|
||||
|
||||
private String version;
|
||||
|
||||
private String channel;
|
||||
|
||||
private String sn;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
bmw:
|
||||
url: 192.168.31.1
|
||||
password: 123456
|
||||
web-password: 123456
|
||||
|
|
@ -0,0 +1,55 @@
|
|||
server:
|
||||
# 服务端口
|
||||
port: 24317
|
||||
# 是否启用响应压缩,默认为 false
|
||||
compression:
|
||||
enabled: true
|
||||
# 启用压缩的最小响应大小(字节),默认为 2048
|
||||
min-response-size: 1024
|
||||
tomcat:
|
||||
# 最大连接数,默认为 10000
|
||||
max-connections: 5000
|
||||
# 最大线程数,默认为 200
|
||||
max-threads: 100
|
||||
# 接受队列长度,默认为 100
|
||||
accept-count: 200
|
||||
# 连接超时时间(毫秒),默认为 20000
|
||||
connection-timeout: 30000
|
||||
# 长连接的空闲超时时间(毫秒),默认为 20000
|
||||
keep-alive-timeout: 30000
|
||||
# 最大允许上传的文件大小(字节),默认为 2MB
|
||||
max-swallow-size: 10485760
|
||||
# 最大允许的单个文件大小(字节),默认为 1MB
|
||||
max-file-size: 5242880
|
||||
# 最大允许的请求大小(字节),默认为 10MB
|
||||
max-request-size: 10485760
|
||||
|
||||
spring:
|
||||
application:
|
||||
name: bmw-backend
|
||||
profiles:
|
||||
active: mi
|
||||
web:
|
||||
resources:
|
||||
static-locations: classpath:/static/
|
||||
|
||||
############## Sa-Token 配置 (文档: https://sa-token.cc) ##############
|
||||
sa-token:
|
||||
# token 名称(同时也是 cookie 名称)
|
||||
token-name: Authorization
|
||||
# token 有效期(单位:秒) 默认30天,-1 代表永久有效
|
||||
timeout: 2592000
|
||||
# token 最低活跃频率(单位:秒),如果 token 超过此时间没有访问系统就会被冻结,默认-1 代表不限制,永不冻结
|
||||
active-timeout: -1
|
||||
# 是否允许同一账号多地同时登录 (为 true 时允许一起登录, 为 false 时新登录挤掉旧登录)
|
||||
is-concurrent: false
|
||||
# 在多人登录同一账号时,是否共用一个 token (为 true 时所有登录共用一个 token, 为 false 时每次登录新建一个 token)
|
||||
is-share: true
|
||||
# token 风格(默认可取值:uuid、simple-uuid、random-32、random-64、random-128、tik)
|
||||
token-style: uuid
|
||||
# 是否输出操作日志
|
||||
is-log: false
|
||||
|
||||
log:
|
||||
path: log/
|
||||
encoder: UTF-8
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
___ ____ _ _ _ __ _ ___ _
|
||||
| \/ (_) | | | (_)/ _(_) / _ \ | |
|
||||
| . . |_ ______| | | |_| |_ _ ______/ /_\ \ __ _ ___ _ __ | |_
|
||||
| |\/| | |______| |/\| | | _| |______| _ |/ _` |/ _ \ '_ \| __|
|
||||
| | | | | \ /\ / | | | | | | | | (_| | __/ | | | |_
|
||||
\_| |_/_| \/ \/|_|_| |_| \_| |_/\__, |\___|_| |_|\__|
|
||||
__/ |
|
||||
|___/
|
||||
|
|
@ -0,0 +1,170 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<!--
|
||||
scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。
|
||||
scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒当scan为true时,此属性生效。默认的时间间隔为1分钟。
|
||||
debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。
|
||||
-->
|
||||
<configuration scan="false" scanPeriod="60 seconds" debug="false">
|
||||
|
||||
<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
|
||||
<conversionRule conversionWord="wex"
|
||||
converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
|
||||
<conversionRule conversionWord="wEx"
|
||||
converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
|
||||
|
||||
<property resource="application.yml"/>
|
||||
|
||||
<!-- 单文件最大大小 -->
|
||||
<property name="maxFileSize" value="50MB"/>
|
||||
<!-- 最大保存时间(天) -->
|
||||
<property name="maxHistory" value="15"/>
|
||||
<!-- DEBUG 日志最大保存时间(天) -->
|
||||
<property name="debugMaxHistory" value="3"/>
|
||||
<!-- 日志文件 pattern -->
|
||||
<property name="log-file-pattern" value="%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}} ${LOG_LEVEL_PATTERN:-%5p} ${PID:- } --- [%36.36X{traceId}] [%10.10X{user}] [%15.15X{ip}] [%t] %-40.40logger{39} : %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}"/>
|
||||
|
||||
<!-- 定义日志的根目录 -->
|
||||
<springProperty scope="context" name="LOG_HOME" source="log.path"/>
|
||||
<!-- 定义日志编码 -->
|
||||
<springProperty scope="context" name="LOG_ENCODER" source="log.encoder"/>
|
||||
|
||||
<!-- 定义应用名,用于日志文件前缀 -->
|
||||
<property name="appName" value="mi-wifi-agent"/>
|
||||
|
||||
<!-- ch.qos.logback.core.ConsoleAppender 表示控制台输出 -->
|
||||
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
|
||||
<!-- 生产模式控制台最低只输出 INFO 级别日志 -->
|
||||
<springProfile name="prod">
|
||||
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
|
||||
<level>INFO</level>
|
||||
</filter>
|
||||
</springProfile>
|
||||
|
||||
<encoder>
|
||||
<pattern>%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} [%36.36X{traceId}] [%10.10X{user}] [%15.15X{ip}] %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(%-6L){yellow} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}</pattern>
|
||||
<charset>${LOG_ENCODER}</charset>
|
||||
</encoder>
|
||||
</appender>
|
||||
|
||||
<!-- 只记录 debug 日志,每天滚动一次,最多保留 ${debugMaxHistory} 天,文件最大 ${maxFileSize},总文件最大 1GB -->
|
||||
<appender name="debug_file" class="ch.qos.logback.core.rolling.RollingFileAppender">
|
||||
<!-- 指定日志文件的名称 -->
|
||||
<file>${LOG_HOME}/${appName}-debug.log</file>
|
||||
|
||||
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
|
||||
<fileNamePattern>${LOG_HOME}/%d{yyyy-MM-dd}/${appName}-debug-%d{yyyy-MM-dd}-%i.gz</fileNamePattern>
|
||||
<MaxHistory>${debugMaxHistory}</MaxHistory>
|
||||
<totalSizeCap>1GB</totalSizeCap>
|
||||
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
|
||||
<maxFileSize>${maxFileSize}</maxFileSize>
|
||||
</timeBasedFileNamingAndTriggeringPolicy>
|
||||
</rollingPolicy>
|
||||
|
||||
<encoder>
|
||||
<pattern>${log-file-pattern}</pattern>
|
||||
</encoder>
|
||||
|
||||
<filter class="ch.qos.logback.classic.filter.LevelFilter">
|
||||
<level>DEBUG</level>
|
||||
<onMatch>ACCEPT</onMatch>
|
||||
<onMismatch>DENY</onMismatch>
|
||||
</filter>
|
||||
</appender>
|
||||
|
||||
<!-- 记录 info 日志及以上级别的日志,每天滚动一次,最多保留 ${maxHistory} 天,文件最大 ${maxFileSize} -->
|
||||
<appender name="info_file" class="ch.qos.logback.core.rolling.RollingFileAppender">
|
||||
<!-- 指定日志文件的名称 -->
|
||||
<file>${LOG_HOME}/${appName}.log</file>
|
||||
|
||||
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
|
||||
<fileNamePattern>${LOG_HOME}/%d{yyyy-MM-dd}/${appName}-info-%d{yyyy-MM-dd}-%i.gz</fileNamePattern>
|
||||
<MaxHistory>${maxHistory}</MaxHistory>
|
||||
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
|
||||
<maxFileSize>${maxFileSize}</maxFileSize>
|
||||
</timeBasedFileNamingAndTriggeringPolicy>
|
||||
</rollingPolicy>
|
||||
|
||||
<encoder>
|
||||
<pattern>${log-file-pattern}</pattern>
|
||||
</encoder>
|
||||
|
||||
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
|
||||
<level>INFO</level>
|
||||
</filter>
|
||||
</appender>
|
||||
|
||||
<!-- 只记录 warn 日志,每天滚动一次,最多保留 ${maxHistory} 天,文件最大 ${maxFileSize} -->
|
||||
<appender name="warn_file" class="ch.qos.logback.core.rolling.RollingFileAppender">
|
||||
<!-- 指定日志文件的名称 -->
|
||||
<file>${LOG_HOME}/${appName}-warn.log</file>
|
||||
|
||||
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
|
||||
<fileNamePattern>${LOG_HOME}/%d{yyyy-MM-dd}/${appName}-warn-%d{yyyy-MM-dd}-%i.gz</fileNamePattern>
|
||||
<MaxHistory>${maxHistory}</MaxHistory>
|
||||
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
|
||||
<maxFileSize>${maxFileSize}</maxFileSize>
|
||||
</timeBasedFileNamingAndTriggeringPolicy>
|
||||
</rollingPolicy>
|
||||
|
||||
<encoder>
|
||||
<pattern>${log-file-pattern}</pattern>
|
||||
</encoder>
|
||||
|
||||
<filter class="ch.qos.logback.classic.filter.LevelFilter">
|
||||
<level>WARN</level>
|
||||
<onMatch>ACCEPT</onMatch>
|
||||
<onMismatch>DENY</onMismatch>
|
||||
</filter>
|
||||
</appender>
|
||||
|
||||
<!-- 只记录 error 日志,每天滚动一次,最多保留 ${maxHistory} 天,文件最大 ${maxFileSize} -->
|
||||
<appender name="error_file" class="ch.qos.logback.core.rolling.RollingFileAppender">
|
||||
<!-- 指定日志文件的名称 -->
|
||||
<file>${LOG_HOME}/${appName}-error.log</file>
|
||||
|
||||
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
|
||||
<fileNamePattern>${LOG_HOME}/%d{yyyy-MM-dd}/${appName}-error-%d{yyyy-MM-dd}-%i.gz</fileNamePattern>
|
||||
<MaxHistory>${maxHistory}</MaxHistory>
|
||||
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
|
||||
<maxFileSize>${maxFileSize}</maxFileSize>
|
||||
</timeBasedFileNamingAndTriggeringPolicy>
|
||||
</rollingPolicy>
|
||||
|
||||
<encoder>
|
||||
<pattern>${log-file-pattern}</pattern>
|
||||
</encoder>
|
||||
|
||||
<filter class="ch.qos.logback.classic.filter.LevelFilter">
|
||||
<level>ERROR</level>
|
||||
<onMatch>ACCEPT</onMatch>
|
||||
<onMismatch>DENY</onMismatch>
|
||||
</filter>
|
||||
</appender>
|
||||
|
||||
<!-- 控制台输出日志级别 -->
|
||||
<root level="info">
|
||||
<appender-ref ref="console"/>
|
||||
<appender-ref ref="info_file"/>
|
||||
<appender-ref ref="warn_file"/>
|
||||
<appender-ref ref="error_file"/>
|
||||
</root>
|
||||
|
||||
<!--
|
||||
logger 主要用于存放日志对象,也可以定义日志类型、级别
|
||||
name:表示匹配的logger类型前缀,也就是包的前半部分
|
||||
level:要记录的日志级别,包括 TRACE < DEBUG < INFO < WARN < ERROR
|
||||
additivity:作用在于children-logger是否使用 rootLogger配置的appender进行输出,
|
||||
false:表示只用当前logger的appender-ref,
|
||||
true: 表示当前logger的appender-ref和rootLogger的appender-ref都有效
|
||||
-->
|
||||
|
||||
<!-- 指定 ZFile 输出的日志到文件中 -->
|
||||
<logger name="com.bcrjl.miwifi" level="DEBUG" >
|
||||
<appender-ref ref="debug_file"/>
|
||||
</logger>
|
||||
|
||||
<logger name="springfox" level="info" />
|
||||
<logger name="org.springframework" level="info" />
|
||||
|
||||
</configuration>
|
||||
|
|
@ -0,0 +1,166 @@
|
|||
<!--
|
||||
* @Descripttion: 此文件由SCUI生成,典型的VUE增删改列表页面组件
|
||||
* @version: 1.0
|
||||
* @Author: SCUI AutoCode 模板版本 1.0.0-beta.1
|
||||
* @Date: <%= createDate %>
|
||||
* @LastEditors: (最后更新作者)
|
||||
* @LastEditTime: (最后更新时间)
|
||||
-->
|
||||
|
||||
<template>
|
||||
<el-container>
|
||||
<el-header>
|
||||
<div class="left-panel">
|
||||
<el-button type="primary" icon="el-icon-plus" @click="add"></el-button>
|
||||
<el-button type="danger" plain icon="el-icon-delete" :disabled="selection.length==0" @click="batch_del"></el-button>
|
||||
</div>
|
||||
<div class="right-panel">
|
||||
<div class="right-panel-search">
|
||||
<el-input v-model="search.keyword" placeholder="关键词搜索" clearable></el-input>
|
||||
<el-button type="primary" icon="el-icon-search" @click="upsearch"></el-button>
|
||||
</div>
|
||||
</div>
|
||||
</el-header>
|
||||
<el-main class="nopadding">
|
||||
<scTable ref="table" :apiObj="apiObj" row-key="<%= base.rowKey %>" @selection-change="selectionChange">
|
||||
|
||||
<el-table-column type="selection" width="50"></el-table-column>
|
||||
<% column.forEach(function(item, index){ %>
|
||||
<el-table-column label="<%= item.label %>" prop="<%= item.prop %>" width="<%= item.width %>"></el-table-column>
|
||||
<% })%>
|
||||
<el-table-column label="操作" fixed="right" align="right" width="140">
|
||||
<template #default="scope">
|
||||
<el-button type="text" size="small" @click="table_show(scope.row, scope.$index)">查看</el-button>
|
||||
<el-button type="text" size="small" @click="table_edit(scope.row, scope.$index)">编辑</el-button>
|
||||
<el-popconfirm title="确定删除吗?" @confirm="table_del(scope.row, scope.$index)">
|
||||
<template #reference>
|
||||
<el-button type="text" size="small">删除</el-button>
|
||||
</template>
|
||||
</el-popconfirm>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</scTable>
|
||||
</el-main>
|
||||
</el-container>
|
||||
|
||||
<el-dialog :title="titleMap[saveMode]" v-model="saveDialogVisible" :width="500" destroy-on-close>
|
||||
<save-dialog ref="saveDialog" :mode="saveMode"></save-dialog>
|
||||
<template #footer>
|
||||
<el-button @click="saveDialogVisible=false" >取 消</el-button>
|
||||
<el-button v-if="saveMode!='show'" type="primary" @click="saveForm()" :loading="isSaveing">保 存</el-button>
|
||||
</template>
|
||||
</el-dialog>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import saveDialog from './save'
|
||||
|
||||
export default {
|
||||
name: '<%= base.name %>',
|
||||
components: {
|
||||
saveDialog
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
apiObj: this.$API.<%= api.list %>,
|
||||
selection: [],
|
||||
search: {
|
||||
keyword: ""
|
||||
},
|
||||
saveDialogVisible: false,
|
||||
saveMode: 'add',
|
||||
titleMap: {
|
||||
add: "新增",
|
||||
edit: "编辑",
|
||||
show: "查看"
|
||||
},
|
||||
isSaveing: false,
|
||||
}
|
||||
},
|
||||
mounted(){
|
||||
|
||||
},
|
||||
methods: {
|
||||
//添加
|
||||
add(){
|
||||
this.saveMode = 'add';
|
||||
this.saveDialogVisible = true;
|
||||
},
|
||||
//编辑
|
||||
table_edit(row){
|
||||
this.saveMode = 'edit';
|
||||
this.saveDialogVisible = true;
|
||||
this.$nextTick(() => {
|
||||
//这里可以再次根据ID查询详情接口
|
||||
this.$refs.saveDialog.setData(row)
|
||||
})
|
||||
},
|
||||
//查看
|
||||
table_show(row){
|
||||
this.saveMode = 'show';
|
||||
this.saveDialogVisible = true;
|
||||
this.$nextTick(() => {
|
||||
//这里可以再次根据ID查询详情接口
|
||||
this.$refs.saveDialog.setData(row)
|
||||
})
|
||||
},
|
||||
//删除
|
||||
async table_del(row, index){
|
||||
var reqData = {id: row.id}
|
||||
var res = await this.$API.<%= api.del %>.post(reqData);
|
||||
if(res.code == 200){
|
||||
//这里选择刷新整个表格 OR 插入/编辑现有表格数据
|
||||
this.$refs.table.tableData.splice(index, 1);
|
||||
this.$message.success("删除成功")
|
||||
}else{
|
||||
this.$alert(res.message, "提示", {type: 'error'})
|
||||
}
|
||||
},
|
||||
//批量删除
|
||||
async batch_del(){
|
||||
this.$confirm(`确定删除选中的 ${this.selection.length} 项吗?`, '提示', {
|
||||
type: 'warning'
|
||||
}).then(() => {
|
||||
const loading = this.$loading();
|
||||
this.selection.forEach(item => {
|
||||
this.$refs.table.tableData.forEach((itemI, indexI) => {
|
||||
if (item.id === itemI.id) {
|
||||
this.$refs.table.tableData.splice(indexI, 1)
|
||||
}
|
||||
})
|
||||
})
|
||||
loading.close();
|
||||
this.$message.success("操作成功")
|
||||
}).catch(() => {
|
||||
|
||||
})
|
||||
},
|
||||
//提交
|
||||
saveForm(){
|
||||
this.$refs.saveDialog.submit(async (formData) => {
|
||||
this.isSaveing = true;
|
||||
var res = await this.$API.<%= api.save %>.post(formData);
|
||||
this.isSaveing = false;
|
||||
if(res.code == 200){
|
||||
//这里选择刷新整个表格 OR 插入/编辑现有表格数据
|
||||
this.saveDialogVisible = false;
|
||||
this.$message.success("操作成功")
|
||||
}else{
|
||||
this.$alert(res.message, "提示", {type: 'error'})
|
||||
}
|
||||
})
|
||||
},
|
||||
//表格选择后回调事件
|
||||
selectionChange(selection){
|
||||
this.selection = selection;
|
||||
},
|
||||
//搜索
|
||||
upsearch(){
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
</style>
|
||||
|
|
@ -0,0 +1,72 @@
|
|||
<!--
|
||||
* @Descripttion: 此文件由SCUI生成,典型的VUE增删改列表页面组件
|
||||
* @version: 1.0
|
||||
* @Author: SCUI AutoCode 模板版本 1.0.0-beta.1
|
||||
* @Date: <%= createDate %>
|
||||
* @LastEditors: (最后更新作者)
|
||||
* @LastEditTime: (最后更新时间)
|
||||
-->
|
||||
|
||||
<template>
|
||||
<el-form :model="form" :rules="rules" :disabled="mode=='show'" ref="dialogForm" label-width="100px" label-position="left">
|
||||
<% column.forEach(function(item, index){ %>
|
||||
<el-form-item label="<%= item.label %>" prop="<%= item.prop %>">
|
||||
<el-input v-model="form.<%= item.prop %>" clearable></el-input>
|
||||
</el-form-item>
|
||||
<% })%>
|
||||
</el-form>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
props: {
|
||||
mode: { type: String, default: "add" }
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
//表单数据
|
||||
form: {
|
||||
<%= base.rowKey %>:"",
|
||||
<% column.forEach(function(item, index){ %>
|
||||
<%= item.prop %>: "",
|
||||
<% })%>
|
||||
},
|
||||
//验证规则
|
||||
rules: {
|
||||
<% column.forEach(function(item, index){ %>
|
||||
<%= item.prop %>: [
|
||||
{required: true, message: '请输入<%= item.label %>'}
|
||||
],
|
||||
<% })%>
|
||||
},
|
||||
}
|
||||
},
|
||||
mounted(){
|
||||
|
||||
},
|
||||
methods: {
|
||||
//表单提交方法
|
||||
submit(callback){
|
||||
this.$refs.dialogForm.validate((valid) => {
|
||||
if (valid) {
|
||||
callback(this.form)
|
||||
}else{
|
||||
return false;
|
||||
}
|
||||
})
|
||||
},
|
||||
//表单注入数据
|
||||
setData(data){
|
||||
this.form.<%= base.rowKey %> = data.<%= base.rowKey %>
|
||||
<% column.forEach(function(item, index){ %>
|
||||
this.form.<%= item.prop %> = data.<%= item.prop %>
|
||||
<% })%>
|
||||
//可以和上面一样单个注入,也可以像下面一样直接合并进去
|
||||
//Object.assign(this.form, data)
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
</style>
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
|
||||
// 此文件非必要,在生产环境下此文件配置可覆盖运行配置,开发环境下不起效
|
||||
// 详情见 src/config/index.js
|
||||
|
||||
const APP_CONFIG = {
|
||||
//接口地址,如遇跨域需使用nginx代理
|
||||
API_URL: ""
|
||||
}
|
||||
|
|
@ -0,0 +1 @@
|
|||
.sc-cropper[data-v-5a089473]{height:300px}.sc-cropper__img[data-v-5a089473]{height:100%;width:400px;float:left;background:#ebeef5}.sc-cropper__img img[data-v-5a089473]{display:none}.sc-cropper__preview[data-v-5a089473]{width:120px;margin-left:20px;float:left}.sc-cropper__preview h4[data-v-5a089473]{font-weight:400;font-size:12px;color:#999;margin-bottom:20px}.sc-cropper__preview__img[data-v-5a089473]{overflow:hidden;width:120px;height:120px;border:1px solid #ebeef5}
|
||||
|
|
@ -0,0 +1 @@
|
|||
.router-err[data-v-10b4695c]{display:flex;width:900px;margin:50px auto;align-items:center}.router-err__icon[data-v-10b4695c]{width:400px}.router-err__icon img[data-v-10b4695c]{width:100%}.router-err__content[data-v-10b4695c]{flex:1;padding:40px}.router-err__content h2[data-v-10b4695c]{font-size:26px}.router-err__content p[data-v-10b4695c]{font-size:14px;color:#999;margin:15px 0 30px 0;line-height:1.5}@media (max-width:992px){.router-err[data-v-10b4695c]{display:block;width:100%;margin-top:10px;text-align:center}.router-err__icon[data-v-10b4695c]{width:280px;margin:0 auto}}
|
||||
|
|
@ -0,0 +1 @@
|
|||
.sc-code-editor[data-v-a0186eba]{font-size:14px;border:1px solid #ddd;line-height:150%}.sc-code-editor[data-v-a0186eba] .CodeMirror{height:100%}
|
||||
|
|
@ -0,0 +1 @@
|
|||
.item-background p[data-v-2a4d28f0]{color:#999;margin-top:10px;line-height:1.8}
|
||||
|
|
@ -0,0 +1 @@
|
|||
.progress[data-v-02bc7e68]{text-align:center}.progress .percentage-value[data-v-02bc7e68]{font-size:28px}.progress .percentage-label[data-v-02bc7e68]{font-size:12px;margin-top:10px}
|
||||
|
|
@ -0,0 +1 @@
|
|||
.item-background[data-v-1e5a9c0b]{background:linear-gradient(90deg,#8e54e9,#4776e6);color:#fff}.time h2[data-v-1e5a9c0b]{font-size:40px}.time p[data-v-1e5a9c0b]{font-size:14px;margin-top:13px;opacity:.7}
|
||||
|
|
@ -0,0 +1 @@
|
|||
.welcome .logo[data-v-604b640e]{text-align:center}.welcome .logo img[data-v-604b640e]{vertical-align:bottom;width:100px;height:100px;margin-bottom:20px}.welcome .logo h2[data-v-604b640e]{font-size:30px;font-weight:400;display:flex;align-items:center;justify-content:center}.tips[data-v-604b640e]{margin-top:20px;padding:0 40px}.tips-item[data-v-604b640e]{display:flex;align-items:center;justify-content:center;padding:7.5px 0}.tips-item-icon[data-v-604b640e]{width:40px;height:40px;display:flex;align-items:center;justify-content:center;border-radius:50%;font-size:18px;margin-right:20px;color:var(--el-color-primary);background:hsla(0,0%,71%,.1)}.tips-item-message[data-v-604b640e]{flex:1;font-size:14px}.actions[data-v-604b640e]{text-align:center;margin:40px 0 20px 0}
|
||||
|
|
@ -0,0 +1 @@
|
|||
.item-background p[data-v-2a4d28f0]{color:#999;margin-top:10px;line-height:1.8}.progress[data-v-02bc7e68]{text-align:center}.progress .percentage-value[data-v-02bc7e68]{font-size:28px}.progress .percentage-label[data-v-02bc7e68]{font-size:12px;margin-top:10px}.item-background[data-v-1e5a9c0b]{background:linear-gradient(90deg,#8e54e9,#4776e6);color:#fff}.time h2[data-v-1e5a9c0b]{font-size:40px}.time p[data-v-1e5a9c0b]{font-size:14px;margin-top:13px;opacity:.7}.welcome .logo[data-v-604b640e]{text-align:center}.welcome .logo img[data-v-604b640e]{vertical-align:bottom;width:100px;height:100px;margin-bottom:20px}.welcome .logo h2[data-v-604b640e]{font-size:30px;font-weight:400;display:flex;align-items:center;justify-content:center}.tips[data-v-604b640e]{margin-top:20px;padding:0 40px}.tips-item[data-v-604b640e]{display:flex;align-items:center;justify-content:center;padding:7.5px 0}.tips-item-icon[data-v-604b640e]{width:40px;height:40px;display:flex;align-items:center;justify-content:center;border-radius:50%;font-size:18px;margin-right:20px;color:var(--el-color-primary);background:hsla(0,0%,71%,.1)}.tips-item-message[data-v-604b640e]{flex:1;font-size:14px}.actions[data-v-604b640e]{text-align:center;margin:40px 0 20px 0}
|
||||
|
|
@ -0,0 +1 @@
|
|||
.myMods[data-v-ddc038fc]{list-style:none;margin:-10px}.myMods li[data-v-ddc038fc]{display:inline-block;width:100px;height:100px;vertical-align:top;transition:all .3s ease;margin:10px;border-radius:5px}.myMods li[data-v-ddc038fc]:hover{opacity:.8}.myMods li a[data-v-ddc038fc]{width:100%;height:100%;padding:10px;display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;color:#fff}.myMods li i[data-v-ddc038fc]{font-size:26px;color:#fff}.myMods li p[data-v-ddc038fc]{font-size:12px;color:#fff;margin-top:10px;width:100%;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.modItem-add[data-v-ddc038fc]{border:1px dashed #ddd;cursor:pointer}.modItem-add i[data-v-ddc038fc]{font-size:30px;color:#999!important}.modItem-add:hover i[data-v-ddc038fc],.modItem-add[data-v-ddc038fc]:hover{border-color:#409eff;color:#409eff!important}.setMods[data-v-ddc038fc]{padding:0 20px}.setMods h4[data-v-ddc038fc]{font-size:14px;font-weight:400}.setMods ul[data-v-ddc038fc]{margin:20px -5px;min-height:90px}.setMods li[data-v-ddc038fc]{display:inline-block;width:80px;height:80px;text-align:center;margin:5px;color:#fff;vertical-align:top;padding:4px;padding-top:15px;cursor:move;border-radius:3px}.setMods li i[data-v-ddc038fc]{font-size:20px}.setMods li p[data-v-ddc038fc]{font-size:12px;margin-top:10px}.setMods li.sortable-ghost[data-v-ddc038fc]{opacity:.3}
|
||||
|
|
@ -0,0 +1 @@
|
|||
.myMods[data-v-ddc038fc]{list-style:none;margin:-10px}.myMods li[data-v-ddc038fc]{display:inline-block;width:100px;height:100px;vertical-align:top;transition:all .3s ease;margin:10px;border-radius:5px}.myMods li[data-v-ddc038fc]:hover{opacity:.8}.myMods li a[data-v-ddc038fc]{width:100%;height:100%;padding:10px;display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;color:#fff}.myMods li i[data-v-ddc038fc]{font-size:26px;color:#fff}.myMods li p[data-v-ddc038fc]{font-size:12px;color:#fff;margin-top:10px;width:100%;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.modItem-add[data-v-ddc038fc]{border:1px dashed #ddd;cursor:pointer}.modItem-add i[data-v-ddc038fc]{font-size:30px;color:#999!important}.modItem-add:hover i[data-v-ddc038fc],.modItem-add[data-v-ddc038fc]:hover{border-color:#409eff;color:#409eff!important}.setMods[data-v-ddc038fc]{padding:0 20px}.setMods h4[data-v-ddc038fc]{font-size:14px;font-weight:400}.setMods ul[data-v-ddc038fc]{margin:20px -5px;min-height:90px}.setMods li[data-v-ddc038fc]{display:inline-block;width:80px;height:80px;text-align:center;margin:5px;color:#fff;vertical-align:top;padding:4px;padding-top:15px;cursor:move;border-radius:3px}.setMods li i[data-v-ddc038fc]{font-size:20px}.setMods li p[data-v-ddc038fc]{font-size:12px;margin-top:10px}.setMods li.sortable-ghost[data-v-ddc038fc]{opacity:.3}
|
||||
|
|
@ -0,0 +1 @@
|
|||
.sc-statistic-title[data-v-fb7562ba]{font-size:12px;color:#999;margin-bottom:10px;display:flex;align-items:center}.sc-statistic-tips[data-v-fb7562ba]{margin-left:5px}.sc-statistic-content[data-v-fb7562ba]{font-size:20px;color:#333}.sc-statistic-content-value[data-v-fb7562ba]{font-weight:700}.sc-statistic-content-prefix[data-v-fb7562ba]{margin-right:5px}.sc-statistic-content-suffix[data-v-fb7562ba]{margin-left:5px;font-size:12px}.sc-statistic-description[data-v-fb7562ba]{margin-top:10px;color:#999}.dark .sc-statistic-content[data-v-fb7562ba]{color:#d0d0d0}.progress{text-align:center;margin-right:20px}.progress .percentage-value{font-size:28px}.progress .percentage-label{font-size:12px;margin-top:10px}
|
||||
|
|
@ -0,0 +1 @@
|
|||
.mobile-nav-button[data-v-a483418e]{position:fixed;bottom:10px;left:10px;z-index:10;width:50px;height:50px;background:#409eff;box-shadow:0 2px 12px 0 #409eff;border-radius:50%;display:flex;align-items:center;justify-content:center}.mobile-nav-button i[data-v-a483418e]{color:#fff;font-size:20px}.mobile-nav[data-v-a483418e]{background:#212d3d}.mobile-nav .el-header[data-v-a483418e]{background:transparent;border:0}.mobile-nav .el-main[data-v-a483418e]{padding:0}.mobile-nav .logo-bar[data-v-a483418e]{display:flex;align-items:center;font-weight:700;font-size:20px;color:#fff}.mobile-nav .logo-bar img[data-v-a483418e]{width:30px;margin-right:10px}.mobile-nav .el-submenu__title[data-v-a483418e]:hover{background:#fff!important}.el-breadcrumb[data-v-d25726ee]{margin-left:15px}.el-breadcrumb .el-breadcrumb__inner .icon[data-v-d25726ee]{font-size:14px;margin-right:5px;float:left}.breadcrumb-enter-active[data-v-d25726ee],.breadcrumb-leave-active[data-v-d25726ee]{transition:all .3s}.breadcrumb-enter-from[data-v-d25726ee],.breadcrumb-leave-active[data-v-d25726ee]{opacity:0;transform:translateX(20px)}.breadcrumb-leave-active[data-v-d25726ee]{position:absolute}.contextmenu{position:fixed;width:200px;margin:0;border-radius:0;background:var(--el-bg-color-overlay);border:1px solid var(--el-border-color-light);box-shadow:0 2px 12px 0 rgba(0,0,0,.1);z-index:3000;list-style-type:none;padding:10px 0}.contextmenu hr{margin:5px 0;border:none;height:1px;font-size:0;background-color:var(--el-border-color-light)}.contextmenu li{display:flex;align-items:center;margin:0;cursor:pointer;line-height:30px;padding:0 17px;color:#606266}.contextmenu li i{font-size:14px;margin-right:10px}.contextmenu li:hover{background-color:#ecf5ff;color:#66b1ff}.contextmenu li.disabled{cursor:not-allowed;color:#bbb;background:transparent}.tags-tip{padding:5px}.tags-tip p{margin-bottom:10px}.dark .contextmenu li{color:var(--el-text-color-primary)}.sc-search-no-result[data-v-2bd43785]{text-align:center;margin:40px 0;color:#999}.sc-search-history[data-v-2bd43785]{margin-top:10px}.sc-search-history .el-tag[data-v-2bd43785]{cursor:pointer}.sc-search-result[data-v-2bd43785]{margin-top:15px}.sc-search-result li[data-v-2bd43785]{height:56px;padding:0 15px;background:var(--el-bg-color-overlay);border:1px solid var(--el-border-color-light);list-style:none;border-radius:4px;margin-bottom:5px;font-size:14px;display:flex;align-items:center;cursor:pointer}.sc-search-result li i[data-v-2bd43785]{font-size:20px;margin-right:15px}.sc-search-result li[data-v-2bd43785]:hover{background:var(--el-color-primary);color:#fff;border-color:var(--el-color-primary)}.user-bar-tasks-item[data-v-1d80f4cf]{margin-bottom:10px}.user-bar-tasks-item[data-v-1d80f4cf]:hover{border-color:var(--el-color-primary)}.user-bar-tasks-item-body[data-v-1d80f4cf]{display:flex}.user-bar-tasks-item-body .taskIcon[data-v-1d80f4cf]{width:45px;height:45px;background:var(--el-color-primary-light-9);margin-right:20px;display:flex;justify-content:center;align-items:center;color:var(--el-color-primary);border-radius:20px}.user-bar-tasks-item-body .taskMain[data-v-1d80f4cf]{flex:1}.user-bar-tasks-item-body .title h2[data-v-1d80f4cf]{font-size:15px}.user-bar-tasks-item-body .title p[data-v-1d80f4cf]{font-size:12px;color:#999;margin-top:5px}.user-bar-tasks-item-body .bottom[data-v-1d80f4cf]{display:flex;justify-content:space-between;align-items:center;padding-top:20px}.user-bar .panel-item[data-v-2e659e05],.user-bar[data-v-2e659e05]{display:flex;align-items:center;height:100%}.user-bar .panel-item[data-v-2e659e05]{padding:0 10px;cursor:pointer}.user-bar .panel-item i[data-v-2e659e05]{font-size:16px}.user-bar .panel-item[data-v-2e659e05]:hover{background:rgba(0,0,0,.1)}.user-bar .user-avatar[data-v-2e659e05]{height:49px;display:flex;align-items:center}.user-bar .user-avatar label[data-v-2e659e05]{display:inline-block;margin-left:5px;font-size:12px;cursor:pointer}.msg-list li[data-v-2e659e05]{border-top:1px solid #eee}.msg-list li a[data-v-2e659e05]{display:flex;padding:20px}.msg-list li a[data-v-2e659e05]:hover{background:#ecf5ff}.msg-list__icon[data-v-2e659e05]{width:40px;margin-right:15px}.msg-list__main[data-v-2e659e05]{flex:1}.msg-list__main h2[data-v-2e659e05]{font-size:15px;font-weight:400;color:#333}.msg-list__main p[data-v-2e659e05]{font-size:12px;color:#999;line-height:1.8;margin-top:5px}.msg-list__time[data-v-2e659e05]{width:100px;text-align:right;color:#999}.dark .msg-list__main h2[data-v-2e659e05]{color:#d0d0d0}.dark .msg-list li[data-v-2e659e05]{border-top:1px solid #363636}.dark .msg-list li a[data-v-2e659e05]:hover{background:#383838}.iframe-pages[data-v-27bcc55e]{width:100%;height:100%;background:#fff}iframe[data-v-27bcc55e]{border:0;width:100%;height:100%;display:block}
|
||||
|
|
@ -0,0 +1 @@
|
|||
.login_bg[data-v-47c5c61e]{width:100%;height:100%;background:#fff;display:flex}.login_adv[data-v-47c5c61e]{width:33.33333%;background-color:#555;background-size:cover;background-position:50%;background-repeat:no-repeat;position:relative}.login_adv__title[data-v-47c5c61e]{color:#fff;padding:40px;position:absolute;top:0;left:0;right:0;z-index:2}.login_adv__title h2[data-v-47c5c61e]{font-size:40px}.login_adv__title h4[data-v-47c5c61e]{font-size:18px;margin-top:10px;font-weight:400}.login_adv__title p[data-v-47c5c61e]{font-size:14px;margin-top:10px;line-height:1.8;color:hsla(0,0%,100%,.6)}.login_adv__title div[data-v-47c5c61e]{margin-top:10px;display:flex;align-items:center}.login_adv__title div span[data-v-47c5c61e]{margin-right:15px}.login_adv__title div i[data-v-47c5c61e]{font-size:40px}.login_adv__title div i.add[data-v-47c5c61e]{font-size:20px;color:hsla(0,0%,100%,.6)}.login_adv__bottom[data-v-47c5c61e]{position:absolute;left:0;right:0;bottom:0;color:#fff;padding:40px;background-image:linear-gradient(transparent,#000);z-index:3}.login_adv__mask[data-v-47c5c61e]{position:absolute;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,.5);z-index:1}.login_main[data-v-47c5c61e]{flex:1;overflow:auto;display:flex}.login-form[data-v-47c5c61e]{width:400px;margin:auto;padding:20px 0}.login-header[data-v-47c5c61e]{margin-bottom:40px}.login-header .logo[data-v-47c5c61e]{display:flex;align-items:center}.login-header .logo img[data-v-47c5c61e]{width:40px;height:40px;vertical-align:bottom;margin-right:10px}.login-header .logo label[data-v-47c5c61e]{font-size:26px;font-weight:700}.login-oauth[data-v-47c5c61e]{display:flex;justify-content:space-around}.login-form .el-divider[data-v-47c5c61e]{margin-top:40px}.login-form[data-v-47c5c61e] .el-tabs .el-tabs__header{margin-bottom:25px}.login-form[data-v-47c5c61e] .el-tabs .el-tabs__header .el-tabs__item{font-size:14px}.login-form[data-v-47c5c61e] .login-forgot{text-align:right}.login-form[data-v-47c5c61e] .login-forgot a{color:var(--el-color-primary)}.login-form[data-v-47c5c61e] .login-forgot a:hover{color:var(--el-color-primary-light-3)}.login-form[data-v-47c5c61e] .login-reg{font-size:14px;color:var(--el-text-color-primary)}.login-form[data-v-47c5c61e] .login-reg a{color:var(--el-color-primary)}.login-form[data-v-47c5c61e] .login-reg a:hover{color:var(--el-color-primary-light-3)}.login_config[data-v-47c5c61e]{position:absolute;top:20px;right:20px}.login-form[data-v-47c5c61e] .login-msg-yzm{display:flex;width:100%}.login-form[data-v-47c5c61e] .login-msg-yzm .el-button{margin-left:10px;--el-button-size:42px}.qrCodeLogin[data-v-47c5c61e]{text-align:center;position:relative;padding:20px 0}.qrCodeLogin img.qrCode[data-v-47c5c61e]{background:#fff;padding:20px;border-radius:10px}.qrCodeLogin p.msg[data-v-47c5c61e]{margin-top:15px}.qrCodeLogin .qrCodeLogin-result[data-v-47c5c61e]{position:absolute;top:0;left:0;right:0;bottom:0;text-align:center;background:var(--el-mask-color)}@media (max-width:1200px){.login-form[data-v-47c5c61e]{width:340px}}@media (max-width:1000px){.login_main[data-v-47c5c61e]{display:block}.login_main .login_config[data-v-47c5c61e]{position:static;padding:20px 20px 0 20px;text-align:right}.login-form[data-v-47c5c61e]{width:100%;padding:20px 40px}.login_adv[data-v-47c5c61e]{display:none}}
|
||||
|
|
@ -0,0 +1 @@
|
|||
.input-wrapper[data-v-1ddf250a]{display:flex}.prefix[data-v-1ddf250a]{margin-right:10px}
|
||||
|
|
@ -0,0 +1 @@
|
|||
.input-wrapper[data-v-9ef284c6]{display:flex}.prefix[data-v-9ef284c6]{margin-right:10px}
|
||||
|
|
@ -0,0 +1 @@
|
|||
.input-wrapper[data-v-9ef284c6]{display:flex}.prefix[data-v-9ef284c6]{margin-right:10px}.input-wrapper[data-v-1ddf250a]{display:flex}.prefix[data-v-1ddf250a]{margin-right:10px}
|
||||
|
|
@ -0,0 +1 @@
|
|||
.aboutTop[data-v-278f5e7a]{border:0;background:linear-gradient(90deg,#8e54e9,#4776e6);color:#fff}.aboutTop-info[data-v-278f5e7a]{text-align:center}.aboutTop-info img[data-v-278f5e7a]{width:100px}.aboutTop-info h2[data-v-278f5e7a]{font-size:26px;margin-top:15px}.aboutTop-info p[data-v-278f5e7a]{font-size:16px;margin-top:10px}
|
||||
|
|
@ -0,0 +1 @@
|
|||
.menu[data-v-0b8c14e4] .el-tree-node__label{display:flex;flex:1;height:100%}.custom-tree-node[data-v-0b8c14e4]{display:flex;flex:1;align-items:center;justify-content:space-between;font-size:14px;padding-right:24px;height:100%}.custom-tree-node .code[data-v-0b8c14e4]{font-size:12px;color:#999}.custom-tree-node .do[data-v-0b8c14e4],.custom-tree-node:hover .code[data-v-0b8c14e4]{display:none}.custom-tree-node:hover .do[data-v-0b8c14e4]{display:inline-block}
|
||||
|
|
@ -0,0 +1 @@
|
|||
.code[data-v-6b71ccf9]{background:#848484;padding:15px;color:#fff;font-size:12px;border-radius:4px}
|
||||
|
|
@ -0,0 +1 @@
|
|||
.code[data-v-6b71ccf9]{background:#848484;padding:15px;color:#fff;font-size:12px;border-radius:4px}
|
||||
|
|
@ -0,0 +1 @@
|
|||
.sc-icon-select[data-v-608ca6b8]{display:inline-flex}.sc-icon-select__wrapper[data-v-608ca6b8]{cursor:pointer;display:inline-flex}.sc-icon-select__wrapper[data-v-608ca6b8] .el-input__wrapper.is-focus{box-shadow:0 0 0 1px var(--el-input-hover-border-color) inset}.sc-icon-select__wrapper[data-v-608ca6b8] .el-input__inner{flex-grow:0;width:0}.sc-icon-select__wrapper[data-v-608ca6b8] .el-input__icon{margin:0;font-size:16px}.sc-icon-select__wrapper.hasValue[data-v-608ca6b8] .el-input__icon{color:var(--el-text-color-regular)}.sc-icon-select__list[data-v-608ca6b8]{height:270px;overflow:auto}.sc-icon-select__list li[data-v-608ca6b8]{display:inline-block;width:80px;height:80px;margin:5px;vertical-align:top;transition:all .1s;border-radius:4px;position:relative}.sc-icon-select__list li span[data-v-608ca6b8]{position:absolute;top:0;left:0;right:0;bottom:0;z-index:1;cursor:pointer}.sc-icon-select__list li i[data-v-608ca6b8]{display:inline-block;width:100%;height:100%;font-size:26px;color:#6d7882;display:flex;justify-content:center;align-items:center;border-radius:4px}.sc-icon-select__list li[data-v-608ca6b8]:hover{box-shadow:0 0 1px 4px var(--el-color-primary);background:var(--el-color-primary-light-9)}.sc-icon-select__list li:hover i[data-v-608ca6b8]{color:var(--el-color-primary)}h2[data-v-03dbe8e0]{font-size:17px;color:#3c4a54;padding:0 0 30px 0}.apilist[data-v-03dbe8e0]{border-left:1px solid #eee}[data-theme=dark] h2[data-v-03dbe8e0]{color:#fff}[data-theme=dark] .apilist[data-v-03dbe8e0]{border-color:#434343}
|
||||
|
|
@ -0,0 +1 @@
|
|||
.sc-icon-select[data-v-608ca6b8]{display:inline-flex}.sc-icon-select__wrapper[data-v-608ca6b8]{cursor:pointer;display:inline-flex}.sc-icon-select__wrapper[data-v-608ca6b8] .el-input__wrapper.is-focus{box-shadow:0 0 0 1px var(--el-input-hover-border-color) inset}.sc-icon-select__wrapper[data-v-608ca6b8] .el-input__inner{flex-grow:0;width:0}.sc-icon-select__wrapper[data-v-608ca6b8] .el-input__icon{margin:0;font-size:16px}.sc-icon-select__wrapper.hasValue[data-v-608ca6b8] .el-input__icon{color:var(--el-text-color-regular)}.sc-icon-select__list[data-v-608ca6b8]{height:270px;overflow:auto}.sc-icon-select__list li[data-v-608ca6b8]{display:inline-block;width:80px;height:80px;margin:5px;vertical-align:top;transition:all .1s;border-radius:4px;position:relative}.sc-icon-select__list li span[data-v-608ca6b8]{position:absolute;top:0;left:0;right:0;bottom:0;z-index:1;cursor:pointer}.sc-icon-select__list li i[data-v-608ca6b8]{display:inline-block;width:100%;height:100%;font-size:26px;color:#6d7882;display:flex;justify-content:center;align-items:center;border-radius:4px}.sc-icon-select__list li[data-v-608ca6b8]:hover{box-shadow:0 0 1px 4px var(--el-color-primary);background:var(--el-color-primary-light-9)}.sc-icon-select__list li:hover i[data-v-608ca6b8]{color:var(--el-color-primary)}h2[data-v-03dbe8e0]{font-size:17px;color:#3c4a54;padding:0 0 30px 0}.apilist[data-v-03dbe8e0]{border-left:1px solid #eee}[data-theme=dark] h2[data-v-03dbe8e0]{color:#fff}[data-theme=dark] .apilist[data-v-03dbe8e0]{border-color:#434343}.menu[data-v-667a91d5] .el-tree-node__label{display:flex;flex:1;height:100%}.custom-tree-node[data-v-667a91d5]{flex:1;justify-content:space-between;font-size:14px;padding-right:24px}.custom-tree-node .label[data-v-667a91d5],.custom-tree-node[data-v-667a91d5]{display:flex;align-items:center;height:100%}.custom-tree-node .label .el-tag[data-v-667a91d5]{margin-left:5px}.custom-tree-node .do[data-v-667a91d5]{display:none}.custom-tree-node .do i[data-v-667a91d5]{margin-left:5px;color:#999}.custom-tree-node .do i[data-v-667a91d5]:hover{color:#333}.custom-tree-node:hover .do[data-v-667a91d5]{display:inline-block}
|
||||
|
|
@ -0,0 +1 @@
|
|||
.treeMain[data-v-7e19fe49]{height:280px;overflow:auto;border:1px solid #dcdfe6;margin-bottom:10px}
|
||||
|
|
@ -0,0 +1 @@
|
|||
.treeMain[data-v-7e19fe49]{height:280px;overflow:auto;border:1px solid #dcdfe6;margin-bottom:10px}
|
||||
|
|
@ -0,0 +1 @@
|
|||
.sc-cron[data-v-374fb9c7] .el-tabs__item{height:auto;line-height:1;padding:0 7px;vertical-align:bottom}.sc-cron-num[data-v-374fb9c7]{text-align:center;margin-bottom:15px;width:100%}.sc-cron-num h2[data-v-374fb9c7]{font-size:12px;margin-bottom:15px;font-weight:400}.sc-cron-num h4[data-v-374fb9c7]{display:block;height:32px;line-height:30px;width:100%;font-size:12px;padding:0 15px;background:var(--el-color-primary-light-9);border-radius:4px}.sc-cron[data-v-374fb9c7] .el-tabs__item.is-active .sc-cron-num h4{background:var(--el-color-primary);color:#fff}[data-theme=dark] .sc-cron-num h4[data-v-374fb9c7]{background:var(--el-color-white)}
|
||||
|
|
@ -0,0 +1 @@
|
|||
.sc-cron[data-v-374fb9c7] .el-tabs__item{height:auto;line-height:1;padding:0 7px;vertical-align:bottom}.sc-cron-num[data-v-374fb9c7]{text-align:center;margin-bottom:15px;width:100%}.sc-cron-num h2[data-v-374fb9c7]{font-size:12px;margin-bottom:15px;font-weight:400}.sc-cron-num h4[data-v-374fb9c7]{display:block;height:32px;line-height:30px;width:100%;font-size:12px;padding:0 15px;background:var(--el-color-primary-light-9);border-radius:4px}.sc-cron[data-v-374fb9c7] .el-tabs__item.is-active .sc-cron-num h4{background:var(--el-color-primary);color:#fff}[data-theme=dark] .sc-cron-num h4[data-v-374fb9c7]{background:var(--el-color-white)}.task[data-v-dbf89736]{height:210px}.task-item h2[data-v-dbf89736]{font-size:15px;color:#3c4a54;padding-bottom:15px}.task-item li[data-v-dbf89736]{list-style-type:none;margin-bottom:10px}.task-item li h4[data-v-dbf89736]{font-size:12px;font-weight:400;color:#999}.task-item li p[data-v-dbf89736]{margin-top:5px}.task-item .bottom[data-v-dbf89736]{border-top:1px solid #ebeef5;text-align:right;padding-top:10px;display:flex;justify-content:space-between;align-items:center}.task-add[data-v-dbf89736]{display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;cursor:pointer;color:#999}.task-add[data-v-dbf89736]:hover{color:#409eff}.task-add i[data-v-dbf89736]{font-size:30px}.task-add p[data-v-dbf89736]{font-size:12px;margin-top:20px}.dark .task-item .bottom[data-v-dbf89736]{border-color:var(--el-border-color-light)}
|
||||
|
|
@ -0,0 +1 @@
|
|||
.sc-select-filter[data-v-63483ae9]{width:100%}.sc-select-filter__item[data-v-63483ae9]{display:flex}.sc-select-filter__item-title[data-v-63483ae9]{width:80px}.sc-select-filter__item-title label[data-v-63483ae9]{font-size:14px;padding-top:13px;display:inline-block;color:#999}.sc-select-filter__item-options[data-v-63483ae9]{flex:1;border-bottom:1px dashed var(--el-border-color-light)}.sc-select-filter__item-options ul[data-v-63483ae9]{display:flex;flex-wrap:wrap;padding-top:10px}.sc-select-filter__item-options li[data-v-63483ae9]{list-style:none;cursor:pointer;height:28px;padding:0 15px;border-radius:32px;margin:0 10px 10px 0;display:flex;align-items:center;background:var(--el-color-primary-light-9)}.sc-select-filter__item-options li .el-icon[data-v-63483ae9]{margin-right:3px;font-size:16px}.sc-select-filter__item-options li[data-v-63483ae9]:hover{color:var(--el-color-primary)}.sc-select-filter__item-options li.active[data-v-63483ae9]{background:var(--el-color-primary);color:#fff;font-weight:700}.sc-select-filter__item:last-of-type .sc-select-filter__item-options[data-v-63483ae9]{border:0}.sc-select-filter__no-data[data-v-63483ae9]{color:#999}
|
||||
|
|
@ -0,0 +1 @@
|
|||
.page-msg[data-v-877c30c0]{margin:15px 0}.page-buttons[data-v-877c30c0]{margin-bottom:20px}
|
||||
|
|
@ -0,0 +1 @@
|
|||
.el-steps[data-v-a03823a8] .is-finish .el-step__line{background:var(--el-color-primary)}
|
||||
|
|
@ -0,0 +1 @@
|
|||
.code[data-v-63e3bc4e]{height:400px;overflow:auto;background:#333;color:#999;padding:20px;font-size:14px;font-family:consolas;line-height:1.5}
|
||||
|
|
@ -0,0 +1 @@
|
|||
.el-card[data-v-63fd3909]{margin-bottom:15px}.code-item[data-v-63fd3909]{cursor:pointer}.code-item .img[data-v-63fd3909]{width:100%;height:150px;background:#09f;display:flex;align-items:center;justify-content:center}.code-item .img i[data-v-63fd3909]{font-size:100px;color:#fff;background-image:-webkit-linear-gradient(top left,#fff,#09f 100px);-webkit-background-clip:text;-webkit-text-fill-color:transparent}.code-item .title[data-v-63fd3909]{padding:15px}.code-item .title h2[data-v-63fd3909]{font-size:16px}.code-item .title h4[data-v-63fd3909]{font-size:12px;color:#999;font-weight:400;margin-top:5px}.code-item .title p[data-v-63fd3909]{margin-top:15px}
|
||||
|
|
@ -0,0 +1 @@
|
|||
.sc-password-strength[data-v-c391cecc]{height:5px;width:100%;background:var(--el-color-info-light-5);border-radius:5px;position:relative;margin:10px 0}.sc-password-strength[data-v-c391cecc]:before{left:20%}.sc-password-strength[data-v-c391cecc]:after{right:20%}.sc-password-strength[data-v-c391cecc]:after,.sc-password-strength[data-v-c391cecc]:before{position:absolute;content:"";display:block;width:20%;height:inherit;border:5px solid var(--el-bg-color-overlay);border-top:0;border-bottom:0;z-index:1;background-color:transparent;box-sizing:border-box}.sc-password-strength-bar[data-v-c391cecc]{position:absolute;height:inherit;width:0;border-radius:inherit;transition:width .5s ease-in-out,background .25s;background:transparent}.sc-password-strength-level-1[data-v-c391cecc]{width:20%;background-color:var(--el-color-error)}.sc-password-strength-level-2[data-v-c391cecc]{width:40%;background-color:var(--el-color-error)}.sc-password-strength-level-3[data-v-c391cecc]{width:60%;background-color:var(--el-color-warning)}.sc-password-strength-level-4[data-v-c391cecc]{width:80%;background-color:var(--el-color-success)}.sc-password-strength-level-5[data-v-c391cecc]{width:100%;background-color:var(--el-color-success)}
|
||||
|
|
@ -0,0 +1 @@
|
|||
.sc-statistic-title[data-v-fb7562ba]{font-size:12px;color:#999;margin-bottom:10px;display:flex;align-items:center}.sc-statistic-tips[data-v-fb7562ba]{margin-left:5px}.sc-statistic-content[data-v-fb7562ba]{font-size:20px;color:#333}.sc-statistic-content-value[data-v-fb7562ba]{font-weight:700}.sc-statistic-content-prefix[data-v-fb7562ba]{margin-right:5px}.sc-statistic-content-suffix[data-v-fb7562ba]{margin-left:5px;font-size:12px}.sc-statistic-description[data-v-fb7562ba]{margin-top:10px;color:#999}.dark .sc-statistic-content[data-v-fb7562ba]{color:#d0d0d0}
|
||||
|
|
@ -0,0 +1 @@
|
|||
.sc-password-strength[data-v-c391cecc]{height:5px;width:100%;background:var(--el-color-info-light-5);border-radius:5px;position:relative;margin:10px 0}.sc-password-strength[data-v-c391cecc]:before{left:20%}.sc-password-strength[data-v-c391cecc]:after{right:20%}.sc-password-strength[data-v-c391cecc]:after,.sc-password-strength[data-v-c391cecc]:before{position:absolute;content:"";display:block;width:20%;height:inherit;border:5px solid var(--el-bg-color-overlay);border-top:0;border-bottom:0;z-index:1;background-color:transparent;box-sizing:border-box}.sc-password-strength-bar[data-v-c391cecc]{position:absolute;height:inherit;width:0;border-radius:inherit;transition:width .5s ease-in-out,background .25s;background:transparent}.sc-password-strength-level-1[data-v-c391cecc]{width:20%;background-color:var(--el-color-error)}.sc-password-strength-level-2[data-v-c391cecc]{width:40%;background-color:var(--el-color-error)}.sc-password-strength-level-3[data-v-c391cecc]{width:60%;background-color:var(--el-color-warning)}.sc-password-strength-level-4[data-v-c391cecc]{width:80%;background-color:var(--el-color-success)}.sc-password-strength-level-5[data-v-c391cecc]{width:100%;background-color:var(--el-color-success)}
|
||||
|
|
@ -0,0 +1 @@
|
|||
.sc-contextmenu{position:fixed;z-index:3000;font-size:12px}.sc-contextmenu__menu{display:inline-block;min-width:120px;border:1px solid #e4e7ed;background:#fff;box-shadow:0 2px 12px 0 rgba(0,0,0,.1);z-index:3000;list-style-type:none;padding:10px 0}.sc-contextmenu__menu>hr{margin:5px 0;border:none;height:1px;font-size:0;background-color:#ebeef5}.sc-contextmenu__menu>li{margin:0;cursor:pointer;line-height:30px;padding:0 17px 0 10px;color:#606266;display:flex;justify-content:space-between;white-space:nowrap;text-decoration:none;position:relative}.sc-contextmenu__menu>li:hover{background-color:#ecf5ff;color:#66b1ff}.sc-contextmenu__menu>li.disabled{cursor:not-allowed;color:#bbb;background:transparent}.sc-contextmenu__icon{display:inline-block;width:14px;font-size:14px;margin-right:10px}.sc-contextmenu__suffix{margin-left:40px;color:#999}.sc-contextmenu__menu li ul{position:absolute;top:0;left:100%;display:none;margin:-11px 0}
|
||||
|
|
@ -0,0 +1 @@
|
|||
.sc-cron[data-v-374fb9c7] .el-tabs__item{height:auto;line-height:1;padding:0 7px;vertical-align:bottom}.sc-cron-num[data-v-374fb9c7]{text-align:center;margin-bottom:15px;width:100%}.sc-cron-num h2[data-v-374fb9c7]{font-size:12px;margin-bottom:15px;font-weight:400}.sc-cron-num h4[data-v-374fb9c7]{display:block;height:32px;line-height:30px;width:100%;font-size:12px;padding:0 15px;background:var(--el-color-primary-light-9);border-radius:4px}.sc-cron[data-v-374fb9c7] .el-tabs__item.is-active .sc-cron-num h4{background:var(--el-color-primary);color:#fff}[data-theme=dark] .sc-cron-num h4[data-v-374fb9c7]{background:var(--el-color-white)}
|
||||
|
|
@ -0,0 +1 @@
|
|||
.sc-cropper[data-v-5a089473]{height:300px}.sc-cropper__img[data-v-5a089473]{height:100%;width:400px;float:left;background:#ebeef5}.sc-cropper__img img[data-v-5a089473]{display:none}.sc-cropper__preview[data-v-5a089473]{width:120px;margin-left:20px;float:left}.sc-cropper__preview h4[data-v-5a089473]{font-weight:400;font-size:12px;color:#999;margin-bottom:20px}.sc-cropper__preview__img[data-v-5a089473]{overflow:hidden;width:120px;height:120px;border:1px solid #ebeef5}
|
||||
|
|
@ -0,0 +1 @@
|
|||
.dragList[data-v-a544debc]{overflow:auto}.item[data-v-a544debc]{cursor:move;float:left;background:#fff;width:100px;height:100px;line-height:100px;text-align:center;margin:0 15px 15px 0;border:1px solid #e6e6e6}.dragList .sortable-ghost[data-v-a544debc]{opacity:.5}
|
||||
|
|
@ -0,0 +1 @@
|
|||
.sc-file-select[data-v-48ded1ad]{display:flex}.sc-file-select__files[data-v-48ded1ad]{flex:1}.sc-file-select__list[data-v-48ded1ad]{height:400px}.sc-file-select__item[data-v-48ded1ad]{display:inline-block;float:left;margin:0 15px 25px 0;width:110px;cursor:pointer}.sc-file-select__item__file[data-v-48ded1ad]{width:110px;height:110px;position:relative}.sc-file-select__item__file .el-image[data-v-48ded1ad]{width:110px;height:110px}.sc-file-select__item__box[data-v-48ded1ad]{position:absolute;top:0;right:0;bottom:0;left:0;border:2px solid var(--el-color-success);z-index:1;display:none}.sc-file-select__item__box[data-v-48ded1ad]:before{content:"";position:absolute;top:0;right:0;bottom:0;left:0;background:var(--el-color-success);opacity:.2;display:none}.sc-file-select__item.active .sc-file-select__item__box[data-v-48ded1ad],.sc-file-select__item.active .sc-file-select__item__box[data-v-48ded1ad]:before,.sc-file-select__item:hover .sc-file-select__item__box[data-v-48ded1ad]{display:block}.sc-file-select__item p[data-v-48ded1ad]{margin-top:10px;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;-webkit-text-overflow:ellipsis;text-align:center}.sc-file-select__item__checkbox[data-v-48ded1ad]{position:absolute;width:20px;height:20px;top:7px;right:7px;z-index:2;background:rgba(0,0,0,.2);border:1px solid #fff;display:flex;flex-direction:column;align-items:center;justify-content:center}.sc-file-select__item__checkbox i[data-v-48ded1ad]{font-size:14px;color:#fff;font-weight:700;display:none}.sc-file-select__item__select[data-v-48ded1ad]{position:absolute;width:20px;height:20px;top:0;right:0;z-index:2;background:var(--el-color-success);display:none;flex-direction:column;align-items:center;justify-content:center}.sc-file-select__item__select i[data-v-48ded1ad]{font-size:14px;color:#fff;font-weight:700}.sc-file-select__item.active .sc-file-select__item__checkbox[data-v-48ded1ad]{background:var(--el-color-success)}.sc-file-select__item.active .sc-file-select__item__checkbox i[data-v-48ded1ad]{display:block}.sc-file-select__item.active .sc-file-select__item__select[data-v-48ded1ad]{display:flex}.sc-file-select__item__file .item-file[data-v-48ded1ad]{width:110px;height:110px;display:flex;flex-direction:column;align-items:center;justify-content:center}.sc-file-select__item__file .item-file i[data-v-48ded1ad]{font-size:40px}.sc-file-select__item__file .item-file.item-file-doc[data-v-48ded1ad]{color:#409eff}.sc-file-select__item__upload[data-v-48ded1ad]{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;background:hsla(0,0%,100%,.7);display:flex;flex-direction:column;align-items:center;justify-content:center}.sc-file-select__side[data-v-48ded1ad]{width:200px;margin-right:15px;border-right:1px solid hsla(0,0%,50%,.2);display:flex;flex-flow:column}.sc-file-select__side-menu[data-v-48ded1ad]{flex:1}.sc-file-select__side-msg[data-v-48ded1ad]{height:32px;line-height:32px}.sc-file-select__top[data-v-48ded1ad]{margin-bottom:15px;display:flex;justify-content:space-between}.sc-file-select__upload[data-v-48ded1ad]{display:inline-block}.sc-file-select__top .tips[data-v-48ded1ad]{font-size:12px;margin-left:10px;color:#999}.sc-file-select__top .tips i[data-v-48ded1ad]{font-size:14px;margin-right:5px;position:relative;bottom:-.125em}.sc-file-select__pagination[data-v-48ded1ad]{margin:15px 0}.sc-file-select__do[data-v-48ded1ad]{text-align:right}
|
||||
|
|
@ -0,0 +1 @@
|
|||
.box[data-v-d147796a]{border-top:1px solid #eee;border-left:1px solid #eee}.icon-box[data-v-d147796a]{height:120px;text-align:center;background:#fff;border-bottom:1px solid #eee;border-right:1px solid #eee;color:#666;padding:30px 10px}.icon-box i[data-v-d147796a]{font-size:26px;transition:color .15s linear}.icon-box p[data-v-d147796a]{color:#999;margin-top:15px;transition:color .15s linear}.icon-box:hover i[data-v-d147796a],.icon-box:hover p[data-v-d147796a]{color:#5cb6ff}.dark .box[data-v-d147796a],.dark .icon-box[data-v-d147796a]{border-color:var(--el-border-color-light)}.dark .icon-box[data-v-d147796a]{background:var(--el-bg-color-overlay)}
|
||||
|
|
@ -0,0 +1 @@
|
|||
.sc-icon-select[data-v-608ca6b8]{display:inline-flex}.sc-icon-select__wrapper[data-v-608ca6b8]{cursor:pointer;display:inline-flex}.sc-icon-select__wrapper[data-v-608ca6b8] .el-input__wrapper.is-focus{box-shadow:0 0 0 1px var(--el-input-hover-border-color) inset}.sc-icon-select__wrapper[data-v-608ca6b8] .el-input__inner{flex-grow:0;width:0}.sc-icon-select__wrapper[data-v-608ca6b8] .el-input__icon{margin:0;font-size:16px}.sc-icon-select__wrapper.hasValue[data-v-608ca6b8] .el-input__icon{color:var(--el-text-color-regular)}.sc-icon-select__list[data-v-608ca6b8]{height:270px;overflow:auto}.sc-icon-select__list li[data-v-608ca6b8]{display:inline-block;width:80px;height:80px;margin:5px;vertical-align:top;transition:all .1s;border-radius:4px;position:relative}.sc-icon-select__list li span[data-v-608ca6b8]{position:absolute;top:0;left:0;right:0;bottom:0;z-index:1;cursor:pointer}.sc-icon-select__list li i[data-v-608ca6b8]{display:inline-block;width:100%;height:100%;font-size:26px;color:#6d7882;display:flex;justify-content:center;align-items:center;border-radius:4px}.sc-icon-select__list li[data-v-608ca6b8]:hover{box-shadow:0 0 1px 4px var(--el-color-primary);background:var(--el-color-primary-light-9)}.sc-icon-select__list li:hover i[data-v-608ca6b8]{color:var(--el-color-primary)}
|
||||
|
|
@ -0,0 +1 @@
|
|||
.up[data-v-7a08b8f7]{text-align:center}.up h2[data-v-7a08b8f7]{margin-bottom:10px}.up p[data-v-7a08b8f7]{color:#999;line-height:1.5}.el-card[data-v-7a08b8f7]{height:150px}
|
||||
|
|
@ -0,0 +1 @@
|
|||
.printMain .item[data-v-03a2c1a0]{padding:20px;border:1px solid #409eff;margin-bottom:20px;background:#ecf5ff;border-radius:4px}.printMain p[data-v-03a2c1a0]{margin-top:20px;color:#999}
|
||||
|
|
@ -0,0 +1 @@
|
|||
.sc-select-filter[data-v-63483ae9]{width:100%}.sc-select-filter__item[data-v-63483ae9]{display:flex}.sc-select-filter__item-title[data-v-63483ae9]{width:80px}.sc-select-filter__item-title label[data-v-63483ae9]{font-size:14px;padding-top:13px;display:inline-block;color:#999}.sc-select-filter__item-options[data-v-63483ae9]{flex:1;border-bottom:1px dashed var(--el-border-color-light)}.sc-select-filter__item-options ul[data-v-63483ae9]{display:flex;flex-wrap:wrap;padding-top:10px}.sc-select-filter__item-options li[data-v-63483ae9]{list-style:none;cursor:pointer;height:28px;padding:0 15px;border-radius:32px;margin:0 10px 10px 0;display:flex;align-items:center;background:var(--el-color-primary-light-9)}.sc-select-filter__item-options li .el-icon[data-v-63483ae9]{margin-right:3px;font-size:16px}.sc-select-filter__item-options li[data-v-63483ae9]:hover{color:var(--el-color-primary)}.sc-select-filter__item-options li.active[data-v-63483ae9]{background:var(--el-color-primary);color:#fff;font-weight:700}.sc-select-filter__item:last-of-type .sc-select-filter__item-options[data-v-63483ae9]{border:0}.sc-select-filter__no-data[data-v-63483ae9]{color:#999}
|
||||
|
|
@ -0,0 +1 @@
|
|||
.sc-statistic-title[data-v-fb7562ba]{font-size:12px;color:#999;margin-bottom:10px;display:flex;align-items:center}.sc-statistic-tips[data-v-fb7562ba]{margin-left:5px}.sc-statistic-content[data-v-fb7562ba]{font-size:20px;color:#333}.sc-statistic-content-value[data-v-fb7562ba]{font-weight:700}.sc-statistic-content-prefix[data-v-fb7562ba]{margin-right:5px}.sc-statistic-content-suffix[data-v-fb7562ba]{margin-left:5px;font-size:12px}.sc-statistic-description[data-v-fb7562ba]{margin-top:10px;color:#999}.dark .sc-statistic-content[data-v-fb7562ba]{color:#d0d0d0}.el-card[data-v-26b7129d]{margin-bottom:15px}.up[data-v-26b7129d]{color:#f56c6c;margin-left:5px}.down[data-v-26b7129d]{color:#67c23a;margin-left:5px}
|
||||
|
|
@ -0,0 +1 @@
|
|||
.el-card+.el-card[data-v-0beaf675]{margin-top:15px}.imglist .el-col+.el-col[data-v-0beaf675]{margin-left:8px}.custom-empty[data-v-0beaf675]{width:100%;height:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;background:#8c939d;border-radius:5px}.custom-empty i[data-v-0beaf675]{font-size:30px;color:#fff}.custom-empty p[data-v-0beaf675]{font-size:12px;font-weight:400;color:#fff;margin-top:10px}
|
||||
|
|
@ -0,0 +1 @@
|
|||
.sc-video[data-v-f6306a2e] .danmu>*{color:#fff;font-size:20px;font-weight:700;text-shadow:1px 1px 0 #000,-1px -1px 0 #000,-1px 1px 0 #000,1px -1px 0 #000}.sc-video[data-v-f6306a2e] .xgplayer-controls{background-image:linear-gradient(180deg,transparent,rgba(0,0,0,.3))}.sc-video[data-v-f6306a2e] .xgplayer-progress-tip{border:0;color:#fff;background:rgba(0,0,0,.5);line-height:25px;padding:0 10px;border-radius:25px}.sc-video[data-v-f6306a2e] .xgplayer-enter-spinner{width:50px;height:50px}
|
||||
|
After Width: | Height: | Size: 1.1 KiB |
|
After Width: | Height: | Size: 97 KiB |
|
After Width: | Height: | Size: 286 KiB |
|
After Width: | Height: | Size: 22 KiB |
|
After Width: | Height: | Size: 132 KiB |
|
After Width: | Height: | Size: 133 KiB |
|
After Width: | Height: | Size: 31 KiB |
|
After Width: | Height: | Size: 8.2 KiB |
|
After Width: | Height: | Size: 7.6 KiB |
|
|
@ -0,0 +1,57 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 23.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="图层_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 750 750" style="enable-background:new 0 0 750 750;" xml:space="preserve">
|
||||
<style type="text/css">
|
||||
.st0{opacity:0.35;fill:#B3B3B3;}
|
||||
.st1{opacity:0.1;fill:#B3B3B3;}
|
||||
.st2{opacity:0.3;fill:#B3B3B3;}
|
||||
.st3{opacity:0.1;}
|
||||
.st4{fill:#B3B3B3;}
|
||||
</style>
|
||||
<g>
|
||||
<path class="st0" d="M465.1,261.4H264c-1.3,0-2.4,1.1-2.4,2.4v255.6c0,1.3,1.1,2.4,2.4,2.4h201.1c1.3,0,2.4-1.1,2.4-2.4V263.8
|
||||
C467.5,262.4,466.4,261.4,465.1,261.4z M417.9,443c0,1.3-1.1,2.4-2.4,2.4h-102c-1.3,0-2.4-1.1-2.4-2.4v-11.3c0-1.3,1.1-2.4,2.4-2.4
|
||||
h102c1.3,0,2.4,1.1,2.4,2.4V443z M417.9,397.2c0,1.3-1.1,2.4-2.4,2.4h-102c-1.3,0-2.4-1.1-2.4-2.4v-11.3c0-1.3,1.1-2.4,2.4-2.4h102
|
||||
c1.3,0,2.4,1.1,2.4,2.4V397.2z M417.9,351.5c0,1.3-1.1,2.4-2.4,2.4h-102c-1.3,0-2.4-1.1-2.4-2.4v-11.3c0-1.3,1.1-2.4,2.4-2.4h102
|
||||
c1.3,0,2.4,1.1,2.4,2.4V351.5z"/>
|
||||
<g>
|
||||
<path class="st1" d="M462.1,236.8L462.1,236.8C384.8,236.2,321,295.1,314,370.7c-18.5-19.1-44.4-31.1-73.1-31.3h0
|
||||
c-56.8-0.4-103.2,45.3-103.6,102.1l-0.8,101.4l175.6,1.3l30.1,0.2l265.1,2l1.2-160.9C609.2,304,543.6,237.4,462.1,236.8z"/>
|
||||
<path class="st2" d="M216.9,227.4c-3.4,0-6.5,1.1-9,2.9c0.2-1,0.3-2,0.3-3c0.1-8.3-6.6-15.1-15-15.2s-15.1,6.6-15.2,15
|
||||
c0,0.3,0,0.6,0,0.9c-1.6-0.6-3.4-1-5.2-1c-8.3-0.1-15.1,6.6-15.2,15c-0.1,8.2,6.4,14.9,14.5,15.2l0,0l44.6,0.3
|
||||
c8.3,0.1,15.1-6.6,15.2-15S225.2,227.5,216.9,227.4z"/>
|
||||
<path class="st2" d="M596.4,194.2c-3.4,0-6.5,1.1-9,2.9c0.2-1,0.3-2,0.3-3c0.1-8.3-6.6-15.1-15-15.2s-15.1,6.6-15.2,15
|
||||
c0,0.3,0,0.6,0,0.9c-1.6-0.6-3.4-1-5.2-1c-8.3-0.1-15.1,6.6-15.2,15c-0.1,8.2,6.4,14.9,14.5,15.2l0,0l44.6,0.3
|
||||
c8.3,0.1,15.1-6.6,15.2-15S604.7,194.3,596.4,194.2z"/>
|
||||
<g>
|
||||
<g class="st3">
|
||||
<path class="st4" d="M496.9,497.5c-2.1,0-3.7,1.6-3.7,3.7c0,1.5,0.8,2.7,2,3.3l-0.5,65.1l3.5,0l0.5-65.3
|
||||
c1.1-0.6,1.8-1.8,1.8-3.1C500.6,499.1,499,497.6,496.9,497.5z"/>
|
||||
<path class="st4" d="M572.3,501.7c0-1.9-1.6-3.6-3.7-3.7c-2.1,0-3.7,1.6-3.7,3.7c0,1.4,0.8,2.6,1.9,3.2l-0.5,65.2l3.5,0
|
||||
l0.5-65.2C571.5,504.3,572.2,503.1,572.3,501.7z"/>
|
||||
</g>
|
||||
|
||||
<rect x="522.7" y="472.2" transform="matrix(7.448311e-03 -1 1 7.448311e-03 8.6828 1045.4733)" class="st1" width="16.5" height="92.3"/>
|
||||
<polygon class="st1" points="495.4,509.8 495.2,510.1 485.5,526.3 484.8,526.3 484.9,509.8 "/>
|
||||
<polygon class="st1" points="518.7,510 508.8,526.5 496.3,526.4 500.2,519.8 506,509.9 "/>
|
||||
<polygon class="st1" points="542,510.2 532.1,526.6 519.6,526.5 529.3,510.1 "/>
|
||||
<polygon class="st1" points="565.3,510.4 555.5,526.8 542.9,526.7 552.7,510.3 "/>
|
||||
<polygon class="st1" points="577.2,510.4 577.1,527 566.2,526.9 576,510.4 "/>
|
||||
|
||||
<rect x="522.5" y="497.7" transform="matrix(7.448311e-03 -1 1 7.448311e-03 -17.0149 1070.603)" class="st1" width="16.5" height="92.3"/>
|
||||
<polygon class="st1" points="495.2,535.3 495,535.6 485.3,551.8 484.6,551.8 484.7,535.3 "/>
|
||||
<polygon class="st1" points="518.5,535.5 508.6,552 496.1,551.9 500,545.3 505.8,535.4 "/>
|
||||
<polygon class="st1" points="541.8,535.7 531.9,552.1 519.4,552 529.1,535.6 "/>
|
||||
<polygon class="st1" points="565.1,535.9 555.4,552.3 542.7,552.2 552.5,535.8 "/>
|
||||
<polygon class="st1" points="577,536 576.9,552.5 566,552.4 575.8,536 "/>
|
||||
<path class="st1" d="M577.1,527c0,0,0-0.1,0-0.3l0-0.9c0-0.7,0-1.8,0-3.2c0-2.8,0.1-6.9,0.1-12.2l0.1,0.1l-92.3-0.5l0,0l0.1-0.1
|
||||
c0,5.6-0.1,11.2-0.1,16.5l-0.1-0.1l65.8,0.6l19.5,0.1l5.3,0l0,0l-5.3,0l-19.5-0.1l-65.8-0.3l-0.3,0l0.1-16.8l0.1,0l92.3,0.8
|
||||
l0.1,0l0,0.1c0,5.3-0.1,9.4-0.1,12.2c0,1.5,0,2.5,0,3.2l0,0.7C577.1,526.8,577.1,527,577.1,527z"/>
|
||||
<path class="st1" d="M576.9,552.5c0,0,0-0.1,0-0.3l0-0.9c0-0.7,0-1.8,0-3.2c0-2.8,0.1-6.9,0.1-12.2l0.1,0.1l-92.3-0.5l0,0
|
||||
l0.1-0.1c0,5.6-0.1,11.2-0.1,16.5l-0.1-0.1l65.8,0.6l19.5,0.1l5.3,0l0,0l-5.3,0l-19.5-0.1l-65.8-0.3l-0.3,0l0.1-16.7l0.1,0
|
||||
l92.3,0.8l0.1,0l0,0.1c0,5.3-0.1,9.4-0.1,12.2c0,1.5,0,2.5,0,3.2l0,0.7C576.9,552.3,576.9,552.5,576.9,552.5z"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 4.1 KiB |
|
After Width: | Height: | Size: 17 KiB |
|
|
@ -0,0 +1,236 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 24.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="图层_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 456 262.1" style="enable-background:new 0 0 456 262.1;" xml:space="preserve">
|
||||
<style type="text/css">
|
||||
.st0{opacity:0.4;fill:url(#SVGID_1_);enable-background:new ;}
|
||||
.st1{opacity:0.7;}
|
||||
.st2{opacity:0.4;fill:url(#SVGID_2_);enable-background:new ;}
|
||||
.st3{opacity:0.4;fill:url(#SVGID_3_);enable-background:new ;}
|
||||
.st4{opacity:0.4;fill:url(#SVGID_4_);enable-background:new ;}
|
||||
.st5{opacity:0.4;fill:url(#SVGID_5_);enable-background:new ;}
|
||||
.st6{opacity:0.6;}
|
||||
.st7{fill:#0073CD;}
|
||||
.st8{fill:#40A8F5;}
|
||||
.st9{fill:#53B9F5;}
|
||||
.st10{fill:#85D3FF;}
|
||||
.st11{fill:#8CD7FF;}
|
||||
.st12{fill:#EBFCFF;}
|
||||
.st13{fill:none;stroke:url(#SVGID_6_);stroke-width:2;stroke-miterlimit:10;}
|
||||
.st14{fill:none;stroke:url(#SVGID_7_);stroke-width:2;stroke-miterlimit:10;}
|
||||
.st15{fill:none;stroke:url(#SVGID_8_);stroke-width:2;stroke-miterlimit:10;}
|
||||
.st16{fill:none;stroke:url(#SVGID_9_);stroke-width:2;stroke-miterlimit:10;}
|
||||
.st17{fill:none;stroke:url(#SVGID_10_);stroke-width:2;stroke-miterlimit:10;}
|
||||
.st18{fill:none;stroke:url(#SVGID_11_);stroke-width:2;stroke-miterlimit:10;}
|
||||
</style>
|
||||
<title>升级中</title>
|
||||
<g id="图层_2_1_">
|
||||
<g id="图层_1-2">
|
||||
|
||||
<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="232.745" y1="39.57" x2="232.745" y2="1.88" gradientTransform="matrix(1 0 0 -1 0 264)">
|
||||
<stop offset="0" style="stop-color:#81CFFF"/>
|
||||
<stop offset="1" style="stop-color:#5ECFFF;stop-opacity:0"/>
|
||||
</linearGradient>
|
||||
<path class="st0" d="M412.3,262.1c-23-23-61-37.7-179.5-37.7S76.2,239.1,53.2,262.1H412.3z"/>
|
||||
<g class="st1">
|
||||
|
||||
<linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="349.365" y1="237.3224" x2="349.365" y2="59.9676" gradientTransform="matrix(1 0 0 -1 0 264)">
|
||||
<stop offset="0" style="stop-color:#81CFFF"/>
|
||||
<stop offset="1" style="stop-color:#5ECFFF;stop-opacity:0"/>
|
||||
</linearGradient>
|
||||
<path class="st2" d="M380.7,26.7h-62.6c-1.5-0.1-2.8,1.1-2.8,2.6v172.2c0.1,1.5,1.3,2.7,2.8,2.6h62.6c1.5,0.1,2.7-1.1,2.8-2.6
|
||||
V29.3C383.4,27.8,382.2,26.6,380.7,26.7z M328.3,147c0,0.5-0.4,0.9-0.9,0.9c0,0,0,0,0,0h-3.6c-0.5,0-0.9-0.4-0.9-0.8c0,0,0,0,0,0
|
||||
v-19.7c0-0.5,0.4-0.9,0.9-0.9c0,0,0,0,0,0h3.6c0.5,0,0.9,0.4,0.9,0.9c0,0,0,0,0,0V147z M328.3,116.8c0,0.5-0.4,0.9-0.9,0.9
|
||||
c0,0,0,0,0,0h-3.6c-0.5,0-0.9-0.4-0.9-0.9c0,0,0,0,0,0V97c0-0.5,0.4-0.9,0.9-0.9c0,0,0,0,0,0h3.6c0.5,0,0.9,0.4,0.9,0.9
|
||||
c0,0,0,0,0,0V116.8z M328.3,86.5c0,0.5-0.4,0.9-0.9,0.9c0,0,0,0,0,0h-3.6c-0.5,0-0.9-0.4-0.9-0.9c0,0,0,0,0,0V66.8
|
||||
c0-0.5,0.4-0.9,0.9-0.9c0,0,0,0,0,0h3.6c0.5,0,0.9,0.4,0.9,0.9c0,0,0,0,0,0V86.5z M328.3,56.3c0,0.5-0.4,0.9-0.9,0.9c0,0,0,0,0,0
|
||||
h-3.6c-0.5,0-0.9-0.4-0.9-0.9c0,0,0,0,0,0V36.6c0-0.5,0.4-0.9,0.9-0.9c0,0,0,0,0,0h3.6c0.5,0,0.9,0.4,0.9,0.9c0,0,0,0,0,0V56.3z
|
||||
M340,147c0,0.5-0.4,0.9-0.9,0.9c0,0,0,0,0,0h-3.6c-0.5,0-0.9-0.4-0.9-0.9c0,0,0,0,0,0v-19.7c0-0.5,0.4-0.9,1-0.9h3.6
|
||||
c0.5,0,0.9,0.4,0.9,0.9V147z M340,116.8c0,0.5-0.4,0.9-0.9,0.9h-3.6c-0.5,0-0.9-0.4-1-0.9V97c0-0.5,0.4-0.9,1-0.9h3.6
|
||||
c0.5,0,0.9,0.4,0.9,0.9V116.8z M340,86.5c0,0.5-0.4,0.9-0.9,0.9h-3.6c-0.5,0-0.9-0.4-1-0.9V66.8c0-0.5,0.4-0.9,1-0.9h3.6
|
||||
c0.5,0,0.9,0.4,0.9,0.9V86.5z M340,56.3c0,0.5-0.4,0.9-0.9,0.9h-3.6c-0.5,0-0.9-0.4-1-0.9V36.6c0-0.5,0.4-0.9,1-0.9h3.6
|
||||
c0.5,0,0.9,0.4,0.9,0.9V56.3z M351.7,147c0,0.5-0.4,0.9-0.9,0.9c0,0,0,0,0,0h-3.6c-0.5,0-0.9-0.4-0.9-0.9c0,0,0,0,0,0v-19.7
|
||||
c0-0.5,0.4-0.9,0.9-0.9h3.6c0.5,0,0.9,0.4,0.9,0.9V147z M351.7,116.8c0,0.5-0.4,0.9-0.9,0.9h-3.6c-0.5,0-0.9-0.4-0.9-0.9V97
|
||||
c0-0.5,0.4-0.9,0.9-0.9h3.6c0.5,0,0.9,0.4,0.9,0.9V116.8z M351.7,86.5c0,0.5-0.4,0.9-0.9,0.9h-3.6c-0.5,0-0.9-0.4-0.9-0.9V66.8
|
||||
c0-0.5,0.4-0.9,0.9-0.9h3.6c0.5,0,0.9,0.4,0.9,0.9V86.5z M351.7,56.3c0,0.5-0.4,0.9-0.9,0.9h-3.6c-0.5,0-0.9-0.4-0.9-0.9V36.6
|
||||
c0-0.5,0.4-0.9,0.9-0.9h3.6c0.5,0,0.9,0.4,0.9,0.9V56.3z M363.4,147c0,0.5-0.4,0.9-0.9,0.9c0,0,0,0,0,0h-3.6
|
||||
c-0.5,0-0.9-0.4-0.9-0.9c0,0,0,0,0,0v-19.7c0-0.5,0.4-0.9,0.9-0.9h3.6c0.5,0,0.9,0.4,0.9,0.9V147z M363.4,116.8
|
||||
c0,0.5-0.4,0.9-0.9,0.9h-3.6c-0.5,0-0.9-0.4-0.9-0.9V97c0-0.5,0.4-0.9,0.9-0.9h3.6c0.5,0,0.9,0.4,0.9,0.9V116.8z M363.4,86.5
|
||||
c0,0.5-0.4,0.9-0.9,0.9h-3.6c-0.5,0-0.9-0.4-0.9-0.9V66.8c0-0.5,0.4-0.9,0.9-0.9h3.6c0.5,0,0.9,0.4,0.9,0.9V86.5z M363.4,56.3
|
||||
c0,0.5-0.4,0.9-0.9,0.9h-3.6c-0.5,0-0.9-0.4-0.9-0.9V36.6c0-0.5,0.4-0.9,0.9-0.9h3.6c0.5,0,0.9,0.4,0.9,0.9V56.3z M375.1,147
|
||||
c0,0.5-0.4,0.9-0.9,0.9c0,0,0,0,0,0h-3.6c-0.5,0-0.9-0.4-0.9-0.9c0,0,0,0,0,0v-19.7c0-0.5,0.4-0.9,0.9-0.9h3.6
|
||||
c0.5,0,0.9,0.4,1,0.9V147z M375.1,116.8c0,0.5-0.4,0.9-1,0.9h-3.6c-0.5,0-0.9-0.4-0.9-0.9V97c0-0.5,0.4-0.9,0.9-0.9h3.6
|
||||
c0.5,0,0.9,0.4,1,0.9V116.8z M375.1,86.5c0,0.5-0.4,0.9-1,0.9h-3.6c-0.5,0-0.9-0.4-0.9-0.9V66.8c0-0.5,0.4-0.9,0.9-0.9h3.6
|
||||
c0.5,0,0.9,0.4,1,0.9V86.5z M375.1,56.3c0,0.5-0.4,0.9-1,0.9h-3.6c-0.5,0-0.9-0.4-0.9-0.9V36.6c0-0.5,0.4-0.9,0.9-0.9h3.6
|
||||
c0.5,0,0.9,0.4,1,0.9V56.3z"/>
|
||||
|
||||
<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="201.46" y1="208.3924" x2="201.46" y2="59.9976" gradientTransform="matrix(1 0 0 -1 0 264)">
|
||||
<stop offset="0" style="stop-color:#81CFFF"/>
|
||||
<stop offset="1" style="stop-color:#5ECFFF;stop-opacity:0"/>
|
||||
</linearGradient>
|
||||
<path class="st3" d="M231.1,55.6h-59.3c-1.5-0.1-2.7,1.1-2.8,2.6v143.2c0.1,1.5,1.3,2.6,2.8,2.6h59.3c1.5,0.1,2.8-1.1,2.8-2.6
|
||||
V58.2C233.9,56.7,232.6,55.5,231.1,55.6z M182.5,159.4c0,0.6-0.6,1.1-1.2,1.1h-5.4c-0.6,0-1.2-0.5-1.2-1.1v-5.2
|
||||
c0-0.6,0.6-1.1,1.2-1.1c0,0,0,0,0,0h5.4c0.6,0,1.2,0.5,1.2,1.1c0,0,0,0,0,0V159.4z M182.5,146.5c0,0.6-0.6,1.1-1.2,1.1
|
||||
c0,0,0,0,0,0h-5.4c-0.6,0-1.2-0.5-1.2-1.1c0,0,0,0,0,0v-5.2c0-0.6,0.6-1.1,1.2-1.1h5.4c0.6,0,1.2,0.5,1.2,1.1V146.5z
|
||||
M182.5,133.6c0,0.6-0.6,1.1-1.2,1.1h-5.4c-0.6,0-1.2-0.5-1.2-1.1v-5.2c0-0.6,0.6-1.1,1.2-1.1c0,0,0,0,0,0h5.4
|
||||
c0.6,0,1.2,0.5,1.2,1.1c0,0,0,0,0,0V133.6z M182.5,120.7c0,0.6-0.6,1.1-1.2,1.1c0,0,0,0,0,0h-5.4c-0.6,0-1.2-0.5-1.2-1.1
|
||||
c0,0,0,0,0,0v-5.2c0-0.6,0.6-1.1,1.2-1.1h5.4c0.6,0,1.2,0.5,1.2,1.1V120.7z M182.5,107.8c0,0.6-0.6,1.1-1.2,1.1h-5.4
|
||||
c-0.6,0-1.2-0.5-1.2-1.1v-5.2c0-0.6,0.6-1.1,1.2-1.1c0,0,0,0,0,0h5.4c0.6,0,1.2,0.5,1.2,1.1c0,0,0,0,0,0V107.8z M182.5,94.9
|
||||
c0,0.6-0.6,1.1-1.2,1.1c0,0,0,0,0,0h-5.4c-0.6,0-1.2-0.5-1.2-1.1c0,0,0,0,0,0v-5.2c0-0.6,0.6-1.1,1.2-1.1h5.4
|
||||
c0.6,0,1.2,0.5,1.2,1.1V94.9z M182.5,82.1c0,0.6-0.6,1.1-1.2,1.1h-5.4c-0.6,0-1.2-0.5-1.2-1.1v-5.2c0-0.6,0.6-1.1,1.2-1.1
|
||||
c0,0,0,0,0,0h5.4c0.6,0,1.2,0.5,1.2,1.1c0,0,0,0,0,0V82.1z M182.5,69.2c0,0.6-0.6,1.1-1.2,1.1c0,0,0,0,0,0h-5.4
|
||||
c-0.6,0-1.2-0.5-1.2-1.1c0,0,0,0,0,0V64c0-0.6,0.6-1.1,1.2-1.1h5.4c0.6,0,1.2,0.5,1.2,1.1V69.2z M192.6,159.4
|
||||
c0,0.6-0.6,1.1-1.2,1.1H186c-0.6,0-1.2-0.5-1.2-1.1c0,0,0,0,0,0v-5.2c0-0.6,0.6-1.1,1.2-1.1h5.4c0.6,0,1.2,0.5,1.2,1.1
|
||||
c0,0,0,0,0,0L192.6,159.4z M192.6,146.5c0,0.6-0.6,1.1-1.2,1.1c0,0,0,0,0,0H186c-0.6,0-1.2-0.5-1.2-1.1v-5.2
|
||||
c0-0.6,0.6-1.1,1.2-1.1c0,0,0,0,0,0h5.4c0.6,0,1.2,0.5,1.2,1.1L192.6,146.5z M192.6,133.6c0,0.6-0.6,1.1-1.2,1.1H186
|
||||
c-0.6,0-1.2-0.5-1.2-1.1c0,0,0,0,0,0v-5.2c0-0.6,0.6-1.1,1.2-1.1h5.4c0.6,0,1.2,0.5,1.2,1.1c0,0,0,0,0,0L192.6,133.6z
|
||||
M192.6,120.7c0,0.6-0.6,1.1-1.2,1.1c0,0,0,0,0,0H186c-0.6,0-1.2-0.5-1.2-1.1v-5.2c0-0.6,0.6-1.1,1.2-1.1c0,0,0,0,0,0h5.4
|
||||
c0.6,0,1.2,0.5,1.2,1.1L192.6,120.7z M192.6,107.8c0,0.6-0.6,1.1-1.2,1.1H186c-0.6,0-1.2-0.5-1.2-1.1c0,0,0,0,0,0v-5.2
|
||||
c0-0.6,0.6-1.1,1.2-1.1c0,0,0,0,0,0h5.4c0.6,0,1.2,0.5,1.2,1.1c0,0,0,0,0,0L192.6,107.8z M192.6,94.9c0,0.6-0.6,1.1-1.2,1.1
|
||||
c0,0,0,0,0,0H186c-0.6,0-1.2-0.5-1.2-1.1v-5.2c0-0.6,0.6-1.1,1.2-1.1c0,0,0,0,0,0h5.4c0.6,0,1.2,0.5,1.2,1.1L192.6,94.9z
|
||||
M192.6,82.1c0,0.6-0.6,1.1-1.2,1.1H186c-0.6,0-1.2-0.5-1.2-1.1c0,0,0,0,0,0v-5.2c0-0.6,0.6-1.1,1.2-1.1c0,0,0,0,0,0h5.4
|
||||
c0.6,0,1.2,0.5,1.2,1.1c0,0,0,0,0,0L192.6,82.1z M192.6,69.2c0,0.6-0.6,1.1-1.2,1.1c0,0,0,0,0,0H186c-0.6,0-1.2-0.5-1.2-1.1V64
|
||||
c0-0.6,0.5-1.2,1.2-1.2c0,0,0,0,0,0h5.4c0.6,0,1.2,0.5,1.2,1.1L192.6,69.2z M202.6,159.4c0,0.6-0.6,1.1-1.2,1.1c0,0,0,0,0,0H196
|
||||
c-0.6,0-1.2-0.5-1.2-1.1v-5.2c0-0.6,0.6-1.1,1.2-1.1c0,0,0,0,0,0h5.4c0.6,0,1.2,0.5,1.2,1.1L202.6,159.4z M202.6,146.5
|
||||
c0,0.6-0.6,1.1-1.2,1.1H196c-0.6,0-1.2-0.5-1.2-1.1c0,0,0,0,0,0v-5.2c0-0.6,0.6-1.1,1.2-1.1h5.4c0.6,0,1.2,0.5,1.2,1.1
|
||||
c0,0,0,0,0,0L202.6,146.5z M202.6,133.6c0,0.6-0.6,1.1-1.2,1.1c0,0,0,0,0,0H196c-0.6,0-1.2-0.5-1.2-1.1v-5.2
|
||||
c0-0.6,0.6-1.1,1.2-1.1c0,0,0,0,0,0h5.4c0.6,0,1.2,0.5,1.2,1.1L202.6,133.6z M202.6,120.7c0,0.6-0.6,1.1-1.2,1.1H196
|
||||
c-0.6,0-1.2-0.5-1.2-1.1c0,0,0,0,0,0v-5.2c0-0.6,0.6-1.1,1.2-1.1h5.4c0.6,0,1.2,0.5,1.2,1.1c0,0,0,0,0,0L202.6,120.7z
|
||||
M202.6,107.8c0,0.6-0.6,1.1-1.2,1.1c0,0,0,0,0,0H196c-0.6,0-1.2-0.5-1.2-1.1v-5.2c0-0.6,0.6-1.1,1.2-1.1c0,0,0,0,0,0h5.4
|
||||
c0.6,0,1.2,0.5,1.2,1.1c0,0,0,0,0,0L202.6,107.8z M202.6,94.9c0,0.6-0.6,1.1-1.2,1.1H196c-0.6,0-1.2-0.5-1.2-1.1c0,0,0,0,0,0
|
||||
v-5.2c0-0.6,0.6-1.1,1.2-1.1h5.4c0.6,0,1.2,0.5,1.2,1.1c0,0,0,0,0,0L202.6,94.9z M202.6,82.1c0,0.6-0.6,1.1-1.2,1.1c0,0,0,0,0,0
|
||||
H196c-0.6,0-1.2-0.5-1.2-1.1v-5.2c0-0.6,0.6-1.1,1.2-1.1c0,0,0,0,0,0h5.4c0.6,0,1.2,0.5,1.2,1.1c0,0,0,0,0,0L202.6,82.1z
|
||||
M202.6,69.2c0,0.6-0.6,1.1-1.2,1.1H196c-0.6,0-1.2-0.5-1.2-1.1c0,0,0,0,0,0V64c0-0.6,0.6-1.1,1.2-1.1h5.4c0.6,0,1.2,0.4,1.2,1.1
|
||||
c0,0,0,0,0,0V69.2z M227.8,159.4c0,0.6-0.6,1.1-1.2,1.1h-20.5c-0.6,0-1.2-0.5-1.2-1.1v-5.2c0-0.6,0.6-1.1,1.2-1.1c0,0,0,0,0,0
|
||||
h20.5c0.6,0,1.2,0.5,1.2,1.1c0,0,0,0,0,0L227.8,159.4z M227.8,146.5c0,0.6-0.6,1.1-1.2,1.1c0,0,0,0,0,0h-20.5
|
||||
c-0.6,0-1.2-0.5-1.2-1.1c0,0,0,0,0,0v-5.2c0-0.6,0.6-1.1,1.2-1.1h20.5c0.6,0,1.2,0.5,1.2,1.1L227.8,146.5z M227.8,133.6
|
||||
c0,0.6-0.6,1.1-1.2,1.1h-20.5c-0.6,0-1.2-0.5-1.2-1.1v-5.2c0-0.6,0.6-1.1,1.2-1.1c0,0,0,0,0,0h20.5c0.6,0,1.2,0.5,1.2,1.1
|
||||
c0,0,0,0,0,0L227.8,133.6z M227.8,120.7c0,0.6-0.6,1.1-1.2,1.1c0,0,0,0,0,0h-20.5c-0.6,0-1.2-0.5-1.2-1.1c0,0,0,0,0,0v-5.2
|
||||
c0-0.6,0.6-1.1,1.2-1.1h20.5c0.6,0,1.2,0.5,1.2,1.1L227.8,120.7z M227.8,107.8c0,0.6-0.6,1.1-1.2,1.1h-20.5
|
||||
c-0.6,0-1.2-0.5-1.2-1.1v-5.2c0-0.6,0.6-1.1,1.2-1.1c0,0,0,0,0,0h20.5c0.6,0,1.2,0.5,1.2,1.1c0,0,0,0,0,0L227.8,107.8z
|
||||
M227.8,94.9c0,0.6-0.6,1.1-1.2,1.1c0,0,0,0,0,0h-20.5c-0.6,0-1.2-0.5-1.2-1.1c0,0,0,0,0,0v-5.2c0-0.6,0.6-1.1,1.2-1.1h20.5
|
||||
c0.6,0,1.2,0.5,1.2,1.1L227.8,94.9z M227.8,82.1c0,0.6-0.6,1.1-1.2,1.1h-20.5c-0.6,0-1.2-0.5-1.2-1.1v-5.2c0-0.6,0.6-1.1,1.2-1.1
|
||||
c0,0,0,0,0,0h20.5c0.6,0,1.2,0.5,1.2,1.1c0,0,0,0,0,0L227.8,82.1z M227.8,69.2c0,0.6-0.6,1.1-1.2,1.1c0,0,0,0,0,0h-20.5
|
||||
c-0.6,0-1.2-0.5-1.2-1.1c0,0,0,0,0,0V64c0-0.6,0.6-1.1,1.2-1.1h20.5c0.6,0,1.2,0.5,1.2,1.1L227.8,69.2z"/>
|
||||
|
||||
<linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="122.975" y1="237.3228" x2="122.975" y2="59.9971" gradientTransform="matrix(1 0 0 -1 0 264)">
|
||||
<stop offset="0" style="stop-color:#81CFFF"/>
|
||||
<stop offset="1" style="stop-color:#5ECFFF;stop-opacity:0"/>
|
||||
</linearGradient>
|
||||
<path class="st4" d="M161.1,26.7H84.8c-1.5-0.1-2.8,1.1-2.8,2.6c0,0,0,0,0,0v172.2c0.1,1.5,1.3,2.6,2.8,2.6h76.3
|
||||
c1.5,0.1,2.8-1.1,2.8-2.6V29.3C163.9,27.8,162.6,26.6,161.1,26.7z M154.3,161c0,0.6-0.6,1.1-1.2,1.1H92.8c-0.6,0-1.2-0.5-1.2-1.1
|
||||
c0,0,0,0,0,0v-5.2c0-0.6,0.6-1.1,1.2-1.1c0,0,0,0,0,0h60.3c0.6,0,1.2,0.5,1.2,1.1c0,0,0,0,0,0V161z M154.3,146.3
|
||||
c0,0.6-0.6,1.1-1.2,1.1c0,0,0,0,0,0H92.8c-0.6,0-1.2-0.5-1.2-1.1v-5.2c0-0.6,0.6-1.1,1.2-1.1c0,0,0,0,0,0h60.3
|
||||
c0.6,0,1.2,0.5,1.2,1.1V146.3z M154.3,131.6c0,0.6-0.6,1.1-1.2,1.1H92.8c-0.6,0-1.2-0.5-1.2-1.1c0,0,0,0,0,0v-5.2
|
||||
c0-0.6,0.6-1.1,1.2-1.1h60.3c0.6,0,1.2,0.5,1.2,1.1c0,0,0,0,0,0V131.6z M154.3,117c0,0.6-0.6,1.1-1.2,1.1H92.8
|
||||
c-0.6,0-1.2-0.5-1.2-1.1c0,0,0,0,0,0v-5.2c0-0.6,0.6-1.1,1.2-1.1c0,0,0,0,0,0h60.3c0.6,0,1.2,0.5,1.2,1.1c0,0,0,0,0,0V117z
|
||||
M154.3,102.3c0,0.6-0.6,1.1-1.2,1.1c0,0,0,0,0,0H92.8c-0.6,0-1.2-0.5-1.2-1.1V97c0-0.6,0.6-1.1,1.2-1.1c0,0,0,0,0,0h60.3
|
||||
c0.6,0,1.2,0.5,1.2,1.1V102.3z M154.3,87.6c0,0.6-0.6,1.1-1.2,1.1H92.8c-0.6,0-1.2-0.5-1.2-1.1c0,0,0,0,0,0v-5.3
|
||||
c0-0.6,0.6-1.1,1.2-1.1h60.3c0.6,0,1.2,0.5,1.2,1.1c0,0,0,0,0,0V87.6z M154.3,72.9c0,0.6-0.6,1.1-1.2,1.1H92.8
|
||||
c-0.6,0-1.2-0.5-1.2-1.1c0,0,0,0,0,0v-5.3c0-0.6,0.6-1.1,1.2-1.1c0,0,0,0,0,0h60.3c0.6,0,1.2,0.5,1.2,1.1c0,0,0,0,0,0V72.9z
|
||||
M154.3,58.3c0,0.6-0.6,1.1-1.2,1.1c0,0,0,0,0,0H92.8c-0.6,0-1.2-0.5-1.2-1.1V53c0-0.6,0.6-1.1,1.2-1.1c0,0,0,0,0,0h60.3
|
||||
c0.6,0,1.2,0.5,1.2,1.1V58.3z M154.3,43.6c0,0.6-0.6,1.1-1.2,1.1H92.8c-0.6,0-1.2-0.5-1.2-1.1c0,0,0,0,0,0v-5.3
|
||||
c0-0.6,0.6-1.1,1.2-1.1h60.3c0.6,0,1.2,0.5,1.2,1.1c0,0,0,0,0,0V43.6z"/>
|
||||
|
||||
<linearGradient id="SVGID_5_" gradientUnits="userSpaceOnUse" x1="273.51" y1="264" x2="273.51" y2="54.46" gradientTransform="matrix(1 0 0 -1 0 264)">
|
||||
<stop offset="0" style="stop-color:#81CFFF"/>
|
||||
<stop offset="1" style="stop-color:#5ECFFF;stop-opacity:0"/>
|
||||
</linearGradient>
|
||||
<path class="st5" d="M306.2,0h-65.4c-1.4,0-2.5,1.2-2.4,2.6v204.4c-0.1,1.4,1,2.5,2.4,2.6c0,0,0,0,0,0h65.4
|
||||
c1.4-0.1,2.5-1.2,2.4-2.6V2.6C308.7,1.2,307.6,0.1,306.2,0z M300.4,119.6c0,0.6-0.4,1.1-1,1.1h-51.7c-0.6,0-1-0.5-1-1.1v-5.2
|
||||
c0-0.6,0.4-1.1,1-1.1h51.7c0.6,0,1,0.5,1,1.1L300.4,119.6z M300.4,90.3c0,0.6-0.4,1.1-1,1.1h-51.7c-0.6,0-1-0.5-1-1.1V85
|
||||
c0-0.6,0.4-1.1,1-1.1h51.7c0.6,0,1,0.5,1,1.1L300.4,90.3z M300.4,60.9c0,0.6-0.4,1.1-1,1.1h-51.7c-0.6,0-1-0.5-1-1.1v-5.2
|
||||
c0-0.6,0.4-1.1,1-1.1h51.7c0.6,0,1,0.5,1,1.1L300.4,60.9z M300.4,31.5c0,0.6-0.4,1.1-1,1.1h-51.7c-0.6,0-1-0.5-1-1.1v-5.2
|
||||
c0-0.6,0.4-1.1,1-1.1h51.7c0.6,0,1,0.5,1,1.1L300.4,31.5z M300.4,16.9c0,0.6-0.4,1.1-1,1.1h-51.7c-0.6,0-1-0.5-1-1.1v-5.2
|
||||
c0-0.6,0.4-1.1,1-1.1h51.7c0.6,0,1,0.5,1,1.1L300.4,16.9z"/>
|
||||
</g>
|
||||
<g class="st6">
|
||||
<path class="st7" d="M244.2,130.7c3.3,1.9,5.7,13.6,1,20.7c-5.3,6.8-7,9-6.1,14c-4.3-7.3-0.6-7.4-5.8-14.2
|
||||
c-4.6-6.2-2.5-17.4,0.7-20.5C237.4,131.3,240.8,131.3,244.2,130.7L244.2,130.7z"/>
|
||||
<path class="st8" d="M280.4,211.9c-0.1,0.6-0.1,1.2-0.1,1.7c0,0.7,0.1,1.3,0.2,2c-2.1-0.8-4.3-1.2-6.5-1.2
|
||||
c-2.6,0-5.2,0.6-7.5,1.7c-0.8-4.2-4.8-7-9-6.2c-2.8,0.5-5,2.5-5.9,5.2c-3.4-2.1-7.7-2-11.1,0.1c-0.4-5.7-4.1-0.8-9.8-0.8
|
||||
c-6,0-11.8-4.4-11.8,1.7c0,1.1,0.2,2.2,0.4,3.2c-1.1,0.1-2.1,0.5-3,1c-0.9-7-6.8-12.4-13.9-12.7c22.6-10.3,22.4-44.6,24.8-74.6
|
||||
c0.1-1.7,1.2-4.1,1.8-4.4l0,0c1.5,1.1,3.2,1.8,5.1,2.1c-3.2,3.1-5.4,14.3-0.7,20.5c5.3,6.8,1.6,6.9,5.8,14.2
|
||||
c-0.9-5,0.8-7.2,6.1-14c4.8-7.2,2.3-18.8-1-20.7c1.8-0.3,3.6-1,5.1-2.1l0,0c0.6,0.3,1.7,2.7,1.8,4.4
|
||||
C253.6,164.6,250.4,198.5,280.4,211.9z"/>
|
||||
<path class="st9" d="M303.3,203.2c-5.4,0-9.8,4.4-9.8,9.8c0,0.3,0,0.6,0,0.9c-1.5-1.7-3.7-2.6-6-2.5c-0.7,0-1.4,0.1-2.1,0.3
|
||||
c0.7-1.3,1.1-2.8,1.1-4.3c-0.1-4.6-3.9-8.3-8.5-8.2c-4,0.1-7.4,3-8.1,6.9c-0.1,0.4-0.1,0.9-0.1,1.3c0,0.5,0,1,0.1,1.6
|
||||
c-3.5-1.4-7.4-1.3-10.8,0.4c-0.7-3.2-3.9-5.3-7.2-4.6c-2,0.4-3.6,1.9-4.3,3.8c-1.3-0.8-2.7-1.2-4.2-1.2c-1.5,0-3.1,0.4-4.4,1.3
|
||||
c-0.2-4.6-4.1-8.2-8.7-8s-8.2,4.1-8,8.7l0,0c0,0.8,0.1,1.7,0.3,2.5c-0.8,0.1-1.6,0.4-2.3,0.8c-0.7-5.4-5.2-9.6-10.7-9.8h-0.4
|
||||
c-3.4,0-6.7,1.6-8.8,4.3c-3-6.2-10.4-8.9-16.7-5.9c-2.9,1.4-5.2,3.9-6.3,7c4.1,3,6.6,7.8,6.6,12.9c0,2.3-0.5,4.6-1.5,6.6
|
||||
c2-2.2,4.8-3.4,7.8-3.4c0.9,0,1.8,0.1,2.7,0.3c-2.9-5-1.2-11.5,3.8-14.4c1.2-0.7,2.6-1.2,3.9-1.3c0.5-0.1,0.9-0.1,1.4-0.1
|
||||
c5.8,0,10.6,4.7,10.6,10.6l0,0c0,0.6-0.1,1.3-0.2,1.9c4.4-1.7,9.3-1.6,13.6,0.4c0.9-4.1,4.9-6.7,9-5.8c2.6,0.6,4.7,2.4,5.5,4.9
|
||||
c1.6-0.9,3.5-1.4,5.3-1.4c1.9,0,3.8,0.5,5.4,1.5l0.1,0.1c0.3-4.5,3.6-8.4,8-9.4c0.8-0.2,1.7-0.3,2.5-0.3
|
||||
c5.8,0,10.6,4.7,10.6,10.6c0,1-0.2,2-0.4,3c1.1,0.1,2.1,0.5,3,1c1-7,7-12.1,14-12.1c1.5,0,3,0.2,4.4,0.7c2.6,0.8,5,2.5,6.7,4.6
|
||||
c2.4-4.8,7-8.2,12.4-8.8C311.4,205.9,307.6,203.2,303.3,203.2z"/>
|
||||
<path class="st10" d="M314.4,209.9c-0.6,0-1.2,0-1.8,0.1c-5.4,0.6-10.1,3.9-12.5,8.7c-1.7-2.2-4-3.8-6.7-4.6
|
||||
c-1.4-0.5-2.9-0.7-4.4-0.7c-7,0-13,5.2-14,12.1c-0.9-0.5-1.9-0.9-3-1c0.3-1,0.4-2,0.4-3c0-5.8-4.7-10.5-10.5-10.5
|
||||
c-0.8,0-1.7,0.1-2.5,0.3c-4.4,1.1-7.7,4.9-8,9.4l-0.1-0.1c-1.6-1-3.5-1.5-5.4-1.5c-1.9,0-3.7,0.5-5.3,1.4c-1.4-3.9-5.7-6-9.6-4.6
|
||||
c-2.5,0.9-4.3,3-4.9,5.5c-4.3-2-9.2-2.1-13.6-0.4c0.1-0.6,0.2-1.3,0.2-1.9c0-5.8-4.7-10.6-10.6-10.6l0,0c-0.5,0-0.9,0-1.4,0.1
|
||||
c-5.8,0.8-9.9,6.1-9.1,11.8c0.2,1.4,0.6,2.7,1.3,3.9c-0.9-0.2-1.8-0.3-2.7-0.3c-2.9,0-5.8,1.2-7.8,3.4c1-2.1,1.5-4.3,1.5-6.6
|
||||
c0-5.1-2.4-9.9-6.6-12.9l0,0c-7.1-5.2-17-3.6-22.2,3.5c-5.2,7.1-3.6,17,3.5,22.2c6.8,5,16.4,3.7,21.7-2.8
|
||||
c-2.1,5.5,0.7,11.6,6.1,13.6c5.5,2.1,11.6-0.7,13.6-6.1c0.5-1.2,0.7-2.5,0.7-3.7c0-1.9,0.4-0.1,0.4,2.7c0,9.7,7.8,17.6,17.5,17.6
|
||||
c9.7,0,17.6-7.8,17.6-17.5c0-2.4-0.5-4.8-1.4-7l0.5-0.1c0.5,5.8,5.7,10.1,11.5,9.5c5-0.5,9-4.4,9.5-9.4c1.7,1,3.6,1.6,5.5,1.6
|
||||
c0.6,0,1.2,0,1.7-0.1v0.1c0,4.2,3.4,7.6,7.6,7.5c2.6,0,5-1.4,6.4-3.6c4.7,6.3,13.5,7.5,19.8,2.9c1.5-1.1,2.8-2.5,3.7-4.2
|
||||
c4.9,7.3,14.8,9.1,22.1,4.2s9.1-14.8,4.2-22.1C324.5,212.5,319.6,209.9,314.4,209.9L314.4,209.9z"/>
|
||||
</g>
|
||||
<path class="st11" d="M239.1,70c6.4,0,11.6,5.2,11.6,11.6c0,6.4-5.2,11.6-11.6,11.6c-6.4,0-11.6-5.2-11.6-11.6c0,0,0,0,0,0
|
||||
C227.5,75.2,232.7,70,239.1,70z"/>
|
||||
<path class="st8" d="M239.1,137.2c8.3,0,13.5-1.7,16.6-7.9c0,3.2-1.5,6.2-4.1,8.1c-1.9,1.3-4,2.2-6.2,2.6c-4.1,0.8-8.4,0.8-12.5,0
|
||||
c-2.2-0.4-4.3-1.3-6.2-2.6c-2.6-1.9-4.2-4.9-4.2-8.1C225.6,135.5,230.7,137.2,239.1,137.2z"/>
|
||||
<path class="st8" d="M288.4,151.7c0,0.5-0.3,0.8-0.8,0.8c-0.3,0-0.5-0.1-0.7-0.3c-7.6-10.3-25.5-25-30.4-24.7
|
||||
c2.4-6.1,3.4-15.9,3.6-31.2C271.5,100.3,288.3,122.4,288.4,151.7z"/>
|
||||
<path class="st8" d="M218.1,96.3c0.3,15.2,1.2,25,3.6,31.1l-0.2,0.1c-4.9-0.3-22.8,14.5-30.4,24.7c-0.3,0.4-0.8,0.5-1.1,0.2
|
||||
c-0.2-0.2-0.4-0.4-0.3-0.7C189.7,122.3,206.6,100.2,218.1,96.3L218.1,96.3z"/>
|
||||
<path class="st8" d="M250.7,81.6c0-6.4-5.2-11.6-11.6-11.6c-6.4,0-11.6,5.2-11.6,11.6s5.2,11.6,11.6,11.6l0,0
|
||||
C245.5,93.2,250.7,88,250.7,81.6z M252.9,81.6c0,7.6-6.2,13.8-13.8,13.8c-7.6,0-13.8-6.2-13.8-13.8c0-7.6,6.2-13.8,13.8-13.8
|
||||
c0,0,0,0,0,0C246.7,67.8,252.9,74,252.9,81.6z"/>
|
||||
<path class="st8" d="M239.1,48.7c5.7,0,10.7-2,13.8-4.9c0.5,1.3,1,2.6,1.4,4c-3.3,3.3-8.9,5.4-15.3,5.4s-11.9-2.1-15.3-5.4
|
||||
c0.5-1.3,1-2.7,1.4-4C228.4,46.8,233.4,48.7,239.1,48.7z"/>
|
||||
<path class="st9" d="M252.9,43.8c-3.1,3-8.1,4.9-13.8,4.9s-10.7-2-13.8-4.9c2-5.1,4.5-10,7.6-14.5c0.5-0.7,0.9-1.3,1.4-1.9
|
||||
c2-2.7,5.8-3.2,8.5-1.2c0.4,0.3,0.8,0.7,1.2,1.2c0.5,0.6,0.9,1.2,1.4,1.9C248.4,33.8,250.9,38.7,252.9,43.8z"/>
|
||||
<path class="st10" d="M260.1,96.4c-0.3,15.3-1.2,25-3.6,31.2c-0.2,0.6-0.5,1.2-0.8,1.7c-3.1,6.2-8.3,7.9-16.6,7.9
|
||||
s-13.5-1.7-16.6-7.9c-0.3-0.6-0.5-1.1-0.8-1.8c-2.4-6.2-3.4-15.9-3.6-31.1c-0.1-3.4-0.1-7.1-0.1-11.1c-0.1-12.7,1.8-25.4,5.8-37.5
|
||||
c3.3,3.3,8.9,5.4,15.3,5.4s11.9-2.1,15.3-5.4c4,12.1,6,24.8,5.8,37.5C260.2,89.2,260.1,92.9,260.1,96.4z M252.9,81.6
|
||||
c0-7.6-6.2-13.8-13.8-13.8c-7.6,0-13.8,6.2-13.8,13.8c0,7.6,6.2,13.8,13.8,13.8c0,0,0,0,0,0C246.7,95.4,252.9,89.2,252.9,81.6
|
||||
L252.9,81.6z"/>
|
||||
<path class="st12" d="M139.2,246.1l18.4,0.4v0.7l-19.4-0.4v-0.7V246C138.4,246.1,138.6,246.1,139.2,246.1z"/>
|
||||
|
||||
<linearGradient id="SVGID_6_" gradientUnits="userSpaceOnUse" x1="112.2357" y1="190.775" x2="112.2357" y2="101.005" gradientTransform="matrix(1 0 0 -1 0 264)">
|
||||
<stop offset="0" style="stop-color:#81CFFF"/>
|
||||
<stop offset="1" style="stop-color:#5ECFFF;stop-opacity:0"/>
|
||||
</linearGradient>
|
||||
<line class="st13" x1="112.2" y1="73.2" x2="112.2" y2="163"/>
|
||||
|
||||
<linearGradient id="SVGID_7_" gradientUnits="userSpaceOnUse" x1="348.955" y1="195.605" x2="348.955" y2="105.835" gradientTransform="matrix(1 0 0 -1 0 264)">
|
||||
<stop offset="0" style="stop-color:#81CFFF"/>
|
||||
<stop offset="1" style="stop-color:#5ECFFF;stop-opacity:0"/>
|
||||
</linearGradient>
|
||||
<line class="st14" x1="349" y1="68.4" x2="349" y2="158.2"/>
|
||||
|
||||
<linearGradient id="SVGID_8_" gradientUnits="userSpaceOnUse" x1="40.9" y1="120.12" x2="40.9" y2="64.49" gradientTransform="matrix(1 0 0 -1 0 264)">
|
||||
<stop offset="0" style="stop-color:#81CFFF"/>
|
||||
<stop offset="1" style="stop-color:#5ECFFF;stop-opacity:0"/>
|
||||
</linearGradient>
|
||||
<line class="st15" x1="40.9" y1="143.9" x2="40.9" y2="199.5"/>
|
||||
|
||||
<linearGradient id="SVGID_9_" gradientUnits="userSpaceOnUse" x1="64.97" y1="168.64" x2="64.97" y2="140.83" gradientTransform="matrix(1 0 0 -1 0 264)">
|
||||
<stop offset="0" style="stop-color:#81CFFF"/>
|
||||
<stop offset="1" style="stop-color:#5ECFFF;stop-opacity:0"/>
|
||||
</linearGradient>
|
||||
<line class="st16" x1="65" y1="95.4" x2="65" y2="123.2"/>
|
||||
|
||||
<linearGradient id="SVGID_10_" gradientUnits="userSpaceOnUse" x1="397.23" y1="159.8" x2="397.23" y2="131.98" gradientTransform="matrix(1 0 0 -1 0 264)">
|
||||
<stop offset="0" style="stop-color:#81CFFF"/>
|
||||
<stop offset="1" style="stop-color:#5ECFFF;stop-opacity:0"/>
|
||||
</linearGradient>
|
||||
<line class="st17" x1="397.2" y1="104.2" x2="397.2" y2="132"/>
|
||||
|
||||
<linearGradient id="SVGID_11_" gradientUnits="userSpaceOnUse" x1="424.75" y1="130.51" x2="424.75" y2="74.87" gradientTransform="matrix(1 0 0 -1 0 264)">
|
||||
<stop offset="0" style="stop-color:#81CFFF"/>
|
||||
<stop offset="1" style="stop-color:#5ECFFF;stop-opacity:0"/>
|
||||
</linearGradient>
|
||||
<line class="st18" x1="424.8" y1="133.5" x2="424.8" y2="189.1"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 20 KiB |
|
|
@ -0,0 +1,67 @@
|
|||
<!doctype html><html lang="en"><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><link rel="icon" href="favicon.ico"><title>Mi-Wifi-Agent服务</title><script>document.write("<script src='config.js?"+new Date().getTime()+"'><\/script>");</script><script defer="defer" src="js/elicons.0c9b1ef1.js"></script><script defer="defer" src="js/modules.41124da4.js"></script><script defer="defer" src="js/app.893a3e7b.js"></script><link href="css/modules.853ca01a.css" rel="stylesheet"><link href="css/app.13c771e4.css" rel="stylesheet"></head><body><noscript><strong>We're sorry but Mi-Wifi-Agent服务 doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><script>var dark = window.localStorage.getItem('APP_DARK');
|
||||
if(dark){
|
||||
document.documentElement.classList.add("dark")
|
||||
}</script><div id="app" class="aminui"><div class="app-loading"><div class="app-loading__logo"><img src="img/logo.png"/></div><div class="app-loading__loader"></div><div class="app-loading__title">Mi-Wifi-Agent服务</div></div><style>.app-loading {position: absolute;top:0px;left:0px;right:0px;bottom:0px;display: flex;justify-content: center;align-items: center;flex-direction: column;background: #fff;}
|
||||
.app-loading__logo {margin-bottom: 30px;}
|
||||
.app-loading__logo img {width: 90px;vertical-align: bottom;}
|
||||
.app-loading__loader {box-sizing: border-box;width: 35px;height: 35px;border: 5px solid transparent;border-top-color: #000;border-radius: 50%;animation: .5s loader linear infinite;position: relative;}
|
||||
.app-loading__loader:before {box-sizing: border-box;content: '';display: block;width: inherit;height: inherit;position: absolute;top: -5px;left: -5px;border: 5px solid #ccc;border-radius: 50%;opacity: .5;}
|
||||
.app-loading__title {font-size: 24px;color: #333;margin-top: 30px;}
|
||||
.dark .app-loading {background: #222225;}
|
||||
.dark .app-loading__loader {border-top-color: #fff;}
|
||||
.dark .app-loading__title {color: #d0d0d0;}
|
||||
@keyframes loader {
|
||||
0% {
|
||||
transform: rotate(0deg);
|
||||
}
|
||||
100% {
|
||||
transform: rotate(360deg);
|
||||
}
|
||||
}</style></div></body><div id="versionCheck" style="display: none;position: absolute;z-index: 99;top:0;left:0;right:0;bottom:0;padding:40px;background:rgba(255,255,255,0.9);color: #333;"><h2 style="line-height: 1;margin: 0;font-size: 24px;">当前使用的浏览器内核版本过低 :(</h2><p style="line-height: 1;margin: 0;font-size: 14px;margin-top: 20px;opacity: 0.8;">当前版本:<span id="versionCheck-type">--</span> <span id="versionCheck-version">--</span></p><p style="line-height: 1;margin: 0;font-size: 14px;margin-top: 10px;opacity: 0.8;">最低版本要求:Chrome 71+、Firefox 65+、Safari 12+、Edge 97+。</p><p style="line-height: 1;margin: 0;font-size: 14px;margin-top: 10px;opacity: 0.8;">请升级浏览器版本,或更换现代浏览器,如果你使用的是双核浏览器,请切换到极速/高速模式。</p></div><script>function getBrowerInfo(){
|
||||
var userAgent = window.navigator.userAgent;
|
||||
var browerInfo = {
|
||||
type: 'unknown',
|
||||
version: 'unknown',
|
||||
userAgent: userAgent
|
||||
};
|
||||
if(document.documentMode){
|
||||
browerInfo.type = "IE"
|
||||
browerInfo.version = document.documentMode + ''
|
||||
}else if(indexOf(userAgent, "Firefox")){
|
||||
browerInfo.type = "Firefox"
|
||||
browerInfo.version = userAgent.match(/Firefox\/([\d.]+)/)[1]
|
||||
}else if(indexOf(userAgent, "Opera")){
|
||||
browerInfo.type = "Opera"
|
||||
browerInfo.version = userAgent.match(/Opera\/([\d.]+)/)[1]
|
||||
}else if(indexOf(userAgent, "Edg")){
|
||||
browerInfo.type = "Edg"
|
||||
browerInfo.version = userAgent.match(/Edg\/([\d.]+)/)[1]
|
||||
}else if(indexOf(userAgent, "Chrome")){
|
||||
browerInfo.type = "Chrome"
|
||||
browerInfo.version = userAgent.match(/Chrome\/([\d.]+)/)[1]
|
||||
}else if(indexOf(userAgent, "Safari")){
|
||||
browerInfo.type = "Safari"
|
||||
browerInfo.version = userAgent.match(/Safari\/([\d.]+)/)[1]
|
||||
}
|
||||
return browerInfo
|
||||
}
|
||||
function indexOf(userAgent, brower) {
|
||||
return userAgent.indexOf(brower) > -1
|
||||
}
|
||||
function isSatisfyBrower(){
|
||||
var minVer = {
|
||||
"Chrome": 71,
|
||||
"Firefox": 65,
|
||||
"Safari": 12,
|
||||
"Edg": 97,
|
||||
"IE": 999
|
||||
}
|
||||
var browerInfo = getBrowerInfo()
|
||||
var materVer = browerInfo.version.split('.')[0]
|
||||
return materVer >= minVer[browerInfo.type]
|
||||
}
|
||||
if(!isSatisfyBrower()){
|
||||
document.getElementById('versionCheck').style.display = 'block';
|
||||
document.getElementById('versionCheck-type').innerHTML = getBrowerInfo().type;
|
||||
document.getElementById('versionCheck-version').innerHTML = getBrowerInfo().version;
|
||||
}</script></html>
|
||||
|
|
@ -0,0 +1 @@
|
|||
"use strict";(self["webpackChunkmi_wifi_agent"]=self["webpackChunkmi_wifi_agent"]||[]).push([[2389],{9080:function(o,n,r){r.r(n),r.d(n,{default:function(){return p}});var e=r(641);const t=o=>((0,e.Qi)("data-v-10b4695c"),o=o(),(0,e.jt)(),o),i={class:"router-err"},c=t((()=>(0,e.Lk)("div",{class:"router-err__icon"},[(0,e.Lk)("img",{src:"img/404.png"})],-1))),a={class:"router-err__content"},l=t((()=>(0,e.Lk)("h2",null,"无权限或找不到页面",-1))),u=t((()=>(0,e.Lk)("p",null,"当前页面无权限访问或者打开了一个不存在的链接,请检查当前账户权限和链接的可访问性。",-1)));function k(o,n,r,t,k,s){const d=(0,e.g2)("el-button");return(0,e.uX)(),(0,e.CE)("div",i,[c,(0,e.Lk)("div",a,[l,u,(0,e.bF)(d,{type:"primary",plain:"",round:"",onClick:s.gohome},{default:(0,e.k6)((()=>[(0,e.eW)("返回首页")])),_:1},8,["onClick"]),(0,e.bF)(d,{type:"primary",plain:"",round:"",onClick:s.gologin},{default:(0,e.k6)((()=>[(0,e.eW)("重新登录")])),_:1},8,["onClick"]),(0,e.bF)(d,{type:"primary",round:"",onClick:s.goback},{default:(0,e.k6)((()=>[(0,e.eW)("返回上一页")])),_:1},8,["onClick"])])])}r(8743);var s={methods:{gohome(){location.href="#/"},goback(){this.$router.go(-1)},gologin(){this.$router.push("/login")}}},d=r(6262);const g=(0,d.A)(s,[["render",k],["__scopeId","data-v-10b4695c"]]);var p=g}}]);
|
||||