78ff060420
- 模板 art-design-pro(MIT)GitHub 直连克隆后裁剪落地 admin/:删除演示页面/示例数据/mock/未用组件,保留构建与依赖清单 - 品牌化:应用名/标题/侧栏与登录页 logo/浏览器 favicon 全部替换为 all-kefu 自有资源(static/kefu-small.png),中文界面 - 八页骨架:login / force-change-password / dashboard / tenants / conversations / config / stats / settings 占位页 + 6 组路由模块 - 权限菜单:meta.roles 前端过滤,super 全量,tenant 隐藏 租户管理/平台设置(角色值与后端一致) - 开发代理:/api 直转 + /api/public 与 /static 携带租户 Host 改写(VITE_TENANT_PREVIEW_HOST),适配后端 TenantHostMiddleware - 认证 API 为开发桩(角色调试开关),Task 3 对接真实登录 Co-Authored-By: Claude Code <noreply@anthropic.com>
85 lines
1.9 KiB
TypeScript
85 lines
1.9 KiB
TypeScript
/**
|
|
* 全局 Loading 加载管理模块
|
|
*
|
|
* 提供统一的全屏加载动画管理
|
|
*
|
|
* ## 主要功能
|
|
*
|
|
* - 全屏 Loading 显示和隐藏
|
|
* - 自动适配明暗主题背景色
|
|
* - 自定义 SVG 加载动画
|
|
* - 单例模式防止重复创建
|
|
* - 锁定页面交互
|
|
*
|
|
* ## 使用场景
|
|
*
|
|
* - 页面初始化加载
|
|
* - 大量数据请求
|
|
* - 路由切换过渡
|
|
* - 异步操作等待
|
|
*
|
|
* ## 特性
|
|
*
|
|
* - 自动检测当前主题并应用对应背景色
|
|
* - 使用自定义 SVG 动画(四点旋转)
|
|
* - 单例模式确保同时只有一个 Loading
|
|
* - 提供便捷的显示/隐藏方法
|
|
*
|
|
* @module utils/ui/loading
|
|
* @author Art Design Pro Team
|
|
*/
|
|
import { fourDotsSpinnerSvg } from '@/assets/svg/loading'
|
|
|
|
/**
|
|
* 获取当前主题对应的loading背景色
|
|
* @returns 背景色字符串
|
|
*/
|
|
const getLoadingBackground = (): string => {
|
|
const isDark = document.documentElement.classList.contains('dark')
|
|
return isDark ? 'rgba(7, 7, 7, 0.85)' : '#fff'
|
|
}
|
|
|
|
const DEFAULT_LOADING_CONFIG = {
|
|
lock: true,
|
|
get background() {
|
|
return getLoadingBackground()
|
|
},
|
|
svg: fourDotsSpinnerSvg,
|
|
svgViewBox: '0 0 40 40',
|
|
customClass: 'art-loading-fix'
|
|
} as const
|
|
|
|
interface LoadingInstance {
|
|
close: () => void
|
|
}
|
|
|
|
let loadingInstance: LoadingInstance | null = null
|
|
|
|
export const loadingService = {
|
|
/**
|
|
* 显示 loading
|
|
* @returns 关闭 loading 的函数
|
|
*/
|
|
showLoading(): () => void {
|
|
if (!loadingInstance) {
|
|
// 每次显示时获取最新的配置,确保背景色与当前主题同步
|
|
const config = {
|
|
...DEFAULT_LOADING_CONFIG,
|
|
background: getLoadingBackground()
|
|
}
|
|
loadingInstance = ElLoading.service(config)
|
|
}
|
|
return () => this.hideLoading()
|
|
},
|
|
|
|
/**
|
|
* 隐藏 loading
|
|
*/
|
|
hideLoading(): void {
|
|
if (loadingInstance) {
|
|
loadingInstance.close()
|
|
loadingInstance = null
|
|
}
|
|
}
|
|
}
|