From 0c34df290e099ceabd01e7a4b1dc6f21c7b41a0a Mon Sep 17 00:00:00 2001 From: kuaifan Date: Thu, 15 May 2025 17:41:55 +0800 Subject: [PATCH] no message --- app/Http/Controllers/Api/AppsController.php | 44 ++++++++++------ app/Module/Apps.php | 4 -- language/original-web.txt | 1 + .../assets/js/components/MicroApps/index.vue | 2 +- resources/assets/js/pages/manage.vue | 2 +- .../assets/js/pages/manage/application.vue | 1 - .../pages/manage/components/DialogWrapper.vue | 10 ++-- resources/assets/js/store/actions.js | 52 +++++++++++++------ resources/assets/js/store/state.js | 1 + 9 files changed, 70 insertions(+), 47 deletions(-) diff --git a/app/Http/Controllers/Api/AppsController.php b/app/Http/Controllers/Api/AppsController.php index 5c35d059b..c51993179 100755 --- a/app/Http/Controllers/Api/AppsController.php +++ b/app/Http/Controllers/Api/AppsController.php @@ -81,34 +81,44 @@ class AppsController extends AbstractController } /** - * @api {get} api/apps/entry 04. 获取应用入口点 + * @api {get} api/apps/stats 04. 获取应用状况 * + * @apiDescription 获取应用状况,包括已安装的应用和应用入口点 * @apiVersion 1.0.0 * @apiGroup apps - * @apiName entry - * - * @apiParam {String} [app_name] 应用名称 - * - 不指定则获取所有已安装的应用入口点 + * @apiName stats * * @apiSuccess {Number} ret 返回状态码(1正确、0错误) * @apiSuccess {String} msg 返回信息(错误描述) * @apiSuccess {Object} data 应用入口点信息 */ - public function entry() + public function stats() { User::auth(); - // - $appName = Request::input('app_name'); - // - $cacheKey = 'apps_entry:' . $appName; - $cacheData = Cache::remember($cacheKey, now()->addHour(), function () use ($appName) { - return Apps::getAppEntryPoints($appName); - }); - if (Base::isError($cacheData)) { - Cache::forget($cacheKey); + + // 获取已安装应用列表 + $res = Apps::appList(); + if (Base::isError($res)) { + return $res; } - // - return $cacheData; + $installedName = ['appstore']; + foreach ($res['data'] as $app) { + if ($app['config']['status'] == 'installed') { + $installedName[] = $app['name']; + } + } + + // 获取应用入口点 + $res = Apps::getAppEntryPoints(); + if (Base::isError($res)) { + return $res; + } + $entriesData = $res['data']; + + return Base::retSuccess('success', [ + 'installed' => $installedName, + 'entries' => $entriesData, + ]); } /** diff --git a/app/Module/Apps.php b/app/Module/Apps.php index 8df69d108..39573db24 100644 --- a/app/Module/Apps.php +++ b/app/Module/Apps.php @@ -180,10 +180,6 @@ class Apps */ public static function dockerComposeFinalize(string $appName, string $status): array { - // 清理入口缓存 - Cache::forget('apps_entry:' . $appName); - Cache::forget('apps_entry:'); - // 获取当前应用信息 $appInfo = self::getAppConfig($appName); diff --git a/language/original-web.txt b/language/original-web.txt index 2ee16a343..9e45c2afd 100644 --- a/language/original-web.txt +++ b/language/original-web.txt @@ -2068,3 +2068,4 @@ AI开启新会话失败 应用加载失败 应用不存在 +应用未安装 diff --git a/resources/assets/js/components/MicroApps/index.vue b/resources/assets/js/components/MicroApps/index.vue index 5894fbb83..09e797161 100644 --- a/resources/assets/js/components/MicroApps/index.vue +++ b/resources/assets/js/components/MicroApps/index.vue @@ -424,7 +424,7 @@ export default { microApp.forceSetData(name, {type: 'beforeClose'}, array => { if (!array?.find(item => item === true)) { if (name === 'appstore') { - this.$store.dispatch("updateMicroAppsEntries"); + this.$store.dispatch("updateMicroAppsStats"); } if ($A.isSubElectron) { $A.Electron.sendMessage('windowDestroy'); diff --git a/resources/assets/js/pages/manage.vue b/resources/assets/js/pages/manage.vue index c40f3cf30..97559e842 100644 --- a/resources/assets/js/pages/manage.vue +++ b/resources/assets/js/pages/manage.vue @@ -1186,7 +1186,7 @@ export default { case 'appstore': this.$store.dispatch("openMicroApp", { name: 'appstore', - url: $A.mainUrl('appstore/web/'), + url: 'appstore/web/', disableScopecss: true, }); break; diff --git a/resources/assets/js/pages/manage/application.vue b/resources/assets/js/pages/manage/application.vue index d1f4e3c58..00ed92b60 100644 --- a/resources/assets/js/pages/manage/application.vue +++ b/resources/assets/js/pages/manage/application.vue @@ -364,7 +364,6 @@ export default { }, activated() { this.initList() - this.$store.dispatch("updateMicroAppsEntries"); }, computed: { ...mapState([ diff --git a/resources/assets/js/pages/manage/components/DialogWrapper.vue b/resources/assets/js/pages/manage/components/DialogWrapper.vue index e43294f84..dc893c212 100644 --- a/resources/assets/js/pages/manage/components/DialogWrapper.vue +++ b/resources/assets/js/pages/manage/components/DialogWrapper.vue @@ -2624,12 +2624,10 @@ export default { return; } this.$store.dispatch("openMicroApp", { - name: 'okr-details', - url: $A.mainUrl('apps/okr/'), - props: { - type: 'details', - id, - }, + app_name: 'okr', + key: 'details', + url: 'apps/okr/', + props: {type: 'details', id}, transparent: true, }); }, diff --git a/resources/assets/js/store/actions.js b/resources/assets/js/store/actions.js index 54d672e9f..5a419bcd4 100644 --- a/resources/assets/js/store/actions.js +++ b/resources/assets/js/store/actions.js @@ -623,7 +623,7 @@ export default { dispatch("getProjectByQueue"); dispatch("getTaskForDashboard"); dispatch("dialogMsgRead"); - dispatch("updateMicroAppsEntries"); + dispatch("updateMicroAppsStats"); // const allIds = Object.values(state.userAvatar).map(({userid}) => userid); [...new Set(allIds)].some(userid => dispatch("getUserBasic", {userid})) @@ -4640,43 +4640,61 @@ export default { /** *****************************************************************************************/ /** - * 更新微应用菜单入口 + * 更新微应用状况(已安装、入口菜单) * @param state * @param dispatch * @param appName */ - updateMicroAppsEntries({state, dispatch}, appName) { + updateMicroAppsStats({state, dispatch}) { dispatch("call", { - url: 'apps/entry', - data: { - app_name: appName || null, - }, + url: 'apps/stats', }).then(({data}) => { - state.microAppsEntries = data + state.microAppsInstalled = data.installed + state.microAppsEntries = data.entries }) }, /** * 打开微应用 * @param state - * @param item + * @param menuItem */ - openMicroApp({state}, item) { - if (!item || !$A.isJson(item)) { + openMicroApp({state}, menuItem) { + if (!menuItem || !$A.isJson(menuItem)) { return } const event = { - name: item.app_name || item.name, - url: $A.mainUrl(item.url), + name: menuItem.app_name || menuItem.name, + url: $A.mainUrl(menuItem.url), } - if (item.key) { - event.name += `_${item.key}` + if (!state.microAppsInstalled.includes(event.name)) { + $A.modalWarning("应用未安装"); + return; } - for (let key in item) { + if (menuItem.key) { + event.name += `_${menuItem.key}` + } + for (let key in menuItem) { if (['props', 'transparent', 'keepAlive', 'disableScopecss'].includes(key)) { - event[key] = item[key] + event[key] = menuItem[key] } } emitter.emit('observeMicroApp', event); }, + + /** + * 微应用是否已安装 + * @param state + * @param appName + * @returns {Promise} + */ + isMicroAppInstalled({state}, appName) { + return new Promise(resolve => { + if (!appName) { + resolve(false) + return + } + resolve(!!state.microAppsInstalled.includes(appName)) + }) + } } diff --git a/resources/assets/js/store/state.js b/resources/assets/js/store/state.js index 2f886c541..9b90f530a 100644 --- a/resources/assets/js/store/state.js +++ b/resources/assets/js/store/state.js @@ -262,5 +262,6 @@ export default { longpressData: {type: '', data: null, element: null}, // 微应用菜单入口 + microAppsInstalled: [], microAppsEntries: [], };