diff --git a/admin/package-lock.json b/admin/package-lock.json index d8760d42d..ccf527e0f 100644 --- a/admin/package-lock.json +++ b/admin/package-lock.json @@ -47,6 +47,7 @@ "@typescript-eslint/eslint-plugin": "5.53.0", "@vitejs/plugin-vue": "4.0.0", "autoprefixer": "10.4.13", + "cross-env": "^7.0.3", "eslint": "8.34.0", "eslint-config-standard-with-typescript": "34.0.0", "eslint-plugin-import": "2.27.5", @@ -2616,6 +2617,24 @@ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true }, + "node_modules/cross-env": { + "version": "7.0.3", + "resolved": "https://registry.npmmirror.com/cross-env/-/cross-env-7.0.3.tgz", + "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "bin": { + "cross-env": "src/bin/cross-env.js", + "cross-env-shell": "src/bin/cross-env-shell.js" + }, + "engines": { + "node": ">=10.14", + "npm": ">=6", + "yarn": ">=1" + } + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.3.tgz", diff --git a/admin/package.json b/admin/package.json index b956c880f..8eb0939e2 100644 --- a/admin/package.json +++ b/admin/package.json @@ -5,7 +5,7 @@ "type": "module", "scripts": { "dev": "vite", - "build": "vite build && node publish.cjs", + "build": "cross-env NODE_OPTIONS=--max-old-space-size=4096 && vite build && node publish.cjs", "preview": "vite preview" }, "dependencies": { @@ -60,6 +60,7 @@ "unplugin-auto-import": "0.13.0", "unplugin-vue-components": "0.23.0", "vite": "4.1.0", - "vue-tsc": "1.0.24" + "vue-tsc": "1.0.24", + "cross-env": "^7.0.3" } } diff --git a/admin/src/app/api/wxoplatform.ts b/admin/src/app/api/wxoplatform.ts index 13e2824f6..df87493d1 100644 --- a/admin/src/app/api/wxoplatform.ts +++ b/admin/src/app/api/wxoplatform.ts @@ -60,6 +60,13 @@ export function getWeappLastCommitRecord() { return request.get('wxoplatform/weapp/commit/last') } +/** + * 删除版本 + */ +export function delVersion(id: number) { + return request.delete(`wxoplatform/weapp/version/${id}`) +} + /** * 小程序代码提交 * @returns diff --git a/admin/src/app/components/upgrade/index.vue b/admin/src/app/components/upgrade/index.vue index 1e5aa17ed..cb7f5bef3 100644 --- a/admin/src/app/components/upgrade/index.vue +++ b/admin/src/app/components/upgrade/index.vue @@ -34,37 +34,14 @@ -
- +
+
- - - - - - - - - - - - - - - - - - - - - - -
@@ -132,7 +109,6 @@
-
@@ -156,36 +132,63 @@
-
- - - - -
-
- - - + +
+
+ + + +
@@ -354,8 +357,6 @@ const getUpgradeTaskFn = () => { errorMsg.value = item } }) - errorDialog.value = true - showTerminal.value = false if (upgradeTimer) { clearInterval(upgradeTimer) upgradeTimer = null @@ -365,12 +366,17 @@ const getUpgradeTaskFn = () => { // 恢复完毕 if (data.step == 'restoreComplete') { flashInterval && clearInterval(flashInterval) + step.value = 3 + active.value = 'fail' return } // 升级完成 if (data.step == 'upgradeComplete') { + if (data.cloud_build_error) { + terminalRef.value.pushMessage({ content: data.cloud_build_error, class: 'error' }) + } + step.value = 3 active.value = 'complete' - showTerminal.value = false numberOfSteps.value = 4 notificationEl && notificationEl.close() emits('complete') @@ -379,12 +385,13 @@ const getUpgradeTaskFn = () => { upgradeTimer = null } timeloading.value = false - clearUpgradeTask() return } numberOfSteps.value = 2 active.value = 'upgrade' executeUpgradeFn() + }).catch((err) => { + console.log(err) }) } @@ -395,6 +402,7 @@ const handleBack = () => { isBack.value = true showTerminal.value = true errorDialog.value = false // 隐藏错误弹窗 + step.value = 2 } const formatUpgradeDuration = computed(() => { @@ -646,6 +654,12 @@ const cloudBuildError = (event: string) => { getUpgradeTaskFn() }) break + case 'cloud_build_error_rollback': + upgradeUserOperate(event).then(() => { + handleBack() + executeUpgradeFn() + }) + break } } diff --git a/admin/src/app/lang/zh-cn/channel.weapp.code.json b/admin/src/app/lang/zh-cn/channel.weapp.code.json index 0f4a0fade..e5a156356 100644 --- a/admin/src/app/lang/zh-cn/channel.weapp.code.json +++ b/admin/src/app/lang/zh-cn/channel.weapp.code.json @@ -45,5 +45,6 @@ "againUpload": "重新上传", "uploadWeapp": "上传小程序", "undoAudit" : "撤回审核", - "undoAuditTips" : "撤回代码审核,单个账号每天审核撤回次数最多不超过 5 次(每天的额度从0点开始生效),一个月不超过 10 次。是否要继续撤回?" + "undoAuditTips" : "撤回代码审核,单个账号每天审核撤回次数最多不超过 5 次(每天的额度从0点开始生效),一个月不超过 10 次。是否要继续撤回?", + "helpInfo": "查看帮助" } diff --git a/admin/src/app/lang/zh-cn/channel.wechat.config.json b/admin/src/app/lang/zh-cn/channel.wechat.config.json index 73e8a1b72..fed35519a 100644 --- a/admin/src/app/lang/zh-cn/channel.wechat.config.json +++ b/admin/src/app/lang/zh-cn/channel.wechat.config.json @@ -32,5 +32,5 @@ "safeModeTips": "安全模式下,消息包为纯密文,需要开发者加密和解密,安全系数高", "wechatBaseUri": "借权域名", "wechatBaseUriPlaceholder": "", - "wechatBaseUriTips": "默认留空,填写后将替换https://open.weixin.gg.com/获取授权!" + "wechatBaseUriTips": "默认留空,填写后将替换https://open.weixin.qq.com/获取授权!" } diff --git a/admin/src/app/lang/zh-cn/diy.edit.json b/admin/src/app/lang/zh-cn/diy.edit.json index 02fe72870..fac445428 100644 --- a/admin/src/app/lang/zh-cn/diy.edit.json +++ b/admin/src/app/lang/zh-cn/diy.edit.json @@ -243,7 +243,7 @@ "carouselSearchSwiperSet": "轮播图设置", "carouselSearchSwiperControl": "展示开关", "carouselSearchSwiperInterval": "切换间隔 / 秒", - "carouselSearchSwiperTips": "建议上传尺寸相同的图片,推荐尺寸750*350;鼠标拖拽可调整图片顺序", + "carouselSearchSwiperTips": "建议上传尺寸相同的图片,推荐尺寸750*580;鼠标拖拽可调整图片顺序", "carouselSearchTabStyle": "选项卡样式", "carouselSearchStyle": "搜索框样式", "noColor": "常规颜色", diff --git a/admin/src/app/lang/zh-cn/diy_form.edit.json b/admin/src/app/lang/zh-cn/diy_form.edit.json index d731cc525..952fe36bc 100644 --- a/admin/src/app/lang/zh-cn/diy_form.edit.json +++ b/admin/src/app/lang/zh-cn/diy_form.edit.json @@ -244,7 +244,7 @@ "carouselSearchSwiperSet": "轮播图设置", "carouselSearchSwiperControl": "展示开关", "carouselSearchSwiperInterval": "切换间隔 / 秒", - "carouselSearchSwiperTips": "建议上传尺寸相同的图片,推荐尺寸750*350;鼠标拖拽可调整图片顺序", + "carouselSearchSwiperTips": "建议上传尺寸相同的图片,推荐尺寸750*580;鼠标拖拽可调整图片顺序", "carouselSearchTabStyle": "选项卡样式", "carouselSearchStyle": "搜索框样式", "noColor": "常规颜色", diff --git a/admin/src/app/lang/zh-cn/setting.adminlogin.json b/admin/src/app/lang/zh-cn/setting.adminlogin.json index 6924ef39a..d9a112f43 100644 --- a/admin/src/app/lang/zh-cn/setting.adminlogin.json +++ b/admin/src/app/lang/zh-cn/setting.adminlogin.json @@ -4,5 +4,9 @@ "admin": "平台端", "adminBgImgTip": "建议上传尺寸为450*400px", "site": "站点端", - "siteBgImgTip": "建议上传尺寸为620*980px" + "siteBgImgTip": "建议上传尺寸为620*980px", + "siteLoginLogo": "站点登录Logo", + "siteLoginLogoTips": "站点端登录Logo,建议图片尺寸:132*40像素;图片格式:jpg、png、jpeg。", + "siteLoginBgImg": "站点登录背景图", + "siteLoginBgImgTips": "站点端登录背景图,建议图片尺寸:1920*1280像素;图片格式:jpg、png、jpeg。" } diff --git a/admin/src/app/lang/zh-cn/setting.oplatform.json b/admin/src/app/lang/zh-cn/setting.oplatform.json index 9a2846a1e..622a9cfff 100644 --- a/admin/src/app/lang/zh-cn/setting.oplatform.json +++ b/admin/src/app/lang/zh-cn/setting.oplatform.json @@ -48,5 +48,6 @@ "publicType": "公众平台类型", "siteName": "站点名称", "authTime": "授权时间", - "qrcode": "二维码" + "qrcode": "二维码", + "delWeappVersionTips": "是否确定要删除该版本?" } diff --git a/admin/src/app/lang/zh-cn/site.manage.json b/admin/src/app/lang/zh-cn/site.manage.json index 2d3545c33..ca7d010b9 100644 --- a/admin/src/app/lang/zh-cn/site.manage.json +++ b/admin/src/app/lang/zh-cn/site.manage.json @@ -74,5 +74,9 @@ "foldText":"展开/折叠", "appName": "套餐内含应用", "addonName": "套餐内含插件", - "siteInitTips":"确定要初始化站点吗?该操作将删除站点内所有数据,该操作无法退回,确定要继续初始化吗?" + "siteInitTips":"确定要初始化站点吗?该操作将删除站点内所有数据,该操作无法退回,确定要继续初始化吗?", + "createTimeStartDate": "开始时间(创建时间)", + "createTimeEndDate": "结束时间(创建时间)", + "expireTimeStartDate": "开始时间(到期时间)", + "expireTimeEndDate": "结束时间(到期时间)" } diff --git a/admin/src/app/lang/zh-cn/tools.backup_records.json b/admin/src/app/lang/zh-cn/tools.backup_records.json index c17032eb0..72ad42d86 100644 --- a/admin/src/app/lang/zh-cn/tools.backup_records.json +++ b/admin/src/app/lang/zh-cn/tools.backup_records.json @@ -24,5 +24,6 @@ "startBackUp": "开始备份", "backUpEnd": "备份完成", "remark": "备注", - "remarkEmpty": "无" + "remarkEmpty": "无", + "status": "状态" } diff --git a/admin/src/app/lang/zh-cn/wxoplatform.weapp_version.json b/admin/src/app/lang/zh-cn/wxoplatform.weapp_version.json index 676b13911..c47a4d041 100644 --- a/admin/src/app/lang/zh-cn/wxoplatform.weapp_version.json +++ b/admin/src/app/lang/zh-cn/wxoplatform.weapp_version.json @@ -13,5 +13,6 @@ "syncTemplateError": "未能同步到模板库", "templateID": "模板ID", "siteWeappSync": "站点小程序同步", - "syncSiteWeappTips": "是否要给该套餐下已授权小程序的站点提交代码?" + "syncSiteWeappTips": "是否要给该套餐下已授权小程序的站点提交代码?", + "helpInfo": "查看帮助" } diff --git a/admin/src/app/views/app/index.vue b/admin/src/app/views/app/index.vue index 084e46ec7..73dc83c21 100644 --- a/admin/src/app/views/app/index.vue +++ b/admin/src/app/views/app/index.vue @@ -70,7 +70,13 @@ getAppList() const toLink = (item: any) => { if (item.url) { - router.push(item.url) + // 判断如果携带is_target=true就通过新窗口打开 + if (item.url.indexOf('is_target=true') != -1) { + const url = router.resolve(item.url) + window.open(url.href) + } else { + router.push(item.url) + } } else { addonIndexRoute[item.key] && router.push({ name: addonIndexRoute[item.key] }) } diff --git a/admin/src/app/views/auth/components/edit-menu.vue b/admin/src/app/views/auth/components/edit-menu.vue index e8a498713..e707a1662 100644 --- a/admin/src/app/views/auth/components/edit-menu.vue +++ b/admin/src/app/views/auth/components/edit-menu.vue @@ -24,10 +24,10 @@ @@ -184,6 +184,38 @@ const getAddonMenuFn = async (key: any) => { addonMenuList.value = data } +const markMenuDisabled = (menuList: any[], menuType: number): any[] => { + return menuList.map(item => { + const newItem = { ...item } + // 判断当前节点是否可选 + if (item.menu_key === '') { + // “顶级”节点(仅存在于 sysMenuList) + newItem.disabled = menuType === 2 // 按钮不能选顶级 + } else { + if (menuType === 2) { + // 当前要创建的是按钮 → 只允许选择 menu_type === 1(菜单) + newItem.disabled = item.menu_type !== 1 + } else { + // 当前要创建的是目录/菜单 → 只允许选择 menu_type === 0(目录) + newItem.disabled = item.menu_type !== 0 + } + } + // 递归处理 children + if (Array.isArray(item.children) && item.children.length > 0) { + newItem.children = markMenuDisabled(item.children, menuType) + } + return newItem + }) +} + +const sysMenuListWithDisabled = computed(() => { + return markMenuDisabled(sysMenuList.value, formData.menu_type) +}) + +const addonMenuListWithDisabled = computed(() => { + return markMenuDisabled(addonMenuList.value, formData.menu_type) +}) + // 选择应用 const addonChange = async (val: any) => { formData.parent_key = '' diff --git a/admin/src/app/views/auth/log.vue b/admin/src/app/views/auth/log.vue index f11efa5fc..c196e580e 100644 --- a/admin/src/app/views/auth/log.vue +++ b/admin/src/app/views/auth/log.vue @@ -19,13 +19,19 @@ + + + + {{ t('search') }} {{ t('reset') }} -
+
{{ t('清空日志') }}
@@ -83,7 +89,8 @@ const sysUserLogTableData = reactive({ searchParam: { ip: '', username: '', - url: '' + url: '', + create_time:'' } }) diff --git a/admin/src/app/views/channel/weapp/code.vue b/admin/src/app/views/channel/weapp/code.vue index 10d3993cb..4bb251c62 100644 --- a/admin/src/app/views/channel/weapp/code.vue +++ b/admin/src/app/views/channel/weapp/code.vue @@ -135,6 +135,14 @@
+ @@ -470,6 +478,10 @@ const handleFailReason = (data: any) => { failReasonDialogVisible.value = true } +const helpInfo = () => { + window.open('https://doc.niucloud.com/saasUse.html?keywords=/configFAQ/minWaChatUpload') +} + const knownToKnow = () => { Storage.set({ key: 'weappUploadTipsLock', data: true }) uploadSuccessShowDialog.value = false diff --git a/admin/src/app/views/diy/member.vue b/admin/src/app/views/diy/member.vue index 1a6aad4b3..20850f6e5 100644 --- a/admin/src/app/views/diy/member.vue +++ b/admin/src/app/views/diy/member.vue @@ -30,8 +30,8 @@
- - {{ t('changePage') }} + + {{ t('changePage') }} {{ t('decorate') }}
diff --git a/admin/src/app/views/diy_form/records.vue b/admin/src/app/views/diy_form/records.vue index 59fc02a97..33ef5b716 100644 --- a/admin/src/app/views/diy_form/records.vue +++ b/admin/src/app/views/diy_form/records.vue @@ -115,7 +115,7 @@
+ @size-change="getFormRecordsMemberFn()" @current-change="getFormRecordsMemberFn" />
diff --git a/admin/src/app/views/home/index.vue b/admin/src/app/views/home/index.vue index 9328798d1..1ca6187c3 100644 --- a/admin/src/app/views/home/index.vue +++ b/admin/src/app/views/home/index.vue @@ -203,11 +203,11 @@ {{ item.site_group.group_name }}
-
+
{{ app }}
-
+
{{ addon }}
@@ -363,6 +363,7 @@ const selectSite = (site: any) => { } const toHome = () => { + window.localStorage.setItem('admin.siteId', 0) if (!window.localStorage.getItem('admin.token')) { window.localStorage.setItem('admin.token', getToken()) window.localStorage.setItem('admin.comparisonTokenStorage', getToken()) diff --git a/admin/src/app/views/index/store.vue b/admin/src/app/views/index/store.vue index 9e01807cb..c27d87873 100644 --- a/admin/src/app/views/index/store.vue +++ b/admin/src/app/views/index/store.vue @@ -62,9 +62,9 @@
-
+ :class="{'selected': batchUpgradeApp.includes(row.key)}" v-for="row in localList[activeName]" :key="row.key">
@@ -87,9 +87,24 @@

{{ row.key }}

- + + + + +
-
+
版本: {{ row.install_info && Object.keys(row.install_info)?.length ? row.install_info.version : row.version }} @@ -98,26 +113,17 @@ {{ row.version }}
- 更新记录 -
- -
- - - + + + +
@@ -446,7 +452,14 @@
- +
+ +
+ 已用时 {{ formatUpgradeDuration }} +
+
@@ -639,6 +652,8 @@ const downEventHintFn = () => { downEvent(currDownData.value, true) } +const batchUpgradeApp = ref([]) + const activeNameTabFn = (data: any) => { activeName.value = data storage.set({ key: 'storeActiveName', data }) @@ -873,12 +888,6 @@ let notificationEl = null const getInstallTask = (first: boolean = true) => { getAddonInstalltask().then((res) => { if (res.data) { - upgradeStartTime.value = Date.now() - upgradeDuration.value = 0 - if (upgradeTimer) clearInterval(upgradeTimer) - upgradeTimer = setInterval(() => { - upgradeDuration.value++ - }, 1000) if (first) { installLog = [] currAddon.value = res.data.addon @@ -894,9 +903,14 @@ const getInstallTask = (first: boolean = true) => { showClose: false }) } + if (upgradeTimer) clearInterval(upgradeTimer) + upgradeDuration.value = parseInt(Date.now() / 1000) - res.data.timestamp + upgradeTimer = setInterval(() => { + upgradeDuration.value++ + }, 1000) } if (res.data.error) { - terminalRef.value.pushMessage({ content: res.data.error, class: 'error' }) + terminalRef.value?.pushMessage({ content: res.data.error, class: 'error' }) errorMsg.value = res.data.error errorDialog.value = true if (upgradeTimer) { @@ -912,7 +926,6 @@ const getInstallTask = (first: boolean = true) => { setTimeout(() => { getInstallTask(false) }, 2000) - } else { if (!first) { installStep.value = 2 @@ -922,11 +935,12 @@ const getInstallTask = (first: boolean = true) => { } localListFn() userStore.clearRouters() - notificationEl.close() + notificationEl?.close() } } }).catch((e) => { - terminalRef.value.pushMessage({ content: e.message, class: 'error' }) + console.log(e) + terminalRef.value?.pushMessage({ content: e.message, class: 'error' }) }) } @@ -1252,8 +1266,6 @@ const versionJudge = (row: any) => { return false } -const batchUpgradeApp = ref([]) - const appKeyAllSelect = () => { if (localList.value[activeName.value].length) { if (localList.value[activeName.value].length == batchUpgradeApp.value.length) { @@ -1583,6 +1595,11 @@ html.dark .table-head-bg { .app-card { width: calc((100% - 120px) / 5); min-width: 260px; + + &.selected { + background-color: var(--el-color-primary-light-9); + border-color: var(--el-color-primary-light-9); + } } diff --git a/admin/src/app/views/login/index.vue b/admin/src/app/views/login/index.vue index 992d4648f..dde5dab08 100644 --- a/admin/src/app/views/login/index.vue +++ b/admin/src/app/views/login/index.vue @@ -33,8 +33,8 @@