From c320906149e19059f598daeb6cebfdc0a3ba6914 Mon Sep 17 00:00:00 2001 From: whyour Date: Sat, 23 Apr 2022 15:02:54 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BE=9D=E8=B5=96=E7=AE=A1=E7=90=86=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E7=9B=B4=E6=8E=A5=E5=BC=BA=E5=88=B6=E5=88=A0=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- back/api/dependence.ts | 2 +- back/data/dependence.ts | 4 +-- back/data/sock.ts | 1 + back/services/dependence.ts | 34 ++++++++++--------- src/pages/dependence/index.tsx | 60 +++++++++++++++++++++++++--------- 5 files changed, 66 insertions(+), 35 deletions(-) diff --git a/back/api/dependence.ts b/back/api/dependence.ts index 30132486..cd493b71 100644 --- a/back/api/dependence.ts +++ b/back/api/dependence.ts @@ -94,7 +94,7 @@ export default (app: Router) => { const logger: Logger = Container.get('logger'); try { const dependenceService = Container.get(DependenceService); - const data = await dependenceService.removeDb(req.body); + const data = await dependenceService.remove(req.body, true); return res.send({ code: 200, data }); } catch (e) { logger.error('🔥 error: %o', e); diff --git a/back/data/dependence.ts b/back/data/dependence.ts index 17e149b3..6682c3e9 100644 --- a/back/data/dependence.ts +++ b/back/data/dependence.ts @@ -37,13 +37,13 @@ export enum DependenceTypes { } export enum InstallDependenceCommandTypes { - 'npm i -g --force', + 'npm i -g -f --loglevel warn', 'pip3 install', 'apk add --no-cache -f', } export enum unInstallDependenceCommandTypes { - 'npm uninstall -g --force', + 'npm uninstall -g -f --loglevel warn', 'pip3 uninstall -y', 'apk del -f', } diff --git a/back/data/sock.ts b/back/data/sock.ts index 749eeddf..3d280847 100644 --- a/back/data/sock.ts +++ b/back/data/sock.ts @@ -13,5 +13,6 @@ export class SockMessage { export type SockMessageType = | 'ping' | 'installDependence' + | 'uninstallDependence' | 'updateSystemVersion' | 'manuallyRunScript'; diff --git a/back/services/dependence.ts b/back/services/dependence.ts index bdc85476..1d853fbe 100644 --- a/back/services/dependence.ts +++ b/back/services/dependence.ts @@ -56,13 +56,13 @@ export default class DependenceService { return await this.getDb({ id: payload.id }); } - public async remove(ids: number[]) { + public async remove(ids: number[], force = false): Promise { await DependenceModel.update( { status: DependenceStatus.removing, log: [] }, { where: { id: ids } }, ); const docs = await DependenceModel.findAll({ where: { id: ids } }); - this.installOrUninstallDependencies(docs, false); + this.installOrUninstallDependencies(docs, false, force); return docs; } @@ -128,12 +128,16 @@ export default class DependenceService { public installOrUninstallDependencies( dependencies: Dependence[], isInstall: boolean = true, + force: boolean = false, ) { return new Promise(async (resolve) => { if (dependencies.length === 0) { resolve(null); return; } + const socketMessageType = !force + ? 'installDependence' + : 'uninstallDependence'; const depNames = dependencies.map((x) => x.name).join(' '); const depRunCommand = ( isInstall @@ -145,21 +149,21 @@ export default class DependenceService { const cp = spawn(`${depRunCommand} ${depNames}`, { shell: '/bin/bash' }); const startTime = Date.now(); this.sockService.sendMessage({ - type: 'installDependence', + type: socketMessageType, message: `开始${actionText}依赖 ${depNames},开始时间 ${new Date( startTime, - ).toLocaleString()}`, + ).toLocaleString()}\n\n`, references: depIds, }); await this.updateLog( depIds, `开始${actionText}依赖 ${depNames},开始时间 ${new Date( startTime, - ).toLocaleString()}\n`, + ).toLocaleString()}\n\n`, ); cp.stdout.on('data', async (data) => { this.sockService.sendMessage({ - type: 'installDependence', + type: socketMessageType, message: data.toString(), references: depIds, }); @@ -168,7 +172,7 @@ export default class DependenceService { cp.stderr.on('data', async (data) => { this.sockService.sendMessage({ - type: 'installDependence', + type: socketMessageType, message: data.toString(), references: depIds, }); @@ -177,7 +181,7 @@ export default class DependenceService { cp.on('error', async (err) => { this.sockService.sendMessage({ - type: 'installDependence', + type: socketMessageType, message: JSON.stringify(err), references: depIds, }); @@ -191,15 +195,15 @@ export default class DependenceService { const resultText = isSucceed ? '成功' : '失败'; this.sockService.sendMessage({ - type: 'installDependence', - message: `依赖${actionText}${resultText},结束时间 ${new Date( + type: socketMessageType, + message: `\n依赖${actionText}${resultText},结束时间 ${new Date( endTime, ).toLocaleString()},耗时 ${(endTime - startTime) / 1000} 秒`, references: depIds, }); await this.updateLog( depIds, - `依赖${actionText}${resultText},结束时间 ${new Date( + `\n依赖${actionText}${resultText},结束时间 ${new Date( endTime, ).toLocaleString()},耗时 ${(endTime - startTime) / 1000} 秒`, ); @@ -216,11 +220,9 @@ export default class DependenceService { } await DependenceModel.update({ status }, { where: { id: depIds } }); - // 如果删除依赖成功,3秒后删除数据库记录 - if (isSucceed && !isInstall) { - setTimeout(() => { - this.removeDb(depIds); - }, 5000); + // 如果删除依赖成功或者强制删除 + if ((isSucceed || force) && !isInstall) { + this.removeDb(depIds); } resolve(null); diff --git a/src/pages/dependence/index.tsx b/src/pages/dependence/index.tsx index f6eb5fbf..02a30d6b 100644 --- a/src/pages/dependence/index.tsx +++ b/src/pages/dependence/index.tsx @@ -16,7 +16,7 @@ import { DeleteOutlined, SyncOutlined, CheckCircleOutlined, - StopOutlined, + DeleteFilled, BugOutlined, FileTextOutlined, } from '@ant-design/icons'; @@ -120,6 +120,15 @@ const Dependence = ({ headerStyle, isPhone, socketMessage }: any) => { const isPc = !isPhone; return ( + + { + setLogDependence({ ...record, timestamp: Date.now() }); + }} + > + + + {record.status !== Status.安装中 && record.status !== Status.删除中 && ( <> @@ -133,17 +142,13 @@ const Dependence = ({ headerStyle, isPhone, socketMessage }: any) => { + + deleteDependence(record, index, true)}> + + + )} - - { - setLogDependence({ ...record, timestamp: Date.now() }); - }} - > - - - ); }, @@ -182,7 +187,11 @@ const Dependence = ({ headerStyle, isPhone, socketMessage }: any) => { setIsModalVisible(true); }; - const deleteDependence = (record: any, index: number) => { + const deleteDependence = ( + record: any, + index: number, + force: boolean = false, + ) => { Modal.confirm({ title: '确认删除', content: ( @@ -196,10 +205,19 @@ const Dependence = ({ headerStyle, isPhone, socketMessage }: any) => { ), onOk() { request - .delete(`${config.apiPrefix}dependencies`, { data: [record.id] }) + .delete(`${config.apiPrefix}dependencies${force ? '/force' : ''}`, { + data: [record.id], + }) .then((data: any) => { if (data.code === 200) { - handleDependence(data.data[0]); + if (force) { + const i = value.findIndex((x) => x.id === data.data[0].id); + if (i !== -1) { + const result = [...value]; + result.splice(i, 1); + setValue(result); + } + } } else { message.error(data); } @@ -275,13 +293,16 @@ const Dependence = ({ headerStyle, isPhone, socketMessage }: any) => { onChange: onSelectChange, }; - const delDependencies = () => { + const delDependencies = (force: boolean) => { + const forceUrl = force ? '/force' : ''; Modal.confirm({ title: '确认删除', content: <>确认删除选中的依赖吗, onOk() { request - .delete(`${config.apiPrefix}dependencies`, { data: selectedRowIds }) + .delete(`${config.apiPrefix}dependencies${forceUrl}`, { + data: selectedRowIds, + }) .then((data: any) => { if (data.code === 200) { setSelectedRowIds([]); @@ -377,10 +398,17 @@ const Dependence = ({ headerStyle, isPhone, socketMessage }: any) => { + 已选择 {selectedRowIds?.length}