提交 30d81e78 authored 作者: pengxiaohui's avatar pengxiaohui

用户搜索支持邮箱手机号自动匹配;菜单系统管理只有管理员可见

上级 4d7e508c
...@@ -28,25 +28,20 @@ ...@@ -28,25 +28,20 @@
<script> <script>
import { mapGetters } from 'vuex' import { mapGetters } from 'vuex'
import MenuItem from './MenuItem' import MenuItem from './MenuItem'
export default { const defaultMenu = [
data() {
return {
defaultActive: '/calendar',
menu: [
// {
// title: '创建直播',
// icon: 'el-icon-video-camera',
// path: '/create-live'
// },
{ {
title: '直播日历', title: '直播日历',
icon: 'el-icon-date', icon: 'el-icon-date',
path: '/calendar' path: '/calendar',
meta: {}
}, },
{ {
title: '系统管理', title: '系统管理',
icon: 'el-icon-setting', icon: 'el-icon-setting',
path: '/system', path: '/system',
meta: {
roles: ['administrator']
},
children: [ children: [
{ {
title: '角色管理', title: '角色管理',
...@@ -65,11 +60,47 @@ export default { ...@@ -65,11 +60,47 @@ export default {
icon: 'el-icon-user', icon: 'el-icon-user',
path: '/my' path: '/my'
} }
] ]
/**
* Use meta.role to determine if the current user has permission
* @param roles
* @param route
*/
function hasPermission(roles, route) {
if (route.meta && route.meta.roles) {
return roles.some(role => route.meta.roles.includes(role))
} else {
return true
}
}
/**
* Filter asynchronous routing tables by recursion
* @param routes asyncRoutes
* @param roles
*/
export function filterAsyncRoutes(routes, roles) {
const res = []
routes.forEach(route => {
const tmp = { ...route }
if (hasPermission(roles, tmp)) {
if (tmp.children) {
tmp.children = filterAsyncRoutes(tmp.children, roles)
}
res.push(tmp)
}
})
return res
}
export default {
data() {
return {
defaultActive: '/calendar',
menu: []
} }
}, },
computed: { computed: {
...mapGetters(['sidebar']), ...mapGetters(['sidebar', 'roles']),
isCollapse() { isCollapse() {
return !this.sidebar.opened return !this.sidebar.opened
} }
...@@ -82,6 +113,18 @@ export default { ...@@ -82,6 +113,18 @@ export default {
else this.defaultActive = '' else this.defaultActive = ''
}, },
immediate: true immediate: true
},
roles: {
handler: function(nv) {
let roleList
if (Array.isArray(nv)) {
roleList = nv.map(item => item.name)
}
const menus = filterAsyncRoutes(defaultMenu, roleList)
this.menu = menus
},
immediate: true,
deep: true
} }
}, },
methods: { methods: {
......
...@@ -65,20 +65,10 @@ ...@@ -65,20 +65,10 @@
</el-form-item> </el-form-item>
<el-form-item label="指定会议管理员"> <el-form-item label="指定会议管理员">
<p style="line-height:24px;font-size:12px;">(会议管理员有修改会议,复制、取消会议等所有管理本次会议的权限)</p> <p style="line-height:24px;font-size:12px;">(会议管理员有修改会议,复制、取消会议等所有管理本次会议的权限)</p>
<!-- <el-col :span="8">
<el-dropdown style="width:100%;" @command="(val) => searchType = val">
<el-button size="small" style="width:calc(100% - 5px);">
{{searchTypeOptions[searchType]}}<i class="el-icon-arrow-down el-icon--right"></i>
</el-button>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item :command="key" v-for="(value, key) in searchTypeOptions" :key="key">{{value}}</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</el-col> -->
<el-col :span="24"> <el-col :span="24">
<el-select style="width: 100%" v-model="form.managers" placeholder="输入关键字搜索" size="small" multiple filterable remote :remote-method="fetchUserList" :loading="searchUsersloading" > <el-select style="width: 100%" v-model="form.managers" placeholder="输入关键字搜索" size="small" multiple filterable remote :remote-method="fetchUserList" :loading="searchUsersloading" >
<el-option :label="user.username" :value="user.id" v-for="user in userList" :key="user.id" > <el-option :label="user.username" :value="user.id" v-for="user in userList" :key="user.id" >
<span style="float: left">{{ user.username }}</span> <span style="float: left">{{ user.real_name || user.nickname }}</span>
<span style="float: right; color: #8492a6; font-size: 13px; margin:0 20px 0 10px;">{{ user.id }}</span> <span style="float: right; color: #8492a6; font-size: 13px; margin:0 20px 0 10px;">{{ user.id }}</span>
</el-option> </el-option>
</el-select> </el-select>
...@@ -254,7 +244,6 @@ export default { ...@@ -254,7 +244,6 @@ export default {
mobile: '通过手机号搜索', mobile: '通过手机号搜索',
id: '通过ID搜索' id: '通过ID搜索'
}, },
searchKeywordsCheckMsg: '',
searchUsersloading: false, searchUsersloading: false,
rules: { rules: {
subject: [{ required: true, message: '请填写会议主题', trigger: 'blur' }], subject: [{ required: true, message: '请填写会议主题', trigger: 'blur' }],
...@@ -566,19 +555,17 @@ export default { ...@@ -566,19 +555,17 @@ export default {
return params return params
}, },
fetchUserList(val) { fetchUserList(val) {
this.searchKeywordsCheckMsg = '' let searchType = 'username'
if (!val) return if (EMAIL_REG.test(val)) {
if (this.searchType === 'email' && !EMAIL_REG.test(val)) { searchType = 'email'
this.searchKeywordsCheckMsg = '邮箱格式错误' } else if (MOBILE_REG.test(val)) {
this.userList = [] searchType = 'mobile'
} else if (this.searchType === 'mobile' && !MOBILE_REG.test(val)) { }
this.searchKeywordsCheckMsg = '手机号格式错误' if (!val) return false
this.userList = [] else {
} else {
const params = { const params = {
[this.searchType]: val [searchType]: val
}; }
this.searchKeywordsCheckMsg = ''
this.searchUsersloading = true this.searchUsersloading = true
searchUserList(params) searchUserList(params)
.then(res => { .then(res => {
......
...@@ -20,22 +20,13 @@ ...@@ -20,22 +20,13 @@
<el-form-item label="ID" prop="userid" v-if="dialogType === 'edit'"> <el-form-item label="ID" prop="userid" v-if="dialogType === 'edit'">
<el-input v-model="form.userid" size="small" disabled></el-input> <el-input v-model="form.userid" size="small" disabled></el-input>
</el-form-item> </el-form-item>
<el-form-item label="ID" prop="userid" v-else style="position:relative;"> <el-form-item label="ID" prop="userid" v-else>
<!-- <el-dropdown @command="(val) => searchType = val">
<el-button style="width:85px;" size="small">
{{searchTypeOptions[searchType]}}<i class="el-icon-arrow-down el-icon--right"></i>
</el-button>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item :command="key" v-for="(value, key) in searchTypeOptions" :key="key">{{value}}</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown> -->
<el-select v-model="form.userid" placeholder="输入关键字搜索" size="small" filterable remote :remote-method="fetchUserList" :loading="searchUsersloading" style="width:310px;"> <el-select v-model="form.userid" placeholder="输入关键字搜索" size="small" filterable remote :remote-method="fetchUserList" :loading="searchUsersloading" style="width:310px;">
<el-option :label="user.username" :value="user.id" v-for="user in userList" :key="user.id" > <el-option :label="user.username" :value="user.id" v-for="user in userList" :key="user.id" >
<span style="float: left">{{ user.username }}</span> <span style="float: left">{{ user.real_name || user.nickname }}</span>
<span style="float: right; color: #8492a6; font-size: 13px; margin-left:10px;">{{ user.id }}</span> <span style="float: right; color: #8492a6; font-size: 13px; margin-left:10px;">{{ user.id }}</span>
</el-option> </el-option>
</el-select> </el-select>
<p class="search-keywords-checked" v-if="searchKeywordsCheckMsg">{{searchKeywordsCheckMsg}}</p>
</el-form-item> </el-form-item>
<el-form-item label="名称" prop="username"> <el-form-item label="名称" prop="username">
<el-input v-model="form.username" size="small"></el-input> <el-input v-model="form.username" size="small"></el-input>
...@@ -115,7 +106,6 @@ export default { ...@@ -115,7 +106,6 @@ export default {
mobile: '手机号', mobile: '手机号',
id: 'ID' id: 'ID'
}, },
searchKeywordsCheckMsg: '',
searchUsersloading: false, searchUsersloading: false,
userList: [], userList: [],
deleteId: '', deleteId: '',
...@@ -175,28 +165,26 @@ export default { ...@@ -175,28 +165,26 @@ export default {
} }
}, },
fetchUserList(val) { fetchUserList(val) {
if (val) { let searchType = 'username'
if (this.searchType === 'email' && !EMAIL_REG.test(val)) { if (EMAIL_REG.test(val)) {
this.searchKeywordsCheckMsg = '邮箱格式错误' searchType = 'email'
this.userList = [] } else if (MOBILE_REG.test(val)) {
} else if (this.searchType === 'mobile' && !MOBILE_REG.test(val)) { searchType = 'mobile'
this.searchKeywordsCheckMsg = '手机号格式错误' }
this.userList = [] if (!val) return false
} else { else {
const params = { const params = {
[this.searchType]: val [searchType]: val
} }
this.searchKeywordsCheckMsg = '' this.searchUsersloading = true
this.searchUsersloading = true; searchUserList(params)
searchUserList(params).then((res) => { .then(res => {
this.searchUsersloading = false; this.searchUsersloading = false
if (res.data && Array.isArray(res.data.items)) { if (res.data && Array.isArray(res.data.items)) {
this.userList = res.data.items this.userList = res.data.items
} }
}).catch(() => {}) })
} .catch(() => {})
} else {
this.searchKeywordsCheckMsg = ''
} }
}, },
fetchAccountList() { fetchAccountList() {
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论