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:
@@ -16,13 +16,7 @@
|
||||
|
||||
/** 插件信息(未在清单中时兜底) */
|
||||
const pluginInfo = computed(() => {
|
||||
const info = NeedPlugins.get(props.pluginId)
|
||||
return info || {
|
||||
id: props.pluginId,
|
||||
name: props.name,
|
||||
desc: '',
|
||||
url: '',
|
||||
}
|
||||
return NeedPlugins.get(props.pluginId) ?? {pluginId:props.pluginId, name: '未找到插件' }
|
||||
})
|
||||
|
||||
function handleRefresh() {
|
||||
@@ -32,7 +26,7 @@
|
||||
</script>
|
||||
|
||||
<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>
|
||||
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
import { onPullDownRefresh } from '@dcloudio/uni-app'
|
||||
import { getChartData } from '@/api/uni-halo'
|
||||
import { DataLoadingStatusEnum, useDataLoadingStatus } from '@/hooks/useDataLoadingStatus'
|
||||
import { NeedPluginIds } from '@/hooks/usePluginAvailable'
|
||||
import type { IDataStatistics } from '@/api/uni-halo'
|
||||
|
||||
definePage({
|
||||
@@ -13,9 +14,17 @@
|
||||
},
|
||||
})
|
||||
|
||||
/** 依赖插件(plugin-data-statistics) */
|
||||
const uniHaloPluginId = 'plugin-data-statistics'
|
||||
const { available: uniHaloPluginAvailable, check: checkPluginAvailable } = usePluginAvailable(uniHaloPluginId)
|
||||
/** 依赖插件(plugin-data-statistics,参考 gallery 对象传参模式) */
|
||||
const { pluginId, checking, tips, available: uniHaloPluginAvailable, check: checkPluginAvailable } = usePluginAvailable({
|
||||
pluginId: NeedPluginIds.PluginDataStatistics,
|
||||
tips: '阿偶,检测到当前插件没有安装或者启用,无法使用功能哦,请联系管理员',
|
||||
})
|
||||
|
||||
/** 重新检测插件:可用则拉取数据(供 uh-plugin-unavailable 刷新按钮) */
|
||||
async function handlePluginRefresh() {
|
||||
if (await checkPluginAvailable())
|
||||
handleGetData()
|
||||
}
|
||||
|
||||
/* ---------------- 状态 ---------------- */
|
||||
const { loadingStatus, updateLoadingStatus } = useDataLoadingStatus()
|
||||
@@ -163,8 +172,8 @@
|
||||
<!-- 自定义导航 -->
|
||||
<uh-navbar default-title="数据看板" title-color="text-gray-900" />
|
||||
|
||||
<uh-plugin-unavailable v-if="!uniHaloPluginAvailable" :plugin-id="uniHaloPluginId"
|
||||
error-text="阿偶,检测到当前插件没有安装或者启用,无法使用功能哦,请联系管理员" @on-refresh="handleGetData" />
|
||||
<uh-plugin-unavailable v-if="!uniHaloPluginAvailable" :plugin-id="pluginId" :error-text="tips"
|
||||
:checking="checking" @on-refresh="handlePluginRefresh" />
|
||||
<template v-else>
|
||||
<uh-data-loading v-if="loadingStatus !== 'success'" :loading-status="loadingStatus" empty-text="暂无统计数据" @refresh="handleGetData" />
|
||||
|
||||
|
||||
@@ -31,13 +31,29 @@ const settingStore = useSettingStore()
|
||||
const haloPluginConfigs = computed(() => appConfigStore.configs.pluginConfig)
|
||||
const globalAppSettings = computed(() => settingStore.settings)
|
||||
|
||||
/* ---------------- 依赖插件 ---------------- */
|
||||
/** 站点 tab:plugin-links */
|
||||
const sitePluginId = NeedPluginIds.PluginLinks
|
||||
const { available: sitePluginAvailable, check: checkSitePluginAvailable } = usePluginAvailable(sitePluginId)
|
||||
/* ---------------- 依赖插件(参考 gallery 对象传参模式) ---------------- */
|
||||
/** 站点 tab:PluginLinks */
|
||||
const { pluginId: sitePluginId, checking: siteChecking, tips: siteTips, available: sitePluginAvailable, check: checkSitePluginAvailable } = usePluginAvailable({
|
||||
pluginId: NeedPluginIds.PluginLinks,
|
||||
tips: '检测到当前插件没有安装或者启用,无法使用友情链接功能哦,请联系管理员',
|
||||
})
|
||||
/** 小程序 tab:plugin-uni-halo */
|
||||
const miniPluginId = NeedPluginIds.PluginUniHalo
|
||||
const { available: miniPluginAvailable, check: checkMiniPluginAvailable } = usePluginAvailable(miniPluginId)
|
||||
const { pluginId: miniPluginId, checking: miniChecking, tips: miniTips, available: miniPluginAvailable, check: checkMiniPluginAvailable } = usePluginAvailable({
|
||||
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 ---------------- */
|
||||
const activeTabIndex = ref(0)
|
||||
@@ -357,8 +373,9 @@ onReachBottom(() => {
|
||||
<uh-plugin-unavailable
|
||||
v-if="!sitePluginAvailable"
|
||||
:plugin-id="sitePluginId"
|
||||
error-text="检测到当前插件没有安装或者启用,无法使用友情链接功能哦,请联系管理员"
|
||||
@on-refresh="handleGetLinkGroupData"
|
||||
:error-text="siteTips"
|
||||
:checking="siteChecking"
|
||||
@on-refresh="handleSitePluginRefresh"
|
||||
/>
|
||||
<template v-else>
|
||||
<!-- 加载/错误/空占位(状态机) -->
|
||||
@@ -455,8 +472,9 @@ onReachBottom(() => {
|
||||
<uh-plugin-unavailable
|
||||
v-if="!miniPluginAvailable"
|
||||
:plugin-id="miniPluginId"
|
||||
error-text="检测到当前插件没有安装或者启用,无法使用小程序链接功能哦,请联系管理员"
|
||||
@on-refresh="handleGetMiniProgramLinks"
|
||||
:error-text="miniTips"
|
||||
:checking="miniChecking"
|
||||
@on-refresh="handleMiniPluginRefresh"
|
||||
/>
|
||||
<template v-else>
|
||||
<!-- 加载/错误/空占位(状态机) -->
|
||||
|
||||
@@ -8,8 +8,8 @@ import { onLoad, onPullDownRefresh } from '@dcloudio/uni-app'
|
||||
import { getPostListByKeyword } from '@/api/halo'
|
||||
import { useAppConfigStore } from '@/store/appConfig'
|
||||
import { DataLoadingStatusEnum, useDataLoadingStatus } from '@/hooks/useDataLoadingStatus'
|
||||
import { NeedPluginIds } from '@/hooks/usePluginAvailable'
|
||||
import { markdownConfig } from '@/config/markdown'
|
||||
import { formatTime as formatTimeUtil } from '@/utils/formatTime'
|
||||
import { debounce } from '@/utils/debounce'
|
||||
|
||||
definePage({
|
||||
@@ -23,9 +23,17 @@ definePage({
|
||||
const appConfigStore = useAppConfigStore()
|
||||
const calcAuditModeEnabled = computed(() => appConfigStore.auditModeEnabled)
|
||||
|
||||
/** 依赖插件(plugin-search-widget) */
|
||||
const uniHaloPluginId = 'plugin-search-widget'
|
||||
const { available: uniHaloPluginAvailable, check: checkPluginAvailable } = usePluginAvailable(uniHaloPluginId)
|
||||
/** 依赖插件(plugin-search-widget,参考 gallery 对象传参模式) */
|
||||
const { pluginId, checking, tips, available: uniHaloPluginAvailable, check: checkPluginAvailable } = usePluginAvailable({
|
||||
pluginId: NeedPluginIds.PluginSearchWidget,
|
||||
tips: '检测到当前插件没有安装或者启用,无法使用搜索功能哦,请联系管理员',
|
||||
})
|
||||
|
||||
/** 重新检测插件:可用则重新搜索(供 uh-plugin-unavailable 刷新按钮) */
|
||||
async function handlePluginRefresh() {
|
||||
if (await checkPluginAvailable())
|
||||
handleOnSearch()
|
||||
}
|
||||
|
||||
/* ---------------- 状态 ---------------- */
|
||||
const { loadingStatus, updateLoadingStatus } = useDataLoadingStatus()
|
||||
@@ -160,9 +168,10 @@ onPullDownRefresh(() => {
|
||||
|
||||
<uh-plugin-unavailable
|
||||
v-if="!uniHaloPluginAvailable"
|
||||
:plugin-id="uniHaloPluginId"
|
||||
error-text="检测到当前插件没有安装或者启用,无法使用搜索功能哦,请联系管理员"
|
||||
@on-refresh="handleOnSearch"
|
||||
:plugin-id="pluginId"
|
||||
:error-text="tips"
|
||||
:checking="checking"
|
||||
@on-refresh="handlePluginRefresh"
|
||||
/>
|
||||
|
||||
<template v-else>
|
||||
|
||||
@@ -7,6 +7,7 @@ import { computed, ref } from 'vue'
|
||||
import { onLoad, onPullDownRefresh, onReachBottom } from '@dcloudio/uni-app'
|
||||
import { getVoteList } from '@/api/uni-halo'
|
||||
import { DataLoadingStatusEnum, useDataLoadingStatus } from '@/hooks/useDataLoadingStatus'
|
||||
import { NeedPluginIds } from '@/hooks/usePluginAvailable'
|
||||
import { useAppConfigStore } from '@/store/appConfig'
|
||||
import type { IVoteItem } from '@/api/types/uni-halo'
|
||||
|
||||
@@ -21,9 +22,17 @@ definePage({
|
||||
const appConfigStore = useAppConfigStore()
|
||||
const calcAuditModeEnabled = computed(() => appConfigStore.auditModeEnabled)
|
||||
|
||||
/** 依赖插件(plugin-vote) */
|
||||
const uniHaloPluginId = 'plugin-vote'
|
||||
const { available: uniHaloPluginAvailable, check: checkPluginAvailable } = usePluginAvailable(uniHaloPluginId)
|
||||
/** 依赖插件(plugin-vote,参考 gallery 对象传参模式) */
|
||||
const { pluginId, checking, tips, available: uniHaloPluginAvailable, check: checkPluginAvailable } = usePluginAvailable({
|
||||
pluginId: NeedPluginIds.PluginVote,
|
||||
tips: '检测到当前插件没有安装或者启用,无法使用投票功能哦,请联系管理员',
|
||||
})
|
||||
|
||||
/** 重新检测插件:可用则拉取数据(供 uh-plugin-unavailable 刷新按钮) */
|
||||
async function handlePluginRefresh() {
|
||||
if (await checkPluginAvailable())
|
||||
handleGetData()
|
||||
}
|
||||
|
||||
/* ---------------- 状态 ---------------- */
|
||||
const { loadingStatus, updateLoadingStatus } = useDataLoadingStatus()
|
||||
@@ -128,9 +137,10 @@ onReachBottom(() => {
|
||||
|
||||
<uh-plugin-unavailable
|
||||
v-if="!uniHaloPluginAvailable"
|
||||
:plugin-id="uniHaloPluginId"
|
||||
error-text="检测到当前插件没有安装或者启用,无法使用投票功能哦,请联系管理员"
|
||||
@on-refresh="handleGetData"
|
||||
:plugin-id="pluginId"
|
||||
:error-text="tips"
|
||||
:checking="checking"
|
||||
@on-refresh="handlePluginRefresh"
|
||||
/>
|
||||
<template v-else>
|
||||
<!-- 加载/错误/空占位(状态机) -->
|
||||
|
||||
@@ -15,15 +15,16 @@
|
||||
type ViewState = 'loading' | 'normal' | 'error' | 'maintenance'
|
||||
type FromReason = 'plugin' | 'maintenance'
|
||||
|
||||
const uniHaloPluginId = 'plugin-uni-halo'
|
||||
/** 默认维护标题(拦截场景未配置维护信息时展示) */
|
||||
const DEFAULT_MAINTENANCE_TITLE = '我们正在加油升级!'
|
||||
/** 恢复检测轮询间隔(ms):插件激活/维护结束探测 */
|
||||
const RECOVERY_POLL_INTERVAL = 30 * 1000
|
||||
|
||||
const store = useAppConfigStore()
|
||||
/** 插件可用性(拦截恢复检测用) */
|
||||
const { check: checkPluginAvailable } = usePluginAvailable(uniHaloPluginId)
|
||||
/** 插件可用性(拦截恢复检测用,参考 gallery 对象传参模式) */
|
||||
const { check: checkPluginAvailable } = usePluginAvailable({
|
||||
pluginId: 'plugin-uni-halo',
|
||||
})
|
||||
|
||||
const viewState = ref<ViewState>('loading')
|
||||
const maintenance = ref<IPublicMaintenance | null>(null)
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
import { getBlogStatistics } from '@/api/halo'
|
||||
import { useAppConfigStore } from '@/store/appConfig'
|
||||
import { useFavoritesStore } from '@/store/favorites'
|
||||
import { NeedPluginIds } from '@/hooks/usePluginAvailable'
|
||||
import { checkAvatarUrl, checkImageUrl } from '@/utils/url'
|
||||
import { checkHasAdminLogin } from '@/utils/auth'
|
||||
import { t } from '@/locale'
|
||||
@@ -28,8 +29,10 @@
|
||||
const calcAuditModeEnabled = computed(() => appConfigStore.auditModeEnabled)
|
||||
const calcVotePluginEnabled = computed(() => !!haloConfigs.value.pluginConfig?.votePlugin?.enabled)
|
||||
const calcLinksPluginEnabled = computed(() => !!haloConfigs.value.pluginConfig?.linksPlugin?.enabled)
|
||||
/** 数据看板插件可用性(供导航项显隐判断) */
|
||||
const { check: checkDataVisualPlugin } = usePluginAvailable('plugin-data-statistics')
|
||||
/** 数据看板插件可用性(供导航项显隐判断,参考 gallery 对象传参模式) */
|
||||
const { check: checkDataVisualPlugin } = usePluginAvailable({
|
||||
pluginId: NeedPluginIds.PluginDataStatistics,
|
||||
})
|
||||
|
||||
/* ---------------- 计算属性 ---------------- */
|
||||
const bloggerInfo = computed(() => {
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
import { onLoad, onPullDownRefresh, onReachBottom } from '@dcloudio/uni-app'
|
||||
import { getMomentList } from '@/api/halo'
|
||||
import { useAppConfigStore } from '@/store/appConfig'
|
||||
import { NeedPluginIds } from '@/hooks/usePluginAvailable'
|
||||
import { useFavoritesStore } from '@/store/favorites'
|
||||
import { checkAvatarUrl, checkThumbnailUrl } from '@/utils/url'
|
||||
import { buildMomentFavoriteItem } from '@/utils/favorite'
|
||||
@@ -46,9 +47,17 @@
|
||||
return appInfo?.name || bloggerInfo.value.nickname || 'uni-halo'
|
||||
})
|
||||
|
||||
/** 依赖插件(plugin-moments) */
|
||||
const uniHaloPluginId = 'plugin-moments'
|
||||
const { available: uniHaloPluginAvailable, check: checkPluginAvailable } = usePluginAvailable(uniHaloPluginId)
|
||||
/** 依赖插件(plugin-moments,参考 gallery 对象传参模式) */
|
||||
const { pluginId, checking, tips, available: uniHaloPluginAvailable, check: checkPluginAvailable } = usePluginAvailable({
|
||||
pluginId: NeedPluginIds.PluginMoments,
|
||||
tips: '检测到当前插件没有安装或者启用,无法使用瞬间功能哦,请联系管理员',
|
||||
})
|
||||
|
||||
/** 重新检测插件:可用则拉取数据(供 uh-plugin-unavailable 刷新按钮) */
|
||||
async function handlePluginRefresh() {
|
||||
if (await checkPluginAvailable())
|
||||
handleGetData()
|
||||
}
|
||||
|
||||
/* ---------------- 状态 ---------------- */
|
||||
const { loadingStatus, updateLoadingStatus } = useDataLoadingStatus()
|
||||
@@ -279,8 +288,8 @@
|
||||
|
||||
<template>
|
||||
<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"
|
||||
error-text="检测到当前插件没有安装或者启用,无法使用瞬间功能哦,请联系管理员" @on-refresh="handleGetData" />
|
||||
<uh-plugin-unavailable v-if="!uniHaloPluginAvailable" :plugin-id="pluginId" :error-text="tips"
|
||||
:checking="checking" @on-refresh="handlePluginRefresh" />
|
||||
<template v-else>
|
||||
<!-- 加载失败(可重试) -->
|
||||
<uh-data-loading v-if="loadingStatus !== DataLoadingStatusEnum.Success" :loading-status="loadingStatus"
|
||||
|
||||
Reference in New Issue
Block a user