Compare commits
9 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0f6d84dab2 | ||
|
|
f64eb395a8 | ||
|
|
2e69c67de0 | ||
|
|
7747b4e52e | ||
|
|
830622aafb | ||
|
|
2919950c5b | ||
|
|
d56cfbba82 | ||
|
|
cfe1924f11 | ||
|
|
dfd2ec45f4 |
@@ -1,7 +1,8 @@
|
||||
version: '3.3'
|
||||
services:
|
||||
orion-visor-service:
|
||||
image: registry.cn-hangzhou.aliyuncs.com/lijiahangmax/orion-visor-service:2.0.8
|
||||
image: registry.cn-hangzhou.aliyuncs.com/lijiahangmax/orion-visor-service:2.0.9
|
||||
privileged: true
|
||||
ports:
|
||||
- 1081:80
|
||||
environment:
|
||||
@@ -20,7 +21,7 @@ services:
|
||||
- orion-visor-mysql
|
||||
- orion-visor-redis
|
||||
orion-visor-mysql:
|
||||
image: registry.cn-hangzhou.aliyuncs.com/lijiahangmax/orion-visor-mysql:2.0.8
|
||||
image: registry.cn-hangzhou.aliyuncs.com/lijiahangmax/orion-visor-mysql:2.0.9
|
||||
privileged: true
|
||||
ports:
|
||||
- 3307:3306
|
||||
@@ -34,7 +35,7 @@ services:
|
||||
- /data/orion-visor-space/docker-volumes/orion-visor-mysql/var-lib-mysql-files:/var/lib/mysql-files
|
||||
- /data/orion-visor-space/docker-volumes/orion-visor-mysql/etc-mysql:/etc/mysql
|
||||
orion-visor-redis:
|
||||
image: registry.cn-hangzhou.aliyuncs.com/lijiahangmax/orion-visor-redis:2.0.8
|
||||
image: registry.cn-hangzhou.aliyuncs.com/lijiahangmax/orion-visor-redis:2.0.9
|
||||
privileged: true
|
||||
ports:
|
||||
- 6380:6379
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#/bin/bash
|
||||
version=2.0.8
|
||||
version=2.0.9
|
||||
cp -r ../../sql ./sql
|
||||
docker build -t orion-visor-mysql:${version} .
|
||||
rm -rf ./sql
|
||||
@@ -1,5 +1,5 @@
|
||||
#/bin/bash
|
||||
version=2.0.8
|
||||
version=2.0.9
|
||||
docker build -t orion-visor-redis:${version} .
|
||||
docker tag orion-visor-redis:${version} registry.cn-hangzhou.aliyuncs.com/lijiahangmax/orion-visor-redis:${version}
|
||||
docker push registry.cn-hangzhou.aliyuncs.com/lijiahangmax/orion-visor-redis:${version}
|
||||
@@ -8,6 +8,7 @@ RUN \
|
||||
sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories && \
|
||||
apk update && \
|
||||
apk add tzdata && \
|
||||
apk add dmidecode && \
|
||||
apk add openjdk8
|
||||
# 设置时区
|
||||
RUN ln -sf /usr/share/zoneinfo/${TZ} /etc/localtime && \
|
||||
@@ -1,5 +1,5 @@
|
||||
#/bin/bash
|
||||
version=2.0.8
|
||||
version=2.0.9
|
||||
mv ../../orion-visor-launch/target/orion-visor-launch.jar ./orion-visor-launch.jar
|
||||
mv ../../orion-visor-ui/dist ./dist
|
||||
docker build -t orion-visor-service:${version} .
|
||||
@@ -14,7 +14,7 @@
|
||||
<url>https://github.com/dromara/orion-visor</url>
|
||||
|
||||
<properties>
|
||||
<revision>2.0.8</revision>
|
||||
<revision>2.0.9</revision>
|
||||
<spring.boot.version>2.7.17</spring.boot.version>
|
||||
<spring.boot.admin.version>2.7.15</spring.boot.admin.version>
|
||||
<flatten.maven.plugin.version>1.5.0</flatten.maven.plugin.version>
|
||||
|
||||
@@ -14,9 +14,12 @@ public interface AppConst extends OrionConst {
|
||||
/**
|
||||
* 同 ${orion.version} 迭代时候需要手动更改
|
||||
*/
|
||||
String VERSION = "2.0.8";
|
||||
String VERSION = "2.0.9";
|
||||
|
||||
String ORION_VISOR = "orion-visor";
|
||||
/**
|
||||
* 同 ${spring.application.name}
|
||||
*/
|
||||
String APP_NAME = "orion-visor";
|
||||
|
||||
String GITHUB = "https://github.com/dromara/orion-visor";
|
||||
|
||||
|
||||
@@ -13,4 +13,8 @@ public interface CnConst {
|
||||
|
||||
String CN_ROLE = "角色";
|
||||
|
||||
String CN_UNKNOWN = "未知";
|
||||
|
||||
String CN_INTRANET_IP = "内网IP";
|
||||
|
||||
}
|
||||
|
||||
@@ -17,10 +17,6 @@ public interface Const extends com.orion.lang.constant.Const, FieldConst, CnCons
|
||||
|
||||
int MD5_LEN = 32;
|
||||
|
||||
String UNKNOWN = "未知";
|
||||
|
||||
String INTRANET_IP = "内网IP";
|
||||
|
||||
Long ROOT_PARENT_ID = 0L;
|
||||
|
||||
Integer DEFAULT_SORT = 10;
|
||||
|
||||
@@ -29,7 +29,7 @@ public class IpUtils {
|
||||
*/
|
||||
public static String getLocation(String ip) {
|
||||
if (ip == null) {
|
||||
return Const.UNKNOWN;
|
||||
return Const.CN_UNKNOWN;
|
||||
}
|
||||
// 查询缓存
|
||||
return CACHE.computeIfAbsent(ip, IpUtils::queryLocation);
|
||||
@@ -43,21 +43,21 @@ public class IpUtils {
|
||||
*/
|
||||
private static String queryLocation(String ip) {
|
||||
if (ip == null) {
|
||||
return Const.UNKNOWN;
|
||||
return Const.CN_UNKNOWN;
|
||||
}
|
||||
Region region;
|
||||
try {
|
||||
region = LocationRegions.getRegion(ip, 3);
|
||||
} catch (Exception e) {
|
||||
return Const.UNKNOWN;
|
||||
return Const.CN_UNKNOWN;
|
||||
}
|
||||
if (region != null) {
|
||||
String net = region.getNet();
|
||||
String province = region.getProvince();
|
||||
if (net.equals(Const.INTRANET_IP)) {
|
||||
if (net.equals(Const.CN_INTRANET_IP)) {
|
||||
return net;
|
||||
}
|
||||
if (province.equals(Const.UNKNOWN)) {
|
||||
if (province.equals(Const.CN_UNKNOWN)) {
|
||||
return province;
|
||||
}
|
||||
StringBuilder location = new StringBuilder()
|
||||
@@ -69,7 +69,7 @@ public class IpUtils {
|
||||
location.append(" (").append(net).append(')');
|
||||
return location.toString();
|
||||
}
|
||||
return Const.UNKNOWN;
|
||||
return Const.CN_UNKNOWN;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,38 @@
|
||||
package com.orion.visor.framework.common.utils;
|
||||
|
||||
import com.orion.lang.utils.Arrays1;
|
||||
import com.orion.lang.utils.crypto.Caesars;
|
||||
|
||||
/**
|
||||
* 混淆工具类
|
||||
*
|
||||
* @author Jiahang Li
|
||||
* @version 1.0.0
|
||||
* @since 2024/6/17 18:27
|
||||
*/
|
||||
public class Mixes {
|
||||
|
||||
private Mixes() {
|
||||
}
|
||||
|
||||
/**
|
||||
* 混淆
|
||||
* <p>
|
||||
* 此方法不可修改
|
||||
*
|
||||
* @param str str
|
||||
* @return str
|
||||
*/
|
||||
public static String obfuscate(String str) {
|
||||
char[] chars = str.toCharArray();
|
||||
Arrays1.reverse(chars);
|
||||
for (int i = 0; i < chars.length; i += 2) {
|
||||
char temp = chars[i];
|
||||
chars[i] = chars[i + 1];
|
||||
chars[i + 1] = temp;
|
||||
}
|
||||
String res = new String(chars);
|
||||
return new Caesars().encrypt(res);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -47,7 +47,7 @@ public class PathUtils {
|
||||
public static String getAppPath(boolean isWindows, String username) {
|
||||
return getHomePath(isWindows, username)
|
||||
+ "/" + AppConst.ORION
|
||||
+ "/" + AppConst.ORION_VISOR;
|
||||
+ "/" + AppConst.APP_NAME;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -51,7 +51,7 @@ public class BannerApplicationRunner implements ApplicationRunner {
|
||||
@Override
|
||||
public void run(ApplicationArguments args) {
|
||||
AnsiAppender appender = AnsiAppender.create()
|
||||
.append(AnsiForeground.BRIGHT_GREEN, ":: orion-visor-launch v" + version + " 服务已启动(" + env + ") ::\n");
|
||||
.append(AnsiForeground.BRIGHT_GREEN, ":: orion-visor v" + version + " 服务已启动(" + env + ") ::\n");
|
||||
// swagger 地址
|
||||
if (apiDocsEnabled) {
|
||||
appender.append(AnsiForeground.BRIGHT_GREEN, ":: swagger 文档 ")
|
||||
|
||||
@@ -3,7 +3,7 @@ server:
|
||||
|
||||
spring:
|
||||
application:
|
||||
name: orion-visor-launch
|
||||
name: orion-visor
|
||||
profiles:
|
||||
active: dev
|
||||
main:
|
||||
@@ -142,7 +142,7 @@ knife4j:
|
||||
|
||||
logging:
|
||||
file:
|
||||
path: ${user.home}/orion/logs/orion-visor
|
||||
path: ${user.home}/orion/logs/${spring.application.name}
|
||||
name: ${logging.file.path}/app.log
|
||||
logback:
|
||||
rollingpolicy:
|
||||
@@ -253,14 +253,14 @@ orion:
|
||||
timestamp-prefix: false
|
||||
date-directory: false
|
||||
storage-path: ${user.home}
|
||||
base-path: /orion/orion-visor/storage
|
||||
base-path: /orion/${spring.application.name}/storage
|
||||
# 日志文件存储
|
||||
logs:
|
||||
enabled: true
|
||||
timestamp-prefix: false
|
||||
date-directory: false
|
||||
storage-path: ${user.home}
|
||||
base-path: /orion/orion-visor/logs
|
||||
base-path: /orion/${spring.application.name}/logs
|
||||
security:
|
||||
password-encoder-length: 4
|
||||
# 匿名接口
|
||||
|
||||
@@ -109,6 +109,7 @@ public class CommandSnippetGroupServiceImpl implements CommandSnippetGroupServic
|
||||
.createWrapper()
|
||||
.select(CommandSnippetDO::getUserId, CommandSnippetDO::getGroupId)
|
||||
.isNotNull(CommandSnippetDO::getGroupId)
|
||||
.groupBy(CommandSnippetDO::getUserId)
|
||||
.groupBy(CommandSnippetDO::getGroupId)
|
||||
.then()
|
||||
.stream()
|
||||
|
||||
@@ -110,6 +110,7 @@ public class PathBookmarkGroupServiceImpl implements PathBookmarkGroupService {
|
||||
.select(PathBookmarkDO::getUserId, PathBookmarkDO::getGroupId)
|
||||
.isNotNull(PathBookmarkDO::getGroupId)
|
||||
.groupBy(PathBookmarkDO::getGroupId)
|
||||
.groupBy(PathBookmarkDO::getUserId)
|
||||
.then()
|
||||
.stream()
|
||||
.collect(Collectors.groupingBy(PathBookmarkDO::getUserId,
|
||||
|
||||
@@ -33,7 +33,7 @@ public class CommandSnippetGroupAutoClearTask {
|
||||
@Scheduled(cron = "0 10 2 * * ?")
|
||||
public void clear() {
|
||||
log.info("CommandSnippetGroupAutoClearTask.clear start");
|
||||
// 获取锁并清理
|
||||
// 获取锁并执行
|
||||
LockerUtils.tryLock(LOCK_KEY, commandSnippetGroupService::clearUnusedGroup);
|
||||
log.info("CommandSnippetGroupAutoClearTask.clear finish");
|
||||
}
|
||||
|
||||
@@ -51,7 +51,7 @@ public class ExecLogFileAutoClearTask {
|
||||
@Scheduled(cron = "0 0 3 * * ?")
|
||||
public void clear() {
|
||||
log.info("ExecLogFileAutoClearTask.clear start");
|
||||
// 获取锁并且执行
|
||||
// 获取锁并执行
|
||||
LockerUtils.tryLock(LOCK_KEY, this::doClearFile);
|
||||
log.info("ExecLogFileAutoClearTask.clear finish");
|
||||
}
|
||||
|
||||
@@ -33,7 +33,7 @@ public class PathBookmarkGroupAutoClearTask {
|
||||
@Scheduled(cron = "0 20 2 * * ?")
|
||||
public void clear() {
|
||||
log.info("PathBookmarkGroupAutoClearTask.clear start");
|
||||
// 获取锁并清理
|
||||
// 获取锁并执行
|
||||
LockerUtils.tryLock(LOCK_KEY, pathBookmarkGroupService::clearUnusedGroup);
|
||||
log.info("PathBookmarkGroupAutoClearTask.clear finish");
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package com.orion.visor.module.infra.controller;
|
||||
|
||||
import com.orion.visor.framework.log.core.annotation.IgnoreLog;
|
||||
import com.orion.visor.framework.web.core.annotation.RestWrapper;
|
||||
import com.orion.visor.module.infra.entity.request.preference.PreferenceUpdatePartialRequest;
|
||||
import com.orion.visor.module.infra.entity.request.preference.PreferenceUpdateRequest;
|
||||
@@ -56,6 +57,7 @@ public class PreferenceController {
|
||||
return preferenceService.getPreferenceByType(type, items);
|
||||
}
|
||||
|
||||
@IgnoreLog
|
||||
@GetMapping("/get-default")
|
||||
@Operation(summary = "查询默认偏好")
|
||||
@Parameter(name = "type", description = "type", required = true)
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
### 查询应用信息
|
||||
GET {{baseUrl}}/infra/system-setting/app-info
|
||||
Authorization: {{token}}
|
||||
|
||||
@@ -0,0 +1,45 @@
|
||||
package com.orion.visor.module.infra.controller;
|
||||
|
||||
import com.orion.visor.framework.log.core.annotation.IgnoreLog;
|
||||
import com.orion.visor.framework.log.core.enums.IgnoreLogMode;
|
||||
import com.orion.visor.framework.web.core.annotation.RestWrapper;
|
||||
import com.orion.visor.module.infra.entity.vo.AppInfoVO;
|
||||
import com.orion.visor.module.infra.service.SystemSettingService;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
|
||||
/**
|
||||
* 系统服务
|
||||
*
|
||||
* @author Jiahang Li
|
||||
* @version 1.0.0
|
||||
* @since 2023-7-17 11:39
|
||||
*/
|
||||
@Tag(name = "infra - 系统服务")
|
||||
@Slf4j
|
||||
@Validated
|
||||
@RestWrapper
|
||||
@RestController
|
||||
@RequestMapping("/infra/system-setting")
|
||||
@SuppressWarnings({"ELValidationInJSP", "SpringElInspection"})
|
||||
public class SystemSettingController {
|
||||
|
||||
@Resource
|
||||
private SystemSettingService systemSettingService;
|
||||
|
||||
@IgnoreLog(IgnoreLogMode.RET)
|
||||
@GetMapping("/app-info")
|
||||
@Operation(summary = "查询应用信息")
|
||||
public AppInfoVO getAppInfo() {
|
||||
return systemSettingService.getAppInfo();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,33 @@
|
||||
package com.orion.visor.module.infra.entity.vo;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* 应用信息 视图响应对象
|
||||
*
|
||||
* @author Jiahang Li
|
||||
* @version 1.0.0
|
||||
* @since 2023-7-18 10:18
|
||||
*/
|
||||
@Data
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
@Schema(name = "AppInfoVO", description = "应用信息 视图响应对象")
|
||||
public class AppInfoVO implements Serializable {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
@Schema(description = "系统版本")
|
||||
private String version;
|
||||
|
||||
@Schema(description = "机器码")
|
||||
private String uuid;
|
||||
|
||||
}
|
||||
@@ -28,7 +28,7 @@ public class TerminalPreferenceStrategy extends AbstractGenericsDataStrategy<Ter
|
||||
String defaultDisplaySetting = TerminalPreferenceModel.DisplaySettingModel
|
||||
.builder()
|
||||
.fontFamily("_")
|
||||
.fontSize(13)
|
||||
.fontSize(14)
|
||||
.lineHeight(1.12)
|
||||
.letterSpacing(0)
|
||||
.fontWeight("normal")
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
package com.orion.visor.module.infra.service;
|
||||
|
||||
import com.orion.visor.module.infra.entity.vo.AppInfoVO;
|
||||
|
||||
/**
|
||||
* 系统服务
|
||||
*
|
||||
* @author Jiahang Li
|
||||
* @version 1.0.0
|
||||
* @since 2024/6/17 18:10
|
||||
*/
|
||||
public interface SystemSettingService {
|
||||
|
||||
/**
|
||||
* 获取应用信息
|
||||
*
|
||||
* @return info
|
||||
*/
|
||||
AppInfoVO getAppInfo();
|
||||
|
||||
}
|
||||
@@ -0,0 +1,66 @@
|
||||
package com.orion.visor.module.infra.service.impl;
|
||||
|
||||
import com.orion.ext.process.Processes;
|
||||
import com.orion.lang.utils.Arrays1;
|
||||
import com.orion.lang.utils.Strings;
|
||||
import com.orion.visor.framework.common.constant.AppConst;
|
||||
import com.orion.visor.framework.common.constant.Const;
|
||||
import com.orion.visor.framework.common.utils.Mixes;
|
||||
import com.orion.visor.module.infra.entity.vo.AppInfoVO;
|
||||
import com.orion.visor.module.infra.service.SystemSettingService;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
/**
|
||||
* 系统服务 实现类
|
||||
*
|
||||
* @author Jiahang Li
|
||||
* @version 1.0.0
|
||||
* @since 2024/6/17 18:10
|
||||
*/
|
||||
@Service
|
||||
public class SystemSettingServiceImpl implements SystemSettingService {
|
||||
|
||||
private String uuid;
|
||||
|
||||
@Override
|
||||
public AppInfoVO getAppInfo() {
|
||||
return AppInfoVO.builder()
|
||||
.version(AppConst.VERSION)
|
||||
.uuid(this.getSystemUuid())
|
||||
.build();
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取系统 uuid
|
||||
*
|
||||
* @return uuid
|
||||
*/
|
||||
private String getSystemUuid() {
|
||||
if (this.uuid != null) {
|
||||
return this.uuid;
|
||||
}
|
||||
String[] cmd = new String[]{"cat /sys/class/dmi/id/product_serial", "dmidecode -s system-uuid", "wmic csproduct get uuid"};
|
||||
for (String s : cmd) {
|
||||
try {
|
||||
// 执行命令获取 uuid
|
||||
String uuid = Processes.getOutputResultString(s);
|
||||
if (Strings.isBlank(uuid)) {
|
||||
continue;
|
||||
}
|
||||
// 去除符号并且转为大写
|
||||
uuid = uuid.replaceAll(Const.DASHED, Const.EMPTY).toUpperCase();
|
||||
// 去除特殊字符
|
||||
String extraUuid = Arrays1.last(uuid.trim().split(Const.LF));
|
||||
if (!Strings.isBlank(extraUuid)) {
|
||||
uuid = extraUuid;
|
||||
}
|
||||
// 转义
|
||||
return this.uuid = Mixes.obfuscate(uuid);
|
||||
} catch (Exception e) {
|
||||
// IGNORED
|
||||
}
|
||||
}
|
||||
return this.uuid = Const.UNKNOWN;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -342,7 +342,7 @@ public class SystemUserServiceImpl implements SystemUserService {
|
||||
/**
|
||||
* 删除主要用户缓存 其他的缓存自动过期
|
||||
*
|
||||
* @param userList
|
||||
* @param userList userList
|
||||
*/
|
||||
private void deleteUserCacheKey(List<SystemUserDO> userList) {
|
||||
Set<String> deleteKeys = new HashSet<>();
|
||||
|
||||
@@ -33,7 +33,7 @@ public class TagAutoClearTask {
|
||||
@Scheduled(cron = "0 0 2 * * ?")
|
||||
public void clear() {
|
||||
log.info("TagAutoClearTask.clear start");
|
||||
// 获取锁并清理
|
||||
// 获取锁并执行
|
||||
LockerUtils.tryLock(LOCK_KEY, tagService::clearUnusedTag);
|
||||
log.info("TagAutoClearTask.clear finish");
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
VITE_API_BASE_URL= 'http://127.0.0.1:9200/orion-visor/api'
|
||||
VITE_WS_BASE_URL= 'ws://127.0.0.1:9200/orion-visor/keep-alive'
|
||||
VITE_APP_VERSION= '2.0.8'
|
||||
VITE_APP_RELEASE= 'Community'
|
||||
VITE_APP_VERSION= '2.0.9'
|
||||
VITE_APP_RELEASE= 'community'
|
||||
VITE_SFTP_PREVIEW_MB= 2
|
||||
VITE_DEMO_MODE= false
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
VITE_API_BASE_URL= '/orion-visor/api'
|
||||
VITE_WS_BASE_URL= '/orion-visor/keep-alive'
|
||||
VITE_APP_VERSION= '2.0.8'
|
||||
VITE_APP_RELEASE= 'Community'
|
||||
VITE_APP_VERSION= '2.0.9'
|
||||
VITE_APP_RELEASE= 'community'
|
||||
VITE_SFTP_PREVIEW_MB= 2
|
||||
VITE_DEMO_MODE= false
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "orion-visor-ui",
|
||||
"description": "Orion Visor UI",
|
||||
"version": "2.0.8",
|
||||
"version": "2.0.9",
|
||||
"private": true,
|
||||
"author": "Jiahang Li",
|
||||
"license": "Apache 2.0",
|
||||
@@ -32,7 +32,7 @@
|
||||
]
|
||||
},
|
||||
"dependencies": {
|
||||
"@arco-design/web-vue": "^2.55.0",
|
||||
"@arco-design/web-vue": "^2.55.3",
|
||||
"@dangojs/a-query-header": "^0.0.31",
|
||||
"@sanqi377/arco-vue-icon-picker": "^1.0.7",
|
||||
"@vueuse/core": "^9.3.0",
|
||||
|
||||
1674
orion-visor-ui/pnpm-lock.yaml
generated
1674
orion-visor-ui/pnpm-lock.yaml
generated
File diff suppressed because it is too large
Load Diff
@@ -13,7 +13,9 @@ export interface HttpResponse<T = unknown> {
|
||||
}
|
||||
|
||||
axios.defaults.timeout = 10000;
|
||||
axios.defaults.setAuthorization = true;
|
||||
axios.defaults.promptBizErrorMessage = true;
|
||||
axios.defaults.promptRequestErrorMessage = true;
|
||||
axios.defaults.baseURL = httpBaseUrl;
|
||||
|
||||
axios.interceptors.request.use(
|
||||
@@ -24,7 +26,10 @@ axios.interceptors.request.use(
|
||||
if (!config.headers) {
|
||||
config.headers = {};
|
||||
}
|
||||
config.headers.Authorization = `Bearer ${token}`;
|
||||
// 设置 Authorization 头
|
||||
if (config.setAuthorization === true) {
|
||||
config.headers.Authorization = `Bearer ${token}`;
|
||||
}
|
||||
}
|
||||
return config;
|
||||
},
|
||||
@@ -46,7 +51,7 @@ axios.interceptors.response.use(
|
||||
return res;
|
||||
}
|
||||
// 异常判断
|
||||
if ([401, 700, 701, 702].includes(code)) {
|
||||
if ([401, 700, 701, 702, 1000, 1001].includes(code)) {
|
||||
// 提示
|
||||
Message.error({
|
||||
content: res.msg || 'Error',
|
||||
@@ -60,7 +65,10 @@ axios.interceptors.response.use(
|
||||
window.sessionStorage.setItem(reLoginTipsKey, res.msg);
|
||||
}
|
||||
// 登出
|
||||
await useUserStore().logout();
|
||||
const responseUrl = response.request?.responseURL;
|
||||
if (!responseUrl || !responseUrl.includes('/logout')) {
|
||||
await useUserStore().logout();
|
||||
}
|
||||
// 重新加载自动跳转登录页面
|
||||
window.location.reload();
|
||||
});
|
||||
@@ -76,10 +84,13 @@ axios.interceptors.response.use(
|
||||
return Promise.reject(new Error(res.msg || 'Error'));
|
||||
},
|
||||
(error) => {
|
||||
Message.error({
|
||||
content: error.msg || '请求失败',
|
||||
duration: 5 * 1000,
|
||||
});
|
||||
// 判断是否弹出请求错误信息
|
||||
if (error.config.promptRequestErrorMessage) {
|
||||
Message.error({
|
||||
content: error.msg || '请求失败',
|
||||
duration: 5 * 1000,
|
||||
});
|
||||
}
|
||||
return Promise.reject(error);
|
||||
}
|
||||
);
|
||||
|
||||
39
orion-visor-ui/src/api/system/setting.ts
Normal file
39
orion-visor-ui/src/api/system/setting.ts
Normal file
@@ -0,0 +1,39 @@
|
||||
import axios from 'axios';
|
||||
|
||||
/**
|
||||
* 应用信息查询响应
|
||||
*/
|
||||
export interface AppInfoResponse {
|
||||
version: string;
|
||||
uuid: string;
|
||||
}
|
||||
|
||||
/**
|
||||
* 仓库版本信息查询响应
|
||||
*/
|
||||
export interface RepoReleaseResponse {
|
||||
tag_name: string;
|
||||
body: string;
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询应用信息
|
||||
*/
|
||||
export function getSystemAppInfo() {
|
||||
return axios.get<AppInfoResponse>('/infra/system-setting/app-info');
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取仓库最后版本信息
|
||||
*/
|
||||
export function getRepoLatestRelease() {
|
||||
// return axios.get<RepoReleaseResponse>('https://gitee.com/api/v5/repos/dromara/orion-visor/releases/latest', {
|
||||
return axios.get<RepoReleaseResponse>('https://lijiahangmax.github.io/open-orion/orion-visor/releases-latest.json', {
|
||||
// 不添加请求头 否则会报 401
|
||||
setAuthorization: false,
|
||||
// 返回原始输出
|
||||
unwrap: true,
|
||||
// 不提示请求错误信息 可能会 403
|
||||
promptRequestErrorMessage: false,
|
||||
});
|
||||
}
|
||||
@@ -548,7 +548,7 @@ body[terminal-theme='dark'] .arco-modal-container {
|
||||
|
||||
.terminal-setting-block {
|
||||
color: var(--color-content-text-2);
|
||||
margin-bottom: 24px;
|
||||
margin-bottom: 32px;
|
||||
}
|
||||
|
||||
.terminal-setting-subtitle-wrapper {
|
||||
|
||||
@@ -63,6 +63,7 @@ export const LogAppenderOptions: ITerminalOptions & ITerminalInitOnlyOptions = {
|
||||
lineHeight: 1.12,
|
||||
convertEol: true,
|
||||
allowProposedApi: true,
|
||||
fontFamily: 'Courier New, Monaco, courier, monospace',
|
||||
};
|
||||
|
||||
// dom 引用
|
||||
|
||||
@@ -52,8 +52,6 @@
|
||||
// 确定
|
||||
const handlerOk = () => {
|
||||
setVisible(false);
|
||||
console.log(cronExpression.value);
|
||||
console.log('ok', cronExpression.value);
|
||||
emits('ok', cronExpression.value);
|
||||
};
|
||||
|
||||
|
||||
@@ -21,6 +21,11 @@ const SYSTEM: AppRouteRecordRaw = {
|
||||
path: '/dict-value',
|
||||
component: () => import('@/views/system/dict-value/index.vue'),
|
||||
},
|
||||
{
|
||||
name: 'systemSetting',
|
||||
path: '/system-setting',
|
||||
component: () => import('@/views/system/setting/index.vue'),
|
||||
},
|
||||
],
|
||||
};
|
||||
|
||||
|
||||
4
orion-visor-ui/src/types/axios.d.ts
vendored
4
orion-visor-ui/src/types/axios.d.ts
vendored
@@ -4,9 +4,13 @@ import type { AxiosRequestConfig } from 'axios';
|
||||
declare module 'axios' {
|
||||
// eslint-disable-next-line no-shadow
|
||||
export interface AxiosRequestConfig {
|
||||
// 是否添加 Authorization
|
||||
setAuthorization?: boolean;
|
||||
// 是否使用原始返回
|
||||
unwrap?: boolean;
|
||||
// 是否提示业务错误信息
|
||||
promptBizErrorMessage?: boolean;
|
||||
// 是否提示请求错误信息
|
||||
promptRequestErrorMessage?: boolean;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -68,6 +68,7 @@
|
||||
await openLogWithId(Number.parseInt(keyParam as string));
|
||||
}
|
||||
});
|
||||
|
||||
</script>
|
||||
|
||||
<style lang="less" scoped>
|
||||
|
||||
126
orion-visor-ui/src/views/system/setting/components/about.vue
Normal file
126
orion-visor-ui/src/views/system/setting/components/about.vue
Normal file
@@ -0,0 +1,126 @@
|
||||
<template>
|
||||
<div class="main-container">
|
||||
<h3>关于 Orion Visor</h3>
|
||||
<!-- 不一致提示 -->
|
||||
<a-alert v-if="app.version && webVersion !== app.version"
|
||||
class="alert-wrapper">
|
||||
当前前端版本与后端版本不一致, 请使用 Ctrl + F5 刷新页面
|
||||
</a-alert>
|
||||
<!-- 升级提示 -->
|
||||
<a v-if="app.version && repo.tag_name && ('v' + app.version) !== repo.tag_name"
|
||||
class="alert-href"
|
||||
target="_blank"
|
||||
:href="`https://github.com/dromara/orion-visor/releases/tag/${repo.tag_name}`">
|
||||
<a-alert class="alert-wrapper">
|
||||
新版本已发布, 请及时升级版本
|
||||
</a-alert>
|
||||
</a>
|
||||
<!-- 系统信息 -->
|
||||
<a-descriptions class="detail-container"
|
||||
size="large"
|
||||
:align="{ label: 'right', value: 'left' }"
|
||||
:label-style="{ width: '134px' }"
|
||||
:column="1">
|
||||
<!-- 机器码 -->
|
||||
<a-descriptions-item label="机器码">
|
||||
<span class="text-copy span-blue uuid-wrapper" @click="copy(app.uuid, '已复制')">
|
||||
{{ app.uuid }}
|
||||
</span>
|
||||
</a-descriptions-item>
|
||||
<!-- 当前前端版本 -->
|
||||
<a-descriptions-item label="当前前端版本">
|
||||
{{ 'v' + webVersion }}
|
||||
</a-descriptions-item>
|
||||
<!-- 当前后端版本 -->
|
||||
<a-descriptions-item label="当前后端版本">
|
||||
{{ 'v' + app.version }}
|
||||
</a-descriptions-item>
|
||||
<!-- 当前后端版本 -->
|
||||
<a-descriptions-item label="最新发布版本">
|
||||
{{ repo.tag_name }}
|
||||
</a-descriptions-item>
|
||||
<!-- 当前后端版本 -->
|
||||
<a-descriptions-item label="最新更新日志">
|
||||
<a-textarea class="release-node"
|
||||
v-model="repo.body"
|
||||
:auto-size="{ minRows: 3, maxRows: 16 }"
|
||||
readonly>
|
||||
</a-textarea>
|
||||
</a-descriptions-item>
|
||||
</a-descriptions>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
export default {
|
||||
name: 'systemSettingAbout',
|
||||
};
|
||||
</script>
|
||||
|
||||
<script lang="ts" setup>
|
||||
import type { AppInfoResponse, RepoReleaseResponse } from '@/api/system/setting';
|
||||
import { onMounted, reactive } from 'vue';
|
||||
import { getRepoLatestRelease, getSystemAppInfo } from '@/api/system/setting';
|
||||
import { copy } from '@/hooks/copy';
|
||||
import { Message } from '@arco-design/web-vue';
|
||||
|
||||
const webVersion = import.meta.env.VITE_APP_VERSION;
|
||||
|
||||
const app = reactive<AppInfoResponse>({
|
||||
version: '',
|
||||
uuid: '',
|
||||
});
|
||||
|
||||
const repo = reactive<RepoReleaseResponse>({
|
||||
tag_name: '',
|
||||
body: '',
|
||||
});
|
||||
|
||||
// 加载应用信息
|
||||
onMounted(async () => {
|
||||
try {
|
||||
const { data } = await getSystemAppInfo();
|
||||
app.version = data.version;
|
||||
app.uuid = data.uuid;
|
||||
} catch (e) {
|
||||
}
|
||||
});
|
||||
|
||||
// 加载仓库信息
|
||||
onMounted(async () => {
|
||||
try {
|
||||
const { data } = await getRepoLatestRelease();
|
||||
repo.tag_name = data.tag_name;
|
||||
repo.body = data.body;
|
||||
} catch (e) {
|
||||
Message.error('获取仓库信息失败, 请等待后重试');
|
||||
}
|
||||
});
|
||||
|
||||
</script>
|
||||
|
||||
<style lang="less" scoped>
|
||||
@release-node-width: 528px;
|
||||
@label-width: 134px;
|
||||
|
||||
.main-container {
|
||||
padding-left: 16px;
|
||||
|
||||
.alert-href {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.alert-wrapper {
|
||||
width: @release-node-width + @label-width;
|
||||
margin-bottom: 12px;
|
||||
}
|
||||
|
||||
.uuid-wrapper {
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.release-node {
|
||||
width: @release-node-width;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
66
orion-visor-ui/src/views/system/setting/index.vue
Normal file
66
orion-visor-ui/src/views/system/setting/index.vue
Normal file
@@ -0,0 +1,66 @@
|
||||
<template>
|
||||
<div class="tabs-container">
|
||||
<a-tabs v-model:active-key="activeKey"
|
||||
type="rounded"
|
||||
size="medium"
|
||||
position="left"
|
||||
:lazy-load="true">
|
||||
<!-- 关于 -->
|
||||
<a-tab-pane key="about" title="关于">
|
||||
<about />
|
||||
</a-tab-pane>
|
||||
</a-tabs>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
export default {
|
||||
name: 'systemSetting'
|
||||
};
|
||||
</script>
|
||||
|
||||
<script lang="ts" setup>
|
||||
import { onBeforeMount, ref } from 'vue';
|
||||
import { useRoute } from 'vue-router';
|
||||
import About from './components/about.vue';
|
||||
|
||||
const route = useRoute();
|
||||
|
||||
const activeKey = ref('about');
|
||||
|
||||
// 跳转到指定页
|
||||
onBeforeMount(() => {
|
||||
const key = route.query.key;
|
||||
if (key) {
|
||||
activeKey.value = key as string;
|
||||
}
|
||||
});
|
||||
|
||||
</script>
|
||||
|
||||
<style lang="less" scoped>
|
||||
.tabs-container {
|
||||
background: var(--color-bg-2);
|
||||
margin: 16px;
|
||||
padding: 16px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
:deep(.arco-tabs-nav-tab-list) {
|
||||
width: 88px;
|
||||
}
|
||||
|
||||
:deep(.arco-tabs-pane) {
|
||||
border-left: 1px var(--color-neutral-3) solid;
|
||||
}
|
||||
|
||||
:deep(.arco-tabs-tab) {
|
||||
user-select: none;
|
||||
white-space: nowrap;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
</style>
|
||||
2
pom.xml
2
pom.xml
@@ -22,7 +22,7 @@
|
||||
</modules>
|
||||
|
||||
<properties>
|
||||
<revision>2.0.8</revision>
|
||||
<revision>2.0.9</revision>
|
||||
<maven.compiler.source>8</maven.compiler.source>
|
||||
<maven.compiler.target>8</maven.compiler.target>
|
||||
<maven.surefire.plugin.version>3.0.0-M5</maven.surefire.plugin.version>
|
||||
|
||||
@@ -292,10 +292,10 @@ INSERT INTO `dict_value` VALUES (298, 44, 'messageClassify', 'TODO', '待办', '
|
||||
|
||||
-- 菜单配置
|
||||
INSERT INTO `system_menu` VALUES (1, 0, '工作台', NULL, 1, 10, 1, 1, 1, 0, 'IconComputer', NULL, 'workplace', '2023-07-28 10:51:50', '2023-09-11 15:27:52', '1', '1', 0);
|
||||
INSERT INTO `system_menu` VALUES (5, 0, '用户设置', NULL, 1, 700, 1, 1, 1, 0, 'icon-user', NULL, 'userModule', '2023-07-28 10:55:38', '2024-04-03 00:56:30', '1', '1', 0);
|
||||
INSERT INTO `system_menu` VALUES (5, 0, '用户管理', NULL, 1, 700, 1, 1, 1, 0, 'icon-user', NULL, 'userModule', '2023-07-28 10:55:38', '2024-06-17 20:45:29', '1', '1', 0);
|
||||
INSERT INTO `system_menu` VALUES (8, 0, '项目地址', NULL, 1, 1000, 1, 1, 1, 0, 'icon-link', 'https://lijiahangmax.github.io/open-orion/orion-visor', '', '2023-07-28 11:04:59', '2024-05-31 17:13:12', '1', '1', 0);
|
||||
INSERT INTO `system_menu` VALUES (10, 5, '角色管理', NULL, 2, 10, 1, 1, 1, 0, 'IconUserGroup', '', 'role', '2023-07-28 10:55:52', '2024-03-07 19:10:13', '1', '1', 0);
|
||||
INSERT INTO `system_menu` VALUES (12, 0, '系统设置', NULL, 1, 800, 1, 1, 1, 0, 'icon-tool', NULL, 'systemModule', '2023-08-02 18:24:24', '2024-04-03 00:56:17', '1', '1', 0);
|
||||
INSERT INTO `system_menu` VALUES (12, 0, '系统管理', NULL, 1, 800, 1, 1, 1, 0, 'icon-tool', NULL, 'systemModule', '2023-08-02 18:24:24', '2024-06-17 20:45:39', '1', '1', 0);
|
||||
INSERT INTO `system_menu` VALUES (13, 12, '系统菜单', '', 2, 10, 1, 1, 1, 0, 'icon-menu', NULL, 'systemMenu', '2023-08-02 18:29:01', '2024-03-07 22:25:00', '1', '1', 0);
|
||||
INSERT INTO `system_menu` VALUES (20, 10, '创建角色', 'infra:system-role:create', 3, 10, 1, 1, 1, 0, NULL, NULL, NULL, '2023-08-15 16:36:54', '2023-10-27 01:20:46', '1', '1', 0);
|
||||
INSERT INTO `system_menu` VALUES (21, 10, '修改角色', 'infra:system-role:update', 3, 10, 1, 1, 1, 0, NULL, NULL, NULL, '2023-08-15 16:37:33', '2023-10-27 01:20:46', '1', '1', 0);
|
||||
@@ -409,3 +409,4 @@ INSERT INTO `system_menu` VALUES (199, 197, '上传文件', 'asset:upload-task:u
|
||||
INSERT INTO `system_menu` VALUES (200, 198, '查询上传日志', 'asset:upload-task:query', 3, 10, 1, 1, 1, 0, NULL, NULL, NULL, '2024-05-08 22:20:01', '2024-05-08 22:20:01', '1', '1', 0);
|
||||
INSERT INTO `system_menu` VALUES (201, 198, '删除上传日志', 'asset:upload-task:delete', 3, 20, 1, 1, 1, 0, NULL, NULL, NULL, '2024-05-08 22:20:26', '2024-05-08 22:20:26', '1', '1', 0);
|
||||
INSERT INTO `system_menu` VALUES (202, 198, '清理上传日志', 'asset:upload-task:management:clear', 3, 30, 1, 1, 1, 0, NULL, NULL, NULL, '2024-05-08 22:20:37', '2024-05-08 22:20:37', '1', '1', 0);
|
||||
INSERT INTO `system_menu` VALUES (203, 12, '系统设置', NULL, 2, 40, 1, 1, 1, 0, 'IconSettings', NULL, 'systemSetting', '2024-06-17 20:46:15', '2024-06-17 20:46:15', '1', '1', 0);
|
||||
|
||||
Reference in New Issue
Block a user