提交 75df9a65 authored 作者: pengxiaohui's avatar pengxiaohui

直播中台v2.2优化

上级 02124433
...@@ -17,6 +17,8 @@ export function operateLog(params) { ...@@ -17,6 +17,8 @@ export function operateLog(params) {
export function searchUserList(params) { export function searchUserList(params) {
return httpRequest.get('/api/live/common/v1/sso-user/search', { params }) return httpRequest.get('/api/live/common/v1/sso-user/search', { params })
} }
/* ----------------------------系统用户管理---------------------------- */
/** /**
* 获取当前用户的角色 * 获取当前用户的角色
*/ */
...@@ -32,8 +34,8 @@ export function createRole(data) { ...@@ -32,8 +34,8 @@ export function createRole(data) {
/** /**
* 更新角色 * 更新角色
*/ */
export function updateRole(params) { export function updateRole(id, params) {
return httpRequest.get(`/api/live/admin/v2/role/${params.role_id}/update`, { params }) return httpRequest.put(`/api/live/admin/v2/role/${id}/update`, params)
} }
/** /**
* 获取角色详情 * 获取角色详情
...@@ -44,8 +46,8 @@ export function getRoleDetails(params) { ...@@ -44,8 +46,8 @@ export function getRoleDetails(params) {
/** /**
* 删除 * 删除
*/ */
export function deleteRole(params) { export function deleteRole(id) {
return httpRequest.get(`/api/live/admin/v2/role/${params.role_id}/delete`, { params }) return httpRequest.delete(`/api/live/admin/v2/role/${id}/delete`)
} }
/** /**
* 获取角色列表 * 获取角色列表
...@@ -83,3 +85,23 @@ export function getPermissions(params) { ...@@ -83,3 +85,23 @@ export function getPermissions(params) {
export function permissionToRole(data) { export function permissionToRole(data) {
return httpRequest.post('/api/live/admin/v2/assign/permission-to-role', data) return httpRequest.post('/api/live/admin/v2/assign/permission-to-role', data)
} }
/* ----------------------------系统用户管理---------------------------- */
/**
* 创建系统用户
*/
export function createAccount(data) {
return httpRequest.post('/api/live/admin/v2/user/create', data)
}
/**
* 删除系统用户
*/
export function deleteAccount(data) {
return httpRequest.post('/api/live/admin/v2/user/batch-delete', data)
}
/**
* 获取系统用户列表(分页)
*/
export function getAccountList(params) {
return httpRequest.get('/api/live/admin/v2/users', { params })
}
import httpRequest from '@/utils/axios'
/**
* 创建腾讯用户
*/
export function createTxAccount(data) {
return httpRequest.post('/api/live/admin/v2-2/tencent/user/create', data)
}
/**
* 更新腾讯用户
*/
export function updateTxAccount(id, data) {
return httpRequest.put(`/api/live/admin/v2-2/tencent/user/${id}/update`, data)
}
/**
* 删除腾讯用户
*/
export function deleteTxAccount(data) {
return httpRequest.post('/api/live/admin/v2-2/tencent/user/batch-delete', data)
}
/**
* 获取腾讯用户列表(分页)
*/
export function getTxAccountList(params) {
return httpRequest.get('/api/live/admin/v2-2/tencent/users', { params })
}
/**
* 获取所有腾讯用户列表(分页)
*/
export function getAllTxAccountList(params) {
return httpRequest.get('/api/live/admin/v2-2/tencent/user/list', { params })
}
\ No newline at end of file
<template>
<el-select v-model="userId" v-bind="options" placeholder="输入邮箱/手机号码搜索" filterable remote :remote-method="fetchUserList" :loading="searchUsersloading" @change="handleChange">
<el-option :label="user.real_name || user.nickname " :value="user.id" v-for="user in userList" :key="user.id" >
<span style="float: left">
{{ user.real_name || user.nickname }}
<template v-if="user.mobile">(手机号:{{user.mobile}})</template>
</span>
<span style="float: right; color: #8492a6; font-size: 13px; margin:0 20px 0 10px;" v-if="user.email">邮箱:{{ user.email }}</span>
<span style="float: right; color: #8492a6; font-size: 13px; margin:0 20px 0 10px;" v-else>ID:{{ user.id }}</span>
</el-option>
</el-select>
</template>
<script>
const MOBILE_REG = /^1(3[0-9]|4[01456879]|5[0-35-9]|6[2567]|7[0-8]|8[0-9]|9[0-35-9])\d{4,8}$/
const EMAIL_REG = /^[A-Za-z0-9]+([_.\\-][A-Za-z0-9]+)*@[A-Za-z0-9-.]+$/
export default {
props: {
value: {
type: [Array, String]
},
defaultList: {
type: Array,
default: []
},
fetchApi: {
type: Function,
require: true
},
options: {
type: Object,
default: () => {
return {}
}
}
},
data() {
return {
userId: this.value,
searchUsersloading: false,
userList: []
}
},
watch: {
value: {
handler: function (nv) {
this.userId = nv
},
immediate: true,
deep: true
},
defaultList: {
handler: function (nv) {
this.userList = nv
},
immediate: true,
deep: true
}
},
methods: {
handleChange() {
const selectedUser = this.userList.find(item => item.id === this.userId)
this.$emit('input', this.userId)
this.$emit('select', selectedUser)
},
fetchUserList(val) {
let searchType = 'username'
if (EMAIL_REG.test(val)) {
searchType = 'email'
} else if (MOBILE_REG.test(val)) {
searchType = 'mobile'
}
if (!val) return false
else {
const params = {
[searchType]: val
}
this.searchUsersloading = true
this.fetchApi(params)
.then(res => {
this.searchUsersloading = false
if (res.data && Array.isArray(res.data.items)) {
this.userList = res.data.items
}
})
.catch(() => {})
}
}
}
}
</script>
<style scoped>
.el-select{
width:100%;
}
</style>
\ No newline at end of file
...@@ -49,12 +49,27 @@ const defaultMenu = [ ...@@ -49,12 +49,27 @@ const defaultMenu = [
path: '/system/role' path: '/system/role'
}, },
{ {
title: '账号管理', title: '用户管理',
icon: 'el-icon-key', icon: 'el-icon-key',
path: '/system/account' path: '/system/account'
} }
] ]
}, },
{
title: '腾讯会议设置',
icon: 'el-icon-message',
path: '/tencent',
meta: {
roles: ['administrator']
},
children: [
{
title: '腾讯账号管理',
icon: '',
path: '/tencent/account'
}
]
},
{ {
title: '个人设置', title: '个人设置',
icon: 'el-icon-user', icon: 'el-icon-user',
...@@ -137,7 +152,7 @@ export default { ...@@ -137,7 +152,7 @@ export default {
<style scoped> <style scoped>
.logo { .logo {
height: 48px; height: 48px;
width: 166px; width: 170px;
background: #fff; background: #fff;
padding-top: 4px; padding-top: 4px;
transition: width 0.295s ease-in-out; transition: width 0.295s ease-in-out;
......
...@@ -35,7 +35,7 @@ export default { ...@@ -35,7 +35,7 @@ export default {
} }
.sidebar-container { .sidebar-container {
/* transition: width 0.28s; */ /* transition: width 0.28s; */
width: 166px; width: 180px;
height: 100%; height: 100%;
position: fixed; position: fixed;
font-size: 0px; font-size: 0px;
...@@ -52,7 +52,7 @@ export default { ...@@ -52,7 +52,7 @@ export default {
min-height: 100%; min-height: 100%;
-webkit-transition: margin-left 0.28s; -webkit-transition: margin-left 0.28s;
transition: margin-left 0.28s; transition: margin-left 0.28s;
margin-left: 166px; margin-left: 180px;
position: relative; position: relative;
} }
.sidebar-collapse .main-container { .sidebar-collapse .main-container {
......
...@@ -67,7 +67,7 @@ ...@@ -67,7 +67,7 @@
<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="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" clearable> <!-- <el-select style="width: 100%" v-model="form.managers" placeholder="输入邮箱/手机号码搜索" size="small" multiple filterable remote :remote-method="fetchUserList" :loading="searchUsersloading" clearable>
<el-option :label="user.real_name || user.nickname " :value="user.id" v-for="user in userList" :key="user.id" > <el-option :label="user.real_name || user.nickname " :value="user.id" v-for="user in userList" :key="user.id" >
<span style="float: left"> <span style="float: left">
{{ user.real_name || user.nickname }} {{ user.real_name || user.nickname }}
...@@ -76,9 +76,21 @@ ...@@ -76,9 +76,21 @@
<span style="float: right; color: #8492a6; font-size: 13px; margin:0 20px 0 10px;" v-if="user.email">邮箱:{{ user.email }}</span> <span style="float: right; color: #8492a6; font-size: 13px; margin:0 20px 0 10px;" v-if="user.email">邮箱:{{ user.email }}</span>
<span style="float: right; color: #8492a6; font-size: 13px; margin:0 20px 0 10px;" v-else>ID:{{ user.id }}</span> <span style="float: right; color: #8492a6; font-size: 13px; margin:0 20px 0 10px;" v-else>ID:{{ user.id }}</span>
</el-option> </el-option>
</el-select> </el-select> -->
<user-search v-model="form.managers" :fetchApi="fetchApiSearch" :defaultList="userList" :options="{ size: 'small', multiple: true, clearable: true }"/>
</el-col> </el-col>
</el-form-item> </el-form-item>
<el-form-item label="会议主持人">
<el-select style="width: 100%" v-model="form.hosts" placeholder="请选择腾讯会议用户,支持关键字搜索" size="small" multiple filterable remote :remote-method="fetchTxAccountList" :loading="searchLoading" clearable>
<el-option :label="user.username" :value="user.userid" v-for="user in txAccountList" :key="user.id" >
<span style="float: left">
{{ user.username }}
<template v-if="user.phone">(手机号:{{user.phone}})</template>
</span>
<span style="float: right; color: #8492a6; font-size: 13px; margin:0 20px 0 10px;" v-if="user.email">邮箱:{{ user.email }}</span>
</el-option>
</el-select>
</el-form-item>
<el-form-item label="会议设置" style="margin-bottom:2px;"> <el-form-item label="会议设置" style="margin-bottom:2px;">
<el-col :span="10"> <el-col :span="10">
<el-checkbox style="width: 120px" v-model="form.hasPwd">开启会议密码</el-checkbox> <el-checkbox style="width: 120px" v-model="form.hasPwd">开启会议密码</el-checkbox>
...@@ -131,24 +143,34 @@ ...@@ -131,24 +143,34 @@
</el-form> </el-form>
</template> </template>
<script> <script>
import UserSearch from '@/components/UserSearch/index'
import { timeTrans, dateFormat, getYMDByDate, getTimestampYMD, getCurHalfHour, computedDateByRateTimes, computedTimesByRateDate } from '@/utils/dateAlgs' import { timeTrans, dateFormat, getYMDByDate, getTimestampYMD, getCurHalfHour, computedDateByRateTimes, computedTimesByRateDate } from '@/utils/dateAlgs'
import { searchUserList } from '@api/common' import { searchUserList } from '@api/common'
import { getTxAccountList } from '@api/tencent'
import { mapGetters } from 'vuex' import { mapGetters } from 'vuex'
// import _ from 'lodash' // import _ from 'lodash'
const DAY_TIMESTAMP = 8.64e7 const DAY_TIMESTAMP = 8.64e7
const MOBILE_REG = /^1(3[0-9]|4[01456879]|5[0-35-9]|6[2567]|7[0-8]|8[0-9]|9[0-35-9])\d{4,8}$/
const EMAIL_REG = /^[A-Za-z0-9]+([_.\\-][A-Za-z0-9]+)*@[A-Za-z0-9-.]+$/
export default { export default {
components: { UserSearch },
props: { props: {
data: { data: {
type: Object type: Object
}, },
users: { users: {
type: Array type: Array,
default: () => {
return []
}
}, },
isReviewRecurring: { isReviewRecurring: {
type: Boolean, type: Boolean,
default: false default: false
},
reviewList: {
type: Object,
default: () => {
return {}
}
} }
}, },
data() { data() {
...@@ -241,19 +263,15 @@ export default { ...@@ -241,19 +263,15 @@ export default {
enable_live_password: false, enable_live_password: false,
live_password: '', live_password: '',
enable_live_im: false enable_live_im: false
} },
managers: [],
hosts: []
}, },
recurringTypeOptions: ['每天', '每个工作日', '每周', '每两周', '每月'], recurringTypeOptions: ['每天', '每个工作日', '每周', '每两周', '每月'],
userList: [], userList: [],
searchType: 'username', txAccountList: [],
searchTypeOptions: { searchLoading: false,
username: '通过用户名搜索', fetchApiSearch: searchUserList,
nickname: '通过昵称搜索',
email: '通过邮箱搜索',
mobile: '通过手机号搜索',
id: '通过ID搜索'
},
searchUsersloading: false,
rules: { rules: {
subject: [{ required: true, message: '请填写会议主题', trigger: 'blur' }], subject: [{ required: true, message: '请填写会议主题', trigger: 'blur' }],
startDate: [ startDate: [
...@@ -423,7 +441,9 @@ export default { ...@@ -423,7 +441,9 @@ export default {
data: { data: {
handler: function (val) { handler: function (val) {
if (val && val.startDate) { if (val && val.startDate) {
this.userList = this.users console.log(this.reviewList)
this.userList = this.reviewList.userList
this.txAccountList = this.reviewList.accountList
this.deepSet(this.form, val) this.deepSet(this.form, val)
// if (val.meeting_type === 1) { // if (val.meeting_type === 1) {
// val.recurring_rule.until_type === 0 ? this.setUntilCount() : this.setUntilDate() // val.recurring_rule.until_type === 0 ? this.setUntilCount() : this.setUntilDate()
...@@ -435,6 +455,9 @@ export default { ...@@ -435,6 +455,9 @@ export default {
} }
}, },
created() { created() {
if (this.$route.name !== 'MeetingUpdate') {
this.fetchTxAccountList()
}
this.setUntilDate() this.setUntilDate()
}, },
methods: { methods: {
...@@ -536,6 +559,9 @@ export default { ...@@ -536,6 +559,9 @@ export default {
enable_live: form.enable_live, enable_live: form.enable_live,
managers: form.managers.length > 0 ? form.managers : [this.user.id] managers: form.managers.length > 0 ? form.managers : [this.user.id]
} }
if (form.hosts.length > 0) {
params.hosts = form.hosts
}
if (form.hasPwd) params.password = form.password if (form.hasPwd) params.password = form.password
const settings = { ...form.settings } const settings = { ...form.settings }
if (!form.auto_record) { if (!form.auto_record) {
...@@ -563,28 +589,21 @@ export default { ...@@ -563,28 +589,21 @@ export default {
} }
return params return params
}, },
fetchUserList(val) { fetchTxAccountList(val) {
let searchType = 'username' const params = {
if (EMAIL_REG.test(val)) { page: 1,
searchType = 'email' limit: 100
} else if (MOBILE_REG.test(val)) {
searchType = 'mobile'
}
if (!val) return false
else {
const params = {
[searchType]: val
}
this.searchUsersloading = true
searchUserList(params)
.then(res => {
this.searchUsersloading = false
if (res.data && Array.isArray(res.data.items)) {
this.userList = res.data.items
}
})
.catch(() => {})
} }
if (val) params.search = val
this.searchLoading = true
getTxAccountList(params)
.then(res => {
this.searchLoading = false
if (res.data && Array.isArray(res.data.data)) {
this.txAccountList = res.data.data
}
})
.catch(() => {})
} }
} }
} }
......
<template> <template>
<div class="meeting-update"> <div class="meeting-update">
<div class="inner"> <div class="inner">
<meeting-form :data="reviewData" :isReviewRecurring="isReviewRecurring" :users="userList" @submitForm="handleSubmit"></meeting-form> <meeting-form :data="reviewData" :isReviewRecurring="isReviewRecurring" :users="userList" :reviewList="reviewList" @submitForm="handleSubmit"></meeting-form>
</div> </div>
<meeting-success-dialog :dialogVisible.sync="dialogVisible" :details="details"/> <meeting-success-dialog :dialogVisible.sync="dialogVisible" :details="details"/>
</div> </div>
...@@ -19,7 +19,11 @@ export default ({ ...@@ -19,7 +19,11 @@ export default ({
reviewData: {}, reviewData: {},
userList: [], userList: [],
dialogVisible: false, dialogVisible: false,
details: {} details: {},
reviewList: {
userList: [],
accountList: []
}
} }
}, },
computed: { computed: {
...@@ -122,6 +126,12 @@ export default ({ ...@@ -122,6 +126,12 @@ export default ({
const _managers = details.managers.map(it => it.user_id) const _managers = details.managers.map(it => it.user_id)
reviewData.managers = _managers; reviewData.managers = _managers;
this.userList = details.managers this.userList = details.managers
this.reviewList.userList = details.managers
}
if (Array.isArray(details.hosts) && details.hosts.length > 0) {
const _hosts = details.hosts.map(it => it.userid)
reviewData.hosts = _hosts;
this.reviewList.accountList = details.hosts
} }
this.reviewData = reviewData this.reviewData = reviewData
// console.log(reviewData) // console.log(reviewData)
......
<template> <template>
<div class="account"> <div class="account">
<h5>账号管理 <el-button style="float:right;margin:12px 30px 0 0" size="mini" type="primary" plain @click="handleAdd" v-if="isSuperAdmin">添加账号</el-button></h5> <h5>用户管理 <el-button style="float:right;margin:12px 30px 0 0" size="mini" type="primary" plain @click="handleAdd" v-if="isSuperAdmin">新增用户</el-button></h5>
<div class="inner"> <div class="inner">
<el-table :data="listData" style="width: 100%" height="calc(100% - 32px)" v-loading="loading"> <div class="search-filter">
<el-table-column prop="userid" label="ID" min-width="120"></el-table-column> <div class="filter-item">
<el-table-column prop="username" label="名称" min-width="120"></el-table-column> <label>姓名</label>
<el-table-column prop="phone" label="手机号码" min-width="120"></el-table-column> <div class="filter-select">
<el-table-column prop="email" label="邮箱" min-width="140"></el-table-column> <user-search v-model="filter.sso_id" @select="handleSelect" :fetchApi="fetchApiSearch" :options="{ size: 'mini', clearable: true }"/>
<el-table-column label="操作" min-width="60" v-if="isSuperAdmin"> </div>
<template slot-scope="scope"> </div>
<el-button type="text" size="small" @click="handleEdit(scope.row)">编辑</el-button> <div class="filter-item">
<el-button type="text" size="small" @click="handleDelete(scope.row.userid)">删除</el-button> <label>角色</label>
</template> <div class="filter-select">
</el-table-column> <el-select v-model="filter.role_id" placeholder="请选择角色" size="mini">
</el-table> <el-option v-for="item in roleList" :label="item.display_name" :value="item.id" :key="item.id"> </el-option>
<el-pagination :current-page.sync="curPage" :page-size="pageSize" layout="total, prev, pager, next, jumper" :total="total" @current-change="pageChange" style="float:right;"></el-pagination>
<el-dialog :title="domicTitle" :visible.sync="dialogVisible" width="420px" center>
<el-form :model="form" :rules="rules" ref="ruleForm" label-width="70px" class="demo-ruleForm" v-show="dialogType === 'add' || 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-form-item>
<el-form-item label="ID" prop="userid" v-else>
<el-select v-model="form.userid" placeholder="输入邮箱/手机号码搜索" size="small" filterable remote :remote-method="fetchUserList" :loading="searchUsersloading" style="width:310px;">
<el-option :label="user.real_name || user.nickname " :value="user.id" v-for="user in userList" :key="user.id" >
<span style="float: left">
{{ user.real_name || user.nickname }}
<template v-if="user.mobile">(手机号:{{user.mobile}})</template>
</span>
<span style="float: right; color: #8492a6; font-size: 13px; margin:0 20px 0 10px;" v-if="user.email">邮箱:{{ user.email }}</span>
<span style="float: right; color: #8492a6; font-size: 13px; margin:0 20px 0 10px;" v-else>ID:{{ user.id }}</span>
</el-option>
</el-select> </el-select>
</div>
</div>
<div class="filter-item">
<el-button type="primary" icon="el-icon-search" size="mini" @click="fetchAccountList">查询</el-button>
<el-button icon="el-icon-refresh-left" size="mini" @click="reset">重置</el-button>
</div>
</div>
<div class="delete-bar">
<i class="el-icon-warning"></i> 已选择 <span class="num">{{selection.length || 0}}</span><el-button type="text" size="m" :disabled="!selection.length" @click="handleDelete('')" style="margin-left:15px;">删除</el-button>
</div>
<div class="table-container">
<el-table :data="listData" style="width: 100%;" height="100%" v-loading="loading" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="45" />
<el-table-column prop="sso_user.nickname" label="姓名" min-width="100" />
<el-table-column label="手机号码" min-width="100">
<template slot-scope="{ row }">
<span>{{row.sso_user.mobile || '-'}}</span>
</template>
</el-table-column>
<el-table-column label="邮箱" min-width="140">
<template slot-scope="{ row }">
<span>{{row.sso_user.email || '-'}}</span>
</template>
</el-table-column>
<el-table-column label="角色" min-width="80">
<template slot-scope="{ row }">
<span v-for="(item, index) in row.roles" :key="item.name">{{index > 0 ? '、':''}}{{item.display_name}}</span>
<span v-if="!row.roles || !row.roles.length">-</span>
</template>
</el-table-column>
<el-table-column label="最后登录时间" min-width="120">
<template slot-scope="{ row }">
<span>{{row.last_login_time || '-'}}</span>
</template>
</el-table-column>
<el-table-column label="操作" min-width="80" v-if="isSuperAdmin">
<template slot-scope="scope">
<el-button type="text" size="small" @click="handleDelete(scope.row.userid)">删除</el-button>
<el-button type="text" size="small" @click="handleEdit(scope.row)">配置权限</el-button>
</template>
</el-table-column>
</el-table>
</div>
<div class="footer-bar">
<el-pagination :current-page.sync="curPage" :page-size.sync="pageSize" :page-sizes="[10, 20, 50, 100]" layout="total, prev, pager, next, sizes, jumper" :total="total" @current-change="pageChange" @size-change="pageChange" style="text-align:right;"></el-pagination>
</div>
</div>
<el-dialog :title="domicTitle" :visible.sync="dialogVisible" width="420px" center>
<el-form :model="form" :rules="rules" ref="ruleForm" label-width="70px" class="demo-ruleForm">
<template v-if="dialogType === 'add'">
<el-form-item label="ID" prop="userid">
<user-search v-model="form.user_id" @select="handleSelect" :fetchApi="fetchApiSearch" :options="{ size: 'small' }"/>
</el-form-item> </el-form-item>
<el-form-item label="名称" prop="username"> <el-form-item label="名称">
<el-input v-model="form.username" size="small"></el-input> <el-input v-model="form.username" size="small" disabled></el-input>
</el-form-item> </el-form-item>
<el-form-item label="手机号" prop="phone"> <el-form-item label="手机号">
<el-input v-model="form.phone" size="small"></el-input> <el-input v-model="form.phone" size="small" disabled></el-input>
</el-form-item> </el-form-item>
<el-form-item label="邮箱" prop="email"> <el-form-item label="邮箱">
<el-input v-model="form.email" size="small"></el-input> <el-input v-model="form.email" size="small" disabled></el-input>
</el-form-item> </el-form-item>
</el-form> </template>
<p v-show="dialogType === 'delete'">删除此账号,与其相关的会议将被同时删除,确认删除此账号吗?</p> <template v-else>
<span slot="footer" class="dialog-footer"> <el-form-item label="角色" prop="role_id">
<el-button type="primary" @click="handleBtn" size="mini">确 定</el-button> <el-select v-model="form.role_id" placeholder="请选择角色" size="mini" style="width:100%;">
<el-button @click="dialogVisible = false" size="mini">取 消</el-button> <el-option v-for="item in roleList" :label="item.display_name" :value="item.id" :key="item.id"> </el-option>
</span> </el-select>
</el-dialog> </el-form-item>
</div> </template>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button type="primary" @click="handleBtn" size="mini">确 定</el-button>
<el-button @click="dialogVisible = false" size="mini">取 消</el-button>
</span>
</el-dialog>
</div> </div>
</template> </template>
<script> <script>
import { getAccountList, searchUserList, createAccount, updateAccount, deleteAccount, operateLog } from '@api/common' import UserSearch from '@/components/UserSearch/index'
import { searchUserList, operateLog } from '@api/common'
import { createAccount, getAccountList, deleteAccount, getRoles, roleToUser } from '@api/system'
import { mapGetters } from 'vuex' import { mapGetters } from 'vuex'
import _ from 'lodash' const defaultForm = {
const MOBILE_REG = /^1(3[0-9]|4[01456879]|5[0-35-9]|6[2567]|7[0-8]|8[0-9]|9[0-35-9])\d{4,8}$/ user_id: '',
const EMAIL_REG = /^[A-Za-z0-9]+([_.\\-][A-Za-z0-9]+)*@[A-Za-z0-9-.]+$/ username: '',
phone: '',
email: '',
role_id: ''
}
export default { export default {
components: { UserSearch },
data () { data () {
const phoneReg = /^1(3[0-9]|4[01456879]|5[0-35-9]|6[2567]|7[0-8]|8[0-9]|9[0-35-9])\d{8}$/
const checkMobile = (rule, value, callback) => {
if (value) {
if (!phoneReg.test(value)) {
callback(new Error('手机号格式错误'));
} else {
callback()
}
}
}
const emailReg = /^[A-Za-z0-9]+([_.\\-][A-Za-z0-9]+)*@([A-Za-z0-9-]+\.)+[A-Za-z]{2,6}$/
const checkEmail = (rule, value, callback) => {
if (value) {
if (!emailReg.test(value)) {
callback(new Error('邮箱格式错误'));
} else {
callback()
}
}
}
return { return {
filter: {
sso_id: '',
role_id: ''
},
isCollapse: false,
listData: [], listData: [],
curPage: 1, curPage: 1,
pageSize: 20, pageSize: 20,
total: 0, total: 0,
selection: [],
dialogVisible: false, dialogVisible: false,
dialogType: 'add', dialogType: 'add',
form: { form: Object.assign({}, defaultForm),
userid: '',
username: '',
phone: '',
email: ''
},
rules: { rules: {
userid: [{ required: true, message: '请选择ID', trigger: 'change' }], user_id: [{ required: true, message: '请选择ID', trigger: 'change' }],
username: [{ required: true, message: '请输入名称', trigger: 'blur' }], role_id: [{ required: true, message: '请选择角色', trigger: 'change' }]
phone: [
{ required: true, message: '请输入手机号', trigger: 'blur' },
{ validator: checkMobile, trigger: 'blur' }
],
email: [
{ required: true, message: '请输入邮箱', trigger: 'blur' },
{ validator: checkEmail, trigger: 'blur' }
]
}, },
searchType: 'username', loading: false,
searchTypeOptions: { fetchApiSearch: searchUserList,
username: '用户名', roleList: []
nickname: '昵称',
email: '邮箱',
mobile: '手机号',
id: 'ID'
},
searchUsersloading: false,
userList: [],
deleteId: '',
loading: false
} }
}, },
computed: { computed: {
...mapGetters(['isSuperAdmin', 'user']), ...mapGetters(['isSuperAdmin', 'user']),
domicTitle() { domicTitle() {
let title = '新增' let title = '新增用户'
switch (this.dialogType) { switch (this.dialogType) {
case 'edit': case 'permissions':
title = '编辑' title = '配置权限'
break
case 'delete':
title = '删除'
break break
} }
return title + '账号' return title
} }
}, },
created() { created() {
this.fetchAccountList() this.fetchAccountList()
this.fetchRoleList()
}, },
methods: { methods: {
handleSelectionChange(val) {
this.selection = val
},
handleSelect(val) {
this.form.username = val.username
this.form.email = val.email
this.form.phone = val.mobile
},
reset() {
Object.keys(this.filter).map(key => { this.filter[key] = '' })
this.fetchAccountList()
},
handleEdit(data) { handleEdit(data) {
this.form = _.cloneDeep(data) this.form.user_id = data.user_id
this.dialogType = 'edit' this.form.role_id = data.roles[0].id
this.dialogType = 'permissions'
this.dialogVisible = true this.dialogVisible = true
}, },
handleAdd() { handleAdd() {
...@@ -150,54 +174,35 @@ export default { ...@@ -150,54 +174,35 @@ export default {
this.dialogVisible = true this.dialogVisible = true
}, },
handleDelete(id) { handleDelete(id) {
this.dialogType = 'delete' const ids = id ? [id] : this.selection.map(item => item.user_id)
this.dialogVisible = true this.$confirm('此操作将删除所选中项的数据, 是否继续执行?', '提示', {
this.deleteId = id confirmButtonText: '确定',
cancelButtonText: '取消'
}).then(() => {
this.fetchDeleteAccount(ids)
}).catch(() => {});
}, },
pageChange() { pageChange() {
this.fetchAccountList() this.fetchAccountList()
}, },
handleBtn() { handleBtn() {
if (this.dialogType === 'delete') { this.$refs.ruleForm.validate((valid) => {
this.fetchDeleteAccount() if (valid) {
this.dialogVisible = false this.dialogType === 'add' ? this.fetchCreateAccount() : this.fetchRoleToUser()
} else { this.dialogVisible = false
this.$refs.ruleForm.validate((valid) => {
if (valid) {
this.dialogType === 'add' ? this.fetchCreateAccount() : this.fetchUpdateAccount()
this.dialogVisible = false
}
});
}
},
fetchUserList(val) {
let searchType = 'username'
if (EMAIL_REG.test(val)) {
searchType = 'email'
} else if (MOBILE_REG.test(val)) {
searchType = 'mobile'
}
if (!val) return false
else {
const params = {
[searchType]: val
} }
this.searchUsersloading = true });
searchUserList(params)
.then(res => {
this.searchUsersloading = false
if (res.data && Array.isArray(res.data.items)) {
this.userList = res.data.items
}
})
.catch(() => {})
}
}, },
fetchAccountList() { fetchAccountList() {
const params = { const params = {
page: this.curPage, page: this.curPage,
limit: this.pageSize limit: this.pageSize,
sso_id: this.filter.sso_id,
role_id: this.filter.role_id
} }
Object.keys(params).forEach(key => {
if (params[key] === '') delete params[key]
})
this.loading = true this.loading = true
getAccountList(params).then((res) => { getAccountList(params).then((res) => {
this.loading = false this.loading = false
...@@ -210,52 +215,55 @@ export default { ...@@ -210,52 +215,55 @@ export default {
fetchCreateAccount() { fetchCreateAccount() {
const form = this.form const form = this.form
const params = { const params = {
userid: form.userid, sso_id: form.user_id
username: form.username,
phone: form.phone,
email: form.email,
type: 1
} }
createAccount(params).then((res) => { createAccount(params).then((res) => {
if (res.code === 0 && res.data.id) { if (res.code === 0 && res.data.sso_id) {
this.$message.success('创建户成功') this.$message.success('创建户成功')
this.fetchAccountList() this.fetchAccountList()
operateLog({ type: `创建腾讯账号,被创建账户userid:${form.userid}`, user: this.user }) operateLog({ type: `创建系统用户,被创建账户userid:${form.userid}`, user: this.user.nickname })
} else { } else {
this.$message.error(res.message || '创建账户失败') this.$message.error(res.message || '创建账户失败')
} }
}) })
}, },
fetchUpdateAccount() { fetchDeleteAccount(ids) {
const form = this.form deleteAccount({ sso_ids: ids }).then((res) => {
const params = {
userid: form.userid,
username: form.username,
phone: form.phone,
email: form.email
}
updateAccount(params).then((res) => {
if (res.code === 0 && res.data.status === true) { if (res.code === 0 && res.data.status === true) {
this.$message.success('更新账户成功') this.$message.success('删除账户成功')
this.fetchAccountList() this.fetchAccountList()
operateLog({ type: `更新腾讯账号,被更新账户userid:${form.userid}`, user: this.user }) operateLog({ type: `删除系统用户,被删除账户userid:${ids.join(',')}`, user: this.user })
this.deleteId = ''
} else { } else {
this.$message.error(res.message || '更新账户失败') this.$message.error(res.message || '删除账户失败')
} }
}) })
}, },
fetchDeleteAccount() { fetchRoleList() {
const params = { const params = {
userid: this.deleteId page: 1,
limit: 100
} }
deleteAccount(params).then((res) => { getRoles(params).then((res) => {
if (res.code === 0 && res.data.status === true) { if (res.code === 0 && res.data.data) {
this.$message.success('删除账户成功') this.roleList = res.data.data
}
})
},
fetchRoleToUser() {
const form = this.form
const params = {
role_id: form.role_id,
sso_ids: form.user_id
}
console.log(this.form)
roleToUser(params).then(res => {
if (res.code === 0 && res.data && res.data.status) {
this.$message.success('配置权限成功')
this.fetchAccountList() this.fetchAccountList()
operateLog({ type: `删除腾讯账号,被删除账户userid:${this.deleteId}`, user: this.user }) operateLog({ type: `配置权限,被操作用户sso_id:${form.user_id}`, user: this.user })
this.deleteId = ''
} else { } else {
this.$message.error(res.message || '删除账户失败') this.$message.error(res.message || '配置权限失败')
} }
}) })
} }
...@@ -270,17 +278,44 @@ h5{ ...@@ -270,17 +278,44 @@ h5{
font-size: 16px; font-size: 16px;
font-family: PingFangSC-Regular, PingFang SC; font-family: PingFangSC-Regular, PingFang SC;
color:#333; color:#333;
font-weight: 400; font-weight: 500;
line-height:50px; line-height:50px;
text-indent:40px; text-indent:20px;
} }
.inner{ .inner{
height: calc(100% - 50px - 10px); height: calc(100% - 50px - 15px);
background: #FFFFFF; background: #FFFFFF;
border-radius: 10px; border-radius: 10px;
margin:0 16px; margin:0 16px;
box-sizing:border-box; box-sizing:border-box;
padding:14px 14px 6px; padding:14px 14px 6px;
display:flex;
flex-direction:column;
}
.table-container{
flex:1;
}
.search-filter{
display:flex;
flex-wrap: wrap;
padding:10px;
}
.search-filter .filter-item{
width:33.33%;
margin-bottom:15px;
}
.filter-item .filter-select{
width:220px;
display:inline-block;
}
.filter-item .filter-select .el-select{
width:100%;
}
.search-filter label{
display:inline-block;
width:60px;
text-align:right;
padding-right:10px;
} }
.search-keywords-checked{ .search-keywords-checked{
color: #F56C6C; color: #F56C6C;
...@@ -291,6 +326,19 @@ h5{ ...@@ -291,6 +326,19 @@ h5{
top: 100%; top: 100%;
right: 0; right: 0;
} }
.footer-bar{
padding:8px 0 4px;
}
.delete-bar{
padding:0 20px;
background: #ecf5ff;
border: #b3d8ff 1px solid;
border-radius:4px;
margin-bottom:15px;
}
.delete-bar i, .delete-bar .num{
color:#409EFF;
}
.account ::v-deep.el-dialog__header{ .account ::v-deep.el-dialog__header{
padding-top:14px; padding-top:14px;
} }
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
<div class="account"> <div class="account">
<h5> <h5>
角色管理 角色管理
<!-- <el-button style="float: right; margin: 12px 30px 0 0" size="mini" type="primary" plain @click="handleAdd">添加角色</el-button> --> <el-button style="float: right; margin: 12px 30px 0 0" size="mini" type="primary" plain @click="handleAdd">添加角色</el-button>
</h5> </h5>
<div class="inner"> <div class="inner">
<el-table :data="listData" style="width: 100%" height="calc(100% - 32px)" v-loading="loading"> <el-table :data="listData" style="width: 100%" height="calc(100% - 32px)" v-loading="loading">
...@@ -10,51 +10,67 @@ ...@@ -10,51 +10,67 @@
<el-table-column prop="display_name" label="角色名称" min-width="120"></el-table-column> <el-table-column prop="display_name" label="角色名称" min-width="120"></el-table-column>
<el-table-column prop="description" label="角色描述" min-width="120"></el-table-column> <el-table-column prop="description" label="角色描述" min-width="120"></el-table-column>
<el-table-column prop="updated_at" label="创建时间" min-width="120"></el-table-column> <el-table-column prop="updated_at" label="创建时间" min-width="120"></el-table-column>
<!-- <el-table-column label="操作" min-width="140"> <el-table-column label="操作" min-width="140">
<template slot-scope="scope"> <template slot-scope="scope">
<el-button type="text" size="small" @click="handleUsers(scope.row)">分配用户</el-button> <!-- <el-button type="text" size="small" @click="handlePermission(scope.row)">设置权限</el-button> -->
<el-button type="text" size="small" @click="handlePermission(scope.row)">设置权限</el-button>
<el-button type="text" size="small" @click="handleEdit(scope.row)">编辑</el-button> <el-button type="text" size="small" @click="handleEdit(scope.row)">编辑</el-button>
<el-button type="text" size="small" @click="handleDelete(scope.row.userid)">删除</el-button> <el-button type="text" size="small" @click="handleDelete(scope.row)">删除</el-button>
</template> </template>
</el-table-column> --> </el-table-column>
</el-table> </el-table>
<el-pagination :current-page.sync="curPage" :page-size="pageSize" layout="total, prev, pager, next, jumper" :total="total" @current-change="pageChange" style="float:right;"></el-pagination> <el-pagination :current-page.sync="curPage" :page-size="pageSize" layout="total, prev, pager, next, jumper" :total="total" @current-change="pageChange" style="float:right;"></el-pagination>
</div> </div>
<el-dialog :title="domicTitle" :visible.sync="dialogVisible" width="420px" center>
<el-form :model="form" :rules="rules" ref="ruleForm" label-width="80px" class="demo-ruleForm">
<el-form-item label="角色名称" prop="display_name">
<el-input v-model="form.display_name" size="small"></el-input>
</el-form-item>
<el-form-item label="角色key" prop="name">
<el-input v-model="form.name" size="small"></el-input>
</el-form-item>
<el-form-item label="角色描述" prop="description">
<el-input v-model="form.description" size="small"></el-input>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button type="primary" @click="handleEnter" size="mini">确 定</el-button>
<el-button @click="dialogVisible = false" size="mini">取 消</el-button>
</span>
</el-dialog>
</div> </div>
</template> </template>
<script> <script>
import { getRoles } from '@api/system' import { getRoles, createRole, operateLog, deleteRole, updateRole } from '@api/system'
import { mapGetters } from 'vuex' import { mapGetters } from 'vuex'
const defaultForm = {
name: '',
display_name: '',
description: '',
id: ''
}
export default { export default {
data() { data() {
return { return {
listData: [ listData: [],
{
id: 2,
name: 'general_admin',
display_name: '普通管理员',
description: '拥有超级管理员下的最高权限',
created_at: '2021-04-01 09:38:25',
updated_at: '2021-04-01 09:38:25'
},
{
id: 1,
name: 'administrator',
display_name: '超级管理员',
description: '拥有所有的权限',
created_at: '2021-04-01 09:29:41',
updated_at: '2021-04-01 09:29:41'
}
],
curPage: 1, curPage: 1,
pageSize: 20, pageSize: 20,
total: 0, total: 0,
loading: false loading: false,
dialogVisible: false,
dialogType: 'add',
form: Object.assign({}, defaultForm),
rules: {
name: { required: true, message: '请输入角色key', trigger: 'blur' },
display_name: { required: true, message: '请输入角色名称', trigger: 'blur' },
description: { required: true, message: '请输入角色描述', trigger: 'blur' }
}
} }
}, },
computed: { computed: {
...mapGetters(['isSuperAdmin']) ...mapGetters(['isSuperAdmin']),
domicTitle() {
return this.dialogType === 'add' ? '新增角色' : '编辑角色'
}
}, },
created() { created() {
this.fetchRoleList() this.fetchRoleList()
...@@ -67,12 +83,30 @@ export default { ...@@ -67,12 +83,30 @@ export default {
console.log(val) console.log(val)
}, },
handleEdit(val) { handleEdit(val) {
console.log(val) this.form = Object.assign({}, val)
this.dialogVisible = true
this.dialogType = 'edit'
}, },
handleDelete(val) { handleDelete(val) {
console.log(val) this.$confirm('删除此角色将导致相关联的用户不可用, 是否继续执行?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消'
}).then(() => {
this.fetchDeleteRole(val.id)
}).catch(() => {})
},
handleAdd() {
this.dialogVisible = true
this.dialogType = 'add'
},
handleEnter() {
this.$refs.ruleForm.validate((valid) => {
if (valid) {
this.dialogType === 'add' ? this.fetchCreateRole() : this.fetchUpdateRole()
this.dialogVisible = false
}
})
}, },
handleAdd() {},
pageChange() { pageChange() {
this.fetchRoleList() this.fetchRoleList()
}, },
...@@ -89,6 +123,37 @@ export default { ...@@ -89,6 +123,37 @@ export default {
this.total = res.data.total this.total = res.data.total
} }
}) })
},
fetchCreateRole() {
createRole(this.form).then((res) => {
this.loading = false
if (res.code === 0 && res.data.id) {
this.$message.success('创建角色成功')
this.fetchRoleList()
operateLog({ type: '创建角色', user: this.user })
}
})
},
fetchUpdateRole() {
updateRole(this.form.id, this.form).then((res) => {
if (res.code === 0 && res.data.status) {
this.$message.success('更新角色成功')
this.fetchRoleList()
operateLog({ type: '更新角色', user: this.user })
}
})
},
fetchDeleteRole(id) {
deleteRole(id).then((res) => {
if (res.code === 0 && res.data.status === true) {
this.$message.success('删除角色成功')
this.fetchRoleList()
operateLog({ type: `删除角色,被删除角色id:${id}`, user: this.user })
this.deleteId = ''
} else {
this.$message.error(res.message || '删除角色失败')
}
})
} }
} }
} }
......
<template>
<div class="account">
<h5>账号管理 <el-button style="float:right;margin:12px 30px 0 0" size="mini" type="primary" plain @click="handleAdd" v-if="isSuperAdmin">新增账号</el-button></h5>
<div class="inner">
<div class="search-filter">
<div class="filter-item">
<label>姓名</label>
<el-input placeholder="请输入姓名" v-model="filter.username" size="mini" clearable></el-input>
</div>
<div class="filter-item">
<label>手机号</label>
<el-input placeholder="请输入手机号" v-model="filter.phone" size="mini" clearable></el-input>
</div>
<div class="filter-item" v-if="isCollapse">
<label>邮箱</label>
<el-input placeholder="请输入邮箱" v-model="filter.email" size="mini" clearable></el-input>
</div>
<div class="filter-item" v-if="isCollapse">
<label>用户ID</label>
<el-input placeholder="请输入用户ID" v-model="filter.userid" size="mini" clearable></el-input>
</div>
<div class="filter-item">
<el-button type="primary" icon="el-icon-search" size="mini" @click="fetchAccountList">查询</el-button>
<el-button icon="el-icon-refresh-left" size="mini" @click="reset">重置</el-button>
<el-button type="text" size="mini" @click="isCollapse = !isCollapse">{{isCollapse ? '收起':'展开'}}</el-button>
</div>
</div>
<div class="delete-bar">
<i class="el-icon-warning"></i> 已选择 <span class="num">{{selection.length || 0}}</span><el-button type="text" size="m" :disabled="!selection.length" @click="handleDelete('')" style="margin-left:15px;">删除</el-button>
</div>
<el-table :data="listData" style="width: 100%;flex:1;" v-loading="loading" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="45" />
<el-table-column prop="username" label="姓名" min-width="120" />
<el-table-column prop="phone" label="手机号码" min-width="80"/>
<el-table-column prop="email" label="邮箱" min-width="140"/>
<el-table-column prop="userid" label="用户ID" min-width="120"/>
<el-table-column label="用户类型" min-width="80">
<template slot-scope="{ row }">
<span v-if="row.type === 2">普通用户</span>
<span v-else>虚拟会议室</span>
</template>
</el-table-column>
<el-table-column label="操作" min-width="80" v-if="isSuperAdmin">
<template slot-scope="scope">
<el-button type="text" size="small" @click="handleEdit(scope.row)">编辑</el-button>
<el-button type="text" size="small" @click="handleDelete(scope.row.userid)">删除</el-button>
</template>
</el-table-column>
</el-table>
<div class="footer-bar">
<el-pagination :current-page.sync="curPage" :page-size.sync="pageSize" :page-sizes="[10, 20, 50, 100]" layout="total, prev, pager, next, sizes, jumper" :total="total" @current-change="pageChange" @size-change="pageChange" style="text-align:right;"></el-pagination>
</div>
</div>
<el-dialog :title="domicTitle" :visible.sync="dialogVisible" width="420px" center>
<el-form :model="form" :rules="rules" ref="ruleForm" label-width="70px" class="demo-ruleForm">
<el-form-item label="ID" prop="userid" v-if="dialogType === 'edit'">
<el-input v-model="form.userid" size="small" disabled></el-input>
</el-form-item>
<el-form-item label="ID" prop="userid" v-else>
<user-search v-model="form.userid" @select="handleSelect" :fetchApi="fetchApiSearch" :options="{ size: 'small' }"/>
</el-form-item>
<el-form-item label="名称" prop="username">
<el-input v-model="form.username" size="small"></el-input>
</el-form-item>
<el-form-item label="手机号" prop="phone">
<el-input v-model="form.phone" size="small"></el-input>
</el-form-item>
<el-form-item label="邮箱" prop="email">
<el-input v-model="form.email" size="small"></el-input>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button type="primary" @click="handleBtn" size="mini">确 定</el-button>
<el-button @click="dialogVisible = false" size="mini">取 消</el-button>
</span>
</el-dialog>
</div>
</template>
<script>
import UserSearch from '@/components/UserSearch/index'
import { searchUserList, operateLog } from '@api/common'
import { createTxAccount, getTxAccountList, updateTxAccount, deleteTxAccount } from '@api/tencent'
import { mapGetters } from 'vuex'
import _ from 'lodash'
export default {
components: { UserSearch },
data () {
const phoneReg = /^1(3[0-9]|4[01456879]|5[0-35-9]|6[2567]|7[0-8]|8[0-9]|9[0-35-9])\d{8}$/
const checkMobile = (rule, value, callback) => {
if (value) {
if (!phoneReg.test(value)) {
callback(new Error('手机号格式错误'));
} else {
callback()
}
}
}
const emailReg = /^[A-Za-z0-9]+([_.\\-][A-Za-z0-9]+)*@([A-Za-z0-9-]+\.)+[A-Za-z]{2,6}$/
const checkEmail = (rule, value, callback) => {
if (value) {
if (!emailReg.test(value)) {
callback(new Error('邮箱格式错误'));
} else {
callback()
}
}
}
return {
filter: {
username: '',
phone: '',
email: '',
userid: ''
},
isCollapse: false,
listData: [],
curPage: 1,
pageSize: 20,
total: 0,
selection: [],
dialogVisible: false,
dialogType: 'add',
form: {
userid: '',
username: '',
phone: '',
email: ''
},
rules: {
userid: [{ required: true, message: '请选择ID', trigger: 'change' }],
username: [{ required: true, message: '请输入名称', trigger: 'blur' }],
phone: [
{ required: true, message: '请输入手机号', trigger: 'blur' },
{ validator: checkMobile, trigger: 'blur' }
],
email: [
{ required: true, message: '请输入邮箱', trigger: 'blur' },
{ validator: checkEmail, trigger: 'blur' }
]
},
loading: false,
fetchApiSearch: searchUserList
}
},
computed: {
...mapGetters(['isSuperAdmin', 'user']),
domicTitle() {
let title = '新增'
switch (this.dialogType) {
case 'edit':
title = '编辑'
break
}
return title + '账号'
}
},
created() {
this.fetchAccountList()
},
methods: {
handleSelectionChange(val) {
this.selection = val
},
handleSelect(val) {
this.form.username = val.username
this.form.email = val.email
this.form.phone = val.mobile
},
reset() {
Object.keys(this.filter).map(key => { this.filter[key] = '' })
this.fetchAccountList()
},
handleEdit(data) {
this.form = _.cloneDeep(data)
this.dialogType = 'edit'
this.dialogVisible = true
},
handleAdd() {
for (const key in this.form) {
this.form[key] = ''
}
this.dialogType = 'add'
this.dialogVisible = true
},
handleDelete(id) {
const ids = id ? [id] : this.selection.map(item => item.userid)
this.$confirm('此操作将删除所选中项的数据, 是否继续执行?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消'
}).then(() => {
this.fetchDeleteAccount(ids)
}).catch(() => {});
},
pageChange() {
this.fetchAccountList()
},
handleBtn() {
this.$refs.ruleForm.validate((valid) => {
if (valid) {
this.dialogType === 'add' ? this.fetchCreateAccount() : this.fetchUpdateAccount()
this.dialogVisible = false
}
});
},
fetchAccountList() {
const params = {
page: this.curPage,
limit: this.pageSize,
username: this.filter.username,
phone: this.filter.phone
}
if (this.isCollapse) {
params.email = this.filter.email
params.userid = this.filter.userid
}
Object.keys(params).forEach(key => {
if (params[key] === '') delete params[key]
})
this.loading = true
getTxAccountList(params).then((res) => {
this.loading = false
if (res.code === 0 && res.data.data) {
this.listData = res.data.data
this.total = res.data.total
}
})
},
fetchCreateAccount() {
const form = this.form
const params = {
userid: form.userid,
username: form.username,
phone: form.phone,
email: form.email
}
createTxAccount(params).then((res) => {
if (res.code === 0 && res.data.id) {
this.$message.success('创建账户成功')
this.fetchAccountList()
operateLog({ type: `创建腾讯账号,被创建账户userid:${form.userid}`, user: this.user })
} else {
this.$message.error(res.message || '创建账户失败')
}
})
},
fetchUpdateAccount() {
const { userid, username, phone, email } = this.form
const params = {
username,
phone,
email
}
updateTxAccount(userid, params).then((res) => {
if (res.code === 0 && res.data.status === true) {
this.$message.success('更新账户成功')
this.fetchAccountList()
operateLog({ type: `更新腾讯账号,被更新账户userid:${userid}`, user: this.user })
} else {
this.$message.error(res.message || '更新账户失败')
}
})
},
fetchDeleteAccount(userids) {
deleteTxAccount({ userids }).then((res) => {
if (res.code === 0 && res.data.status === true) {
this.$message.success('删除账户成功')
this.fetchAccountList()
operateLog({ type: `删除腾讯账号,被删除账户userid:${userids.join(',')}`, user: this.user })
this.deleteId = ''
} else {
this.$message.error(res.message || '删除账户失败')
}
})
}
}
}
</script>
<style scoped>
.account{
height:100%;
}
h5{
font-size: 16px;
font-family: PingFangSC-Regular, PingFang SC;
color:#333;
font-weight: 500;
line-height:50px;
text-indent:20px;
}
.inner{
height: calc(100% - 50px - 15px);
background: #FFFFFF;
border-radius: 10px;
margin:0 16px;
box-sizing:border-box;
padding:14px 14px 6px;
display:flex;
flex-direction:column;
}
.search-filter{
display:flex;
flex-wrap: wrap;
padding:10px;
}
.search-filter .filter-item{
width:33.33%;
margin-bottom:15px;
}
.search-filter label{
display:inline-block;
width:60px;
text-align:right;
padding-right:10px;
}
.search-filter ::v-deep.el-input{
width: calc(100% - 120px);
}
.search-keywords-checked{
color: #F56C6C;
font-size: 12px;
line-height: 1;
padding-top: 4px;
position: absolute;
top: 100%;
right: 0;
}
.footer-bar{
padding:8px 0 4px;
}
.delete-bar{
padding:0 20px;
background: #ecf5ff;
border: #b3d8ff 1px solid;
border-radius:4px;
margin-bottom:15px;
}
.delete-bar i, .delete-bar .num{
color:#409EFF;
}
.account ::v-deep.el-dialog__header{
padding-top:14px;
}
.account ::v-deep.el-dialog__headerbtn{
top:12px;
right:12px;
}
.account ::v-deep.el-dialog__body{
padding:10px 20px
}
.account ::v-deep.el-dialog__footer{
padding-bottom:16px;
}
</style>
\ No newline at end of file
...@@ -81,6 +81,21 @@ export default [ ...@@ -81,6 +81,21 @@ export default [
} }
] ]
}, },
{
path: '/tencent',
component: Layout,
redirect: '/tencent/account',
name: 'System',
meta: { title: '腾讯会议管理', icon: 'el-icon-setting' },
children: [
{
path: 'account',
name: 'Account',
component: () => import('@/pages/tencent/account/index'),
meta: { title: '账号管理', icon: 'el-icon-key' }
}
]
},
{ {
path: '/my', path: '/my',
component: Layout, component: Layout,
......
...@@ -33,19 +33,6 @@ const user = { ...@@ -33,19 +33,6 @@ const user = {
commit('setUser', response) commit('setUser', response)
}) })
}, },
setUserRoles({ commit }) {
getUserRoles().then(res => {
const roles = res.data.roles
let isSuperAdmin = false
if (roles && Array.isArray(roles)) {
roles.forEach(it => {
if (it.name === 'administrator') isSuperAdmin = true
})
commit('setRoles', roles)
commit('setSuperAdmin', isSuperAdmin)
}
})
},
// 退出登录 // 退出登录
logout({ commit }) { logout({ commit }) {
return logout().then(response => { return logout().then(response => {
......
...@@ -113,3 +113,6 @@ body { ...@@ -113,3 +113,6 @@ body {
font-family: 'PingFang SC', 'PingFangSC-Regular', 'Source Han Sans CN', -apple-system, 'Microsoft YaHei', 'Helvetica', 'Arial', Verdana, font-family: 'PingFang SC', 'PingFangSC-Regular', 'Source Han Sans CN', -apple-system, 'Microsoft YaHei', 'Helvetica', 'Arial', Verdana,
'Hiragino Sans GB', 'Wenquanyi Micro Hei', sans-serif; 'Hiragino Sans GB', 'Wenquanyi Micro Hei', sans-serif;
} }
.app-main .el-table th:first-child .cell{
padding-left:14px;
}
...@@ -33,7 +33,6 @@ export default class BeforeEnter { ...@@ -33,7 +33,6 @@ export default class BeforeEnter {
} }
next() next()
} }
store.dispatch('setUserRoles')
next() next()
} }
} }
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论