Compare commits

..

39 Commits

Author SHA1 Message Date
李佳航
0de59dd77d Merge pull request #70 from dromara/dev
Dev
2024-12-10 09:58:59 +08:00
lijiahang
d0b25c38a6 Merge remote-tracking branch 'origin/dev' into dev 2024-12-09 15:28:11 +08:00
lijiahang
9fe2531d2f 📝 修改介绍. 2024-12-09 15:28:03 +08:00
lijiahangmax
28ce2317c0 merge dev into dev
合并

Created-by: liushaoshuai
Author-id: 3003091
MR-id: 5446172
Commit-by: liushaoshuai
Merged-by: lijiahangmax
E2E-issues: 
Description: ⬆️ 升级 orion-kit 版本. 

See merge request: dromara/orion-visor!15
2024-12-09 15:25:26 +08:00
liushaoshuai
f38ae06fa0 ⬆️ 升级 orion-kit 版本.
Signed-off-by: liushaoshuai <liushaoshuai@noreply.gitcode.com>
2024-12-09 15:23:27 +08:00
lijiahangmax
e434d85ea5 merge dev into dev
修改文档

Created-by: liushaoshuai
Author-id: 3003091
MR-id: 5361842
Commit-by: liushaoshuai
Merged-by: lijiahangmax
E2E-issues: 
Description: 📝修改文档. 

See merge request: dromara/orion-visor!14
2024-12-06 13:59:08 +08:00
liushaoshuai
d303406332 📝修改文档.
Signed-off-by: liushaoshuai <liushaoshuai@noreply.gitcode.com>
2024-12-06 13:58:09 +08:00
lijiahangmax
952d63b282 merge dev into dev
PR#1

Created-by: SuperOwn
Author-id: 3000065
MR-id: 5350395
Commit-by: SuperOwn
Merged-by: lijiahangmax
E2E-issues: 
Description: 🔖 升级版本. 

See merge request: dromara/orion-visor!13
2024-12-06 12:11:59 +08:00
SuperOwn
cffb3c9e90 🔖 升级版本.
Signed-off-by: SuperOwn <SuperOwn@noreply.gitcode.com>
2024-12-06 12:10:56 +08:00
lijiahangmax
d828d4a754 merge dev into dev
升级版本

Created-by: orionsec
Author-id: 3000702
MR-id: 5345512
Commit-by: orionsec
Merged-by: lijiahangmax
E2E-issues: 
Description: 🔖 升级版本. 

See merge request: dromara/orion-visor!12
2024-12-06 11:41:29 +08:00
orionsec
30ff601078 🔖 升级版本.
Signed-off-by: orionsec <orionsec@noreply.gitcode.com>
2024-12-06 11:40:36 +08:00
lijiahangmax
eb18f4281a merge dev into dev
禁用缓存

Created-by: orionsec
Author-id: 3000702
MR-id: 5345037
Commit-by: orionsec
Merged-by: lijiahangmax
E2E-issues: 
Description: 🔖 升级版本. 
🐳 禁用缓存. 

See merge request: dromara/orion-visor!11
2024-12-06 11:37:45 +08:00
orionsec
b850aa1f7f 🐳 禁用缓存.
Signed-off-by: orionsec <orionsec@noreply.gitcode.com>
2024-12-06 11:36:50 +08:00
orionsec
100b5e8740 🔖 升级版本.
Signed-off-by: orionsec <orionsec@noreply.gitcode.com>
2024-12-06 11:36:25 +08:00
lijiahangmax
148d9f1201 merge dev into dev
PR

Created-by: orionsec
Author-id: 3000702
MR-id: 5344615
Commit-by: orionsec
Merged-by: lijiahangmax
E2E-issues: 
Description: 🔖 升级版本. 

See merge request: dromara/orion-visor!10
2024-12-06 11:33:29 +08:00
orionsec
88ddc7c4b2 🔖 升级版本.
Signed-off-by: orionsec <orionsec@noreply.gitcode.com>
2024-12-06 11:31:10 +08:00
lijiahangmax
4a2c01fba6 merge dev into dev
merge

Created-by: SuperOwn
Author-id: 3000065
MR-id: 5343257
Commit-by: SuperOwn
Merged-by: lijiahangmax
E2E-issues: 
Description: 🔖 升级版本. 

See merge request: dromara/orion-visor!8
2024-12-06 11:20:14 +08:00
SuperOwn
45c83f6080 🔖 升级版本.
Signed-off-by: SuperOwn <SuperOwn@noreply.gitcode.com>
2024-12-06 11:19:27 +08:00
lijiahangmax
08a0eeb6b5 merge dev into dev
修改版本

Created-by: SuperOwn
Author-id: 3000065
MR-id: 5343027
Commit-by: SuperOwn
Merged-by: lijiahangmax
E2E-issues: 
Description: 🔖 升级版本. 

See merge request: dromara/orion-visor!7
2024-12-06 11:18:31 +08:00
SuperOwn
73b034b27c 🔖 升级版本.
Signed-off-by: SuperOwn <SuperOwn@noreply.gitcode.com>
2024-12-06 11:16:06 +08:00
lijiahang
95a31d613d Merge remote-tracking branch 'origin/dev' into dev 2024-12-06 10:53:44 +08:00
lijiahangmax
8027d39938 merge dev into dev
merge

Created-by: chaoyuyu
Author-id: 2987168
MR-id: 5338562
Commit-by: chaoyuyu
Merged-by: lijiahangmax
E2E-issues: 
Description: update: 更新文件 build.sh 

See merge request: dromara/orion-visor!5
2024-12-06 10:51:33 +08:00
chaoyuyu
e3d33295fe update: 更新文件 build.sh
Signed-off-by: chaoyuyu <chaoyuyu@noreply.gitcode.com>
2024-12-06 10:46:09 +08:00
lijiahangmax
691c61613f merge dev into dev
合并

