Skip to content

通用方法

浏览器本地存储(缓存)

配置

web-storage-cache 是一个轻量级的 JavaScript 库,对浏览器原生 localStoragesessionStorage 的扩展,提供了更强大的功能,如自动缓存、版本控制、生命周期管理等,从而提升应用性能和用户体验

  • 代码:src\hooks\web\useCache.ts
  • 默认为 localStorage,可以通过 type 参数进行切换。更改完默认存储方式后,需要清除浏览器缓存并重新登录,以免造成不可描述的问题。
ts
/**
 * 配置浏览器本地存储的方式,可直接存储对象数组。
 */

import WebStorageCache from 'web-storage-cache'

type CacheType = 'localStorage' | 'sessionStorage'

// 缓存键
export const CACHE_KEY = {
  // 用户相关
  ROLE_ROUTERS: 'roleRouters',
  USER: 'user',
  // 系统设置
  IS_DARK: 'isDark',
  LANG: 'lang',
  THEME: 'theme',
  LAYOUT: 'layout',
  DICT_CACHE: 'dictCache',
  // 登录表单
  LoginForm: 'loginForm',
  TenantId: 'tenantId'
}

// 默认为 localStorage,可以通过 type 参数进行切换
export const useCache = (type: CacheType = 'localStorage') => {
  const wsCache: WebStorageCache = new WebStorageCache({
    storage: type
  })

  return {
    wsCache
  }
}

export const deleteUserCache = () => {
  const { wsCache } = useCache()
  wsCache.delete(CACHE_KEY.USER)
  wsCache.delete(CACHE_KEY.ROLE_ROUTERS)
  // 注意,不要清理 LoginForm 登录表单
}

使用示例

实现多语言状态管理

  • 代码:src\store\modules\locale.ts
    • wsCache.set:设置
    • wsCache.get:获取

image-20250630175502695

image-20250630175530279

消息提示

配置

message 对象,由 实现,基于 ElMessage、ElMessageBox、ElNotification 封装,用于做消息提示、通知提示、对话框提醒、二次确认等。

  • 代码:src/hooks/web/useMessage.ts
    • 消息提示:包含 info、error、success、warning 四种类型。
    • 弹出框提示:alert 及其不同类型的变体(如 alertError、alertSuccess 等)。
    • 通知提醒:notify 及其不同类型的通知(如 notifyError、notifySuccess 等)。
    • 确认对话框:confirm、delConfirm、exportConfirm 和 prompt 方法用于弹出确认或输入框。

使用示例

实现删除时,弹窗二次确认。示例:src\views\system\post\index.vue

vue
<script lang="ts" setup>
const message = useMessage() // 消息弹窗

/** 删除按钮操作 */
const handleDelete = async (id: number) => {
  try {
    // 删除的二次确认
    await message.delConfirm()
    // 发起删除
    await PostApi.deletePost(id)
    message.success(t('common.delSuccess'))
    // 刷新列表
    await getList()
  } catch {}
}
</script>

文件下载

配置

download 对象,提供多种文件下载方法,包括 Excel、Word、Zip、HTML、Markdown、JSON 文件的 Blob 下载,以及图片跨域下载和 Base64 转文件功能。

  • 代码:src\utils\download.ts
    • download0:通用下载函数,创建 Blob 和临时链接并触发下载。
    • excel/word/zip/html/markdown/json:指定 MIME 类型调用 download0。
    • image:通过 Canvas 下载图片,支持跨域和尺寸调整。
    • base64ToFile:将 Base64 数据转为 File 对象,用于文件下载或上传。

使用示例

实现导出Excel数据。示例:src\views\system\post\index.vue

vue
<script lang="ts" setup>
import download from '@/utils/download'
    
/** 导出按钮操作 */
const handleExport = async () => {
  try {
    // 导出的二次确认
    await message.exportConfirm()
    // 发起导出
    exportLoading.value = true
    const data = await PostApi.exportPost(queryParams)
    download.excel(data, '岗位列表.xlsx')
  } catch {
  } finally {
    exportLoading.value = false
  }
}

</script>

配置读取

读取配置

配合《后端手册——配置管理》使用。使用场景:前端读取配置信息,执行特定操作。

前端调用 src\api\infra\config\index.tsgetConfigKey(configKey) 方法,获取指定 key 对应的配置的值。

ts
// 根据参数键名查询参数值
export const getConfigKey = (configKey: string) => {
  return request.get({ url: '/infra/config/get-value-by-key?key=' + configKey })
}

使用示例

文件:src\views\infra\server\index.vue。该 Vue 组件用于展示一个后台管理系统的内嵌页面(iframe):

  • 使用 IFrame 加载后台地址,地址由接口动态获取;
  • 页面加载时通过 ConfigApi.getConfigKey 获取配置的 URL;
  • 在加载过程中显示 loading 效果,请求完成后隐藏;
  • 使用 ContentWrap 包裹内容并设置样式。
vue
<template>
  <ContentWrap :bodyStyle="{ padding: '0px' }" class="!mb-0">
    <IFrame v-if="!loading" v-loading="loading" :src="src" />
  </ContentWrap>
</template>
<script lang="ts" setup>
import * as ConfigApi from '@/api/infra/config'

defineOptions({ name: 'InfraAdminServer' })

const loading = ref(true) // 是否加载中
const src = ref(import.meta.env.VITE_BASE_URL + '/admin/applications')

/** 初始化 */
onMounted(async () => {
  try {
    const data = await ConfigApi.getConfigKey('url.spring-boot-admin')
    if (data && data.length > 0) {
      src.value = data
    }
  } finally {
    loading.value = false
  }
})
</script>