From 39bfd3955965381815fe407ff824a1c424f2b3bf Mon Sep 17 00:00:00 2001 From: whyour Date: Thu, 27 Jul 2023 23:15:48 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=BB=BB=E5=8A=A1=E8=AF=A6?= =?UTF-8?q?=E6=83=85=E6=97=A5=E5=BF=97=E5=88=97=E8=A1=A8=E5=8D=A1=E9=A1=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- back/data/cron.ts | 2 +- back/schedule/addCron.ts | 10 ++++++--- back/services/cron.ts | 9 ++++---- back/shared/pLimit.ts | 1 + package.json | 1 + pnpm-lock.yaml | 11 ++++++---- src/hooks/useScrollHeight.ts | 14 +++++++++++++ src/hooks/useTableScrollHeight.ts | 4 ++-- src/pages/crontab/detail.tsx | 35 ++++++++++++++++++++----------- src/pages/crontab/index.less | 4 ++++ src/pages/crontab/index.tsx | 2 +- src/pages/crontab/modal.tsx | 2 +- src/pages/dependence/index.tsx | 2 +- src/pages/env/index.tsx | 2 +- src/pages/setting/other.tsx | 2 +- src/pages/subscription/index.tsx | 2 +- 16 files changed, 71 insertions(+), 32 deletions(-) create mode 100644 src/hooks/useScrollHeight.ts diff --git a/back/data/cron.ts b/back/data/cron.ts index e26e2056..ac114402 100644 --- a/back/data/cron.ts +++ b/back/data/cron.ts @@ -21,7 +21,7 @@ export class Crontab { constructor(options: Crontab) { this.name = options.name; - this.command = options.command; + this.command = options.command.trim(); this.schedule = options.schedule; this.saved = options.saved; this.id = options.id; diff --git a/back/schedule/addCron.ts b/back/schedule/addCron.ts index 9207acf3..a3f101ec 100644 --- a/back/schedule/addCron.ts +++ b/back/schedule/addCron.ts @@ -17,7 +17,7 @@ const addCron = ( scheduleStacks.get(id)?.cancel(); } - let cmdStr = command; + let cmdStr = command.trim(); if (!cmdStr.startsWith(TASK_PREFIX) && !cmdStr.startsWith(QL_PREFIX)) { cmdStr = `${TASK_PREFIX}${cmdStr}`; } @@ -25,8 +25,12 @@ const addCron = ( scheduleStacks.set( id, nodeSchedule.scheduleJob(id, schedule, async () => { - Logger.silly(`当前时间: ${dayjs().format('YYYY-MM-DD HH:mm:ss')},运行命令: ${cmdStr}`); - runCron(`ID=${id} ${cmdStr}`) + Logger.info( + `当前时间: ${dayjs().format( + 'YYYY-MM-DD HH:mm:ss', + )},运行命令: ${cmdStr}`, + ); + runCron(`ID=${id} ${cmdStr}`); }), ); } diff --git a/back/services/cron.ts b/back/services/cron.ts index bb860996..571ea287 100644 --- a/back/services/cron.ts +++ b/back/services/cron.ts @@ -507,13 +507,14 @@ export default class CronService { } private make_command(tab: Crontab) { + let command = tab.command.trim(); if ( - !tab.command.startsWith(TASK_PREFIX) && - !tab.command.startsWith(QL_PREFIX) + !command.startsWith(TASK_PREFIX) && + !command.startsWith(QL_PREFIX) ) { - tab.command = `${TASK_PREFIX}${tab.command}`; + command = `${TASK_PREFIX}${tab.command}`; } - const crontab_job_string = `ID=${tab.id} ${tab.command}`; + const crontab_job_string = `ID=${tab.id} ${command}`; return crontab_job_string; } diff --git a/back/shared/pLimit.ts b/back/shared/pLimit.ts index 91c83403..ffbe0cbb 100644 --- a/back/shared/pLimit.ts +++ b/back/shared/pLimit.ts @@ -16,6 +16,7 @@ class TaskLimit { this.cpuLimit = pLimit(limit); return; } + await AuthModel.sync(); const doc = await AuthModel.findOne({ where: { type: AuthDataType.systemConfig } }); if (doc?.info?.cronConcurrency) { this.cpuLimit = pLimit(doc?.info?.cronConcurrency); diff --git a/package.json b/package.json index a99d983b..6f2e3af2 100644 --- a/package.json +++ b/package.json @@ -145,6 +145,7 @@ "qrcode.react": "^1.0.1", "query-string": "^7.1.1", "rc-tween-one": "^3.0.6", + "rc-virtual-list": "3.5.3", "react": "18.2.0", "react-codemirror2": "^7.2.1", "react-copy-to-clipboard": "^5.1.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0be3ba2f..b0ec5c74 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -267,6 +267,9 @@ devDependencies: rc-tween-one: specifier: ^3.0.6 version: 3.0.6(react-dom@18.2.0)(react@18.2.0) + rc-virtual-list: + specifier: 3.5.3 + version: 3.5.3(react-dom@18.2.0)(react@18.2.0) react: specifier: 18.2.0 version: 18.2.0 @@ -12461,7 +12464,7 @@ packages: rc-overflow: 1.3.0(react-dom@18.2.0)(react@18.2.0) rc-trigger: 5.3.4(react-dom@18.2.0)(react@18.2.0) rc-util: 5.33.0(react-dom@18.2.0)(react@18.2.0) - rc-virtual-list: 3.5.2(react-dom@18.2.0)(react@18.2.0) + rc-virtual-list: 3.5.3(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: true @@ -12641,7 +12644,7 @@ packages: classnames: 2.3.2 rc-motion: 2.7.3(react-dom@18.2.0)(react@18.2.0) rc-util: 5.33.0(react-dom@18.2.0)(react@18.2.0) - rc-virtual-list: 3.5.2(react-dom@18.2.0)(react@18.2.0) + rc-virtual-list: 3.5.3(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: true @@ -12731,8 +12734,8 @@ packages: react-is: 16.13.1 dev: true - /rc-virtual-list@3.5.2(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-sE2G9hTPjVmatQni8OP2Kx33+Oth6DMKm67OblBBmgMBJDJQOOFpSGH7KZ6Pm85rrI2IGxDRXZCr0QhYOH2pfQ==} + /rc-virtual-list@3.5.3(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-rG6IuD4EYM8K6oZ8Shu2BC/CmcTdqng4yBWkc/5fjWhB20bl6QwR2Upyt7+MxvfscoVm8zOQY+tcpEO5cu4GaQ==} engines: {node: '>=8.x'} peerDependencies: react: '*' diff --git a/src/hooks/useScrollHeight.ts b/src/hooks/useScrollHeight.ts new file mode 100644 index 00000000..08d07640 --- /dev/null +++ b/src/hooks/useScrollHeight.ts @@ -0,0 +1,14 @@ +import { RefObject, useState } from 'react'; +import useResizeObserver from '@react-hook/resize-observer'; + +export default (target: RefObject) => { + const [height, setHeight] = useState(0); + + useResizeObserver(target, (entry) => { + let _height = entry.target.clientHeight; + if (height !== _height) { + setHeight(_height); + } + }); + return height; +}; diff --git a/src/hooks/useTableScrollHeight.ts b/src/hooks/useTableScrollHeight.ts index 187a4eaa..5a47100f 100644 --- a/src/hooks/useTableScrollHeight.ts +++ b/src/hooks/useTableScrollHeight.ts @@ -1,9 +1,9 @@ -import { MutableRefObject, useLayoutEffect, useState } from 'react'; +import { RefObject, useState } from 'react'; import useResizeObserver from '@react-hook/resize-observer'; import { getTableScroll } from '@/utils'; export default ( - target: MutableRefObject, + target: RefObject, extraHeight?: number, ) => { const [height, setHeight] = useState(0); diff --git a/src/pages/crontab/detail.tsx b/src/pages/crontab/detail.tsx index 024d5956..7db8a291 100644 --- a/src/pages/crontab/detail.tsx +++ b/src/pages/crontab/detail.tsx @@ -30,6 +30,8 @@ import CronLogModal from './logModal'; import Editor from '@monaco-editor/react'; import IconFont from '@/components/iconfont'; import { getCommandScript } from '@/utils'; +import VirtualList from 'rc-virtual-list'; +import useScrollHeight from '@/hooks/useScrollHeight'; const { Text } = Typography; @@ -81,19 +83,28 @@ const CronDetailModal = ({ const [logUrl, setLogUrl] = useState(''); const [validTabs, setValidTabs] = useState(tabList); const [currentCron, setCurrentCron] = useState({}); + const listRef = useRef(null); + const tableScrollHeight = useScrollHeight(listRef); const contentList: any = { log: ( - ( - onClickItem(item)}> - - {item.directory}/{item.filename} - - )} - /> +
+ + + {(item) => ( + onClickItem(item)}> + + {item.directory}/{item.filename} + + )} + + +
), script: scriptInfo.filename && ( { if (code === 200) { setCurrentCron({ ...currentCron, status: CrontabStatus.idle }); @@ -280,7 +291,7 @@ const CronDetailModal = ({ `${config.apiPrefix}crons/${ currentCron.isDisabled === 1 ? 'enable' : 'disable' }`, - [currentCron.id], + [currentCron.id], ) .then(({ code, data }) => { if (code === 200) { diff --git a/src/pages/crontab/index.less b/src/pages/crontab/index.less index 967e7ec9..658e7525 100644 --- a/src/pages/crontab/index.less +++ b/src/pages/crontab/index.less @@ -10,6 +10,10 @@ height: calc(90vh - 367px); height: calc(90vh - var(--vh-offset, 0px) - 367px); overflow-y: auto; + + > div { + height: 100%; + } } } } diff --git a/src/pages/crontab/index.tsx b/src/pages/crontab/index.tsx index 996c2858..bfdadcad 100644 --- a/src/pages/crontab/index.tsx +++ b/src/pages/crontab/index.tsx @@ -347,7 +347,7 @@ const Crontab = () => { const [cronViews, setCronViews] = useState([]); const [enabledCronViews, setEnabledCronViews] = useState([]); const [moreMenuActive, setMoreMenuActive] = useState(false); - const tableRef = useRef(); + const tableRef = useRef(null); const tableScrollHeight = useTableScrollHeight(tableRef); const goToScriptManager = (record: any) => { diff --git a/src/pages/crontab/modal.tsx b/src/pages/crontab/modal.tsx index c0ccb1eb..a33c7e74 100644 --- a/src/pages/crontab/modal.tsx +++ b/src/pages/crontab/modal.tsx @@ -31,7 +31,7 @@ const CronModal = ({ ); if (code === 200) { - message.success(cron ? '更新Cron成功' : '新建Cron成功'); + message.success(cron ? '更新任务成功' : '新建任务成功'); handleCancel(data); } setLoading(false); diff --git a/src/pages/dependence/index.tsx b/src/pages/dependence/index.tsx index ec3cbbd6..9ad83b2d 100644 --- a/src/pages/dependence/index.tsx +++ b/src/pages/dependence/index.tsx @@ -190,7 +190,7 @@ const Dependence = () => { const [logDependence, setLogDependence] = useState(); const [isLogModalVisible, setIsLogModalVisible] = useState(false); const [type, setType] = useState('nodejs'); - const tableRef = useRef(); + const tableRef = useRef(null); const tableScrollHeight = useTableScrollHeight(tableRef, 59); const getDependencies = () => { diff --git a/src/pages/env/index.tsx b/src/pages/env/index.tsx index 9588b198..6ecd1510 100644 --- a/src/pages/env/index.tsx +++ b/src/pages/env/index.tsx @@ -214,7 +214,7 @@ const Env = () => { const [selectedRowIds, setSelectedRowIds] = useState([]); const [searchText, setSearchText] = useState(''); const [importLoading, setImportLoading] = useState(false); - const tableRef = useRef(); + const tableRef = useRef(null); const tableScrollHeight = useTableScrollHeight(tableRef, 59); const getEnvs = () => { diff --git a/src/pages/setting/other.tsx b/src/pages/setting/other.tsx index b935764d..dca92214 100644 --- a/src/pages/setting/other.tsx +++ b/src/pages/setting/other.tsx @@ -207,7 +207,7 @@ const Other = ({ { const [pageSize, setPageSize] = useState(20); const [isLogModalVisible, setIsLogModalVisible] = useState(false); const [logSubscription, setLogSubscription] = useState(); - const tableRef = useRef(); + const tableRef = useRef(null); const tableScrollHeight = useTableScrollHeight(tableRef); const runSubscription = (record: any, index: number) => {