动态路由修改
This commit is contained in:
parent
903e75936f
commit
0554c79f65
|
@ -14,7 +14,7 @@ export function login (parameter) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getLoginUser () {
|
export function getLoginUser (parameter) {
|
||||||
return request({
|
return request({
|
||||||
url: userApi.getLoginUser,
|
url: userApi.getLoginUser,
|
||||||
method: 'post',
|
method: 'post',
|
||||||
|
@ -25,10 +25,7 @@ export function getLoginUser () {
|
||||||
export function logout () {
|
export function logout () {
|
||||||
return request({
|
return request({
|
||||||
url: userApi.logout,
|
url: userApi.logout,
|
||||||
method: 'post',
|
method: 'get'
|
||||||
headers: {
|
|
||||||
'Content-Type': 'application/json;charset=UTF-8'
|
|
||||||
}
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
export function getSmsCaptcha (parameter) {
|
export function getSmsCaptcha (parameter) {
|
||||||
|
|
Binary file not shown.
After Width: | Height: | Size: 17 KiB |
|
@ -1,431 +1,28 @@
|
||||||
// eslint-disable-next-line
|
// eslint-disable-next-line
|
||||||
import { UserLayout, BasicLayout, BlankLayout } from '@/layouts'
|
import { UserLayout, BasicLayout, RouteView } from '@/layouts'
|
||||||
import { bxAnaalyse } from '@/core/icons'
|
import { bxAnaalyse } from '@/core/icons'
|
||||||
|
|
||||||
const RouteView = {
|
|
||||||
name: 'RouteView',
|
|
||||||
render: (h) => h('router-view')
|
|
||||||
}
|
|
||||||
|
|
||||||
export const asyncRouterMap = [
|
export const asyncRouterMap = [
|
||||||
{
|
{
|
||||||
path: '/',
|
path: '/',
|
||||||
name: 'index',
|
name: 'MenuIndex.vue',
|
||||||
component: BasicLayout,
|
component: BasicLayout,
|
||||||
meta: { title: 'menu.home' },
|
meta: { title: '首页' },
|
||||||
redirect: '/dashboard/workplace',
|
redirect: '/dashboard/workplace',
|
||||||
children: [
|
children: [
|
||||||
// dashboard
|
// dashboard
|
||||||
{
|
{
|
||||||
path: '/dashboard',
|
path: 'dashboard',
|
||||||
name: 'dashboard',
|
name: 'dashboard',
|
||||||
redirect: '/dashboard/workplace',
|
redirect: '/dashboard/workplace',
|
||||||
component: RouteView,
|
component: RouteView,
|
||||||
meta: { title: 'menu.dashboard', keepAlive: true, icon: bxAnaalyse, permission: ['dashboard'] },
|
meta: { title: '仪表盘', keepAlive: true, icon: bxAnaalyse /* permission: [ 'dashboard' ] */ },
|
||||||
children: [
|
children: [
|
||||||
{
|
{
|
||||||
path: '/dashboard/workplace',
|
path: 'workplace',
|
||||||
name: 'Workplace',
|
name: 'Workplace',
|
||||||
component: () => import('@/views/dashboard/Workplace'),
|
component: () => import('@/views/dashboard/Workplace'),
|
||||||
meta: { title: 'menu.dashboard.workplace', keepAlive: true, permission: ['dashboard'] }
|
meta: { title: '工作台', keepAlive: false/*, permission: [ 'dashboard' ] */ }
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
// 权限管理
|
|
||||||
{
|
|
||||||
path: '/security',
|
|
||||||
name: 'security',
|
|
||||||
redirect: '/security/user',
|
|
||||||
component: RouteView,
|
|
||||||
meta: { title: '系统设置', keepAlive: true, icon: bxAnaalyse, permission: ['security'] },
|
|
||||||
children: [
|
|
||||||
{
|
|
||||||
path: '/security/user',
|
|
||||||
name: 'SecurityUser',
|
|
||||||
component: () => import('@/views/security/user/UserList'),
|
|
||||||
meta: { title: '用户管理', keepAlive: true, permission: ['security'] }
|
|
||||||
},
|
|
||||||
{
|
|
||||||
path: '/security/role',
|
|
||||||
name: 'SecurityRole',
|
|
||||||
component: () => import('@/views/security/role/RoleList'),
|
|
||||||
meta: { title: '角色管理', keepAlive: true }
|
|
||||||
},
|
|
||||||
{
|
|
||||||
path: '/security/menu',
|
|
||||||
name: 'SecurityMenu',
|
|
||||||
component: () => import('@/views/security/menu/MenuList'),
|
|
||||||
meta: { title: '菜单管理', keepAlive: true }
|
|
||||||
},
|
|
||||||
{
|
|
||||||
path: '/sys/dictionary',
|
|
||||||
name: 'DictionaryList',
|
|
||||||
component: () => import('@/views/sys/dictionary/DictionaryList'),
|
|
||||||
meta: { title: '数据词典', keepAlive: true }
|
|
||||||
},
|
|
||||||
{
|
|
||||||
path: '/sys/oss',
|
|
||||||
name: 'OssList',
|
|
||||||
component: () => import('@/views/sys/oss/OssList'),
|
|
||||||
meta: { title: '文件中心', keepAlive: true }
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
// 项目管理
|
|
||||||
{
|
|
||||||
path: '/project',
|
|
||||||
redirect: '/project/list',
|
|
||||||
component: RouteView,
|
|
||||||
meta: { title: '项目管理', icon: bxAnaalyse, permission: ['from'] },
|
|
||||||
children: [
|
|
||||||
{
|
|
||||||
path: '/project/list',
|
|
||||||
name: 'projectList',
|
|
||||||
component: () => import('@/views/project/ProjectList'),
|
|
||||||
meta: { title: '自主项目', keepAlive: true, permission: ['form'] },
|
|
||||||
},
|
|
||||||
// {
|
|
||||||
// path: '/project/add',
|
|
||||||
// name: 'ProjectForm',
|
|
||||||
// component: () => import('@/views/project/ProjectForm'),
|
|
||||||
// meta: { title: '新增项目', keepAlive: true, permission: ['form'], show: false }
|
|
||||||
// },
|
|
||||||
{
|
|
||||||
path: '/project/projectStepForm',
|
|
||||||
name: 'projectStepForm',
|
|
||||||
component: () => import('@/views/project/form/ProjectStepForm'),
|
|
||||||
meta: { title: '新增项目-分布', keepAlive: true, permission: ['form'] }
|
|
||||||
},
|
|
||||||
// {
|
|
||||||
// path: '/project/unitSelect',
|
|
||||||
// name: 'unitSelect',
|
|
||||||
// component: () => import('@/views/project/ProjectUnitSelect'),
|
|
||||||
// meta: { title: '选择单位', keepAlive: true, permission: ['form'] }
|
|
||||||
// },
|
|
||||||
{
|
|
||||||
path: '/form/step-form',
|
|
||||||
name: 'StepForm',
|
|
||||||
component: () => import('@/views/form/stepForm/StepForm'),
|
|
||||||
meta: { title: '系统推荐', keepAlive: true, permission: ['form'] }
|
|
||||||
},
|
|
||||||
{
|
|
||||||
path: '/form/advanced-form',
|
|
||||||
name: 'AdvanceForm',
|
|
||||||
component: () => import('@/views/form/advancedForm/AdvancedForm'),
|
|
||||||
meta: { title: '终端培训', keepAlive: true, permission: ['form'] }
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
// 课程管理
|
|
||||||
{
|
|
||||||
path: '/courseManagement',
|
|
||||||
redirect: '/courseManagement/course/courseList',
|
|
||||||
component: RouteView,
|
|
||||||
meta: { title: '课程管理', icon: bxAnaalyse, permission: ['from'] },
|
|
||||||
children: [
|
|
||||||
{
|
|
||||||
path: '/courseManagement/course/courseList',
|
|
||||||
name: 'courseList',
|
|
||||||
component: () => import('@/views/course/CourseList'),
|
|
||||||
meta: { title: '系统课程', keepAlive: true, permission: ['form'] }
|
|
||||||
},
|
|
||||||
{
|
|
||||||
path: '/courseManagement/customCourseList',
|
|
||||||
name: 'customCourse',
|
|
||||||
component: () => import('@/views/course/customCourseList'),
|
|
||||||
meta: { title: '自制课程', keepAlive: true, permission: ['form'] }
|
|
||||||
},
|
|
||||||
{
|
|
||||||
path: '/form/advanced-form',
|
|
||||||
name: 'AdvanceForm',
|
|
||||||
component: () => import('@/views/form/advancedForm/AdvancedForm'),
|
|
||||||
meta: { title: '资源库', keepAlive: true, permission: ['form'] }
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
// 档案管理
|
|
||||||
{
|
|
||||||
path: "/archives",
|
|
||||||
redirect: "/archives/user",
|
|
||||||
component: RouteView,
|
|
||||||
meta: { title: '档案管理', icon: 'profile', permission: ['form'] },
|
|
||||||
children: [
|
|
||||||
{
|
|
||||||
path: "/archives/user",
|
|
||||||
name: "archivesUser",
|
|
||||||
component: () => import('@/views/archives/user/Index'),
|
|
||||||
meta: { title: '人员档案', keepAlive: true, permission: ['form'] }
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
// forms
|
|
||||||
{
|
|
||||||
path: '/form',
|
|
||||||
redirect: '/form/base-form',
|
|
||||||
component: RouteView,
|
|
||||||
meta: { title: '表单页', icon: 'form', permission: ['form'] },
|
|
||||||
children: [
|
|
||||||
{
|
|
||||||
path: '/form/base-form',
|
|
||||||
name: 'BaseForm',
|
|
||||||
component: () => import('@/views/form/basicForm/Index'),
|
|
||||||
meta: { title: '基础表单', keepAlive: true, permission: ['form'] }
|
|
||||||
},
|
|
||||||
{
|
|
||||||
path: '/form/step-form',
|
|
||||||
name: 'StepForm',
|
|
||||||
component: () => import('@/views/form/stepForm/StepForm'),
|
|
||||||
meta: { title: '分步表单', keepAlive: true, permission: ['form'] }
|
|
||||||
},
|
|
||||||
{
|
|
||||||
path: '/form/advanced-form',
|
|
||||||
name: 'AdvanceForm',
|
|
||||||
component: () => import('@/views/form/advancedForm/AdvancedForm'),
|
|
||||||
meta: { title: '高级表单', keepAlive: true, permission: ['form'] }
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
|
|
||||||
// list
|
|
||||||
{
|
|
||||||
path: '/list',
|
|
||||||
name: 'list',
|
|
||||||
component: RouteView,
|
|
||||||
redirect: '/list/table-list',
|
|
||||||
meta: { title: '列表页', icon: 'table', permission: ['table'] },
|
|
||||||
children: [
|
|
||||||
{
|
|
||||||
path: '/list/table-list/:pageNo([1-9]\\d*)?',
|
|
||||||
name: 'TableListWrapper',
|
|
||||||
hideChildrenInMenu: true, // 强制显示 MenuItem 而不是 SubMenu
|
|
||||||
component: () => import('@/views/list/TableList'),
|
|
||||||
meta: { title: '查询表格', keepAlive: true, permission: ['table'] }
|
|
||||||
},
|
|
||||||
{
|
|
||||||
path: '/list/basic-list',
|
|
||||||
name: 'BasicList',
|
|
||||||
component: () => import('@/views/list/BasicList'),
|
|
||||||
meta: { title: '标准列表', keepAlive: true, permission: ['table'] }
|
|
||||||
},
|
|
||||||
{
|
|
||||||
path: '/list/card',
|
|
||||||
name: 'CardList',
|
|
||||||
component: () => import('@/views/list/CardList'),
|
|
||||||
meta: { title: '卡片列表', keepAlive: true, permission: ['table'] }
|
|
||||||
},
|
|
||||||
{
|
|
||||||
path: '/list/search',
|
|
||||||
name: 'SearchList',
|
|
||||||
component: () => import('@/views/list/search/SearchLayout'),
|
|
||||||
redirect: '/list/search/article',
|
|
||||||
meta: { title: '搜索列表', keepAlive: true, permission: ['table'] },
|
|
||||||
children: [
|
|
||||||
{
|
|
||||||
path: '/list/search/article',
|
|
||||||
name: 'SearchArticles',
|
|
||||||
component: () => import('../views/list/search/Article'),
|
|
||||||
meta: { title: '搜索列表(文章)', permission: ['table'] }
|
|
||||||
},
|
|
||||||
{
|
|
||||||
path: '/list/search/project',
|
|
||||||
name: 'SearchProjects',
|
|
||||||
component: () => import('../views/list/search/Projects'),
|
|
||||||
meta: { title: '搜索列表(项目)', permission: ['table'] }
|
|
||||||
},
|
|
||||||
{
|
|
||||||
path: '/list/search/application',
|
|
||||||
name: 'SearchApplications',
|
|
||||||
component: () => import('../views/list/search/Applications'),
|
|
||||||
meta: { title: '搜索列表(应用)', permission: ['table'] }
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
// profile
|
|
||||||
{
|
|
||||||
path: '/profile',
|
|
||||||
name: 'profile',
|
|
||||||
component: RouteView,
|
|
||||||
redirect: '/profile/basic',
|
|
||||||
meta: { title: '详情页', icon: 'profile', permission: ['profile'] },
|
|
||||||
children: [
|
|
||||||
{
|
|
||||||
path: '/profile/basic',
|
|
||||||
name: 'ProfileBasic',
|
|
||||||
component: () => import('@/views/profile/basic/Index'),
|
|
||||||
meta: { title: '基础详情页', permission: ['profile'] }
|
|
||||||
},
|
|
||||||
{
|
|
||||||
path: '/profile/advanced',
|
|
||||||
name: 'ProfileAdvanced',
|
|
||||||
component: () => import('@/views/profile/advanced/Advanced'),
|
|
||||||
meta: { title: '高级详情页', permission: ['profile'] }
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
// result
|
|
||||||
{
|
|
||||||
path: '/result',
|
|
||||||
name: 'result',
|
|
||||||
component: RouteView,
|
|
||||||
redirect: '/result/success',
|
|
||||||
meta: { title: '结果页', icon: 'check-circle-o', permission: ['result'] },
|
|
||||||
children: [
|
|
||||||
{
|
|
||||||
path: '/result/success',
|
|
||||||
name: 'ResultSuccess',
|
|
||||||
component: () => import(/* webpackChunkName: "result" */ '@/views/result/Success'),
|
|
||||||
meta: { title: '成功', keepAlive: false, hiddenHeaderContent: true, permission: ['result'] }
|
|
||||||
},
|
|
||||||
{
|
|
||||||
path: '/result/fail',
|
|
||||||
name: 'ResultFail',
|
|
||||||
component: () => import(/* webpackChunkName: "result" */ '@/views/result/Error'),
|
|
||||||
meta: { title: '失败', keepAlive: false, hiddenHeaderContent: true, permission: ['result'] }
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
// Exception
|
|
||||||
{
|
|
||||||
path: '/exception',
|
|
||||||
name: 'exception',
|
|
||||||
component: RouteView,
|
|
||||||
redirect: '/exception/403',
|
|
||||||
meta: { title: '异常页', icon: 'warning', permission: ['exception'] },
|
|
||||||
children: [
|
|
||||||
{
|
|
||||||
path: '/exception/403',
|
|
||||||
name: 'Exception403',
|
|
||||||
component: () => import(/* webpackChunkName: "fail" */ '@/views/exception/403'),
|
|
||||||
meta: { title: '403', permission: ['exception'] }
|
|
||||||
},
|
|
||||||
{
|
|
||||||
path: '/exception/404',
|
|
||||||
name: 'Exception404',
|
|
||||||
component: () => import(/* webpackChunkName: "fail" */ '@/views/exception/404'),
|
|
||||||
meta: { title: '404', permission: ['exception'] }
|
|
||||||
},
|
|
||||||
{
|
|
||||||
path: '/exception/500',
|
|
||||||
name: 'Exception500',
|
|
||||||
component: () => import(/* webpackChunkName: "fail" */ '@/views/exception/500'),
|
|
||||||
meta: { title: '500', permission: ['exception'] }
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
// account
|
|
||||||
{
|
|
||||||
path: '/account',
|
|
||||||
component: RouteView,
|
|
||||||
redirect: '/account/center',
|
|
||||||
name: 'account',
|
|
||||||
meta: { title: '个人页', icon: 'user', keepAlive: true, permission: ['user'] },
|
|
||||||
children: [
|
|
||||||
{
|
|
||||||
path: '/account/center',
|
|
||||||
name: 'center',
|
|
||||||
component: () => import('@/views/account/center/Index'),
|
|
||||||
meta: { title: '个人中心', keepAlive: true, permission: ['user'] }
|
|
||||||
},
|
|
||||||
{
|
|
||||||
path: '/account/settings',
|
|
||||||
name: 'settings',
|
|
||||||
component: () => import('@/views/account/settings/Index'),
|
|
||||||
meta: { title: '个人设置', hideHeader: true, permission: ['user'] },
|
|
||||||
redirect: '/account/settings/base',
|
|
||||||
hideChildrenInMenu: true,
|
|
||||||
children: [
|
|
||||||
{
|
|
||||||
path: '/account/settings/base',
|
|
||||||
name: 'BaseSettings',
|
|
||||||
component: () => import('@/views/account/settings/BaseSetting'),
|
|
||||||
meta: { title: '基本设置', hidden: true, permission: ['user'] }
|
|
||||||
},
|
|
||||||
{
|
|
||||||
path: '/account/settings/security',
|
|
||||||
name: 'SecuritySettings',
|
|
||||||
component: () => import('@/views/account/settings/Security'),
|
|
||||||
meta: { title: '安全设置', hidden: true, keepAlive: true, permission: ['user'] }
|
|
||||||
},
|
|
||||||
{
|
|
||||||
path: '/account/settings/custom',
|
|
||||||
name: 'CustomSettings',
|
|
||||||
component: () => import('@/views/account/settings/Custom'),
|
|
||||||
meta: { title: '个性化设置', hidden: true, keepAlive: true, permission: ['user'] }
|
|
||||||
},
|
|
||||||
{
|
|
||||||
path: '/account/settings/binding',
|
|
||||||
name: 'BindingSettings',
|
|
||||||
component: () => import('@/views/account/settings/Binding'),
|
|
||||||
meta: { title: '账户绑定', hidden: true, keepAlive: true, permission: ['user'] }
|
|
||||||
},
|
|
||||||
{
|
|
||||||
path: '/account/settings/notification',
|
|
||||||
name: 'NotificationSettings',
|
|
||||||
component: () => import('@/views/account/settings/Notification'),
|
|
||||||
meta: { title: '新消息通知', hidden: true, keepAlive: true, permission: ['user'] }
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
path: '/other',
|
|
||||||
name: 'otherPage',
|
|
||||||
component: RouteView,
|
|
||||||
meta: { title: '其他组件', icon: 'slack', permission: ['dashboard'] },
|
|
||||||
redirect: '/other/icon-selector',
|
|
||||||
children: [
|
|
||||||
{
|
|
||||||
path: '/other/icon-selector',
|
|
||||||
name: 'TestIconSelect',
|
|
||||||
component: () => import('@/views/other/IconSelectorView'),
|
|
||||||
meta: { title: 'IconSelector', icon: 'tool', keepAlive: true, permission: ['dashboard'] }
|
|
||||||
},
|
|
||||||
{
|
|
||||||
path: '/other/list',
|
|
||||||
component: RouteView,
|
|
||||||
meta: { title: '业务布局', icon: 'layout', permission: ['support'] },
|
|
||||||
redirect: '/other/list/tree-list',
|
|
||||||
children: [
|
|
||||||
{
|
|
||||||
path: '/other/list/tree-list',
|
|
||||||
name: 'TreeList',
|
|
||||||
component: () => import('@/views/other/TreeList'),
|
|
||||||
meta: { title: '树目录表格', keepAlive: true }
|
|
||||||
},
|
|
||||||
{
|
|
||||||
path: '/other/list/edit-table',
|
|
||||||
name: 'EditList',
|
|
||||||
component: () => import('@/views/other/TableInnerEditList'),
|
|
||||||
meta: { title: '内联编辑表格', keepAlive: true }
|
|
||||||
},
|
|
||||||
{
|
|
||||||
path: '/other/list/user-list',
|
|
||||||
name: 'UserList',
|
|
||||||
component: () => import('@/views/other/UserList'),
|
|
||||||
meta: { title: '用户列表', keepAlive: true }
|
|
||||||
},
|
|
||||||
{
|
|
||||||
path: '/other/list/role-list',
|
|
||||||
name: 'RoleList',
|
|
||||||
component: () => import('@/views/other/RoleList'),
|
|
||||||
meta: { title: '角色列表', keepAlive: true }
|
|
||||||
},
|
|
||||||
{
|
|
||||||
path: '/other/list/system-role',
|
|
||||||
name: 'SystemRole',
|
|
||||||
component: () => import('@/views/role/RoleList'),
|
|
||||||
meta: { title: '角色列表2', keepAlive: true }
|
|
||||||
},
|
|
||||||
{
|
|
||||||
path: '/other/list/permission-list',
|
|
||||||
name: 'PermissionList',
|
|
||||||
component: () => import('@/views/other/PermissionList'),
|
|
||||||
meta: { title: '权限列表', keepAlive: true }
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
@ -486,5 +83,5 @@ export const constantRouterMap = [
|
||||||
meta: { title: '词典项', keepAlive: true, permission: ['dictionaryItem'] }
|
meta: { title: '词典项', keepAlive: true, permission: ['dictionaryItem'] }
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
}
|
||||||
]
|
]
|
||||||
|
|
|
@ -13,13 +13,15 @@ import themePluginConfig from '../config/themePluginConfig'
|
||||||
|
|
||||||
import bootstrap from './core/bootstrap'
|
import bootstrap from './core/bootstrap'
|
||||||
import './core/lazy_use'
|
import './core/lazy_use'
|
||||||
// import './permission' // permission control
|
import './permission' // permission control
|
||||||
import './utils/filter' // global filter
|
import './utils/filter' // global filter
|
||||||
import './global.less'
|
import './global.less'
|
||||||
import moment from 'moment'
|
import moment from 'moment'
|
||||||
import { FormModel } from 'ant-design-vue'
|
import { FormModel } from 'ant-design-vue'
|
||||||
// import './mock'
|
import { hasBtnPermission } from './utils/permissions'
|
||||||
|
|
||||||
Vue.use(FormModel)
|
Vue.use(FormModel)
|
||||||
|
Vue.prototype.hasPerm = hasBtnPermission
|
||||||
|
|
||||||
Vue.config.productionTip = false
|
Vue.config.productionTip = false
|
||||||
|
|
||||||
|
|
|
@ -15,21 +15,19 @@ const loginRoutePath = '/user/login'
|
||||||
const defaultRoutePath = '/dashboard/workplace'
|
const defaultRoutePath = '/dashboard/workplace'
|
||||||
|
|
||||||
router.beforeEach((to, from, next) => {
|
router.beforeEach((to, from, next) => {
|
||||||
debugger
|
|
||||||
NProgress.start() // start progress bar
|
NProgress.start() // start progress bar
|
||||||
to.meta && (typeof to.meta.title !== 'undefined' && setDocumentTitle(`${i18nRender(to.meta.title)} - ${domTitle}`))
|
to.meta && (typeof to.meta.title !== 'undefined' && setDocumentTitle(`${i18nRender(to.meta.title)} - ${domTitle}`))
|
||||||
/* has token */
|
console.log(storage.get(ACCESS_TOKEN))
|
||||||
|
debugger
|
||||||
if (storage.get(ACCESS_TOKEN)) {
|
if (storage.get(ACCESS_TOKEN)) {
|
||||||
if (to.path === loginRoutePath) {
|
if (to.path === loginRoutePath) {
|
||||||
next({ path: defaultRoutePath })
|
next({ path: defaultRoutePath })
|
||||||
NProgress.done()
|
NProgress.done()
|
||||||
} else {
|
} else {
|
||||||
if (store.getters.roles.length === 0) {
|
if (store.getters.roles.length === 0) {
|
||||||
console.log('逻辑开始1 => src/permission.js')
|
|
||||||
store
|
store
|
||||||
.dispatch('GetInfo')
|
.dispatch('GetInfo')
|
||||||
.then(res => {
|
.then(res => {
|
||||||
console.log('流程3-获取个人信息返回 => src/permission.js ')
|
|
||||||
if (res.menus.length < 1) {
|
if (res.menus.length < 1) {
|
||||||
Modal.error({
|
Modal.error({
|
||||||
title: '提示:',
|
title: '提示:',
|
||||||
|
@ -45,14 +43,19 @@ router.beforeEach((to, from, next) => {
|
||||||
}
|
}
|
||||||
const antDesignMenus = res.menus
|
const antDesignMenus = res.menus
|
||||||
// generate dynamic router
|
// generate dynamic router
|
||||||
console.log('流程4-从后端获取权限开始')
|
|
||||||
store.dispatch('GenerateRoutes', { antDesignMenus }).then(() => {
|
store.dispatch('GenerateRoutes', { antDesignMenus }).then(() => {
|
||||||
// 根据菜单权限生成可访问的路由表
|
// 根据菜单权限生成可访问的路由表
|
||||||
// 动态添加可访问路由表
|
// 动态添加可访问路由表
|
||||||
router.addRoutes(store.getters.addRouters)
|
const routes = store.getters.addRouters
|
||||||
|
for(let i =0,length =routes.length;i<length;i+=1){
|
||||||
|
const element = routes[i];
|
||||||
|
router.addRoute(element);
|
||||||
|
}
|
||||||
|
// router.addRoutes(store.getters.addRouters) router.addRoutes方法被遗弃
|
||||||
// 请求带有 redirect 重定向时,登录自动重定向到该地址
|
// 请求带有 redirect 重定向时,登录自动重定向到该地址
|
||||||
const redirect = decodeURIComponent(from.query.redirect || to.path)
|
const redirect = decodeURIComponent(from.query.redirect || to.path)
|
||||||
if (to.path === redirect) {
|
if (to.path === redirect) {
|
||||||
|
next({ path: redirect })
|
||||||
// set the replace: true so the navigation will not leave a history record
|
// set the replace: true so the navigation will not leave a history record
|
||||||
next({ ...to, replace: true })
|
next({ ...to, replace: true })
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -15,6 +15,17 @@ const constantRouterComponents = {
|
||||||
|
|
||||||
// 你需要动态引入的页面组件
|
// 你需要动态引入的页面组件
|
||||||
'Workplace': () => import('@/views/dashboard/Workplace'),
|
'Workplace': () => import('@/views/dashboard/Workplace'),
|
||||||
|
// account
|
||||||
|
'AccountCenter': () => import('@/views/account/center/Index'),
|
||||||
|
'AccountSettings': () => import('@/views/account/settings/Index'),
|
||||||
|
'BaseSettings': () => import('@/views/account/settings/BaseSetting'),
|
||||||
|
'SecuritySettings': () => import('@/views/account/settings/Security'),
|
||||||
|
'CustomSettings': () => import('@/views/account/settings/Custom'),
|
||||||
|
'BindingSettings': () => import('@/views/account/settings/Binding'),
|
||||||
|
'NotificationSettings': () => import('@/views/account/settings/Notification'),
|
||||||
|
|
||||||
|
// 默认首页
|
||||||
|
'Console': () => import('@/views/index/welcome')
|
||||||
}
|
}
|
||||||
|
|
||||||
// 前端未找到页面路由(固定不用改)
|
// 前端未找到页面路由(固定不用改)
|
||||||
|
@ -22,11 +33,120 @@ const notFoundRouter = {
|
||||||
path: '*', redirect: '/404', hidden: true
|
path: '*', redirect: '/404', hidden: true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 个人中心页面
|
||||||
|
const userAccount = [
|
||||||
|
// account
|
||||||
|
{
|
||||||
|
'name': 'account',
|
||||||
|
'pid': 0,
|
||||||
|
'id': 10028,
|
||||||
|
'meta': {
|
||||||
|
'title': '个人页',
|
||||||
|
'icon': 'user',
|
||||||
|
'show': false
|
||||||
|
},
|
||||||
|
'redirect': '/account/center',
|
||||||
|
'component': 'RouteView'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'name': 'center',
|
||||||
|
'pid': 10028,
|
||||||
|
'id': 10029,
|
||||||
|
'meta': {
|
||||||
|
'title': '个人中心',
|
||||||
|
'show': false
|
||||||
|
},
|
||||||
|
'component': 'AccountCenter'
|
||||||
|
},
|
||||||
|
// 特殊三级菜单
|
||||||
|
{
|
||||||
|
'name': 'settings',
|
||||||
|
'pid': '10028',
|
||||||
|
'id': '10030',
|
||||||
|
'meta': {
|
||||||
|
'title': '个人设置',
|
||||||
|
'hideHeader': true,
|
||||||
|
'hideChildren': true,
|
||||||
|
'show': false
|
||||||
|
},
|
||||||
|
'redirect': '/account/settings/base',
|
||||||
|
'component': 'AccountSettings'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'name': 'BaseSettings',
|
||||||
|
'path': '/account/settings/base',
|
||||||
|
'pid': 10030,
|
||||||
|
'id': 10031,
|
||||||
|
'meta': {
|
||||||
|
'title': '基本设置',
|
||||||
|
'show': false
|
||||||
|
},
|
||||||
|
'component': 'BaseSettings'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'name': 'SecuritySettings',
|
||||||
|
'path': '/account/settings/security',
|
||||||
|
'pid': 10030,
|
||||||
|
'id': 10032,
|
||||||
|
'meta': {
|
||||||
|
'title': '安全设置',
|
||||||
|
'show': false
|
||||||
|
},
|
||||||
|
'component': 'SecuritySettings'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'name': 'CustomSettings',
|
||||||
|
'path': '/account/settings/custom',
|
||||||
|
'pid': 10030,
|
||||||
|
'id': 10033,
|
||||||
|
'meta': {
|
||||||
|
'title': '个性化设置',
|
||||||
|
'show': false
|
||||||
|
},
|
||||||
|
'component': 'CustomSettings'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'name': 'BindingSettings',
|
||||||
|
'path': '/account/settings/binding',
|
||||||
|
'pid': 10030,
|
||||||
|
'id': 10034,
|
||||||
|
'meta': {
|
||||||
|
'title': '账户绑定',
|
||||||
|
'show': false
|
||||||
|
},
|
||||||
|
'component': 'BindingSettings'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'name': 'NotificationSettings',
|
||||||
|
'path': '/account/settings/notification',
|
||||||
|
'pid': 10030,
|
||||||
|
'id': 10034,
|
||||||
|
'meta': {
|
||||||
|
'title': '新消息通知',
|
||||||
|
'show': false
|
||||||
|
},
|
||||||
|
'component': 'NotificationSettings'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'name': 'Console',
|
||||||
|
'path': '/welcome',
|
||||||
|
'pid': 0,
|
||||||
|
'id': 183183,
|
||||||
|
'meta': {
|
||||||
|
'title': '首页',
|
||||||
|
'show': false
|
||||||
|
},
|
||||||
|
'component': 'Console'
|
||||||
|
}
|
||||||
|
|
||||||
|
]
|
||||||
|
|
||||||
// 根级菜单
|
// 根级菜单
|
||||||
const rootRouter = {
|
const rootRouter = {
|
||||||
path: '/',
|
path: '/',
|
||||||
name: 'index',
|
name: 'index',
|
||||||
component: 'BasicLayout',
|
component: 'BasicLayout',
|
||||||
|
redirect: '/welcome',
|
||||||
meta: { title: '首页' },
|
meta: { title: '首页' },
|
||||||
children: []
|
children: []
|
||||||
}
|
}
|
||||||
|
@ -38,17 +158,14 @@ const rootRouter = {
|
||||||
*/
|
*/
|
||||||
export const generatorDynamicRouter = (data) => {
|
export const generatorDynamicRouter = (data) => {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
console.log('流程5-后端返回的权限菜单:generatorDynamicRouter')
|
|
||||||
console.log(data)
|
|
||||||
const resNav = data.antDesignMenus
|
const resNav = data.antDesignMenus
|
||||||
const menuNav = []
|
const menuNav = []
|
||||||
const childrenNav = []
|
const childrenNav = []
|
||||||
// 后端数据, 根级树数组, 根级 PID
|
// 后端数据, 根级树数组, 根级 PID
|
||||||
listToTree(resNav, childrenNav, 0)
|
listToTree(resNav, childrenNav, 0)
|
||||||
|
// 增加静态网页
|
||||||
|
listToTree(userAccount, childrenNav, 0)
|
||||||
rootRouter.children = childrenNav
|
rootRouter.children = childrenNav
|
||||||
if (childrenNav.length > 0) {
|
|
||||||
rootRouter.redirect = childrenNav[0].path
|
|
||||||
}
|
|
||||||
menuNav.push(rootRouter)
|
menuNav.push(rootRouter)
|
||||||
const routers = generator(menuNav)
|
const routers = generator(menuNav)
|
||||||
routers.push(notFoundRouter)
|
routers.push(notFoundRouter)
|
||||||
|
@ -85,7 +202,7 @@ export const generator = (routerMap, parent) => {
|
||||||
icon: icon || undefined,
|
icon: icon || undefined,
|
||||||
hiddenHeaderContent: hiddenHeaderContent,
|
hiddenHeaderContent: hiddenHeaderContent,
|
||||||
target: target,
|
target: target,
|
||||||
permission: item.name
|
// permission: item.name
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// 是否设置了隐藏菜单
|
// 是否设置了隐藏菜单
|
||||||
|
@ -120,7 +237,7 @@ export const generator = (routerMap, parent) => {
|
||||||
const listToTree = (list, tree, parentId) => {
|
const listToTree = (list, tree, parentId) => {
|
||||||
list.forEach(item => {
|
list.forEach(item => {
|
||||||
// 判断是否为父级菜单
|
// 判断是否为父级菜单
|
||||||
if (item.parentId === parentId) {
|
if (item.pid === parentId) {
|
||||||
const child = {
|
const child = {
|
||||||
...item,
|
...item,
|
||||||
key: item.key || item.name,
|
key: item.key || item.name,
|
||||||
|
|
|
@ -8,6 +8,7 @@ const getters = {
|
||||||
nickname: state => state.user.name,
|
nickname: state => state.user.name,
|
||||||
welcome: state => state.user.welcome,
|
welcome: state => state.user.welcome,
|
||||||
roles: state => state.user.roles,
|
roles: state => state.user.roles,
|
||||||
|
buttons: state => state.user.buttons,
|
||||||
userInfo: state => state.user.info,
|
userInfo: state => state.user.info,
|
||||||
addRouters: state => state.permission.addRouters,
|
addRouters: state => state.permission.addRouters,
|
||||||
multiTab: state => state.app.multiTab
|
multiTab: state => state.app.multiTab
|
||||||
|
|
|
@ -18,7 +18,6 @@ const permission = {
|
||||||
actions: {
|
actions: {
|
||||||
GenerateRoutes ({ commit }, data) {
|
GenerateRoutes ({ commit }, data) {
|
||||||
return new Promise(resolve => {
|
return new Promise(resolve => {
|
||||||
console.log('动态生成路由:GenerateRoutes async-router 111')
|
|
||||||
generatorDynamicRouter(data).then(routers => {
|
generatorDynamicRouter(data).then(routers => {
|
||||||
commit('SET_ROUTERS', routers)
|
commit('SET_ROUTERS', routers)
|
||||||
resolve()
|
resolve()
|
||||||
|
|
|
@ -56,8 +56,6 @@ const user = {
|
||||||
getLoginUser().then(response => {
|
getLoginUser().then(response => {
|
||||||
if (response.code === 200) {
|
if (response.code === 200) {
|
||||||
const data = response.data
|
const data = response.data
|
||||||
console.log('流程2-获取到个人信息 => user.js')
|
|
||||||
console.log(data)
|
|
||||||
commit('SET_ROLES', 1)
|
commit('SET_ROLES', 1)
|
||||||
commit('SET_BUTTONS', data.permissions)
|
commit('SET_BUTTONS', data.permissions)
|
||||||
commit('SET_INFO', data)
|
commit('SET_INFO', data)
|
||||||
|
@ -79,7 +77,7 @@ const user = {
|
||||||
// 登出
|
// 登出
|
||||||
Logout ({ commit, state }) {
|
Logout ({ commit, state }) {
|
||||||
return new Promise((resolve) => {
|
return new Promise((resolve) => {
|
||||||
logout(state.token).then(() => {
|
logout().then(() => {
|
||||||
resolve()
|
resolve()
|
||||||
}).catch(() => {
|
}).catch(() => {
|
||||||
resolve()
|
resolve()
|
||||||
|
@ -87,6 +85,7 @@ const user = {
|
||||||
commit('SET_TOKEN', '')
|
commit('SET_TOKEN', '')
|
||||||
commit('SET_ROLES', [])
|
commit('SET_ROLES', [])
|
||||||
commit('SET_BUTTONS', [])
|
commit('SET_BUTTONS', [])
|
||||||
|
storage.remove(ACCESS_TOKEN)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
import store from '@/store'
|
||||||
|
|
||||||
export function actionToObject (json) {
|
export function actionToObject (json) {
|
||||||
try {
|
try {
|
||||||
return JSON.parse(json)
|
return JSON.parse(json)
|
||||||
|
@ -6,3 +8,15 @@ export function actionToObject (json) {
|
||||||
}
|
}
|
||||||
return []
|
return []
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 控制按钮是否显示
|
||||||
|
*/
|
||||||
|
export function hasBtnPermission (permission) {
|
||||||
|
const myBtns = store.getters.buttons
|
||||||
|
const nickname = store.getters.nickname
|
||||||
|
if (nickname == '超级管理员') {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return myBtns.indexOf(permission) > -1
|
||||||
|
}
|
|
@ -4,9 +4,10 @@ import storage from 'store'
|
||||||
import notification from 'ant-design-vue/es/notification'
|
import notification from 'ant-design-vue/es/notification'
|
||||||
import { VueAxios } from './axios'
|
import { VueAxios } from './axios'
|
||||||
import { ACCESS_TOKEN } from '@/store/mutation-types'
|
import { ACCESS_TOKEN } from '@/store/mutation-types'
|
||||||
|
import router from '../router'
|
||||||
|
|
||||||
const SUCCESS_CODE = 200
|
const SUCCESS_CODE = 200
|
||||||
const INVALID_TOKEN_CODE = '0000'
|
const INVALID_TOKEN_CODE = 401
|
||||||
|
|
||||||
const toast = (msg, description) => {
|
const toast = (msg, description) => {
|
||||||
notification.error({
|
notification.error({
|
||||||
|
@ -29,7 +30,7 @@ const errorHandler = (error) => {
|
||||||
// 从 localstorage 获取 token
|
// 从 localstorage 获取 token
|
||||||
const token = storage.get(ACCESS_TOKEN)
|
const token = storage.get(ACCESS_TOKEN)
|
||||||
if (error.response.status === 403) {
|
if (error.response.status === 403) {
|
||||||
toast('Forbidden:', data.message)
|
toast('Forbidden:', data.msg)
|
||||||
}
|
}
|
||||||
if (error.response.status === 401 && !(data.result && data.result.isLogin)) {
|
if (error.response.status === 401 && !(data.result && data.result.isLogin)) {
|
||||||
toast('Unauthorized:', 'Authorization verification failed')
|
toast('Unauthorized:', 'Authorization verification failed')
|
||||||
|
@ -47,9 +48,9 @@ const errorHandler = (error) => {
|
||||||
|
|
||||||
// request interceptor
|
// request interceptor
|
||||||
request.interceptors.request.use(config => {
|
request.interceptors.request.use(config => {
|
||||||
// const token = storage.get(ACCESS_TOKEN)
|
const token = storage.get(ACCESS_TOKEN)
|
||||||
// 由于登录接口待联调,token使用默认值
|
// 由于登录接口待联调,token使用默认值
|
||||||
const token = 'eyJhbGciOiJIUzUxMiJ9.eyJsb2dpbl91c2VyX2tleSI6IjBkYjU0YzQ0LWQ5MDktNDQ0ZC05YTYwLTE4ZGU1YjgyMzg5YyJ9.l37UO6WC9tPTuoJnbWKpTusHdtmon95Islq-jRNo9zmCKJ4GWwnY9_szBpgOii2Y7OVvc4sWibmFBdTwmAg8sg'
|
// const token = 'eyJhbGciOiJIUzUxMiJ9.eyJsb2dpbl91c2VyX2tleSI6IjY0MjM0YmY0LTkxOWEtNDFkMS05MzZlLTMwZDU3NDhkYmVjZCJ9.J15_FhVqcm_GsNIS2BCEYf26sWQQ4pMSTedV5eKauZT8-f6480Mx1s5ZdqWdEOlORnkKSc5pUioCngbCopr9cQ'
|
||||||
// 如果 token 存在,让每个请求携带自定义 token 请根据实际情况自行修改
|
// 如果 token 存在,让每个请求携带自定义 token 请根据实际情况自行修改
|
||||||
if (token) {
|
if (token) {
|
||||||
config.headers[ACCESS_TOKEN] = token
|
config.headers[ACCESS_TOKEN] = token
|
||||||
|
@ -69,7 +70,7 @@ request.interceptors.response.use((response) => {
|
||||||
} else if (response.data && response.data.code === INVALID_TOKEN_CODE) {
|
} else if (response.data && response.data.code === INVALID_TOKEN_CODE) {
|
||||||
toast(response.data.msg)
|
toast(response.data.msg)
|
||||||
store.dispatch('Logout').then(() => {
|
store.dispatch('Logout').then(() => {
|
||||||
this.$router.push({ name: 'login' })
|
router.push({ name: 'login' })
|
||||||
})
|
})
|
||||||
return Promise.reject(response)
|
return Promise.reject(response)
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -0,0 +1,15 @@
|
||||||
|
<template>
|
||||||
|
<a-card :bordered="false" style="display: flex;justify-content:center;height: 100%" >
|
||||||
|
<div style="margin:100px auto;">
|
||||||
|
<img src="~@/assets/welcome.png" class="logo" alt="logo">
|
||||||
|
</div>
|
||||||
|
</a-card>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="less" scoped>
|
||||||
|
|
||||||
|
</style>
|
|
@ -28,8 +28,8 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="table-operator">
|
<div class="table-operator">
|
||||||
<a-button type="primary" icon="plus" @click="$refs.userForm.add()">新增用户</a-button>
|
<a-button type="primary" icon="plus" v-if="hasPerm('sys:user:add')" @click="$refs.userForm.add()">新增用户</a-button>
|
||||||
<a-button type="danger" :disabled="selectedRowKeys.length < 1" @click="batchDelete">
|
<a-button type="danger" :disabled="selectedRowKeys.length < 1" v-if="hasPerm('sys:user:delete')" @click="batchDelete">
|
||||||
<a-icon type="delete"/>批量删除
|
<a-icon type="delete"/>批量删除
|
||||||
</a-button>
|
</a-button>
|
||||||
</div>
|
</div>
|
||||||
|
@ -46,22 +46,22 @@
|
||||||
{{ record.sex | sexFilter }}
|
{{ record.sex | sexFilter }}
|
||||||
</span>
|
</span>
|
||||||
<span slot="action" slot-scope="text, record">
|
<span slot="action" slot-scope="text, record">
|
||||||
<a @click="$refs.userForm.edit(record)">编辑</a>
|
<a v-if="hasPerm('sys:user:edit')" @click="$refs.userForm.edit(record)">编辑</a>
|
||||||
<a-divider type="vertical" />
|
<a-divider type="vertical" v-if="hasPerm('sysUser:edit')" />
|
||||||
<a-dropdown >
|
<a-dropdown v-if="hasPerm('sys:user:resetPwd') || hasPerm('sys:user:grantRole') || hasPerm('sys:user:delete')">
|
||||||
<a class="ant-dropdown-link">
|
<a class="ant-dropdown-link">
|
||||||
更多 <a-icon type="down" />
|
更多 <a-icon type="down" />
|
||||||
</a>
|
</a>
|
||||||
<a-menu slot="overlay">
|
<a-menu slot="overlay">
|
||||||
<a-menu-item>
|
<a-menu-item v-if="hasPerm('sys:user:resetPwd')">
|
||||||
<a-popconfirm placement="topRight" title="确认重置密码?" @confirm="() => resetPwd(record)">
|
<a-popconfirm placement="topRight" title="确认重置密码?" @confirm="() => resetPwd(record)">
|
||||||
<a>重置密码</a>
|
<a>重置密码</a>
|
||||||
</a-popconfirm>
|
</a-popconfirm>
|
||||||
</a-menu-item>
|
</a-menu-item>
|
||||||
<a-menu-item>
|
<a-menu-item v-if="hasPerm('sys:user:grantRole')">
|
||||||
<a @click="$refs.userRoleForm.userRole(record)">授权角色</a>
|
<a @click="$refs.userRoleForm.userRole(record)">授权角色</a>
|
||||||
</a-menu-item>
|
</a-menu-item>
|
||||||
<a-menu-item>
|
<a-menu-item v-if="hasPerm('sys:user:delete')">
|
||||||
<a-popconfirm placement="topRight" title="确认删除?" @confirm="() => singleDelete(record)">
|
<a-popconfirm placement="topRight" title="确认删除?" @confirm="() => singleDelete(record)">
|
||||||
<a>删除</a>
|
<a>删除</a>
|
||||||
</a-popconfirm>
|
</a-popconfirm>
|
||||||
|
@ -112,12 +112,6 @@ export default {
|
||||||
}, {
|
}, {
|
||||||
title: '手机',
|
title: '手机',
|
||||||
dataIndex: 'phoneNumber'
|
dataIndex: 'phoneNumber'
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '操作',
|
|
||||||
width: '150px',
|
|
||||||
dataIndex: 'action',
|
|
||||||
scopedSlots: { customRender: 'action' }
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
// 加载数据方法 必须为 Promise 对象
|
// 加载数据方法 必须为 Promise 对象
|
||||||
|
@ -144,6 +138,14 @@ export default {
|
||||||
},
|
},
|
||||||
created () {
|
created () {
|
||||||
// 动态加载权限
|
// 动态加载权限
|
||||||
|
if (this.hasPerm('sys:user:edit') || this.hasPerm('sys:user:resetPwd') || this.hasPerm('sys:user:grantRole') || this.hasPerm('sys:user:delete')) {
|
||||||
|
this.columns.push({
|
||||||
|
title: '操作',
|
||||||
|
width: '150px',
|
||||||
|
dataIndex: 'action',
|
||||||
|
scopedSlots: { customRender: 'action' }
|
||||||
|
})
|
||||||
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
// 重置密码
|
// 重置密码
|
||||||
|
|
Loading…
Reference in New Issue