feat: Support remote synchronization of script library scripts (#8371)

This commit is contained in:
ssongliu
2025-04-11 07:08:02 +00:00
committed by GitHub
parent 04f1722cce
commit ce4a770e23
35 changed files with 314 additions and 802 deletions
+3
View File
@@ -63,6 +63,9 @@ export const searchScript = (params: SearchWithPage) => {
export const addScript = (params: Cronjob.ScriptOperate) => {
return http.post(`/core/script`, params);
};
export const syncScript = () => {
return http.post(`/core/script/sync`, {}, TimeoutEnum.T_60S);
};
export const editScript = (params: Cronjob.ScriptOperate) => {
return http.post(`/core/script/update`, params);
};
+2
View File
@@ -36,6 +36,7 @@ const message = {
view: 'View',
watch: 'Watch',
handle: 'Handle',
clone: 'Clone',
expand: 'Expand',
collapse: 'Collapse',
log: 'Log',
@@ -1047,6 +1048,7 @@ const message = {
'Set different groups based on script characteristics, which allows for faster script filtering operations.',
handleHelper: 'Execute script {1} on {0}, continue?',
noSuchApp: 'The {0} service was not detected. Please install it quickly using the script library first!',
syncHelper: 'About to sync system script library. This operation only affects system scripts. Continue?',
},
},
monitor: {
+3
View File
@@ -34,6 +34,7 @@ const message = {
view: 'ビュー',
watch: '時計',
handle: 'トリガー',
clone: 'クローン',
expand: '拡大する',
collapse: '崩壊',
log: 'ログ',
@@ -1007,6 +1008,8 @@ const message = {
handleHelper: '{0} で {1} スクリプトを実行します。続行しますか?',
noSuchApp:
'{0} サービスが検出されませんでした。スクリプトライブラリを使って素早くインストールしてください!',
syncHelper:
'システムスクリプトライブラリを同期します。この操作はシステムスクリプトのみ影響します。続行しますか?',
},
},
monitor: {
+3
View File
@@ -34,6 +34,7 @@ const message = {
view: '보기',
watch: '감시',
handle: '트리거',
clone: '복제',
expand: '확장',
collapse: '축소',
log: '로그',
@@ -1000,6 +1001,8 @@ const message = {
'스크립트 특성에 따라 다양한 그룹을 설정하여 스크립트 필터링 작업을 더 빠르게 수행할 수 있습니다.',
handleHelper: '{0} 에서 {1} 스크립트를 실행합니다. 계속하시겠습니까?',
noSuchApp: '{0} 서비스가 감지되지 않았습니다. 스크립트 라이브러리를 사용하여 먼저 빠르게 설치하세요!',
syncHelper:
'시스템 스크립트 라이브러리를 동기화합니다. 이 작업은 시스템 스크립트에만 적용됩니다. 계속하시겠습니까?',
},
},
monitor: {
+2
View File
@@ -34,6 +34,7 @@ const message = {
view: 'Lihat',
watch: 'Pantau',
handle: 'Picu',
clone: 'Klon',
expand: 'Kembang',
collapse: 'Runtuh',
log: 'Log',
@@ -1037,6 +1038,7 @@ const message = {
handleHelper: 'Akan melaksanakan skrip {1} pada {0}, teruskan?',
noSuchApp:
'Perkhidmatan {0} tidak dikesan. Sila pasang dengan cepat menggunakan pustaka skrip terlebih dahulu!',
syncHelper: 'Akan menyelaraskan pustaka skrip sistem. Operasi ini hanya melibatkan skrip sistem. Teruskan?',
},
},
monitor: {
+3
View File
@@ -34,6 +34,7 @@ const message = {
view: 'Visualizar',
watch: 'Monitorar',
handle: 'Disparar',
clone: 'Clonar',
expand: 'Expandir',
collapse: 'Recolher',
log: 'Logs',
@@ -1026,6 +1027,8 @@ const message = {
handleHelper: 'Executar o script {1} em {0}, continuar?',
noSuchApp:
'O serviço {0} não foi detectado. Por favor, instale-o rapidamente usando a biblioteca de scripts primeiro!',
syncHelper:
'Preparando para sincronizar a biblioteca de scripts do sistema. Esta operação afeta apenas scripts do sistema. Continuar?',
},
},
monitor: {
+3
View File
@@ -35,6 +35,7 @@ const message = {
watch: 'Наблюдать',
handle: 'Запустить',
expand: 'Развернуть',
clone: 'Клонировать',
collapse: 'Свернуть',
log: 'Логи',
back: 'Назад',
@@ -1032,6 +1033,8 @@ const message = {
handleHelper: 'Выполнить сценарий {1} на {0}, продолжить?',
noSuchApp:
'Служба {0} не обнаружена. Пожалуйста, сначала быстро установите её, используя библиотеку скриптов!',
syncHelper:
'Выполнить синхронизацию библиотеки системных скриптов? Это действие затрагивает только системные скрипты. Продолжить?',
},
},
monitor: {
+2
View File
@@ -36,6 +36,7 @@ const message = {
view: '詳情',
watch: '追蹤',
handle: '執行',
clone: '克隆',
expand: '展開',
collapse: '收起',
log: '日誌',
@@ -994,6 +995,7 @@ const message = {
groupHelper: '根據腳本特徵設置不同的分組,可以更快地對腳本進行篩選操作。',
handleHelper: '將在 {0} 上執行 {1} 腳本,是否繼續?',
noSuchApp: '未檢測到 {0} 服務,請先使用腳本庫快速安裝!',
syncHelper: '即將同步系統腳本庫,該操作僅針對系統腳本,是否繼續?',
},
},
monitor: {
+2
View File
@@ -36,6 +36,7 @@ const message = {
view: '详情',
watch: '追踪',
handle: '执行',
clone: '克隆',
expand: '展开',
collapse: '收起',
log: '日志',
@@ -992,6 +993,7 @@ const message = {
groupHelper: '针对脚本特征设置不同的分组,可以更加快速的对脚本进行筛选操作。',
handleHelper: '将在 {0} 上执行 {1} 脚本,是否继续?',
noSuchApp: '未检测到 {0} 服务,请先使用脚本库安装脚本快速安装!',
syncHelper: '即将同步系统脚本库,该操作仅针对系统脚本,是否继续?',
},
},
monitor: {
+13
View File
@@ -84,6 +84,19 @@ export function loadUpTime(uptime: number) {
return seconds + i18n.global.t('commons.units.second');
}
// 20250310
export function getCurrentDateFormatted() {
const now = new Date();
const year = now.getFullYear();
const month = String(now.getMonth() + 1).padStart(2, '0');
const day = String(now.getDate()).padStart(2, '0');
const hours = String(now.getHours()).padStart(2, '0');
const minutes = String(now.getMinutes()).padStart(2, '0');
const seconds = String(now.getSeconds()).padStart(2, '0');
return `${year}${month}${day}${hours}${minutes}${seconds}`;
}
export function dateFormat(row: any, col: any, dataStr: any) {
const date = new Date(dataStr);
const y = date.getFullYear();
+35 -2
View File
@@ -5,6 +5,9 @@
<el-button type="primary" @click="onOpenDialog('create')">
{{ $t('commons.button.add') }}
</el-button>
<el-button type="primary" plain @click="onSync()">
{{ $t('commons.button.sync') }}
</el-button>
<el-button type="primary" plain @click="onOpenGroupDialog()">
{{ $t('commons.table.group') }}
</el-button>
@@ -83,11 +86,11 @@
</template>
<script setup lang="ts">
import { dateFormat } from '@/utils/util';
import { dateFormat, deepCopy, getCurrentDateFormatted } from '@/utils/util';
import GroupDialog from '@/components/group/index.vue';
import OperateDialog from '@/views/cronjob/library/operate/index.vue';
import TerminalDialog from '@/views/cronjob/library/run/index.vue';
import { deleteScript, searchScript } from '@/api/modules/cronjob';
import { deleteScript, searchScript, syncScript } from '@/api/modules/cronjob';
import { onMounted, reactive, ref } from '@vue/runtime-core';
import { Cronjob } from '@/api/interface/cronjob';
import i18n from '@/lang';
@@ -170,6 +173,24 @@ const onDelete = async (row: Cronjob.ScriptInfo | null) => {
});
};
const onSync = async () => {
ElMessageBox.confirm(i18n.global.t('cronjob.library.syncHelper', i18n.global.t('commons.button.sync')), {
confirmButtonText: i18n.global.t('commons.button.confirm'),
cancelButtonText: i18n.global.t('commons.button.cancel'),
type: 'info',
}).then(async () => {
loading.value = true;
await syncScript()
.then(() => {
loading.value = false;
search();
})
.catch(() => {
loading.value = false;
});
});
};
const search = async () => {
let params = {
info: searchInfo.value,
@@ -214,6 +235,18 @@ const buttons = [
});
},
},
{
label: i18n.global.t('commons.button.clone'),
disabled: (row: any) => {
return !row.isSystem;
},
click: (row: Cronjob.ScriptInfo) => {
let item = deepCopy(row) as Cronjob.ScriptInfo;
item.id = 0;
item.name += '-' + getCurrentDateFormatted();
onOpenDialog('create', item);
},
},
{
label: i18n.global.t('commons.button.edit'),
disabled: (row: any) => {
+1 -1
View File
@@ -149,7 +149,7 @@
</el-input>
</el-form-item>
<el-form-item :label="$t('setting.apiInterface')" prop="apiInterface">
<el-form-item :label="$t('setting.apiInterface')" prop="apiInterface" v-if="isMaster">
<el-switch
@change="onChangeApiInterfaceStatus"
v-model="form.apiInterfaceStatus"