Created-by: opensources
Author-id: 2983898
MR-id: 5338447
Commit-by: opensources
Merged-by: lijiahangmax
E2E-issues: 
Description: 🐳 修改 docker 版本. 
🔖 升级版本. 

See merge request: dromara/orion-visor!4
2024-12-06 10:42:56 +08:00
opensources
a75ce2143d 🔖 升级版本.
Signed-off-by: opensources <opensources@noreply.gitcode.com>
2024-12-06 10:35:37 +08:00
opensources
cb828e5684 🐳 修改 docker 版本.
Signed-off-by: opensources <opensources@noreply.gitcode.com>
2024-12-06 10:34:30 +08:00
lijiahangmax
168f193416 merge dev into dev
修改 docker

Created-by: opensources
Author-id: 2983898
MR-id: 5338443
Commit-by: opensources
Merged-by: lijiahangmax
E2E-issues: 
Description: 🐳 修改版本. 

See merge request: dromara/orion-visor!3
2024-12-06 10:32:00 +08:00
opensources
211a50d33d 🐳 修改版本.
Signed-off-by: opensources <opensources@noreply.gitcode.com>
2024-12-06 10:31:17 +08:00
lijiahangmax
713af9d032 merge dev into dev
升级版本

Created-by: chaoyuyu
Author-id: 2987168
MR-id: 5338426
Commit-by: chaoyuyu
Merged-by: lijiahangmax
E2E-issues: 
Description: 🔖 升级版本. 

See merge request: dromara/orion-visor!2
2024-12-06 10:29:14 +08:00
chaoyuyu
214b6fe9ac 🔖 升级版本.
Signed-off-by: chaoyuyu <chaoyuyu@noreply.gitcode.com>
2024-12-06 10:25:02 +08:00
lijiahangmax
343c188749 merge dev into dev
merge

Created-by: Hanner
Author-id: 2987512
MR-id: 5338327
Commit-by: Hanner
Merged-by: lijiahangmax
E2E-issues: 
Description: 🔖 升级版本. 
update: 更新文件 pom.xml 
🔖 升级版本. 

See merge request: dromara/orion-visor!1
2024-12-06 10:14:32 +08:00
Hanner
fc6418caf3 🔖 升级版本.
Signed-off-by: Hanner <Hanner@noreply.gitcode.com>
2024-12-06 10:11:51 +08:00
Hanner
cf093e1023 update: 更新文件 pom.xml
Signed-off-by: Hanner <Hanner@noreply.gitcode.com>
2024-12-06 10:10:27 +08:00
Hanner
90eb6003c9 🔖 升级版本.
Signed-off-by: Hanner <Hanner@noreply.gitcode.com>
2024-12-06 10:08:54 +08:00
lijiahang
652691b32b 📝 修改 README. 2024-12-04 11:37:36 +08:00
lijiahang
eb77f33574 去除轮询接口错误信息. 2024-12-03 11:28:58 +08:00
lijiahang
9bfd5888bf 修改代码生成器. 2024-11-25 10:23:40 +08:00
lijiahang
73c18c79b8 🐛 计划任务创建后会自动执行. 2024-11-13 10:00:25 +08:00
lijiahang
562052b868 优化前端代码语义. 2024-11-07 10:46:17 +08:00
58 changed files with 199 additions and 352 deletions

View File

@@ -1,5 +1,5 @@
<div align="center"><img src="https://bjuimg.obs.cn-north-4.myhuaweicloud.com/images/2024/9/11/11e7e78e-2af0-4c68-9811-db8a4c4400f4.png" alt="logo" width="520" /></div>
<p style="margin-top: 12px" align="center"><b>一款高颜值、现代化的自动化运维&轻量堡垒机平台。</b></p>
<p style="margin-top: 12px" align="center"><b>【Dromara】 一款高颜值、现代化的自动化运维&轻量堡垒机平台。</b></p>
<p align="center">
<a target="_blank"
style="text-decoration: none !important;"

View File

@@ -1,7 +1,7 @@
version: '3.3'
services:
service:
image: registry.cn-hangzhou.aliyuncs.com/lijiahangmax/orion-visor-service:2.2.0
image: registry.cn-hangzhou.aliyuncs.com/lijiahangmax/orion-visor-service:2.2.1
privileged: true
ports:
- 1081:80
@@ -32,7 +32,7 @@ services:
- mysql
- redis
mysql:
image: registry.cn-hangzhou.aliyuncs.com/lijiahangmax/orion-visor-mysql:2.2.0
image: registry.cn-hangzhou.aliyuncs.com/lijiahangmax/orion-visor-mysql:2.2.1
privileged: true
ports:
- 3307:3306
@@ -52,7 +52,7 @@ services:
retries: 10
start_period: 3s
redis:
image: registry.cn-hangzhou.aliyuncs.com/lijiahangmax/orion-visor-redis:2.2.0
image: registry.cn-hangzhou.aliyuncs.com/lijiahangmax/orion-visor-redis:2.2.1
privileged: true
ports:
- 6380:6379

View File

@@ -1,7 +1,7 @@
version: '3.3'
services:
service:
image: registry.cn-hangzhou.aliyuncs.com/lijiahangmax/orion-visor-service:2.2.0
image: registry.cn-hangzhou.aliyuncs.com/lijiahangmax/orion-visor-service:2.2.1
privileged: true
ports:
- ${SERVICE_PORT:-1081}:80
@@ -32,7 +32,7 @@ services:
- mysql
- redis
mysql:
image: registry.cn-hangzhou.aliyuncs.com/lijiahangmax/orion-visor-mysql:2.2.0
image: registry.cn-hangzhou.aliyuncs.com/lijiahangmax/orion-visor-mysql:2.2.1
privileged: true
ports:
- 3307:3306
@@ -52,7 +52,7 @@ services:
retries: 15
start_period: 3s
redis:
image: registry.cn-hangzhou.aliyuncs.com/lijiahangmax/orion-visor-redis:2.2.0
image: registry.cn-hangzhou.aliyuncs.com/lijiahangmax/orion-visor-redis:2.2.1
privileged: true
ports:
- 6380:6379
@@ -68,7 +68,7 @@ services:
retries: 15
start_period: 3s
adminer:
image: registry.cn-hangzhou.aliyuncs.com/lijiahangmax/orion-visor-adminer:2.2.0
image: registry.cn-hangzhou.aliyuncs.com/lijiahangmax/orion-visor-adminer:2.2.1
ports:
- 8081:8080
depends_on:

