diff --git a/astrbot/dashboard/routes/plugin.py b/astrbot/dashboard/routes/plugin.py index 4948571ac..0ff4fff6e 100644 --- a/astrbot/dashboard/routes/plugin.py +++ b/astrbot/dashboard/routes/plugin.py @@ -1,6 +1,5 @@ import traceback import aiohttp -import uuid from .route import Route, Response, RouteContext from astrbot.core import logger from quart import request @@ -49,7 +48,7 @@ class PluginRoute(Route): return Response().error(message).__dict__ return Response().ok(None, "重载成功。").__dict__ except Exception as e: - logger.error(f"/api/extensions/reload: {traceback.format_exc()}") + logger.error(f"/api/plugin/reload: {traceback.format_exc()}") return Response().error(str(e)).__dict__ async def get_online_plugins(self): @@ -59,7 +58,6 @@ class PluginRoute(Route): urls = [custom] else: urls = [ - "https://soulter.github.io/AstrBot_Plugins_Collection/plugins.json", "https://api.soulter.top/astrbot/plugins" ] @@ -88,6 +86,7 @@ class PluginRoute(Route): "version": plugin.version, "reserved": plugin.reserved, "activated": plugin.activated, + "online_vesion": "", "handlers": await self.get_plugin_handlers_info(plugin.star_handler_full_names), } _plugin_resp.append(_t) @@ -190,7 +189,7 @@ class PluginRoute(Route): logger.info(f"更新插件 {plugin_name} 成功。") return Response().ok(None, "更新成功。").__dict__ except Exception as e: - logger.error(f"/api/extensions/update: {traceback.format_exc()}") + logger.error(f"/api/plugin/update: {traceback.format_exc()}") return Response().error(str(e)).__dict__ async def off_plugin(self): @@ -201,7 +200,7 @@ class PluginRoute(Route): logger.info(f"停用插件 {plugin_name} 。") return Response().ok(None, "停用成功。").__dict__ except Exception as e: - logger.error(f"/api/extensions/off: {traceback.format_exc()}") + logger.error(f"/api/plugin/off: {traceback.format_exc()}") return Response().error(str(e)).__dict__ async def on_plugin(self): @@ -212,5 +211,5 @@ class PluginRoute(Route): logger.info(f"启用插件 {plugin_name} 。") return Response().ok(None, "启用成功。").__dict__ except Exception as e: - logger.error(f"/api/extensions/on: {traceback.format_exc()}") + logger.error(f"/api/plugin/on: {traceback.format_exc()}") return Response().error(str(e)).__dict__ \ No newline at end of file diff --git a/dashboard/src/components/shared/ExtensionCard.vue b/dashboard/src/components/shared/ExtensionCard.vue index 45904ec37..04df9d969 100644 --- a/dashboard/src/components/shared/ExtensionCard.vue +++ b/dashboard/src/components/shared/ExtensionCard.vue @@ -2,7 +2,8 @@ const props = defineProps({ title: String, link: String, - logo: String + logo: String, + has_update: Boolean, }); const open = (link: string | undefined) => { @@ -17,6 +18,7 @@ const open = (link: string | undefined) => { logo {{ props.title }} + mdi-arrow-up-bold 帮助 diff --git a/dashboard/src/views/ExtensionPage.vue b/dashboard/src/views/ExtensionPage.vue index 62fb6debf..2fe29479c 100644 --- a/dashboard/src/views/ExtensionPage.vue +++ b/dashboard/src/views/ExtensionPage.vue @@ -46,11 +46,20 @@ import { max } from 'date-fns'; - -
- By @{{ extension.author }} - | 插件有 {{ extension.handlers.length }} 个行为 +
+
+ By @{{ extension.author }} + | 插件有 {{ extension.handlers.length }} 个行为 +
+ 当前: {{ extension.version }} + + | 最新: {{ extension.online_version }} + + 有更新 + +

{{ extension.desc }}

重载插件 @@ -329,6 +338,8 @@ export default { { title: '作者', value: 'author' }, { title: '操作', value: 'actions', sortable: false } ], + + alreadyCheckUpdate: false } }, mounted() { @@ -367,10 +378,29 @@ export default { getExtensions() { axios.get('/api/plugin/get').then((res) => { this.extension_data = res.data; - this.checkAlreadyInstalled(); + this.checkUpdate() }); }, + + checkUpdate() { + // 遍历 extension_data 和 pluginMarketData,检查是否有更新\ + for (let i = 0; i < this.extension_data.data.length; i++) { + for (let j = 0; j < this.pluginMarketData.length; j++) { + console.log(this.extension_data.data[i].repo, this.pluginMarketData[j].repo); + if (this.extension_data.data[i].repo === this.pluginMarketData[j].repo || + this.extension_data.data[i].name === this.pluginMarketData[j].name) { + this.extension_data.data[i].online_version = this.pluginMarketData[j].version; + if (this.extension_data.data[i].version !== this.pluginMarketData[j].version && this.pluginMarketData[j].version !== "未知") { + this.extension_data.data[i].has_update = true; + } else { + this.extension_data.data[i].has_update = false; + } + } + } + } + }, + newExtension() { if (this.extension_url === "" && this.upload_file === null) { this.toast("请填写插件链接或上传插件文件", "error"); @@ -529,11 +559,13 @@ export default { "desc": res.data.data[key].desc, "author": res.data.data[key].author, "repo": res.data.data[key].repo, - "installed": false + "installed": false, + "version": res.data.data[key]?.version ? res.data.data[key].version : "未知", }) } this.pluginMarketData = data; this.checkAlreadyInstalled(); + this.checkUpdate(); }).catch((err) => { this.toast("获取插件市场数据失败: " + err, "error"); });