Compare commits

..

10 Commits
2.3 ... 2.5

Author SHA1 Message Date
zhaojun1998
04e3023071 🔖 发布 2.5 版 2020-05-04 21:00:33 +08:00
zhaojun1998
a09ef84629 💄 更新页面 2020-05-04 21:00:13 +08:00
zhaojun1998
1d29395191 🐛 修复 OneDrive 某些情况下 Access Token 过长, 因超出数据库长度无法保存的 BUG. 2020-05-04 20:59:48 +08:00
zhaojun1998
3720dc6aa9 🔖 发布 2.4 版 2020-04-20 22:40:06 +08:00
zhaojun1998
3ada172be2 💄 更新页面 2020-04-20 22:39:42 +08:00
zhaojun1998
15f8fbb49b 🐛 修复阿里云腾讯云私有空间时, 密码文件无法加载的 BUG 2020-04-20 22:37:12 +08:00
zhaojun1998
547e688d38 🏗️ 增强系统校验 2020-04-20 21:58:32 +08:00
zhaojun1998
708eb33d0e 🐛 修复多盘中是否多个 OneDrive 导致无法正常加载的 BUG 2020-04-20 21:57:25 +08:00
zhaojun1998
e954b725b1 📝 更新文档 2020-04-19 15:26:04 +08:00
zhaojun1998
c89cb4e495 📝 更新文档 2020-04-19 15:24:36 +08:00
24 changed files with 124 additions and 84 deletions

View File

