1
0
mirror of https://github.com/ialley-workshop-open/uni-halo.git synced 2026-09-12 16:40:40 +08:00

refactor: 重构插件可用性检测逻辑,统一传参和状态管理

1.  抽离统一的插件ID枚举NeedPluginIds,替换硬编码的插件ID字符串
2.  修改usePluginAvailable调用方式,改为对象传参模式
3.  统一插件不可用页面的提示文本和刷新逻辑,新增检测状态绑定
4.  优化uh-plugin-unavailable组件的兜底数据和样式
This commit is contained in:
小莫唐尼
2026-09-04 20:45:08 +08:00
parent 02fa9e4294
commit e371f1b1d6
8 changed files with 99 additions and 46 deletions
@@ -16,13 +16,7 @@
/** 插件信息(未在清单中时兜底) */ /** 插件信息(未在清单中时兜底) */
const pluginInfo = computed(() => { const pluginInfo = computed(() => {
const info = NeedPlugins.get(props.pluginId) return NeedPlugins.get(props.pluginId) ?? {pluginId:props.pluginId, name: '未找到插件' }
return info || {
id: props.pluginId,
name: props.name,
desc: '',
url: '',
}
}) })
function handleRefresh() { function handleRefresh() {
@@ -32,7 +26,7 @@
</script> </script>
<template> <template>
<view v-if="pluginInfo" class="mx-auto my-auto box-border flex flex-col items-center justify-center gap-6 text-sm"> <view v-if="pluginInfo" class="max-w-3/5 mx-auto my-auto box-border flex flex-col items-center justify-center gap-6 text-sm">
<wd-icon class-prefix="uhemoji-icon" name="-cry" size="160rpx"></wd-icon> <wd-icon class-prefix="uhemoji-icon" name="-cry" size="160rpx"></wd-icon>
+14 -5
View File
@@ -3,6 +3,7 @@
import { onPullDownRefresh } from '@dcloudio/uni-app' import { onPullDownRefresh } from '@dcloudio/uni-app'
import { getChartData } from '@/api/uni-halo' import { getChartData } from '@/api/uni-halo'
import { DataLoadingStatusEnum, useDataLoadingStatus } from '@/hooks/useDataLoadingStatus' import { DataLoadingStatusEnum, useDataLoadingStatus } from '@/hooks/useDataLoadingStatus'
import { NeedPluginIds } from '@/hooks/usePluginAvailable'
import type { IDataStatistics } from '@/api/uni-halo' import type { IDataStatistics } from '@/api/uni-halo'
definePage({ definePage({
@@ -13,9 +14,17 @@
}, },
}) })
/** 依赖插件(plugin-data-statistics) */ /** 依赖插件(plugin-data-statistics,参考 gallery 对象传参模式) */
const uniHaloPluginId = 'plugin-data-statistics' const { pluginId, checking, tips, available: uniHaloPluginAvailable, check: checkPluginAvailable } = usePluginAvailable({
const { available: uniHaloPluginAvailable, check: checkPluginAvailable } = usePluginAvailable(uniHaloPluginId) pluginId: NeedPluginIds.PluginDataStatistics,
tips: '阿偶,检测到当前插件没有安装或者启用,无法使用功能哦,请联系管理员',
})
/** 重新检测插件:可用则拉取数据(供 uh-plugin-unavailable 刷新按钮) */
async function handlePluginRefresh() {
if (await checkPluginAvailable())
handleGetData()
}
/* ---------------- 状态 ---------------- */ /* ---------------- 状态 ---------------- */
const { loadingStatus, updateLoadingStatus } = useDataLoadingStatus() const { loadingStatus, updateLoadingStatus } = useDataLoadingStatus()
@@ -163,8 +172,8 @@
<!-- 自定义导航 --> <!-- 自定义导航 -->
<uh-navbar default-title="数据看板" title-color="text-gray-900" /> <uh-navbar default-title="数据看板" title-color="text-gray-900" />
<uh-plugin-unavailable v-if="!uniHaloPluginAvailable" :plugin-id="uniHaloPluginId" <uh-plugin-unavailable v-if="!uniHaloPluginAvailable" :plugin-id="pluginId" :error-text="tips"
error-text="阿偶检测到当前插件没有安装或者启用无法使用功能哦请联系管理员" @on-refresh="handleGetData" /> :checking="checking" @on-refresh="handlePluginRefresh" />
<template v-else> <template v-else>
<uh-data-loading v-if="loadingStatus !== 'success'" :loading-status="loadingStatus" empty-text="暂无统计数据" @refresh="handleGetData" /> <uh-data-loading v-if="loadingStatus !== 'success'" :loading-status="loadingStatus" empty-text="暂无统计数据" @refresh="handleGetData" />
+28 -10
View File
@@ -31,13 +31,29 @@ const settingStore = useSettingStore()
const haloPluginConfigs = computed(() => appConfigStore.configs.pluginConfig) const haloPluginConfigs = computed(() => appConfigStore.configs.pluginConfig)
const globalAppSettings = computed(() => settingStore.settings) const globalAppSettings = computed(() => settingStore.settings)
/* ---------------- 依赖插件 ---------------- */ /* ---------------- 依赖插件(参考 gallery 对象传参模式) ---------------- */
/** 站点 tab:plugin-links */ /** 站点 tab:PluginLinks */
const sitePluginId = NeedPluginIds.PluginLinks const { pluginId: sitePluginId, checking: siteChecking, tips: siteTips, available: sitePluginAvailable, check: checkSitePluginAvailable } = usePluginAvailable({
const { available: sitePluginAvailable, check: checkSitePluginAvailable } = usePluginAvailable(sitePluginId) pluginId: NeedPluginIds.PluginLinks,
tips: '检测到当前插件没有安装或者启用,无法使用友情链接功能哦,请联系管理员',
})
/** 小程序 tab:plugin-uni-halo */ /** 小程序 tab:plugin-uni-halo */
const miniPluginId = NeedPluginIds.PluginUniHalo const { pluginId: miniPluginId, checking: miniChecking, tips: miniTips, available: miniPluginAvailable, check: checkMiniPluginAvailable } = usePluginAvailable({
const { available: miniPluginAvailable, check: checkMiniPluginAvailable } = usePluginAvailable(miniPluginId) pluginId: NeedPluginIds.PluginUniHalo,
tips: '检测到当前插件没有安装或者启用,无法使用小程序链接功能哦,请联系管理员',
})
/** 重新检测站点插件:可用则拉取友链数据(供 uh-plugin-unavailable 刷新按钮) */
async function handleSitePluginRefresh() {
if (await checkSitePluginAvailable())
handleGetLinkGroupData()
}
/** 重新检测小程序插件:可用则拉取小程序链接数据(供 uh-plugin-unavailable 刷新按钮) */
async function handleMiniPluginRefresh() {
if (await checkMiniPluginAvailable())
handleGetMiniProgramLinks()
}
/* ---------------- tabs ---------------- */ /* ---------------- tabs ---------------- */
const activeTabIndex = ref(0) const activeTabIndex = ref(0)
@@ -357,8 +373,9 @@ onReachBottom(() => {
<uh-plugin-unavailable <uh-plugin-unavailable
v-if="!sitePluginAvailable" v-if="!sitePluginAvailable"
:plugin-id="sitePluginId" :plugin-id="sitePluginId"
error-text="检测到当前插件没有安装或者启用无法使用友情链接功能哦请联系管理员" :error-text="siteTips"
@on-refresh="handleGetLinkGroupData" :checking="siteChecking"
@on-refresh="handleSitePluginRefresh"
/> />
<template v-else> <template v-else>
<!-- 加载/错误/空占位(状态机) --> <!-- 加载/错误/空占位(状态机) -->
@@ -455,8 +472,9 @@ onReachBottom(() => {
<uh-plugin-unavailable <uh-plugin-unavailable
v-if="!miniPluginAvailable" v-if="!miniPluginAvailable"
:plugin-id="miniPluginId" :plugin-id="miniPluginId"
error-text="检测到当前插件没有安装或者启用无法使用小程序链接功能哦请联系管理员" :error-text="miniTips"
@on-refresh="handleGetMiniProgramLinks" :checking="miniChecking"
@on-refresh="handleMiniPluginRefresh"
/> />
<template v-else> <template v-else>
<!-- 加载/错误/空占位(状态机) --> <!-- 加载/错误/空占位(状态机) -->
+16 -7
View File
@@ -8,8 +8,8 @@ import { onLoad, onPullDownRefresh } from '@dcloudio/uni-app'
import { getPostListByKeyword } from '@/api/halo' import { getPostListByKeyword } from '@/api/halo'
import { useAppConfigStore } from '@/store/appConfig' import { useAppConfigStore } from '@/store/appConfig'
import { DataLoadingStatusEnum, useDataLoadingStatus } from '@/hooks/useDataLoadingStatus' import { DataLoadingStatusEnum, useDataLoadingStatus } from '@/hooks/useDataLoadingStatus'
import { NeedPluginIds } from '@/hooks/usePluginAvailable'
import { markdownConfig } from '@/config/markdown' import { markdownConfig } from '@/config/markdown'
import { formatTime as formatTimeUtil } from '@/utils/formatTime'
import { debounce } from '@/utils/debounce' import { debounce } from '@/utils/debounce'
definePage({ definePage({
@@ -23,9 +23,17 @@ definePage({
const appConfigStore = useAppConfigStore() const appConfigStore = useAppConfigStore()
const calcAuditModeEnabled = computed(() => appConfigStore.auditModeEnabled) const calcAuditModeEnabled = computed(() => appConfigStore.auditModeEnabled)
/** 依赖插件(plugin-search-widget) */ /** 依赖插件(plugin-search-widget,参考 gallery 对象传参模式) */
const uniHaloPluginId = 'plugin-search-widget' const { pluginId, checking, tips, available: uniHaloPluginAvailable, check: checkPluginAvailable } = usePluginAvailable({
const { available: uniHaloPluginAvailable, check: checkPluginAvailable } = usePluginAvailable(uniHaloPluginId) pluginId: NeedPluginIds.PluginSearchWidget,
tips: '检测到当前插件没有安装或者启用,无法使用搜索功能哦,请联系管理员',
})
/** 重新检测插件:可用则重新搜索(供 uh-plugin-unavailable 刷新按钮) */
async function handlePluginRefresh() {
if (await checkPluginAvailable())
handleOnSearch()
}
/* ---------------- 状态 ---------------- */ /* ---------------- 状态 ---------------- */
const { loadingStatus, updateLoadingStatus } = useDataLoadingStatus() const { loadingStatus, updateLoadingStatus } = useDataLoadingStatus()
@@ -160,9 +168,10 @@ onPullDownRefresh(() => {
<uh-plugin-unavailable <uh-plugin-unavailable
v-if="!uniHaloPluginAvailable" v-if="!uniHaloPluginAvailable"
:plugin-id="uniHaloPluginId" :plugin-id="pluginId"
error-text="检测到当前插件没有安装或者启用无法使用搜索功能哦请联系管理员" :error-text="tips"
@on-refresh="handleOnSearch" :checking="checking"
@on-refresh="handlePluginRefresh"
/> />
<template v-else> <template v-else>
+16 -6
View File
@@ -7,6 +7,7 @@ import { computed, ref } from 'vue'
import { onLoad, onPullDownRefresh, onReachBottom } from '@dcloudio/uni-app' import { onLoad, onPullDownRefresh, onReachBottom } from '@dcloudio/uni-app'
import { getVoteList } from '@/api/uni-halo' import { getVoteList } from '@/api/uni-halo'
import { DataLoadingStatusEnum, useDataLoadingStatus } from '@/hooks/useDataLoadingStatus' import { DataLoadingStatusEnum, useDataLoadingStatus } from '@/hooks/useDataLoadingStatus'
import { NeedPluginIds } from '@/hooks/usePluginAvailable'
import { useAppConfigStore } from '@/store/appConfig' import { useAppConfigStore } from '@/store/appConfig'
import type { IVoteItem } from '@/api/types/uni-halo' import type { IVoteItem } from '@/api/types/uni-halo'
@@ -21,9 +22,17 @@ definePage({
const appConfigStore = useAppConfigStore() const appConfigStore = useAppConfigStore()
const calcAuditModeEnabled = computed(() => appConfigStore.auditModeEnabled) const calcAuditModeEnabled = computed(() => appConfigStore.auditModeEnabled)
/** 依赖插件(plugin-vote) */ /** 依赖插件(plugin-vote,参考 gallery 对象传参模式) */
const uniHaloPluginId = 'plugin-vote' const { pluginId, checking, tips, available: uniHaloPluginAvailable, check: checkPluginAvailable } = usePluginAvailable({
const { available: uniHaloPluginAvailable, check: checkPluginAvailable } = usePluginAvailable(uniHaloPluginId) pluginId: NeedPluginIds.PluginVote,
tips: '检测到当前插件没有安装或者启用,无法使用投票功能哦,请联系管理员',
})
/** 重新检测插件:可用则拉取数据(供 uh-plugin-unavailable 刷新按钮) */
async function handlePluginRefresh() {
if (await checkPluginAvailable())
handleGetData()
}
/* ---------------- 状态 ---------------- */ /* ---------------- 状态 ---------------- */
const { loadingStatus, updateLoadingStatus } = useDataLoadingStatus() const { loadingStatus, updateLoadingStatus } = useDataLoadingStatus()
@@ -128,9 +137,10 @@ onReachBottom(() => {
<uh-plugin-unavailable <uh-plugin-unavailable
v-if="!uniHaloPluginAvailable" v-if="!uniHaloPluginAvailable"
:plugin-id="uniHaloPluginId" :plugin-id="pluginId"
error-text="检测到当前插件没有安装或者启用无法使用投票功能哦请联系管理员" :error-text="tips"
@on-refresh="handleGetData" :checking="checking"
@on-refresh="handlePluginRefresh"
/> />
<template v-else> <template v-else>
<!-- 加载/错误/空占位(状态机) --> <!-- 加载/错误/空占位(状态机) -->
+4 -3
View File
@@ -15,15 +15,16 @@
type ViewState = 'loading' | 'normal' | 'error' | 'maintenance' type ViewState = 'loading' | 'normal' | 'error' | 'maintenance'
type FromReason = 'plugin' | 'maintenance' type FromReason = 'plugin' | 'maintenance'
const uniHaloPluginId = 'plugin-uni-halo'
/** 默认维护标题(拦截场景未配置维护信息时展示) */ /** 默认维护标题(拦截场景未配置维护信息时展示) */
const DEFAULT_MAINTENANCE_TITLE = '我们正在加油升级!' const DEFAULT_MAINTENANCE_TITLE = '我们正在加油升级!'
/** 恢复检测轮询间隔(ms):插件激活/维护结束探测 */ /** 恢复检测轮询间隔(ms):插件激活/维护结束探测 */
const RECOVERY_POLL_INTERVAL = 30 * 1000 const RECOVERY_POLL_INTERVAL = 30 * 1000
const store = useAppConfigStore() const store = useAppConfigStore()
/** 插件可用性(拦截恢复检测用) */ /** 插件可用性(拦截恢复检测用,参考 gallery 对象传参模式) */
const { check: checkPluginAvailable } = usePluginAvailable(uniHaloPluginId) const { check: checkPluginAvailable } = usePluginAvailable({
pluginId: 'plugin-uni-halo',
})
const viewState = ref<ViewState>('loading') const viewState = ref<ViewState>('loading')
const maintenance = ref<IPublicMaintenance | null>(null) const maintenance = ref<IPublicMaintenance | null>(null)
+5 -2
View File
@@ -9,6 +9,7 @@
import { getBlogStatistics } from '@/api/halo' import { getBlogStatistics } from '@/api/halo'
import { useAppConfigStore } from '@/store/appConfig' import { useAppConfigStore } from '@/store/appConfig'
import { useFavoritesStore } from '@/store/favorites' import { useFavoritesStore } from '@/store/favorites'
import { NeedPluginIds } from '@/hooks/usePluginAvailable'
import { checkAvatarUrl, checkImageUrl } from '@/utils/url' import { checkAvatarUrl, checkImageUrl } from '@/utils/url'
import { checkHasAdminLogin } from '@/utils/auth' import { checkHasAdminLogin } from '@/utils/auth'
import { t } from '@/locale' import { t } from '@/locale'
@@ -28,8 +29,10 @@
const calcAuditModeEnabled = computed(() => appConfigStore.auditModeEnabled) const calcAuditModeEnabled = computed(() => appConfigStore.auditModeEnabled)
const calcVotePluginEnabled = computed(() => !!haloConfigs.value.pluginConfig?.votePlugin?.enabled) const calcVotePluginEnabled = computed(() => !!haloConfigs.value.pluginConfig?.votePlugin?.enabled)
const calcLinksPluginEnabled = computed(() => !!haloConfigs.value.pluginConfig?.linksPlugin?.enabled) const calcLinksPluginEnabled = computed(() => !!haloConfigs.value.pluginConfig?.linksPlugin?.enabled)
/** 数据看板插件可用性(供导航项显隐判断) */ /** 数据看板插件可用性(供导航项显隐判断,参考 gallery 对象传参模式) */
const { check: checkDataVisualPlugin } = usePluginAvailable('plugin-data-statistics') const { check: checkDataVisualPlugin } = usePluginAvailable({
pluginId: NeedPluginIds.PluginDataStatistics,
})
/* ---------------- 计算属性 ---------------- */ /* ---------------- 计算属性 ---------------- */
const bloggerInfo = computed(() => { const bloggerInfo = computed(() => {
+14 -5
View File
@@ -8,6 +8,7 @@
import { onLoad, onPullDownRefresh, onReachBottom } from '@dcloudio/uni-app' import { onLoad, onPullDownRefresh, onReachBottom } from '@dcloudio/uni-app'
import { getMomentList } from '@/api/halo' import { getMomentList } from '@/api/halo'
import { useAppConfigStore } from '@/store/appConfig' import { useAppConfigStore } from '@/store/appConfig'
import { NeedPluginIds } from '@/hooks/usePluginAvailable'
import { useFavoritesStore } from '@/store/favorites' import { useFavoritesStore } from '@/store/favorites'
import { checkAvatarUrl, checkThumbnailUrl } from '@/utils/url' import { checkAvatarUrl, checkThumbnailUrl } from '@/utils/url'
import { buildMomentFavoriteItem } from '@/utils/favorite' import { buildMomentFavoriteItem } from '@/utils/favorite'
@@ -46,9 +47,17 @@
return appInfo?.name || bloggerInfo.value.nickname || 'uni-halo' return appInfo?.name || bloggerInfo.value.nickname || 'uni-halo'
}) })
/** 依赖插件(plugin-moments) */ /** 依赖插件(plugin-moments,参考 gallery 对象传参模式) */
const uniHaloPluginId = 'plugin-moments' const { pluginId, checking, tips, available: uniHaloPluginAvailable, check: checkPluginAvailable } = usePluginAvailable({
const { available: uniHaloPluginAvailable, check: checkPluginAvailable } = usePluginAvailable(uniHaloPluginId) pluginId: NeedPluginIds.PluginMoments,
tips: '检测到当前插件没有安装或者启用,无法使用瞬间功能哦,请联系管理员',
})
/** 重新检测插件:可用则拉取数据(供 uh-plugin-unavailable 刷新按钮) */
async function handlePluginRefresh() {
if (await checkPluginAvailable())
handleGetData()
}
/* ---------------- 状态 ---------------- */ /* ---------------- 状态 ---------------- */
const { loadingStatus, updateLoadingStatus } = useDataLoadingStatus() const { loadingStatus, updateLoadingStatus } = useDataLoadingStatus()
@@ -279,8 +288,8 @@
<template> <template>
<view class="box-border min-h-screen w-screen flex flex-col bg-page py-3"> <view class="box-border min-h-screen w-screen flex flex-col bg-page py-3">
<uh-plugin-unavailable v-if="!uniHaloPluginAvailable" :plugin-id="uniHaloPluginId" <uh-plugin-unavailable v-if="!uniHaloPluginAvailable" :plugin-id="pluginId" :error-text="tips"
error-text="检测到当前插件没有安装或者启用无法使用瞬间功能哦请联系管理员" @on-refresh="handleGetData" /> :checking="checking" @on-refresh="handlePluginRefresh" />
<template v-else> <template v-else>
<!-- 加载失败(可重试) --> <!-- 加载失败(可重试) -->
<uh-data-loading v-if="loadingStatus !== DataLoadingStatusEnum.Success" :loading-status="loadingStatus" <uh-data-loading v-if="loadingStatus !== DataLoadingStatusEnum.Success" :loading-status="loadingStatus"