2.2.4 • Published 6 days ago

@toystory/lotso v2.2.4

Weekly downloads
-
License
MIT
Repository
-
Last release
6 days ago

后台管理系统脚手架

基于Vue3.0,使用Element Plus框架,Vite构建

安装

yarn add @toystory/lotso -S
# OR
npm i @toystory/lotso -S

使用

一、注册

在main.js中引入,示例如下:

import options from '@/config/setting'
import requestConfig from '@/config/request.config'

import { createFrameApp, useRouter, usePermission, useUserStore, useRoutesStore } from '@toystory/lotso'
import '@toystory/lotso/dist/style.css'

import { getUserInfo, getAuthData } from '@/api'
import App from './App.vue'


// 注册框架,传入项目配置和store,页面路径
const app = createFrameApp(App, {
  options,
  requestConfig,
  constantFile: import.meta.glob('./pages/**/index.vue'),
  constantConfig: import.meta.globEager('./pages/**/config.js'),
  // 若配置接管权限路由,无需引入asyncFile
  asyncFile: import.meta.glob('./views/**/index.vue'),
  asyncConfig: import.meta.globEager('./views/**/config.js')
})

app.mount('#app')

// 使用脚手架自带的守卫
const { router } = useRouter()
const { handlePermission } = usePermission({
  // 需要把获取用户信息的方法和获取数据权限的方法传递给Permission hooks
  getUserInfo: async () => {
    // ...
  },
  getAuthData: async () => {
    // ...
  }
})
router.beforeEach((to, from, next) => {
  handlePermission(to, from, next)
})

二、配置文件参考

  1. setting.js
export default {
  // 是否显示顶部进度条
  progressBar: true,
  // 菜单栏默认打开路由
  defaultOpeneds: [],
  // vertical布局时是否只保持一个子菜单的展开
  uniqueOpened: false,
  // token名称
  tokenName: 'accessToken',
  // 是否跳过登录
  skipLogin: true,
  // default language
  lang: 'zh-cn',
  // 标题
  title: '海通恒信后台管理系统',
  // 系统名称
  systemName: 'HTHX-ADMIN',
  // 版权信息
  copyrightZh: '版权所有 © 海通恒信国际融资租赁股份有限公司 未经许可不得复制、转载或摘编,违者必究!',
  copyrightEn: 'Copyright © Haitong Unitrust International Leasing CO.,LTD.All Rights Reserved',
  // 默认主题颜色
  themeColor: '#005BAC',
  // 默认左侧菜单背景颜色
  leftMenuBgColor: '#0d153c',
  // 默认顶部菜单背景颜色
  topMenuBgColor: '#ffffff',
  // 默认左侧菜单文字颜色
  leftMenuTextColor: '#FFF',
  // 默认顶部菜单文字颜色
  topMenuTextColor: '#333',
  // 是否显示用户名
  showName: false,
  // 头部工具栏布局
  showHeaderBar: false,
  // 是否显示页面底部自定义版权信息
  footerCopyright: true,
  // token失效回退到登录页时是否记录本次的路由
  recordRoute: true,
  // 是否显示全屏
  fullScreen: true,
  // 是否显示刷新
  refresh: true,
  // 是否显示通知
  notice: true,
  // 是否显示自定义主题
  hideTheme: false,
  // 是否显示面包导航
  isBreadcrumb: true,
  // 是否显示logo
  isLogo: true,
  // logo图片 相对于public/static/image的路径
  logo: 'logo.png',
  // 菜单栏logo
  sideLogo: 'side-logo.png',
  // 是否显示标签
  tag: true,
  // 是否展开菜单
  collapse: false,
  // 路由白名单不经过token校验的路由
  routesWhiteList: ['/login', '/register', '/404', '/401'],
  // 权限信息白名单
  whiteAuthData: [
    {
      children: [
        {
          children: [],
          elements: [],
          menuType: 3,
          sort: 0,
          menu: 'homeIndex'
        }
      ],
      elements: [],
      menuType: 3,
      sort: 0,
      menu: 'home'
    }
  ],
  // 默认首页页面
  defaultPath: '/home',
  // 默认添加进路由表中的路由
  defaultRoutes: [],
  // 是否使用hash模式
  useHash: false,
  // base路径
  baseURL: '',
  // 登录页面路径,默认为'/login',可配置SSO路径,建议用环境变量
  loginPath: import.meta.env.VITE_APP_SSO_URL
  // px2rem基准单位,注意与vite配置中的基准单位保持一致
  remRootValue: 19.2,
  // 是否固定导航
  isFixedNav: true
}
  1. request.config.js
