chore: 小优化

pull/436/head
xiaojunnuo 2025-06-09 11:32:06 +08:00
parent 936167972f
commit 3c7eb2f5e2
5 changed files with 131 additions and 55 deletions

View File

@ -216,12 +216,16 @@ export default async (client, userOpts) => {
return promise; return promise;
} }
async function runPromisePa(tasks, waitTime = 5000) { async function runPromisePa(tasks, waitTime = 8000) {
const results = []; const results = [];
let j = 0
// eslint-disable-next-line no-await-in-loop,no-restricted-syntax // eslint-disable-next-line no-await-in-loop,no-restricted-syntax
for (const task of tasks) { for (const task of tasks) {
j++
log(`开始第${j}个任务`);
results.push(task()); results.push(task());
// eslint-disable-next-line no-await-in-loop // eslint-disable-next-line no-await-in-loop
log(`wait ${waitTime}s`)
await wait(waitTime); await wait(waitTime);
} }
return Promise.all(results); return Promise.all(results);
@ -245,6 +249,7 @@ export default async (client, userOpts) => {
log(`跳过本地验证skipChallengeVerification=true等待 60s`); log(`跳过本地验证skipChallengeVerification=true等待 60s`);
await wait(60 * 1000); await wait(60 * 1000);
} else { } else {
log("开始本地校验")
await runPromisePa(localVerifyTasks, 1000); await runPromisePa(localVerifyTasks, 1000);
log(`本地校验完成,等待${waitDnsDiffuseTime}s`) log(`本地校验完成,等待${waitDnsDiffuseTime}s`)
await wait(waitDnsDiffuseTime * 1000) await wait(waitDnsDiffuseTime * 1000)

View File

@ -18,7 +18,7 @@
<div class="helper">监控请求重试次数</div> <div class="helper">监控请求重试次数</div>
</a-form-item> </a-form-item>
<a-form-item label="监控定时设置" :name="['cron']"> <a-form-item label="监控定时设置" :name="['cron']">
<div class="flex"> <div class="flex flex-baseline">
<cron-editor v-model="formState.cron" :disabled="!settingsStore.isPlus" :allow-every-min="userStore.isAdmin" /> <cron-editor v-model="formState.cron" :disabled="!settingsStore.isPlus" :allow-every-min="userStore.isAdmin" />
<vip-button class="ml-5" mode="button"></vip-button> <vip-button class="ml-5" mode="button"></vip-button>
</div> </div>
@ -71,7 +71,7 @@ const doSave = async (form: any) => {
<style lang="less"> <style lang="less">
.page-user-settings { .page-user-settings {
.user-settings-form { .user-settings-form {
width: 600px; width: 700px;
margin: 20px; margin: 20px;
} }
} }

View File

@ -6,8 +6,28 @@
<text-editable v-model="pipeline.title" :hover-show="false" :disabled="!editMode"></text-editable> <text-editable v-model="pipeline.title" :hover-show="false" :disabled="!editMode"></text-editable>
</div> </div>
<div class="more flex items-center flex-1 justify-end"> <div class="more flex items-center flex-1 justify-end">
<div v-if="isCert" class="flex items-center hidden md:block">
<a-tag class="mr-5 pointer" color="green" type="primary" text="查看证书" @click="viewCert(pipeline.id)">
<span class="flex"><fs-icon icon="ant-design:eye-outlined"></fs-icon> </span>
</a-tag>
<a-tag class="mr-5 pointer" color="green" type="primary" text="下载证书" @click="downloadCert(pipeline.id)">
<span class="flex"> <fs-icon icon="ant-design:download-outlined"></fs-icon> </span>
</a-tag>
</div>
<div class="flex items-center hidden md:block"> <div class="flex items-center hidden md:block">
<a-tag v-if="nextTriggerTimes" color="blue">{{ nextTriggerTimes }}</a-tag> <a-tag v-if="nextTriggerTimes" color="blue">
<span class="flex">
<fs-icon icon="ant-design:time-outline"></fs-icon>
下次执行时间{{ nextTriggerTimes }}
</span>
</a-tag>
<a-tag v-else-if="nextTriggerTimes === false" color="red">
<span class="flex">
<fs-icon icon="ant-design:time-outline"></fs-icon>
未设置触发源不会自动执行
</span>
</a-tag>
</div> </div>
<div class="basis-40 flex justify-end mr-10"> <div class="basis-40 flex justify-end mr-10">
<template v-if="editMode"> <template v-if="editMode">
@ -18,11 +38,6 @@
<fs-button icon="ant-design:edit-outlined" type="primary" @click="edit"></fs-button> <fs-button icon="ant-design:edit-outlined" type="primary" @click="edit"></fs-button>
</template> </template>
</div> </div>
<div v-if="isCert" class="flex items-center hidden md:block">
<fs-button icon="ant-design:eye-outlined" class="mr-5" type="primary" text="查看证书" @click="viewCert(pipeline.id)"> </fs-button>
<fs-button icon="ant-design:download-outlined" class="mr-5" type="primary" text="下载证书" @click="downloadCert(pipeline.id)"> </fs-button>
</div>
</div> </div>
</template> </template>
@ -291,7 +306,17 @@ import { useCertViewer } from "/@/views/certd/pipeline/use";
export default defineComponent({ export default defineComponent({
name: "PipelineEdit", name: "PipelineEdit",
// eslint-disable-next-line vue/no-unused-components // eslint-disable-next-line vue/no-unused-components
components: { FsIcon, PiHistoryTimelineItem, PiTaskForm, PiTriggerForm, PiTaskView, PiStatusShow, PiNotificationForm, VDraggable, TaskShortcuts }, components: {
FsIcon,
PiHistoryTimelineItem,
PiTaskForm,
PiTriggerForm,
PiTaskView,
PiStatusShow,
PiNotificationForm,
VDraggable,
TaskShortcuts,
},
props: { props: {
pipelineId: { pipelineId: {
type: [Number, String], type: [Number, String],
@ -324,7 +349,7 @@ export default defineComponent({
const nextTriggerTimes = computed(() => { const nextTriggerTimes = computed(() => {
const triggers = pipeline.value.triggers; const triggers = pipeline.value.triggers;
if (!triggers || triggers.length === 0) { if (!triggers || triggers.length === 0) {
return null; return false;
} }
let nextTimes: any = []; let nextTimes: any = [];
for (const item of triggers) { for (const item of triggers) {
@ -338,6 +363,7 @@ export default defineComponent({
}); });
const router = useRouter(); const router = useRouter();
function goBack() { function goBack() {
router.back(); router.back();
} }
@ -393,8 +419,10 @@ export default defineComponent({
} }
return true; return true;
} }
const intervalLoadHistoryRef = ref(); const intervalLoadHistoryRef = ref();
const isLoadingHistory = ref(false); const isLoadingHistory = ref(false);
function watchNewHistoryList() { function watchNewHistoryList() {
intervalLoadHistoryRef.value = setInterval(async () => { intervalLoadHistoryRef.value = setInterval(async () => {
if (isLoadingHistory.value) { if (isLoadingHistory.value) {
@ -418,6 +446,7 @@ export default defineComponent({
} }
}, 3000); }, 3000);
} }
onMounted(() => { onMounted(() => {
watchNewHistoryList(); watchNewHistoryList();
}); });
@ -448,7 +477,15 @@ export default defineComponent({
return; return;
} }
const detail: PipelineDetail = await props.options.getPipelineDetail({ pipelineId: value }); const detail: PipelineDetail = await props.options.getPipelineDetail({ pipelineId: value });
currentPipeline.value = _.merge({ title: "新管道流程", stages: [], triggers: [], notifications: [] }, detail.pipeline); currentPipeline.value = _.merge(
{
title: "新管道流程",
stages: [],
triggers: [],
notifications: [],
},
detail.pipeline
);
pipeline.value = currentPipeline.value; pipeline.value = currentPipeline.value;
await loadHistoryList(true); await loadHistoryList(true);
}, },
@ -563,6 +600,7 @@ export default defineComponent({
function isLastStage(index: number) { function isLastStage(index: number) {
return false; return false;
} }
return { return {
stageAdd, stageAdd,
isLastStage, isLastStage,
@ -682,6 +720,7 @@ export default defineComponent({
} }
const validateErrors: Ref = ref({}); const validateErrors: Ref = ref({});
function addValidateError(taskId: string, error: any) { function addValidateError(taskId: string, error: any) {
const errors = validateErrors.value[taskId] || []; const errors = validateErrors.value[taskId] || [];
validateErrors.value[taskId] = errors; validateErrors.value[taskId] = errors;
@ -736,6 +775,7 @@ export default defineComponent({
function hasValidateError(taskId: string) { function hasValidateError(taskId: string) {
return validateErrors.value[taskId] != null; return validateErrors.value[taskId] != null;
} }
const save = async (offEdit = true) => { const save = async (offEdit = true) => {
doValidate(); doValidate();
@ -799,9 +839,11 @@ export default defineComponent({
}; };
const logsCollapse = ref(false); const logsCollapse = ref(false);
function toggleLogsCollapse() { function toggleLogsCollapse() {
logsCollapse.value = !logsCollapse.value; logsCollapse.value = !logsCollapse.value;
} }
return { return {
historyView, historyView,
historyCancel, historyCancel,
@ -900,9 +942,11 @@ export default defineComponent({
text-overflow: ellipsis; text-overflow: ellipsis;
text-wrap: nowrap; text-wrap: nowrap;
display: flex; display: flex;
.back { .back {
margin-right: 10px; margin-right: 10px;
} }
.text-editable { .text-editable {
width: 300px; width: 300px;
} }
@ -912,47 +956,57 @@ export default defineComponent({
.pi-status-show { .pi-status-show {
display: inline-flex; display: inline-flex;
} }
.fs-page-content { .fs-page-content {
overflow-x: auto; overflow-x: auto;
} }
.layout { .layout {
width: 100%; width: 100%;
height: 100%; height: 100%;
position: relative; position: relative;
display: flex; display: flex;
overflow-x: hidden; overflow-x: hidden;
.layout-left { .layout-left {
flex: 1; flex: 1;
height: 100%; height: 100%;
} }
.layout-right { .layout-right {
width: 350px; width: 350px;
height: 100%; height: 100%;
} }
} }
.pipeline-container { .pipeline-container {
width: 100%; width: 100%;
height: 100%; height: 100%;
position: relative; position: relative;
overflow: auto; overflow: auto;
} }
.pipeline { .pipeline {
position: absolute; position: absolute;
left: 0; left: 0;
top: 0; top: 0;
height: 100%; height: 100%;
.stages { .stages {
display: flex; display: flex;
overflow: auto; overflow: auto;
min-width: 100%; min-width: 100%;
height: 100%; height: 100%;
.stage { .stage {
width: 300px; width: 300px;
border-right: 1px solid #c7c7c7; border-right: 1px solid #c7c7c7;
.is-add { .is-add {
visibility: hidden; visibility: hidden;
color: gray; color: gray;
} }
&:hover .is-add { &:hover .is-add {
visibility: visible; visibility: visible;
} }
@ -961,11 +1015,13 @@ export default defineComponent({
padding: 20px; padding: 20px;
color: gray; color: gray;
display: flex; display: flex;
.stage-move-handle { .stage-move-handle {
cursor: move; cursor: move;
margin-left: 4px; margin-left: 4px;
} }
} }
//.sortable-ghost { //.sortable-ghost {
// .line { // .line {
// visibility: hidden; // visibility: hidden;
@ -979,6 +1035,7 @@ export default defineComponent({
&.line-left { &.line-left {
left: 25px; left: 25px;
.flow-line { .flow-line {
border-right: 0; border-right: 0;
} }
@ -986,6 +1043,7 @@ export default defineComponent({
&.line-right { &.line-right {
right: 25px; right: 25px;
.flow-line { .flow-line {
border-left: 0; border-left: 0;
} }
@ -996,6 +1054,7 @@ export default defineComponent({
border: 1px solid #c7c7c7; border: 1px solid #c7c7c7;
border-top: 0; border-top: 0;
} }
.add-stage-btn { .add-stage-btn {
display: inline-flex; display: inline-flex;
visibility: hidden; visibility: hidden;
@ -1005,6 +1064,7 @@ export default defineComponent({
bottom: -12px; bottom: -12px;
left: -12px; left: -12px;
z-index: 100; z-index: 100;
&:hover { &:hover {
color: #1890ff; color: #1890ff;
} }
@ -1017,6 +1077,7 @@ export default defineComponent({
&.line-left { &.line-left {
left: 0; left: 0;
.flow-line { .flow-line {
border-right: 0; border-right: 0;
border-left: 0; border-left: 0;
@ -1025,6 +1086,7 @@ export default defineComponent({
&.line-right { &.line-right {
right: 0; right: 0;
.flow-line { .flow-line {
border-left: 0; border-left: 0;
border-right: 0; border-right: 0;
@ -1044,13 +1106,16 @@ export default defineComponent({
} }
} }
} }
&.last-stage { &.last-stage {
.line { .line {
width: 50% !important; width: 50% !important;
right: auto; right: auto;
.flow-line { .flow-line {
border-right: 0; border-right: 0;
} }
.add-stage-btn { .add-stage-btn {
visibility: hidden; visibility: hidden;
} }
@ -1074,6 +1139,7 @@ export default defineComponent({
} }
} }
} }
.task { .task {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
@ -1086,6 +1152,7 @@ export default defineComponent({
&.in-edit { &.in-edit {
margin-right: 28px; margin-right: 28px;
} }
&.disabled { &.disabled {
} }
} }
@ -1097,12 +1164,15 @@ export default defineComponent({
//font-size: 18px; //font-size: 18px;
cursor: pointer; cursor: pointer;
z-index: 10; z-index: 10;
&:hover { &:hover {
color: #1890ff; color: #1890ff;
} }
&.copy { &.copy {
right: 30px; right: 30px;
} }
&.drag { &.drag {
right: 10px; right: 10px;
cursor: move; cursor: move;
@ -1114,6 +1184,7 @@ export default defineComponent({
} }
position: relative; position: relative;
.shortcut { .shortcut {
position: absolute; position: absolute;
bottom: -10px; bottom: -10px;
@ -1128,6 +1199,7 @@ export default defineComponent({
.layout-right { .layout-right {
position: relative; position: relative;
&.collapsed { &.collapsed {
margin-right: -350px; margin-right: -350px;
} }

View File

@ -101,7 +101,6 @@ export class AliyunDnsProvider extends AbstractDnsProvider {
const requestOption = { const requestOption = {
method: 'POST', method: 'POST',
}; };
try { try {
const ret = await this.client.request('AddDomainRecord', params, requestOption); const ret = await this.client.request('AddDomainRecord', params, requestOption);
this.logger.info('添加域名解析成功:', JSON.stringify(options), ret.RecordId); this.logger.info('添加域名解析成功:', JSON.stringify(options), ret.RecordId);

View File

@ -46,7 +46,7 @@ importers:
packages/core/acme-client: packages/core/acme-client:
dependencies: dependencies:
'@certd/basic': '@certd/basic':
specifier: ^1.35.0 specifier: ^1.35.1
version: link:../basic version: link:../basic
'@peculiar/x509': '@peculiar/x509':
specifier: ^1.11.0 specifier: ^1.11.0
@ -207,10 +207,10 @@ importers:
packages/core/pipeline: packages/core/pipeline:
dependencies: dependencies:
'@certd/basic': '@certd/basic':
specifier: ^1.35.0 specifier: ^1.35.1
version: link:../basic version: link:../basic
'@certd/plus-core': '@certd/plus-core':
specifier: ^1.35.0 specifier: ^1.35.1
version: link:../../pro/plus-core version: link:../../pro/plus-core
dayjs: dayjs:
specifier: ^1.11.7 specifier: ^1.11.7
@ -415,7 +415,7 @@ importers:
packages/libs/lib-k8s: packages/libs/lib-k8s:
dependencies: dependencies:
'@certd/basic': '@certd/basic':
specifier: ^1.35.0 specifier: ^1.35.1
version: link:../../core/basic version: link:../../core/basic
'@kubernetes/client-node': '@kubernetes/client-node':
specifier: 0.21.0 specifier: 0.21.0
@ -455,16 +455,16 @@ importers:
packages/libs/lib-server: packages/libs/lib-server:
dependencies: dependencies:
'@certd/acme-client': '@certd/acme-client':
specifier: ^1.35.0 specifier: ^1.35.1
version: link:../../core/acme-client version: link:../../core/acme-client
'@certd/basic': '@certd/basic':
specifier: ^1.35.0 specifier: ^1.35.1
version: link:../../core/basic version: link:../../core/basic
'@certd/pipeline': '@certd/pipeline':
specifier: ^1.35.0 specifier: ^1.35.1
version: link:../../core/pipeline version: link:../../core/pipeline
'@certd/plus-core': '@certd/plus-core':
specifier: ^1.35.0 specifier: ^1.35.1
version: link:../../pro/plus-core version: link:../../pro/plus-core
'@midwayjs/cache': '@midwayjs/cache':
specifier: ~3.14.0 specifier: ~3.14.0
@ -607,16 +607,16 @@ importers:
packages/plugins/plugin-cert: packages/plugins/plugin-cert:
dependencies: dependencies:
'@certd/acme-client': '@certd/acme-client':
specifier: ^1.35.0 specifier: ^1.35.1
version: link:../../core/acme-client version: link:../../core/acme-client
'@certd/basic': '@certd/basic':
specifier: ^1.35.0 specifier: ^1.35.1
version: link:../../core/basic version: link:../../core/basic
'@certd/pipeline': '@certd/pipeline':
specifier: ^1.35.0 specifier: ^1.35.1
version: link:../../core/pipeline version: link:../../core/pipeline
'@certd/plugin-lib': '@certd/plugin-lib':
specifier: ^1.35.0 specifier: ^1.35.1
version: link:../plugin-lib version: link:../plugin-lib
'@google-cloud/publicca': '@google-cloud/publicca':
specifier: ^1.3.0 specifier: ^1.3.0
@ -698,10 +698,10 @@ importers:
specifier: ^3.787.0 specifier: ^3.787.0
version: 3.810.0(aws-crt@1.26.2) version: 3.810.0(aws-crt@1.26.2)
'@certd/basic': '@certd/basic':
specifier: ^1.35.0 specifier: ^1.35.1
version: link:../../core/basic version: link:../../core/basic
'@certd/pipeline': '@certd/pipeline':
specifier: ^1.35.0 specifier: ^1.35.1
version: link:../../core/pipeline version: link:../../core/pipeline
'@kubernetes/client-node': '@kubernetes/client-node':
specifier: 0.21.0 specifier: 0.21.0
@ -789,19 +789,19 @@ importers:
packages/pro/commercial-core: packages/pro/commercial-core:
dependencies: dependencies:
'@certd/basic': '@certd/basic':
specifier: ^1.35.0 specifier: ^1.35.1
version: link:../../core/basic version: link:../../core/basic
'@certd/lib-server': '@certd/lib-server':
specifier: ^1.35.0 specifier: ^1.35.1
version: link:../../libs/lib-server version: link:../../libs/lib-server
'@certd/pipeline': '@certd/pipeline':
specifier: ^1.35.0 specifier: ^1.35.1
version: link:../../core/pipeline version: link:../../core/pipeline
'@certd/plugin-plus': '@certd/plugin-plus':
specifier: ^1.35.0 specifier: ^1.35.1
version: link:../plugin-plus version: link:../plugin-plus
'@certd/plus-core': '@certd/plus-core':
specifier: ^1.35.0 specifier: ^1.35.1
version: link:../plus-core version: link:../plus-core
'@midwayjs/core': '@midwayjs/core':
specifier: ~3.20.3 specifier: ~3.20.3
@ -886,22 +886,22 @@ importers:
specifier: ^1.0.2 specifier: ^1.0.2
version: 1.0.3 version: 1.0.3
'@certd/basic': '@certd/basic':
specifier: ^1.35.0 specifier: ^1.35.1
version: link:../../core/basic version: link:../../core/basic
'@certd/lib-k8s': '@certd/lib-k8s':
specifier: ^1.35.0 specifier: ^1.35.1
version: link:../../libs/lib-k8s version: link:../../libs/lib-k8s
'@certd/pipeline': '@certd/pipeline':
specifier: ^1.35.0 specifier: ^1.35.1
version: link:../../core/pipeline version: link:../../core/pipeline
'@certd/plugin-cert': '@certd/plugin-cert':
specifier: ^1.35.0 specifier: ^1.35.1
version: link:../../plugins/plugin-cert version: link:../../plugins/plugin-cert
'@certd/plugin-lib': '@certd/plugin-lib':
specifier: ^1.35.0 specifier: ^1.35.1
version: link:../../plugins/plugin-lib version: link:../../plugins/plugin-lib
'@certd/plus-core': '@certd/plus-core':
specifier: ^1.35.0 specifier: ^1.35.1
version: link:../plus-core version: link:../plus-core
ali-oss: ali-oss:
specifier: ^6.21.0 specifier: ^6.21.0
@ -1004,7 +1004,7 @@ importers:
packages/pro/plus-core: packages/pro/plus-core:
dependencies: dependencies:
'@certd/basic': '@certd/basic':
specifier: ^1.35.0 specifier: ^1.35.1
version: link:../../core/basic version: link:../../core/basic
dayjs: dayjs:
specifier: ^1.11.7 specifier: ^1.11.7
@ -1294,10 +1294,10 @@ importers:
version: 0.1.3(zod@3.24.4) version: 0.1.3(zod@3.24.4)
devDependencies: devDependencies:
'@certd/lib-iframe': '@certd/lib-iframe':
specifier: ^1.35.0 specifier: ^1.35.1
version: link:../../libs/lib-iframe version: link:../../libs/lib-iframe
'@certd/pipeline': '@certd/pipeline':
specifier: ^1.35.0 specifier: ^1.35.1
version: link:../../core/pipeline version: link:../../core/pipeline
'@rollup/plugin-commonjs': '@rollup/plugin-commonjs':
specifier: ^25.0.7 specifier: ^25.0.7
@ -1480,46 +1480,46 @@ importers:
specifier: ^3.705.0 specifier: ^3.705.0
version: 3.810.0(aws-crt@1.26.2) version: 3.810.0(aws-crt@1.26.2)
'@certd/acme-client': '@certd/acme-client':
specifier: ^1.35.0 specifier: ^1.35.1
version: link:../../core/acme-client version: link:../../core/acme-client
'@certd/basic': '@certd/basic':
specifier: ^1.35.0 specifier: ^1.35.1
version: link:../../core/basic version: link:../../core/basic
'@certd/commercial-core': '@certd/commercial-core':
specifier: ^1.35.0 specifier: ^1.35.1
version: link:../../pro/commercial-core version: link:../../pro/commercial-core
'@certd/cv4pve-api-javascript': '@certd/cv4pve-api-javascript':
specifier: ^8.4.1 specifier: ^8.4.1
version: 8.4.1 version: 8.4.1
'@certd/jdcloud': '@certd/jdcloud':
specifier: ^1.35.0 specifier: ^1.35.1
version: link:../../libs/lib-jdcloud version: link:../../libs/lib-jdcloud
'@certd/lib-huawei': '@certd/lib-huawei':
specifier: ^1.35.0 specifier: ^1.35.1
version: link:../../libs/lib-huawei version: link:../../libs/lib-huawei
'@certd/lib-k8s': '@certd/lib-k8s':
specifier: ^1.35.0 specifier: ^1.35.1
version: link:../../libs/lib-k8s version: link:../../libs/lib-k8s
'@certd/lib-server': '@certd/lib-server':
specifier: ^1.35.0 specifier: ^1.35.1
version: link:../../libs/lib-server version: link:../../libs/lib-server
'@certd/midway-flyway-js': '@certd/midway-flyway-js':
specifier: ^1.35.0 specifier: ^1.35.1
version: link:../../libs/midway-flyway-js version: link:../../libs/midway-flyway-js
'@certd/pipeline': '@certd/pipeline':
specifier: ^1.35.0 specifier: ^1.35.1
version: link:../../core/pipeline version: link:../../core/pipeline
'@certd/plugin-cert': '@certd/plugin-cert':
specifier: ^1.35.0 specifier: ^1.35.1
version: link:../../plugins/plugin-cert version: link:../../plugins/plugin-cert
'@certd/plugin-lib': '@certd/plugin-lib':
specifier: ^1.35.0 specifier: ^1.35.1
version: link:../../plugins/plugin-lib version: link:../../plugins/plugin-lib
'@certd/plugin-plus': '@certd/plugin-plus':
specifier: ^1.35.0 specifier: ^1.35.1
version: link:../../pro/plugin-plus version: link:../../pro/plugin-plus
'@certd/plus-core': '@certd/plus-core':
specifier: ^1.35.0 specifier: ^1.35.1
version: link:../../pro/plus-core version: link:../../pro/plus-core
'@huaweicloud/huaweicloud-sdk-cdn': '@huaweicloud/huaweicloud-sdk-cdn':
specifier: ^3.1.120 specifier: ^3.1.120