адрес проекта:vue-simple-templateВсего три роли: адан барбара керри пароль все: 123456
адан имеет высшие полномочия A и может видеть красную, желтую и синюю страницы (всего три страницы)
у барбары есть разрешение B, он может видеть красные и желтые страницы
у Кэрри есть разрешение C он может видеть красные и синие страницы
стек технологий
webpack ---- 打包神器
vue ---- JavaScript 框架
vuex ---- 实现不同组件间的状态共享
vue-router ---- 页面路由
babel-polyfill ---- 将ES6代码转为ES5代码
normalize.css ---- 重置掉该重置的样式
element-ui ---- UI组件库
Инициализация проекта
# cd 到项目文件夹
cd weven-simple-template
# 安装依赖 (本项目还安装了其他依赖详情 请见 package.json 文件)
npm install
# 运行项目
npm run dev
Структура проекта
После того, как скаффолдинг vue-cil инициализировал проект, я изменил только папку src
src
├── App.vue ---- 页面入口
├── api ---- api请求
│ └── login.js ---- 模拟json对象数据
├── assets ---- 主题 字体等静态资源
│ └── logo.png
├── components ---- 组件
│ ├── index.vue
│ └── login.vue
├── main.js ---- 初始化组件 加载路由
├── router ---- 路由
│ └── index.js
└── store ---- vuex状态管理
├── getters.js
├── index.js
└── modules
└── login.js
Особенности:
Ключ к динамической маршрутизации лежит в конфигурации маршрутизатора.метаполеи vuex выставленполе геттера
// ---- router/index.js ----
// 初始化路由
export default new Router({
routes: [
{
path: '/login',
name: 'Login',
component: Login
}
]
});
// 动态路由 meta 定义了role
export const powerRouter =[
{ path: '/',redirect:'/red', name: 'index',component: Index,hidden:false,
children: [
{ path: '/red', name: 'red', component: red,},
{ path: '/yellow', name: 'yellow', component: yellow, meta: {role: 'B'}},
{ path: '/blue', name: 'blue', component: blue, meta: {role: 'C'}}
]
}
];
// ---- main.js ----
router.beforeEach((to, from, next) => {
if(store.getters.role){ //判断role 是否存在
if(store.getters.newrouter.length !== 0){
next() //resolve 钩子
}else{
let newrouter
if (store.getters.role == 'A') { //判断权限
newrouter = powerRouter
} else {
let newchildren = powerRouter[0].children.filter(route => {
if(route.meta){
if(route.meta.role == store.getters.role){
return true
}
return false
}else{
return true
}
});
newrouter = powerRouter
newrouter[0].children = newchildren
}
router.addRoutes(newrouter) //添加动态路由
store.dispatch('Roles',newrouter).then(res => {
next({ ...to })
}).catch(() => {
})
}
}else{
if (['/login'].indexOf(to.path) !== -1) {
next()
} else {
next('/login')
}
}
})
// ---- components/index.vue ----
// mapGetters 辅助函数仅仅是将 store 中的 getter 映射到局部计算属性
...mapGetters([
'newrouter'
])
Не проблема взять этот проект для выяснения отношений между vue+vuex+vue-router, можно сказать, что это супер простая версия, подходящая для новичков. Вы можете ознакомиться с соответствующими официальными документами. В центре внимания вышеприведенного содержания на самом деле находится весь проект.
адрес проекта:vue-simple-templateЕсли вы чувствуете себя хорошо, пожалуйста, дайте звезду~ Спасибо
Любые вопросы приветствуются, чтобы спросить ~