export default {
  // axios 基础url地址
  baseURL: import.meta.env.VITE_APP_BASE_API,
  // 网关请求地址前缀:
  gatewayPrefix: import.meta.env.VITE_APP_GATEWAY,
  // 为开发服务器配置 CORS。默认启用并允许任何源,传递一个 选项对象 来调整行为或设为 false 表示禁用
  cors: true,
  // 根据后端定义配置
  contentType: 'application/json;charset=UTF-8',
  // 消息框消失时间
  messageDuration: 3000,
  // 最长请求时间
  requestTimeout: 60000,
  // 请求拦截自定义函数,接收config参数
  handleRequest: config => {
    // do something ...
  },
  // 返回成功拦截自定义函数,接收response参数
  handleResSuccess: undefined,
  // 返回成功拦截自定义函数,接收response error参数
  handleResError: undefined
}
  1. compile.config.js
export default {
  // 项目部署的基础路径
  base: '/',
  // 静态资源服务的文件夹 类型 string | false
  publicDir: 'public',
  // 存储缓存文件的目录
  cacheDir: 'node_modules/.vite',
  // 输出路径
  outDir: 'dist',
  // 为开发服务器配置 CORS。默认启用并允许任何源,传递一个 选项对象 来调整行为或设为 false 表示禁用
  cors: true,
  // 生成静态资源的存放路径
  assetsDir: 'static/',
  // 构建后是否生成 source map 文件
  sourcemap: process.env.NODE_ENV !== 'production',
  // chunk 大小警告的限制
  chunkSizeWarningLimit: 2000,
  // 启用/禁用 CSS 代码拆分
  // 压缩大型输出文件可能会很慢,因此禁用该功能可能会提高大型项目的构建性能。
  cssCodeSplit: true,
  // 启用/禁用 brotli 压缩大小报告
  brotliSize: false,
  // 指定服务器应该监听哪个 IP 地址
  host: '0.0.0.0',
  // 指定开发服务器端口
  port: '8899',
  // 设为 true 时若端口已被占用则会直接退出,而不是尝试下一个可用端口
  strictPort: false,
  // 服务器启动时自动在浏览器中打开应用程序 此值为字符串时,会被用作 URL 的路径名
  open: true,
  // 调整控制台输出的级别 'info' | 'warn' | 'error' | 'silent'
  logLevel: 'info',
  // 设为 false 可以避免 Vite 清屏而错过在终端中打印某些关键信息
  clearScreen: false,
  // 是否删除生产环境console
  dropConsole: process.env.NODE_ENV === 'production',
  // 是否删除生产环境debugger
  dropDebugger: process.env.NODE_ENV === 'production',
  // 代理后端地址
  proxy: {
    // 正则表达式写法
    '^/api/.*': {
      target: 'http://10.102.2.222:19005',
      changeOrigin: true,
      rewrite: (path) => path.replace(/^\/api/, '')
    }
  },
  // 是否使用mock数据
  useMock: true,
  // 是否使用图片压缩
  useImageMin: false,
  // 是否使用px2rem
  usePx2Rem: false
}

API

createFrameApp()

框架初始化注册函数,创建一个应用实例

