mirror of
https://github.com/zfile-dev/zfile.git
synced 2025-04-19 05:34:52 +00:00
Compare commits
10 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4585f22817 | ||
|
|
b523453588 | ||
|
|
a8cc03c911 | ||
|
|
949c437653 | ||
|
|
84e9cce60f | ||
|
|
5720bd93ec | ||
|
|
bcae9713bc | ||
|
|
04e3023071 | ||
|
|
a09ef84629 | ||
|
|
1d29395191 |
2
pom.xml
2
pom.xml
@@ -12,7 +12,7 @@
|
||||
|
||||
<groupId>im.zhaojun</groupId>
|
||||
<artifactId>zfile</artifactId>
|
||||
<version>2.4</version>
|
||||
<version>2.7</version>
|
||||
<name>zfile</name>
|
||||
<packaging>war</packaging>
|
||||
<description>一个在线的文件浏览系统</description>
|
||||
|
||||
19
src/main/java/im/zhaojun/zfile/cache/DriveCacheKey.java
vendored
Normal file
19
src/main/java/im/zhaojun/zfile/cache/DriveCacheKey.java
vendored
Normal file
@@ -0,0 +1,19 @@
|
||||
package im.zhaojun.zfile.cache;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
/**
|
||||
* @author zhaojun
|
||||
*/
|
||||
@Data
|
||||
@AllArgsConstructor
|
||||
@NoArgsConstructor
|
||||
public class DriveCacheKey {
|
||||
|
||||
private Integer driveId;
|
||||
|
||||
private String key;
|
||||
|
||||
}
|
||||
43
src/main/java/im/zhaojun/zfile/cache/MyTimedCache.java
vendored
Normal file
43
src/main/java/im/zhaojun/zfile/cache/MyTimedCache.java
vendored
Normal file
@@ -0,0 +1,43 @@
|
||||
package im.zhaojun.zfile.cache;
|
||||
|
||||
import cn.hutool.cache.impl.CacheObj;
|
||||
import cn.hutool.cache.impl.TimedCache;
|
||||
import im.zhaojun.zfile.context.DriveContext;
|
||||
import im.zhaojun.zfile.service.base.AbstractBaseFileService;
|
||||
import im.zhaojun.zfile.util.SpringContextHolder;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* @author zhaojun
|
||||
*/
|
||||
@Slf4j
|
||||
public class MyTimedCache<K, V> extends TimedCache<K, V> {
|
||||
|
||||
private DriveContext driveContext;
|
||||
|
||||
public MyTimedCache(long timeout) {
|
||||
super(timeout);
|
||||
}
|
||||
|
||||
public MyTimedCache(long timeout, Map<K, CacheObj<K, V>> map) {
|
||||
super(timeout, map);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onRemove(K key, V cachedObject) {
|
||||
log.debug("尝试刷新缓存: " + key);
|
||||
if (driveContext == null) {
|
||||
driveContext = SpringContextHolder.getBean(DriveContext.class);
|
||||
}
|
||||
DriveCacheKey cacheKey = (DriveCacheKey) key;
|
||||
AbstractBaseFileService baseFileService = driveContext.getDriveService(cacheKey.getDriveId());
|
||||
try {
|
||||
baseFileService.fileList(cacheKey.getKey());
|
||||
} catch (Exception e) {
|
||||
log.error("尝试刷新驱动器 {} 的 {} 失败, ", cacheKey.getDriveId(), cacheKey.getKey());
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,8 +1,6 @@
|
||||
package im.zhaojun.zfile.cache;
|
||||
|
||||
import cn.hutool.cache.CacheUtil;
|
||||
import cn.hutool.cache.impl.CacheObj;
|
||||
import cn.hutool.cache.impl.TimedCache;
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import im.zhaojun.zfile.model.constant.ZFileConstant;
|
||||
import im.zhaojun.zfile.model.dto.FileItemDTO;
|
||||
@@ -33,6 +31,9 @@ public class ZFileCache {
|
||||
@Value("${zfile.cache.timeout}")
|
||||
private long timeout;
|
||||
|
||||
@Value("${zfile.cache.auto-refresh.interval}")
|
||||
private long autoRefreshInterval;
|
||||
|
||||
|
||||
/**
|
||||
* 缓存 map 对象.
|
||||
@@ -44,7 +45,7 @@ public class ZFileCache {
|
||||
* key: 文件夹路径
|
||||
* value: 文件夹中内容
|
||||
*/
|
||||
private ConcurrentMap<Integer, TimedCache<String, List<FileItemDTO>>> drivesCache = new ConcurrentHashMap<>();
|
||||
private ConcurrentMap<Integer, MyTimedCache<DriveCacheKey, List<FileItemDTO>>> drivesCache = new ConcurrentHashMap<>();
|
||||
|
||||
/**
|
||||
* 系统设置缓存
|
||||
@@ -68,7 +69,7 @@ public class ZFileCache {
|
||||
* 文件夹中列表
|
||||
*/
|
||||
public synchronized void put(Integer driveId, String key, List<FileItemDTO> value) {
|
||||
getCacheByDriveId(driveId).put(key, value);
|
||||
getCacheByDriveId(driveId).put(new DriveCacheKey(driveId, key), value);
|
||||
}
|
||||
|
||||
|
||||
@@ -84,7 +85,7 @@ public class ZFileCache {
|
||||
* @return 驱动器中文件夹的内容
|
||||
*/
|
||||
public List<FileItemDTO> get(Integer driveId, String key) {
|
||||
return getCacheByDriveId(driveId).get(key, false);
|
||||
return getCacheByDriveId(driveId).get(new DriveCacheKey(driveId, key), false);
|
||||
}
|
||||
|
||||
|
||||
@@ -161,10 +162,10 @@ public class ZFileCache {
|
||||
* @return 所有缓存 key
|
||||
*/
|
||||
public Set<String> keySet(Integer driveId) {
|
||||
Iterator<CacheObj<String, List<FileItemDTO>>> cacheObjIterator = getCacheByDriveId(driveId).cacheObjIterator();
|
||||
Iterator<CacheObj<DriveCacheKey, List<FileItemDTO>>> cacheObjIterator = getCacheByDriveId(driveId).cacheObjIterator();
|
||||
Set<String> keys = new HashSet<>();
|
||||
while (cacheObjIterator.hasNext()) {
|
||||
keys.add(cacheObjIterator.next().getKey());
|
||||
keys.add(cacheObjIterator.next().getKey().getKey());
|
||||
}
|
||||
return keys;
|
||||
}
|
||||
@@ -180,7 +181,7 @@ public class ZFileCache {
|
||||
* 文件夹路径
|
||||
*/
|
||||
public void remove(Integer driveId, String key) {
|
||||
getCacheByDriveId(driveId).remove(key);
|
||||
getCacheByDriveId(driveId).remove(new DriveCacheKey(driveId, key));
|
||||
}
|
||||
|
||||
|
||||
@@ -241,14 +242,74 @@ public class ZFileCache {
|
||||
*
|
||||
* @return 驱动器对应的缓存
|
||||
*/
|
||||
private synchronized TimedCache<String, List<FileItemDTO>> getCacheByDriveId(Integer driveId) {
|
||||
TimedCache<String, List<FileItemDTO>> driveCache = drivesCache.get(driveId);
|
||||
private synchronized MyTimedCache<DriveCacheKey, List<FileItemDTO>> getCacheByDriveId(Integer driveId) {
|
||||
MyTimedCache<DriveCacheKey, List<FileItemDTO>> driveCache = drivesCache.get(driveId);
|
||||
if (driveCache == null) {
|
||||
driveCache = CacheUtil.newTimedCache(timeout * 1000);
|
||||
driveCache = new MyTimedCache<>(timeout * 1000);
|
||||
drivesCache.put(driveId, driveCache);
|
||||
startAutoCacheRefresh(driveId);
|
||||
}
|
||||
|
||||
return driveCache;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 获取指定驱动器的缓存命中数
|
||||
*
|
||||
* @param driveId
|
||||
* 驱动器 ID
|
||||
*
|
||||
* @return 缓存命中数
|
||||
*/
|
||||
public int getHitCount(Integer driveId) {
|
||||
return getCacheByDriveId(driveId).getHitCount();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 获取指定驱动器的缓存未命中数
|
||||
*
|
||||
* @param driveId
|
||||
* 驱动器 ID
|
||||
*
|
||||
* @return 缓存未命中数
|
||||
*/
|
||||
public int getMissCount(Integer driveId) {
|
||||
return getCacheByDriveId(driveId).getMissCount();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 开启缓存自动刷新, 仅当数据库设置为开启时, 才会真正开启缓存自动刷新.
|
||||
*
|
||||
* @param driveId
|
||||
* 驱动器 ID
|
||||
*/
|
||||
public void startAutoCacheRefresh(Integer driveId) {
|
||||
DriveConfig driveConfig = driverConfigRepository.findById(driveId).get();
|
||||
Boolean autoRefreshCache = driveConfig.getAutoRefreshCache();
|
||||
if (autoRefreshCache != null && autoRefreshCache) {
|
||||
MyTimedCache<DriveCacheKey, List<FileItemDTO>> driveCache = drivesCache.get(driveId);
|
||||
if (driveCache == null) {
|
||||
driveCache = new MyTimedCache<>(timeout * 1000);
|
||||
drivesCache.put(driveId, driveCache);
|
||||
}
|
||||
driveCache.schedulePrune(autoRefreshInterval * 1000);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 停止缓存自动刷新
|
||||
*
|
||||
* @param driveId
|
||||
* 驱动器 ID
|
||||
*/
|
||||
public void stopAutoCacheRefresh(Integer driveId) {
|
||||
MyTimedCache<DriveCacheKey, List<FileItemDTO>> driveCache = drivesCache.get(driveId);
|
||||
if (driveCache != null) {
|
||||
driveCache.cancelPruneSchedule();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -2,7 +2,6 @@ package im.zhaojun.zfile.config;
|
||||
|
||||
import im.zhaojun.zfile.model.constant.StorageConfigConstant;
|
||||
import im.zhaojun.zfile.model.entity.StorageConfig;
|
||||
import im.zhaojun.zfile.model.enums.StorageTypeEnum;
|
||||
import im.zhaojun.zfile.service.StorageConfigService;
|
||||
import im.zhaojun.zfile.service.impl.OneDriveChinaServiceImpl;
|
||||
import im.zhaojun.zfile.service.impl.OneDriveServiceImpl;
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
package im.zhaojun.zfile.controller.admin;
|
||||
|
||||
import im.zhaojun.zfile.model.dto.CacheInfoDTO;
|
||||
import im.zhaojun.zfile.model.dto.ResultBean;
|
||||
import im.zhaojun.zfile.service.DriveConfigService;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.PathVariable;
|
||||
import org.springframework.web.bind.annotation.PostMapping;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
@@ -21,17 +23,50 @@ public class CacheController {
|
||||
@Resource
|
||||
private DriveConfigService driveConfigService;
|
||||
|
||||
|
||||
@PostMapping("/{driveId}/enable")
|
||||
public ResultBean enableCache(@PathVariable("driveId") Integer driveId) {
|
||||
driveConfigService.updateCacheStatus(driveId, true);
|
||||
return ResultBean.success();
|
||||
}
|
||||
|
||||
|
||||
@PostMapping("/{driveId}/disable")
|
||||
public ResultBean disableCache(@PathVariable("driveId") Integer driveId) {
|
||||
driveConfigService.updateCacheStatus(driveId, false);
|
||||
return ResultBean.success();
|
||||
}
|
||||
|
||||
|
||||
@GetMapping("/{driveId}/info")
|
||||
public ResultBean cacheInfo(@PathVariable("driveId") Integer driveId) {
|
||||
CacheInfoDTO cacheInfo = driveConfigService.findCacheInfo(driveId);
|
||||
return ResultBean.success(cacheInfo);
|
||||
}
|
||||
|
||||
|
||||
@PostMapping("/{driveId}/refresh")
|
||||
public ResultBean refreshCache(@PathVariable("driveId") Integer driveId, String key) throws Exception {
|
||||
driveConfigService.refreshCache(driveId, key);
|
||||
return ResultBean.success();
|
||||
}
|
||||
|
||||
@PostMapping("/{driveId}/auto-refresh/start")
|
||||
public ResultBean enableAutoRefresh(@PathVariable("driveId") Integer driveId) {
|
||||
driveConfigService.startAutoCacheRefresh(driveId);
|
||||
return ResultBean.success();
|
||||
}
|
||||
|
||||
|
||||
@PostMapping("/{driveId}/auto-refresh/stop")
|
||||
public ResultBean disableAutoRefresh(@PathVariable("driveId") Integer driveId) {
|
||||
driveConfigService.stopAutoCacheRefresh(driveId);
|
||||
return ResultBean.success();
|
||||
}
|
||||
|
||||
@PostMapping("/{driveId}/clear")
|
||||
public ResultBean clearCache(@PathVariable("driveId") Integer driveId) {
|
||||
driveConfigService.clearCache(driveId);
|
||||
return ResultBean.success();
|
||||
}
|
||||
|
||||
}
|
||||
23
src/main/java/im/zhaojun/zfile/model/dto/CacheInfoDTO.java
Normal file
23
src/main/java/im/zhaojun/zfile/model/dto/CacheInfoDTO.java
Normal file
@@ -0,0 +1,23 @@
|
||||
package im.zhaojun.zfile.model.dto;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Data;
|
||||
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* @author zhaojun
|
||||
*/
|
||||
@Data
|
||||
@AllArgsConstructor
|
||||
public class CacheInfoDTO {
|
||||
|
||||
private Integer cacheCount;
|
||||
|
||||
private Integer hitCount;
|
||||
|
||||
private Integer missCount;
|
||||
|
||||
private Set<String> cacheKeys;
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
@@ -7,6 +7,7 @@ import javax.persistence.Entity;
|
||||
import javax.persistence.GeneratedValue;
|
||||
import javax.persistence.GenerationType;
|
||||
import javax.persistence.Id;
|
||||
import javax.persistence.Lob;
|
||||
|
||||
/**
|
||||
* @author zhaojun
|
||||
@@ -22,6 +23,7 @@ public class SystemConfig {
|
||||
@Column(name = "k")
|
||||
private String key;
|
||||
|
||||
@Lob
|
||||
private String value;
|
||||
|
||||
private String remark;
|
||||
|
||||
@@ -23,7 +23,7 @@ import java.util.List;
|
||||
@Configuration
|
||||
@EnableScheduling
|
||||
@Slf4j
|
||||
public class GlobalScheduleTask {
|
||||
public class OneDriveTokenRefreshSchedule {
|
||||
|
||||
@Resource
|
||||
private OneDriveServiceImpl oneDriveServiceImpl;
|
||||
@@ -1,8 +1,11 @@
|
||||
package im.zhaojun.zfile.service;
|
||||
|
||||
import im.zhaojun.zfile.cache.ZFileCache;
|
||||
import im.zhaojun.zfile.context.DriveContext;
|
||||
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.CacheInfoDTO;
|
||||
import im.zhaojun.zfile.model.dto.DriveConfigDTO;
|
||||
import im.zhaojun.zfile.model.dto.StorageStrategyConfig;
|
||||
import im.zhaojun.zfile.model.entity.DriveConfig;
|
||||
@@ -11,7 +14,6 @@ import im.zhaojun.zfile.model.enums.StorageTypeEnum;
|
||||
import im.zhaojun.zfile.repository.DriverConfigRepository;
|
||||
import im.zhaojun.zfile.repository.StorageConfigRepository;
|
||||
import im.zhaojun.zfile.service.base.AbstractBaseFileService;
|
||||
import im.zhaojun.zfile.context.DriveContext;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.BeanUtils;
|
||||
import org.springframework.stereotype.Service;
|
||||
@@ -21,6 +23,7 @@ import javax.annotation.Resource;
|
||||
import java.lang.reflect.Field;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* 驱动器 Service 类
|
||||
@@ -39,6 +42,9 @@ public class DriveConfigService {
|
||||
@Resource
|
||||
private DriveContext driveContext;
|
||||
|
||||
@Resource
|
||||
private ZFileCache zFileCache;
|
||||
|
||||
public static final Class<StorageStrategyConfig> STORAGE_STRATEGY_CONFIG_CLASS = StorageStrategyConfig.class;
|
||||
|
||||
/**
|
||||
@@ -60,7 +66,7 @@ public class DriveConfigService {
|
||||
* @return 驱动器设置
|
||||
*/
|
||||
public DriveConfig findById(Integer id) {
|
||||
return driverConfigRepository.getOne(id);
|
||||
return driverConfigRepository.findById(id).get();
|
||||
}
|
||||
|
||||
|
||||
@@ -137,6 +143,12 @@ public class DriveConfigService {
|
||||
BeanUtils.copyProperties(driveConfigDTO, driveConfig);
|
||||
driverConfigRepository.save(driveConfig);
|
||||
|
||||
if (driveConfig.getAutoRefreshCache()) {
|
||||
startAutoCacheRefresh(driveConfig.getId());
|
||||
} else {
|
||||
stopAutoCacheRefresh(driveConfig.getId());
|
||||
}
|
||||
|
||||
// 保存存储策略设置.
|
||||
StorageStrategyConfig storageStrategyConfig = driveConfigDTO.getStorageStrategyConfig();
|
||||
|
||||
@@ -221,4 +233,97 @@ public class DriveConfigService {
|
||||
driverConfigRepository.save(driveConfig);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 更新指定驱动器的缓存启用状态
|
||||
*
|
||||
* @param driveId
|
||||
* 驱动器 ID
|
||||
*
|
||||
* @param autoRefreshCache
|
||||
* 是否启用缓存自动刷新
|
||||
*/
|
||||
public void updateAutoRefreshCacheStatus(Integer driveId, Boolean autoRefreshCache) {
|
||||
DriveConfig driveConfig = findById(driveId);
|
||||
if (driveConfig != null) {
|
||||
driveConfig.setAutoRefreshCache(autoRefreshCache);
|
||||
driverConfigRepository.save(driveConfig);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 获取指定驱动器的缓存信息
|
||||
* @param driveId
|
||||
* 驱动器 ID
|
||||
* @return 缓存信息
|
||||
*/
|
||||
public CacheInfoDTO findCacheInfo(Integer driveId) {
|
||||
int hitCount = zFileCache.getHitCount(driveId);
|
||||
int missCount = zFileCache.getMissCount(driveId);
|
||||
Set<String> keys = zFileCache.keySet(driveId);
|
||||
int cacheCount = keys.size();
|
||||
return new CacheInfoDTO(cacheCount, hitCount, missCount, keys);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 刷新指定 key 的缓存:
|
||||
* 1. 清空此 key 的缓存.
|
||||
* 2. 重新调用方法写入缓存.
|
||||
*
|
||||
* @param driveId
|
||||
* 驱动器 ID
|
||||
*
|
||||
* @param key
|
||||
* 缓存 key (文件夹名称)
|
||||
*/
|
||||
public void refreshCache(Integer driveId, String key) throws Exception {
|
||||
zFileCache.remove(driveId, key);
|
||||
AbstractBaseFileService baseFileService = driveContext.getDriveService(driveId);
|
||||
baseFileService.fileList(key);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 开启缓存自动刷新, 仅当数据库设置为开启时, 才会真正开启缓存自动刷新.
|
||||
*
|
||||
* @param driveId
|
||||
* 驱动器 ID
|
||||
*/
|
||||
public void startAutoCacheRefresh(Integer driveId) {
|
||||
DriveConfig driveConfig = findById(driveId);
|
||||
driveConfig.setAutoRefreshCache(true);
|
||||
driverConfigRepository.save(driveConfig);
|
||||
zFileCache.startAutoCacheRefresh(driveId);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 停止缓存自动刷新
|
||||
*
|
||||
* @param driveId
|
||||
* 驱动器 ID
|
||||
*/
|
||||
public void stopAutoCacheRefresh(Integer driveId) {
|
||||
DriveConfig driveConfig = findById(driveId);
|
||||
driveConfig.setAutoRefreshCache(false);
|
||||
driverConfigRepository.save(driveConfig);
|
||||
zFileCache.stopAutoCacheRefresh(driveId);
|
||||
}
|
||||
|
||||
/**
|
||||
* 清理缓存
|
||||
*
|
||||
* @param driveId
|
||||
* 驱动器 ID
|
||||
*/
|
||||
public void clearCache(Integer driveId) {
|
||||
zFileCache.clear(driveId);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -140,21 +140,6 @@ public abstract class AbstractBaseFileService implements BaseFileService {
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 刷新指定 key 的缓存:
|
||||
* 1. 清空此 key 的缓存.
|
||||
* 2. 重新调用方法写入缓存.
|
||||
*
|
||||
* @param key
|
||||
* 缓存 key (文件夹名称)
|
||||
*/
|
||||
public void refreshCache(String key) throws Exception {
|
||||
zFileCache.remove(driveId, key);
|
||||
BaseFileService currentFileService = (BaseFileService) AopContext.currentProxy();
|
||||
currentFileService.fileList(key);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 获取单个文件信息
|
||||
*
|
||||
|
||||
@@ -5,20 +5,10 @@
|
||||
"type": "java.lang.Long",
|
||||
"description": "目录缓存过期时间 和 下载地址过期时间. 单位为秒."
|
||||
},
|
||||
{
|
||||
"name": "zfile.cache.auto-refresh.enable",
|
||||
"type": "java.lang.Boolean",
|
||||
"description": "是否开启自动刷新缓存."
|
||||
},
|
||||
{
|
||||
"name": "zfile.cache.auto-refresh.delay",
|
||||
"type": "java.lang.Long",
|
||||
"description": "启动项目后多久开始自动刷新缓存, 推荐与 interval 一致, 因为项目启动时会缓存所有文件. 单位为秒.."
|
||||
},
|
||||
{
|
||||
"name": "zfile.cache.auto-refresh.interval",
|
||||
"type": "java.lang.Long",
|
||||
"description": "任务间隔时间, 也就是每多长时间会自动刷新缓存一次.."
|
||||
"description": "任务间隔时间, 每隔多长时间检测一次到期的缓存 KEY 并自动刷新, 单位为秒."
|
||||
},
|
||||
{
|
||||
"name": "zfile.constant.readme",
|
||||
|
||||
@@ -51,10 +51,8 @@ spring:
|
||||
|
||||
zfile:
|
||||
cache:
|
||||
# auto-refresh: # 新版本尚未实现此功能
|
||||
# enable: true # 是否开启自动刷新缓存.
|
||||
# delay: 1800 # 启动项目后多久开始自动刷新缓存, 推荐与 interval 一致, 因为项目启动时会缓存所有文件.
|
||||
# interval: 1800 # 任务间隔时间, 也就是每多长时间会自动刷新缓存一次.
|
||||
auto-refresh:
|
||||
interval: 1
|
||||
timeout: 1800
|
||||
constant:
|
||||
readme: readme.md
|
||||
|
||||
File diff suppressed because one or more lines are too long
1
src/main/resources/static/css/app.5b36629d.css
Normal file
1
src/main/resources/static/css/app.5b36629d.css
Normal file
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
.zfile-word-aux[data-v-366efa36]{margin-left:20px;color:#aaa}.el-row[data-v-366efa36]{padding:20px}.el-form-item[data-v-366efa36]{margin-right:50px}.card-title[data-v-366efa36]{color:rgba(0,0,0,.45);font-size:14px}.card-content[data-v-366efa36]{color:rgba(0,0,0,.85);font-size:25px;line-height:30px}.card-title-button[data-v-366efa36]{float:right;padding:3px 0}.table-search-input[data-v-366efa36]{width:300px;float:right}
|
||||
@@ -0,0 +1 @@
|
||||
.zfile-header[data-v-ef6a667c]{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-ef6a667c],.zfile-header .el-input[data-v-ef6a667c]{line-height:48px}@media only screen and (max-width:767px){.hidden-xs-only,.zfile-header[data-v-ef6a667c] .el-breadcrumb__separator{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-2ebcb9db]{overflow:hidden}.el-table[data-v-2ebcb9db]{margin:20px 0 0 20px;padding-right:30px;overflow-y:hidden}.el-table[data-v-2ebcb9db]:before{height:0}.el-table svg[data-v-2ebcb9db]{font-size:18px;margin-right:15px}#ListTable[data-v-2ebcb9db] .table-header-left{margin-left:38px}#ListTable[data-v-2ebcb9db] tr{cursor:pointer}.el-scrollbar[data-v-2ebcb9db] .el-scrollbar__wrap{overflow-x:hidden!important}#videoDialog[data-v-2ebcb9db] .el-dialog__body{padding:10px 0 0 0}#List[data-v-2ebcb9db] .el-dialog__header{text-align:center;margin-bottom:-10px;padding:5px 0 5px 0}#videoDialog[data-v-2ebcb9db] .el-dialog__headerbtn{top:10px}#textDialog[data-v-2ebcb9db] .el-dialog{margin-bottom:0}.v-contextmenu-item[data-v-2ebcb9db] label{margin-left:10px}@media screen and (max-device-width:1920px){#videoDialog[data-v-2ebcb9db] .el-dialog{margin-top:5vh!important;width:70%!important}}@media screen and (max-device-width:769px){#videoDialog[data-v-2ebcb9db] .el-dialog{margin-top:10vh!important;width:90%!important}}.operator-btn[data-v-2ebcb9db]{color:#1e9fff;margin-right:20px;font-size:16px}#app{font-family:Lato,PingFang SC,Microsoft YaHei,sans-serif!important;font-size:16px;line-height:1.5;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;color:#555;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}
|
||||
@@ -1 +0,0 @@
|
||||
.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}
|
||||
@@ -1 +0,0 @@
|
||||
.zfile-word-aux[data-v-6b54edde]{margin-left:20px;color:#aaa}
|
||||
@@ -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-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-e753ba4a.ccd07028.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-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-e753ba4a.79e89cf6.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.cf7e02ab.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.cf7e02ab.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-0c0c8e9d.23779f1a.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-3c6c901f.eb4ff553.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=/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-0c0c8e9d.b25ede58.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-3c6c901f.fc3b62cc.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=/css/app.5b36629d.css rel=preload as=style><link href=/css/chunk-vendors.1f2b3e18.css rel=preload as=style><link href=/js/app.4a511f1d.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.5b36629d.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.4a511f1d.js></script></body></html>
|
||||
File diff suppressed because one or more lines are too long
1
src/main/resources/static/js/chunk-0c0c8e9d.b25ede58.js
Normal file
1
src/main/resources/static/js/chunk-0c0c8e9d.b25ede58.js
Normal file
File diff suppressed because one or more lines are too long
1
src/main/resources/static/js/chunk-3c6c901f.fc3b62cc.js
Normal file
1
src/main/resources/static/js/chunk-3c6c901f.fc3b62cc.js
Normal file
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
Reference in New Issue
Block a user