View File

@@ -1,4 +1,4 @@
#/bin/bash
version=2.2.0
version=2.2.1
docker build -t orion-visor-adminer:${version} .
docker tag orion-visor-adminer:${version} registry.cn-hangzhou.aliyuncs.com/lijiahangmax/orion-visor-adminer:${version}

View File

@@ -1,5 +1,5 @@
#/bin/bash
version=2.2.0
version=2.2.1
cp -r ../../sql ./sql
docker build -t orion-visor-mysql:${version} .
rm -rf ./sql

View File

@@ -1,5 +1,5 @@
#/bin/bash
version=2.2.0
version=2.2.1
docker push registry.cn-hangzhou.aliyuncs.com/lijiahangmax/orion-visor-adminer:${version}
docker push registry.cn-hangzhou.aliyuncs.com/lijiahangmax/orion-visor-mysql:${version}
docker push registry.cn-hangzhou.aliyuncs.com/lijiahangmax/orion-visor-redis:${version}

View File

@@ -1,4 +1,4 @@
#/bin/bash
version=2.2.0
version=2.2.1
docker build -t orion-visor-redis:${version} .
docker tag orion-visor-redis:${version} registry.cn-hangzhou.aliyuncs.com/lijiahangmax/orion-visor-redis:${version}

View File

@@ -1,8 +1,8 @@
#/bin/bash
version=2.2.0
version=2.2.1
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} .
docker build --no-cache -t orion-visor-service:${version} .
rm -rf ./orion-visor-launch.jar
rm -rf ./dist
docker tag orion-visor-service:${version} registry.cn-hangzhou.aliyuncs.com/lijiahangmax/orion-visor-service:${version}

View File

@@ -20,7 +20,7 @@
// 左侧文档名称
name: 'orion-visor',
// 右上角仓库
repo: 'https://github.com/lijiahangmax/orion-visor',
repo: 'https://github.com/dromara/orion-visor',
coverpage: true,
// 加载侧边栏
loadSidebar: true,

View File

@@ -10,15 +10,15 @@
<packaging>pom</packaging>
<name>${project.artifactId}</name>
<description>项目所有依赖</description>
<description>项目全部依赖</description>
<url>https://github.com/dromara/orion-visor</url>
<properties>
<revision>2.2.0</revision>
<revision>2.2.1</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>
<orion.kit.version>2.0.0</orion.kit.version>
<orion.kit.version>2.0.1</orion.kit.version>
<aspectj.version>1.9.7</aspectj.version>
<lombok.version>1.18.26</lombok.version>
<springdoc.version>1.6.15</springdoc.version>

View File