createFrameApp(rootComponent: Component, options: object): App

有两个必传参数,其中第一个参数是根组件。第二个参数是要传递给框架的配置参数。

示例:

import options from '@/config/setting' // 配置文件,请参考上方说明
import requestConfig from '@/config/request.config' // 配置文件,请参考上方说明

import { createFrameApp } from '@toystory/lotso'
import '@toystory/lotso/dist/style.css'
import App from './App.vue'

// 注册框架,传入项目配置和store,页面路径
const app = createFrameApp(App, {
  options,
  requestConfig,
  constantFile: import.meta.glob('./pages/**/index.vue'),
  constantConfig: import.meta.globEager('./pages/**/config.js'),
  // 若配置接管权限路由,无需引入asyncFile
  asyncFile: import.meta.glob('./views/**/index.vue'),
  asyncConfig: import.meta.globEager('./views/**/config.js')
})
app.mount('#app')

useRouter()

脚手架已接管路由管理,可用此方法访问路由,类似于VueRouter提供的useRouter方法

返回对象包含四个值:

  1. constantRoutes

不参与权限校验管理生成的路由集合,即初始化时通过constantFileconstantConfig传入的文件

  1. asyncRoutes

参与权限校验管理的路由集合,即初始化时通过asyncFileasyncConfig传入的文件

  1. router

VueRouter提供的原生 router 对象

  1. resetRouter()

重置Router方法

useRoute()

可用此方法返回当前路由对象

示例:

import { useRouter, useRoute } from '@toystory/lotso'

const { constantRoutes, asyncRoutes, router, resetRouter } = useRouter()
const route = useRoute()

function pushWithQuery(query) {
    router.push({
      name: 'search',
      query: {
        ...route.query,
        ...query,
      },
    })
}

usePermission()

权限管理的钩子函数,必传对象参数getUserInfogetAuthData,分别为获取用户信息方法与获取权限数据方法,返回值必须分别为用户信息数据与权限数据,建议两个方法内为调用获取用户信息接口与调用权限数据接口

返回值为权限处理导航守卫方法,使用方式参考如下

示例:

import { useRouter, usePermission } from '@toystory/lotso'
import { getUserInfo, getAuthData } from '@/api'
import { ElMessage } from 'element-plus'

// 使用脚手架自带的守卫
const { router } = useRouter()
const { handlePermission } = usePermission({
  // 需要把获取用户信息的方法和获取数据权限的方法传递给Permission hooks
  getUserInfo: async () => {
    const { data, msg, message } = await getUserInfo()
    const userStore = useUserStore()
    if (data && Object.prototype.toString.call(data) === '[object Object]') {
      userStore.setUserInfo(data)
      const targetSystemName = options.systemName || 'HTHX'
      userStore.setSystemCode(targetSystemName)
      window.localStorage.setItem('systemCode', targetSystemName)
      if (data.staffName) {
        userStore.handlerUserName(data.staffName)
      }
    } else {
      const errorMsg = msg || message || '系统错误,请稍后重试'
      userStore.resetToken()
      ElMessage.error(errorMsg)
      throw new Error(errorMsg)
    }
  },
  getAuthData: async () => {
    const userStore = useUserStore()
    const routesStore = useRoutesStore()
    await getAuthData().then(response => {
      userStore.setAuthDataFlag(true)
      if (response.data && Object.prototype.toString.call(response.data) === '[object Object]') {
        const whiteAuthData = options.whiteAuthData
        const authData = response.data.data
        const { role } = response.data
        userStore.setRole(role || [])
        const data = [
          ...whiteAuthData,
          ...authData
        ]
        if (!data || !Array.isArray(data)) {
          console.error('权限数据错误')
        } else {
          userStore.setAuthData(data)
          routesStore.handleRoutes(data)
        }
      } else {
        const errorMsg = response.msg || response.message || '系统错误,请稍后重试'
        ElMessage.error(errorMsg)
        throw new Error(errorMsg)
      }
    }).catch(err => {
      userStore.setAuthDataFlag(true)
      throw new Error(err)
    })
  }
})
router.beforeEach((to, from, next) => {
  handlePermission(to, from, next)
})