@@ -23,8 +23,9 @@
* 文件夹密码
* 支持在线浏览文本文件, 视频, 图片, 音乐. (支持 FLV 和 HLS)
* 文件/目录二维码
* 缓存动态开启, 缓存自动刷新
* 全局搜索
* 缓存动态开启, ~~缓存自动刷新 (v2.2 及以前版本支持)~~
* ~~全局搜索 (v2.2 及以前版本支持)~~
* 同时挂载多个存储策略
* 支持 阿里云 OSS, FTP, 华为云 OBS, 本地存储, MINIO, OneDrive 国际/家庭/个人版, OneDrive 世纪互联版, 七牛云 KODO, 腾讯云 COS, 又拍云 USS.
## 快速开始
@@ -34,11 +35,15 @@
```bash
# CentOS系统
yum install -y java-1.8.0-openjdk unzip
```
```bash
# Debian 9 / Ubuntu 14+
apt update
apt install -y openjdk-8-jre-headless unzip
```
```bash
# Debian 10 (Buster) 系统
apt update && apt install -y apt-transport-https software-properties-common ca-certificates dirmngr gnupg
wget -qO - https://adoptopenjdk.jfrog.io/adoptopenjdk/api/gpg/key/public | apt-key add -
@@ -46,8 +51,10 @@ add-apt-repository --yes https://adoptopenjdk.jfrog.io/adoptopenjdk/deb/
apt update && apt install -y adoptopenjdk-8-hotspot-jre
```
> 如为更新程序, 则请先执行 `~/zfile/bin/stop.sh && rm -rf ~/zfile` 清理旧程序. 首次安装请忽略此选项.
下载项目:
```bash
@@ -57,6 +64,8 @@ mkdir zfile && unzip zfile-release.war -d zfile && rm -rf zfile-release.war
chmod +x zfile/bin/*.sh
```
> 下载指定版本可以将 `zfile-release.war` 改为 `zfile-x.x.war`,如 `zfile-2.2.war`。
程序的目录结构为:
```
├── zfile
@@ -74,7 +83,7 @@ chmod +x zfile/bin/*.sh
~/zfile/bin/start.sh
```
篇幅有限, 更详细的安装教程请参考: [安装文档](http://zhaojun.im/zfile-install)
篇幅有限, 更详细的安装教程及介绍请参考: [ZFile 文档](http://zhaojun.im/zfile-install)
访问地址:
@@ -85,42 +94,15 @@ chmod +x zfile/bin/*.sh
管理后台: http://127.0.0.1:8080/#/admin
## OneDrive 使用教程.
访问地址进行授权, 获取 accessToken 和 refreshToken:
国际/家庭/个人版:
https://login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id=09939809-c617-43c8-a220-a93c1513c5d4&response_type=code&redirect_uri=https://zfile.jun6.net/onedrive/callback&scope=offline_access%20User.Read%20Files.ReadWrite.All
世纪互联版:
https://login.chinacloudapi.cn/common/oauth2/v2.0/authorize?client_id=4a72d927-1907-488d-9eb2-1b465c53c1c5&response_type=code&redirect_uri=https://zfile.jun6.net/onedrive/china-callback&scope=offline_access%20User.Read%20Files.ReadWrite.All
然后分别填写至访问令牌和刷新令牌即可:
![http://cdn.jun6.net/2020-01-24_18-57-06.png](http://cdn.jun6.net/2020-01-24_18-57-06.png)
## 运行环境
* JDK: `1.8`
* 数据库: `h2/mysql`
## 预览
![前台首页](http://cdn.jun6.net/2020/01/29/a252a5cec7134.png)
![后台设置](http://cdn.jun6.net/2020/01/29/d5c85221bcffc.png)
![存储策略](http://cdn.jun6.net/2020/01/29/4b79bfba4e003.png)
![缓存管理](http://cdn.jun6.net/2020/01/29/60b0538e50f9f.png)
![前台首页](https://cdn.jun6.net/2020/04/19/d590d2bde13bb.png)
![后台设置-驱动器设置](https://cdn.jun6.net/2020/04/19/d58fc2debcce8.png)
![后台设置-驱动器设置](https://cdn.jun6.net/2020/04/19/0f321e47fc18c.png)
![后台设置-显示设置](https://cdn.jun6.net/2020/04/19/6d7c300b89671.png)
## 常见问题
### 数据库
缓存默认支持 `h2``mysql`, 前者为嵌入式数据库, 无需安装, 但后者相对性能更好.
### 默认路径
@@ -130,6 +112,8 @@ windows 为 `C:/Users/用户名/`
linux 为 `/home/用户名/`, root 用户为 `/root/`
> 2.3 及以后版本路径为 `~/.zfile-new/db/`
### 文档文件和加密文件
- 目录文档显示文件名为 `readme.md`
@@ -156,6 +140,5 @@ linux 为 `/home/用户名/`, root 用户为 `/root/`
如果本项目对你有帮助,请作者喝杯咖啡吧。
<img src="http://cdn.jun6.net/alipay.png" width="200" height="312">
<img src="http://cdn.jun6.net/wechat.png" width="222" height="300">

View File

@@ -12,7 +12,7 @@
<groupId>im.zhaojun</groupId>
<artifactId>zfile</artifactId>
<version>2.3</version>
<version>2.5</version>
<name>zfile</name>
<packaging>war</packaging>
<description>一个在线的文件浏览系统</description>

View File

@@ -8,11 +8,13 @@ import im.zhaojun.zfile.service.impl.OneDriveChinaServiceImpl;
import im.zhaojun.zfile.service.impl.OneDriveServiceImpl;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpHeaders;
import org.springframework.http.client.ClientHttpRequestInterceptor;
import org.springframework.web.client.RestTemplate;
import javax.annotation.Resource;
import java.util.Collections;
import java.util.LinkedList;
/**
* @author zhaojun
@@ -38,18 +40,11 @@ public class OneDriveConfig {
RestTemplate restTemplate = new RestTemplate();
ClientHttpRequestInterceptor interceptor = (httpRequest, bytes, clientHttpRequestExecution) -> {
String host = httpRequest.getURI().getHost();
StorageTypeEnum type;
if (oneDriveChinaServiceImpl.getGraphEndPoint().contains(host)) {
type = StorageTypeEnum.ONE_DRIVE_CHINA;
} else if (oneDriveServiceImpl.getGraphEndPoint().contains(host)) {
type = StorageTypeEnum.ONE_DRIVE;
} else {
return clientHttpRequestExecution.execute(httpRequest, bytes);
}
HttpHeaders headers = httpRequest.getHeaders();
Integer driveId = Integer.valueOf(((LinkedList)headers.get("driveId")).get(0).toString());
StorageConfig accessTokenConfig =
storageConfigService.selectByTypeAndKey(type, StorageConfigConstant.ACCESS_TOKEN_KEY);
storageConfigService.findByDriveIdAndKey(driveId, StorageConfigConstant.ACCESS_TOKEN_KEY);
String tokenValue = String.format("%s %s", "Bearer", accessTokenConfig.getValue());
httpRequest.getHeaders().add("Authorization", tokenValue);

View File

@@ -63,6 +63,9 @@ public class GlobleExceptionHandler {
// }
}
/**
* 文件预览异常
*/
@ExceptionHandler({PreviewException.class})
@ResponseBody
@ResponseStatus
@@ -71,6 +74,18 @@ public class GlobleExceptionHandler {
}
/**
* 初始化异常
*/
@ExceptionHandler({InitializeException.class})
@ResponseBody
@ResponseStatus
public ResultBean initializeException(InitializeException ex) {
return ResultBean.error(ex.getMessage());
}
@ExceptionHandler
@ResponseBody

View File

@@ -12,7 +12,7 @@ public class StorageStrategyConfig {
private String pathStyle;
private boolean isPrivate;
private Boolean isPrivate;
private String accessKey;

View File

@@ -8,6 +8,7 @@ import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Lob;
/**
* @author zhaojun
@@ -27,7 +28,7 @@ public class StorageConfig {
private String title;
@Column(length = 4000)
@Lob
private String value;
private Integer driveId;

View File

@@ -56,16 +56,16 @@ public interface StorageConfigRepository extends JpaRepository<StorageConfig, In
/**
* 根据存储类型找到某个 KEY 的值
* 查找某个驱动器的某个 KEY 的值
*
* @param type
* 存储类型
* @param driveId
* 驱动器
*
* @param key
* KEY 值
*
* @return KEY 对应的对象
*/
StorageConfig findByTypeAndKey(StorageTypeEnum type, String key);
StorageConfig findByDriveIdAndKey(Integer driveId, String key);
}

View File

@@ -1,6 +1,8 @@
package im.zhaojun.zfile.service;
import im.zhaojun.zfile.context.StorageTypeContext;
import im.zhaojun.zfile.exception.InitializeException;
import im.zhaojun.zfile.model.constant.StorageConfigConstant;
import im.zhaojun.zfile.model.dto.DriveConfigDTO;
import im.zhaojun.zfile.model.dto.StorageStrategyConfig;
import im.zhaojun.zfile.model.entity.DriveConfig;
@@ -18,6 +20,7 @@ import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.lang.reflect.Field;
import java.util.List;
import java.util.Objects;
/**
* 驱动器 Service 类
@@ -86,7 +89,11 @@ public class DriveConfigService {
try {
declaredField = STORAGE_STRATEGY_CONFIG_CLASS.getDeclaredField(key);
declaredField.setAccessible(true);
declaredField.set(storageStrategyConfig, value);
if (Objects.equals(StorageConfigConstant.IS_PRIVATE, key)) {
declaredField.set(storageStrategyConfig, Boolean.valueOf(value));
} else {
declaredField.set(storageStrategyConfig, value);
}
} catch (NoSuchFieldException | IllegalAccessException e) {
if (log.isDebugEnabled()) {
log.debug("通过反射, 将字段 {" + key + "}注入 DriveConfigDTO 时出现异常:", e);
@@ -163,6 +170,11 @@ public class DriveConfigService {
storageConfigRepository.saveAll(storageConfigList);
driveContext.initDrive(driveConfig.getId());
AbstractBaseFileService driveService = driveContext.getDriveService(driveConfig.getId());
if (driveService.getIsUnInitialized()) {
throw new InitializeException("初始化异常, 请检查配置是否正确.");
}
}

View File

@@ -19,16 +19,19 @@ public class StorageConfigService {
@Resource
private StorageConfigRepository storageConfigRepository;
public List<StorageConfig> selectStorageConfigByType(StorageTypeEnum storageTypeEnum) {
return storageConfigRepository.findByTypeOrderById(storageTypeEnum);
}
public List<StorageConfig> selectStorageConfigByDriveId(Integer driveId) {
return storageConfigRepository.findByDriveIdOrderById(driveId);
}
public StorageConfig selectByTypeAndKey(StorageTypeEnum storageType, String key) {
return storageConfigRepository.findByTypeAndKey(storageType, key);
public StorageConfig findByDriveIdAndKey(Integer driveId, String key) {
return storageConfigRepository.findByDriveIdAndKey(driveId, key);
}
@@ -54,6 +57,4 @@ public class StorageConfigService {
storageConfigRepository.saveAll(storageConfigList);
}
}
}

View File

@@ -29,11 +29,11 @@ public abstract class AbstractBaseFileService implements BaseFileService {
*/
protected boolean isInitialized = false;
/**
* 基路径
*/
protected String basePath;
/**
* 驱动器 ID
*/

View File

@@ -4,7 +4,6 @@ import cn.hutool.core.util.URLUtil;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import im.zhaojun.zfile.model.constant.StorageConfigConstant;
@@ -18,13 +17,17 @@ import im.zhaojun.zfile.service.StorageConfigService;
import im.zhaojun.zfile.util.StringUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Lazy;
import org.springframework.http.ResponseEntity;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.MediaType;
import org.springframework.web.client.HttpClientErrorException;
import org.springframework.web.client.RestTemplate;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
/**
@@ -62,7 +65,7 @@ public abstract class AbstractOneDriveServiceBase extends AbstractBaseFileServic
*/
public OneDriveToken getRefreshToken() {
StorageConfig refreshStorageConfig =
storageConfigRepository.findByTypeAndKey(this.getStorageTypeEnum(), StorageConfigConstant.REFRESH_TOKEN_KEY);
storageConfigRepository.findByDriveIdAndKey(driveId, StorageConfigConstant.REFRESH_TOKEN_KEY);
String param = "client_id=" + getClientId() +
"&redirect_uri=" + getRedirectUri() +
@@ -124,18 +127,23 @@ public abstract class AbstractOneDriveServiceBase extends AbstractBaseFileServic
}
fullPath = StringUtils.removeLastSeparator(fullPath);
ResponseEntity<String> responseEntity;
JSONObject root;
HttpHeaders headers = new HttpHeaders();
headers.set("driveId", driveId.toString());
HttpEntity<Object> entity = new HttpEntity<>(headers);
try {
responseEntity = oneDriveRestTemplate.getForEntity(requestUrl, String.class, getGraphEndPoint(), fullPath);
root = oneDriveRestTemplate.exchange(requestUrl, HttpMethod.GET, entity, JSONObject.class, getGraphEndPoint(), fullPath).getBody();
} catch (HttpClientErrorException e) {
log.debug("调用 OneDrive 时出现了网络异常: {} , 已尝试重新刷新 token 后再试.", e.getMessage());
refreshOneDriveToken();
responseEntity = oneDriveRestTemplate.getForEntity(requestUrl, String.class, getGraphEndPoint(), fullPath);
root = oneDriveRestTemplate.exchange(requestUrl, HttpMethod.GET, entity, JSONObject.class, getGraphEndPoint(), fullPath).getBody();
}
String body = responseEntity.getBody();
JSONObject root = JSON.parseObject(body);
if (root == null) {
return Collections.emptyList();
}
nextLink = root.getString("@odata.nextLink");
@@ -171,10 +179,15 @@ public abstract class AbstractOneDriveServiceBase extends AbstractBaseFileServic
String requestUrl;
ResponseEntity<String> responseEntity = oneDriveRestTemplate.getForEntity(DRIVER_ITEM_URL, String.class, getGraphEndPoint(), fullPath);
String body = responseEntity.getBody();
HttpHeaders headers = new HttpHeaders();
headers.set("driveId", driveId.toString());
HttpEntity<Object> entity = new HttpEntity<>(headers);
JSONObject fileItem = JSON.parseObject(body);
JSONObject fileItem = oneDriveRestTemplate.exchange(DRIVER_ITEM_URL, HttpMethod.GET, entity, JSONObject.class, getGraphEndPoint(), fullPath).getBody();
if (fileItem == null) {
return null;
}
FileItemDTO fileItemDTO = new FileItemDTO();
fileItemDTO.setName(fileItem.getString("name"));
@@ -213,9 +226,9 @@ public abstract class AbstractOneDriveServiceBase extends AbstractBaseFileServic
}
StorageConfig accessTokenConfig =
storageConfigService.selectByTypeAndKey(this.getStorageTypeEnum(), StorageConfigConstant.ACCESS_TOKEN_KEY);
storageConfigService.findByDriveIdAndKey(driveId, StorageConfigConstant.ACCESS_TOKEN_KEY);
StorageConfig refreshTokenConfig =
storageConfigService.selectByTypeAndKey(this.getStorageTypeEnum(), StorageConfigConstant.REFRESH_TOKEN_KEY);
storageConfigService.findByDriveIdAndKey(driveId, StorageConfigConstant.REFRESH_TOKEN_KEY);
accessTokenConfig.setValue(refreshToken.getAccessToken());
refreshTokenConfig.setValue(refreshToken.getRefreshToken());

View File

@@ -93,6 +93,7 @@ public abstract class AbstractS3BaseFileService extends AbstractBaseFileService
* @return S3 对象访问地址
*/
public String s3ObjectUrl(String path) {
basePath = basePath == null ? "" : basePath;
String fullPath = StringUtils.removeFirstSeparator(StringUtils.removeDuplicateSeparator(basePath + "/" + path));
// 如果不是私有空间, 且指定了加速域名, 则直接返回下载地址.

View File

@@ -57,7 +57,7 @@ public class AliyunServiceImpl extends AbstractS3BaseFileService implements Base
isInitialized = testConnection();
}
} catch (Exception e) {
log.debug(getStorageTypeEnum().getDescription() + " 初始化异常, 已跳过");
log.debug(getStorageTypeEnum().getDescription() + " 初始化异常, 已跳过", e);
}
}
@@ -75,6 +75,7 @@ public class AliyunServiceImpl extends AbstractS3BaseFileService implements Base
add(new StorageConfig("domain", "Bucket 域名 / CDN 加速域名"));
add(new StorageConfig("endPoint", "区域"));
add(new StorageConfig("basePath", "基路径"));
add(new StorageConfig("isPrivate", "是否是私有空间"));
}};
}
}

