Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
C
center-live
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
EzijingWeb
center-live
Commits
0bbc187f
提交
0bbc187f
authored
4月 27, 2021
作者:
pengxiaohui
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
修改bug
上级
b8ed77c9
显示空白字符变更
内嵌
并排
正在显示
27 个修改的文件
包含
1921 行增加
和
1348 行删除
+1921
-1348
common.js
src/api/common.js
+1
-1
system.js
src/api/system.js
+1
-1
index.vue
src/components/MeetingSuccessDialog/index.vue
+51
-10
index.vue
src/components/Schedule/index.vue
+4
-1
DialogCopyInvite.vue
src/components/TableHandles/DialogCopyInvite.vue
+6
-0
DialogDetails.vue
src/components/TableHandles/DialogDetails.vue
+1
-2
index.vue
src/components/TableHandles/index.vue
+6
-4
header.vue
src/components/layout/header.vue
+1
-1
NewPopover.vue
src/pages/calendar/day/components/NewPopover.vue
+14
-16
index.vue
src/pages/calendar/index.vue
+11
-11
index.vue
src/pages/calendar/list/index.vue
+3
-3
index-old.vue
src/pages/meeting/index-old.vue
+3
-3
index.vue
src/pages/meeting/index.vue
+4
-3
index.vue
src/pages/meeting/tencent-meeting-old/index.vue
+899
-0
index.vue
src/pages/meeting/tencent-meeting-test/index.vue
+0
-34
page-account-create.vue
...ages/meeting/tencent-meeting-test/page-account-create.vue
+0
-13
page-create.vue
src/pages/meeting/tencent-meeting-test/page-create.vue
+0
-28
page-update.vue
src/pages/meeting/tencent-meeting-test/page-update.vue
+0
-46
MeetingForm.vue
src/pages/meeting/tencent-meeting/components/MeetingForm.vue
+296
-288
index.vue
src/pages/meeting/tencent-meeting/index.vue
+17
-866
meeting-account-create.vue
src/pages/meeting/tencent-meeting/meeting-account-create.vue
+272
-0
meeting-create.vue
src/pages/meeting/tencent-meeting/meeting-create.vue
+104
-0
meeting-update.vue
src/pages/meeting/tencent-meeting/meeting-update.vue
+178
-0
index.vue
src/pages/search/index.vue
+8
-5
index.vue
src/pages/system/account/index.vue
+8
-8
routes.js
src/router/routes.js
+28
-4
style.scss
src/style.scss
+5
-0
没有找到文件。
src/api/common.js
浏览文件 @
0bbc187f
...
@@ -3,7 +3,7 @@ import httpRequest from '@/utils/axios'
...
@@ -3,7 +3,7 @@ import httpRequest from '@/utils/axios'
* 操作日志
* 操作日志
*/
*/
export
function
operateLog
(
params
)
{
export
function
operateLog
(
params
)
{
const
logMsg
=
`操作人:
${
params
.
user
.
nickname
}
,操作
人id:
${
params
.
user
.
id
}
,操作
:
${
params
.
type
}
`
const
logMsg
=
`操作人:
${
params
.
user
.
nickname
}
,操作:
${
params
.
type
}
`
const
data
=
{
const
data
=
{
detail
:
logMsg
detail
:
logMsg
}
}
...
...
src/api/system.js
浏览文件 @
0bbc187f
...
@@ -3,7 +3,7 @@ import httpRequest from '@/utils/axios'
...
@@ -3,7 +3,7 @@ import httpRequest from '@/utils/axios'
* 操作日志
* 操作日志
*/
*/
export
function
operateLog
(
params
)
{
export
function
operateLog
(
params
)
{
const
logMsg
=
`操作人:
${
params
.
user
.
nickname
}
,操作
人id:
${
params
.
user
.
id
}
,操作
:
${
params
.
type
}
`
const
logMsg
=
`操作人:
${
params
.
user
.
nickname
}
,操作:
${
params
.
type
}
`
const
data
=
{
const
data
=
{
detail
:
logMsg
detail
:
logMsg
}
}
...
...
src/components/MeetingSuccessDialog/index.vue
浏览文件 @
0bbc187f
<
template
>
<
template
>
<el-dialog
:title=
"`会议号$
{details.meeting_code ? ':' + details.meeting_code : ''}`" :visible="dialogVisible" width="520" :close-on-click-modal="false" append-to-body center @close="dialogClose">
<el-dialog
class=
"meeting-success-dialog"
:title=
"`会议号$
{details.meeting_code ? ':' + details.meeting_code : ''}`" :visible="dialogVisible" width="520" :close-on-click-modal="false" center @close="dialogClose">
<el-form
class=
"dialog-meeting-details"
label-width=
"90px"
ref=
"details"
>
<p
style=
"padding-left:28px;margin-bottom:10px;"
v-if=
"details.sso_user"
>
{{
details
.
sso_user
.
username
}}
邀请您参加腾讯会议
</p>
<el-form
class=
"dialog-meeting-details"
label-width=
"100px"
ref=
"details"
>
<el-form-item
label=
"会议主题:"
>
<el-form-item
label=
"会议主题:"
>
{{
details
.
subject
}}
{{
details
.
subject
}}
</el-form-item>
</el-form-item>
<el-form-item
label=
"会议时间:"
>
<el-form-item
label=
"会议时间:"
>
{{
details
.
start_time
|
timeFormat
(
'{y
}
-{m
}
-{d
}
{h
}
:{i
}
'
)
}}
-
{{
details
.
end_time
|
timeFormat
(
'{h
}
:{i
}
'
)
}}
(
GMT
+
08
:
00
)
{{
details
.
start_time
|
timeFormat
(
'{y
}
-{m
}
-{d
}
{h
}
:{i
}
'
)
}}
-
{{
details
.
end_time
|
timeFormat
(
'{h
}
:{i
}
'
)
}}
(
GMT
+
08
:
00
)
中国标准时间
-
北京
<
template
v
-
if
=
"details.meeting_type === 1"
>
,
{{
details
.
recurring_rule
.
recurring_type
|
recurringTypeFilter
}}
<
template
v
-
if
=
"details.recurring_rule.recurring_type > 1"
>
{{
recurringDateShow
}}
<
/template
>
<
/template
>
<
/el-form-item
>
<
/el-form-item
>
<
el
-
form
-
item
label
=
"会议链接:"
>
<
el
-
form
-
item
label
=
"会议链接:"
>
{{
details
.
join_url
}}
{{
details
.
join_url
}}
...
@@ -13,9 +18,15 @@
...
@@ -13,9 +18,15 @@
<
el
-
form
-
item
label
=
"会议号:"
>
<
el
-
form
-
item
label
=
"会议号:"
>
{{
details
.
meeting_code
}}
{{
details
.
meeting_code
}}
<
/el-form-item
>
<
/el-form-item
>
<
el
-
form
-
item
label
=
"会议密码:"
v
-
if
=
"details.password"
>
{{
details
.
password
}}
<
/el-form-item
>
<
el
-
form
-
item
label
=
"会议直播:"
v
-
if
=
"details.enable_live === 1"
>
<
el
-
form
-
item
label
=
"会议直播:"
v
-
if
=
"details.enable_live === 1"
>
{{
details
.
live_config
.
live_addr
}}
{{
details
.
live_config
.
live_addr
}}
<
/el-form-item
>
<
/el-form-item
>
<
el
-
form
-
item
label
=
"会议直播密码:"
v
-
if
=
"details.enable_live === 1 && details.live_config.live_password"
>
{{
details
.
live_config
.
live_password
}}
<
/el-form-item
>
<
/el-form
>
<
/el-form
>
<
span
slot
=
"footer"
class
=
"dialog-footer"
>
<
span
slot
=
"footer"
class
=
"dialog-footer"
>
<
el
-
button
size
=
"mini"
@
click
=
"copyText"
>
复制文字
<
/el-button
>
<
el
-
button
size
=
"mini"
@
click
=
"copyText"
>
复制文字
<
/el-button
>
...
@@ -38,10 +49,40 @@ export default {
...
@@ -38,10 +49,40 @@ export default {
default
:
false
default
:
false
}
}
}
,
}
,
computed
:
{
recurringDateShow
()
{
if
(
this
.
details
.
recurring_rule
.
recurring_type
===
4
)
{
return
dateFormat
(
this
.
details
.
start_time
,
'({d
}
日)'
)
}
else
{
return
dateFormat
(
this
.
details
.
start_time
,
'(周{a
}
)'
)
}
}
}
,
filters
:
{
filters
:
{
timeFormat
(
val
,
fmt
)
{
timeFormat
(
val
,
fmt
)
{
fmt
=
fmt
||
'{y
}
年{m
}
月{d
}
日'
fmt
=
fmt
||
'{y
}
年{m
}
月{d
}
日'
return
dateFormat
(
val
,
fmt
)
return
dateFormat
(
val
,
fmt
)
}
,
recurringTypeFilter
(
val
)
{
let
result
=
''
switch
(
val
)
{
case
0
:
result
=
'每天'
break
case
1
:
result
=
'每个工作日'
break
case
2
:
result
=
'每周'
break
case
3
:
result
=
'每两周'
break
case
4
:
result
=
'每月'
break
}
return
result
}
}
}
,
}
,
methods
:
{
methods
:
{
...
@@ -78,22 +119,21 @@ export default {
...
@@ -78,22 +119,21 @@ export default {
}
}
<
/script
>
<
/script
>
<
style
scoped
>
<
style
scoped
>
::
v
-
deep
.
el
-
dialog__header
{
.
meeting
-
success
-
dialog
::
v
-
deep
.
el
-
dialog__header
{
padding
-
top
:
14
px
;
padding
-
top
:
14
px
;
}
}
::
v
-
deep
.
el
-
dialog__headerbtn
{
.
meeting
-
success
-
dialog
::
v
-
deep
.
el
-
dialog__headerbtn
{
top
:
12
px
;
top
:
12
px
;
right
:
12
px
;
right
:
12
px
;
}
}
::
v
-
deep
.
el
-
dialog__body
{
.
meeting
-
success
-
dialog
::
v
-
deep
.
el
-
dialog__body
{
padding
:
10
px
0
;
padding
:
10
px
0
;
margin
:
0
20
px
;
margin
:
0
20
px
;
border
:
1
px
solid
#
DBDBDB
;
}
}
::
v
-
deep
.
el
-
dialog__footer
{
.
meeting
-
success
-
dialog
::
v
-
deep
.
el
-
dialog__footer
{
padding
-
bottom
:
16
px
;
padding
-
bottom
:
16
px
;
}
}
::
v
-
deep
.
el
-
dialog
.
el
-
form
-
item
{
.
meeting
-
success
-
dialog
::
v
-
deep
.
el
-
dialog
.
el
-
form
-
item
{
margin
:
0
;
margin
-
bottom
:
10
px
;
}
}
<
/style>
<
/style>
\ No newline at end of file
src/components/Schedule/index.vue
浏览文件 @
0bbc187f
...
@@ -369,10 +369,13 @@ export default {
...
@@ -369,10 +369,13 @@ export default {
}
}
.time-now
span
{
.time-now
span
{
color
:
#FD1E1E
;
color
:
#FD1E1E
;
background-color
:
#fff
;
padding
:
5px
0
;
}
}
.time-now
::v-deep
.el-divider
{
.time-now
::v-deep
.el-divider
{
background-color
:
#FD0000
;
background-color
:
#FD0000
;
margin
:
0
margin
:
0
;
width
:
calc
(
100%
+
2px
);
}
}
.newPopoverBtn
{
.newPopoverBtn
{
position
:
fixed
;
position
:
fixed
;
...
...
src/components/TableHandles/DialogCopyInvite.vue
浏览文件 @
0bbc187f
...
@@ -12,9 +12,15 @@
...
@@ -12,9 +12,15 @@
<
el
-
form
-
item
label
=
"会议号:"
>
<
el
-
form
-
item
label
=
"会议号:"
>
{{
details
.
meeting_code
}}
{{
details
.
meeting_code
}}
<
/el-form-item
>
<
/el-form-item
>
<
el
-
form
-
item
label
=
"会议密码:"
v
-
if
=
"details.password"
>
{{
details
.
password
}}
<
/el-form-item
>
<
el
-
form
-
item
label
=
"会议直播:"
v
-
if
=
"details.enable_live === 1"
>
<
el
-
form
-
item
label
=
"会议直播:"
v
-
if
=
"details.enable_live === 1"
>
{{
details
.
live_config
.
live_addr
}}
{{
details
.
live_config
.
live_addr
}}
<
/el-form-item
>
<
/el-form-item
>
<
el
-
form
-
item
label
=
"会议直播密码:"
v
-
if
=
"details.enable_live === 1 && details.live_config.live_password"
>
{{
details
.
live_config
.
live_password
}}
<
/el-form-item
>
<
el
-
form
-
item
label
=
"手机拨号入会:"
v
-
if
=
"false"
>
<
el
-
form
-
item
label
=
"手机拨号入会:"
v
-
if
=
"false"
>
<
p
>+
8675536550000
,,
526430840
#
(
中国大陆)
<
/p
>
<
p
>+
8675536550000
,,
526430840
#
(
中国大陆)
<
/p
>
<
p
>+
85230018898
,,
526430840
#
(
中国香港)
<
/p
>
<
p
>+
85230018898
,,
526430840
#
(
中国香港)
<
/p
>
...
...
src/components/TableHandles/DialogDetails.vue
浏览文件 @
0bbc187f
...
@@ -85,7 +85,6 @@ export default {
...
@@ -85,7 +85,6 @@ export default {
if
(
list
&&
Array
.
isArray
(
list
))
{
if
(
list
&&
Array
.
isArray
(
list
))
{
list
.
forEach
((
it
,
index
)
=>
{
list
.
forEach
((
it
,
index
)
=>
{
if
(
it
.
download_address
)
{
if
(
it
.
download_address
)
{
console
.
log
(
it
.
download_address
)
// window.open(it.download_address, '_blank')
// window.open(it.download_address, '_blank')
setTimeout
(()
=>
{
setTimeout
(()
=>
{
this
.
funDownload
(
it
.
download_address
,
it
.
download_address
)
this
.
funDownload
(
it
.
download_address
,
it
.
download_address
)
...
@@ -95,7 +94,7 @@ export default {
...
@@ -95,7 +94,7 @@ export default {
}
}
}
,
}
,
funDownload
(
fileUrl
,
fileName
)
{
funDownload
(
fileUrl
,
fileName
)
{
console
.
log
(
fileUrl
)
//
console.log(fileUrl)
const
elink
=
document
.
createElement
(
'a'
)
// 创建一个a标签
const
elink
=
document
.
createElement
(
'a'
)
// 创建一个a标签
elink
.
download
=
fileName
;
// 设置a标签的下载属性
elink
.
download
=
fileName
;
// 设置a标签的下载属性
elink
.
style
.
display
=
'none'
;
// 将a标签设置为隐藏
elink
.
style
.
display
=
'none'
;
// 将a标签设置为隐藏
...
...
src/components/TableHandles/index.vue
浏览文件 @
0bbc187f
...
@@ -133,10 +133,10 @@ export default {
...
@@ -133,10 +133,10 @@ export default {
this
.
fetchMeetingDetails
()
this
.
fetchMeetingDetails
()
},
},
handleLive
()
{
handleLive
()
{
window
.
open
(
this
.
live_config
.
live_addr
,
'_blank'
);
window
.
open
(
this
.
rowData
.
live_config
.
live_addr
,
'_blank'
);
},
},
handleUpdate
()
{
handleUpdate
()
{
this
.
$router
.
push
({
path
:
'/meeting
'
,
query
:
{
type
:
'2'
,
meeting_id
:
this
.
rowData
.
meeting_id
,
sub_meeting_id
:
this
.
rowData
.
sub_meeting_id
}
})
this
.
$router
.
push
({
path
:
'/meeting
-update'
,
query
:
{
meeting_id
:
this
.
rowData
.
meeting_id
,
sub_meeting_id
:
this
.
rowData
.
sub_meeting_id
}
})
},
},
handleCancel
()
{
handleCancel
()
{
this
.
$confirm
(
'此操作将取消这场会议, 是否继续?'
,
'提示'
,
{
this
.
$confirm
(
'此操作将取消这场会议, 是否继续?'
,
'提示'
,
{
...
@@ -183,10 +183,12 @@ export default {
...
@@ -183,10 +183,12 @@ export default {
}
else
{
}
else
{
const
list
=
await
this
.
fetchMeetingRecordAddr
()
const
list
=
await
this
.
fetchMeetingRecordAddr
()
if
(
list
&&
Array
.
isArray
(
list
))
{
if
(
list
&&
Array
.
isArray
(
list
))
{
list
.
forEach
(
it
=>
{
list
.
forEach
(
(
it
,
index
)
=>
{
if
(
it
.
download_address
)
{
if
(
it
.
download_address
)
{
// window.open(it.download_address, '_blank')
// window.open(it.download_address, '_blank')
setTimeout
(()
=>
{
this
.
funDownload
(
it
.
download_address
,
it
.
download_address
)
this
.
funDownload
(
it
.
download_address
,
it
.
download_address
)
},
index
*
1000
)
}
}
})
})
}
}
...
@@ -199,7 +201,7 @@ export default {
...
@@ -199,7 +201,7 @@ export default {
elink
.
href
=
fileUrl
;
// 把之前处理好的地址赋给a标签的href
elink
.
href
=
fileUrl
;
// 把之前处理好的地址赋给a标签的href
document
.
body
.
appendChild
(
elink
);
// 将a标签添加到body中
document
.
body
.
appendChild
(
elink
);
// 将a标签添加到body中
elink
.
click
();
// 执行a标签的点击方法
elink
.
click
();
// 执行a标签的点击方法
URL
.
revokeObjectURL
(
elink
.
href
)
// 下载完成释放URL 对象
//
URL.revokeObjectURL(elink.href) // 下载完成释放URL 对象
document
.
body
.
removeChild
(
elink
)
// 移除a标签
document
.
body
.
removeChild
(
elink
)
// 移除a标签
},
},
fetchStopMeeting
()
{
fetchStopMeeting
()
{
...
...
src/components/layout/header.vue
浏览文件 @
0bbc187f
...
@@ -48,7 +48,7 @@ export default {
...
@@ -48,7 +48,7 @@ export default {
this
.
$store
.
dispatch
(
'app/toggleSideBar'
)
this
.
$store
.
dispatch
(
'app/toggleSideBar'
)
},
},
toMeeting
()
{
toMeeting
()
{
this
.
$router
.
push
(
'/meeting'
)
this
.
$router
.
push
(
'/meeting
-create
'
)
},
},
async
logout
()
{
async
logout
()
{
await
this
.
$store
.
dispatch
(
'logout'
)
await
this
.
$store
.
dispatch
(
'logout'
)
...
...
src/pages/calendar/day/components/NewPopover.vue
浏览文件 @
0bbc187f
...
@@ -125,21 +125,6 @@ export default {
...
@@ -125,21 +125,6 @@ export default {
live_subject
:
[{
validator
:
validateErrMsg
}],
live_subject
:
[{
validator
:
validateErrMsg
}],
live_summary
:
[{
validator
:
validateErrMsg
}]
live_summary
:
[{
validator
:
validateErrMsg
}]
},
},
// startDateOptions: {
// disabledDate(time) {
// return time.getTime()
<
Date
.
now
()
-
DAY_TIMESTAMP
;
// }
// },
// startTimeOptions: {
// start: getCurHalfHour('start'),
// step: '00:30',
// end: '23:30'
// },
// endTimeOptions: {
// start: getCurHalfHour('end'),
// step: '00:30',
// end: '23:30'
// },
details
:
{},
details
:
{},
dialogVisible
:
false
dialogVisible
:
false
}
}
...
@@ -275,7 +260,20 @@ export default {
...
@@ -275,7 +260,20 @@ export default {
});
});
},
},
more
()
{
more
()
{
this
.
$router
.
push
({
path
:
'/meeting'
,
query
:
{
type
:
'1'
,
account
:
this
.
data
.
accountId
,
start
:
this
.
startTimestamp
,
end
:
this
.
endTimestamp
}
})
const
query
=
{
account
:
this
.
data
.
accountId
,
start
:
this
.
startTimestamp
,
end
:
this
.
endTimestamp
}
if
(
this
.
form
.
subject
)
{
query
.
subject
=
this
.
form
.
subject
}
if
(
this
.
form
.
enable_live
)
{
query
.
enable_live
=
1
this
.
form
.
live_subject
&&
(
query
.
live_subject
=
this
.
form
.
live_subject
)
this
.
form
.
live_summary
&&
(
query
.
live_summary
=
this
.
form
.
live_summary
)
}
this
.
$router
.
push
({
path
:
'/meeting-account-create'
,
query
:
query
})
},
},
fetchCreateMeeting
()
{
fetchCreateMeeting
()
{
const
form
=
this
.
form
const
form
=
this
.
form
...
...
src/pages/calendar/index.vue
浏览文件 @
0bbc187f
...
@@ -13,10 +13,10 @@
...
@@ -13,10 +13,10 @@
</div>
</div>
<div
class=
"status-filter"
>
<div
class=
"status-filter"
>
<el-radio-group
v-model=
"filter.status"
>
<el-radio-group
v-model=
"filter.status"
>
<
el-radio
:label=
"9999"
>
全部
</el-radio
>
<
!--
<el-radio
:label=
"9999"
class=
"all"
>
全部
</el-radio>
--
>
<el-radio
:label=
"1"
>
进行中
</el-radio>
<el-radio
:label=
"1"
class=
"start"
>
进行中
</el-radio>
<el-radio
:label=
"0"
>
未开始
</el-radio>
<el-radio
:label=
"0"
class=
"not-started"
>
未开始
</el-radio>
<el-radio
:label=
"2"
>
已完成
</el-radio>
<el-radio
:label=
"2"
class=
"end"
>
已完成
</el-radio>
</el-radio-group>
</el-radio-group>
</div>
</div>
</div>
</div>
...
@@ -210,29 +210,29 @@ h5{
...
@@ -210,29 +210,29 @@ h5{
display
:
block
;
display
:
block
;
margin
-
bottom
:
10
px
;
margin
-
bottom
:
10
px
;
}
}
.
status
-
filter
::
v
-
deep
.
el
-
radio
:
first
-
child
.
el
-
radio__input
.
is
-
checked
.
el
-
radio__inner
{
.
status
-
filter
::
v
-
deep
.
el
-
radio
.
all
.
el
-
radio__input
.
is
-
checked
.
el
-
radio__inner
{
border
-
color
:
#
636363
;
border
-
color
:
#
636363
;
background
:
#
636363
;
background
:
#
636363
;
}
}
.
status
-
filter
::
v
-
deep
.
el
-
radio
:
nth
-
child
(
2
)
.
el
-
radio__input
.
is
-
checked
.
el
-
radio__inner
{
.
status
-
filter
::
v
-
deep
.
el
-
radio
.
start
.
el
-
radio__input
.
is
-
checked
.
el
-
radio__inner
{
border
-
color
:
#
409
eff
;
border
-
color
:
#
409
eff
;
background
:
#
409
eff
;
background
:
#
409
eff
;
}
}
.
status
-
filter
::
v
-
deep
.
el
-
radio
:
nth
-
child
(
3
)
.
el
-
radio__input
.
is
-
checked
.
el
-
radio__inner
{
.
status
-
filter
::
v
-
deep
.
el
-
radio
.
not
-
started
.
el
-
radio__input
.
is
-
checked
.
el
-
radio__inner
{
border
-
color
:
#
52
B837
;
border
-
color
:
#
52
B837
;
background
:
#
52
B837
;
background
:
#
52
B837
;
}
}
.
status
-
filter
::
v
-
deep
.
el
-
radio
:
last
-
child
.
el
-
radio__input
.
is
-
checked
.
el
-
radio__inner
{
.
status
-
filter
::
v
-
deep
.
el
-
radio
.
end
.
el
-
radio__input
.
is
-
checked
.
el
-
radio__inner
{
border
-
color
:
#
BFBFBF
;
border
-
color
:
#
BFBFBF
;
background
:
#
BFBFBF
;
background
:
#
BFBFBF
;
}
}
.
status
-
filter
::
v
-
deep
.
el
-
radio
:
first
-
child
.
el
-
radio__input
+
.
el
-
radio__label
{
.
status
-
filter
::
v
-
deep
.
el
-
radio
.
all
.
el
-
radio__input
+
.
el
-
radio__label
{
color
:
#
636363
;
color
:
#
636363
;
}
}
.
status
-
filter
::
v
-
deep
.
el
-
radio
:
nth
-
child
(
2
)
.
el
-
radio__input
+
.
el
-
radio__label
{
.
status
-
filter
::
v
-
deep
.
el
-
radio
.
start
.
el
-
radio__input
+
.
el
-
radio__label
{
color
:
#
409
eff
;
color
:
#
409
eff
;
}
}
.
status
-
filter
::
v
-
deep
.
el
-
radio
:
nth
-
child
(
3
)
.
el
-
radio__input
+
.
el
-
radio__label
{
.
status
-
filter
::
v
-
deep
.
el
-
radio
.
not
-
started
.
el
-
radio__input
+
.
el
-
radio__label
{
color
:
#
52
B837
;
color
:
#
52
B837
;
}
}
.
status
-
filter
::
v
-
deep
.
el
-
radio
:
last
-
child
.
el
-
radio__input
+
.
el
-
radio__label
{
.
status
-
filter
::
v
-
deep
.
el
-
radio
:
last
-
child
.
el
-
radio__input
+
.
el
-
radio__label
{
...
...
src/pages/calendar/list/index.vue
浏览文件 @
0bbc187f
<
template
>
<
template
>
<div
class=
"list"
>
<div
class=
"list"
>
<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"
>
<el-table-column
label=
"会议时间"
min-width=
"2
15
"
align=
"center"
>
<el-table-column
label=
"会议时间"
min-width=
"2
20
"
align=
"center"
>
<template
slot-scope=
"scope"
>
<template
slot-scope=
"scope"
>
<p
style=
"color: #aeaeae"
>
<p
style=
"color: #aeaeae"
>
<span
style=
"font-size: 18px; color: #606266"
>
{{
scope
.
row
.
start_time
|
dateFormat
(
'{d
}
'
)
}}
<
/span
>
<span
style=
"font-size: 18px; color: #606266"
>
{{
scope
.
row
.
start_time
|
dateFormat
(
'{d
}
'
)
}}
<
/span
>
...
@@ -53,7 +53,7 @@
...
@@ -53,7 +53,7 @@
<
/template
>
<
/template
>
<
/el-table-column
>
<
/el-table-column
>
<
el
-
table
-
column
prop
=
"sso_user.nickname"
label
=
"创建人"
min
-
width
=
"100"
align
=
"center"
><
/el-table-column
>
<
el
-
table
-
column
prop
=
"sso_user.nickname"
label
=
"创建人"
min
-
width
=
"100"
align
=
"center"
><
/el-table-column
>
<
el
-
table
-
column
label
=
"操作"
width
=
"2
2
0"
align
=
"center"
>
<
el
-
table
-
column
label
=
"操作"
width
=
"2
4
0"
align
=
"center"
>
<
template
slot
-
scope
=
"scope"
>
<
template
slot
-
scope
=
"scope"
>
<
table
-
handles
:
rowData
=
"scope.row"
@
refresh
=
"fetchMeetingList"
/>
<
table
-
handles
:
rowData
=
"scope.row"
@
refresh
=
"fetchMeetingList"
/>
<
/template
>
<
/template
>
...
@@ -110,7 +110,7 @@ export default {
...
@@ -110,7 +110,7 @@ export default {
result
=
'进行中'
result
=
'进行中'
break
break
case
2
:
case
2
:
result
=
'已
结束
'
result
=
'已
完成
'
break
break
}
}
return
result
return
result
...
...
src/pages/meeting/index-
test
.vue
→
src/pages/meeting/index-
old
.vue
浏览文件 @
0bbc187f
...
@@ -6,18 +6,18 @@
...
@@ -6,18 +6,18 @@
<!--
<el-radio-button
label=
"week"
>
周
</el-radio-button>
<!--
<el-radio-button
label=
"week"
>
周
</el-radio-button>
<el-radio-button
label=
"month"
>
月
</el-radio-button>
-->
<el-radio-button
label=
"month"
>
月
</el-radio-button>
-->
</el-radio-group>
</el-radio-group>
<tencent-meeting
-test
/>
<tencent-meeting
v-if=
"tabActive === 'tx'"
/>
</div>
</div>
</
template
>
</
template
>
<
script
>
<
script
>
import
TencentMeeting
Test
from
'./tencent-meeting-test
/index.vue'
import
TencentMeeting
from
'./tencent-meeting
/index.vue'
export
default
{
export
default
{
data
()
{
data
()
{
return
{
return
{
tabActive
:
'tx'
tabActive
:
'tx'
}
}
},
},
components
:
{
TencentMeeting
Test
}
components
:
{
TencentMeeting
}
}
}
</
script
>
</
script
>
<
style
scope
>
<
style
scope
>
...
...
src/pages/meeting/index.vue
浏览文件 @
0bbc187f
<
template
>
<
template
>
<div
class=
"
create-
meeting"
>
<div
class=
"meeting"
>
<el-radio-group
v-model=
"tabActive"
size=
"mini"
style=
"margin:14px 0 10px 40px;"
>
<el-radio-group
v-model=
"tabActive"
size=
"mini"
style=
"margin:14px 0 10px 40px;"
>
<el-radio-button
label=
"tx"
>
腾讯
</el-radio-button>
<el-radio-button
label=
"tx"
>
腾讯
</el-radio-button>
<el-radio-button
label=
"cc"
>
cc
</el-radio-button>
<el-radio-button
label=
"cc"
>
cc
</el-radio-button>
<!--
<el-radio-button
label=
"week"
>
周
</el-radio-button>
<!--
<el-radio-button
label=
"week"
>
周
</el-radio-button>
<el-radio-button
label=
"month"
>
月
</el-radio-button>
-->
<el-radio-button
label=
"month"
>
月
</el-radio-button>
-->
</el-radio-group>
</el-radio-group>
<tencent-meeting
v-if=
"tabActive === 'tx'"
/>
<tencent-meeting
v-if=
"tabActive === 'tx'"
/>
</div>
</div>
</
template
>
</
template
>
<
script
>
<
script
>
...
@@ -21,7 +21,7 @@ export default {
...
@@ -21,7 +21,7 @@ export default {
}
}
</
script
>
</
script
>
<
style
scope
>
<
style
scope
>
.
create-
meeting
{
.meeting
{
height
:
100%
;
height
:
100%
;
}
}
</
style
>
</
style
>
\ No newline at end of file
src/pages/meeting/tencent-meeting-old/index.vue
0 → 100644
浏览文件 @
0bbc187f
<
template
>
<div
class=
"tx-meeting-container"
>
<div
class=
"inner"
>
<el-form
ref=
"ruleForm"
:model=
"form"
:rules=
"rules"
label-width=
"120px"
>
<el-form-item
label=
"会议主题"
prop=
"subject"
>
<el-input
v-model=
"form.subject"
size=
"small"
/>
</el-form-item>
<el-form-item
label=
"开始时间"
required
>
<el-col
:span=
"11"
>
<el-form-item
prop=
"startDate"
>
<el-date-picker
v-model=
"form.startDate"
type=
"date"
placeholder=
"选择日期"
style=
"width: 100%"
size=
"small"
:clearable=
"timerClear"
:editable=
"timerClear"
:picker-options=
"startDateOptions"
@
change=
"startDateChange"
/>
</el-form-item>
</el-col>
<el-col
:span=
"2"
class=
"line"
>
-
</el-col>
<el-col
:span=
"11"
>
<el-form-item
prop=
"startTime"
>
<el-time-select
v-model=
"form.startTime"
style=
"width: 100%"
:picker-options=
"startTimeOptions"
placeholder=
"选择时间"
size=
"small"
:clearable=
"timerClear"
:editable=
"timerClear"
@
change=
"startTimeChange"
/>
</el-form-item>
</el-col>
</el-form-item>
<el-form-item
label=
"结束时间"
required
>
<el-col
:span=
"11"
>
<el-form-item
prop=
"endDate"
>
<el-date-picker
v-model=
"form.endDate"
type=
"date"
placeholder=
"选择日期"
style=
"width: 100%"
size=
"small"
:clearable=
"timerClear"
:editable=
"timerClear"
:picker-options=
"endDateOptions"
@
change=
"endDateChange"
/>
</el-form-item>
</el-col>
<el-col
:span=
"2"
class=
"line"
>
-
</el-col>
<el-col
:span=
"11"
>
<el-form-item
prop=
"endTime"
>
<el-time-select
v-model=
"form.endTime"
style=
"width: 100%"
:picker-options=
"endTimeOptions"
placeholder=
"选择时间"
size=
"small"
:clearable=
"timerClear"
:editable=
"timerClear"
/>
</el-form-item>
</el-col>
</el-form-item>
<el-form-item
label=
"时区"
required
>
<el-col>
<el-select
style=
"width: 100%"
v-model=
"form.timezone"
placeholder=
"选择时区"
size=
"small"
>
<el-option
label=
"(GMT+8:00)中国标准时间-北京"
value=
"beijing"
/>
</el-select>
</el-col>
</el-form-item>
<el-form-item
label=
"周期会议"
>
<el-switch
v-model=
"form.meeting_type"
:active-value=
"1"
:inactive-value=
"0"
/>
<p
v-show=
"form.meeting_type"
>
{{
recurringTypeOptions
[
form
.
recurring_type
]
}}
</p>
<p
v-show=
"form.meeting_type"
style=
"line-height: 24px;color:#999;"
>
结束于
{{
getCycleMeetingEndDate
}}
{{
form
.
until_count
}}
场会议
</p>
</el-form-item>
<el-form-item
label=
"重复频率"
v-if=
"form.meeting_type"
required
>
<el-col
:span=
"11"
>
<el-select
style=
"width: 100%"
v-model=
"form.recurring_type"
placeholder=
"选择重复频率"
size=
"small"
@
change=
"repaeatRateChange"
>
<el-option
:label=
"item"
:value=
"index"
v-for=
"(item, index) in recurringTypeOptions"
:key=
"index"
/>
<!--
<el-option
label=
"每个工作日"
:value=
"1"
/>
<el-option
label=
"每周"
:value=
"2"
/>
<el-option
label=
"每两周"
:value=
"3"
/>
<el-option
label=
"每月"
:value=
"4"
/>
-->
</el-select>
</el-col>
</el-form-item>
<el-form-item
label=
"结束重复"
v-if=
"form.meeting_type"
required
>
<el-col
:span=
"11"
>
<el-select
style=
"width: 100%"
v-model=
"form.until_type"
placeholder=
"选择时区"
size=
"small"
>
<el-option
label=
"结束于某天"
:value=
"0"
/>
<el-option
label=
"限制会议次数"
:value=
"1"
/>
</el-select>
</el-col>
<el-col
:span=
"2"
class=
"line"
>
-
</el-col>
<el-col
:span=
"11"
>
<el-date-picker
v-if=
"form.until_type === 0"
v-model=
"getCycleMeetingEndDate"
type=
"date"
placeholder=
"选择结束日期"
style=
"width: 100%"
size=
"small"
:clearable=
"timerClear"
:editable=
"timerClear"
:picker-options=
"cycleMeetingEndDateOptions"
/>
<el-input-number
v-else
v-model=
"form.until_count"
:min=
"1"
:max=
"50"
size=
"small"
></el-input-number>
</el-col>
</el-form-item>
<!--
<el-form-item
label=
"指定主持人"
>
<el-col
:span=
"11"
>
<el-select
style=
"width:100%"
v-model=
"form.moderator"
placeholder=
"选择主持人"
size=
"small"
>
<el-option
:label=
"user.username"
:value=
"user.id"
v-for=
"user in userList"
:key=
"user.id"
/>
</el-select>
</el-col>
</el-form-item>
-->
<el-form-item
label=
"指定会议管理员"
>
<p
style=
"line-height:24px;"
>
(会议管理员有修改会议,复制、取消会议等所有管理本次会议的权限)
</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=
"16"
>
<el-select
style=
"width: 100%"
v-model=
"form.managers"
placeholder=
"请输入关键字搜索"
size=
"small"
multiple
filterable
remote
:remote-method=
"fetchUserList"
:loading=
"searchUsersloading"
>
<el-option
:label=
"user.nickname"
:value=
"user.id"
v-for=
"user in userList"
:key=
"user.id"
>
<span
style=
"float: left"
>
{{
user
.
nickname
}}
</span>
<span
style=
"float: right; color: #8492a6; font-size: 13px; margin:0 20px 0 10px;"
>
{{
user
.
id
}}
</span>
</el-option>
</el-select>
</el-col>
<p
class=
"search-keywords-checked"
v-if=
"searchKeywordsCheckMsg"
>
{{
searchKeywordsCheckMsg
}}
</p>
</el-form-item>
<el-form-item
label=
"会议设置"
>
<el-checkbox
style=
"width: 120px"
v-model=
"form.hasPwd"
>
开启会议密码
</el-checkbox>
<el-input
style=
"width: 170px"
v-model=
"form.password"
v-if=
"form.hasPwd"
placeholder=
"请输入4-6位数字密码"
type=
"password"
suffix-icon=
"el-icon-lock"
size=
"small"
>
</el-input>
<el-checkbox
style=
"display: block"
v-model=
"form.auto_in_waiting_room"
>
开启等候室
</el-checkbox>
<el-checkbox
style=
"display: block"
v-model=
"form.allow_in_before_host"
>
准许成员在主持人开始前进入会议
</el-checkbox
>
<el-checkbox
style=
"display: block"
v-model=
"form.mute_enable_join"
>
入会自动静音
</el-checkbox>
<el-checkbox
v-model=
"form.auto_record"
>
自动录制会议
</el-checkbox>
<el-radio-group
v-model=
"form.auto_record_type"
v-if=
"form.auto_record"
>
<el-radio
label=
"local"
>
本地录制
</el-radio>
<el-radio
label=
"cloud"
>
云录制
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item
label=
"会议直播"
>
<el-checkbox
v-model=
"form.enable_live"
>
开启会议直播(用于分享给观看直播的用户)
</el-checkbox>
</el-form-item>
<el-form-item
label=
"直播主题"
v-if=
"form.enable_live"
:required=
"form.enable_live"
prop=
"live_subject"
>
<el-input
v-model=
"form.live_subject"
size=
"small"
/>
</el-form-item>
<el-form-item
label=
"直播简介"
v-if=
"form.enable_live"
:required=
"form.enable_live"
prop=
"live_summary"
>
<el-input
type=
"textarea"
v-model=
"form.live_summary"
></el-input>
</el-form-item>
<el-form-item
label=
"直播设置"
v-if=
"form.enable_live"
style=
"margin-bottom: 0"
>
<el-checkbox
style=
"width: 150px"
v-model=
"form.enable_live_password"
>
开启观看直播密码
</el-checkbox>
<el-input
style=
"width: 170px"
v-model=
"form.live_password"
v-if=
"form.enable_live_password"
placeholder=
"请输入4-6位数字密码"
type=
"password"
suffix-icon=
"el-icon-lock"
size=
"small"
/>
</el-form-item>
<el-form-item
label=
""
v-if=
"form.enable_live"
>
<el-checkbox
v-model=
"form.enable_live_im"
>
准许观众讨论
</el-checkbox>
</el-form-item>
<el-form-item
style=
"padding-left: 100px"
>
<el-button
type=
"primary"
@
click=
"submitForm('ruleForm')"
size=
"mini"
>
{{
isUpdate
?
'修改会议'
:
'立即创建'
}}
</el-button>
<el-button
@
click=
"resetForm('ruleForm')"
size=
"mini"
>
重置
</el-button>
</el-form-item>
</el-form>
<div
class=
"right-container"
v-if=
"showSchedule"
>
<div
class=
"title"
>
{{
form
.
startDate
|
timeFormat
}}
{{
form
.
startDate
|
timeFormat
(
'星期{a
}
'
)
}}
<
/div
>
<
schedule
:
options
=
"options"
:
data
=
"schedule"
:
date
=
"form.startDate"
/>
<
div
class
=
"pre-time-range"
:
style
=
"{ top: getTop, height: getHeight
}
"
><
/div
>
<
/div
>
<
/div
>
<
meeting
-
success
-
dialog
:
dialogVisible
.
sync
=
"dialogVisible"
:
details
=
"details"
/>
<
/div
>
<
/template
>
<
script
>
import
Schedule
from
'@/components/Schedule'
import
MeetingSuccessDialog
from
'@/components/MeetingSuccessDialog/index'
import
{
timeTrans
,
dateFormat
,
getYMDByDate
,
getTimestampYMD
,
computedDateByRateTimes
,
computedTimesByRateDate
,
getCurHalfHour
,
isSameDate
}
from
'@/utils/dateAlgs'
import
{
searchUserList
,
createMeeting
,
operateLog
,
getMeetingDetails
,
getNonpagedMeetingList
,
updateMeeting
}
from
'@api/common'
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
{8
}
$/
const
EMAIL_REG
=
/^
[
A-Za-z0-9
]
+
([
_.
][
A-Za-z0-9
]
+
)
*@
([
A-Za-z0-9-
]
+
\.)
+
[
A-Za-z
]
{2,6
}
$/
export
default
{
data
()
{
const
now
=
new
Date
()
const
nowDate
=
getYMDByDate
(
now
)
const
startDateChecked
=
(
rule
,
value
,
callback
)
=>
{
if
(
value
)
{
const
timestamp
=
Date
.
parse
(
value
)
if
(
timestamp
<
Date
.
now
()
-
DAY_TIMESTAMP
)
{
callback
(
new
Error
(
'开始时间必须大于当前时间'
))
}
else
{
callback
()
}
}
}
const
endDateChecked
=
(
rule
,
value
,
callback
)
=>
{
if
(
value
)
{
if
(
this
.
endTimestamp
<
this
.
startTimestamp
)
{
callback
(
new
Error
(
'结束时间必须大于开始时间'
))
}
else
if
(
this
.
endTimestamp
>
this
.
startTimestamp
+
DAY_TIMESTAMP
)
{
callback
(
new
Error
(
'会议时间不能超过24小时'
))
}
else
{
callback
()
}
}
}
const
validateErrMsg
=
(
rule
,
value
,
callback
)
=>
{
// 当开启会议直播时,启用验证,处理callback
if
(
this
.
form
.
enable_live
&&
!
value
)
{
const
errMsg
=
rule
.
field
===
'live_subject'
?
'请输入直播主题'
:
'请输入直播简介'
callback
(
new
Error
(
errMsg
))
}
else
{
callback
()
}
}
return
{
timerClear
:
false
,
time
:
''
,
recurringTypeOptions
:
[
'每天'
,
'每个工作日'
,
'每周'
,
'每两周'
,
'每月'
],
form
:
{
subject
:
''
,
startDate
:
nowDate
,
startTime
:
getCurHalfHour
(
'start'
),
endDate
:
nowDate
,
endTime
:
getCurHalfHour
(
'end'
),
timezone
:
'beijing'
,
meeting_type
:
0
,
recurring_type
:
0
,
until_type
:
0
,
until_date
:
''
,
until_count
:
7
,
managers
:
[],
hasPwd
:
false
,
password
:
''
,
auto_in_waiting_room
:
false
,
allow_in_before_host
:
true
,
auto_record
:
true
,
auto_record_type
:
'cloud'
,
mute_enable_join
:
false
,
enable_live
:
false
,
live_subject
:
''
,
live_summary
:
''
,
enable_live_password
:
false
,
live_password
:
''
,
enable_live_im
:
false
}
,
rules
:
{
subject
:
[{
required
:
true
,
message
:
'请填写会议主题'
,
trigger
:
'blur'
}
],
startDate
:
[
{
type
:
'date'
,
required
:
true
,
message
:
'请选择开始日期'
,
trigger
:
'change'
}
,
{
type
:
'date'
,
validator
:
startDateChecked
,
trigger
:
'change'
}
],
startTime
:
[{
required
:
true
,
message
:
'请选择开始时间'
,
trigger
:
'change'
}
],
endDate
:
[{
type
:
'date'
,
required
:
true
,
message
:
'请选择结束日期'
,
trigger
:
'change'
}
],
endTime
:
[
{
required
:
true
,
message
:
'请选择结束时间'
,
trigger
:
'change'
}
,
{
validator
:
endDateChecked
,
trigger
:
'change'
}
],
moderator
:
[{
required
:
true
,
message
:
'请选择主持人'
,
trigger
:
'change'
}
],
live_subject
:
[{
validator
:
validateErrMsg
}
],
live_summary
:
[{
validator
:
validateErrMsg
}
]
}
,
cycleMeetingEndDateOptions
:
{
disabledDate
:
time
=>
{
let
flag
=
false
switch
(
this
.
form
.
recurring_type
)
{
case
0
:
{
break
}
case
1
:
{
if
(
time
.
getDay
()
===
5
||
time
.
getDay
()
===
6
)
flag
=
true
break
}
case
2
:
{
const
startDate
=
timeTrans
(
this
.
form
.
startDate
)
if
(
startDate
.
getDay
()
!==
time
.
getDay
()
||
getTimestampYMD
(
time
)
<
getTimestampYMD
(
startDate
))
flag
=
true
break
}
case
3
:
{
const
startDate
=
timeTrans
(
this
.
form
.
startDate
)
const
disabledDay
=
((
getTimestampYMD
(
time
)
-
getTimestampYMD
(
startDate
))
/
(
DAY_TIMESTAMP
*
7
))
%
2
!==
0
if
(
disabledDay
||
getTimestampYMD
(
time
)
<
getTimestampYMD
(
startDate
))
flag
=
true
break
}
case
4
:
{
const
startDate
=
timeTrans
(
this
.
form
.
startDate
)
const
day
=
startDate
.
getDate
()
const
targetDay
=
time
.
getDate
()
let
disabledDay
=
false
if
(
day
>
28
)
{
const
year
=
time
.
getFullYear
()
const
month
=
time
.
getMonth
()
+
1
const
targetMDays
=
new
Date
(
year
,
month
,
0
).
getDate
()
if
(
targetDay
!==
targetMDays
)
disabledDay
=
true
}
else
if
(
startDate
.
getDate
()
!==
targetDay
)
{
disabledDay
=
true
}
if
(
disabledDay
||
getTimestampYMD
(
time
)
<
getTimestampYMD
(
startDate
))
flag
=
true
break
}
}
return
flag
}
}
,
userList
:
[],
searchType
:
'username'
,
searchTypeOptions
:
{
username
:
'通过用户名搜索'
,
nickname
:
'通过昵称搜索'
,
email
:
'通过邮箱搜索'
,
mobile
:
'通过手机号搜索'
,
id
:
'通过ID搜索'
}
,
searchKeywordsCheckMsg
:
''
,
searchUsersloading
:
false
,
showSchedule
:
false
,
options
:
{
multi
:
false
,
// 是否为多日程
start
:
0
,
// init number 0-23
end
:
24
,
// init number 1-24且end>start
step
:
60
,
// 只接收15, 30, 60三种步伐
lineHeight
:
40
,
// init number 时间线间的高度
nowBeforeDisabled
:
true
,
readonly
:
true
,
popoverPos
:
'bottom'
}
,
schedule
:
{
userid
:
''
,
events
:
[]
}
,
dialogVisible
:
false
,
details
:
{
}
,
isUpdate
:
false
,
userid
:
''
}
}
,
computed
:
{
user
()
{
return
this
.
$store
.
getters
.
user
}
,
getTop
()
{
const
timeRange
=
this
.
startTimestamp
-
this
.
startDotTimestamp
const
top
=
timeRange
/
((
60
*
1000
*
this
.
options
.
step
)
/
this
.
options
.
lineHeight
)
return
top
+
56
+
'px'
}
,
getHeight
()
{
const
start
=
timeTrans
(
this
.
startTimestamp
)
let
end
=
timeTrans
(
this
.
endTimestamp
)
if
(
!
isSameDate
(
start
,
end
))
{
end
=
new
Date
(
start
.
getFullYear
(),
start
.
getMonth
(),
start
.
getDate
(),
24
,
0
,
0
)
}
const
timeRange
=
end
.
getTime
()
-
start
.
getTime
()
const
h
=
timeRange
/
((
60
*
1000
*
this
.
options
.
step
)
/
this
.
options
.
lineHeight
)
return
h
-
2
+
'px'
}
,
startDotTimestamp
()
{
const
date
=
this
.
form
.
startDate
const
startHour
=
parseInt
(
this
.
options
.
start
)
return
new
Date
(
date
.
getFullYear
(),
date
.
getMonth
(),
date
.
getDate
(),
startHour
,
0
,
0
).
getTime
()
}
,
startTimestamp
()
{
return
this
.
getFullDateTime
(
this
.
form
.
startDate
,
this
.
form
.
startTime
).
getTime
()
}
,
endTimestamp
()
{
return
this
.
getFullDateTime
(
this
.
form
.
endDate
,
this
.
form
.
endTime
).
getTime
()
}
,
getCycleMeetingEndDate
:
{
get
:
function
()
{
const
startDate
=
this
.
form
.
startDate
?
this
.
form
.
startDate
:
Date
.
now
()
return
computedDateByRateTimes
(
startDate
,
this
.
form
.
until_count
,
this
.
form
.
recurring_type
)
}
,
set
:
function
(
newValue
)
{
const
times
=
computedTimesByRateDate
(
this
.
form
.
startDate
,
newValue
,
this
.
form
.
recurring_type
)
this
.
form
.
until_count
=
times
}
}
,
startDateOptions
()
{
return
{
disabledDate
(
time
)
{
return
time
.
getTime
()
<
Date
.
now
()
-
DAY_TIMESTAMP
}
}
}
,
startTimeOptions
()
{
const
date
=
this
.
form
.
startDate
const
options
=
{
start
:
'00:00'
,
step
:
'00:30'
,
end
:
'23:30'
}
if
(
date
.
getTime
()
<=
Date
.
now
())
{
options
.
start
=
getCurHalfHour
(
'start'
)
}
return
options
}
,
endDateOptions
()
{
const
_startDate
=
this
.
form
.
startDate
return
{
disabledDate
(
time
)
{
return
(
getTimestampYMD
(
time
)
<
getTimestampYMD
(
_startDate
)
||
getTimestampYMD
(
time
)
>
getTimestampYMD
(
_startDate
)
+
DAY_TIMESTAMP
)
}
}
}
,
endTimeOptions
()
{
const
{
startDate
,
endDate
,
startTime
}
=
this
.
form
const
fullDate
=
this
.
getFullDateTime
(
startDate
,
startTime
)
const
minutes
=
fullDate
.
getMinutes
()
let
options
if
(
this
.
isSameDate
(
startDate
,
endDate
))
{
// 结束日期和开始日期同一天,会议最低半小时,则向后推半小时
const
_date
=
fullDate
.
setMinutes
(
minutes
+
30
)
const
startTime
=
dateFormat
(
_date
,
'{h
}
:{i
}
'
)
options
=
{
start
:
startTime
,
step
:
'00:30'
,
end
:
'23:30'
}
}
else
{
// 结束时间和开始时间不能超过24小时,相隔一天,则向前推半小时
const
_date
=
fullDate
.
setMinutes
(
minutes
-
30
)
const
endTime
=
dateFormat
(
_date
,
'{h
}
:{i
}
'
)
options
=
{
start
:
'00:00'
,
step
:
'00:30'
,
end
:
endTime
}
}
return
options
}
}
,
filters
:
{
timeFormat
(
val
,
fmt
)
{
fmt
=
fmt
||
'{y
}
年{m
}
月{d
}
日'
return
dateFormat
(
val
,
fmt
)
}
}
,
components
:
{
Schedule
,
MeetingSuccessDialog
}
,
created
()
{
// this.getUserList()
}
,
watch
:
{
getCycleMeetingEndDate
:
{
handler
:
function
(
nv
,
ov
)
{
this
.
form
.
until_date
=
Date
.
parse
(
nv
)
}
,
immediate
:
true
}
,
$route
:
{
handler
:
function
()
{
const
query
=
this
.
$route
.
query
if
(
query
.
type
===
'1'
)
{
this
.
showSchedule
=
true
this
.
form
.
startDate
=
getYMDByDate
(
query
.
start
)
this
.
form
.
startTime
=
dateFormat
(
query
.
start
,
'{h
}
:{i
}
'
)
this
.
form
.
endDate
=
getYMDByDate
(
query
.
end
)
this
.
form
.
endTime
=
dateFormat
(
query
.
end
,
'{h
}
:{i
}
'
)
this
.
schedule
.
userid
=
query
.
account
this
.
fetchMeetingList
()
}
else
if
(
query
.
type
===
'2'
)
{
const
params
=
{
meeting_id
:
query
.
meeting_id
,
sub_meeting_id
:
query
.
sub_meeting_id
}
this
.
isUpdate
=
true
this
.
getDetailsData
(
params
)
}
else
{
this
.
showSchedule
=
false
}
}
,
immediate
:
true
}
,
dialogVisible
:
{
handler
:
function
(
nv
)
{
if
(
!
nv
)
{
this
.
goList
()
}
}
}
}
,
methods
:
{
startDateChange
(
val
)
{
this
.
form
.
endDate
=
val
this
.
startTimeChange
()
if
(
this
.
showSchedule
)
{
this
.
fetchMeetingList
()
}
}
,
startTimeChange
()
{
const
{
startDate
,
endDate
}
=
this
.
form
if
(
this
.
isSameDate
(
startDate
,
endDate
))
{
this
.
form
.
endTime
=
this
.
endTimeOptions
.
start
}
else
{
this
.
form
.
endTime
=
this
.
endTimeOptions
.
end
}
}
,
endDateChange
()
{
this
.
startTimeChange
()
}
,
repaeatRateChange
(
val
)
{
if
(
val
===
'everyworkday'
&&
this
.
form
.
endType
===
'endOneday'
)
{
this
.
form
.
periodicTimes
=
7
}
}
,
getFullDateTime
(
date
,
timeStr
)
{
const
hmArr
=
timeStr
.
split
(
':'
)
const
h
=
parseInt
(
hmArr
[
0
])
const
s
=
parseInt
(
hmArr
[
1
])
return
new
Date
(
date
.
getFullYear
(),
date
.
getMonth
(),
date
.
getDate
(),
h
,
s
,
0
)
}
,
isSameDate
(
start
,
end
)
{
return
dateFormat
(
start
,
'{y
}
-{m
}
-{d
}
'
)
===
dateFormat
(
end
,
'{y
}
-{m
}
-{d
}
'
)
}
,
autoRecordChange
(
val
)
{
this
.
auto_record_type
=
val
?
'cloud'
:
'none'
}
,
// copyText()
{
// const text = this.$refs.details.$el.innerText
// this.copyFn(text)
//
}
,
// copyMeetingLink()
{
// this.copyFn(this.details.join_url)
//
}
,
// copyLiveLink()
{
// this.copyFn(this.details.live_config.live_addr)
//
}
,
// copyFn(val)
{
// if (!val) return
// const dom = document.createElement('textarea')
// document.body.appendChild(dom)
// dom.value = val
// dom.select(); // 选择对象
// document.execCommand('Copy');
// this.$message(
{
// message: '复制成功!',
// type: 'success'
//
}
)
// document.body.removeChild(dom)
//
}
,
// joinMeeting()
{
// window.open(this.details.join_url, '_blank');
//
}
,
submitForm
(
formName
)
{
this
.
$refs
[
formName
].
validate
(
valid
=>
{
if
(
valid
)
{
if
(
this
.
isUpdate
)
{
this
.
fetchUpdateMeeting
()
}
else
{
this
.
fetchCreateMeeting
()
}
}
else
{
return
false
}
}
)
}
,
resetForm
(
formName
)
{
this
.
$refs
[
formName
].
resetFields
()
}
,
goList
()
{
this
.
$router
.
push
(
'/calendar'
)
}
,
async
getDetailsData
(
params
)
{
const
details
=
await
this
.
fetchMeetingDetails
(
params
)
this
.
details
=
details
const
start
=
timeTrans
(
details
.
start_time
)
const
end
=
timeTrans
(
details
.
end_time
)
this
.
userid
=
details
.
userid
this
.
form
.
subject
=
details
.
subject
this
.
form
.
startDate
=
getYMDByDate
(
start
)
this
.
form
.
startTime
=
dateFormat
(
start
,
'{h
}
:{i
}
'
)
this
.
form
.
endDate
=
getYMDByDate
(
end
)
this
.
form
.
endTime
=
dateFormat
(
end
,
'{h
}
:{i
}
'
)
this
.
form
.
meeting_type
=
details
.
meeting_type
if
(
details
.
meeting_type
===
1
)
{
const
recurringRule
=
details
.
recurring_rule
this
.
form
.
recurring_type
=
recurringRule
.
recurring_type
this
.
form
.
until_type
=
recurringRule
.
until_type
if
(
recurringRule
.
until_type
===
0
)
{
this
.
form
.
until_date
=
timeTrans
(
recurringRule
.
until_date
)
}
else
{
this
.
form
.
until_count
=
recurringRule
.
until_count
}
}
if
(
details
.
password
)
{
this
.
form
.
password
=
details
.
password
this
.
form
.
hasPwd
=
true
}
const
setting
=
details
.
settings
this
.
form
.
auto_in_waiting_room
=
setting
.
auto_in_waiting_room
this
.
form
.
allow_in_before_host
=
setting
.
allow_in_before_host
this
.
form
.
auto_record_type
=
setting
.
auto_record_type
if
(
setting
.
auto_record_type
!==
'none'
)
{
this
.
form
.
auto_record
=
true
}
this
.
form
.
mute_enable_join
=
setting
.
mute_enable_join
if
(
details
.
enable_live
===
1
)
{
const
liveConfig
=
details
.
live_config
this
.
form
.
live_subject
=
liveConfig
.
live_subject
this
.
form
.
live_summary
=
liveConfig
.
live_summary
this
.
form
.
enable_live_password
=
Boolean
(
liveConfig
.
live_password
)
this
.
form
.
live_password
=
liveConfig
.
live_password
this
.
form
.
enable_live_im
=
liveConfig
.
enable_live_im
this
.
form
.
enable_live
=
true
}
else
{
this
.
form
.
enable_live
=
false
}
if
(
Array
.
isArray
(
details
.
managers
)
&&
details
.
managers
.
length
>
0
)
{
const
_managers
=
details
.
managers
.
map
(
it
=>
it
.
user_id
)
this
.
form
.
managers
=
_managers
;
this
.
userList
=
details
.
managers
}
}
,
async
showMeetingDetails
(
obj
)
{
const
loading
=
this
.
$loading
({
lock
:
true
,
text
:
'获取腾讯会议详情,请稍后...'
,
spinner
:
'el-icon-loading'
,
background
:
'rgba(0, 0, 0, 0.7)'
}
);
const
params
=
{
meeting_id
:
obj
.
meeting_id
,
sub_meeting_id
:
(
obj
.
sub_meetings
&&
obj
.
sub_meetings
.
length
>
0
)
?
obj
.
sub_meetings
[
0
].
sub_meeting_id
:
undefined
}
const
details
=
await
this
.
fetchMeetingDetails
(
params
)
loading
.
close
()
this
.
details
=
details
this
.
dialogVisible
=
true
}
,
fetchMeetingList
()
{
const
date
=
this
.
form
.
startDate
const
start
=
dateFormat
(
date
)
const
end
=
dateFormat
(
new
Date
(
date
.
getFullYear
(),
date
.
getMonth
(),
date
.
getDate
()
+
1
))
const
params
=
{
userid
:
this
.
schedule
.
userid
,
start_time
:
start
,
end_time
:
end
}
getNonpagedMeetingList
(
params
).
then
((
res
)
=>
{
if
(
res
.
code
===
0
&&
res
.
data
&&
res
.
data
.
list
)
{
console
.
log
(
res
.
data
.
list
)
this
.
schedule
.
events
=
res
.
data
.
list
}
else
{
}
}
).
catch
()
}
,
fetchUserList
(
val
)
{
this
.
searchKeywordsCheckMsg
=
''
if
(
!
val
)
return
if
(
this
.
searchType
===
'email'
&&
!
EMAIL_REG
.
test
(
val
))
{
this
.
searchKeywordsCheckMsg
=
'邮箱格式错误'
this
.
userList
=
[]
}
else
if
(
this
.
searchType
===
'mobile'
&&
!
MOBILE_REG
.
test
(
val
))
{
this
.
searchKeywordsCheckMsg
=
'手机号格式错误'
this
.
userList
=
[]
}
else
{
const
params
=
{
[
this
.
searchType
]:
val
}
;
this
.
searchKeywordsCheckMsg
=
''
this
.
searchUsersloading
=
true
searchUserList
(
params
)
.
then
(
res
=>
{
this
.
searchUsersloading
=
false
if
(
res
.
data
&&
Array
.
isArray
(
res
.
data
.
items
))
{
this
.
userList
=
res
.
data
.
items
}
}
)
.
catch
(()
=>
{
}
)
}
}
,
getSubmitParams
()
{
const
form
=
this
.
form
const
params
=
{
instanceid
:
1
,
userid
:
this
.
showSchedule
?
this
.
schedule
.
userid
:
undefined
,
subject
:
form
.
subject
,
start_time
:
dateFormat
(
this
.
startTimestamp
),
end_time
:
dateFormat
(
this
.
endTimestamp
),
password
:
form
.
password
,
meeting_type
:
form
.
meeting_type
,
settings
:
{
mute_enable_join
:
form
.
mute_enable_join
,
auto_in_waiting_room
:
form
.
auto_in_waiting_room
,
allow_in_before_host
:
form
.
allow_in_before_host
,
auto_record_type
:
form
.
auto_record
?
form
.
auto_record_type
:
'none'
}
,
enable_live
:
form
.
enable_live
,
managers
:
form
.
managers
.
length
>
0
?
form
.
managers
:
[
this
.
user
.
id
]
}
if
(
form
.
meeting_type
===
1
)
{
params
.
recurring_rule
=
{
recurring_type
:
form
.
recurring_type
,
until_type
:
form
.
until_type
,
until_date
:
form
.
until_type
?
undefined
:
parseInt
(
form
.
until_date
/
1000
),
until_count
:
form
.
until_type
?
form
.
until_count
:
undefined
}
}
if
(
form
.
enable_live
)
{
params
.
live_config
=
{
live_subject
:
form
.
live_subject
,
live_summary
:
form
.
live_summary
,
enable_live_password
:
form
.
enable_live_password
,
live_password
:
form
.
enable_live_password
?
form
.
live_password
:
undefined
,
enable_live_im
:
form
.
enable_live_im
}
}
return
params
}
,
fetchUpdateMeeting
()
{
const
params
=
this
.
getSubmitParams
()
params
.
meeting_id
=
this
.
$route
.
query
.
meeting_id
params
.
userid
=
this
.
userid
const
loading
=
this
.
$loading
({
lock
:
true
,
text
:
'修改腾讯会议中,请稍后...'
,
spinner
:
'el-icon-loading'
,
background
:
'rgba(0, 0, 0, 0.7)'
}
)
updateMeeting
(
params
).
then
(
res
=>
{
loading
.
close
()
if
(
res
.
code
===
0
&&
res
.
data
&&
res
.
data
.
status
)
{
operateLog
({
type
:
`修改会议,被修改会议meeting_code:${this.details.meeting_code
}
`
,
user
:
this
.
user
}
)
this
.
$message
.
success
(
'修改腾讯会议成功'
)
console
.
log
(
this
.
details
)
console
.
log
(
params
)
this
.
details
.
subject
=
params
.
subject
this
.
details
.
start_time
=
timeTrans
(
params
.
start_time
)
this
.
details
.
end_time
=
timeTrans
(
params
.
end_time
)
this
.
dialogVisible
=
true
}
else
{
this
.
$message
.
error
(
res
.
message
||
res
.
msg
||
'创建腾讯会议失败'
)
}
}
)
}
,
fetchCreateMeeting
()
{
const
params
=
this
.
getSubmitParams
()
const
loading
=
this
.
$loading
({
lock
:
true
,
text
:
'创建腾讯会议中,请稍后...'
,
spinner
:
'el-icon-loading'
,
background
:
'rgba(0, 0, 0, 0.7)'
}
)
createMeeting
(
params
).
then
(
res
=>
{
loading
.
close
()
if
(
res
.
code
===
0
&&
res
.
data
.
id
)
{
operateLog
({
type
:
`创建会议,被创建会议meeting_code:${res.data.meeting_code
}
`
,
user
:
this
.
user
}
)
this
.
$message
.
success
(
'创建腾讯会议成功'
)
this
.
showMeetingDetails
(
res
.
data
)
}
else
{
this
.
$message
.
error
(
res
.
message
||
res
.
msg
||
'创建腾讯会议失败'
)
}
}
)
}
,
fetchMeetingDetails
(
params
)
{
return
new
Promise
((
resolve
,
reject
)
=>
{
getMeetingDetails
(
params
).
then
(
res
=>
{
if
(
res
.
code
===
0
&&
res
.
data
.
id
)
{
resolve
(
res
.
data
)
}
else
{
reject
(
res
)
}
}
).
catch
((
err
)
=>
reject
(
err
))
}
)
}
}
}
<
/script
>
<
style
scoped
>
.
tx
-
meeting
-
container
{
overflow
-
y
:
auto
;
height
:
calc
(
100
%
-
52
px
);
}
.
inner
{
display
:
flex
;
background
:
#
fff
;
margin
:
0
15
px
;
border
-
radius
:
4
px
;
padding
-
bottom
:
10
px
;
}
.
el
-
form
{
flex
:
1
;
max
-
width
:
600
px
;
padding
:
20
px
0
10
px
;
}
.
line
{
text
-
align
:
center
;
}
.
right
-
container
{
position
:
relative
;
width
:
45
%
;
box
-
sizing
:
border
-
box
;
padding
-
left
:
20
px
;
}
.
right
-
container
.
title
{
position
:
absolute
;
left
:
0
;
top
:
0
;
width
:
100
%
;
line
-
height
:
50
px
;
font
-
size
:
16
px
;
text
-
align
:
center
;
}
.
pre
-
time
-
range
{
position
:
absolute
;
left
:
70
px
;
width
:
calc
(
100
%
-
70
px
);
background
:
#
52
b837
;
}
.
search
-
keywords
-
checked
{
color
:
#
F56C6C
;
font
-
size
:
12
px
;
line
-
height
:
1
;
padding
-
top
:
4
px
;
position
:
absolute
;
top
:
100
%
;
right
:
0
;
}
.
right
-
container
.
el
-
scrollbar
::
v
-
deep
.
el
-
scrollbar__wrap
{
/* overflow:hidden; */
}
.
tx
-
meeting
-
container
::
v
-
deep
.
el
-
dialog__header
{
padding
-
top
:
14
px
;
}
.
tx
-
meeting
-
container
::
v
-
deep
.
el
-
dialog__headerbtn
{
top
:
12
px
;
right
:
12
px
;
}
.
tx
-
meeting
-
container
::
v
-
deep
.
el
-
dialog__body
{
padding
:
10
px
0
;
margin
:
0
20
px
;
border
:
1
px
solid
#
DBDBDB
;
}
.
tx
-
meeting
-
container
::
v
-
deep
.
el
-
dialog__footer
{
padding
-
bottom
:
16
px
;
}
.
tx
-
meeting
-
container
::
v
-
deep
.
el
-
dialog
.
el
-
form
-
item
{
margin
:
0
;
}
<
/style
>
src/pages/meeting/tencent-meeting-test/index.vue
deleted
100644 → 0
浏览文件 @
b8ed77c9
<
template
>
<component
v-bind:is=
"currentPage"
></component>
</
template
>
<
script
>
import
PageCreate
from
'./page-create'
import
PageAccountCreate
from
'./page-account-create'
import
PageUpdate
from
'./page-update'
export
default
{
data
()
{
return
{
currentPage
:
'PageCreate'
}
},
components
:
{
PageCreate
,
PageAccountCreate
,
PageUpdate
},
watch
:
{
$route
:
{
handler
:
function
(
nv
,
ov
)
{
const
query
=
this
.
$route
.
query
console
.
log
(
query
)
if
(
query
.
type
===
'1'
)
{
this
.
currentPage
=
'PageAccountCreate'
}
else
if
(
query
.
type
===
'2'
)
{
console
.
log
(
'edit'
)
this
.
currentPage
=
'PageUpdate'
}
else
{
this
.
currentPage
=
'PageCreate'
}
},
immediate
:
true
}
}
}
</
script
>
\ No newline at end of file
src/pages/meeting/tencent-meeting-test/page-account-create.vue
deleted
100644 → 0
浏览文件 @
b8ed77c9
<
template
>
<div>
同一账号下创建
</div>
</
template
>
<
script
>
export
default
({
data
()
{
return
{}
}
})
</
script
>
<
style
scoped
>
</
style
>
\ No newline at end of file
src/pages/meeting/tencent-meeting-test/page-create.vue
deleted
100644 → 0
浏览文件 @
b8ed77c9
<
template
>
<div
class=
"create"
>
<div
class=
"inner"
>
<meeting-form></meeting-form>
</div>
</div>
</
template
>
<
script
>
import
MeetingForm
from
'./components/MeetingForm'
export
default
({
data
()
{
return
{}
},
components
:
{
MeetingForm
}
})
</
script
>
<
style
scoped
>
.create
{
overflow-y
:
auto
;
height
:
calc
(
100%
-
52px
);
}
.inner
{
background
:
#fff
;
margin
:
0
15px
;
border-radius
:
4px
;
padding-bottom
:
10px
;
}
</
style
>
src/pages/meeting/tencent-meeting-test/page-update.vue
deleted
100644 → 0
浏览文件 @
b8ed77c9
<
template
>
<div>
修改
</div>
</
template
>
<
script
>
export
default
{
data
()
{
return
{
obj
:
{
timestamp
:
1618998029
,
nonce
:
'rgHMrr7Bg'
,
signature
:
'UG7wBenexQhiuD2wpCwuxkU0jqcj006d'
,
instanceid
:
1
,
userid
:
'6653195831513972736'
,
subject
:
'sewe'
,
start_time
:
'2021-04-21 17:30:00'
,
end_time
:
'2021-04-21 18:00:00'
,
password
:
''
,
meeting_type
:
1
,
recurring_rule
:
{
recurring_type
:
0
,
until_type
:
1
,
until_count
:
2
},
settings
:
{
mute_enable_join
:
false
,
auto_in_waiting_room
:
false
,
allow_in_before_host
:
true
,
auto_record_type
:
'none'
},
enable_live
:
0
,
live_config
:
{
live_subject
:
''
,
live_summary
:
''
,
enable_live_password
:
false
,
enable_live_im
:
false
},
managers
:
[
'6775725014348988416'
],
meeting_id
:
'8343776720283269132'
}
}
}
}
</
script
>
<
style
scoped
>
</
style
>
\ No newline at end of file
src/pages/meeting/tencent-meeting
-test
/components/MeetingForm.vue
→
src/pages/meeting/tencent-meeting/components/MeetingForm.vue
浏览文件 @
0bbc187f
<
template
>
<
template
>
<el-form
ref=
"ruleForm"
:model=
"form"
:rules=
"rules"
label-width=
"120px"
>
<el-form
ref=
"ruleForm"
:model=
"form"
:rules=
"rules"
label-width=
"130px"
>
<!--
<el-form-item
label=
"会议选择"
prop=
"meetingType"
>
<el-radio-group
v-model=
"form.meetingType"
>
<el-radio
label=
"tencent"
>
腾讯
</el-radio>
</el-radio-group>
</el-form-item>
-->
<el-form-item
label=
"会议主题"
prop=
"subject"
>
<el-form-item
label=
"会议主题"
prop=
"subject"
>
<el-input
v-model=
"form.subject"
size=
"small"
/>
<el-input
v-model=
"form.subject"
size=
"small"
/>
</el-form-item>
</el-form-item>
<el-form-item
label=
"开始时间"
required
>
<el-form-item
label=
"开始时间"
required
>
<el-col
:span=
"11"
>
<el-col
:span=
"11"
>
<el-form-item
prop=
"startDate"
>
<el-form-item
prop=
"startDate"
>
<el-date-picker
<el-date-picker
v-model=
"form.startDate"
type=
"date"
placeholder=
"选择日期"
style=
"width: 100%"
size=
"small"
:clearable=
"timerClear"
:editable=
"timerClear"
:picker-options=
"startDateOptions"
@
change=
"startDateChange"
/>
v-model=
"form.startDate"
type=
"date"
placeholder=
"选择日期"
style=
"width: 100%"
size=
"small"
:clearable=
"timerClear"
:editable=
"timerClear"
:picker-options=
"startDateOptions"
@
change=
"startDateChange"
/>
</el-form-item>
</el-form-item>
</el-col>
</el-col>
<el-col
:span=
"2"
class=
"line"
>
-
</el-col>
<el-col
:span=
"2"
class=
"line"
>
-
</el-col>
<el-col
:span=
"11"
>
<el-col
:span=
"11"
>
<el-form-item
prop=
"startTime"
>
<el-form-item
prop=
"startTime"
>
<el-time-select
<el-time-select
v-model=
"form.startTime"
style=
"width: 100%"
:picker-options=
"startTimeOptions"
placeholder=
"选择时间"
size=
"small"
:clearable=
"timerClear"
:editable=
"timerClear"
@
change=
"startTimeChange"
/>
v-model=
"form.startTime"
style=
"width: 100%"
:picker-options=
"startTimeOptions"
placeholder=
"选择时间"
size=
"small"
:clearable=
"timerClear"
:editable=
"timerClear"
@
change=
"startTimeChange"
/>
</el-form-item>
</el-form-item>
</el-col>
</el-col>
</el-form-item>
</el-form-item>
<el-form-item
label=
"结束时间"
required
>
<el-form-item
label=
"结束时间"
required
>
<el-col
:span=
"11"
>
<el-col
:span=
"11"
>
<el-form-item
prop=
"endDate"
>
<el-form-item
prop=
"endDate"
>
<el-date-picker
<el-date-picker
v-model=
"form.endDate"
type=
"date"
placeholder=
"选择日期"
style=
"width: 100%"
size=
"small"
:clearable=
"timerClear"
:editable=
"timerClear"
:picker-options=
"endDateOptions"
@
change=
"endDateChange"
/>
v-model=
"form.endDate"
type=
"date"
placeholder=
"选择日期"
style=
"width: 100%"
size=
"small"
:clearable=
"timerClear"
:editable=
"timerClear"
:picker-options=
"endDateOptions"
@
change=
"endDateChange"
/>
</el-form-item>
</el-form-item>
</el-col>
</el-col>
<el-col
:span=
"2"
class=
"line"
>
-
</el-col>
<el-col
:span=
"2"
class=
"line"
>
-
</el-col>
<el-col
:span=
"11"
>
<el-col
:span=
"11"
>
<el-form-item
prop=
"endTime"
>
<el-form-item
prop=
"endTime"
>
<el-time-select
<el-time-select
v-model=
"form.endTime"
style=
"width: 100%"
:picker-options=
"endTimeOptions"
placeholder=
"选择时间"
size=
"small"
:clearable=
"timerClear"
:editable=
"timerClear"
@
change=
"dateChange"
/>
v-model=
"form.endTime"
style=
"width: 100%"
:picker-options=
"endTimeOptions"
placeholder=
"选择时间"
size=
"small"
:clearable=
"timerClear"
:editable=
"timerClear"
/>
</el-form-item>
</el-form-item>
</el-col>
</el-col>
</el-form-item>
</el-form-item>
<el-form-item
label=
"时区"
required
>
<el-form-item
label=
"时区"
required
>
<el-col
:span=
"11"
>
<el-col>
<el-select
style=
"width: 100%"
v-model=
"form.timezone"
placeholder=
"选择时区"
size=
"small"
>
<el-select
style=
"width: 100%"
v-model=
"form.timezone"
placeholder=
"选择时区"
size=
"small"
>
<el-option
label=
"
(GMT+8:00)
中国标准时间-北京"
value=
"beijing"
/>
<el-option
label=
"
(GMT+8:00)
中国标准时间-北京"
value=
"beijing"
/>
</el-select>
</el-select>
</el-col>
</el-col>
</el-form-item>
</el-form-item>
<el-form-item
label=
"周期会议"
>
<el-form-item
label=
"周期会议"
>
<el-switch
v-model=
"form.meeting_type"
:active-value=
"1"
:inactive-value=
"0"
/>
<el-switch
v-model=
"form.meeting_type"
:active-value=
"1"
:inactive-value=
"0"
/>
</el-form-item>
</el-form-item>
<el-form-item
v-show=
"form.meeting_type"
style=
"margin: -20px 0 10px;"
>
<p>
{{
recurringTypeOptions
[
form
.
recurring_rule
.
recurring_type
]
}}
</p>
<p
style=
"line-height: 24px;color:#999;"
>
结束于
{{
form
.
recurring_rule
.
until_date
|
timeFormat
}}
{{
form
.
recurring_rule
.
until_count
}}
场会议
</p>
</el-form-item>
<el-form-item
label=
"重复频率"
v-if=
"form.meeting_type"
required
>
<el-form-item
label=
"重复频率"
v-if=
"form.meeting_type"
required
>
<el-col
:span=
"11"
>
<el-col
:span=
"11"
>
<el-select
<el-select
style=
"width: 100%"
v-model=
"form.recurring_rule.recurring_type"
placeholder=
"选择重复频率"
size=
"small"
@
change=
"recurringTypeChange"
>
style=
"width: 100%"
<el-option
:label=
"item"
:value=
"index"
v-for=
"(item, index) in recurringTypeOptions"
:key=
"index"
/>
v-model=
"form.recurring_type"
placeholder=
"选择重复频率"
size=
"small"
@
change=
"repaeatRateChange"
>
<el-option
label=
"每天"
:value=
"0"
/>
<el-option
label=
"每个工作日"
:value=
"1"
/>
<el-option
label=
"每周"
:value=
"2"
/>
<el-option
label=
"每两周"
:value=
"3"
/>
<el-option
label=
"每月"
:value=
"4"
/>
</el-select>
</el-select>
</el-col>
</el-col>
</el-form-item>
</el-form-item>
<el-form-item
label=
"结束重复"
v-if=
"form.meeting_type"
required
>
<el-form-item
label=
"结束重复"
v-if=
"form.meeting_type"
required
>
<el-col
:span=
"11"
>
<el-col
:span=
"11"
>
<el-select
style=
"width: 100%"
v-model=
"form.
until_type"
placeholder=
"选择时区
"
size=
"small"
>
<el-select
style=
"width: 100%"
v-model=
"form.
recurring_rule.until_type"
placeholder=
"请选择
"
size=
"small"
>
<el-option
label=
"结束于某天"
:value=
"0"
/>
<el-option
label=
"结束于某天"
:value=
"0"
/>
<el-option
label=
"限制会议次数"
:value=
"1"
/>
<el-option
label=
"限制会议次数"
:value=
"1"
/>
</el-select>
</el-select>
</el-col>
</el-col>
<el-col
:span=
"2"
class=
"line"
>
-
</el-col>
<el-col
:span=
"2"
class=
"line"
>
-
</el-col>
<el-col
:span=
"11"
>
<el-col
:span=
"11"
>
<el-date-picker
<el-date-picker
v-if=
"form.recurring_rule.until_type === 0"
v-model=
"form.recurring_rule.until_date"
type=
"date"
placeholder=
"选择结束日期"
style=
"width: 100%"
size=
"small"
:clearable=
"timerClear"
:editable=
"timerClear"
:picker-options=
"untilDateOptions"
@
change=
"setUntilCount"
/>
v-if=
"form.until_type === 0"
<el-input-number
v-else
v-model=
"form.recurring_rule.until_count"
:min=
"1"
:max=
"50"
size=
"small"
controls-position=
"right"
@
change=
"setUntilDate"
></el-input-number>
v-model=
"getCycleMeetingEndDate"
type=
"date"
placeholder=
"选择结束日期"
style=
"width: 100%"
size=
"small"
:clearable=
"timerClear"
:editable=
"timerClear"
:picker-options=
"untilDateOptions"
/>
<el-input-number
v-else
v-model=
"form.until_count"
:min=
"1"
:max=
"50"
size=
"small"
></el-input-number>
</el-col>
</el-col>
</el-form-item>
</el-form-item>
<!--
<el-form-item
label=
"指定主持人"
>
<el-col
:span=
"11"
>
<el-select
style=
"width:100%"
v-model=
"form.moderator"
placeholder=
"选择主持人"
size=
"small"
>
<el-option
:label=
"user.username"
:value=
"user.id"
v-for=
"user in userList"
:key=
"user.id"
/>
</el-select>
</el-col>
</el-form-item>
-->
<el-form-item
label=
"指定会议管理员"
>
<el-form-item
label=
"指定会议管理员"
>
<el-col
:span=
"11"
>
<p
style=
"line-height:24px;font-size:12px;"
>
(会议管理员有修改会议,复制、取消会议等所有管理本次会议的权限)
</p>
<el-select
<!--
<el-col
:span=
"8"
>
style=
"width: 100%"
<el-dropdown
style=
"width:100%;"
@
command=
"(val) => searchType = val"
>
v-model=
"form.managers"
<el-button
size=
"small"
style=
"width:calc(100% - 5px);"
>
placeholder=
"选择管理员"
{{
searchTypeOptions
[
searchType
]
}}
<i
class=
"el-icon-arrow-down el-icon--right"
></i>
size=
"small"
</el-button>
multiple
<el-dropdown-menu
slot=
"dropdown"
>
filterable
<el-dropdown-item
:command=
"key"
v-for=
"(value, key) in searchTypeOptions"
:key=
"key"
>
{{
value
}}
</el-dropdown-item>
remote
</el-dropdown-menu>
:remote-method=
"fetchUserList"
</el-dropdown>
:loading=
"searchUsersloading"
</el-col>
-->
>
<el-col
:span=
"24"
>
<el-option
:label=
"user.nickname"
:value=
"user.id"
v-for=
"user in userList"
:key=
"user.id"
/>
<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"
>
<span
style=
"float: left"
>
{{
user
.
username
}}
</span>
<span
style=
"float: right; color: #8492a6; font-size: 13px; margin:0 20px 0 10px;"
>
{{
user
.
id
}}
</span>
</el-option>
</el-select>
</el-select>
</el-col>
</el-col>
<el-col
:span=
"13"
style=
"color: #999; height: 40px; position: relative; font-size: 12px; line-height: 18px"
>
<span
style=
"position: absolute; left: 5px; top: 50%; transform: translateY(-50%)"
>
(会议管理员有修改会议,复制、取消会议等所有管理本次会议的权限)
</span
>
</el-col>
</el-form-item>
</el-form-item>
<el-form-item
label=
"会议设置"
>
<el-form-item
label=
"会议设置"
style=
"margin-bottom:2px;"
>
<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>
<el-input
</el-col>
style=
"width: 170px"
<el-col
:span=
"14"
>
v-model=
"form.password"
<el-form-item
v-if=
"form.hasPwd"
prop=
"password"
style=
"margin-bottom:0;"
>
v-if=
"form.hasPwd"
<el-input
style=
"width: 170px"
v-model=
"form.password"
placeholder=
"请输入4-6位数字密码"
type=
"password"
size=
"small"
:show-password=
"true"
@
input=
"val => form.password = val.replace(/[^\d.]/g, '')"
:maxlength=
"6"
/>
placeholder=
"请输入4-6位数字密码"
</el-form-item>
type=
"password"
</el-col>
suffix-icon=
"el-icon-lock"
</el-form-item>
size=
"small"
<el-form-item>
>
<el-checkbox
style=
"display: block"
v-model=
"form.settings.auto_in_waiting_room"
>
开启等候室
</el-checkbox>
</el-input>
<el-checkbox
style=
"display: block"
v-model=
"form.settings.allow_in_before_host"
<el-checkbox
style=
"display: block"
v-model=
"form.auto_in_waiting_room"
>
开启等候室
</el-checkbox>
<el-checkbox
style=
"display: block"
v-model=
"form.allow_in_before_host"
>
准许成员在主持人开始前进入会议
</el-checkbox
>
准许成员在主持人开始前进入会议
</el-checkbox
>
>
<el-checkbox
style=
"display: block"
v-model=
"form.mute_enable_join"
>
入会自动静音
</el-checkbox>
<el-checkbox
style=
"display: block"
v-model=
"form.
settings.
mute_enable_join"
>
入会自动静音
</el-checkbox>
<el-checkbox
v-model=
"form.auto_record"
@
change=
"autoRecordChange"
>
自动录制会议
</el-checkbox>
<el-checkbox
v-model=
"form.auto_record"
>
自动录制会议
</el-checkbox>
<el-radio-group
v-model=
"form.auto_record_type"
v-if=
"form.auto_record"
>
<el-radio-group
v-model=
"form.
settings.
auto_record_type"
v-if=
"form.auto_record"
>
<el-radio
label=
"local"
>
本地录制
</el-radio>
<el-radio
label=
"local"
>
本地录制
</el-radio>
<el-radio
label=
"cloud"
>
云录制
</el-radio>
<el-radio
label=
"cloud"
>
云录制
</el-radio>
</el-radio-group>
</el-radio-group>
...
@@ -176,44 +109,54 @@
...
@@ -176,44 +109,54 @@
<el-form-item
label=
"会议直播"
>
<el-form-item
label=
"会议直播"
>
<el-checkbox
v-model=
"form.enable_live"
>
开启会议直播(用于分享给观看直播的用户)
</el-checkbox>
<el-checkbox
v-model=
"form.enable_live"
>
开启会议直播(用于分享给观看直播的用户)
</el-checkbox>
</el-form-item>
</el-form-item>
<el-form-item
label=
"直播主题"
v-if=
"form.enable_live"
:required=
"form.enable_live"
prop=
"live_subject"
>
<el-form-item
label=
"直播主题"
v-if=
"form.enable_live"
:required=
"form.enable_live"
prop=
"live_
config.live_
subject"
>
<el-input
v-model=
"form.live_subject"
size=
"small"
/>
<el-input
v-model=
"form.live_
config.live_
subject"
size=
"small"
/>
</el-form-item>
</el-form-item>
<el-form-item
label=
"直播简介"
v-if=
"form.enable_live"
:required=
"form.enable_live"
prop=
"live_summary"
>
<el-form-item
label=
"直播简介"
v-if=
"form.enable_live"
:required=
"form.enable_live"
prop=
"live_
config.live_
summary"
>
<el-input
type=
"textarea"
v-model=
"form.live_summary"
></el-input>
<el-input
type=
"textarea"
v-model=
"form.live_
config.live_
summary"
></el-input>
</el-form-item>
</el-form-item>
<el-form-item
label=
"直播设置"
v-if=
"form.enable_live"
style=
"margin-bottom: 0"
>
<el-form-item
label=
"直播设置"
v-if=
"form.enable_live"
style=
"margin-bottom: 0"
>
<el-checkbox
style=
"width: 150px"
v-model=
"form.enable_live_password"
>
开启观看直播密码
</el-checkbox>
<el-col
:span=
"10"
>
<el-input
<el-checkbox
style=
"width: 150px"
v-model=
"form.live_config.enable_live_password"
>
开启观看直播密码
</el-checkbox>
style=
"width: 170px"
</el-col>
v-model=
"form.live_password"
<el-col
:span=
"14"
>
v-if=
"form.enable_live_password"
<el-form-item
v-if=
"form.live_config.enable_live_password"
prop=
"live_config.live_password"
style=
"margin-bottom:0;"
>
placeholder=
"请输入4-6位数字密码"
<el-input
style=
"width: 170px"
v-model=
"form.live_config.live_password"
placeholder=
"请输入4-6位数字密码"
type=
"password"
size=
"small"
:show-password=
"true"
@
input=
"val => form.live_config.live_password = val.replace(/[^\d.]/g, '')"
:maxlength=
"6"
/>
type=
"password"
</el-form-item>
suffix-icon=
"el-icon-lock"
</el-col>
size=
"small"
/>
</el-form-item>
</el-form-item>
<el-form-item
label=
""
v-if=
"form.enable_live"
>
<el-form-item
label=
""
v-if=
"form.enable_live"
>
<el-checkbox
v-model=
"form.enable_live_im"
>
准许观众讨论
</el-checkbox>
<el-checkbox
v-model=
"form.
live_config.
enable_live_im"
>
准许观众讨论
</el-checkbox>
</el-form-item>
</el-form-item>
<el-form-item
style=
"padding-left: 100px"
>
<el-form-item
style=
"padding-left: 100px"
>
<el-button
type=
"primary"
@
click=
"submitForm('ruleForm')"
size=
"mini"
>
立即创建
</el-button>
<el-button
type=
"primary"
@
click=
"submitForm('ruleForm')"
size=
"mini"
>
创建
</el-button>
<el-button
@
click=
"resetForm('ruleForm')"
size=
"mini"
>
重置
</el-button>
<!--
<el-button
@
click=
"resetForm('ruleForm')"
size=
"mini"
>
重置
</el-button>
-->
<el-button
@
click=
"goList"
size=
"mini"
>
取消
</el-button>
</el-form-item>
</el-form-item>
</el-form>
</el-form>
</
template
>
</
template
>
<
script
>
<
script
>
import
{
timeTrans
,
dateFormat
,
getYMDByDate
,
getTimestampYMD
,
getCurHalfHour
}
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
{
mapGetters
}
from
'vuex'
// 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{8}
$/
const
EMAIL_REG
=
/^
[
A-Za-z0-9
]
+
([
_.
][
A-Za-z0-9
]
+
)
*@
([
A-Za-z0-9-
]
+
\.)
+
[
A-Za-z
]{2,6}
$/
export
default
{
export
default
{
props
:
{
data
:
{
type
:
Object
},
users
:
{
type
:
Array
}
},
data
()
{
data
()
{
const
now
=
new
Date
()
const
now
=
new
Date
()
const
nowDate
=
getYMDByDate
(
now
)
const
nowDate
=
getYMDByDate
(
now
)
const
startDateChecked
=
(
rule
,
value
,
callback
)
=>
{
const
startDateChecked
=
(
rule
,
value
,
callback
)
=>
{
if
(
value
)
{
if
(
value
)
{
console
.
log
(
value
)
const
timestamp
=
Date
.
parse
(
value
)
const
timestamp
=
Date
.
parse
(
value
)
if
(
timestamp
<
Date
.
now
()
-
DAY_TIMESTAMP
)
{
if
(
timestamp
<
Date
.
now
()
-
DAY_TIMESTAMP
)
{
callback
(
new
Error
(
'开始时间必须大于当前时间'
))
callback
(
new
Error
(
'开始时间必须大于当前时间'
))
...
@@ -226,17 +169,40 @@ export default {
...
@@ -226,17 +169,40 @@ export default {
if
(
value
)
{
if
(
value
)
{
if
(
this
.
endTimestamp
<
this
.
startTimestamp
)
{
if
(
this
.
endTimestamp
<
this
.
startTimestamp
)
{
callback
(
new
Error
(
'结束时间必须大于开始时间'
))
callback
(
new
Error
(
'结束时间必须大于开始时间'
))
}
else
if
(
this
.
endTimestamp
>
this
.
startTimestamp
+
DAY_TIMESTAMP
)
{
}
else
if
(
this
.
endTimestamp
>
=
this
.
startTimestamp
+
DAY_TIMESTAMP
)
{
callback
(
new
Error
(
'会议时间不能超过24小时'
))
callback
(
new
Error
(
'会议时间不能超过24小时'
))
}
else
{
}
else
{
callback
()
callback
()
}
}
}
}
}
}
const
validatePwd
=
(
rule
,
value
,
callback
)
=>
{
let
errMsg
=
''
if
(
this
.
form
.
hasPwd
)
{
console
.
log
(
value
)
if
(
!
value
)
{
errMsg
=
'请输入密码'
}
else
if
(
value
.
length
<
4
)
{
errMsg
=
'密码长度过短'
}
}
errMsg
?
callback
(
new
Error
(
errMsg
))
:
callback
()
}
const
validateLivePwd
=
(
rule
,
value
,
callback
)
=>
{
let
errMsg
=
''
if
(
this
.
form
.
live_config
.
enable_live_password
)
{
if
(
!
value
)
{
errMsg
=
'请输入密码'
}
else
if
(
value
.
length
<
4
)
{
errMsg
=
'密码长度过短'
}
}
errMsg
?
callback
(
new
Error
(
errMsg
))
:
callback
()
}
const
validateErrMsg
=
(
rule
,
value
,
callback
)
=>
{
const
validateErrMsg
=
(
rule
,
value
,
callback
)
=>
{
// 当开启会议直播时,启用验证,处理callback
// 当开启会议直播时,启用验证,处理callback
if
(
this
.
form
.
isLiv
e
)
{
if
(
this
.
form
.
enable_live
&&
!
valu
e
)
{
const
errMsg
=
rule
.
field
===
'live
Theme
'
?
'请输入直播主题'
:
'请输入直播简介'
const
errMsg
=
rule
.
field
===
'live
_config.live_subject
'
?
'请输入直播主题'
:
'请输入直播简介'
callback
(
new
Error
(
errMsg
))
callback
(
new
Error
(
errMsg
))
}
else
{
}
else
{
callback
()
callback
()
...
@@ -244,9 +210,7 @@ export default {
...
@@ -244,9 +210,7 @@ export default {
}
}
return
{
return
{
timerClear
:
false
,
timerClear
:
false
,
time
:
''
,
form
:
{
form
:
{
meetingType
:
'tencent'
,
subject
:
''
,
subject
:
''
,
startDate
:
nowDate
,
startDate
:
nowDate
,
startTime
:
getCurHalfHour
(
'start'
),
startTime
:
getCurHalfHour
(
'start'
),
...
@@ -260,23 +224,15 @@ export default {
...
@@ -260,23 +224,15 @@ export default {
until_date
:
''
,
until_date
:
''
,
until_count
:
7
until_count
:
7
},
},
recurring_type
:
0
,
until_type
:
0
,
until_date
:
''
,
until_count
:
7
,
hasPwd
:
false
,
hasPwd
:
false
,
password
:
''
,
password
:
''
,
auto_record
:
true
,
settings
:
{
settings
:
{
auto_in_waiting_room
:
false
,
auto_in_waiting_room
:
false
,
allow_in_before_host
:
true
,
allow_in_before_host
:
true
,
auto_record_type
:
'cloud'
,
auto_record_type
:
'cloud'
,
mute_enable_join
:
false
mute_enable_join
:
false
},
},
auto_in_waiting_room
:
false
,
allow_in_before_host
:
false
,
auto_record_type
:
'cloud'
,
mute_enable_join
:
false
,
auto_record
:
false
,
enable_live
:
false
,
enable_live
:
false
,
live_config
:
{
live_config
:
{
live_subject
:
''
,
live_subject
:
''
,
...
@@ -284,17 +240,21 @@ export default {
...
@@ -284,17 +240,21 @@ export default {
enable_live_password
:
false
,
enable_live_password
:
false
,
live_password
:
''
,
live_password
:
''
,
enable_live_im
:
false
enable_live_im
:
false
}
},
},
live_subject
:
''
,
recurringTypeOptions
:
[
'每天'
,
'每个工作日'
,
'每周'
,
'每两周'
,
'每月'
],
live_summary
:
''
,
enable_live_password
:
false
,
live_password
:
''
,
enable_live_im
:
false
},
userList
:
[],
userList
:
[],
searchType
:
'username'
,
searchTypeOptions
:
{
username
:
'通过用户名搜索'
,
nickname
:
'通过昵称搜索'
,
email
:
'通过邮箱搜索'
,
mobile
:
'通过手机号搜索'
,
id
:
'通过ID搜索'
},
searchKeywordsCheckMsg
:
''
,
searchUsersloading
:
false
,
searchUsersloading
:
false
,
rules
:
{
rules
:
{
meetingType
:
[{
required
:
true
,
message
:
'请选择会议类型'
,
trigger
:
'blur'
}],
subject
:
[{
required
:
true
,
message
:
'请填写会议主题'
,
trigger
:
'blur'
}],
subject
:
[{
required
:
true
,
message
:
'请填写会议主题'
,
trigger
:
'blur'
}],
startDate
:
[
startDate
:
[
{
type
:
'date'
,
required
:
true
,
message
:
'请选择开始日期'
,
trigger
:
'change'
},
{
type
:
'date'
,
required
:
true
,
message
:
'请选择开始日期'
,
trigger
:
'change'
},
...
@@ -306,85 +266,74 @@ export default {
...
@@ -306,85 +266,74 @@ export default {
{
required
:
true
,
message
:
'请选择结束时间'
,
trigger
:
'change'
},
{
required
:
true
,
message
:
'请选择结束时间'
,
trigger
:
'change'
},
{
validator
:
endDateChecked
,
trigger
:
'change'
}
{
validator
:
endDateChecked
,
trigger
:
'change'
}
],
],
moderator
:
[{
required
:
true
,
message
:
'请选择主持人'
,
trigger
:
'change'
}],
password
:
[{
validator
:
validatePwd
,
trigger
:
'blur'
}],
liveTheme
:
[{
validator
:
validateErrMsg
}],
'live_config.live_subject'
:
[{
validator
:
validateErrMsg
}],
liveDesc
:
[{
validator
:
validateErrMsg
}]
'live_config.live_summary'
:
[{
validator
:
validateErrMsg
}],
'live_config.live_password'
:
[{
validator
:
validateLivePwd
,
trigger
:
'blur'
}]
}
}
},
},
startDateOptions
:
{
computed
:
{
...
mapGetters
([
'user'
]),
startDateOptions
()
{
return
{
disabledDate
(
time
)
{
disabledDate
(
time
)
{
return
time
.
getTime
()
<
Date
.
now
()
-
DAY_TIMESTAMP
return
time
.
getTime
()
<
Date
.
now
()
-
DAY_TIMESTAMP
}
}
}
},
},
startTimeOptions
:
{
startTimeOptions
()
{
start
:
getCurHalfHour
(
'start'
),
const
date
=
this
.
form
.
startDate
step
:
'00:30'
,
const
options
=
{
end
:
'23:30'
start
:
'00:00'
,
},
endTimeOptions
:
{
start
:
getCurHalfHour
(
'end'
),
step
:
'00:30'
,
step
:
'00:30'
,
end
:
'23:30'
end
:
'23:30'
},
monthMaxDay
:
28
,
_untilDateOptions
:
{
disabledDate
:
time
=>
{
let
flag
=
false
switch
(
this
.
form
.
recurring_type
)
{
case
0
:
{
break
}
case
1
:
{
if
(
time
.
getDay
()
===
5
||
time
.
getDay
()
===
6
)
flag
=
true
break
}
case
2
:
{
const
startDate
=
timeTrans
(
this
.
form
.
startDate
)
if
(
startDate
.
getDay
()
!==
time
.
getDay
()
||
getTimestampYMD
(
time
)
<
getTimestampYMD
(
startDate
))
flag
=
true
break
}
case
3
:
{
const
startDate
=
timeTrans
(
this
.
form
.
startDate
)
const
disabledDay
=
((
getTimestampYMD
(
time
)
-
getTimestampYMD
(
startDate
))
/
(
DAY_TIMESTAMP
*
7
))
%
2
!==
0
if
(
disabledDay
||
getTimestampYMD
(
time
)
<
getTimestampYMD
(
startDate
))
flag
=
true
break
}
case
4
:
{
const
startDate
=
timeTrans
(
this
.
form
.
startDate
)
const
day
=
startDate
.
getDate
()
const
targetDay
=
time
.
getDate
()
let
disabledDay
=
false
if
(
day
>
28
)
{
const
year
=
time
.
getFullYear
()
const
month
=
time
.
getMonth
()
+
1
const
targetMDays
=
new
Date
(
year
,
month
,
0
).
getDate
()
if
(
targetDay
!==
targetMDays
)
disabledDay
=
true
}
else
if
(
startDate
.
getDate
()
!==
targetDay
)
{
disabledDay
=
true
}
if
(
disabledDay
||
getTimestampYMD
(
time
)
<
getTimestampYMD
(
startDate
))
flag
=
true
break
}
}
return
flag
}
}
}
if
(
date
.
getTime
()
<=
Date
.
now
())
{
options
.
start
=
getCurHalfHour
(
'start'
)
}
}
return
options
},
},
computed
:
{
endDateOptions
()
{
endDateOptions
()
{
const
sD
ate
=
this
.
form
.
startDate
const
d
ate
=
this
.
form
.
startDate
return
{
return
{
disabledDate
(
time
)
{
disabledDate
(
time
)
{
return
(
return
(
getTimestampYMD
(
time
)
<
getTimestampYMD
(
sD
ate
)
||
getTimestampYMD
(
time
)
<
getTimestampYMD
(
d
ate
)
||
getTimestampYMD
(
time
)
>
getTimestampYMD
(
sD
ate
)
+
DAY_TIMESTAMP
getTimestampYMD
(
time
)
>
getTimestampYMD
(
d
ate
)
+
DAY_TIMESTAMP
)
)
}
}
}
}
},
},
endTimeOptions
()
{
const
{
startDate
,
endDate
,
startTime
}
=
this
.
form
const
fullDate
=
this
.
getFullDateTime
(
startDate
,
startTime
)
const
minutes
=
fullDate
.
getMinutes
()
let
options
if
(
this
.
isSameDate
(
startDate
,
endDate
))
{
// 结束日期和开始日期同一天,会议最低半小时,则向后推半小时
const
_date
=
fullDate
.
setMinutes
(
minutes
+
30
)
const
startTime
=
dateFormat
(
_date
,
'{h}:{i}'
)
options
=
{
start
:
startTime
,
step
:
'00:30'
,
end
:
'23:30'
}
}
else
{
// 结束时间和开始时间不能超过24小时,相隔一天,则向前推半小时
const
_date
=
fullDate
.
setMinutes
(
minutes
-
30
)
const
endTime
=
dateFormat
(
_date
,
'{h}:{i}'
)
options
=
{
start
:
'00:00'
,
step
:
'00:30'
,
end
:
endTime
}
}
return
options
},
untilDateOptions
()
{
untilDateOptions
()
{
const
form
=
this
.
form
const
form
=
this
.
form
const
type
=
form
.
recurring_type
const
type
=
form
.
recurring_
rule
.
recurring_
type
const
sDate
=
timeTrans
(
form
.
startDate
)
const
sDate
=
timeTrans
(
form
.
startDate
)
// const eDate = timeTrans(form.endDate)
// const eDate = timeTrans(form.endDate)
return
{
return
{
...
@@ -430,65 +379,104 @@ export default {
...
@@ -430,65 +379,104 @@ export default {
return
flag
return
flag
}
}
}
}
},
startTimestamp
()
{
return
this
.
getFullDateTime
(
this
.
form
.
startDate
,
this
.
form
.
startTime
).
getTime
()
},
endTimestamp
()
{
return
this
.
getFullDateTime
(
this
.
form
.
endDate
,
this
.
form
.
endTime
).
getTime
()
}
},
filters
:
{
timeFormat
(
val
,
fmt
)
{
fmt
=
fmt
||
'{y}年{m}月{d}日'
return
dateFormat
(
val
,
fmt
)
}
}
},
},
watch
:
{
watch
:
{
getCycleMeetingEndDate
:
{
data
:
{
handler
:
function
(
nv
,
ov
)
{
handler
:
function
(
val
)
{
this
.
form
.
until_date
=
Date
.
parse
(
nv
)
if
(
val
&&
val
.
startDate
)
{
this
.
userList
=
this
.
users
this
.
deepSet
(
this
.
form
,
val
)
if
(
val
.
meeting_type
===
1
)
{
val
.
recurring_rule
.
until_type
===
0
?
this
.
setUntilCount
()
:
this
.
setUntilDate
()
}
}
},
},
immediate
:
true
immediate
:
true
,
deep
:
true
}
}
},
},
created
()
{
this
.
setUntilDate
()
},
methods
:
{
methods
:
{
startDateChange
(
val
)
{
goList
()
{
this
.
form
.
endDate
=
val
this
.
$router
.
push
(
'/calendar'
)
const
_startDate
=
timeTrans
(
this
.
form
.
startDate
)
},
if
(
Date
.
parse
(
_startDate
)
>
Date
.
now
())
{
dateChange
()
{
this
.
startTimeOptions
=
{
const
dateObj
=
{
start
:
'00:00'
,
startDate
:
this
.
form
.
startDate
,
step
:
'00:30'
,
startTime
:
this
.
form
.
startTime
,
end
:
'23:30'
endDate
:
this
.
form
.
endDate
,
}
endTime
:
this
.
form
.
endTime
}
this
.
$emit
(
'dateChange'
,
dateObj
)
},
deepSet
(
obj
,
source
)
{
for
(
const
key
in
source
)
{
const
sourceVal
=
source
[
key
]
if
(
Array
.
isArray
(
sourceVal
))
{
obj
[
key
]
=
sourceVal
}
else
if
(
typeof
sourceVal
===
'object'
&&
!
(
sourceVal
instanceof
Date
))
{
const
val
=
obj
[
key
]
this
.
deepSet
(
val
,
sourceVal
)
}
else
{
}
else
{
this
.
startTimeOptions
=
{
obj
[
key
]
=
sourceVal
start
:
getCurHalfHour
(
'start'
),
step
:
'00:30'
,
end
:
'23:30'
}
}
}
if
(
this
.
showSchedule
)
{
this
.
fetchMeetingList
()
}
}
},
},
startTimeChange
(
val
)
{
startDateChange
(
val
)
{
this
.
form
.
endDate
=
val
this
.
startTimeChange
()
this
.
dateChange
()
},
startTimeChange
()
{
const
{
startDate
,
endDate
}
=
this
.
form
const
{
startDate
,
endDate
}
=
this
.
form
const
fullDate
=
this
.
getFullDateTime
(
startDate
,
val
)
if
(
this
.
isSameDate
(
startDate
,
endDate
))
{
if
(
this
.
isSameDate
(
startDate
,
endDate
))
{
const
startTime
=
getCurHalfHour
(
'end'
,
fullDate
)
this
.
form
.
endTime
=
this
.
endTimeOptions
.
start
this
.
form
.
endTime
=
startTime
this
.
endTimeOptions
=
{
start
:
startTime
,
step
:
'00:30'
,
end
:
'23:30'
}
}
else
{
}
else
{
const
endTime
=
getCurHalfHour
(
'start'
,
fullDate
)
this
.
form
.
endTime
=
this
.
endTimeOptions
.
end
this
.
form
.
endTime
=
endTime
this
.
endTimeOptions
=
{
start
:
'00:00'
,
step
:
'00:30'
,
end
:
endTime
}
}
}
this
.
dateChange
()
},
},
endDateChange
()
{
endDateChange
()
{
this
.
startTimeChange
(
this
.
form
.
startTime
)
this
.
startTimeChange
()
this
.
dateChange
()
},
},
re
paeatRateChange
(
val
)
{
re
curringTypeChange
(
)
{
if
(
val
===
'everyworkday'
&&
this
.
form
.
endType
===
'endOneday'
)
{
if
(
this
.
form
.
recurring_rule
.
until_type
===
0
)
{
this
.
form
.
periodicTimes
=
7
this
.
form
.
recurring_rule
.
until_count
=
7
}
}
this
.
setUntilDate
()
},
passwordInput
(
val
)
{
this
.
form
.
password
=
val
.
replace
(
/
[^\d
.
]
/g
,
''
)
},
setUntilDate
()
{
const
recurringType
=
this
.
form
.
recurring_rule
.
recurring_type
const
date
=
this
.
form
.
startDate
const
untilCount
=
this
.
form
.
recurring_rule
.
until_count
const
untilDate
=
computedDateByRateTimes
(
date
,
untilCount
,
recurringType
)
this
.
form
.
recurring_rule
.
until_date
=
untilDate
},
setUntilCount
()
{
const
recurringType
=
this
.
form
.
recurring_rule
.
recurring_type
const
date
=
this
.
form
.
startDate
const
untilDate
=
this
.
form
.
recurring_rule
.
until_date
const
untilCount
=
computedTimesByRateDate
(
date
,
untilDate
,
recurringType
)
this
.
form
.
recurring_rule
.
until_count
=
untilCount
},
},
getFullDateTime
(
date
,
timeStr
)
{
getFullDateTime
(
date
,
timeStr
)
{
const
hmArr
=
timeStr
.
split
(
':'
)
const
hmArr
=
timeStr
.
split
(
':'
)
...
@@ -499,39 +487,10 @@ export default {
...
@@ -499,39 +487,10 @@ export default {
isSameDate
(
start
,
end
)
{
isSameDate
(
start
,
end
)
{
return
dateFormat
(
start
,
'{y}-{m}-{d}'
)
===
dateFormat
(
end
,
'{y}-{m}-{d}'
)
return
dateFormat
(
start
,
'{y}-{m}-{d}'
)
===
dateFormat
(
end
,
'{y}-{m}-{d}'
)
},
},
autoRecordChange
(
val
)
{
this
.
auto_record_type
=
val
?
'cloud'
:
'none'
},
copyText
()
{
const
text
=
this
.
$refs
.
details
.
$el
.
innerText
this
.
copyFn
(
text
)
},
copyMeetingLink
()
{
this
.
copyFn
(
this
.
details
.
join_url
)
},
copyLiveLink
()
{
this
.
copyFn
(
this
.
details
.
live_config
.
live_addr
)
},
copyFn
(
val
)
{
if
(
!
val
)
return
const
dom
=
document
.
createElement
(
'textarea'
)
document
.
body
.
appendChild
(
dom
)
dom
.
value
=
val
dom
.
select
();
// 选择对象
document
.
execCommand
(
'Copy'
);
this
.
$message
({
message
:
'复制成功!'
,
type
:
'success'
})
document
.
body
.
removeChild
(
dom
)
},
joinMeeting
()
{
window
.
open
(
this
.
details
.
join_url
,
'_blank'
);
},
submitForm
(
formName
)
{
submitForm
(
formName
)
{
this
.
$refs
[
formName
].
validate
(
valid
=>
{
this
.
$refs
[
formName
].
validate
(
valid
=>
{
if
(
valid
)
{
if
(
valid
)
{
this
.
$
message
.
success
(
'验证通过'
)
this
.
$
emit
(
'submitForm'
,
this
.
getSubmitParams
()
)
}
else
{
}
else
{
return
false
return
false
}
}
...
@@ -540,11 +499,56 @@ export default {
...
@@ -540,11 +499,56 @@ export default {
resetForm
(
formName
)
{
resetForm
(
formName
)
{
this
.
$refs
[
formName
].
resetFields
()
this
.
$refs
[
formName
].
resetFields
()
},
},
fetchUserList
(
val
)
{
getSubmitParams
(
)
{
if
(
val
)
{
const
form
=
this
.
form
const
params
=
{
const
params
=
{
nickname
:
val
instanceid
:
1
,
subject
:
form
.
subject
,
start_time
:
dateFormat
(
this
.
startTimestamp
),
end_time
:
dateFormat
(
this
.
endTimestamp
),
meeting_type
:
form
.
meeting_type
,
enable_live
:
form
.
enable_live
,
managers
:
form
.
managers
.
length
>
0
?
form
.
managers
:
[
this
.
user
.
id
]
}
if
(
form
.
hasPwd
)
params
.
password
=
form
.
password
const
settings
=
{
...
form
.
settings
}
if
(
!
form
.
auto_record
)
settings
.
auto_record_type
=
'none'
params
.
settings
=
settings
if
(
form
.
meeting_type
===
1
)
{
const
rule
=
form
.
recurring_rule
console
.
log
(
rule
)
params
.
recurring_rule
=
{
recurring_type
:
rule
.
recurring_type
,
until_type
:
rule
.
until_type
}
if
(
rule
.
until_type
===
0
)
{
const
timestamp
=
timeTrans
(
rule
.
until_date
).
getTime
()
+
DAY_TIMESTAMP
params
.
recurring_rule
.
until_date
=
parseInt
(
timestamp
/
1000
)
}
else
{
params
.
recurring_rule
.
until_count
=
rule
.
until_count
}
}
if
(
form
.
enable_live
)
{
const
config
=
{
...
form
.
live_config
}
if
(
!
config
.
enable_live_password
)
delete
config
.
live_password
params
.
live_config
=
config
}
}
return
params
},
fetchUserList
(
val
)
{
this
.
searchKeywordsCheckMsg
=
''
if
(
!
val
)
return
if
(
this
.
searchType
===
'email'
&&
!
EMAIL_REG
.
test
(
val
))
{
this
.
searchKeywordsCheckMsg
=
'邮箱格式错误'
this
.
userList
=
[]
}
else
if
(
this
.
searchType
===
'mobile'
&&
!
MOBILE_REG
.
test
(
val
))
{
this
.
searchKeywordsCheckMsg
=
'手机号格式错误'
this
.
userList
=
[]
}
else
{
const
params
=
{
[
this
.
searchType
]:
val
};
this
.
searchKeywordsCheckMsg
=
''
this
.
searchUsersloading
=
true
this
.
searchUsersloading
=
true
searchUserList
(
params
)
searchUserList
(
params
)
.
then
(
res
=>
{
.
then
(
res
=>
{
...
@@ -562,10 +566,13 @@ export default {
...
@@ -562,10 +566,13 @@ export default {
<
style
scoped
>
<
style
scoped
>
.el-form
{
.el-form
{
flex
:
1
;
flex
:
1
;
max-width
:
60
0px
;
max-width
:
54
0px
;
padding
:
20px
0
10px
;
padding
:
20px
0
10px
;
}
}
.line
{
.line
{
text-align
:
center
;
text-align
:
center
;
}
}
.el-form
::v-deep
.el-input-number__increase
{
margin-top
:
1px
;
}
</
style
>
</
style
>
\ No newline at end of file
src/pages/meeting/tencent-meeting/index.vue
浏览文件 @
0bbc187f
<
template
>
<
template
>
<div
class=
"tx-meeting-container"
>
<component
v-bind:is=
"currentPage"
></component>
<div
class=
"inner"
>
<el-form
ref=
"ruleForm"
:model=
"form"
:rules=
"rules"
label-width=
"120px"
>
<el-form-item
label=
"会议主题"
prop=
"subject"
>
<el-input
v-model=
"form.subject"
size=
"small"
/>
</el-form-item>
<el-form-item
label=
"开始时间"
required
>
<el-col
:span=
"11"
>
<el-form-item
prop=
"startDate"
>
<el-date-picker
v-model=
"form.startDate"
type=
"date"
placeholder=
"选择日期"
style=
"width: 100%"
size=
"small"
:clearable=
"timerClear"
:editable=
"timerClear"
:picker-options=
"startDateOptions"
@
change=
"startDateChange"
/>
</el-form-item>
</el-col>
<el-col
:span=
"2"
class=
"line"
>
-
</el-col>
<el-col
:span=
"11"
>
<el-form-item
prop=
"startTime"
>
<el-time-select
v-model=
"form.startTime"
style=
"width: 100%"
:picker-options=
"startTimeOptions"
placeholder=
"选择时间"
size=
"small"
:clearable=
"timerClear"
:editable=
"timerClear"
@
change=
"startTimeChange"
/>
</el-form-item>
</el-col>
</el-form-item>
<el-form-item
label=
"结束时间"
required
>
<el-col
:span=
"11"
>
<el-form-item
prop=
"endDate"
>
<el-date-picker
v-model=
"form.endDate"
type=
"date"
placeholder=
"选择日期"
style=
"width: 100%"
size=
"small"
:clearable=
"timerClear"
:editable=
"timerClear"
:picker-options=
"endDateOptions"
@
change=
"endDateChange"
/>
</el-form-item>
</el-col>
<el-col
:span=
"2"
class=
"line"
>
-
</el-col>
<el-col
:span=
"11"
>
<el-form-item
prop=
"endTime"
>
<el-time-select
v-model=
"form.endTime"
style=
"width: 100%"
:picker-options=
"endTimeOptions"
placeholder=
"选择时间"
size=
"small"
:clearable=
"timerClear"
:editable=
"timerClear"
/>
</el-form-item>
</el-col>
</el-form-item>
<el-form-item
label=
"时区"
required
>
<el-col>
<el-select
style=
"width: 100%"
v-model=
"form.timezone"
placeholder=
"选择时区"
size=
"small"
>
<el-option
label=
"(GMT+8:00)中国标准时间-北京"
value=
"beijing"
/>
</el-select>
</el-col>
</el-form-item>
<el-form-item
label=
"周期会议"
>
<el-switch
v-model=
"form.meeting_type"
:active-value=
"1"
:inactive-value=
"0"
/>
</el-form-item>
<el-form-item
label=
"重复频率"
v-if=
"form.meeting_type"
required
>
<el-col
:span=
"11"
>
<el-select
style=
"width: 100%"
v-model=
"form.recurring_type"
placeholder=
"选择重复频率"
size=
"small"
@
change=
"repaeatRateChange"
>
<el-option
label=
"每天"
:value=
"0"
/>
<el-option
label=
"每个工作日"
:value=
"1"
/>
<el-option
label=
"每周"
:value=
"2"
/>
<el-option
label=
"每两周"
:value=
"3"
/>
<el-option
label=
"每月"
:value=
"4"
/>
</el-select>
</el-col>
</el-form-item>
<el-form-item
label=
"结束重复"
v-if=
"form.meeting_type"
required
>
<el-col
:span=
"11"
>
<el-select
style=
"width: 100%"
v-model=
"form.until_type"
placeholder=
"选择时区"
size=
"small"
>
<el-option
label=
"结束于某天"
:value=
"0"
/>
<el-option
label=
"限制会议次数"
:value=
"1"
/>
</el-select>
</el-col>
<el-col
:span=
"2"
class=
"line"
>
-
</el-col>
<el-col
:span=
"11"
>
<el-date-picker
v-if=
"form.until_type === 0"
v-model=
"getCycleMeetingEndDate"
type=
"date"
placeholder=
"选择结束日期"
style=
"width: 100%"
size=
"small"
:clearable=
"timerClear"
:editable=
"timerClear"
:picker-options=
"cycleMeetingEndDateOptions"
/>
<el-input-number
v-else
v-model=
"form.until_count"
:min=
"1"
:max=
"50"
size=
"small"
></el-input-number>
</el-col>
</el-form-item>
<!--
<el-form-item
label=
"指定主持人"
>
<el-col
:span=
"11"
>
<el-select
style=
"width:100%"
v-model=
"form.moderator"
placeholder=
"选择主持人"
size=
"small"
>
<el-option
:label=
"user.username"
:value=
"user.id"
v-for=
"user in userList"
:key=
"user.id"
/>
</el-select>
</el-col>
</el-form-item>
-->
<el-form-item
label=
"指定会议管理员"
>
<p
style=
"line-height:24px;"
>
(会议管理员有修改会议,复制、取消会议等所有管理本次会议的权限)
</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=
"16"
>
<el-select
style=
"width: 100%"
v-model=
"form.managers"
placeholder=
"请输入关键字搜索"
size=
"small"
multiple
filterable
remote
:remote-method=
"fetchUserList"
:loading=
"searchUsersloading"
>
<el-option
:label=
"user.nickname"
:value=
"user.id"
v-for=
"user in userList"
:key=
"user.id"
>
<span
style=
"float: left"
>
{{
user
.
nickname
}}
</span>
<span
style=
"float: right; color: #8492a6; font-size: 13px; margin:0 20px 0 10px;"
>
{{
user
.
id
}}
</span>
</el-option>
</el-select>
</el-col>
<p
class=
"search-keywords-checked"
v-if=
"searchKeywordsCheckMsg"
>
{{
searchKeywordsCheckMsg
}}
</p>
</el-form-item>
<el-form-item
label=
"会议设置"
>
<el-checkbox
style=
"width: 120px"
v-model=
"form.hasPwd"
>
开启会议密码
</el-checkbox>
<el-input
style=
"width: 170px"
v-model=
"form.password"
v-if=
"form.hasPwd"
placeholder=
"请输入4-6位数字密码"
type=
"password"
suffix-icon=
"el-icon-lock"
size=
"small"
>
</el-input>
<el-checkbox
style=
"display: block"
v-model=
"form.auto_in_waiting_room"
>
开启等候室
</el-checkbox>
<el-checkbox
style=
"display: block"
v-model=
"form.allow_in_before_host"
>
准许成员在主持人开始前进入会议
</el-checkbox
>
<el-checkbox
style=
"display: block"
v-model=
"form.mute_enable_join"
>
入会自动静音
</el-checkbox>
<el-checkbox
v-model=
"form.auto_record"
>
自动录制会议
</el-checkbox>
<el-radio-group
v-model=
"form.auto_record_type"
v-if=
"form.auto_record"
>
<el-radio
label=
"local"
>
本地录制
</el-radio>
<el-radio
label=
"cloud"
>
云录制
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item
label=
"会议直播"
>
<el-checkbox
v-model=
"form.enable_live"
>
开启会议直播(用于分享给观看直播的用户)
</el-checkbox>
</el-form-item>
<el-form-item
label=
"直播主题"
v-if=
"form.enable_live"
:required=
"form.enable_live"
prop=
"live_subject"
>
<el-input
v-model=
"form.live_subject"
size=
"small"
/>
</el-form-item>
<el-form-item
label=
"直播简介"
v-if=
"form.enable_live"
:required=
"form.enable_live"
prop=
"live_summary"
>
<el-input
type=
"textarea"
v-model=
"form.live_summary"
></el-input>
</el-form-item>
<el-form-item
label=
"直播设置"
v-if=
"form.enable_live"
style=
"margin-bottom: 0"
>
<el-checkbox
style=
"width: 150px"
v-model=
"form.enable_live_password"
>
开启观看直播密码
</el-checkbox>
<el-input
style=
"width: 170px"
v-model=
"form.live_password"
v-if=
"form.enable_live_password"
placeholder=
"请输入4-6位数字密码"
type=
"password"
suffix-icon=
"el-icon-lock"
size=
"small"
/>
</el-form-item>
<el-form-item
label=
""
v-if=
"form.enable_live"
>
<el-checkbox
v-model=
"form.enable_live_im"
>
准许观众讨论
</el-checkbox>
</el-form-item>
<el-form-item
style=
"padding-left: 100px"
>
<el-button
type=
"primary"
@
click=
"submitForm('ruleForm')"
size=
"mini"
>
{{
isUpdate
?
'修改会议'
:
'立即创建'
}}
</el-button>
<el-button
@
click=
"resetForm('ruleForm')"
size=
"mini"
>
重置
</el-button>
</el-form-item>
</el-form>
<div
class=
"right-container"
v-if=
"showSchedule"
>
<div
class=
"title"
>
{{
form
.
startDate
|
timeFormat
}}
{{
form
.
startDate
|
timeFormat
(
'星期{a
}
'
)
}}
<
/div
>
<
schedule
:
options
=
"options"
:
data
=
"schedule"
:
date
=
"form.startDate"
/>
<
div
class
=
"pre-time-range"
:
style
=
"{ top: getTop, height: getHeight
}
"
><
/div
>
<
/div
>
<
/div
>
<
meeting
-
success
-
dialog
:
dialogVisible
.
sync
=
"dialogVisible"
:
details
=
"details"
/>
<
/div
>
</
template
>
</
template
>
<
script
>
<
script
>
import
Schedule
from
'@/components/Schedule'
import
MeetingCreate
from
'./meeting-create'
import
MeetingSuccessDialog
from
'@/components/MeetingSuccessDialog/index'
import
MeetingAccountCreate
from
'./meeting-account-create'
import
{
import
MeetingUpdate
from
'./meeting-update'
timeTrans
,
dateFormat
,
getYMDByDate
,
getTimestampYMD
,
computedDateByRateTimes
,
computedTimesByRateDate
,
getCurHalfHour
,
isSameDate
}
from
'@/utils/dateAlgs'
import
{
searchUserList
,
createMeeting
,
operateLog
,
getMeetingDetails
,
getNonpagedMeetingList
,
updateMeeting
}
from
'@api/common'
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
{8
}
$/
const
EMAIL_REG
=
/^
[
A-Za-z0-9
]
+
([
_.
][
A-Za-z0-9
]
+
)
*@
([
A-Za-z0-9-
]
+
\.)
+
[
A-Za-z
]
{2,6
}
$/
export
default
{
export
default
{
data
()
{
data
()
{
const
now
=
new
Date
()
const
nowDate
=
getYMDByDate
(
now
)
const
startDateChecked
=
(
rule
,
value
,
callback
)
=>
{
if
(
value
)
{
const
timestamp
=
Date
.
parse
(
value
)
if
(
timestamp
<
Date
.
now
()
-
DAY_TIMESTAMP
)
{
callback
(
new
Error
(
'开始时间必须大于当前时间'
))
}
else
{
callback
()
}
}
}
const
endDateChecked
=
(
rule
,
value
,
callback
)
=>
{
if
(
value
)
{
if
(
this
.
endTimestamp
<
this
.
startTimestamp
)
{
callback
(
new
Error
(
'结束时间必须大于开始时间'
))
}
else
if
(
this
.
endTimestamp
>
this
.
startTimestamp
+
DAY_TIMESTAMP
)
{
callback
(
new
Error
(
'会议时间不能超过24小时'
))
}
else
{
callback
()
}
}
}
const
validateErrMsg
=
(
rule
,
value
,
callback
)
=>
{
// 当开启会议直播时,启用验证,处理callback
if
(
this
.
form
.
enable_live
&&
!
value
)
{
const
errMsg
=
rule
.
field
===
'live_subject'
?
'请输入直播主题'
:
'请输入直播简介'
callback
(
new
Error
(
errMsg
))
}
else
{
callback
()
}
}
return
{
timerClear
:
false
,
time
:
''
,
form
:
{
subject
:
''
,
startDate
:
nowDate
,
startTime
:
getCurHalfHour
(
'start'
),
endDate
:
nowDate
,
endTime
:
getCurHalfHour
(
'end'
),
timezone
:
'beijing'
,
meeting_type
:
0
,
recurring_type
:
0
,
until_type
:
0
,
until_date
:
''
,
until_count
:
7
,
managers
:
[],
hasPwd
:
false
,
password
:
''
,
auto_in_waiting_room
:
false
,
allow_in_before_host
:
true
,
auto_record
:
true
,
auto_record_type
:
'cloud'
,
mute_enable_join
:
false
,
enable_live
:
false
,
live_subject
:
''
,
live_summary
:
''
,
enable_live_password
:
false
,
live_password
:
''
,
enable_live_im
:
false
}
,
rules
:
{
subject
:
[{
required
:
true
,
message
:
'请填写会议主题'
,
trigger
:
'blur'
}
],
startDate
:
[
{
type
:
'date'
,
required
:
true
,
message
:
'请选择开始日期'
,
trigger
:
'change'
}
,
{
type
:
'date'
,
validator
:
startDateChecked
,
trigger
:
'change'
}
],
startTime
:
[{
required
:
true
,
message
:
'请选择开始时间'
,
trigger
:
'change'
}
],
endDate
:
[{
type
:
'date'
,
required
:
true
,
message
:
'请选择结束日期'
,
trigger
:
'change'
}
],
endTime
:
[
{
required
:
true
,
message
:
'请选择结束时间'
,
trigger
:
'change'
}
,
{
validator
:
endDateChecked
,
trigger
:
'change'
}
],
moderator
:
[{
required
:
true
,
message
:
'请选择主持人'
,
trigger
:
'change'
}
],
live_subject
:
[{
validator
:
validateErrMsg
}
],
live_summary
:
[{
validator
:
validateErrMsg
}
]
}
,
cycleMeetingEndDateOptions
:
{
disabledDate
:
time
=>
{
let
flag
=
false
switch
(
this
.
form
.
recurring_type
)
{
case
0
:
{
break
}
case
1
:
{
if
(
time
.
getDay
()
===
5
||
time
.
getDay
()
===
6
)
flag
=
true
break
}
case
2
:
{
const
startDate
=
timeTrans
(
this
.
form
.
startDate
)
if
(
startDate
.
getDay
()
!==
time
.
getDay
()
||
getTimestampYMD
(
time
)
<
getTimestampYMD
(
startDate
))
flag
=
true
break
}
case
3
:
{
const
startDate
=
timeTrans
(
this
.
form
.
startDate
)
const
disabledDay
=
((
getTimestampYMD
(
time
)
-
getTimestampYMD
(
startDate
))
/
(
DAY_TIMESTAMP
*
7
))
%
2
!==
0
if
(
disabledDay
||
getTimestampYMD
(
time
)
<
getTimestampYMD
(
startDate
))
flag
=
true
break
}
case
4
:
{
const
startDate
=
timeTrans
(
this
.
form
.
startDate
)
const
day
=
startDate
.
getDate
()
const
targetDay
=
time
.
getDate
()
let
disabledDay
=
false
if
(
day
>
28
)
{
const
year
=
time
.
getFullYear
()
const
month
=
time
.
getMonth
()
+
1
const
targetMDays
=
new
Date
(
year
,
month
,
0
).
getDate
()
if
(
targetDay
!==
targetMDays
)
disabledDay
=
true
}
else
if
(
startDate
.
getDate
()
!==
targetDay
)
{
disabledDay
=
true
}
if
(
disabledDay
||
getTimestampYMD
(
time
)
<
getTimestampYMD
(
startDate
))
flag
=
true
break
}
}
return
flag
}
}
,
userList
:
[],
searchType
:
'username'
,
searchTypeOptions
:
{
username
:
'通过用户名搜索'
,
nickname
:
'通过昵称搜索'
,
email
:
'通过邮箱搜索'
,
mobile
:
'通过手机号搜索'
,
id
:
'通过ID搜索'
}
,
searchKeywordsCheckMsg
:
''
,
searchUsersloading
:
false
,
showSchedule
:
false
,
options
:
{
multi
:
false
,
// 是否为多日程
start
:
0
,
// init number 0-23
end
:
24
,
// init number 1-24且end>start
step
:
60
,
// 只接收15, 30, 60三种步伐
lineHeight
:
40
,
// init number 时间线间的高度
nowBeforeDisabled
:
true
,
readonly
:
true
,
popoverPos
:
'bottom'
}
,
schedule
:
{
userid
:
''
,
events
:
[]
}
,
dialogVisible
:
false
,
details
:
{
}
,
isUpdate
:
false
,
userid
:
''
}
}
,
computed
:
{
user
()
{
return
this
.
$store
.
getters
.
user
}
,
getTop
()
{
const
timeRange
=
this
.
startTimestamp
-
this
.
startDotTimestamp
const
top
=
timeRange
/
((
60
*
1000
*
this
.
options
.
step
)
/
this
.
options
.
lineHeight
)
return
top
+
56
+
'px'
}
,
getHeight
()
{
const
start
=
timeTrans
(
this
.
startTimestamp
)
let
end
=
timeTrans
(
this
.
endTimestamp
)
if
(
!
isSameDate
(
start
,
end
))
{
end
=
new
Date
(
start
.
getFullYear
(),
start
.
getMonth
(),
start
.
getDate
(),
24
,
0
,
0
)
}
const
timeRange
=
end
.
getTime
()
-
start
.
getTime
()
const
h
=
timeRange
/
((
60
*
1000
*
this
.
options
.
step
)
/
this
.
options
.
lineHeight
)
return
h
-
2
+
'px'
}
,
startDotTimestamp
()
{
const
date
=
this
.
form
.
startDate
const
startHour
=
parseInt
(
this
.
options
.
start
)
return
new
Date
(
date
.
getFullYear
(),
date
.
getMonth
(),
date
.
getDate
(),
startHour
,
0
,
0
).
getTime
()
}
,
startTimestamp
()
{
return
this
.
getFullDateTime
(
this
.
form
.
startDate
,
this
.
form
.
startTime
).
getTime
()
}
,
endTimestamp
()
{
return
this
.
getFullDateTime
(
this
.
form
.
endDate
,
this
.
form
.
endTime
).
getTime
()
}
,
getCycleMeetingEndDate
:
{
get
:
function
()
{
const
startDate
=
this
.
form
.
startDate
?
this
.
form
.
startDate
:
Date
.
now
()
return
computedDateByRateTimes
(
startDate
,
this
.
form
.
until_count
,
this
.
form
.
recurring_type
)
}
,
set
:
function
(
newValue
)
{
const
times
=
computedTimesByRateDate
(
this
.
form
.
startDate
,
newValue
,
this
.
form
.
recurring_type
)
this
.
form
.
until_count
=
times
}
}
,
startDateOptions
()
{
return
{
return
{
disabledDate
(
time
)
{
currentPage
:
'MeetingCreate'
return
time
.
getTime
()
<
Date
.
now
()
-
DAY_TIMESTAMP
}
}
}
},
},
startTimeOptions
()
{
components
:
{
MeetingCreate
,
MeetingAccountCreate
,
MeetingUpdate
},
const
date
=
this
.
form
.
startDate
const
options
=
{
start
:
'00:00'
,
step
:
'00:30'
,
end
:
'23:30'
}
if
(
date
.
getTime
()
<=
Date
.
now
())
{
options
.
start
=
getCurHalfHour
(
'start'
)
}
return
options
}
,
endDateOptions
()
{
const
_startDate
=
this
.
form
.
startDate
return
{
disabledDate
(
time
)
{
return
(
getTimestampYMD
(
time
)
<
getTimestampYMD
(
_startDate
)
||
getTimestampYMD
(
time
)
>
getTimestampYMD
(
_startDate
)
+
DAY_TIMESTAMP
)
}
}
}
,
endTimeOptions
()
{
const
{
startDate
,
endDate
,
startTime
}
=
this
.
form
const
fullDate
=
this
.
getFullDateTime
(
startDate
,
startTime
)
const
minutes
=
fullDate
.
getMinutes
()
let
options
if
(
this
.
isSameDate
(
startDate
,
endDate
))
{
// 结束日期和开始日期同一天,会议最低半小时,则向后推半小时
const
_date
=
fullDate
.
setMinutes
(
minutes
+
30
)
const
startTime
=
dateFormat
(
_date
,
'{h
}
:{i
}
'
)
options
=
{
start
:
startTime
,
step
:
'00:30'
,
end
:
'23:30'
}
}
else
{
// 结束时间和开始时间不能超过24小时,相隔一天,则向前推半小时
const
_date
=
fullDate
.
setMinutes
(
minutes
-
30
)
const
endTime
=
dateFormat
(
_date
,
'{h
}
:{i
}
'
)
options
=
{
start
:
'00:00'
,
step
:
'00:30'
,
end
:
endTime
}
}
return
options
}
}
,
filters
:
{
timeFormat
(
val
,
fmt
)
{
fmt
=
fmt
||
'{y
}
年{m
}
月{d
}
日'
return
dateFormat
(
val
,
fmt
)
}
}
,
components
:
{
Schedule
,
MeetingSuccessDialog
}
,
created
()
{
// this.getUserList()
}
,
watch
:
{
watch
:
{
getCycleMeetingEndDate
:
{
handler
:
function
(
nv
,
ov
)
{
this
.
form
.
until_date
=
Date
.
parse
(
nv
)
}
,
immediate
:
true
}
,
$route
:
{
$route
:
{
handler
:
function
()
{
handler
:
function
(
to
,
from
)
{
const
query
=
this
.
$route
.
query
if
(
to
&&
to
.
name
&&
[
'MeetingCreate'
,
'MeetingAccountCreate'
,
'MeetingUpdate'
].
includes
(
to
.
name
))
{
if
(
query
.
type
===
'1'
)
{
this
.
currentPage
=
to
.
name
this
.
showSchedule
=
true
this
.
form
.
startDate
=
getYMDByDate
(
query
.
start
)
this
.
form
.
startTime
=
dateFormat
(
query
.
start
,
'{h
}
:{i
}
'
)
this
.
form
.
endDate
=
getYMDByDate
(
query
.
end
)
this
.
form
.
endTime
=
dateFormat
(
query
.
end
,
'{h
}
:{i
}
'
)
this
.
schedule
.
userid
=
query
.
account
this
.
fetchMeetingList
()
}
else
if
(
query
.
type
===
'2'
)
{
const
params
=
{
meeting_id
:
query
.
meeting_id
,
sub_meeting_id
:
query
.
sub_meeting_id
}
this
.
isUpdate
=
true
this
.
getDetailsData
(
params
)
}
else
{
this
.
showSchedule
=
false
}
}
},
},
immediate
:
true
immediate
:
true
}
,
dialogVisible
:
{
handler
:
function
(
nv
)
{
if
(
!
nv
)
{
this
.
goList
()
}
}
}
}
,
methods
:
{
startDateChange
(
val
)
{
this
.
form
.
endDate
=
val
this
.
startTimeChange
()
if
(
this
.
showSchedule
)
{
this
.
fetchMeetingList
()
}
}
,
startTimeChange
()
{
const
{
startDate
,
endDate
}
=
this
.
form
if
(
this
.
isSameDate
(
startDate
,
endDate
))
{
this
.
form
.
endTime
=
this
.
endTimeOptions
.
start
}
else
{
this
.
form
.
endTime
=
this
.
endTimeOptions
.
end
}
}
,
endDateChange
()
{
this
.
startTimeChange
()
}
,
repaeatRateChange
(
val
)
{
if
(
val
===
'everyworkday'
&&
this
.
form
.
endType
===
'endOneday'
)
{
this
.
form
.
periodicTimes
=
7
}
}
,
getFullDateTime
(
date
,
timeStr
)
{
const
hmArr
=
timeStr
.
split
(
':'
)
const
h
=
parseInt
(
hmArr
[
0
])
const
s
=
parseInt
(
hmArr
[
1
])
return
new
Date
(
date
.
getFullYear
(),
date
.
getMonth
(),
date
.
getDate
(),
h
,
s
,
0
)
}
,
isSameDate
(
start
,
end
)
{
return
dateFormat
(
start
,
'{y
}
-{m
}
-{d
}
'
)
===
dateFormat
(
end
,
'{y
}
-{m
}
-{d
}
'
)
}
,
autoRecordChange
(
val
)
{
this
.
auto_record_type
=
val
?
'cloud'
:
'none'
}
,
copyText
()
{
const
text
=
this
.
$refs
.
details
.
$el
.
innerText
this
.
copyFn
(
text
)
}
,
copyMeetingLink
()
{
this
.
copyFn
(
this
.
details
.
join_url
)
}
,
copyLiveLink
()
{
this
.
copyFn
(
this
.
details
.
live_config
.
live_addr
)
}
,
copyFn
(
val
)
{
if
(
!
val
)
return
const
dom
=
document
.
createElement
(
'textarea'
)
document
.
body
.
appendChild
(
dom
)
dom
.
value
=
val
dom
.
select
();
// 选择对象
document
.
execCommand
(
'Copy'
);
this
.
$message
({
message
:
'复制成功!'
,
type
:
'success'
}
)
document
.
body
.
removeChild
(
dom
)
}
,
joinMeeting
()
{
window
.
open
(
this
.
details
.
join_url
,
'_blank'
);
}
,
submitForm
(
formName
)
{
this
.
$refs
[
formName
].
validate
(
valid
=>
{
if
(
valid
)
{
if
(
this
.
isUpdate
)
{
this
.
fetchUpdateMeeting
()
}
else
{
this
.
fetchCreateMeeting
()
}
}
else
{
return
false
}
}
)
}
,
resetForm
(
formName
)
{
this
.
$refs
[
formName
].
resetFields
()
}
,
goList
()
{
this
.
$router
.
push
(
'/calendar'
)
}
,
async
getDetailsData
(
params
)
{
const
details
=
await
this
.
fetchMeetingDetails
(
params
)
this
.
details
=
details
const
start
=
timeTrans
(
details
.
start_time
)
const
end
=
timeTrans
(
details
.
end_time
)
this
.
userid
=
details
.
userid
this
.
form
.
subject
=
details
.
subject
this
.
form
.
startDate
=
getYMDByDate
(
start
)
this
.
form
.
startTime
=
dateFormat
(
start
,
'{h
}
:{i
}
'
)
this
.
form
.
endDate
=
getYMDByDate
(
end
)
this
.
form
.
endTime
=
dateFormat
(
end
,
'{h
}
:{i
}
'
)
this
.
form
.
meeting_type
=
details
.
meeting_type
if
(
details
.
meeting_type
===
1
)
{
const
recurringRule
=
details
.
recurring_rule
this
.
form
.
recurring_type
=
recurringRule
.
recurring_type
this
.
form
.
until_type
=
recurringRule
.
until_type
if
(
recurringRule
.
until_type
===
0
)
{
this
.
form
.
until_date
=
timeTrans
(
recurringRule
.
until_date
)
}
else
{
this
.
form
.
until_count
=
recurringRule
.
until_count
}
}
if
(
details
.
password
)
{
this
.
form
.
password
=
details
.
password
this
.
form
.
hasPwd
=
true
}
const
setting
=
details
.
settings
this
.
form
.
auto_in_waiting_room
=
setting
.
auto_in_waiting_room
this
.
form
.
allow_in_before_host
=
setting
.
allow_in_before_host
this
.
form
.
auto_record_type
=
setting
.
auto_record_type
if
(
setting
.
auto_record_type
!==
'none'
)
{
this
.
form
.
auto_record
=
true
}
this
.
form
.
mute_enable_join
=
setting
.
mute_enable_join
if
(
details
.
enable_live
===
1
)
{
const
liveConfig
=
details
.
live_config
this
.
form
.
live_subject
=
liveConfig
.
live_subject
this
.
form
.
live_summary
=
liveConfig
.
live_summary
this
.
form
.
enable_live_password
=
Boolean
(
liveConfig
.
live_password
)
this
.
form
.
live_password
=
liveConfig
.
live_password
this
.
form
.
enable_live_im
=
liveConfig
.
enable_live_im
this
.
form
.
enable_live
=
true
}
else
{
this
.
form
.
enable_live
=
false
}
if
(
Array
.
isArray
(
details
.
managers
)
&&
details
.
managers
.
length
>
0
)
{
const
_managers
=
details
.
managers
.
map
(
it
=>
it
.
user_id
)
this
.
form
.
managers
=
_managers
;
this
.
userList
=
details
.
managers
}
}
,
async
showMeetingDetails
(
obj
)
{
const
loading
=
this
.
$loading
({
lock
:
true
,
text
:
'获取腾讯会议详情,请稍后...'
,
spinner
:
'el-icon-loading'
,
background
:
'rgba(0, 0, 0, 0.7)'
}
);
const
params
=
{
meeting_id
:
obj
.
meeting_id
,
sub_meeting_id
:
(
obj
.
sub_meetings
&&
obj
.
sub_meetings
.
length
>
0
)
?
obj
.
sub_meetings
[
0
].
sub_meeting_id
:
undefined
}
const
details
=
await
this
.
fetchMeetingDetails
(
params
)
loading
.
close
()
this
.
details
=
details
this
.
dialogVisible
=
true
}
,
fetchMeetingList
()
{
const
date
=
this
.
form
.
startDate
const
start
=
dateFormat
(
date
)
const
end
=
dateFormat
(
new
Date
(
date
.
getFullYear
(),
date
.
getMonth
(),
date
.
getDate
()
+
1
))
const
params
=
{
userid
:
this
.
schedule
.
userid
,
start_time
:
start
,
end_time
:
end
}
getNonpagedMeetingList
(
params
).
then
((
res
)
=>
{
if
(
res
.
code
===
0
&&
res
.
data
&&
res
.
data
.
list
)
{
console
.
log
(
res
.
data
.
list
)
this
.
schedule
.
events
=
res
.
data
.
list
}
else
{
}
}
).
catch
()
}
,
fetchUserList
(
val
)
{
this
.
searchKeywordsCheckMsg
=
''
if
(
!
val
)
return
if
(
this
.
searchType
===
'email'
&&
!
EMAIL_REG
.
test
(
val
))
{
this
.
searchKeywordsCheckMsg
=
'邮箱格式错误'
this
.
userList
=
[]
}
else
if
(
this
.
searchType
===
'mobile'
&&
!
MOBILE_REG
.
test
(
val
))
{
this
.
searchKeywordsCheckMsg
=
'手机号格式错误'
this
.
userList
=
[]
}
else
{
const
params
=
{
[
this
.
searchType
]:
val
}
;
this
.
searchKeywordsCheckMsg
=
''
this
.
searchUsersloading
=
true
searchUserList
(
params
)
.
then
(
res
=>
{
this
.
searchUsersloading
=
false
if
(
res
.
data
&&
Array
.
isArray
(
res
.
data
.
items
))
{
this
.
userList
=
res
.
data
.
items
}
}
)
.
catch
(()
=>
{
}
)
}
}
,
getSubmitParams
()
{
const
form
=
this
.
form
const
params
=
{
instanceid
:
1
,
userid
:
this
.
showSchedule
?
this
.
schedule
.
userid
:
undefined
,
subject
:
form
.
subject
,
start_time
:
dateFormat
(
this
.
startTimestamp
),
end_time
:
dateFormat
(
this
.
endTimestamp
),
password
:
form
.
password
,
meeting_type
:
form
.
meeting_type
,
settings
:
{
mute_enable_join
:
form
.
mute_enable_join
,
auto_in_waiting_room
:
form
.
auto_in_waiting_room
,
allow_in_before_host
:
form
.
allow_in_before_host
,
auto_record_type
:
form
.
auto_record
?
form
.
auto_record_type
:
'none'
}
,
enable_live
:
form
.
enable_live
,
managers
:
form
.
managers
.
length
>
0
?
form
.
managers
:
[
this
.
user
.
id
]
}
if
(
form
.
meeting_type
===
1
)
{
params
.
recurring_rule
=
{
recurring_type
:
form
.
recurring_type
,
until_type
:
form
.
until_type
,
until_date
:
form
.
until_type
?
undefined
:
parseInt
(
form
.
until_date
/
1000
),
until_count
:
form
.
until_type
?
form
.
until_count
:
undefined
}
}
if
(
form
.
enable_live
)
{
params
.
live_config
=
{
live_subject
:
form
.
live_subject
,
live_summary
:
form
.
live_summary
,
enable_live_password
:
form
.
enable_live_password
,
live_password
:
form
.
enable_live_password
?
form
.
live_password
:
undefined
,
enable_live_im
:
form
.
enable_live_im
}
}
return
params
}
,
fetchUpdateMeeting
()
{
const
params
=
this
.
getSubmitParams
()
params
.
meeting_id
=
this
.
$route
.
query
.
meeting_id
params
.
userid
=
this
.
userid
const
loading
=
this
.
$loading
({
lock
:
true
,
text
:
'修改腾讯会议中,请稍后...'
,
spinner
:
'el-icon-loading'
,
background
:
'rgba(0, 0, 0, 0.7)'
}
)
updateMeeting
(
params
).
then
(
res
=>
{
loading
.
close
()
if
(
res
.
code
===
0
&&
res
.
data
&&
res
.
data
.
status
)
{
operateLog
({
type
:
`修改会议,被修改会议meeting_code:${this.details.meeting_code
}
`
,
user
:
this
.
user
}
)
this
.
$message
.
success
(
'修改腾讯会议成功'
)
console
.
log
(
this
.
details
)
console
.
log
(
params
)
this
.
details
.
subject
=
params
.
subject
this
.
details
.
start_time
=
timeTrans
(
params
.
start_time
)
this
.
details
.
end_time
=
timeTrans
(
params
.
end_time
)
this
.
dialogVisible
=
true
}
else
{
this
.
$message
.
error
(
res
.
message
||
res
.
msg
||
'创建腾讯会议失败'
)
}
}
)
}
,
fetchCreateMeeting
()
{
const
params
=
this
.
getSubmitParams
()
const
loading
=
this
.
$loading
({
lock
:
true
,
text
:
'创建腾讯会议中,请稍后...'
,
spinner
:
'el-icon-loading'
,
background
:
'rgba(0, 0, 0, 0.7)'
}
)
createMeeting
(
params
).
then
(
res
=>
{
loading
.
close
()
if
(
res
.
code
===
0
&&
res
.
data
.
id
)
{
operateLog
({
type
:
`创建会议,被创建会议meeting_code:${res.data.meeting_code
}
`
,
user
:
this
.
user
}
)
this
.
$message
.
success
(
'创建腾讯会议成功'
)
this
.
showMeetingDetails
(
res
.
data
)
}
else
{
this
.
$message
.
error
(
res
.
message
||
res
.
msg
||
'创建腾讯会议失败'
)
}
}
)
}
,
fetchMeetingDetails
(
params
)
{
return
new
Promise
((
resolve
,
reject
)
=>
{
getMeetingDetails
(
params
).
then
(
res
=>
{
if
(
res
.
code
===
0
&&
res
.
data
.
id
)
{
resolve
(
res
.
data
)
}
else
{
reject
(
res
)
}
}
).
catch
((
err
)
=>
reject
(
err
))
}
)
}
}
}
}
}
}
</
script
>
</
script
>
<
style
scoped
>
<
style
>
.
tx
-
meeting
-
container
{
.meeting-success-dialog
::v-deep
.el-dialog__header
{
overflow
-
y
:
auto
;
height
:
calc
(
100
%
-
52
px
);
}
.
inner
{
display
:
flex
;
background
:
#
fff
;
margin
:
0
15
px
;
border
-
radius
:
4
px
;
padding
-
bottom
:
10
px
;
}
.
el
-
form
{
flex
:
1
;
max
-
width
:
600
px
;
padding
:
20
px
0
10
px
;
}
.
line
{
text
-
align
:
center
;
}
.
right
-
container
{
position
:
relative
;
width
:
45
%
;
box
-
sizing
:
border
-
box
;
padding
-
left
:
20
px
;
}
.
right
-
container
.
title
{
position
:
absolute
;
left
:
0
;
top
:
0
;
width
:
100
%
;
line
-
height
:
50
px
;
font
-
size
:
16
px
;
text
-
align
:
center
;
}
.
pre
-
time
-
range
{
position
:
absolute
;
left
:
70
px
;
width
:
calc
(
100
%
-
70
px
);
background
:
#
52
b837
;
}
.
search
-
keywords
-
checked
{
color
:
#
F56C6C
;
font
-
size
:
12
px
;
line
-
height
:
1
;
padding
-
top
:
4
px
;
position
:
absolute
;
top
:
100
%
;
right
:
0
;
}
.
right
-
container
.
el
-
scrollbar
::
v
-
deep
.
el
-
scrollbar__wrap
{
/* overflow:hidden; */
}
.
tx
-
meeting
-
container
::
v
-
deep
.
el
-
dialog__header
{
padding-top
:
14px
;
padding-top
:
14px
;
}
}
.
tx
-
meeting
-
container
::
v
-
deep
.
el
-
dialog__headerbtn
{
.
meeting-success-dialog
::v-deep
.el-dialog__headerbtn
{
top
:
12px
;
top
:
12px
;
right
:
12px
;
right
:
12px
;
}
}
.
tx
-
meeting
-
container
::
v
-
deep
.
el
-
dialog__body
{
.
meeting-success-dialog
::v-deep
.el-dialog__body
{
padding
:
10px
0
;
padding
:
10px
0
;
margin
:
0
20px
;
margin
:
0
20px
;
border
:
1px
solid
#DBDBDB
;
border
:
1px
solid
#DBDBDB
;
}
}
.
tx
-
meeting
-
container
::
v
-
deep
.
el
-
dialog__footer
{
.
meeting-success-dialog
::v-deep
.el-dialog__footer
{
padding-bottom
:
16px
;
padding-bottom
:
16px
;
}
}
.
tx
-
meeting
-
container
::
v
-
deep
.
el
-
dialog
.
el
-
form
-
item
{
.
meeting-success-dialog
::v-deep
.el-dialog
.el-form-item
{
margin
:
0
;
margin
:
0
;
}
}
</
style
>
</
style
>
\ No newline at end of file
src/pages/meeting/tencent-meeting/meeting-account-create.vue
0 → 100644
浏览文件 @
0bbc187f
<
template
>
<div
class=
"meeting-account-create"
>
<div
class=
"inner"
>
<meeting-form
:data=
"reviewData"
:users=
"userList"
@
submitForm=
"handleSubmit"
@
dateChange=
"handleDateChange"
></meeting-form>
<div
class=
"right-container"
>
<div
class=
"title"
>
{{
reviewData
.
startDate
|
timeFormat
}}
{{
reviewData
.
startDate
|
timeFormat
(
'星期{a
}
'
)
}}
<
/div
>
<
schedule
:
options
=
"options"
:
data
=
"schedule"
:
date
=
"reviewData.startDate"
/>
<
div
class
=
"pre-time-range"
:
style
=
"{ top: getTop, height: getHeight
}
"
><
/div
>
<
/div
>
<
/div
>
<
meeting
-
success
-
dialog
:
dialogVisible
.
sync
=
"dialogVisible"
:
details
=
"details"
/>
<
/div
>
<
/template
>
<
script
>
import
Schedule
from
'@/components/Schedule'
import
MeetingForm
from
'./components/MeetingForm'
import
MeetingSuccessDialog
from
'@/components/MeetingSuccessDialog/index'
import
{
createMeeting
,
operateLog
,
getMeetingDetails
,
getNonpagedMeetingList
}
from
'@api/common'
import
{
timeTrans
,
getYMDByDate
,
dateFormat
,
isSameDate
}
from
'@/utils/dateAlgs'
import
{
mapGetters
}
from
'vuex'
export
default
({
data
()
{
return
{
dialogVisible
:
false
,
reviewData
:
{
startDate
:
''
,
startTime
:
''
,
endDate
:
''
,
endTime
:
''
}
,
userList
:
[],
details
:
{
}
,
userid
:
''
,
options
:
{
multi
:
false
,
// 是否为多日程
start
:
0
,
// init number 0-23
end
:
24
,
// init number 1-24且end>start
step
:
60
,
// 只接收15, 30, 60三种步伐
lineHeight
:
40
,
// init number 时间线间的高度
nowBeforeDisabled
:
true
,
readonly
:
true
,
popoverPos
:
'bottom'
}
,
schedule
:
{
userid
:
''
,
events
:
[]
}
}
}
,
computed
:
{
...
mapGetters
([
'user'
]),
startTimestamp
()
{
return
this
.
getFullDateTime
(
this
.
reviewData
.
startDate
,
this
.
reviewData
.
startTime
).
getTime
()
}
,
endTimestamp
()
{
return
this
.
getFullDateTime
(
this
.
reviewData
.
endDate
,
this
.
reviewData
.
endTime
).
getTime
()
}
,
getTop
()
{
const
timeRange
=
this
.
startTimestamp
-
this
.
startDotTimestamp
const
top
=
timeRange
/
((
60
*
1000
*
this
.
options
.
step
)
/
this
.
options
.
lineHeight
)
return
top
+
56
+
'px'
}
,
getHeight
()
{
const
start
=
timeTrans
(
this
.
startTimestamp
)
let
end
=
timeTrans
(
this
.
endTimestamp
)
if
(
!
isSameDate
(
start
,
end
))
{
end
=
new
Date
(
start
.
getFullYear
(),
start
.
getMonth
(),
start
.
getDate
(),
24
,
0
,
0
)
}
const
timeRange
=
end
.
getTime
()
-
start
.
getTime
()
const
h
=
timeRange
/
((
60
*
1000
*
this
.
options
.
step
)
/
this
.
options
.
lineHeight
)
return
h
-
2
+
'px'
}
,
startDotTimestamp
()
{
const
date
=
this
.
reviewData
.
startDate
const
startHour
=
parseInt
(
this
.
options
.
start
)
return
new
Date
(
date
.
getFullYear
(),
date
.
getMonth
(),
date
.
getDate
(),
startHour
,
0
,
0
).
getTime
()
}
}
,
filters
:
{
timeFormat
(
val
,
fmt
)
{
fmt
=
fmt
||
'{y
}
年{m
}
月{d
}
日'
return
dateFormat
(
val
,
fmt
)
}
}
,
components
:
{
Schedule
,
MeetingForm
,
MeetingSuccessDialog
}
,
created
()
{
const
query
=
this
.
$route
.
query
console
.
log
(
query
)
if
(
query
.
account
)
{
this
.
userid
=
query
.
account
const
review
=
{
}
review
.
subject
=
query
.
subject
review
.
startDate
=
getYMDByDate
(
query
.
start
)
review
.
startTime
=
dateFormat
(
query
.
start
,
'{h
}
:{i
}
'
)
review
.
endDate
=
getYMDByDate
(
query
.
end
)
review
.
endTime
=
dateFormat
(
query
.
end
,
'{h
}
:{i
}
'
)
if
(
query
.
enable_live
===
'1'
)
{
review
.
enable_live
=
true
review
.
live_config
=
{
live_subject
:
query
.
live_subject
||
''
,
live_summary
:
query
.
live_summary
||
''
}
}
this
.
reviewData
=
review
}
this
.
fetchMeetingList
()
}
,
watch
:
{
dialogVisible
:
{
handler
:
function
(
nv
)
{
if
(
!
nv
)
{
this
.
goList
()
}
}
}
}
,
methods
:
{
handleSubmit
(
params
)
{
this
.
fetchCreateMeeting
(
params
)
}
,
handleDateChange
(
val
)
{
let
refreshList
=
false
if
(
!
isSameDate
(
val
.
startDate
,
this
.
reviewData
.
startDate
))
{
refreshList
=
true
}
this
.
reviewData
.
startDate
=
val
.
startDate
this
.
reviewData
.
startTime
=
val
.
startTime
this
.
reviewData
.
endDate
=
val
.
endDate
this
.
reviewData
.
endTime
=
val
.
endTime
refreshList
&&
this
.
fetchMeetingList
()
}
,
getFullDateTime
(
date
,
timeStr
)
{
const
hmArr
=
timeStr
.
split
(
':'
)
const
h
=
parseInt
(
hmArr
[
0
])
const
s
=
parseInt
(
hmArr
[
1
])
return
new
Date
(
date
.
getFullYear
(),
date
.
getMonth
(),
date
.
getDate
(),
h
,
s
,
0
)
}
,
goList
()
{
this
.
$router
.
push
(
'/calendar'
)
}
,
async
showMeetingDetails
(
obj
)
{
const
loading
=
this
.
$loading
({
lock
:
true
,
text
:
'获取腾讯会议详情,请稍后...'
,
spinner
:
'el-icon-loading'
,
background
:
'rgba(0, 0, 0, 0.7)'
}
);
const
params
=
{
meeting_id
:
obj
.
meeting_id
}
if
(
Array
.
isArray
(
obj
.
sub_meetings
)
&&
obj
.
sub_meetings
.
length
>
0
)
{
params
.
sub_meeting_id
=
obj
.
sub_meetings
[
0
].
sub_meeting_id
}
const
details
=
await
this
.
fetchMeetingDetails
(
params
)
loading
.
close
()
this
.
details
=
details
this
.
dialogVisible
=
true
}
,
fetchCreateMeeting
(
params
)
{
const
loading
=
this
.
$loading
({
lock
:
true
,
text
:
'创建腾讯会议中,请稍后...'
,
spinner
:
'el-icon-loading'
,
background
:
'rgba(0, 0, 0, 0.7)'
}
)
params
.
userid
=
this
.
userid
createMeeting
(
params
).
then
(
res
=>
{
loading
.
close
()
if
(
res
.
code
===
0
&&
res
.
data
.
id
)
{
operateLog
({
type
:
`创建会议,被创建会议meeting_code:${res.data.meeting_code
}
`
,
user
:
this
.
user
}
)
this
.
$message
.
success
(
'创建腾讯会议成功'
)
this
.
showMeetingDetails
(
res
.
data
)
}
else
{
this
.
$message
.
error
(
res
.
message
||
res
.
msg
||
'创建腾讯会议失败'
)
}
}
)
}
,
fetchMeetingDetails
(
params
)
{
return
new
Promise
((
resolve
,
reject
)
=>
{
getMeetingDetails
(
params
).
then
(
res
=>
{
if
(
res
.
code
===
0
&&
res
.
data
.
id
)
{
resolve
(
res
.
data
)
}
else
{
reject
(
res
)
}
}
).
catch
((
err
)
=>
reject
(
err
))
}
)
}
,
fetchMeetingList
()
{
const
date
=
this
.
reviewData
.
startDate
const
start
=
dateFormat
(
date
)
const
end
=
dateFormat
(
new
Date
(
date
.
getFullYear
(),
date
.
getMonth
(),
date
.
getDate
()
+
1
))
const
params
=
{
userid
:
this
.
userid
,
start_time
:
start
,
end_time
:
end
}
getNonpagedMeetingList
(
params
).
then
((
res
)
=>
{
if
(
res
.
code
===
0
&&
res
.
data
&&
res
.
data
.
list
)
{
console
.
log
(
res
.
data
.
list
)
this
.
schedule
.
events
=
res
.
data
.
list
}
else
{
}
}
).
catch
()
}
}
}
)
<
/script
>
<
style
scoped
>
.
meeting
-
account
-
create
{
overflow
-
y
:
auto
;
height
:
calc
(
100
%
-
52
px
);
}
.
inner
{
display
:
flex
;
background
:
#
fff
;
margin
:
0
15
px
;
border
-
radius
:
4
px
;
padding
-
bottom
:
10
px
;
}
.
right
-
container
{
position
:
relative
;
width
:
45
%
;
box
-
sizing
:
border
-
box
;
padding
-
left
:
20
px
;
}
.
right
-
container
.
title
{
position
:
absolute
;
left
:
0
;
top
:
0
;
width
:
100
%
;
line
-
height
:
50
px
;
font
-
size
:
16
px
;
text
-
align
:
center
;
}
.
pre
-
time
-
range
{
position
:
absolute
;
left
:
70
px
;
width
:
calc
(
100
%
-
70
px
);
background
:
#
52
b837
;
}
.
search
-
keywords
-
checked
{
color
:
#
F56C6C
;
font
-
size
:
12
px
;
line
-
height
:
1
;
padding
-
top
:
4
px
;
position
:
absolute
;
top
:
100
%
;
right
:
0
;
}
.
right
-
container
.
el
-
scrollbar
::
v
-
deep
.
el
-
scrollbar__wrap
{
/* overflow:hidden; */
}
.
tx
-
meeting
-
container
::
v
-
deep
.
el
-
dialog__header
{
padding
-
top
:
14
px
;
}
.
tx
-
meeting
-
container
::
v
-
deep
.
el
-
dialog__headerbtn
{
top
:
12
px
;
right
:
12
px
;
}
.
tx
-
meeting
-
container
::
v
-
deep
.
el
-
dialog__body
{
padding
:
10
px
0
;
margin
:
0
20
px
;
border
:
1
px
solid
#
DBDBDB
;
}
.
tx
-
meeting
-
container
::
v
-
deep
.
el
-
dialog__footer
{
padding
-
bottom
:
16
px
;
}
.
tx
-
meeting
-
container
::
v
-
deep
.
el
-
dialog
.
el
-
form
-
item
{
margin
:
0
;
}
<
/style
>
src/pages/meeting/tencent-meeting/meeting-create.vue
0 → 100644
浏览文件 @
0bbc187f
<
template
>
<div
class=
"meeting-create"
>
<div
class=
"inner"
>
<meeting-form
@
submitForm=
"handleSubmit"
></meeting-form>
</div>
<meeting-success-dialog
:dialogVisible
.
sync=
"dialogVisible"
:details=
"details"
/>
</div>
</
template
>
<
script
>
import
MeetingForm
from
'./components/MeetingForm'
import
MeetingSuccessDialog
from
'@/components/MeetingSuccessDialog/index'
import
{
createMeeting
,
operateLog
,
getMeetingDetails
}
from
'@api/common'
import
{
mapGetters
}
from
'vuex'
export
default
({
data
()
{
return
{
dialogVisible
:
false
,
details
:
{}
}
},
computed
:
{
...
mapGetters
([
'user'
])
},
components
:
{
MeetingForm
,
MeetingSuccessDialog
},
watch
:
{
dialogVisible
:
{
handler
:
function
(
nv
)
{
if
(
!
nv
)
{
this
.
goList
()
}
}
}
},
methods
:
{
handleSubmit
(
params
)
{
console
.
log
(
params
)
this
.
fetchCreateMeeting
(
params
)
},
goList
()
{
this
.
$router
.
push
(
'/calendar'
)
},
async
showMeetingDetails
(
obj
)
{
const
loading
=
this
.
$loading
({
lock
:
true
,
text
:
'获取腾讯会议详情,请稍后...'
,
spinner
:
'el-icon-loading'
,
background
:
'rgba(0, 0, 0, 0.7)'
});
const
params
=
{
meeting_id
:
obj
.
meeting_id
}
if
(
Array
.
isArray
(
obj
.
sub_meetings
)
&&
obj
.
sub_meetings
.
length
>
0
)
{
params
.
sub_meeting_id
=
obj
.
sub_meetings
[
0
].
sub_meeting_id
}
const
details
=
await
this
.
fetchMeetingDetails
(
params
)
loading
.
close
()
this
.
details
=
details
this
.
dialogVisible
=
true
},
fetchCreateMeeting
(
params
)
{
const
loading
=
this
.
$loading
({
lock
:
true
,
text
:
'创建腾讯会议中,请稍后...'
,
spinner
:
'el-icon-loading'
,
background
:
'rgba(0, 0, 0, 0.7)'
})
createMeeting
(
params
).
then
(
res
=>
{
loading
.
close
()
if
(
res
.
code
===
0
&&
res
.
data
.
id
)
{
operateLog
({
type
:
`创建会议,被创建会议meeting_code:
${
res
.
data
.
meeting_code
}
`
,
user
:
this
.
user
})
this
.
$message
.
success
(
'创建腾讯会议成功'
)
this
.
showMeetingDetails
(
res
.
data
)
}
else
{
this
.
$message
.
error
(
res
.
message
||
res
.
msg
||
'创建腾讯会议失败'
)
}
})
},
fetchMeetingDetails
(
params
)
{
return
new
Promise
((
resolve
,
reject
)
=>
{
getMeetingDetails
(
params
).
then
(
res
=>
{
if
(
res
.
code
===
0
&&
res
.
data
.
id
)
{
console
.
log
(
res
.
data
)
resolve
(
res
.
data
)
}
else
{
reject
(
res
)
}
}).
catch
((
err
)
=>
reject
(
err
))
})
}
}
})
</
script
>
<
style
scoped
>
.meeting-create
{
overflow-y
:
auto
;
height
:
calc
(
100%
-
52px
);
}
.inner
{
background
:
#fff
;
margin
:
0
15px
;
border-radius
:
4px
;
padding-bottom
:
10px
;
}
</
style
>
src/pages/meeting/tencent-meeting/meeting-update.vue
0 → 100644
浏览文件 @
0bbc187f
<
template
>
<div
class=
"meeting-update"
>
<div
class=
"inner"
>
<meeting-form
:data=
"reviewData"
:users=
"userList"
@
submitForm=
"handleSubmit"
></meeting-form>
</div>
<meeting-success-dialog
:dialogVisible
.
sync=
"dialogVisible"
:details=
"details"
/>
</div>
</
template
>
<
script
>
import
MeetingForm
from
'./components/MeetingForm'
import
MeetingSuccessDialog
from
'@/components/MeetingSuccessDialog/index'
import
{
updateMeeting
,
operateLog
,
getMeetingDetails
}
from
'@api/common'
import
{
timeTrans
,
dateFormat
,
getYMDByDate
}
from
'@/utils/dateAlgs'
import
{
mapGetters
}
from
'vuex'
const
DAY_TIMESTAMP
=
8.64e7
export
default
({
data
()
{
return
{
reviewData
:
{},
userList
:
[],
dialogVisible
:
false
,
details
:
{}
}
},
computed
:
{
...
mapGetters
([
'user'
])
},
components
:
{
MeetingForm
,
MeetingSuccessDialog
},
watch
:
{
dialogVisible
:
{
handler
:
function
(
nv
)
{
if
(
!
nv
)
{
this
.
goList
()
}
}
}
},
created
()
{
this
.
reviewMeeting
()
},
methods
:
{
handleSubmit
(
params
)
{
this
.
fetchUpdateMeeting
(
params
)
},
goList
()
{
this
.
$router
.
push
(
'/calendar'
)
},
async
reviewMeeting
()
{
const
params
=
{
meeting_id
:
this
.
$route
.
query
.
meeting_id
}
if
(
this
.
$route
.
query
.
sub_meeting_id
)
{
params
.
sub_meeting_id
=
this
.
$route
.
query
.
sub_meeting_id
}
const
details
=
await
this
.
fetchMeetingDetails
(
params
)
const
reviewData
=
{}
this
.
details
=
details
const
start
=
timeTrans
(
details
.
start_time
)
const
end
=
timeTrans
(
details
.
end_time
)
this
.
userid
=
details
.
userid
reviewData
.
subject
=
details
.
subject
reviewData
.
startDate
=
getYMDByDate
(
start
)
reviewData
.
startTime
=
dateFormat
(
start
,
'{h}:{i}'
)
reviewData
.
endDate
=
getYMDByDate
(
end
)
reviewData
.
endTime
=
dateFormat
(
end
,
'{h}:{i}'
)
reviewData
.
meeting_type
=
details
.
meeting_type
if
(
details
.
meeting_type
===
1
)
{
const
recurringRule
=
details
.
recurring_rule
reviewData
.
recurring_rule
=
{
recurring_type
:
recurringRule
.
recurring_type
,
until_type
:
recurringRule
.
until_type
}
if
(
recurringRule
.
until_type
===
0
)
{
reviewData
.
recurring_rule
.
until_date
=
timeTrans
(
recurringRule
.
until_date
)
-
DAY_TIMESTAMP
}
else
{
reviewData
.
recurring_rule
.
until_count
=
recurringRule
.
until_count
}
}
if
(
details
.
password
)
{
reviewData
.
password
=
details
.
password
reviewData
.
hasPwd
=
true
}
const
settings
=
details
.
settings
reviewData
.
settings
=
{
auto_in_waiting_room
:
settings
.
auto_in_waiting_room
,
allow_in_before_host
:
settings
.
allow_in_before_host
,
auto_record_type
:
settings
.
auto_record_type
,
mute_enable_join
:
settings
.
mute_enable_join
}
if
(
settings
.
auto_record_type
!==
'none'
)
{
reviewData
.
auto_record
=
true
}
if
(
details
.
enable_live
===
1
)
{
const
liveConfig
=
details
.
live_config
reviewData
.
live_config
=
{
live_subject
:
liveConfig
.
live_subject
||
''
,
live_summary
:
liveConfig
.
live_summary
||
''
,
enable_live_password
:
Boolean
(
liveConfig
.
live_password
),
live_password
:
liveConfig
.
live_password
||
''
,
enable_live_im
:
liveConfig
.
enable_live_im
}
reviewData
.
enable_live
=
true
}
else
{
reviewData
.
enable_live
=
false
}
if
(
Array
.
isArray
(
details
.
managers
)
&&
details
.
managers
.
length
>
0
)
{
const
_managers
=
details
.
managers
.
map
(
it
=>
it
.
user_id
)
reviewData
.
managers
=
_managers
;
this
.
userList
=
details
.
managers
}
this
.
reviewData
=
reviewData
// console.log(reviewData)
},
async
showMeetingDetails
(
obj
)
{
const
loading
=
this
.
$loading
({
lock
:
true
,
text
:
'获取腾讯会议详情,请稍后...'
,
spinner
:
'el-icon-loading'
,
background
:
'rgba(0, 0, 0, 0.7)'
});
const
params
=
{
meeting_id
:
obj
.
meeting_id
}
if
(
Array
.
isArray
(
obj
.
sub_meetings
)
&&
obj
.
sub_meetings
.
length
>
0
)
{
params
.
sub_meeting_id
=
obj
.
sub_meetings
[
0
].
sub_meeting_id
}
const
details
=
await
this
.
fetchMeetingDetails
(
params
)
loading
.
close
()
this
.
details
=
details
this
.
dialogVisible
=
true
},
fetchUpdateMeeting
(
params
)
{
const
loading
=
this
.
$loading
({
lock
:
true
,
text
:
'修改腾讯会议中,请稍后...'
,
spinner
:
'el-icon-loading'
,
background
:
'rgba(0, 0, 0, 0.7)'
})
params
.
meeting_id
=
this
.
$route
.
query
.
meeting_id
params
.
userid
=
this
.
userid
updateMeeting
(
params
).
then
(
res
=>
{
loading
.
close
()
if
(
res
.
code
===
0
&&
res
.
data
.
id
)
{
operateLog
({
type
:
`修改会议,被修改会议meeting_code:
${
res
.
data
.
meeting_code
}
`
,
user
:
this
.
user
})
this
.
$message
.
success
(
'修改腾讯会议成功'
)
this
.
showMeetingDetails
(
res
.
data
)
}
else
{
this
.
$message
.
error
(
res
.
message
||
res
.
msg
||
'修改腾讯会议失败'
)
}
})
},
fetchMeetingDetails
(
params
)
{
return
new
Promise
((
resolve
,
reject
)
=>
{
getMeetingDetails
(
params
).
then
(
res
=>
{
if
(
res
.
code
===
0
&&
res
.
data
.
id
)
{
resolve
(
res
.
data
)
}
else
{
reject
(
res
)
}
}).
catch
((
err
)
=>
reject
(
err
))
})
}
}
})
</
script
>
<
style
scoped
>
.meeting-update
{
overflow-y
:
auto
;
height
:
calc
(
100%
-
52px
);
}
.inner
{
background
:
#fff
;
margin
:
0
15px
;
border-radius
:
4px
;
padding-bottom
:
10px
;
}
</
style
>
\ No newline at end of file
src/pages/search/index.vue
浏览文件 @
0bbc187f
...
@@ -24,8 +24,11 @@
...
@@ -24,8 +24,11 @@
<el-row>
<el-row>
<el-col
:span=
"8"
>
<el-col
:span=
"8"
>
<label>
会议创建人
</label>
<label>
会议创建人
</label>
<el-select
v-model=
"filter.userid"
placeholder=
"搜索用户"
size=
"mini"
filterable
remote
:remote-method=
"fetchUserList"
:loading=
"searchUsersloading"
>
<el-select
v-model=
"filter.userid"
placeholder=
"输入关键字搜索"
size=
"mini"
filterable
remote
:remote-method=
"fetchUserList"
:loading=
"searchUsersloading"
>
<el-option
:label=
"user.nickname"
: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: right; color: #8492a6; font-size: 13px; margin:0 20px 0 10px;"
>
{{
user
.
id
}}
</span>
</el-option>
</el-select>
</el-select>
</el-col>
</el-col>
<el-col
:span=
"11"
>
<el-col
:span=
"11"
>
...
@@ -39,7 +42,8 @@
...
@@ -39,7 +42,8 @@
</el-row>
</el-row>
</div>
</div>
<el-table
:data=
"listData"
style=
"width: 100%"
height=
"calc(100% - 116px)"
v-loading=
"loading"
>
<el-table
:data=
"listData"
style=
"width: 100%"
height=
"calc(100% - 116px)"
v-loading=
"loading"
>
<el-table-column
label=
"会议时间"
min-width=
"160"
align=
"center"
>
<el-table-column
prop=
"meeting_code"
label=
"会议号"
width=
"120"
></el-table-column>
<el-table-column
label=
"会议时间"
min-width=
"220"
align=
"center"
>
<template
slot-scope=
"scope"
>
<template
slot-scope=
"scope"
>
<p
style=
"color: #aeaeae"
>
<p
style=
"color: #aeaeae"
>
<span
style=
"font-size: 18px; color: #606266"
>
{{
scope
.
row
.
start_time
|
dateFormat
(
'{d
}
'
)
}}
<
/span
>
<span
style=
"font-size: 18px; color: #606266"
>
{{
scope
.
row
.
start_time
|
dateFormat
(
'{d
}
'
)
}}
<
/span
>
...
@@ -76,7 +80,6 @@
...
@@ -76,7 +80,6 @@
<
/el-popover
>
<
/el-popover
>
<
/template
>
<
/template
>
<
/el-table-column
>
<
/el-table-column
>
<!--
<
el
-
table
-
column
prop
=
"resource"
label
=
"会议来源"
width
=
"80"
><
/el-table-column> --
>
<
el
-
table
-
column
prop
=
"resource"
label
=
"会议状态"
min
-
width
=
"80"
align
=
"center"
>
<
el
-
table
-
column
prop
=
"resource"
label
=
"会议状态"
min
-
width
=
"80"
align
=
"center"
>
<
template
slot
-
scope
=
"scope"
>
<
template
slot
-
scope
=
"scope"
>
<
p
<
p
...
@@ -194,7 +197,7 @@ export default {
...
@@ -194,7 +197,7 @@ export default {
fetchUserList
(
val
)
{
fetchUserList
(
val
)
{
if
(
val
)
{
if
(
val
)
{
const
params
=
{
const
params
=
{
nick
name
:
val
user
name
:
val
}
}
this
.
searchUsersloading
=
true
;
this
.
searchUsersloading
=
true
;
searchUserList
(
params
).
then
((
res
)
=>
{
searchUserList
(
params
).
then
((
res
)
=>
{
...
...
src/pages/system/account/index.vue
浏览文件 @
0bbc187f
...
@@ -7,10 +7,10 @@
...
@@ -7,10 +7,10 @@
<el-table-column
prop=
"username"
label=
"名称"
min-width=
"120"
></el-table-column>
<el-table-column
prop=
"username"
label=
"名称"
min-width=
"120"
></el-table-column>
<el-table-column
prop=
"phone"
label=
"手机号码"
min-width=
"120"
></el-table-column>
<el-table-column
prop=
"phone"
label=
"手机号码"
min-width=
"120"
></el-table-column>
<el-table-column
prop=
"email"
label=
"邮箱"
min-width=
"140"
></el-table-column>
<el-table-column
prop=
"email"
label=
"邮箱"
min-width=
"140"
></el-table-column>
<el-table-column
label=
"操作"
min-width=
"60"
>
<el-table-column
label=
"操作"
min-width=
"60"
v-if=
"isSuperAdmin"
>
<template
slot-scope=
"scope"
>
<template
slot-scope=
"scope"
>
<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)"
v-if=
"isSuperAdmin"
>
删除
</el-button>
<el-button
type=
"text"
size=
"small"
@
click=
"handleDelete(scope.row.userid)"
>
删除
</el-button>
</
template
>
</
template
>
</el-table-column>
</el-table-column>
</el-table>
</el-table>
...
@@ -21,17 +21,17 @@
...
@@ -21,17 +21,17 @@
<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
style=
"position:relative;"
>
<el-dropdown
@
command=
"(val) => searchType = val"
>
<
!-- <
el-dropdown @command="(val) => searchType = val">
<el-button style="width:85px;" size="small">
<el-button style="width:85px;" size="small">
{{searchTypeOptions[searchType]}}<i class="el-icon-arrow-down el-icon--right"></i>
{{searchTypeOptions[searchType]}}<i class="el-icon-arrow-down el-icon--right"></i>
</el-button>
</el-button>
<el-dropdown-menu slot="dropdown">
<el-dropdown-menu slot="dropdown">
<el-dropdown-item :command="key" v-for="(value, key) in searchTypeOptions" :key="key">{{value}}</el-dropdown-item>
<el-dropdown-item :command="key" v-for="(value, key) in searchTypeOptions" :key="key">{{value}}</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown-menu>
</el-dropdown>
</el-dropdown>
-->
<el-select
v-model=
"form.userid"
placeholder=
"输入关键字搜索"
size=
"small"
filterable
remote
:remote-method=
"fetchUserList"
:loading=
"searchUsersloading"
style=
"width:
22
0px;"
>
<el-select
v-model=
"form.userid"
placeholder=
"输入关键字搜索"
size=
"small"
filterable
remote
:remote-method=
"fetchUserList"
:loading=
"searchUsersloading"
style=
"width:
31
0px;"
>
<el-option
:label=
"user.
nick
name"
:value=
"user.id"
v-for=
"user in userList"
:key=
"user.id"
>
<el-option
:label=
"user.
user
name"
:value=
"user.id"
v-for=
"user in userList"
:key=
"user.id"
>
<span
style=
"float: left"
>
{{ user.
nick
name }}
</span>
<span
style=
"float: left"
>
{{ user.
user
name }}
</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>
...
@@ -96,7 +96,7 @@ export default {
...
@@ -96,7 +96,7 @@ export default {
email
:
''
email
:
''
},
},
rules
:
{
rules
:
{
userid
:
[{
required
:
true
,
message
:
'请
输入
ID'
,
trigger
:
'blur'
}],
userid
:
[{
required
:
true
,
message
:
'请
选择
ID'
,
trigger
:
'blur'
}],
username
:
[{
required
:
true
,
message
:
'请输入名称'
,
trigger
:
'blur'
}],
username
:
[{
required
:
true
,
message
:
'请输入名称'
,
trigger
:
'blur'
}],
phone
:
[
phone
:
[
{
required
:
true
,
message
:
'请输入手机号'
,
trigger
:
'blur'
},
{
required
:
true
,
message
:
'请输入手机号'
,
trigger
:
'blur'
},
...
...
src/router/routes.js
浏览文件 @
0bbc187f
...
@@ -7,29 +7,53 @@ export default [
...
@@ -7,29 +7,53 @@ export default [
redirect
:
'/calendar'
redirect
:
'/calendar'
},
},
{
{
path
:
'/meeting'
,
path
:
'/meeting
-old
'
,
component
:
Layout
,
component
:
Layout
,
children
:
[
children
:
[
{
{
path
:
''
,
path
:
''
,
component
:
()
=>
import
(
'@/pages/meeting/index.vue'
),
component
:
()
=>
import
(
'@/pages/meeting/index
-old
.vue'
),
name
:
'CreateLive'
,
name
:
'CreateLive'
,
meta
:
{
title
:
'创建直播'
,
affix
:
true
}
meta
:
{
title
:
'创建直播'
,
affix
:
true
}
}
}
]
]
},
},
{
{
path
:
'/meeting-
test
'
,
path
:
'/meeting-
create
'
,
component
:
Layout
,
component
:
Layout
,
children
:
[
children
:
[
{
{
path
:
''
,
path
:
''
,
component
:
()
=>
import
(
'@/pages/meeting/index
-test
.vue'
),
component
:
()
=>
import
(
'@/pages/meeting/index.vue'
),
name
:
'MeetingCreate'
,
name
:
'MeetingCreate'
,
meta
:
{
title
:
'创建直播'
,
affix
:
true
}
meta
:
{
title
:
'创建直播'
,
affix
:
true
}
}
}
]
]
},
},
{
path
:
'/meeting-update'
,
component
:
Layout
,
children
:
[
{
path
:
''
,
component
:
()
=>
import
(
'@/pages/meeting/index.vue'
),
name
:
'MeetingUpdate'
,
meta
:
{
title
:
'创建直播'
,
affix
:
true
}
}
]
},
{
path
:
'/meeting-account-create'
,
component
:
Layout
,
children
:
[
{
path
:
''
,
component
:
()
=>
import
(
'@/pages/meeting/index.vue'
),
name
:
'MeetingAccountCreate'
,
meta
:
{
title
:
'创建直播'
,
affix
:
true
}
}
]
},
{
{
path
:
'/calendar'
,
path
:
'/calendar'
,
component
:
Layout
,
component
:
Layout
,
...
...
src/style.scss
浏览文件 @
0bbc187f
...
@@ -108,3 +108,8 @@ body {
...
@@ -108,3 +108,8 @@ body {
opacity
:
0
;
opacity
:
0
;
transform
:
translateX
(
30px
);
transform
:
translateX
(
30px
);
}
}
/* element input,textarea font-family */
.el-input__inner
,
.el-textarea__inner
{
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
;
}
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论