完善会议功能

This commit is contained in:
kuaifan 2022-06-01 17:10:10 +08:00
parent bf59fae173
commit 357f0e4df4
8 changed files with 196 additions and 24 deletions

View File

@ -153,6 +153,49 @@ class SystemController extends AbstractController
return Base::retSuccess('success', $setting ?: json_decode('{}'));
}
/**
* @api {get} api/system/setting/meeting 03. 获取会议设置、保存会议设置(限管理员)
*
* @apiVersion 1.0.0
* @apiGroup system
* @apiName setting__meeting
*
* @apiParam {String} type
* - get: 获取(默认)
* - save: 保存设置(参数:['open', 'appid', 'app_certificate']
* @apiSuccess {Number} ret 返回状态码1正确、0错误
* @apiSuccess {String} msg 返回信息(错误描述)
* @apiSuccess {Object} data 返回数据
*/
public function setting__meeting()
{
User::auth('admin');
//
$type = trim(Request::input('type'));
if ($type == 'save') {
if (env("SYSTEM_SETTING") == 'disabled') {
return Base::retError('当前环境禁止修改');
}
$all = Request::input();
foreach ($all as $key => $value) {
if (!in_array($key, [
'open',
'appid',
'app_certificate',
])) {
unset($all[$key]);
}
}
$setting = Base::setting('meetingSetting', Base::newTrim($all));
} else {
$setting = Base::setting('meetingSetting');
}
//
$setting['open'] = $setting['open'] ?: 'close';
//
return Base::retSuccess('success', $setting ?: json_decode('{}'));
}
/**
* @api {get} api/system/setting/apppush 03. 获取APP推送设置、保存APP推送设置限管理员
*

View File

@ -773,9 +773,12 @@ class UsersController extends AbstractController
* @apiGroup users
* @apiName meeting__open
*
* @apiParam {String} [meetingid] 会议ID不是数字留空自动创建
* @apiParam {String} [name] 会话ID
* @apiParam {Array} [userids] 邀请成员
* @apiParam {String} type 类型
* - create: 创建会议有效参数name、userids
* - join: 加入会议有效参数meetingid (必填)
* @apiParam {String} [meetingid] 频道ID不是数字
* @apiParam {String} [name] 会话ID
* @apiParam {Array} [userids] 邀请成员
*
* @apiSuccess {Number} ret 返回状态码1正确、0错误
* @apiSuccess {String} msg 返回信息(错误描述)
@ -785,17 +788,18 @@ class UsersController extends AbstractController
{
$user = User::auth();
//
$type = trim(Request::input('type'));
$meetingid = trim(Request::input('meetingid'));
$name = trim(Request::input('name'));
$userids = Request::input('userids');
$isCreate = false;
//
if ($meetingid) {
if ($type === 'join') {
$meeting = Meeting::whereMeetingid($meetingid)->first();
if (empty($meeting)) {
return Base::retError('会议不存在');
return Base::retError('频道ID不存在');
}
} else {
} elseif ($type === 'create') {
$meetingid = strtoupper(Base::generatePassword());
$name = $name ?: "{$user->nickname} 发起的会议";
$channel = "DooTask:" . substr(md5($meetingid . env("APP_KEY")), 16);
@ -807,14 +811,20 @@ class UsersController extends AbstractController
]);
$meeting->save();
$isCreate = true;
} else {
return Base::retError('参数错误');
}
// 创建令牌
$appid = '342c604542484b0d9659527f79aefcdb';
$app_certificate = '920eb911c1f549948366e44d6dcabcbe';
$channel = $meeting->channel;
$meetingSetting = Base::setting('meetingSetting');
if ($meetingSetting['open'] !== 'open') {
return Base::retError('会议功能未开启,请联系管理员开启');
}
if (empty($meetingSetting['appid']) || empty($meetingSetting['app_certificate'])) {
return Base::retError('会议功能配置错误,请联系管理员');
}
$uid = $user->userid . '_' . Request::header('fd');
try {
$service = new AgoraTokenGenerator($appid, $app_certificate, $channel, $uid);
$service = new AgoraTokenGenerator($meetingSetting['appid'], $meetingSetting['app_certificate'], $meeting->channel, $uid);
} catch (\Exception $e) {
return Base::retError($e->getMessage());
}
@ -840,7 +850,7 @@ class UsersController extends AbstractController
}
//
$data = $meeting->toArray();
$data['appid'] = $appid;
$data['appid'] = $meetingSetting['appid'];
$data['uid'] = $uid;
$data['token'] = $token;
$data['msgs'] = $msgs;

View File

@ -214,12 +214,14 @@
</div>
<ButtonGroup class="manage-box-new-group">
<Button class="manage-box-new" type="primary" icon="md-add" @click="onAddShow">{{$L('新建项目')}}</Button>
<Dropdown @on-click="onAddTask(0)">
<Dropdown @on-click="onAddMenu" trigger="click">
<Button type="primary">
<Icon type="ios-arrow-down"></Icon>
</Button>
<DropdownMenu slot="list">
<DropdownItem>{{$L('新建任务')}} ({{mateName}}+K)</DropdownItem>
<DropdownItem name="task">{{$L('新建任务')}} ({{mateName}}+K)</DropdownItem>
<DropdownItem name="createMeeting">{{$L('新会议')}} ({{mateName}}+J)</DropdownItem>
<DropdownItem name="joinMeeting">{{$L('加入会议')}}</DropdownItem>
</DropdownMenu>
</Dropdown>
</ButtonGroup>
@ -815,6 +817,27 @@ export default {
};
},
onAddMenu(name) {
switch (name) {
case 'task':
this.onAddTask(0)
break;
case 'createMeeting':
Store.set('addMeeting', {
type: 'create',
userids: [this.userId],
});
break;
case 'joinMeeting':
Store.set('addMeeting', {
type: 'join',
});
break;
}
},
onAddShow() {
this.$store.dispatch("getColumnTemplate").catch(() => {})
this.addShow = true;
@ -866,9 +889,12 @@ export default {
shortcutEvent(e) {
if (e.metaKey || e.ctrlKey) {
if (e.keyCode === 75 || e.keyCode === 78) {
if (e.keyCode === 74) {
e.preventDefault();
this.onAddTask(0)
this.onAddMenu('createMeeting')
} else if (e.keyCode === 75 || e.keyCode === 78) {
e.preventDefault();
this.onAddMenu('task')
} else if (e.keyCode === 83 && this.taskId > 0) {
e.preventDefault();
this.$refs.taskDetail.checkUpdate(true)

View File

@ -788,6 +788,7 @@ export default {
case 'meeting':
Store.set('addMeeting', {
type: 'create',
dialog_id: this.dialogId,
userids: [this.userId],
});

View File

@ -332,7 +332,11 @@ export default {
},
openMeeting() {
Store.set('addMeeting', this.msgData.msg);
Store.set('addMeeting', {
type: 'join',
name: this.msgData.msg.name,
meetingid: this.msgData.msg.meetingid,
});
},
withdraw() {

View File

@ -2,16 +2,16 @@
<div v-show="false">
<Modal
v-model="addShow"
:title="$L(addData.meetingid ? '加入会议' : '新会议')"
:title="$L(addData.type === 'join' ? '加入会议' : '新会议')"
:mask-closable="false">
<Form ref="addForm" :model="addData" label-width="auto" @submit.native.prevent>
<template v-if="addData.meetingid">
<template v-if="addData.type === 'join'">
<!-- 加入会议 -->
<FormItem prop="userids" :label="$L('会议主题')">
<FormItem v-if="addData.name" prop="userids" :label="$L('会议主题')">
<Input v-model="addData.name" disabled/>
</FormItem>
<FormItem prop="meetingid" :label="$L('会议频道')">
<Input v-model="addData.meetingid" disabled/>
<FormItem prop="meetingid" :label="$L('会议频道ID')">
<Input v-model="addData.meetingid" :placeholder="$L('请输入会议频道ID')"/>
</FormItem>
</template>
<template v-else>
@ -36,7 +36,7 @@
</Form>
<div slot="footer" class="adaption">
<Button type="default" @click="addShow=false">{{$L('取消')}}</Button>
<Button type="primary" :loading="loadIng > 0" @click="onSubmit">{{$L(addData.meetingid ? '进入会议' : '开始会议')}}</Button>
<Button type="primary" :loading="loadIng > 0" @click="onSubmit">{{$L(addData.type === 'join' ? '进入会议' : '开始会议')}}</Button>
</div>
</Modal>
<Modal
@ -123,7 +123,7 @@ export default {
onAdd(data) {
data = $A.isJson(data) ? data : {};
//
if (!data.meetingid && /\d+/.test(data.dialog_id)) {
if (/\d+/.test(data.dialog_id)) {
this.loadIng++;
this.$store.dispatch("call", {
url: 'dialog/user',

View File

@ -0,0 +1,82 @@
<template>
<div class="setting-component-item">
<Form ref="formData" :model="formData" :rules="ruleData" label-width="auto" @submit.native.prevent>
<div class="block-setting-box">
<h3>{{ $L('AgoraIO') }}</h3>
<FormItem :label="$L('会议功能')" prop="open">
<RadioGroup v-model="formData.open">
<Radio label="open">{{ $L('开启') }}</Radio>
<Radio label="close">{{ $L('关闭') }}</Radio>
</RadioGroup>
</FormItem>
<template v-if="formData.open === 'open'">
<FormItem label="App ID " prop="appid">
<Input :maxlength="255" v-model="formData.appid"/>
</FormItem>
<FormItem label="App certificate" prop="app_certificate">
<Input :maxlength="255" v-model="formData.app_certificate" type="password"/>
</FormItem>
</template>
</div>
</Form>
<div class="setting-footer">
<Button :loading="loadIng > 0" type="primary" @click="submitForm">{{ $L('提交') }}</Button>
<Button :loading="loadIng > 0" @click="resetForm" style="margin-left: 8px">{{ $L('重置') }}</Button>
</div>
</div>
</template>
<script>
export default {
name: "SystemMeeting",
data() {
return {
loadIng: 0,
formData: {
open: '',
appid: '',
app_certificate: '',
},
ruleData: {},
}
},
mounted() {
this.systemSetting();
},
methods: {
submitForm() {
this.$refs.formData.validate((valid) => {
if (valid) {
this.systemSetting(true);
}
})
},
resetForm() {
this.formData = $A.cloneJSON(this.formDatum_bak);
},
systemSetting(save) {
this.loadIng++;
this.$store.dispatch("call", {
url: 'system/setting/meeting?type=' + (save ? 'save' : 'all'),
data: this.formData,
}).then(({data}) => {
if (save) {
$A.messageSuccess('修改成功');
}
this.formData = data;
this.formDatum_bak = $A.cloneJSON(this.formData);
}).catch(({msg}) => {
if (save) {
$A.modalError(msg);
}
}).finally(_ => {
this.loadIng--;
});
}
}
}
</script>

View File

@ -10,6 +10,9 @@
<TabPane :label="$L('项目模板')" name="columnTemplate">
<SystemColumnTemplate/>
</TabPane>
<TabPane :label="$L('会议功能')" name="meeting">
<SystemMeeting/>
</TabPane>
<TabPane :label="$L('邮件设置')" name="emailSetting">
<SystemEmailSetting/>
</TabPane>
@ -26,9 +29,12 @@ import SystemTaskPriority from "./components/SystemTaskPriority";
import SystemColumnTemplate from "./components/SystemColumnTemplate";
import SystemEmailSetting from "./components/SystemEmailSetting";
import SystemAppPush from "./components/SystemAppPush";
import SystemMeeting from "./components/SystemMeeting";
export default {
components: {SystemAppPush, SystemColumnTemplate, SystemTaskPriority, SystemSetting, SystemEmailSetting},
components: {
SystemMeeting,
SystemAppPush, SystemColumnTemplate, SystemTaskPriority, SystemSetting, SystemEmailSetting},
data() {
return {
tabAction: 'setting',