useRequest()

脚手架中包装好的请求拦截器钩子函数,一般在包装api请求方法中使用

示例:

import { useRequest } from '@toystory/lotso'
import requestConfig from '@/config/request.config'

const request = useRequest(requestConfig)

export function createPoint(data) {
  return request({
    url: '/point/create'p
    method: 'post',
    data
  })
}

setConfig()

修改传入脚手架中的配置项

setConfig(options: object)

getConfig()

获取脚手架中的某个配置项

示例:

const copyrightZh = getConfig('copyrightZh')

setupStore()

脚手架封装的注册pinia实例的方法,已默认在脚手架中注册,正常情况无需重复注册

useUserStore()

调用该钩子函数可以使用脚手架内部注册的pinia模块:userStore,pinia使用方法可参考官方文档

  • state

    key类型描述
    tokenstring登录秘钥
    usernamestring用户名
    userInfoobject用户信息
    avatarstring头像
    authDataFlagboolean是否拉取权限数据标识
    isChangeUserboolean是否更换用户标识
    systemCodestring系统编码
    authDataArray权限数据
    roleobject角色信息
  • getters

    方法返回值描述
    getToken()string获取登录秘钥
    getUsername()string获取用户名
    getAvatar()string获取头像
    getUserInfo()object获取用户信息
    getAuthDataFlag()boolean获取拉取权限数据标识
    getIsChangeUser()boolean获取更换用户标识
    getSystemCode()string获取系统编码
    getAuthData()Array获取权限数据
  • actions

    方法入参类型描述
    setToken(val)string存储登录秘钥
    setUsername(val)string存储用户名
    setAvatar(val)string存储头像
    setSystemCode(val)string存储系统编码
    setAuthDataFlag(flag)boolean设置拉取权限数据标识
    setIsChangeUser(flag)boolean设置更换用户标识
    setUserInfo(data)object存储用户信息
    setAuthData(data)Array存储权限数据
    setRole(data)object存储角色信息
    handlerUserName(userName)string处理用户名来判断用户是否变更
    resetInfo()\ 清除用户信息
    resetToken()\ 清除登录信息

useTabsBarStore()

  • state

    key类型描述
    visitedRoutesArraytabs的路由列表
    isTabsShowboolean是否显示tabsBar
  • getters

    方法返回值描述
    getVisitedRoutes()Array获取tabs的路由列表
    getIsTabsShow()boolean获取是否显示tabsBar
  • actions

    方法入参类型描述
    addVisitedRoute(route)route对象新增tab
    toggleTabsShow()\ 显示/隐藏tabsBar
    delRoute(route)route对象删除tab
    delOthersRoutes(route)route对象删除除此以外的所有tab
    delLeftRoutes(route)route对象删除左边的所有tab
    delRightRoutes(route)route对象删除右边的所有tab
    delAllRoutes()\ 删除所有tab
    updateVisitedRoute(route)route对象更新tab信息

useRoutesStore()

  • state

    key类型描述
    routesArray所有路由
    asyncRoutesArray已注册的动态路由
    topMenuRoutesArray顶部菜单路由
    leftMenuRoutesArray左边菜单路由
  • getters

    方法返回值描述
    getRoutes()Array获取所有路由
    getAsyncRoutes()Array获取已注册的动态路由
    getTopMenuRoutes()Array获取顶部菜单路由
    getLeftMenuRoutes()Array获取左边菜单路由
  • actions

    方法入参类型描述
    handleRoutes(authData)权限数据根据权限数据注册路由
    setAllRoutes()\ 注册所有路由