@@ -29,7 +29,7 @@ public interface AppConst extends OrionConst {
/**
* 同 ${orion.version} 迭代时候需要手动更改
*/
String VERSION = "2.2.0";
String VERSION = "2.2.1";
/**
* 同 ${spring.application.name}

View File

@@ -142,8 +142,8 @@ public class ${table.serviceImplName} implements ${table.serviceName} {
// 查询
return ${typeLower}DAO.of(wrapper).list(${type}Convert.MAPPER::to);
}
#if($meta.enableCache)
@Override
public List<${type}VO> get${type}ListByCache() {
// 查询缓存

View File

@@ -72,14 +72,14 @@ export interface ${vue.featureEntity}QueryResponse extends TableData {
* $apiComment.create
*/
export function create${vue.featureEntity}(request: ${vue.featureEntity}CreateRequest) {
return axios.post('/${package.ModuleName}/${typeHyphen}/create', request);
return axios.post<number>('/${package.ModuleName}/${typeHyphen}/create', request);
}
/**
* $apiComment.updateById
*/
export function update${vue.featureEntity}(request: ${vue.featureEntity}UpdateRequest) {
return axios.put('/${package.ModuleName}/${typeHyphen}/update', request);
return axios.put<number>('/${package.ModuleName}/${typeHyphen}/update', request);
}
/**
@@ -126,14 +126,14 @@ export function get${vue.featureEntity}Count(request: ${vue.featureEntity}QueryR
* $apiComment.deleteById
*/
export function delete${vue.featureEntity}(id: number) {
return axios.delete('/${package.ModuleName}/${typeHyphen}/delete', { params: { id } });
return axios.delete<number>('/${package.ModuleName}/${typeHyphen}/delete', { params: { id } });
}
/**
* $apiComment.batchDelete
*/
export function batchDelete${vue.featureEntity}(idList: Array<number>) {
return axios.delete('/${package.ModuleName}/${typeHyphen}/batch-delete', {
return axios.delete<number>('/${package.ModuleName}/${typeHyphen}/batch-delete', {
params: { idList },
paramsSerializer: params => {
return qs.stringify(params, { arrayFormat: 'comma' });

View File

@@ -34,8 +34,8 @@
#if("$field.propertyType" == "Integer" || "$field.propertyType" == "Long")
<a-input-number v-model="formModel.${field.propertyName}"
placeholder="请输入${field.comment}"
allow-clear
hide-button />
hide-button
allow-clear />
#elseif("$field.propertyType" == "Date")
<a-date-picker v-model="formModel.${field.propertyName}"
style="width: 100%"
@@ -180,19 +180,12 @@
});
};
// 添加后回调
const addedCallback = () => {
// 重新加载
const reload = () => {
fetchCardData();
};
// 更新后回调
const updatedCallback = () => {
fetchCardData();
};
defineExpose({
addedCallback, updatedCallback
});
defineExpose({ reload });
// 重置条件
const reset = () => {

View File

@@ -21,17 +21,20 @@
#if(${dictMap.containsKey(${field.propertyName})})
<a-select v-model="formModel.${field.propertyName}"
:options="toOptions($dictMap.get(${field.propertyName}).keyField)"
placeholder="请选择${field.comment}" />
placeholder="请选择${field.comment}"
allow-clear />
#else
#if("$field.propertyType" == "Integer" || "$field.propertyType" == "Long")
<a-input-number v-model="formModel.${field.propertyName}"
placeholder="请输入${field.comment}"
hide-button />
hide-button
allow-clear />
#elseif("$field.propertyType" == "Date")
<a-date-picker v-model="formModel.${field.propertyName}"
style="width: 100%"
placeholder="请选择${field.comment}"
show-time />
show-time
allow-clear />
#else
<a-input v-model="formModel.${field.propertyName}"
placeholder="请输入${field.comment}"

View File

@@ -25,17 +25,20 @@
#if(${dictMap.containsKey(${field.propertyName})})
<a-select v-model="formModel.${field.propertyName}"
:options="toOptions($dictMap.get(${field.propertyName}).keyField)"
placeholder="请选择${field.comment}" />
placeholder="请选择${field.comment}"
allow-clear />
#else
#if("$field.propertyType" == "Integer" || "$field.propertyType" == "Long")
<a-input-number v-model="formModel.${field.propertyName}"
placeholder="请输入${field.comment}"
hide-button />
hide-button
allow-clear />
#elseif("$field.propertyType" == "Date")
<a-date-picker v-model="formModel.${field.propertyName}"
style="width: 100%"
placeholder="请选择${field.comment}"
show-time />
show-time
allow-clear />
#else
<a-input v-model="formModel.${field.propertyName}"
placeholder="请输入${field.comment}"

View File

@@ -18,8 +18,8 @@
#if("$field.propertyType" == "Integer" || "$field.propertyType" == "Long")
<a-input-number v-model="formModel.${field.propertyName}"
placeholder="请输入${field.comment}"
allow-clear
hide-button />
hide-button
allow-clear />
#elseif("$field.propertyType" == "Date")
<a-date-picker v-model="formModel.${field.propertyName}"
style="width: 100%"
@@ -63,7 +63,7 @@
<a-popconfirm :content="`确认删除选中的 ${selectedKeys.length} 条记录吗?`"
position="br"
type="warning"
@ok="deleteSelectRows">
@ok="deleteSelectedRows">
<a-button v-permission="['${package.ModuleName}:${typeHyphen}:delete']"
type="secondary"
status="danger"
@@ -182,7 +182,7 @@
#if($vue.enableRowSelection)
// 删除选中行
const deleteSelectRows = async () => {
const deleteSelectedRows = async () => {
try {
setLoading(true);
// 调用删除接口
@@ -215,19 +215,12 @@
}
};
// 添加后回调
const addedCallback = () => {
// 重新加载
const reload = () => {
fetchTableData();
};
// 更新后回调
const updatedCallback = () => {
fetchTableData();
};
defineExpose({
addedCallback, updatedCallback
});
defineExpose({ reload });
// 加载数据
const doFetchTableData = async (request: ${vue.featureEntity}QueryRequest) => {

View File

@@ -18,15 +18,15 @@
@open-update="(e) =>#if($vue.enableDrawerForm) drawer#else modal#end.openUpdate(e)" />
#end
#if($vue.enableDrawerForm)
<!-- 添加修改模态框 -->
<!-- 添加修改抽屉 -->
<${vue.feature}-form-drawer ref="drawer"
@added="modalAddCallback"
@updated="modalUpdateCallback" />
@added="reload"
@updated="reload" />
#else
<!-- 添加修改模态框 -->
<${vue.feature}-form-modal ref="modal"
@added="modalAddCallback"
@updated="modalUpdateCallback" />
@added="reload"
@updated="reload" />
#end
</div>
</template>
@@ -81,29 +81,16 @@
const modal = ref();
#end
// 添加回调
const modalAddCallback = () => {
// 重新加载
const reload = () => {
#if($vue.enableCardView)
if (renderTable.value) {
table.value.addedCallback();
table.value.reload();
} else {
card.value.addedCallback();
card.value.reload();
}
#else
table.value.addedCallback();
#end
};
// 修改回调
const modalUpdateCallback = () => {
#if($vue.enableCardView)
if (renderTable.value) {
table.value.updatedCallback();
} else {
card.value.updatedCallback();
}
#else
table.value.updatedCallback();
table.value.reload();
#end
};

View File

@@ -112,7 +112,7 @@ public class ExecJobServiceImpl implements ExecJobService {
// 设置任务主机
execJobHostService.setHostIdByJobId(id, request.getHostIdList());
// 设置 quartz 状态
this.setQuartzJobStatus(record, false, true);
// this.setQuartzJobStatus(record, false, false);
log.info("ExecJobService-createExecJob id: {}, effect: {}", id, effect);
return id;
}

View File

@@ -1,5 +1,5 @@
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.2.0'
VITE_APP_VERSION= '2.2.1'
VITE_APP_RELEASE= 'community'
VITE_DEMO_MODE= false

View File

@@ -1,5 +1,5 @@
VITE_API_BASE_URL= '/orion-visor/api'
VITE_WS_BASE_URL= '/orion-visor/keep-alive'
VITE_APP_VERSION= '2.2.0'
VITE_APP_VERSION= '2.2.1'
VITE_APP_RELEASE= 'community'
VITE_DEMO_MODE= false

View File

@@ -1,7 +1,7 @@
{
"name": "orion-visor-ui",
"description": "Orion Visor UI",
"version": "2.2.0",
"version": "2.2.1",
"private": true,
"author": "Jiahang Li",
"license": "Apache 2.0",

View File

@@ -38,6 +38,8 @@ export function getExecCommandHostLogList(logId: number) {
export function getExecCommandLogStatus(idList: Array<number>) {
return axios.get<ExecLogStatusResponse>('/asset/exec-command-log/status', {
params: { idList },
promptBizErrorMessage: false,
promptRequestErrorMessage: false,
paramsSerializer: params => {
return qs.stringify(params, { arrayFormat: 'comma' });
}

View File

@@ -146,6 +146,8 @@ export function getUploadTaskPage(request: UploadTaskQueryRequest) {
export function getUploadTaskStatus(idList: Array<number>, queryFiles: boolean) {
return axios.get<Array<UploadTaskStatusResponse>>('/asset/upload-task/status', {
params: { idList, queryFiles },
promptBizErrorMessage: false,
promptRequestErrorMessage: false,
paramsSerializer: params => {
return qs.stringify(params, { arrayFormat: 'comma' });
}

View File

@@ -38,6 +38,8 @@ export function getExecJobHostLogList(logId: number) {
export function getExecJobLogStatus(idList: Array<number>) {
return axios.get<ExecLogStatusResponse>('/asset/exec-job-log/status', {
params: { idList },
promptBizErrorMessage: false,
promptRequestErrorMessage: false,
paramsSerializer: params => {
return qs.stringify(params, { arrayFormat: 'comma' });
}

View File

@@ -43,7 +43,10 @@ export function getSystemMessageCount(queryUnread: boolean) {
* 查询是否有未读消息
*/
export function checkHasUnreadMessage() {
return axios.get<boolean>('/infra/system-message/has-unread');
return axios.get<boolean>('/infra/system-message/has-unread', {
promptBizErrorMessage: false,
promptRequestErrorMessage: false,
});
}
/**

View File

@@ -371,6 +371,22 @@ body {
font-size: 16px;
}
.fs17 {
font-size: 17px;
}
.fs18 {
font-size: 18px;
}
.fs19 {
font-size: 19px;
}
.fs20 {
font-size: 20px;
}
.text-ellipsis {
overflow: hidden;
text-overflow: ellipsis;

View File

@@ -55,6 +55,14 @@ export function isWindow(el: any): el is Window {
/**
* 是否为移动端 ua
*/
export function isMobile(userAgent: string) {
export function isMobile(userAgent: string): boolean {
return /Mobi|Android|iPhone/i.test(userAgent);
}
/**
* 是否为 IPv4
*/
export function isIPv4(ip: string): boolean {
const reg = /^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/;
return reg.test(ip);
}

View File

@@ -76,7 +76,7 @@
<a-popconfirm :content="`确认删除选中的 ${selectedKeys.length} 条记录吗?`"
position="br"
type="warning"
@ok="deleteSelectRows">
@ok="deleteSelectedRows">
<a-button v-permission="['asset:terminal-connect-log:management:delete']"
type="primary"
status="danger"
@@ -276,7 +276,7 @@
};
// 删除选中行
const deleteSelectRows = async () => {
const deleteSelectedRows = async () => {
try {
setLoading(true);
// 调用删除接口

View File

@@ -60,7 +60,7 @@
<a-popconfirm :content="`确认删除选中的 ${selectedKeys.length} 条记录吗?`"
position="br"
type="warning"
@ok="deleteSelectRows">
@ok="deleteSelectedRows">
<a-button v-permission="['infra:operator-log:delete', 'asset:terminal-sftp-log:management:delete']"
type="primary"
status="danger"
@@ -240,7 +240,7 @@
};
// 删除选中行
const deleteSelectRows = async () => {
const deleteSelectedRows = async () => {
try {
setLoading(true);
// 调用删除接口

View File

@@ -209,19 +209,12 @@
});
};
// 添加后回调
const addedCallback = () => {
// 重新加载
const reload = () => {
fetchCardData();
};
// 更新后回调
const updatedCallback = () => {
fetchCardData();
};
defineExpose({
addedCallback, updatedCallback
});
defineExpose({ reload });
// 重置条件
const reset = () => {

View File

@@ -78,7 +78,7 @@
<a-popconfirm :content="`确认删除选中的 ${selectedKeys.length} 条记录吗?`"
position="br"
type="warning"
@ok="deleteSelectRows">
@ok="deleteSelectedRows">
<a-button v-permission="['asset:host-identity:delete']"
type="primary"
status="danger"
@@ -224,7 +224,7 @@
};
// 删除选中行
const deleteSelectRows = async () => {
const deleteSelectedRows = async () => {
try {
setLoading(true);
// 调用删除接口
@@ -239,19 +239,12 @@
}
};
// 添加后回调
const addedCallback = () => {
// 重新加载
const reload = () => {
fetchTableData();
};
// 更新后回调
const updatedCallback = () => {
fetchTableData();
};
defineExpose({
addedCallback, updatedCallback
});
defineExpose({ reload });
// 加载数据
const doFetchTableData = async (request: HostIdentityQueryRequest) => {

View File

@@ -14,8 +14,8 @@
@open-key-view="(e) => keyDrawer.openView(e) " />
<!-- 添加修改模态框 -->
<host-identity-form-modal ref="modal"
@added="modalAddCallback"
@updated="modalUpdateCallback" />
@added="reload"
@updated="reload" />
<!-- 主机密钥抽屉 -->
<host-key-form-drawer ref="keyDrawer" />
</div>
@@ -45,21 +45,12 @@
const renderTable = computed(() => appStore.hostIdentityView === 'table');
// 添加回调
const modalAddCallback = () => {
// 重新加载
const reload = () => {
if (renderTable.value) {
table.value.addedCallback();
table.value.reload();
} else {
card.value.addedCallback();
}
};
// 修改回调
const modalUpdateCallback = () => {
if (renderTable.value) {
table.value.updatedCallback();
} else {
card.value.updatedCallback();
card.value.reload();
}
};

View File

@@ -126,19 +126,12 @@
});
};
// 添加后回调
const addedCallback = () => {
// 重新加载
const reload = () => {
fetchCardData();
};
// 更新后回调
const updatedCallback = () => {
fetchCardData();
};
defineExpose({
addedCallback, updatedCallback
});
defineExpose({ reload });
// 重置条件
const reset = () => {

View File

@@ -63,7 +63,7 @@
<a-popconfirm :content="`确认删除选中的 ${selectedKeys.length} 条记录吗?`"
position="br"
type="warning"
@ok="deleteSelectRows">
@ok="deleteSelectedRows">
<a-button v-permission="['asset:host-key:delete']"
type="primary"
status="danger"
@@ -173,7 +173,7 @@
};
// 删除选中行
const deleteSelectRows = async () => {
const deleteSelectedRows = async () => {
try {
setLoading(true);
// 调用删除接口
@@ -188,19 +188,12 @@
}
};
// 添加后回调
const addedCallback = () => {
// 重新加载
const reload = () => {
fetchTableData();
};
// 更新后回调
const updatedCallback = () => {
fetchTableData();
};
defineExpose({
addedCallback, updatedCallback
});
defineExpose({ reload });
// 加载数据
const doFetchTableData = async (request: HostKeyQueryRequest) => {

View File

@@ -14,8 +14,8 @@
@open-update="(e) => drawer.openUpdate(e)" />
<!-- 添加修改模态框 -->
<host-key-form-drawer ref="drawer"
@added="modalAddCallback"
@updated="modalUpdateCallback" />
@added="reload"
@updated="reload" />
</div>
</template>
@@ -39,21 +39,12 @@
const renderTable = computed(() => appStore.hostKeyView === 'table');
// 添加回调
const modalAddCallback = () => {
// 重新加载
const reload = () => {
if (renderTable.value) {
table.value.addedCallback();
table.value.reload();
} else {
card.value.addedCallback();
}
};
// 修改回调
const modalUpdateCallback = () => {
if (renderTable.value) {
table.value.updatedCallback();
} else {
card.value.updatedCallback();
card.value.reload();
}
};

View File

@@ -303,19 +303,12 @@
});
};
// 添加后回调
const addedCallback = () => {
// 重新加载
const reload = () => {
fetchCardData();
};
// 更新后回调
const updatedCallback = () => {
fetchCardData();
};
defineExpose({
addedCallback, updatedCallback
});
defineExpose({ reload });
// 重置条件
const reset = () => {

View File

@@ -103,7 +103,7 @@
<a-popconfirm :content="`确认删除选中的 ${selectedKeys.length} 条记录吗?`"
position="br"
type="warning"
@ok="deleteSelectRows">
@ok="deleteSelectedRows">
<a-button v-permission="['asset:host:delete']"
type="primary"
status="danger"
@@ -330,7 +330,7 @@
};
// 删除选中行
const deleteSelectRows = async () => {
const deleteSelectedRows = async () => {
try {
setLoading(true);
// 调用删除接口
@@ -345,19 +345,12 @@
}
};
// 添加后回调
const addedCallback = () => {
// 重新加载
const reload = () => {
fetchTableData();
};
// 更新后回调
const updatedCallback = () => {
fetchTableData();
};
defineExpose({
addedCallback, updatedCallback
});
defineExpose({ reload });
// 加载数据
const doFetchTableData = async (request: HostQueryRequest) => {

View File

@@ -18,8 +18,8 @@
@open-update-config="(e) => hostConfig.open(e)" />
<!-- 添加修改模态框 -->
<host-form-modal ref="modal"
@added="modalAddCallback"
@updated="modalUpdateCallback" />
@added="reload"
@updated="reload" />
<!-- 配置面板 -->
<host-config-drawer ref="hostConfig" />
<!-- 分组配置 -->
@@ -54,21 +54,12 @@
const renderTable = computed(() => appStore.hostView === 'table');
// 添加回调
const modalAddCallback = () => {
// 重新加载
const reload = () => {
if (renderTable.value) {
table.value.addedCallback();
table.value.reload();
} else {
card.value.addedCallback();
}
};
// 修改回调
const modalUpdateCallback = () => {
if (renderTable.value) {
table.value.updatedCallback();
} else {
card.value.updatedCallback();
card.value.reload();
}
};

View File

@@ -83,7 +83,7 @@
<a-popconfirm :content="`确认删除选中的 ${selectedKeys.length} 条记录吗? 删除后会中断执行!`"
position="br"
type="warning"
@ok="deleteSelectRows">
@ok="deleteSelectedRows">
<a-button v-permission="['asset:exec-command-log:delete']"
type="primary"
status="danger"
@@ -255,7 +255,7 @@
};
// 删除选中行
const deleteSelectRows = async () => {
const deleteSelectedRows = async () => {
try {
setLoading(true);
// 调用删除接口

View File

@@ -53,7 +53,7 @@
<a-popconfirm :content="`确认删除选中的 ${selectedKeys.length} 条记录吗?`"
position="br"
type="warning"
@ok="deleteSelectRows">
@ok="deleteSelectedRows">
<a-button v-permission="['asset:exec-template:delete']"
type="primary"
status="danger"
@@ -168,7 +168,7 @@
};
// 删除选中行
const deleteSelectRows = async () => {
const deleteSelectedRows = async () => {
try {
setLoading(true);
// 调用删除接口
@@ -183,19 +183,12 @@
}
};
// 添加后回调
const addedCallback = () => {
// 重新加载
const reload = () => {
fetchTableData();
};
// 更新后回调
const updatedCallback = () => {
fetchTableData();
};
defineExpose({
addedCallback, updatedCallback
});
defineExpose({ reload });
// 加载数据
const doFetchTableData = async (request: ExecTemplateQueryRequest) => {

View File

@@ -7,8 +7,8 @@
@open-exec="(e) => execModal.open(e)" />
<!-- 添加修改模态框 -->
<exec-template-form-drawer ref="drawer"
@added="modalAddCallback"
@updated="modalUpdateCallback"
@added="() => table.reload()"
@updated="() => table.reload()"
@open-host="(e) => openHostModal('drawer', e)" />
<!-- 执行模态框 -->
<exec-template-exec-drawer ref="execModal"
@@ -40,16 +40,6 @@
const hostModal = ref();
const lastOpenHostRef = ref();
// 添加回调
const modalAddCallback = () => {
table.value.addedCallback();
};
// 修改回调
const modalUpdateCallback = () => {
table.value.updatedCallback();
};
// 打开主机模态框
const openHostModal = (openRef: string, data: any) => {
lastOpenHostRef.value = openRef;

View File

@@ -83,7 +83,7 @@
<a-popconfirm :content="`确认删除选中的 ${selectedKeys.length} 条记录吗?`"
position="br"
type="warning"
@ok="deleteSelectRows">
@ok="deleteSelectedRows">
<a-button v-permission="['asset:upload-task:delete']"
type="primary"
status="danger"
@@ -231,7 +231,7 @@
};
// 删除选中行
const deleteSelectRows = async () => {
const deleteSelectedRows = async () => {
try {
setLoading(true);
// 调用删除接口

View File

@@ -68,7 +68,7 @@
<a-popconfirm :content="`确认删除选中的 ${selectedKeys.length} 条记录吗? 删除后会中断执行!`"
position="br"
type="warning"
@ok="deleteSelectRows">
@ok="deleteSelectedRows">
<a-button v-permission="['asset:exec-job-log:delete']"
type="primary"
status="danger"
@@ -235,7 +235,7 @@
};
// 删除选中行
const deleteSelectRows = async () => {
const deleteSelectedRows = async () => {
try {
setLoading(true);
// 调用删除接口

View File

@@ -60,7 +60,7 @@
<a-popconfirm :content="`确认删除选中的 ${selectedKeys.length} 条记录吗?`"
position="br"
type="warning"
@ok="deleteSelectRows">
@ok="deleteSelectedRows">
<a-button v-permission="['asset:exec-job:delete']"
type="primary"
status="danger"
@@ -238,7 +238,7 @@
};
// 删除选中行
const deleteSelectRows = async () => {
const deleteSelectedRows = async () => {
try {
setLoading(true);
// 调用删除接口
@@ -253,19 +253,12 @@
}
};
// 添加后回调
const addedCallback = () => {
// 重新加载
const reload = () => {
fetchTableData();
};
// 更新后回调
const updatedCallback = () => {
fetchTableData();
};
defineExpose({
addedCallback, updatedCallback
});
defineExpose({ reload });
// 修改状态
const updateStatus = async (id: number, status: number) => {

View File

@@ -8,12 +8,12 @@
@test-cron="openNextCron" />
<!-- 添加修改模态框 -->
<exec-job-form-drawer ref="drawer"
@added="modalAddCallback"
@updated="modalUpdateCallback"
@added="() => table.reload()"
@updated="() => table.reload()"
@open-host="(e) => hostModal.open(e)"
@open-template="() => templateModal.open()"
@test-cron="openNextCron"
@gen-cron="openGeneratorCron" />
@gen-cron="(e) => genModal.open(e)" />
<!-- 任务详情模态框 -->
<exec-job-detail-drawer ref="detail" />
<!-- cron 执行时间模态框 -->
@@ -58,26 +58,11 @@
const templateModal = ref();
const hostModal = ref();
// 添加回调
const modalAddCallback = () => {
table.value.addedCallback();
};
// 修改回调
const modalUpdateCallback = () => {
table.value.updatedCallback();
};
// 打开下次执行时间
const openNextCron = (cron: string) => {
nextCron.value.open({ expression: cron, times: CronNextTimes });
};
// 打开生成表达式
const openGeneratorCron = (cron: string) => {
genModal.value.open(cron);
};
onBeforeMount(async () => {
const dictStore = useDictStore();
await dictStore.loadKeys(dictKeys);

View File

@@ -67,7 +67,7 @@
<a-popconfirm :content="`确认删除选中的 ${selectedKeys.length} 条记录吗?`"
position="br"
type="warning"
@ok="deleteSelectRows">
@ok="deleteSelectedRows">
<a-button v-permission="['infra:dict-key:delete']"
type="primary"
status="danger"
@@ -206,7 +206,7 @@
};
// 删除选中行
const deleteSelectRows = async () => {
const deleteSelectedRows = async () => {
try {
setLoading(true);
// 调用删除接口
@@ -222,21 +222,13 @@
}
};
// 添加后回调
const addedCallback = () => {
// 重新加载
const reload = () => {
fetchTableData();
cacheStore.reset('dictKeys');
};
// 更新后回调
const updatedCallback = () => {
fetchTableData();
cacheStore.reset('dictKeys');
};
defineExpose({
addedCallback, updatedCallback
});
defineExpose({ reload });
// 打开查看视图
const openView = async (record: DictKeyQueryResponse) => {

View File

@@ -7,8 +7,8 @@
@open-view="(v, t) => view.open(v, t)" />
<!-- 添加修改模态框 -->
<dict-key-form-modal ref="modal"
@added="modalAddCallback"
@updated="modalUpdateCallback" />
@added="() => table.reload()"
@updated="() => table.reload()" />
<!-- json 查看器模态框 -->
<json-editor-modal ref="view" />
</div>
@@ -33,16 +33,6 @@
const modal = ref();
const view = ref();
// 添加回调
const modalAddCallback = () => {
table.value.addedCallback();
};
// 修改回调
const modalUpdateCallback = () => {
table.value.updatedCallback();
};
onBeforeMount(async () => {
const dictStore = useDictStore();
await dictStore.loadKeys(dictKeys);

View File

@@ -53,7 +53,7 @@
<a-popconfirm :content="`确认删除选中的 ${selectedKeys.length} 条记录吗?`"
position="br"
type="warning"
@ok="deleteSelectRows">
@ok="deleteSelectedRows">
<a-button v-permission="['infra:dict-value:delete']"
type="primary"
status="danger"
@@ -168,7 +168,7 @@
});
// 删除选中行
const deleteSelectRows = async () => {
const deleteSelectedRows = async () => {
try {
setLoading(true);
// 调用删除接口
@@ -198,19 +198,12 @@
}
};
// 添加后回调
const addedCallback = () => {
// 重新加载
const reload = () => {
fetchTableData();
};
// 更新后回调
const updatedCallback = () => {
fetchTableData();
};
defineExpose({
addedCallback, updatedCallback
});
defineExpose({ reload });
// 修改 key
const changeKey = ({ id, keyName }: { id: number, keyName: string }) => {

View File

@@ -7,13 +7,13 @@
@open-history="(e) => history.open(e.id, e.label)" />
<!-- 添加修改模态框 -->
<dict-value-form-modal ref="modal"
@added="modalAddCallback"
@updated="modalUpdateCallback" />
@added="() => table.reload()"
@updated="() => table.reload()" />
<!-- 历史值模态框 -->
<history-value-modal ref="history"
:type="historyType"
:rollback="rollback"
@updated="modalUpdateCallback" />
@updated="() => table.reload()" />
</div>
</template>
@@ -37,16 +37,6 @@
const history = ref();
const cacheStore = useCacheStore();
// 添加回调
const modalAddCallback = () => {
table.value.addedCallback();
};
// 修改回调
const modalUpdateCallback = () => {
table.value.updatedCallback();
};
// 回滚
const rollback = async (id: number, valueId: number) => {
await rollbackDictValue({ id, valueId });

View File

@@ -270,21 +270,13 @@
}
};
// 添加后回调
const addedCallback = () => {
// 重新加载
const reload = () => {
formRef.value.resetFields();
loadMenuData(true);
};
// 更新后回调
const updatedCallback = () => {
formRef.value.resetFields();
loadMenuData(true);
};
defineExpose({
addedCallback, updatedCallback
});
defineExpose({ reload });
// 加载菜单
const loadMenuData = async (all: any = undefined) => {

View File

@@ -6,8 +6,8 @@
@open-update="(e) => modal.openUpdate(e)" />
<!-- 添加修改模态框 -->
<menu-form-modal ref="modal"
@added="() => table.addedCallback()"
@updated="() => table.updatedCallback()" />
@added="() => table.reload()"
@updated="() => table.reload()" />
</div>
</template>

View File

@@ -31,7 +31,7 @@
<a-popconfirm :content="`确认删除选中的 ${selectedKeys.length} 条记录吗?`"
position="br"
type="warning"
@ok="deleteSelectRows">
@ok="deleteSelectedRows">
<a-button v-permission="['infra:operator-log:delete']"
type="primary"
status="danger"
@@ -174,7 +174,7 @@
};
// 删除选中行
const deleteSelectRows = async () => {
const deleteSelectedRows = async () => {
try {
setLoading(true);
// 调用删除接口

View File

@@ -181,19 +181,12 @@
}
};
// 添加后回调
const addedCallback = () => {
// 重新加载
const reload = () => {
fetchTableData();
};
// 更新后回调
const updatedCallback = () => {
fetchTableData();
};
defineExpose({
addedCallback, updatedCallback
});
defineExpose({ reload });
// 加载数据
const doFetchTableData = async (request: RoleQueryRequest) => {

View File

@@ -7,8 +7,8 @@
@open-grant="(e) => grantModal.open(e)" />
<!-- 添加修改模态框 -->
<role-form-modal ref="modal"
@added="() => table.addedCallback()"
@updated="() => table.updatedCallback()" />
@added="() => table.reload()"
@updated="() => table.reload()" />
<!-- 分配角色菜单模态框 -->
<role-menu-grant-modal ref="grantModal" />
</div>

View File

@@ -64,7 +64,7 @@
<a-popconfirm :content="`确认删除选中的 ${selectedKeys.length} 条记录吗?`"
position="br"
type="warning"
@ok="deleteSelectRows">
@ok="deleteSelectedRows">
<a-button v-permission="['infra:system-user:delete']"
type="primary"
status="danger"
@@ -226,7 +226,7 @@
};
// 删除选中行
const deleteSelectRows = async () => {
const deleteSelectedRows = async () => {
try {
setLoading(true);
// 调用删除接口
@@ -258,19 +258,12 @@
});
};
// 添加后回调
const addedCallback = () => {
// 重新加载
const reload = () => {
fetchTableData();
};
// 更新后回调
const updatedCallback = () => {
fetchTableData();
};
defineExpose({
addedCallback, updatedCallback
});
defineExpose({ reload });
// 加载数据
const doFetchTableData = async (request: UserQueryRequest) => {

View File

@@ -8,8 +8,8 @@
@open-grant-role="(e) => grantRoleModal.open(e)" />
<!-- 添加修改模态框 -->
<user-form-modal ref="modal"
@added="() => table.addedCallback()"
@updated="() => table.updatedCallback()" />
@added="() => table.reload()"
@updated="() => table.reload()" />
<!-- 重置密码模态框 -->
<user-reset-password-form-modal ref="resetModal" />
<!-- 分配角色模态框 -->

View File

@@ -22,7 +22,7 @@
</modules>
<properties>
<revision>2.2.0</revision>
<revision>2.2.1</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>