提交 0dbb9095 authored 作者: 王鹏飞's avatar 王鹏飞

chore: 新增会议管理员

上级 35439386
-----BEGIN RSA PRIVATE KEY----- -----BEGIN RSA PRIVATE KEY-----
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
-----END RSA PRIVATE KEY----- -----END RSA PRIVATE KEY-----
差异被折叠。
...@@ -100,3 +100,17 @@ export function getMeetingCount(params) { ...@@ -100,3 +100,17 @@ export function getMeetingCount(params) {
export function getMeetingRecords(params) { export function getMeetingRecords(params) {
return httpRequest.get(`/api/live/admin/v3/tencent/meeting/${params.meeting_id}/records`, { params }) return httpRequest.get(`/api/live/admin/v3/tencent/meeting/${params.meeting_id}/records`, { params })
} }
/**
* 获取会议管理员列表
*/
export function getMeetingManagers(params) {
return httpRequest.get(`/api/live/admin/v3/tencent/meeting/${params.meeting_id}/managers`, { params })
}
/**
* 保存会议管理员列表
*/
export function saveMeetingManagers(data) {
return httpRequest.put(`/api/live/admin/v3/tencent/meeting/${data.meeting_id}/save-managers`, data)
}
<template>
<el-dialog title="会议管理员" v-bind="$attrs" v-on="$listeners" width="400px">
<user-search v-model="ssoIds" :defaultList="userList" :options="{ size: 'small', multiple: true, clearable: true }" />
<template #footer>
<el-button type="primary" @click="save">保存</el-button>
</template>
</el-dialog>
</template>
<script>
import UserSearch from '@/components/UserSearch/index'
import { getMeetingManagers, saveMeetingManagers } from '@/api/common'
export default {
props: { data: Object },
components: { UserSearch },
data() {
return {
ssoIds: [],
userList: []
}
},
methods: {
async fetchList() {
const res = await getMeetingManagers({ meeting_id: this.data.meeting_id })
this.userList = res.data.items
this.ssoIds = res.data.items.map(item => item.id)
},
async save() {
await saveMeetingManagers({ meeting_id: this.data.meeting_id, sso_ids: this.ssoIds })
this.$message.success('保存成功')
this.$emit('update:visible', false)
}
},
mounted() {
this.fetchList()
}
}
</script>
...@@ -15,15 +15,9 @@ ...@@ -15,15 +15,9 @@
<el-button type="text" size="small" v-else @click="handleDetails">查看</el-button> <el-button type="text" size="small" v-else @click="handleDetails">查看</el-button>
</template> </template>
<template v-if="status === 2"> <template v-if="status === 2">
<el-button type="text" size="small" v-if="operatable && hasJoin && isFuture" @click="handleJoin" <el-button type="text" size="small" v-if="operatable && hasJoin && isFuture" @click="handleJoin">进入会议</el-button>
>进入会议</el-button <el-button type="text" size="small" v-if="operatable && hasUpdate && isFuture" @click="handleUpdate">更新</el-button>
> <el-button type="text" size="small" v-if="(operatable && hasDownload) || hasManage" @click="handleRecord">下载回放</el-button>
<el-button type="text" size="small" v-if="operatable && hasUpdate && isFuture" @click="handleUpdate"
>更新</el-button
>
<el-button type="text" size="small" v-if="(operatable && hasDownload) || hasManage" @click="handleRecord"
>下载回放</el-button
>
<el-button type="text" size="small" v-if="operatable && hasDelete" @click="handleDelete">删除</el-button> <el-button type="text" size="small" v-if="operatable && hasDelete" @click="handleDelete">删除</el-button>
<el-button type="text" size="small" @click="handleDetails">查看</el-button> <el-button type="text" size="small" @click="handleDetails">查看</el-button>
</template> </template>
...@@ -31,17 +25,14 @@ ...@@ -31,17 +25,14 @@
<el-button type="text" size="small" @click="handleDetails">查看</el-button> <el-button type="text" size="small" @click="handleDetails">查看</el-button>
<!-- <el-button type="text" size="small" v-if="operatable" @click="handleDelete">删除</el-button> --> <!-- <el-button type="text" size="small" v-if="operatable" @click="handleDelete">删除</el-button> -->
</template> </template>
<el-button type="text" size="small" v-if="operatable" @click="managerVisible = true">会议管理员</el-button>
<el-dialog :title="domicTitle" :visible.sync="dialogVisible" width="520px" center class="my-dialog"> <el-dialog :title="domicTitle" :visible.sync="dialogVisible" width="520px" center class="my-dialog">
<div slot="title" class="dialog-header"> <div slot="title" class="dialog-header">
<p class="meeting-status" v-show="dialogType === 'details'">会议{{ rowData.status | statusFilter }}</p> <p class="meeting-status" v-show="dialogType === 'details'">会议{{ rowData.status | statusFilter }}</p>
<p class="title">{{ domicTitle }}</p> <p class="title">{{ domicTitle }}</p>
</div> </div>
<dialog-details <dialog-details :rowData="rowData" :details="details" v-show="dialogType === 'details'" :operatable="operatable" />
:rowData="rowData"
:details="details"
v-show="dialogType === 'details'"
:operatable="operatable"
/>
<dialog-copy-invite :rowData="rowData" :details="details" v-show="dialogType === 'copy'" /> <dialog-copy-invite :rowData="rowData" :details="details" v-show="dialogType === 'copy'" />
<div slot="footer" class="dialog-footer"> <div slot="footer" class="dialog-footer">
<el-button type="primary" size="mini" v-show="dialogType === 'copy'" @click="copyLink">复制</el-button> <el-button type="primary" size="mini" v-show="dialogType === 'copy'" @click="copyLink">复制</el-button>
...@@ -50,17 +41,20 @@ ...@@ -50,17 +41,20 @@
</el-dialog> </el-dialog>
<!-- 下载 --> <!-- 下载 -->
<DownloadVideo :data="rowData" :visible.sync="downloadVisible" v-if="downloadVisible"></DownloadVideo> <DownloadVideo :data="rowData" :visible.sync="downloadVisible" v-if="downloadVisible"></DownloadVideo>
<!-- 会议管理员 -->
<Manager :data="rowData" :visible.sync="managerVisible" v-if="managerVisible"></Manager>
</div> </div>
</template> </template>
<script> <script>
import DialogDetails from './DialogDetails.vue' import DialogDetails from './DialogDetails.vue'
import DialogCopyInvite from './DialogCopyInvite' import DialogCopyInvite from './DialogCopyInvite'
import DownloadVideo from './DownloadVideo' import DownloadVideo from './DownloadVideo'
import Manager from './Manager'
import { mapGetters } from 'vuex' import { mapGetters } from 'vuex'
import { getMeetingDetails, stopMeeting, cancelMeeting, getMeetingRecordAddr } from '@api/common' import { getMeetingDetails, stopMeeting, cancelMeeting, getMeetingRecordAddr } from '@api/common'
import { timeTrans } from '@/utils/dateAlgs' import { timeTrans } from '@/utils/dateAlgs'
export default { export default {
components: { DialogDetails, DialogCopyInvite, DownloadVideo }, components: { DialogDetails, DialogCopyInvite, DownloadVideo, Manager },
props: { props: {
rowData: {} rowData: {}
}, },
...@@ -69,7 +63,8 @@ export default { ...@@ -69,7 +63,8 @@ export default {
dialogVisible: false, dialogVisible: false,
dialogType: 'copy', dialogType: 'copy',
details: '', details: '',
downloadVisible: false downloadVisible: false,
managerVisible: false
} }
}, },
computed: { computed: {
...@@ -184,7 +179,10 @@ export default { ...@@ -184,7 +179,10 @@ export default {
handleUpdate() { handleUpdate() {
this.$router.push({ this.$router.push({
path: '/meeting-update', path: '/meeting-update',
query: { meeting_id: this.rowData.meeting_id, sub_meeting_id: this.rowData.sub_meeting_id } query: {
meeting_id: this.rowData.meeting_id,
sub_meeting_id: this.rowData.sub_meeting_id
}
}) })
}, },
handleCancel() { handleCancel() {
......
<template> <template>
<el-select v-model="userId" v-bind="options" placeholder="输入邮箱/手机号码搜索" filterable remote :remote-method="fetchUserList" :loading="searchUsersloading" @change="handleChange"> <el-select
<el-option :label="user.real_name || user.nickname " :value="user.id" v-for="user in userList" :key="user.id" > 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"> <span style="float: left">
{{ user.real_name || user.nickname }} {{ user.real_name || user.nickname }}
<template v-if="user.mobile">(手机号:{{user.mobile}})</template> <template v-if="user.mobile">(手机号:{{ user.mobile }})</template>
</span> </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-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>
...@@ -11,6 +20,7 @@ ...@@ -11,6 +20,7 @@
</el-select> </el-select>
</template> </template>
<script> <script>
import { searchUserList } from '@api/common'
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 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-.]+$/ const EMAIL_REG = /^[A-Za-z0-9]+([_.\\-][A-Za-z0-9]+)*@[A-Za-z0-9-.]+$/
export default { export default {
...@@ -26,7 +36,7 @@ export default { ...@@ -26,7 +36,7 @@ export default {
}, },
fetchApi: { fetchApi: {
type: Function, type: Function,
require: true default: searchUserList
}, },
options: { options: {
type: Object, type: Object,
...@@ -44,14 +54,14 @@ export default { ...@@ -44,14 +54,14 @@ export default {
}, },
watch: { watch: {
value: { value: {
handler: function (nv) { handler: function(nv) {
this.userId = nv this.userId = nv
}, },
immediate: true, immediate: true,
deep: true deep: true
}, },
defaultList: { defaultList: {
handler: function (nv) { handler: function(nv) {
this.userList = nv this.userList = nv
}, },
immediate: true, immediate: true,
...@@ -91,7 +101,7 @@ export default { ...@@ -91,7 +101,7 @@ export default {
} }
</script> </script>
<style scoped> <style scoped>
.el-select{ .el-select {
width:100%; width: 100%;
} }
</style> </style>
\ No newline at end of file
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论