useNoticeStore()

  • state

    key类型描述
    noticeListArray通知列表
    messageListArray消息列表
    mailListArray邮件列表
    noticeCallbackFunction通知回调函数
    badgeString通知栏角标
  • getters

    方法返回值描述
    getNoticeList()Array获取通知列表
    getMessageList()Array获取消息列表
    getMailList()Array获取邮件列表
  • actions

    方法入参类型描述
    setNoticeList(data)Array设置通知列表
    setMessageList(data)Array设置消息列表
    setMailList(data)Array设置邮件列表
    setNoticeCallback(cb)Function设置通知点击回调函数
    emitNoticeCallback(item)Object执行通知点击回调函数
    setBadge(data)String设置通知栏角标

useSettingStore()

该store内的数据与方法主要为脚手架内部调用状态使用,请谨慎调用!

mitt

脚手架封装的mitt对象,用于监听脚手架广播出来的事件或自定义广播

包含on(监听),off(取消监听),emit(广播)三个方法

示例:

import { mitt } from '@toystory/lotso'

mitt.on('logout', () => {
  // ...
})

vpermission

脚手架封装的指令方法,已默认在脚手架中注册,正常情况无需重复注册。

传入disabled参数可使无权限的按钮等禁用,避免被移除。

<el-button v-permission="'default'">Default</el-button>
<el-button v-permission:disabled="'default'" type="info">Info</el-button>

useAuth(name: string)

判断是否具有权限的钩子函数,返回布尔值

示例:

import { useAuth } from '@toystory/lotso'

const hasAuth = useAuth('elementName')

if (hasAuth) {
  // do something
}

store

pinia实例,脚手架内部注册完成后的暴露出来的pinia实例

layout

layout组件vue全局注册对象,已默认在脚手架中注册,正常情况无需重复注册

Layout

Layout vue组件模块,即包含菜单与工具栏的框架

ParentView

ParentView vue组件模块,即不包含菜单的框架

2.2.3

6 days ago

2.2.4

6 days ago

2.2.2

25 days ago

2.2.1

1 month ago

1.4.9

1 month ago

1.4.8

1 month ago

2.2.0

2 months ago

2.1.16

2 months ago

2.1.14

2 months ago

2.1.15

2 months ago

2.1.13

2 months ago

2.1.12

2 months ago

2.1.11

2 months ago

2.1.10

3 months ago

2.1.9

4 months ago

2.1.8

4 months ago

2.1.7

4 months ago

2.1.6

4 months ago

2.1.5

4 months ago

2.1.4

5 months ago

2.1.2

5 months ago

2.1.3

5 months ago

1.3.14

5 months ago

2.1.1

5 months ago

2.1.0

5 months ago

2.1.0-beta1

5 months ago

2.1.0-beta2

5 months ago

2.1.0-rc4

6 months ago

2.1.0-rc5

6 months ago

1.4.6

8 months ago

1.4.5

8 months ago

1.4.4

10 months ago

1.4.3

10 months ago

1.4.2

10 months ago

2.0.0-rc1

7 months ago

2.0.0

6 months ago

2.1.0-rc2

6 months ago

2.1.0-rc1

6 months ago

2.1.0-rc3

6 months ago

1.4.7

7 months ago

1.4.1

12 months ago

1.4.0

1 year ago

1.3.10

1 year ago

1.3.13

1 year ago

1.3.11

1 year ago

1.3.12

1 year ago

1.3.9

1 year ago

1.3.8

1 year ago

1.3.7

1 year ago

1.3.6

1 year ago

1.3.5

1 year ago

1.3.4

1 year ago

1.2.0

2 years ago

1.1.1

2 years ago

1.1.0

2 years ago

1.3.3

1 year ago

1.2.4

2 years ago

1.3.2

2 years ago

1.2.3

2 years ago

1.3.1

2 years ago

1.2.2

2 years ago

1.3.0

2 years ago

1.2.1

2 years ago

1.0.0

2 years ago