本文已参与「新人创作礼」活动,一起开启掘金创作之路。 此次部署需要用的环境
官方网址
www.antdv.com/docs/vue/in… AntdVue 官网
pro.antdv.com/ Ant Design Pro 官网
一 路由模块
1.1动态路由参数介绍
{
path: '/new-router',
name: 'newRouter',
redirect: '/new-router/ahaha',
component: RouteView,
meta: { title: '仪表盘', keepAlive: true, permission: [ 'dashboard' ] },
children: [
{
path: '/new-router/ahaha',
name: 'ahaha',
component: () => import('@/views/dashboard/Analysis'),
meta: { title: '分析页', keepAlive: false, permission: [ 'ahaha' ] }
}
}
{ Route } 对象
| 参数 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| hidden | 控制路由和子路由是否显示在 sidebar | boolean | false |
| redirect | 重定向地址, 访问这个路由时,自定进行重定向 | string | - |
| name | 路由名称, 必须设置,且不能重名 | string | - |
| meta | 路由元信息(路由附带扩展信息) | object | {} |
| hideChildrenInMenu | 强制菜单显示为Item而不是SubItem(配合 meta.hidden) | boolean | - |
{ Meta } 路由元信息对象
| 参数 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| title | 路由标题, 用于显示面包屑, 页面标题 *推荐设置 | string | - |
| icon | 路由在 menu 上显示的图标 | [string,svg] | - |
| keepAlive | 缓存该路由 (开启 multi-tab 是默认值为 true) | boolean | false |
| hiddenHeaderContent | *特殊 隐藏 PageHeader组件中的页面带的 面包屑和页面标题栏 | boolean | false |
| permission | 与项目提供的权限拦截匹配的权限,如果不匹配,则会被禁止访问该路由页面 | array | [] |
1.2动态路由关联文件
router.config.js
注释掉AsyncRouterMap 里面的组件信息
generator-routers.js
// 注意这个变量 前端路由表 (基于动态) 需要先把页面组件注册到这个数组里面
constantRouterComponents Key为页面标识
/**
* 动态生成菜单
* @param token
* @returns {Promise<Router>}
*/
export const generatorDynamicRouter = token => {
return new Promise((resolve, reject) => {
loginService
.getCurrentUserNav(token)
.then(res => {
const { result } = res
const menuNav = []
const childrenNav = []
// 后端数据, 根级树数组, 根级 PID
listToTree(result
, childrenNav, '0')
rootRouter.redirectPath = childrenNav[0].path
rootRouter.children = childrenNav
menuNav.push(rootRouter)
const routers = generator(menuNav)
console.log(routers)
// routers[0].children.push(DefultRouter)
routers.push(notFoundRouter)
// routers.push(DefultRouter);
resolve(routers)
})
.catch(err => {
reject(err)
})
})
}
export const getResgisterRouter = () => {
return Array(constantRouterComponents)
}
/**
* 格式化树形结构数据 生成 vue-router 层级路由表
*
* @param routerMap
* @param parent
* @returns {*}
*/
export const generator = (routerMap, parent) => {
return routerMap.map(item => {
const { title, isShow, hideChildren, hiddenHeaderContent, target, icon } = item || {}
const currentRouter = {
// 如果路由设置了 path,则作为默认 path,否则 路由地址 动态拼接生成如 /dashboard/workplace
path: item.path || `${(parent && parent.path) || ''}/${item.key}`,
// 路由名称,建议唯一
name: item.name || item.key || '',
// 该路由对应页面的 组件 :方案1
// component: constantRouterComponents[item.component || item.key],
// 该路由对应页面的 组件 :方案2 (动态加载)
component: constantRouterComponents[item.component || item.key] || (() => import(`@/views/${item.component}`)),
// meta: 页面标题, 菜单图标, 页面权限(供指令权限用,可去掉)
meta: {
title: title,
icon: icon || undefined,
hiddenHeaderContent: hiddenHeaderContent,
target: target,
permission: item.name
}
}
// 是否设置了隐藏菜单
if (isShow === false) {
currentRouter.hidden = true
}
// 是否设置了隐藏子菜单
if (hideChildren) {
currentRouter.hideChildrenInMenu = true
}
// 为了防止出现后端返回结果不规范,处理有可能出现拼接出两个 反斜杠
if (!currentRouter.path.startsWith('http')) {
currentRouter.path = currentRouter.path.replace('//', '/')
}
// 重定向
item.redirectPath && (currentRouter.redirect = item.redirectPath)
// 是否有子菜单,并递归处理
if (item.children && item.children.length > 0) {
// Recursion
currentRouter.children = generator(item.children, currentRouter)
}
return currentRouter
})
}
// 根级菜单
const rootRouter = {
key: 'index',
name: 'index',
path: '/',
component: 'BasicLayout',
redirectPath: '/dashboard',
title: '首页',
children: []
}
const notFoundRouter = {
path: '*',
redirect: '/error',
hidden: true
}
二 国际化设置默认中文
2.1关闭国际化
import Vue from 'vue'
import VueI18n from 'vue-i18n'
import storage from 'store'
import moment from 'moment'
// default lang 默认语言改为中文
import zhCN from './lang/zh-CN'
Vue.use(VueI18n)
// defaultLang 改为中文
export const defaultLang = 'zh-CN'
// 消息也改为中文
const messages = {
'zh-CN': {
...zhCN
}
}
const i18n = new VueI18n({
silentTranslationWarn: true,
locale: defaultLang,
fallbackLocale: defaultLang,
messages
})
const loadedLanguages = [defaultLang]
function setI18nLanguage (lang) {
i18n.locale = lang
// request.headers['Accept-Language'] = lang
document.querySelector('html').setAttribute('lang', lang)
return lang
}
export function loadLanguageAsync (lang = defaultLang) {
return new Promise(resolve => {
// 缓存语言设置
storage.set('lang', lang)
if (i18n.locale !== lang) {
if (!loadedLanguages.includes(lang)) {
return import(/* webpackChunkName: "lang-[request]" */ `./lang/${lang}`).then(msg => {
const locale = msg.default
i18n.setLocaleMessage(lang, locale)
loadedLanguages.push(lang)
moment.updateLocale(locale.momentName, locale.momentLocale)
return setI18nLanguage(lang)
})
}
return resolve(setI18nLanguage(lang))
}
return resolve(lang)
})
}
export function i18nRender (key) {
return i18n.t(`${key}`)
}
export default i18n
<template>
<a-config-provider :locale="locale">
<div id="app">
<router-view />
</div>
</a-config-provider>
</template>
<script>
import zhCN from 'ant-design-vue/es/locale/zh_CN'
import { domTitle, setDocumentTitle } from '@/utils/domUtil'
import { i18nRender } from '@/locales'
import { generatorDynamicRouter } from '@/router/generator-routers'
export default {
data () {
return {}
},
computed: {
locale () {
// 只是为了切换语言时,更新标题
// 这个可以解决时间组件是英文的问题 这是快捷方式
// const { title } = this.$route.meta
// title && (setDocumentTitle(`${i18nRender(title)} - ${domTitle}`))
// return this.$i18n.getLocaleMessage(this.$store.getters.lang).antLocale
return zhCN
}
}
}
</script>
三 注册组件引入组件
因为发现此脚手架是按需引入的方式 框架内除了他需要的 有的其他组件是需要我们自己进行按需引入的 那么久会存在一个 从哪里按需引入
/src/core/lazy_use.js
如果需要挂载一些东西也可以从这个js操作
import {组件名称} from 'ant-design-vue'
Vue.use(组件名称)
// 挂载原型对象
import moment from 'moment'
Vue.prototype.$moment = moment
四 打包发布
各种版本问题就不多言了 直接来说Npm 下载包的问题
// 千言万语汇成一句命令 记住这个就好了
npm install --legacy-peer-deps
五 目录结构
- Dashboard
-
- 分析页
- 监控页
- 工作台
- 表单页
-
- 基础表单页
- 分步表单页
- 高级表单页
- 列表页
-
- 查询表格
- 标准列表
- 卡片列表
- 搜索列表(项目/应用/文章)
- 详情页
-
- 基础详情页
- 高级详情页
- 结果
-
- 成功页
- 失败页
- 异常
-
- 403 无权限
- 404 找不到
- 500 服务器出错
- 个人页
-
- 个人中心
- 个人设置
- 帐户
-
- 登录
- 注册
- 注册成功