View File

@@ -21,6 +21,7 @@ import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
@@ -63,12 +64,17 @@ public class LocalServiceImpl extends AbstractBaseFileService implements BaseFil
}
@Override
public List<FileItemDTO> fileList(String path) {
public List<FileItemDTO> fileList(String path) throws FileNotFoundException {
List<FileItemDTO> fileItemList = new ArrayList<>();
String fullPath = StringUtils.concatPath(filePath, path);
File file = new File(fullPath);
if (!file.exists()) {
throw new FileNotFoundException("文件不存在");
}
File[] files = file.listFiles();
if (files == null) {

View File

@@ -3,9 +3,12 @@ package im.zhaojun.zfile.util;
import im.zhaojun.zfile.exception.PreviewException;
import im.zhaojun.zfile.model.constant.ZFileConstant;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpHeaders;
import org.springframework.web.client.RestTemplate;
import java.io.IOException;
import java.net.URL;
import java.net.URLConnection;
/**
* @author zhaojun
*/
@@ -30,8 +33,17 @@ public class HttpUtil {
* 获取远程文件大小
*/
public static Long getRemoteFileSize(String url) {
HttpHeaders httpHeaders = new RestTemplate().headForHeaders(url);
return httpHeaders.getContentLength();
long size = 0;
URL urlObject;
try {
urlObject = new URL(url);
URLConnection conn = urlObject.openConnection();
size = conn.getContentLength();
} catch (IOException e) {
e.printStackTrace();
}
return size;
}
}

View File

@@ -1 +1 @@
.zfile-header[data-v-78021a72]{height:48px;line-height:48px!important;background:#fafafa;border-bottom:1px solid rgba(0,0,0,.05);padding-left:30px}.zfile-header .el-breadcrumb[data-v-78021a72],.zfile-header .el-input[data-v-78021a72]{line-height:48px}@media only screen and (max-width:767px){.hidden-xs-only{display:none!important}}@media only screen and (min-width:768px){.hidden-sm-and-up{display:none!important}}@media only screen and (min-width:768px) and (max-width:991px){.hidden-sm-only{display:none!important}}@media only screen and (max-width:991px){.hidden-sm-and-down{display:none!important}}@media only screen and (min-width:992px){.hidden-md-and-up{display:none!important}}@media only screen and (min-width:992px) and (max-width:1199px){.hidden-md-only{display:none!important}}@media only screen and (max-width:1199px){.hidden-md-and-down{display:none!important}}@media only screen and (min-width:1200px){.hidden-lg-and-up{display:none!important}}@media only screen and (min-width:1200px) and (max-width:1919px){.hidden-lg-only{display:none!important}}@media only screen and (max-width:1919px){.hidden-lg-and-down{display:none!important}}@media only screen and (min-width:1920px){.hidden-xl-only{display:none!important}}#List[data-v-39c0e91d]{overflow:hidden}.el-table[data-v-39c0e91d]{margin:20px 0 0 20px;padding-right:30px;overflow-y:hidden}.el-table[data-v-39c0e91d]:before{height:0}.el-table svg[data-v-39c0e91d]{font-size:18px;margin-right:15px}#ListTable[data-v-39c0e91d] .table-header-left{margin-left:38px}#ListTable[data-v-39c0e91d] tr{cursor:pointer}.el-scrollbar[data-v-39c0e91d] .el-scrollbar__wrap{overflow-x:hidden!important}#videoDialog[data-v-39c0e91d] .el-dialog__body{padding:10px 0 0 0}#List[data-v-39c0e91d] .el-dialog__header{text-align:center;margin-bottom:-10px;padding:5px 0 5px 0}#videoDialog[data-v-39c0e91d] .el-dialog__headerbtn{top:10px}#textDialog[data-v-39c0e91d] .el-dialog{margin-bottom:0}.v-contextmenu-item[data-v-39c0e91d] label{margin-left:10px}@media screen and (max-device-width:1920px){#videoDialog[data-v-39c0e91d] .el-dialog{margin-top:5vh!important;width:70%!important}}@media screen and (max-device-width:769px){#videoDialog[data-v-39c0e91d] .el-dialog{margin-top:10vh!important;width:90%!important}}.operator-btn[data-v-39c0e91d]{color:#1e9fff;margin-right:20px;font-size:16px}#app{font-family:Helvetica Neue,Helvetica,PingFang SC,Hiragino Sans GB,Microsoft YaHei,"\5FAE\8F6F\96C5\9ED1",Arial,sans-serif;font-size:16px;line-height:1.5;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;color:#2c3e50;overflow-x:hidden}body{margin:unset}.icon,body{overflow:hidden}.icon{width:1em;height:1em;vertical-align:-.15em;fill:currentColor}::-webkit-scrollbar{width:6px;height:8px;background:rgba(144,147,153,.3)}::-webkit-scrollbar-button:vertical{display:none}::-webkit-scrollbar-corner,::-webkit-scrollbar-track{background-color:#e2e2e2}::-webkit-scrollbar-thumb{border-radius:8px;background-color:#a6a6a6}::-webkit-scrollbar-thumb:vertical:hover{background-color:#7f7f7f}::-webkit-scrollbar-thumb:vertical:active{background-color:rgba(0,0,0,.38)}.center-box-card{width:1100px;margin:0 auto}.markdown-body{height:300px;overflow-y:auto;padding:0!important;min-width:100%!important}.alert{background-color:#f4f4f5;color:#909399;font-size:12px;margin:0 0 0;width:100%;padding:10px 16px;-webkit-box-sizing:border-box;box-sizing:border-box;border-radius:4px;position:relative;overflow:hidden;opacity:1;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-transition:opacity .2s;transition:opacity .2s}
.zfile-header[data-v-5fca0787]{height:48px;line-height:48px!important;background:#fafafa;border-bottom:1px solid rgba(0,0,0,.05);padding-left:30px}.zfile-header .el-breadcrumb[data-v-5fca0787],.zfile-header .el-input[data-v-5fca0787]{line-height:48px}@media only screen and (max-width:767px){.hidden-xs-only{display:none!important}}@media only screen and (min-width:768px){.hidden-sm-and-up{display:none!important}}@media only screen and (min-width:768px) and (max-width:991px){.hidden-sm-only{display:none!important}}@media only screen and (max-width:991px){.hidden-sm-and-down{display:none!important}}@media only screen and (min-width:992px){.hidden-md-and-up{display:none!important}}@media only screen and (min-width:992px) and (max-width:1199px){.hidden-md-only{display:none!important}}@media only screen and (max-width:1199px){.hidden-md-and-down{display:none!important}}@media only screen and (min-width:1200px){.hidden-lg-and-up{display:none!important}}@media only screen and (min-width:1200px) and (max-width:1919px){.hidden-lg-only{display:none!important}}@media only screen and (max-width:1919px){.hidden-lg-and-down{display:none!important}}@media only screen and (min-width:1920px){.hidden-xl-only{display:none!important}}#List[data-v-39c0e91d]{overflow:hidden}.el-table[data-v-39c0e91d]{margin:20px 0 0 20px;padding-right:30px;overflow-y:hidden}.el-table[data-v-39c0e91d]:before{height:0}.el-table svg[data-v-39c0e91d]{font-size:18px;margin-right:15px}#ListTable[data-v-39c0e91d] .table-header-left{margin-left:38px}#ListTable[data-v-39c0e91d] tr{cursor:pointer}.el-scrollbar[data-v-39c0e91d] .el-scrollbar__wrap{overflow-x:hidden!important}#videoDialog[data-v-39c0e91d] .el-dialog__body{padding:10px 0 0 0}#List[data-v-39c0e91d] .el-dialog__header{text-align:center;margin-bottom:-10px;padding:5px 0 5px 0}#videoDialog[data-v-39c0e91d] .el-dialog__headerbtn{top:10px}#textDialog[data-v-39c0e91d] .el-dialog{margin-bottom:0}.v-contextmenu-item[data-v-39c0e91d] label{margin-left:10px}@media screen and (max-device-width:1920px){#videoDialog[data-v-39c0e91d] .el-dialog{margin-top:5vh!important;width:70%!important}}@media screen and (max-device-width:769px){#videoDialog[data-v-39c0e91d] .el-dialog{margin-top:10vh!important;width:90%!important}}.operator-btn[data-v-39c0e91d]{color:#1e9fff;margin-right:20px;font-size:16px}#app{font-family:Helvetica Neue,Helvetica,PingFang SC,Hiragino Sans GB,Microsoft YaHei,"\5FAE\8F6F\96C5\9ED1",Arial,sans-serif;font-size:16px;line-height:1.5;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;color:#2c3e50;overflow-x:hidden}body{margin:unset}.icon,body{overflow:hidden}.icon{width:1em;height:1em;vertical-align:-.15em;fill:currentColor}::-webkit-scrollbar{width:6px;height:8px;background:rgba(144,147,153,.3)}::-webkit-scrollbar-button:vertical{display:none}::-webkit-scrollbar-corner,::-webkit-scrollbar-track{background-color:#e2e2e2}::-webkit-scrollbar-thumb{border-radius:8px;background-color:#a6a6a6}::-webkit-scrollbar-thumb:vertical:hover{background-color:#7f7f7f}::-webkit-scrollbar-thumb:vertical:active{background-color:rgba(0,0,0,.38)}.center-box-card{width:1100px;margin:0 auto}.markdown-body{height:300px;overflow-y:auto;padding:0!important;min-width:100%!important}.alert{background-color:#f4f4f5;color:#909399;font-size:12px;margin:0 0 0;width:100%;padding:10px 16px;-webkit-box-sizing:border-box;box-sizing:border-box;border-radius:4px;position:relative;overflow:hidden;opacity:1;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-transition:opacity .2s;transition:opacity .2s}

View File

@@ -1 +0,0 @@
.zfile-word-aux[data-v-78df1314]{margin-left:20px;color:#aaa}

View File

@@ -0,0 +1 @@
.zfile-word-aux[data-v-23fc179f]{margin-left:20px;color:#aaa}

View File

@@ -1 +1 @@
<!DOCTYPE html><html><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></title><link href=/css/chunk-02f22860.feb62c82.css rel=prefetch><link href=/css/chunk-049ad60c.8d1c3f59.css rel=prefetch><link href=/css/chunk-06f6e882.4c106b9d.css rel=prefetch><link href=/css/chunk-07a35882.0e88456f.css rel=prefetch><link href=/css/chunk-2136f455.1ba478f4.css rel=prefetch><link href=/css/chunk-227db9c4.091f6ac0.css rel=prefetch><link href=/css/chunk-361b31cc.434c5719.css rel=prefetch><link href=/css/chunk-4c69887f.7aac81e0.css rel=prefetch><link href=/css/chunk-5ba4ff2c.4f2ea9d1.css rel=prefetch><link href=/css/chunk-6a2760fc.50f63948.css rel=prefetch><link href=/css/chunk-8994d9ec.0904927b.css rel=prefetch><link href=/css/chunk-cf5906ce.d5432c19.css rel=prefetch><link href=/css/chunk-d1e104d6.ecae5695.css rel=prefetch><link href=/css/chunk-f1b5112e.d30178ad.css rel=prefetch><link href=/js/chunk-02f22860.1fa0c7f9.js rel=prefetch><link href=/js/chunk-049ad60c.0b1b3166.js rel=prefetch><link href=/js/chunk-06f6e882.fc195f68.js rel=prefetch><link href=/js/chunk-07a35882.781f33fb.js rel=prefetch><link href=/js/chunk-2136f455.e499e949.js rel=prefetch><link href=/js/chunk-227db9c4.0342e2c8.js rel=prefetch><link href=/js/chunk-2d0a43df.0bb25464.js rel=prefetch><link href=/js/chunk-2d0e57ec.56324ec2.js rel=prefetch><link href=/js/chunk-361b31cc.ec6b72b5.js rel=prefetch><link href=/js/chunk-4c69887f.a7bdc194.js rel=prefetch><link href=/js/chunk-5ba4ff2c.a18dfbcf.js rel=prefetch><link href=/js/chunk-6a2760fc.071a3677.js rel=prefetch><link href=/js/chunk-8994d9ec.06a73558.js rel=prefetch><link href=/js/chunk-cf5906ce.6b80535b.js rel=prefetch><link href=/js/chunk-d1e104d6.5ae45d97.js rel=prefetch><link href=/js/chunk-f1b5112e.c2c62934.js rel=prefetch><link href=/css/app.34f4cf05.css rel=preload as=style><link href=/css/chunk-vendors.1f2b3e18.css rel=preload as=style><link href=/js/app.9565e840.js rel=preload as=script><link href=/js/chunk-vendors.47b7f6a4.js rel=preload as=script><link href=/css/chunk-vendors.1f2b3e18.css rel=stylesheet><link href=/css/app.34f4cf05.css rel=stylesheet></head><body><noscript><strong>We're sorry but zfile doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id=app></div><script src=/js/chunk-vendors.47b7f6a4.js></script><script src=/js/app.9565e840.js></script></body></html>
<!DOCTYPE html><html><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></title><link href=/css/chunk-02f22860.feb62c82.css rel=prefetch><link href=/css/chunk-049ad60c.8d1c3f59.css rel=prefetch><link href=/css/chunk-06f6e882.4c106b9d.css rel=prefetch><link href=/css/chunk-07a35882.0e88456f.css rel=prefetch><link href=/css/chunk-2136f455.1ba478f4.css rel=prefetch><link href=/css/chunk-227db9c4.091f6ac0.css rel=prefetch><link href=/css/chunk-361b31cc.434c5719.css rel=prefetch><link href=/css/chunk-45cf82c0.2c8124b0.css rel=prefetch><link href=/css/chunk-4c69887f.7aac81e0.css rel=prefetch><link href=/css/chunk-6a2760fc.50f63948.css rel=prefetch><link href=/css/chunk-cf5906ce.d5432c19.css rel=prefetch><link href=/css/chunk-d1e104d6.ecae5695.css rel=prefetch><link href=/css/chunk-f1b5112e.d30178ad.css rel=prefetch><link href=/css/chunk-fe33dfa2.734c6a88.css rel=prefetch><link href=/js/chunk-02f22860.1fa0c7f9.js rel=prefetch><link href=/js/chunk-049ad60c.0b1b3166.js rel=prefetch><link href=/js/chunk-06f6e882.fc195f68.js rel=prefetch><link href=/js/chunk-07a35882.781f33fb.js rel=prefetch><link href=/js/chunk-2136f455.e499e949.js rel=prefetch><link href=/js/chunk-227db9c4.0342e2c8.js rel=prefetch><link href=/js/chunk-2d0a43df.0bb25464.js rel=prefetch><link href=/js/chunk-2d0e57ec.56324ec2.js rel=prefetch><link href=/js/chunk-361b31cc.ec6b72b5.js rel=prefetch><link href=/js/chunk-45cf82c0.8f119c4a.js rel=prefetch><link href=/js/chunk-4c69887f.a7bdc194.js rel=prefetch><link href=/js/chunk-6a2760fc.071a3677.js rel=prefetch><link href=/js/chunk-cf5906ce.6b80535b.js rel=prefetch><link href=/js/chunk-d1e104d6.5ae45d97.js rel=prefetch><link href=/js/chunk-f1b5112e.c2c62934.js rel=prefetch><link href=/js/chunk-fe33dfa2.d10222f1.js rel=prefetch><link href=/css/app.34f4cf05.css rel=preload as=style><link href=/css/chunk-vendors.1f2b3e18.css rel=preload as=style><link href=/js/app.aaaafead.js rel=preload as=script><link href=/js/chunk-vendors.47b7f6a4.js rel=preload as=script><link href=/css/chunk-vendors.1f2b3e18.css rel=stylesheet><link href=/css/app.34f4cf05.css rel=stylesheet></head><body><noscript><strong>We're sorry but zfile doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id=app></div><script src=/js/chunk-vendors.47b7f6a4.js></script><script src=/js/app.aaaafead.js></script></body></html>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long