Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
C
company_app
概览
概览
详情
活动
周期分析
版本库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
问题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程表
图表
维基
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
毛细亚
company_app
Commits
a5bbf545
提交
a5bbf545
authored
12月 03, 2025
作者:
施汉文
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
✨
feat: 7.1功能
上级
5593e9ce
显示空白字符变更
内嵌
并排
正在显示
13 个修改的文件
包含
1727 行增加
和
830 行删除
+1727
-830
index.html
public/index.html
+13
-8
game.js
src/api/game.js
+43
-0
copy.js
src/directive/copy/copy.js
+82
-0
index.js
src/directive/copy/index.js
+13
-0
main.js
src/main.js
+2
-1
user.js
src/store/modules/user.js
+5
-0
index.scss
src/styles/index.scss
+4
-0
index.vue
src/views/components/InstructionalVideo/index.vue
+146
-0
sendGame.vue
src/views/components/quickSendGame/sendGame.vue
+935
-503
roleInfoPanel.vue
src/views/components/roleInfo/roleInfoPanel.vue
+162
-74
crossLibrary.vue
src/views/components/skill/crossLibrary.vue
+217
-135
newLogin.vue
src/views/newLogin.vue
+72
-70
quickReply.vue
src/views/quickReply.vue
+33
-39
没有找到文件。
public/index.html
浏览文件 @
a5bbf545
<!DOCTYPE html>
<html
lang=
""
>
<head>
<meta
charset=
"utf-8"
>
<meta
http-equiv=
"X-UA-Compatible"
content=
"IE=edge"
>
<meta
name=
"viewport"
content=
"width=device-width,initial-scale=1.0"
>
<link
rel=
"icon"
href=
"<%= BASE_URL %>favicon.ico"
>
<meta
charset=
"utf-8"
/
>
<meta
http-equiv=
"X-UA-Compatible"
content=
"IE=edge"
/
>
<meta
name=
"viewport"
content=
"width=device-width,initial-scale=1.0"
/
>
<link
rel=
"icon"
href=
"<%= BASE_URL %>favicon.ico"
/
>
<!-- HTTP 1.1 -->
<meta
http-equiv=
"pragma"
content=
"no-cache"
>
<meta
http-equiv=
"pragma"
content=
"no-cache"
/
>
<!-- HTTP 1.0 -->
<meta
http-equiv=
"cache-control"
content=
"no-cache"
>
<meta
http-equiv=
"cache-control"
content=
"no-cache"
/
>
<!-- Prevent caching at the proxy server -->
<meta
http-equiv=
"expires"
content=
"0"
>
<meta
http-equiv=
"expires"
content=
"0"
/
>
<meta
http-equiv=
"X-UA-Compatible"
content=
"IE=EmulateIE9"
/>
<!-- <title><%= htmlWebpackPlugin.options.title %></title> -->
<title>
企微侧边栏
</title>
<!-- <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0,shrink-to-fit=no,user-scalable=no"> -->
<script
src=
"https://g.alicdn.com/dingding/dinglogin/0.0.5/ddLogin.js"
></script>
<script
src=
"https://lf1-cdn-tos.bytegoofy.com/obj/iconpark/icons_27278_170.37925de07dae112aa781d3ef4c169912.es5.js"
></script>
</head>
<body>
<noscript>
<strong>
We're sorry but
<
%=
htmlWebpackPlugin
.
options
.
title
%
>
doesn't work properly without JavaScript enabled. Please enable it to continue.
</strong>
<strong
>
We're sorry but
<
%=
htmlWebpackPlugin
.
options
.
title
%
>
doesn't work
properly without JavaScript enabled. Please enable it to
continue.
</strong
>
</noscript>
<div
id=
"app"
></div>
</body>
...
...
src/api/game.js
浏览文件 @
a5bbf545
...
...
@@ -1467,3 +1467,45 @@ export function sendEmail(data) {
})
})
}
// 获取开/合服天数
export
function
getServerDayApi
(
data
)
{
return
new
Promise
((
resolve
,
reject
)
=>
{
cross_systemRequest
({
system
:
'zhangyou'
,
api
:
'/api/role/getServerDay'
,
params
:
data
}).
then
((
res
)
=>
{
resolve
(
res
)
}).
catch
((
error
)
=>
{
reject
(
error
)
})
})
}
// 项目-视频分类
export
function
teachingVideoCategoryListApi
(
data
)
{
return
new
Promise
((
resolve
,
reject
)
=>
{
cross_systemRequest
({
system
:
'zhangyou'
,
api
:
'/api/teaching_video/categoryList'
,
params
:
data
}).
then
((
res
)
=>
{
resolve
(
res
)
}).
catch
((
error
)
=>
{
reject
(
error
)
})
})
}
// 视频列表
export
function
teachingVideoVideoListApi
(
data
)
{
return
new
Promise
((
resolve
,
reject
)
=>
{
cross_systemRequest
({
system
:
'zhangyou'
,
api
:
'/api/teaching_video/videoList'
,
params
:
data
}).
then
((
res
)
=>
{
resolve
(
res
)
}).
catch
((
error
)
=>
{
reject
(
error
)
})
})
}
\ No newline at end of file
src/directive/copy/copy.js
0 → 100644
浏览文件 @
a5bbf545
import
Vue
from
'vue'
{
/* <iconpark-icon name="icon-fuzhi"></iconpark-icon> */
}
const
copy
=
{
// 当被绑定的元素插入到DOM中时
inserted
:
function
(
el
,
binding
)
{
// 创建复制图标元素
const
copyIcon
=
document
.
createElement
(
'iconpark-icon'
)
copyIcon
.
name
=
'icon-fuzhi'
copyIcon
.
style
.
cursor
=
'pointer'
copyIcon
.
style
.
marginLeft
=
'8px'
copyIcon
.
style
.
fontSize
=
'14px'
copyIcon
.
title
=
'点击复制'
// 设置元素的position为relative,确保图标的absolute定位正确
if
(
getComputedStyle
(
el
).
position
===
'static'
)
{
el
.
style
.
position
=
'relative'
}
// 添加复制图标到元素后面
el
.
insertBefore
(
copyIcon
,
el
.
nextSibling
)
// 复制功能实现
copyIcon
.
addEventListener
(
'click'
,
async
function
(
e
)
{
// 阻止事件冒泡
e
.
stopPropagation
()
try
{
// 获取要复制的内容
const
textToCopy
=
binding
.
value
||
''
if
(
!
textToCopy
)
{
Vue
.
prototype
.
$message
.
warning
(
'没有可复制的内容'
)
return
}
// 使用现代的剪贴板API
if
(
navigator
.
clipboard
&&
window
.
isSecureContext
)
{
await
navigator
.
clipboard
.
writeText
(
textToCopy
)
}
else
{
// 兼容旧版浏览器
const
textArea
=
document
.
createElement
(
'textarea'
)
textArea
.
value
=
textToCopy
textArea
.
style
.
position
=
'fixed'
textArea
.
style
.
left
=
'-999999px'
textArea
.
style
.
top
=
'-999999px'
document
.
body
.
appendChild
(
textArea
)
textArea
.
focus
()
textArea
.
select
()
// 执行复制命令
const
success
=
document
.
execCommand
(
'copy'
)
document
.
body
.
removeChild
(
textArea
)
if
(
!
success
)
{
throw
new
Error
(
'复制失败'
)
}
}
// 显示复制成功的提示
Vue
.
prototype
.
$message
.
success
(
'复制成功'
)
}
catch
(
error
)
{
console
.
error
(
'复制失败:'
,
error
)
Vue
.
prototype
.
$message
.
error
(
'复制失败,请手动复制'
)
}
})
// 存储图标引用,以便在组件卸载时清理
el
.
__copyIcon
=
copyIcon
},
// 当指令与元素解绑时
unbind
:
function
(
el
)
{
// 清理事件监听器和元素
if
(
el
.
__copyIcon
)
{
el
.
__copyIcon
.
removeEventListener
(
'click'
,
null
)
el
.
parentNode
.
removeChild
(
el
.
__copyIcon
)
delete
el
.
__copyIcon
}
}
}
export
default
copy
\ No newline at end of file
src/directive/copy/index.js
0 → 100644
浏览文件 @
a5bbf545
import
copy
from
'./copy.js'
const
install
=
function
(
Vue
)
{
Vue
.
directive
(
'copy'
,
copy
)
}
if
(
window
.
Vue
)
{
window
.
copy
=
copy
Vue
.
use
(
install
);
// eslint-disable-line
}
copy
.
install
=
install
export
default
copy
src/main.js
浏览文件 @
a5bbf545
...
...
@@ -15,6 +15,7 @@ import '@/styles/index.scss';
import
moment
from
'moment'
import
'@/styles/tailwind.css'
import
VConsole
from
'vconsole'
;
import
copy
from
'./directive/copy'
import
uploading
from
'@/utils/cos-upload'
import
errorHandle
from
'@/utils/errorHandle'
import
{
getParams
,
deepClone
}
from
'@/utils/index'
...
...
@@ -24,7 +25,7 @@ import loadmore from '@/directive/loadmore/index.js' // 加载更多
import
clickagain
from
'./directive/clickagain'
import
permission
from
'@/directive/permission/index.js'
// 权限判断指令
import
scroll
from
'@/directive/scroll'
// 下拉加载更多指令
Vue
.
use
(
globalComponent
).
use
(
permission
).
use
(
clickagain
).
use
(
loadmore
).
use
(
scroll
)
Vue
.
use
(
globalComponent
).
use
(
permission
).
use
(
clickagain
).
use
(
loadmore
).
use
(
scroll
)
.
use
(
copy
)
// 导入 VConsole 清理工具
import
'@/utils/vconsoleCleanup'
...
...
src/store/modules/user.js
浏览文件 @
a5bbf545
...
...
@@ -14,6 +14,7 @@ const state = {
external_userid
:
''
},
userid
:
Cookies
.
get
(
'userid'
),
weixin_blongs_id
:
Cookies
.
get
(
'weixin_blongs_id'
),
//客服号项目id
corp_id
:
''
,
external_userid
:
''
,
token
:
''
,
...
...
@@ -37,6 +38,10 @@ const state = {
}
const
mutations
=
{
set_weixin_blongs_id
(
state
,
weixin_blongs_id
){
state
.
weixin_blongs_id
=
weixin_blongs_id
Cookies
.
set
(
'weixin_blongs_id'
,
weixin_blongs_id
)
},
set_userInfo
(
state
,
userInfo
){
state
.
userInfo
=
userInfo
},
...
...
src/styles/index.scss
浏览文件 @
a5bbf545
...
...
@@ -537,6 +537,10 @@ li {
height
:
100%
;
font-size
:
300px
;
}
.el-loading-spinner
{
display
:
flex
;
justify-content
:
center
;
}
.el-loading-spinner
.circular
{
width
:
60px
!
important
;
...
...
src/views/components/InstructionalVideo/index.vue
0 → 100644
浏览文件 @
a5bbf545
<
template
>
<div
class=
"h-full flex flex-col"
>
<el-input
placeholder=
"请输入内容"
prefix-icon=
"el-icon-search"
v-model
.
trim=
"searchText"
>
</el-input>
<el-cascader
class=
"w-full mt-[8px]"
v-model=
"categoryValue"
:props=
"
{ emitPath: false, expandTrigger: 'click' }"
:options="categoryList"
@change="getVideoList"
>
</el-cascader>
<div
class=
"mt-[16px] space-y-[8px] flex-1 overflow-auto pb-[10px]"
>
<div
v-for=
"item in list"
:key=
"item.id"
class=
"flex justify-between items-center py-[3px] px-[8px] bottom-[1px] border border-[#E5E7EB] rounded-[4px]"
>
<div
class=
"text-[14px]"
>
{{
item
.
video_name
}}
</div>
<div
class=
"flex items-center"
>
<el-button
type=
"text"
size=
"small"
class=
"text-[12px] button-color-hover"
@
click=
"previewVideo(item)"
>
<div
class=
"flex items-center"
>
<iconpark-icon
name=
"xiaoxicaozuo-chakan"
class=
"mr-[4px]"
></iconpark-icon>
预览
</div>
</el-button>
<div
@
click=
"sendVideo(item)"
class=
"h-[24px] ml-[8px] cursor-pointer hover:bg-[#EAF7F3] text-[12px] w-[58px] p-0 flex justify-center items-center rounded-full bg-[#F7F8FA] text-[#00BF8A]"
>
<iconpark-icon
name=
"gongnengicon-kuaijiefasong"
class=
"text-[12px]"
></iconpark-icon>
<span>
发送
</span>
</div>
</div>
</div>
</div>
</div>
</
template
>
<
script
>
import
{
teachingVideoVideoListApi
,
teachingVideoCategoryListApi
,
}
from
"@/api/game"
;
import
{
mapMutations
,
mapState
}
from
"vuex"
;
import
{
sendChatMessage
}
from
"@/utils/index"
;
export
default
{
name
:
"InstructionalVideo"
,
data
()
{
return
{
searchText
:
""
,
categoryValue
:
{},
categoryList
:
[],
videoList
:
[],
};
},
mounted
()
{
this
.
getCategoryList
();
},
computed
:
{
...
mapState
(
"user"
,
[
"userInfo"
,
"weixin_blongs_id"
]),
list
()
{
return
this
.
videoList
.
filter
((
item
)
=>
item
.
video_name
.
includes
(
this
.
searchText
)
);
},
},
methods
:
{
...
mapMutations
(
"common"
,
[
"set_sendSkillMessage"
]),
// 视频分类
async
getCategoryList
()
{
console
.
log
(
this
.
userInfo
);
// return;
const
{
data
}
=
await
teachingVideoCategoryListApi
({
weixin_blongs_id
:
this
.
weixin_blongs_id
,
});
this
.
categoryList
=
this
.
formatCategoryList
(
data
);
},
formatCategoryList
(
data
)
{
return
data
.
map
((
item
)
=>
{
return
{
value
:
item
,
label
:
item
.
main_game_name
,
children
:
item
.
category
.
map
((
item
)
=>
({
value
:
item
,
label
:
item
.
category_name
,
})),
};
});
},
// 视频列表
async
getVideoList
()
{
if
(
!
this
.
categoryValue
.
id
)
{
return
;
}
const
{
data
}
=
await
teachingVideoVideoListApi
({
weixin_blongs_id
:
this
.
categoryValue
.
weixin_blongs_id
,
main_game_id
:
this
.
categoryValue
.
main_game_id
,
video_type
:
this
.
categoryValue
.
id
,
page
:
1
,
page_size
:
200
,
});
this
.
videoList
=
data
.
data
;
},
sendVideo
(
item
)
{
try
{
const
link
=
{
title
:
item
.
video_name
,
imgUrl
:
item
.
cover_url
||
""
,
desc
:
"点击观看教学视频"
,
link
:
item
.
video_url
,
};
sendChatMessage
(
link
,
"link"
);
}
catch
(
error
)
{
console
.
error
(
"发送视频链接失败:"
,
error
);
this
.
$message
({
message
:
"发送视频链接失败"
,
type
:
"error"
});
}
},
previewVideo
(
item
)
{
window
.
open
(
item
.
video_url
);
},
},
};
</
script
>
<
style
scoped
>
.button-color-hover.el-button--text
:hover
{
color
:
#00bf8a
!important
;
}
.button-color-hover.el-button--text
{
color
:
#86909c
;
}
</
style
>
src/views/components/quickSendGame/sendGame.vue
浏览文件 @
a5bbf545
...
...
@@ -3,51 +3,114 @@
<div
v-if=
"!disabled && bindGameUserList.length > 0"
class=
"btnRelease"
>
<div
class=
"btntab"
>
<el-radio-group
size=
"small"
v-model=
"activeName"
class=
"radio-group"
>
<el-radio-button
border
label=
"1"
@
click
.
native=
"activeName = '1'"
>
转端
</el-radio-button>
<el-radio-button
border
label=
"3"
@
click
.
native=
"recallTabChange"
>
召回
</el-radio-button>
<el-radio-button
border
label=
"2"
@
click
.
native=
"requestRegGameList"
>
转游
</el-radio-button>
<el-radio-button
border
label=
"1"
@
click
.
native=
"activeName = '1'"
>
转端
</el-radio-button
>
<el-radio-button
border
label=
"3"
@
click
.
native=
"recallTabChange"
>
召回
</el-radio-button
>
<el-radio-button
border
label=
"2"
@
click
.
native=
"requestRegGameList"
>
转游
</el-radio-button
>
</el-radio-group>
</div>
<div
v-loading=
"contentLoading"
class=
"gameList"
>
<!-- 转端 -->
<el-collapse
v-if=
"activeName == '1' && conversionGameList.length > 0"
:disabled=
"disabled"
@
change=
"conversionChangeOld"
>
<el-collapse-item
class=
"mb-[10px]"
v-for=
"(item, index) in conversionGameList"
:key=
"index"
:name=
"item.game_type"
>
<el-collapse
v-if=
"activeName == '1' && conversionGameList.length > 0"
:disabled=
"disabled"
@
change=
"conversionChangeOld"
>
<el-collapse-item
class=
"mb-[10px]"
v-for=
"(item, index) in conversionGameList"
:key=
"index"
:name=
"item.game_type"
>
<template
slot=
"title"
>
<div
class=
"title-with-icon"
>
<svg-icon
v-if=
"item.game_type == 1"
icon-class=
"wxgame"
class=
"game-icon"
/>
<svg-icon
v-else-if=
"item.game_type == 5"
icon-class=
"douyin"
class=
"game-icon"
/>
<svg-icon
v-else-if=
"item.game_type == 3"
icon-class=
"Android"
class=
"game-icon"
/>
<svg-icon
v-else-if=
"item.game_type == 4"
icon-class=
"IOS"
class=
"game-icon"
/>
<svg-icon
v-else-if=
"item.game_type == 2"
icon-class=
"H5"
class=
"game-icon"
/>
<svg-icon
v-if=
"item.game_type == 1"
icon-class=
"wxgame"
class=
"game-icon"
/>
<svg-icon
v-else-if=
"item.game_type == 5"
icon-class=
"douyin"
class=
"game-icon"
/>
<svg-icon
v-else-if=
"item.game_type == 3"
icon-class=
"Android"
class=
"game-icon"
/>
<svg-icon
v-else-if=
"item.game_type == 4"
icon-class=
"IOS"
class=
"game-icon"
/>
<svg-icon
v-else-if=
"item.game_type == 2"
icon-class=
"H5"
class=
"game-icon"
/>
{{
item
.
game_text
}}
</div>
</
template
>
<div
v-if=
"item.children && item.children.length > 0"
>
<div
v-for=
"(items, indexs) in item.children"
:key=
"indexs"
class=
"gameListItem rowFlex columnCenter spaceBetween"
>
<p>
{{ items.game_name + '/' + items.game_id }}
</p>
<div
v-for=
"(items, indexs) in item.children"
:key=
"indexs"
class=
"gameListItem rowFlex columnCenter spaceBetween"
>
<p>
{{ items.game_name + "/" + items.game_id }}
</p>
<el-popover
placement=
"top"
width=
"160"
trigger=
"hover"
>
<div>
<p
class=
"sendLink"
@
click=
"sendLink(items, item.game_type)"
>
<p
class=
"sendLink"
@
click=
"sendLink(items, item.game_type)"
>
仅发送链接
</p>
<p
class=
"sendLink"
@
click=
"sendPassword(items, item.game_type)"
>
<p
class=
"sendLink"
@
click=
"sendPassword(items, item.game_type)"
>
仅发送账号密码
</p>
<p
class=
"sendLink"
@
click=
"sendMessage(items, item.game_type)"
>
<p
class=
"sendLink"
@
click=
"sendMessage(items, item.game_type)"
>
发送链接和账号密码
</p>
<p
class=
"sendLink"
@
click=
"sendDownLoadPage(items, item.game_type, index)"
>
<p
class=
"sendLink"
@
click=
"sendDownLoadPage(items, item.game_type, index)"
>
发送落地页
</p>
<p
class=
"sendLink"
v-if=
"[3, 4].includes(item.game_type)"
@
click=
"sendDownLoadQrCode(items, item.game_type, index)"
>
下载二维码
</p>
</div>
<el-button
slot=
"reference"
size=
"mini"
:disabled=
"accountSelect == ''"
>
发送
</el-button>
<el-button
slot=
"reference"
size=
"mini"
:disabled=
"accountSelect == ''"
>
发送
</el-button
>
</el-popover>
</div>
</div>
<div
v-else-if=
"gameLoding"
class=
"channelLoading rowFlex allCenter"
>
<div
v-else-if=
"gameLoding"
class=
"channelLoading rowFlex allCenter"
>
<i
class=
"el-icon-loading"
></i>
<el-button
type=
"text"
>
加载中
</el-button>
</div>
...
...
@@ -55,31 +118,75 @@
</el-collapse-item>
</el-collapse>
<!-- 召回 -->
<div
v-else-if=
"activeName == '3' && recallGameList.length > 0"
class=
"collapseContent"
>
<div
v-else-if=
"activeName == '3' && recallGameList.length > 0"
class=
"collapseContent"
>
<!-- v-if="chatUser.task_type && chatUser.task_type == 7"-->
<el-button
v-if=
'false'
type=
"primary"
style=
"margin-left:50px;"
:loading=
"sendLoading"
@
click=
"sendTaskChannel"
>
根据任务一键发送链接
</el-button>
<el-button
v-if=
"false"
type=
"primary"
style=
"margin-left: 50px"
:loading=
"sendLoading"
@
click=
"sendTaskChannel"
>
根据任务一键发送链接
</el-button
>
<el-collapse
:disabled=
"disabled"
@
change=
"recallChange"
>
<el-collapse-item
v-for=
"(item, index) in recallGameList"
:key=
"index"
:name=
"item.game_type"
>
<el-collapse-item
v-for=
"(item, index) in recallGameList"
:key=
"index"
:name=
"item.game_type"
>
<
template
slot=
"title"
>
<div
class=
"title-with-icon"
>
<svg-icon
v-if=
"item.game_type == 1"
icon-class=
"wxgame"
class=
"game-icon"
/>
<svg-icon
v-else-if=
"item.game_type == 5"
icon-class=
"douyin"
class=
"game-icon"
/>
<svg-icon
v-else-if=
"item.game_type == 3"
icon-class=
"Android"
class=
"game-icon"
/>
<svg-icon
v-else-if=
"item.game_type == 4"
icon-class=
"IOS"
class=
"game-icon"
/>
<svg-icon
v-else-if=
"item.game_type == 2"
icon-class=
"H5"
class=
"game-icon"
/>
<svg-icon
v-if=
"item.game_type == 1"
icon-class=
"wxgame"
class=
"game-icon"
/>
<svg-icon
v-else-if=
"item.game_type == 5"
icon-class=
"douyin"
class=
"game-icon"
/>
<svg-icon
v-else-if=
"item.game_type == 3"
icon-class=
"Android"
class=
"game-icon"
/>
<svg-icon
v-else-if=
"item.game_type == 4"
icon-class=
"IOS"
class=
"game-icon"
/>
<svg-icon
v-else-if=
"item.game_type == 2"
icon-class=
"H5"
class=
"game-icon"
/>
{{
item
.
game_text
}}
</div>
</
template
>
<div
v-if=
"item.children && item.children.length > 0"
>
<div
v-for=
"(items, indexs) in item.children"
:key=
"indexs"
class=
"gameListItem rowFlex columnCenter spaceBetween"
>
<p>
{{ items.game_name + '/' + items.game_id }}
</p>
<el-button
slot=
"reference"
size=
"mini"
:disabled=
"accountSelect == ''"
@
click=
"sendChannel(items)"
>
发送
</el-button>
<div
v-for=
"(items, indexs) in item.children"
:key=
"indexs"
class=
"gameListItem rowFlex columnCenter spaceBetween"
>
<p>
{{ items.game_name + "/" + items.game_id }}
</p>
<el-button
slot=
"reference"
size=
"mini"
:disabled=
"accountSelect == ''"
@
click=
"sendChannel(items)"
>
发送
</el-button
>
</div>
</div>
<div
v-else-if=
"gameLoding"
class=
"channelLoading rowFlex allCenter"
>
<div
v-else-if=
"gameLoding"
class=
"channelLoading rowFlex allCenter"
>
<i
class=
"el-icon-loading"
></i>
<el-button
type=
"text"
>
加载中
</el-button>
</div>
...
...
@@ -89,7 +196,12 @@
</el-collapse>
<div
class=
"createChannel rowFlex allCenter"
>
<span
class=
"label"
>
找不到对应游戏的链接点此
</span>
<el-button
type=
"text"
size=
"medium"
@
click=
"showCreateChannel = true"
>
新建渠道链接
</el-button>
<el-button
type=
"text"
size=
"medium"
@
click=
"showCreateChannel = true"
>
新建渠道链接
</el-button
>
</div>
</div>
<!--
...
...
@@ -100,21 +212,53 @@
-->
<div
v-else-if=
"activeName == '2'"
>
<el-collapse
:disabled=
"disabled"
>
<el-input
v-model=
"filterGameText"
placeholder=
"请输入游戏名 按回车搜索"
style=
"margin-top: 10px"
@
keydown
.
enter
.
native=
"changeGameText"
@
blur=
"changeGameText"
>
<el-input
v-model=
"filterGameText"
placeholder=
"请输入游戏名 按回车搜索"
style=
"margin-top: 10px"
@
keydown
.
enter
.
native=
"changeGameText"
@
blur=
"changeGameText"
>
<i
slot=
"prefix"
class=
"el-input__icon el-icon-search"
></i>
</el-input>
<el-collapse-item
v-for=
"(item, index) in regGameList"
:key=
"index"
:name=
"item.label"
>
<el-collapse-item
v-for=
"(item, index) in regGameList"
:key=
"index"
:name=
"item.label"
>
<
template
slot=
"title"
>
<div
class=
"title-with-icon"
>
<svg-icon
v-if=
"item.label.includes('微信')"
icon-class=
"wxgame"
class=
"game-icon"
/>
<svg-icon
v-else-if=
"item.label.includes('抖音')"
icon-class=
"douyin"
class=
"game-icon"
/>
<svg-icon
v-else-if=
"item.label.includes('安卓')"
icon-class=
"Android"
class=
"game-icon"
/>
<svg-icon
v-else-if=
"item.label.includes('IOS') || item.label.includes('iOS') || item.label.includes('ios')"
icon-class=
"IOS"
class=
"game-icon"
/>
<svg-icon
v-else-if=
"item.label.includes('H5') || item.label.includes('h5')"
icon-class=
"H5"
class=
"game-icon"
/>
v-if=
"item.label.includes('微信')"
icon-class=
"wxgame"
class=
"game-icon"
/>
<svg-icon
v-else-if=
"item.label.includes('抖音')"
icon-class=
"douyin"
class=
"game-icon"
/>
<svg-icon
v-else-if=
"item.label.includes('安卓')"
icon-class=
"Android"
class=
"game-icon"
/>
<svg-icon
v-else-if=
"
item.label.includes('IOS') ||
item.label.includes('iOS') ||
item.label.includes('ios')
"
icon-class=
"IOS"
class=
"game-icon"
/>
<svg-icon
v-else-if=
"
item.label.includes('H5') || item.label.includes('h5')
"
icon-class=
"H5"
class=
"game-icon"
/>
{{
item
.
label
}}
</div>
</
template
>
...
...
@@ -127,39 +271,64 @@
H5游戏 item.game_type == 2 icon 是 H5.svg
-->
<div
v-if=
"regGameList.length > 0"
>
<div
v-for=
"(items, indexs) in item.children"
:key=
"indexs"
class=
"gameListItem rowFlex columnCenter spaceBetween"
>
<div
v-for=
"(items, indexs) in item.children"
:key=
"indexs"
class=
"gameListItem rowFlex columnCenter spaceBetween"
>
<p>
{{ items.label + "/" + items.id }}
</p>
<!--game_type: 1 微信小游戏 2 H5 游戏 3 安卓游戏 4 IOS 游戏 5 抖音小游戏 -->
<!-- 微信小游戏 安卓游戏 IOS游戏 处理逻辑 -->
<el-popover
v-if=
"items.game_type == 1 || items.game_type == 3 || items.game_type == 4"
placement=
"top"
trigger=
"click"
>
<el-popover
v-if=
"
items.game_type == 1 ||
items.game_type == 3 ||
items.game_type == 4
"
placement=
"top"
trigger=
"click"
>
<p
class=
"sendLink"
@
click=
"sendChannelGame(items, item)"
>
发送链接/渠道二维码
</p>
<p
class=
"sendLink"
@
click=
"handleGameType(items, item, item.game_type, index)"
>
<p
class=
"sendLink"
@
click=
"
handleGameType(items, item, item.game_type, index)
"
>
发送落地页
</p>
<div
v-if=
"items.game_type == 1"
>
<!-- 发送 H5 安卓分身包 -->
<p
class=
"sendLink"
@
click=
"sendH5CloneGame(items,'android')"
@
click=
"sendH5CloneGame(items,
'android')"
>
发送H5-安卓分身包
</p>
<!-- 发送 H5 IOS 分身包 -->
<p
class=
"sendLink"
@
click=
"sendH5CloneGame(items,'ios')"
@
click=
"sendH5CloneGame(items,
'ios')"
>
发送H5-IOS分身包
</p>
</div>
<el-button
slot=
"reference"
size=
"mini"
:disabled=
"accountSelect == ''"
>
发送
</el-button>
<el-button
slot=
"reference"
size=
"mini"
:disabled=
"accountSelect == ''"
>
发送
</el-button
>
</el-popover>
<el-button
v-else
size=
"mini"
:disabled=
"accountSelect == ''"
@
click=
"noH5AndroidIOSGame(items, item)"
>
发送
</el-button>
<el-button
v-else
size=
"mini"
:disabled=
"accountSelect == ''"
@
click=
"noH5AndroidIOSGame(items, item)"
>
发送
</el-button
>
</div>
</div>
<!-- <div
...
...
@@ -170,12 +339,16 @@
<el-button type="text">加载中</el-button>
</div> -->
<div
v-else
class=
"rowFlex allCenter"
>
暂无游戏
</div>
</el-collapse-item>
</el-collapse>
<div
class=
"createChannel rowFlex allCenter"
>
<span
class=
"label"
>
找不到对应游戏的链接点此
</span>
<el-button
type=
"text"
size=
"medium"
@
click=
"showCreateChannel = true"
>
新建渠道链接
</el-button>
<el-button
type=
"text"
size=
"medium"
@
click=
"showCreateChannel = true"
>
新建渠道链接
</el-button
>
</div>
</div>
</div>
...
...
@@ -184,23 +357,62 @@
<p>
暂未绑定关联账号,请先去绑定账号
</p>
</div>
<!-- 新建渠道链接 -->
<createChannel
v-if=
"showCreateChannel"
:type=
"activeName"
:show=
"showCreateChannel"
:game-user-info=
"gameUserInfo"
@
close=
"showCreateChannel = false"
/>
<sendPage
v-if=
"showSendPage"
:show
.
sync=
"showSendPage"
:game-list=
"conversionGameList"
@
confirm=
"startSendPage"
/>
<createChannel
v-if=
"showCreateChannel"
:type=
"activeName"
:show=
"showCreateChannel"
:game-user-info=
"gameUserInfo"
@
close=
"showCreateChannel = false"
/>
<sendPage
v-if=
"showSendPage"
:show
.
sync=
"showSendPage"
:game-list=
"conversionGameList"
@
confirm=
"startSendPage"
/>
<!-- 小游戏转游判断 -->
<SendTransWxGame
v-if=
"showWxGameDrawer"
:show
.
sync=
"showWxGameDrawer"
:game-list=
"selectedWxGameList"
:chat-user-info=
"chatUserInfo"
@
close=
"SendTransWxGameClose"
@
confirm=
"handleWxGameConfirm"
/>
<SendTransAppGame
v-if=
"showAppGameDrawer"
:show
.
sync=
"showAppGameDrawer"
:game-list=
"selectedAppGameList"
:chat-user-info=
"chatUserInfo"
@
close=
"SendTransAppGameClose"
@
confirm=
"handleAppGameConfirm"
/>
<SendTransWxGame
v-if=
"showWxGameDrawer"
:show
.
sync=
"showWxGameDrawer"
:game-list=
"selectedWxGameList"
:chat-user-info=
"chatUserInfo"
@
close=
"SendTransWxGameClose"
@
confirm=
"handleWxGameConfirm"
/>
<SendTransAppGame
v-if=
"showAppGameDrawer"
:show
.
sync=
"showAppGameDrawer"
:game-list=
"selectedAppGameList"
:chat-user-info=
"chatUserInfo"
@
close=
"SendTransAppGameClose"
@
confirm=
"handleAppGameConfirm"
/>
<!-- 选择发送渠道 -->
<selectChannel
v-if=
"showLayer"
:show
.
sync=
"showLayer"
:chat-user=
"chatUserInfo"
:channel-info-list=
"channelInfoList"
/>
<selectChannel
v-if=
"showLayer"
:show
.
sync=
"showLayer"
:chat-user=
"chatUserInfo"
:channel-info-list=
"channelInfoList"
/>
<!-- 如果选择发送的渠道链接只有一个 直接发送 -->
<sendSelectChannel
:show
.
sync=
"showSendChannel"
:chat-user=
"chatUserInfo"
:channel-info-list=
"channelInfoList"
/>
<sendSelectChannel
:show
.
sync=
"showSendChannel"
:chat-user=
"chatUserInfo"
:channel-info-list=
"channelInfoList"
/>
<!-- 二维码生成组件 (隐藏) -->
<div
v-show=
"false"
class=
"qrcode-container"
>
<qrcode-vue
ref=
"qrcode"
:value=
"qrCodeValue"
:size=
"qrCodeSize"
level=
"H"
></qrcode-vue>
</div>
</div>
</template>
<
script
>
import
{
mapState
,
mapMutations
,
mapActions
}
from
'vuex'
import
{
mapState
,
mapMutations
,
mapActions
}
from
"vuex"
;
import
{
memberExtensionGameList
,
passwardEncryption
,
...
...
@@ -213,21 +425,29 @@ import {
getLandingPageMemberLink
,
getClonePackageLink
,
getLandingPageConfig
,
getMemberTransStatus
}
from
'@/api/game'
import
{
getRecentSendLog
,
markTransScene
,
getZqCserGroup
,
getZqCserWxBelong
,
getMediaId
,
send_log_add
}
from
'@/api/works'
import
{
companyviewConfig
}
from
'@/api/user'
import
{
throttle
,
throttleStart
}
from
'@/utils/index'
import
createChannel
from
'./sendGame/createChannel'
import
sendPage
from
'./sendGame/SendTransPage.vue'
import
SendTransWxGame
from
'./sendGame/SendTransWxGame.vue'
import
SendTransAppGame
from
'./sendGame/SendTransAppGame.vue'
import
selectChannel
from
'./sendGame/selectChannel.vue'
import
sendSelectChannel
from
'./sendGame/sendSelectChannel.vue'
import
gameLogMixin
from
'@/mixins/gameLogMixin'
import
{
sendChatMessage
}
from
'@/utils/index'
getMemberTransStatus
,
}
from
"@/api/game"
;
import
{
getRecentSendLog
,
markTransScene
,
getZqCserGroup
,
getZqCserWxBelong
,
getMediaId
,
send_log_add
,
}
from
"@/api/works"
;
import
{
companyviewConfig
}
from
"@/api/user"
;
import
{
throttle
,
throttleStart
}
from
"@/utils/index"
;
import
createChannel
from
"./sendGame/createChannel"
;
import
sendPage
from
"./sendGame/SendTransPage.vue"
;
import
SendTransWxGame
from
"./sendGame/SendTransWxGame.vue"
;
import
SendTransAppGame
from
"./sendGame/SendTransAppGame.vue"
;
import
selectChannel
from
"./sendGame/selectChannel.vue"
;
import
sendSelectChannel
from
"./sendGame/sendSelectChannel.vue"
;
import
gameLogMixin
from
"@/mixins/gameLogMixin"
;
import
{
sendChatMessage
}
from
"@/utils/index"
;
import
QrcodeVue
from
"qrcode.vue"
;
export
default
{
name
:
'sendGame'
,
name
:
"sendGame"
,
mixins
:
[
gameLogMixin
],
components
:
{
createChannel
,
...
...
@@ -235,7 +455,8 @@ export default {
SendTransWxGame
,
SendTransAppGame
,
selectChannel
,
sendSelectChannel
sendSelectChannel
,
QrcodeVue
,
},
data
()
{
return
{
...
...
@@ -250,15 +471,15 @@ export default {
weixin_blongs_id
:
[],
regGameList
:
[],
allRegGameList
:
[],
filterGameText
:
''
,
filterGameText
:
""
,
channelselectList
:
[],
webForm
:
{
channel_id
:
''
channel_id
:
""
,
},
sendLoading
:
false
,
belongList
:
[],
// 项目列表
activeName
:
'1'
,
// 转端 1 转游 2 召回 3
sendType
:
''
,
// 1 进发送链接 2 仅发送账号密码 3 发送链接和账号密码
activeName
:
"1"
,
// 转端 1 转游 2 召回 3
sendType
:
""
,
// 1 进发送链接 2 仅发送账号密码 3 发送链接和账号密码
showCreateChannel
:
false
,
showImageComposer
:
false
,
showWxGameDrawer
:
false
,
...
...
@@ -270,206 +491,227 @@ export default {
showLayer
:
false
,
showSendChannel
:
false
,
channelInfoList
:
{},
transMemberStatus
:
true
}
transMemberStatus
:
true
,
qrCodeValue
:
""
,
// 二维码内容
qrCodeSize
:
200
,
// 二维码大小
};
},
mounted
()
{
this
.
initDisable
()
this
.
sendGameInfo
()
this
.
initDisable
()
;
this
.
sendGameInfo
()
;
},
computed
:
{
...
mapState
(
'game'
,
[
'accountSelect'
,
'bindGameUserList'
,
'chatUserInfo'
,
'gameUserInfo'
,
'send_game_log'
]),
...
mapState
(
'user'
,
[
'userInfo'
,
'corp_id'
])
...
mapState
(
"game"
,
[
"accountSelect"
,
"bindGameUserList"
,
"chatUserInfo"
,
"gameUserInfo"
,
"send_game_log"
,
]),
...
mapState
(
"user"
,
[
"userInfo"
,
"corp_id"
]),
},
// props: [ 'chatUserInfo', 'chatUser'],
watch
:
{
accountSelect
(
newVal
,
oldVal
)
{
// 切换 w 账号的时候清空 conversionGameList 数据
this
.
conversionGameList
=
[]
this
.
getMemberTransStatus
()
if
(
newVal
&&
newVal
!==
''
&&
this
.
bindGameUserList
.
length
>
0
)
{
this
.
disabled
=
false
this
.
conversionGameList
=
[]
;
this
.
getMemberTransStatus
()
;
if
(
newVal
&&
newVal
!==
""
&&
this
.
bindGameUserList
.
length
>
0
)
{
this
.
disabled
=
false
;
}
else
{
this
.
disabled
=
true
this
.
disabled
=
true
;
}
},
activeName
(
newVal
,
oldVal
)
{
if
(
newVal
)
{
}
}
},
},
methods
:
{
...
mapMutations
(
'game'
,
[
'set_send_game_log'
]),
...
mapMutations
(
"game"
,
[
"set_send_game_log"
]),
initDisable
()
{
// 切换 w 账号的时候清空 conversionGameList 数据
this
.
conversionGameList
=
[]
this
.
getMemberTransStatus
()
if
(
this
.
accountSelect
&&
this
.
accountSelect
!==
''
&&
this
.
bindGameUserList
.
length
>
0
)
{
this
.
disabled
=
false
this
.
conversionGameList
=
[];
this
.
getMemberTransStatus
();
if
(
this
.
accountSelect
&&
this
.
accountSelect
!==
""
&&
this
.
bindGameUserList
.
length
>
0
)
{
this
.
disabled
=
false
;
}
else
{
this
.
disabled
=
true
this
.
disabled
=
true
;
}
},
channelInfo
(
info
)
{
this
.
channelInfoList
=
info
this
.
channelInfoList
=
info
;
// 只有 1 个渠道的时候 直接发送不出现弹窗
if
(
info
.
channelList
.
length
===
1
)
{
this
.
showSendChannel
=
true
this
.
showSendChannel
=
true
;
}
else
{
this
.
showLayer
=
true
this
.
showLayer
=
true
;
}
},
async
sendH5CloneGame
(
items
,
type
)
{
const
res
=
await
getClonePackageLink
({
mini_game_id
:
items
.
id
})
if
(
res
.
status_code
==
1
)
{
if
(
type
==
'android'
&&
!
res
?.
data
?.
data
?.
android_download_url
)
{
this
.
$message
.
warning
(
'安卓分身包链接不存在,请联系掌游配置'
)
return
}
else
if
(
type
==
'ios'
&&
!
res
?.
data
?.
data
?.
ios_download_url
)
{
this
.
$message
.
warning
(
'IOS分身包链接不存在,请联系掌游配置'
)
return
}
let
srt
=
''
if
(
type
==
'android'
)
{
srt
=
'安卓分身包链接: '
+
res
.
data
.
data
.
android_download_url
}
else
{
srt
=
'IOS分身包链接: '
+
res
.
data
.
data
.
ios_download_url
}
sendChatMessage
(
srt
,
'text'
)
}
else
{
this
.
$message
.
warning
(
res
.
msg
)
const
res
=
await
getClonePackageLink
({
mini_game_id
:
items
.
id
})
;
if
(
res
.
status_code
==
1
)
{
if
(
type
==
"android"
&&
!
res
?.
data
?.
data
?.
android_download_url
)
{
this
.
$message
.
warning
(
"安卓分身包链接不存在,请联系掌游配置"
);
return
;
}
else
if
(
type
==
"ios"
&&
!
res
?.
data
?.
data
?.
ios_download_url
)
{
this
.
$message
.
warning
(
"IOS分身包链接不存在,请联系掌游配置"
);
return
;
}
let
srt
=
""
;
if
(
type
==
"android"
)
{
srt
=
"安卓分身包链接: "
+
res
.
data
.
data
.
android_download_url
;
}
else
{
srt
=
"IOS分身包链接: "
+
res
.
data
.
data
.
ios_download_url
;
}
sendChatMessage
(
srt
,
"text"
);
}
else
{
this
.
$message
.
warning
(
res
.
msg
)
;
}
},
requestConfig
()
{
return
new
Promise
((
resolve
,
reject
)
=>
{
companyviewConfig
({
corp_id
:
this
.
corp_id
}).
then
((
res
)
=>
{
this
.
weixin_blongs_id
=
res
.
data
.
weixin_blongs_id
resolve
()
})
})
this
.
weixin_blongs_id
=
res
.
data
.
weixin_blongs_id
;
resolve
()
;
})
;
})
;
},
// 请求当前 W 账号是否符合转端条件 如果不符合 提示 当前w账号不满足转端要求,请联系组长处理
async
getMemberTransStatus
()
{
if
(
this
.
accountSelect
&&
this
.
accountSelect
!==
''
)
{
const
res
=
await
getMemberTransStatus
({
member_id
:
this
.
accountSelect
})
if
(
this
.
accountSelect
&&
this
.
accountSelect
!==
""
)
{
const
res
=
await
getMemberTransStatus
({
member_id
:
this
.
accountSelect
,
});
if
(
res
.
status_code
==
1
)
{
this
.
transMemberStatus
=
res
.
data
.
data
.
allow_trans
||
false
this
.
transMemberStatus
=
res
.
data
.
data
.
allow_trans
||
false
;
}
}
else
{
this
.
transMemberStatus
=
false
this
.
transMemberStatus
=
false
;
}
},
recallTabChange
()
{
this
.
activeName
=
'3'
this
.
sendGameRecallList
()
this
.
activeName
=
"3"
;
this
.
sendGameRecallList
()
;
},
async
requestGameSendLog
()
{
this
.
filterGameText
=
''
const
res
=
await
getRecentSendLog
()
this
.
filterGameText
=
""
;
const
res
=
await
getRecentSendLog
()
;
if
(
res
.
status_code
==
1
)
{
if
(
res
.
status_code
==
1
&&
res
.
data
.
length
>
0
)
{
res
.
data
.
map
((
item
)
=>
{
item
.
label
=
item
.
game_name
item
.
id
=
item
.
game_id
})
item
.
label
=
item
.
game_name
;
item
.
id
=
item
.
game_id
;
})
;
}
// 检查是否已经存在"最近发送"项
const
recentSendIndex
=
this
.
regGameList
.
findIndex
(
item
=>
item
.
label
===
'最近发送'
)
const
recentSendIndex
=
this
.
regGameList
.
findIndex
(
(
item
)
=>
item
.
label
===
"最近发送"
);
if
(
recentSendIndex
!==
-
1
)
{
// 如果已存在,更新它
this
.
$set
(
this
.
regGameList
[
recentSendIndex
],
'children'
,
res
.
data
)
this
.
$set
(
this
.
regGameList
[
recentSendIndex
],
"children"
,
res
.
data
);
}
else
{
// 如果不存在,添加它
this
.
regGameList
.
unshift
({
label
:
'最近发送'
,
children
:
res
.
data
})
label
:
"最近发送"
,
children
:
res
.
data
,
})
;
}
}
},
async
sendGameInfo
()
{
this
.
activeName
=
'1'
this
.
conversionGameList
=
[]
this
.
recallGameList
=
[]
this
.
getMemberTransStatus
()
await
this
.
requestConfig
()
this
.
sendGameList
()
this
.
activeName
=
"1"
;
this
.
conversionGameList
=
[]
;
this
.
recallGameList
=
[]
;
this
.
getMemberTransStatus
()
;
await
this
.
requestConfig
()
;
this
.
sendGameList
()
;
},
requestRegGameList
()
{
this
.
activeName
=
'2'
if
(
this
.
gameUserInfo
.
main_game_id
||
this
.
gameUserInfo
.
main_game_id
==
0
)
{
this
.
contentLoading
=
true
this
.
activeName
=
"2"
;
if
(
this
.
gameUserInfo
.
main_game_id
||
this
.
gameUserInfo
.
main_game_id
==
0
)
{
this
.
contentLoading
=
true
;
const
data
=
{
type
:
'gameListWithType'
,
value
:
''
,
type
:
"gameListWithType"
,
value
:
""
,
use_type
:
2
,
game_id
:
this
.
gameUserInfo
.
main_game_id
,
use_user_id
:
this
.
userInfo
.
id
,
weixin_blongs_id
:
this
.
weixin_blongs_id
}
weixin_blongs_id
:
this
.
weixin_blongs_id
,
}
;
selectSearch
(
data
).
then
((
res
)
=>
{
this
.
contentLoading
=
false
this
.
contentLoading
=
false
;
if
(
res
.
status_code
==
1
)
{
// 暂时隐藏快手小游戏
const
ksGameIndex
=
res
.
data
.
data
.
findIndex
(
item
=>
item
.
label
===
'快手小游戏'
)
const
ksGameIndex
=
res
.
data
.
data
.
findIndex
(
(
item
)
=>
item
.
label
===
"快手小游戏"
);
if
(
ksGameIndex
!==
-
1
)
{
res
.
data
.
data
.
splice
(
ksGameIndex
,
1
)
res
.
data
.
data
.
splice
(
ksGameIndex
,
1
)
;
}
this
.
regGameList
=
res
.
data
.
data
this
.
allRegGameList
=
this
.
regGameList
this
.
regGameList
=
res
.
data
.
data
;
this
.
allRegGameList
=
this
.
regGameList
;
}
this
.
requestGameSendLog
()
this
.
requestGameSendLog
()
;
setTimeout
(()
=>
{
this
.
contentLoading
=
false
},
2000
)
})
this
.
contentLoading
=
false
;
},
2000
)
;
})
;
}
else
{
}
},
onConfirm
()
{
},
onConfirm
()
{},
// 召回发送渠道
sendChannel
(
items
,
type
)
{
items
.
type
=
3
type
?
this
.
sendType
=
type
:
''
this
.
channelList
(
items
)
items
.
type
=
3
;
type
?
(
this
.
sendType
=
type
)
:
""
;
this
.
channelList
(
items
)
;
},
// 转游发送渠道
sendChannelGame
(
items
,
item
,
type
)
{
console
.
log
(
items
,
'items'
,
item
)
type
?
this
.
sendType
=
type
:
''
const
gameInfo
=
this
.
$clone
(
items
)
gameInfo
.
type
=
2
this
.
channelList
(
gameInfo
)
console
.
log
(
items
,
"items"
,
item
);
type
?
(
this
.
sendType
=
type
)
:
""
;
const
gameInfo
=
this
.
$clone
(
items
)
;
gameInfo
.
type
=
2
;
this
.
channelList
(
gameInfo
)
;
},
changeGameText
()
{
console
.
log
(
this
.
filterGameText
)
if
(
this
.
filterGameText
.
trim
()
===
''
)
{
this
.
regGameList
=
this
.
allRegGameList
console
.
log
(
this
.
filterGameText
)
;
if
(
this
.
filterGameText
.
trim
()
===
""
)
{
this
.
regGameList
=
this
.
allRegGameList
;
}
else
{
const
list
=
JSON
.
parse
(
JSON
.
stringify
(
this
.
allRegGameList
))
const
list
=
JSON
.
parse
(
JSON
.
stringify
(
this
.
allRegGameList
))
;
list
.
map
((
item
,
index
)
=>
{
item
.
children
=
item
.
children
.
filter
(
(
items
)
=>
items
.
label
.
indexOf
(
this
.
filterGameText
)
!==
-
1
)
})
this
.
regGameList
=
list
)
;
})
;
this
.
regGameList
=
list
;
}
},
// 获取渠道列表
channelList
(
items
)
{
console
.
log
(
items
,
'items'
)
console
.
log
(
items
,
"items"
);
const
data
=
{
game_id
:
items
.
game_id
||
items
.
id
,
page_size
:
200
,
page
:
1
,
zq_user_id
:
this
.
userInfo
.
id
,
weixin_blongs_id
:
items
.
weixin_blongs_id
?
[
items
.
weixin_blongs_id
]
:
this
.
weixin_blongs_id
,
request_system
:
'company_wx'
,
weixin_blongs_id
:
items
.
weixin_blongs_id
?
[
items
.
weixin_blongs_id
]
:
this
.
weixin_blongs_id
,
request_system
:
"company_wx"
,
member_id
:
this
.
accountSelect
,
use_type
:
this
.
activeName
}
use_type
:
this
.
activeName
,
}
;
channelList
(
data
).
then
((
res
)
=>
{
if
(
res
?.
data
?.
data
?.
data
?.
length
>
0
)
{
// 只有一个的时候自动发送渠道链接
...
...
@@ -477,89 +719,94 @@ export default {
game_id
:
items
.
game_id
||
items
.
id
,
use_type
:
this
.
activeName
,
sendType
:
this
.
sendType
,
channelList
:
res
.
data
.
data
.
data
}
channelList
:
res
.
data
.
data
.
data
,
}
;
// 只有 1 个渠道的时候 直接发送不出现弹窗
if
(
this
.
channelInfoList
.
channelList
.
length
===
1
)
{
this
.
showSendChannel
=
true
this
.
showSendChannel
=
true
;
}
else
{
this
.
showLayer
=
true
this
.
showLayer
=
true
;
}
this
.
sendGameLog
(
items
)
this
.
sendGameLog
(
items
)
;
}
else
{
this
.
$message
.
warning
(
'请到掌游创建运营渠道'
)
this
.
$message
.
warning
(
"请到掌游创建运营渠道"
);
}
})
})
;
},
showSendGameLayer
()
{
this
.
showLayer
=
true
this
.
showLayer
=
true
;
},
async
sendGameList
()
{
if
(
this
.
conversionGameList
.
length
==
0
)
{
this
.
contentLoading
=
true
this
.
contentLoading
=
true
;
// 获取召回转端的游戏列表 user_type: 1 转端 3 召回
const
res
=
await
getGameConfig
({
use_type
:
1
})
this
.
contentLoading
=
false
const
res
=
await
getGameConfig
({
use_type
:
1
})
;
this
.
contentLoading
=
false
;
if
(
res
.
status_code
===
1
&&
res
.
data
.
data
.
length
>
0
)
{
const
ksGameIndex
=
res
.
data
.
data
.
findIndex
(
item
=>
item
.
game_type
==
6
)
const
ksGameIndex
=
res
.
data
.
data
.
findIndex
(
(
item
)
=>
item
.
game_type
==
6
);
if
(
ksGameIndex
!=
-
1
)
{
res
.
data
.
data
.
splice
(
ksGameIndex
,
1
)
this
.
conversionGameList
=
res
.
data
.
data
res
.
data
.
data
.
splice
(
ksGameIndex
,
1
)
;
this
.
conversionGameList
=
res
.
data
.
data
;
}
else
{
this
.
conversionGameList
=
res
.
data
.
data
this
.
conversionGameList
=
res
.
data
.
data
;
}
}
setTimeout
(()
=>
{
this
.
contentLoading
=
false
},
2000
)
this
.
contentLoading
=
false
;
},
2000
)
;
}
},
async
conversionChangeOld
(
value
)
{
console
.
log
(
'请求数据'
,
this
.
conversionGameList
)
console
.
log
(
"请求数据"
,
this
.
conversionGameList
);
if
(
this
.
isReqeustData
)
{
return
return
;
}
try
{
this
.
isReqeustData
=
true
this
.
gameLoding
=
true
this
.
isReqeustData
=
true
;
this
.
gameLoding
=
true
;
// 使用 Promise.all 并发请求游戏列表数据
const
promiseList
=
this
.
conversionGameList
.
map
(
async
(
item
,
index
)
=>
{
// 如果已有子项数据则跳过
if
(
this
.
conversionGameList
[
index
].
children
?.
length
>
0
)
{
return
return
;
}
try
{
const
params
=
{
member_id
:
this
.
accountSelect
,
type
:
item
.
game_type
}
const
reslist
=
await
memberExtensionGameList
(
params
)
type
:
item
.
game_type
,
}
;
const
reslist
=
await
memberExtensionGameList
(
params
)
;
if
(
reslist
.
status_code
===
1
)
{
// 使用解构赋值简化数据设置
const
updates
=
{
children
:
reslist
.
data
?.
length
>
0
?
reslist
.
data
:
[],
send_trans_page_id
:
''
,
// 转端要发送的游戏 ID
isReqeustData
:
true
}
send_trans_page_id
:
""
,
// 转端要发送的游戏 ID
isReqeustData
:
true
,
}
;
Object
.
entries
(
updates
).
forEach
(([
key
,
value
])
=>
{
this
.
$set
(
this
.
conversionGameList
[
index
],
key
,
value
)
})
this
.
$set
(
this
.
conversionGameList
[
index
],
key
,
value
)
;
})
;
}
}
catch
(
error
)
{
console
.
error
(
`Failed to fetch game list for index
${
index
}
:`
,
error
)
console
.
error
(
`Failed to fetch game list for index
${
index
}
:`
,
error
);
// 设置空数组作为默认值
this
.
$set
(
this
.
conversionGameList
[
index
],
'children'
,
[])
this
.
$set
(
this
.
conversionGameList
[
index
],
"children"
,
[]);
}
})
})
;
await
Promise
.
all
(
promiseList
)
this
.
handleConversionGameList
()
await
Promise
.
all
(
promiseList
)
;
this
.
handleConversionGameList
()
;
}
catch
(
error
)
{
console
.
error
(
'Failed to fetch conversion game lists:'
,
error
)
console
.
error
(
"Failed to fetch conversion game lists:"
,
error
);
}
finally
{
this
.
gameLoding
=
false
this
.
isReqeustData
=
false
this
.
gameLoding
=
false
;
this
.
isReqeustData
=
false
;
}
},
// 处理转端数据 之前王鑫和冯渊说要隐藏破日开天游戏 至于什么时候放开 没说
...
...
@@ -567,38 +814,72 @@ export default {
if
(
this
.
conversionGameList
.
length
>
0
)
{
this
.
conversionGameList
.
forEach
((
item
,
index
)
=>
{
// 隐藏 h5的游戏 912:神权之战 784:荣耀时刻
if
(
item
.
game_type
===
2
&&
item
.
children
&&
item
.
children
.
length
>
0
)
{
const
filteredChildren
=
item
.
children
.
filter
(
child
=>
{
return
child
.
game_id
!==
'912'
&&
child
.
game_id
!=
'784'
})
this
.
$set
(
this
.
conversionGameList
[
index
],
'children'
,
filteredChildren
)
if
(
item
.
game_type
===
2
&&
item
.
children
&&
item
.
children
.
length
>
0
)
{
const
filteredChildren
=
item
.
children
.
filter
((
child
)
=>
{
return
child
.
game_id
!==
"912"
&&
child
.
game_id
!=
"784"
;
});
this
.
$set
(
this
.
conversionGameList
[
index
],
"children"
,
filteredChildren
);
}
// 隐藏安卓游戏 安卓游戏 game_type: 3
if
(
item
.
game_type
===
3
&&
item
.
children
&&
item
.
children
.
length
>
0
)
{
if
(
item
.
game_type
===
3
&&
item
.
children
&&
item
.
children
.
length
>
0
)
{
// 过滤掉 game_name 为"破日开天"的数据
const
filteredChildren
=
item
.
children
.
filter
(
child
=>
{
return
child
.
game_name
!==
'破日开天'
&&
child
.
game_name
!==
'英雄霸业'
&&
child
.
game_id
!==
'741'
&&
child
.
game_id
!==
'912'
})
this
.
$set
(
this
.
conversionGameList
[
index
],
'children'
,
filteredChildren
)
const
filteredChildren
=
item
.
children
.
filter
((
child
)
=>
{
return
(
child
.
game_name
!==
"破日开天"
&&
child
.
game_name
!==
"英雄霸业"
&&
child
.
game_id
!==
"741"
&&
child
.
game_id
!==
"912"
);
});
this
.
$set
(
this
.
conversionGameList
[
index
],
"children"
,
filteredChildren
);
}
// 隐藏 IOS 游戏 雄霸天下 有两个包 1 个是 691 一个是 819 王鑫说 暂时先隐藏 691 的功能
if
(
item
.
game_type
===
4
&&
item
.
children
&&
item
.
children
.
length
>
0
)
{
const
filteredChildren
=
item
.
children
.
filter
(
child
=>
{
return
Number
(
child
.
game_id
)
!==
691
})
this
.
$set
(
this
.
conversionGameList
[
index
],
'children'
,
filteredChildren
)
}
})
console
.
log
(
this
.
conversionGameList
,
'conversionGameList'
)
if
(
item
.
game_type
===
4
&&
item
.
children
&&
item
.
children
.
length
>
0
)
{
const
filteredChildren
=
item
.
children
.
filter
((
child
)
=>
{
return
Number
(
child
.
game_id
)
!==
691
;
});
this
.
$set
(
this
.
conversionGameList
[
index
],
"children"
,
filteredChildren
);
}
});
console
.
log
(
this
.
conversionGameList
,
"conversionGameList"
);
}
},
// 转端展开
async
conversionChange
(
value
)
{
if
(
value
&&
value
.
length
>
0
)
{
const
gameType
=
value
[
value
.
length
-
1
]
const
gameIndex
=
this
.
conversionGameList
.
findIndex
(
item
=>
item
.
game_type
===
gameType
)
if
(
!
this
.
conversionGameList
[
gameIndex
].
children
||
this
.
conversionGameList
[
gameIndex
].
children
.
length
==
0
)
{
this
.
gameLoding
=
true
const
gameType
=
value
[
value
.
length
-
1
];
const
gameIndex
=
this
.
conversionGameList
.
findIndex
(
(
item
)
=>
item
.
game_type
===
gameType
);
if
(
!
this
.
conversionGameList
[
gameIndex
].
children
||
this
.
conversionGameList
[
gameIndex
].
children
.
length
==
0
)
{
this
.
gameLoding
=
true
;
const
params
=
{
page_size
:
200
,
page
:
1
,
...
...
@@ -606,50 +887,60 @@ export default {
weixin_blongs_id
:
this
.
weixin_blongs_id
,
use_type
:
1
,
member_id
:
this
.
accountSelect
,
type
:
this
.
conversionGameList
[
gameIndex
].
game_type
}
const
reslist
=
await
getTransferRecallGameList
(
params
)
this
.
gameLoding
=
false
type
:
this
.
conversionGameList
[
gameIndex
].
game_type
,
}
;
const
reslist
=
await
getTransferRecallGameList
(
params
)
;
this
.
gameLoding
=
false
;
if
(
reslist
.
status_code
===
1
&&
reslist
.
data
.
data
.
length
>
0
)
{
this
.
$set
(
this
.
conversionGameList
[
gameIndex
],
'children'
,
reslist
.
data
.
data
)
this
.
$set
(
this
.
conversionGameList
[
gameIndex
],
"children"
,
reslist
.
data
.
data
);
}
else
{
this
.
$set
(
this
.
conversionGameList
[
gameIndex
],
'children'
,
[])
this
.
$set
(
this
.
conversionGameList
[
gameIndex
],
"children"
,
[]);
}
setTimeout
(()
=>
{
this
.
gameLoding
=
false
},
2000
)
this
.
gameLoding
=
false
;
},
2000
)
;
}
else
{
}
}
},
// 召回的游戏列表
async
sendGameRecallList
()
{
if
(
this
.
recallGameList
.
length
==
0
)
{
this
.
contentLoading
=
true
const
res
=
await
getGameConfig
({
use_type
:
3
})
this
.
contentLoading
=
false
this
.
contentLoading
=
true
;
const
res
=
await
getGameConfig
({
use_type
:
3
})
;
this
.
contentLoading
=
false
;
if
(
res
.
status_code
===
1
&&
res
.
data
.
data
.
length
>
0
)
{
const
ksGameIndex
=
res
.
data
.
data
.
findIndex
(
item
=>
item
.
game_type
==
6
)
const
ksGameIndex
=
res
.
data
.
data
.
findIndex
(
(
item
)
=>
item
.
game_type
==
6
);
if
(
ksGameIndex
!==
-
1
)
{
res
.
data
.
data
.
splice
(
ksGameIndex
,
1
)
this
.
recallGameList
=
res
.
data
.
data
res
.
data
.
data
.
splice
(
ksGameIndex
,
1
)
;
this
.
recallGameList
=
res
.
data
.
data
;
}
else
{
this
.
recallGameList
=
res
.
data
.
data
this
.
recallGameList
=
res
.
data
.
data
;
}
}
setTimeout
(()
=>
{
this
.
contentLoading
=
false
},
2000
)
this
.
contentLoading
=
false
;
},
2000
)
;
}
},
// 召回展开
async
recallChange
(
value
)
{
if
(
value
&&
value
.
length
>
0
)
{
const
gameType
=
value
[
value
.
length
-
1
]
const
gameIndex
=
this
.
recallGameList
.
findIndex
(
item
=>
item
.
game_type
===
gameType
)
if
(
!
this
.
recallGameList
[
gameIndex
].
children
||
this
.
recallGameList
[
gameIndex
].
children
.
length
==
0
)
{
this
.
gameLoding
=
true
const
gameType
=
value
[
value
.
length
-
1
];
const
gameIndex
=
this
.
recallGameList
.
findIndex
(
(
item
)
=>
item
.
game_type
===
gameType
);
if
(
!
this
.
recallGameList
[
gameIndex
].
children
||
this
.
recallGameList
[
gameIndex
].
children
.
length
==
0
)
{
this
.
gameLoding
=
true
;
const
params
=
{
// type: 2,
page_size
:
200
,
...
...
@@ -658,86 +949,90 @@ export default {
weixin_blongs_id
:
this
.
weixin_blongs_id
,
use_type
:
3
,
member_id
:
this
.
accountSelect
,
type
:
this
.
recallGameList
[
gameIndex
].
game_type
}
const
reslist
=
await
getTransferRecallGameList
(
params
)
this
.
gameLoding
=
false
type
:
this
.
recallGameList
[
gameIndex
].
game_type
,
}
;
const
reslist
=
await
getTransferRecallGameList
(
params
)
;
this
.
gameLoding
=
false
;
if
(
reslist
.
status_code
===
1
&&
reslist
.
data
.
data
.
length
>
0
)
{
this
.
$set
(
this
.
recallGameList
[
gameIndex
],
'children'
,
reslist
.
data
.
data
)
this
.
$set
(
this
.
recallGameList
[
gameIndex
],
"children"
,
reslist
.
data
.
data
);
}
else
{
this
.
$set
(
this
.
recallGameList
[
gameIndex
],
'children'
,
[])
this
.
$set
(
this
.
recallGameList
[
gameIndex
],
"children"
,
[]);
}
setTimeout
(()
=>
{
this
.
gameLoding
=
false
},
2000
)
this
.
gameLoding
=
false
;
},
2000
)
;
}
else
{
console
.
log
(
'之前请求过了'
)
console
.
log
(
"之前请求过了"
);
}
}
},
showPopover
()
{
this
.
showCreateChannel
=
false
this
.
isReqeustData
=
false
this
.
showCreateChannel
=
false
;
this
.
isReqeustData
=
false
;
},
handlePopover
()
{
this
.
showCreateChannel
=
false
this
.
showCreateChannel
=
false
;
},
handleAccount
()
{
if
(
this
.
bindGameUserList
.
length
>
0
)
{
const
account
=
this
.
bindGameUserList
.
find
(
(
item
)
=>
item
.
member_id
==
this
.
accountSelect
)
)
;
if
(
account
)
{
return
true
return
true
;
}
else
{
return
false
return
false
;
}
}
else
{
return
false
return
false
;
}
},
sendLink
:
throttle
(
function
(
item
,
type
)
{
if
(
!
this
.
transMemberStatus
)
{
this
.
$message
.
warning
(
'当前w账号不满足转端要求,请联系组长处理'
)
return
this
.
$message
.
warning
(
"当前w账号不满足转端要求,请联系组长处理"
);
return
;
}
console
.
log
(
item
,
'转端发送仅发送链接'
)
const
result
=
this
.
handleAccount
()
console
.
log
(
item
,
"转端发送仅发送链接"
);
const
result
=
this
.
handleAccount
()
;
if
(
!
result
)
{
this
.
$message
.
warning
(
'请稍后再试'
)
return
false
this
.
$message
.
warning
(
"请稍后再试"
);
return
false
;
}
let
str
=
''
let
str
=
""
;
if
(
type
==
2
)
{
str
=
'网页游戏链接:'
str
=
"网页游戏链接:"
;
}
else
if
(
type
==
3
)
{
str
=
'安卓游戏链接:'
str
=
"安卓游戏链接:"
;
}
else
if
(
type
==
4
)
{
str
=
'IOS游戏链接:'
str
=
"IOS游戏链接:"
;
}
else
{
}
// const list = [
// { msgtype: 'text', text: { content: `${str}${item.url}` }}
// ]
this
.
sendChatMessage
(
`
${
str
}${
item
.
url
}
`
,
'text'
)
this
.
markTransScene
(
type
)
item
.
type
=
1
this
.
sendGameLog
(
item
)
this
.
sendChatMessage
(
`
${
str
}${
item
.
url
}
`
,
"text"
);
this
.
markTransScene
(
type
)
;
item
.
type
=
1
;
this
.
sendGameLog
(
item
)
;
},
500
),
sendPassword
:
throttle
(
function
(
item
,
type
)
{
if
(
!
this
.
transMemberStatus
)
{
this
.
$message
.
warning
(
'当前w账号不满足转端要求,请联系组长处理'
)
return
this
.
$message
.
warning
(
"当前w账号不满足转端要求,请联系组长处理"
);
return
;
}
console
.
log
(
item
,
'转端仅发送账号密码'
)
const
result
=
this
.
handleAccount
()
console
.
log
(
item
,
"转端仅发送账号密码"
);
const
result
=
this
.
handleAccount
()
;
if
(
!
result
)
{
this
.
$message
.
warning
(
'请稍后再试'
)
return
false
this
.
$message
.
warning
(
"请稍后再试"
);
return
false
;
}
const
username
=
this
.
bindGameUserList
.
find
(
(
items
)
=>
items
.
member_id
==
this
.
accountSelect
).
username
).
username
;
passwardEncryption
({
member_id
:
this
.
accountSelect
})
.
then
((
res
)
=>
{
// const list = [
...
...
@@ -747,132 +1042,237 @@ export default {
// }
// ]
// this.set_sendSkillMessage(list)
this
.
sendChatMessage
(
`账号:
${
username
}
\n密码:
${
res
.
data
.
password
}
`
,
'text'
)
this
.
markTransScene
(
type
)
this
.
sendGameLog
(
item
)
this
.
sendChatMessage
(
`账号:
${
username
}
\n密码:
${
res
.
data
.
password
}
`
,
"text"
);
this
.
markTransScene
(
type
);
this
.
sendGameLog
(
item
);
})
.
catch
((
err
)
=>
{
const
list
=
[
{
msgtype
:
'text'
,
text
:
{
content
:
`账号:
${
username
}
`
}
}
]
{
msgtype
:
"text"
,
text
:
{
content
:
`账号:
${
username
}
`
}
},
]
;
// this.set_sendSkillMessage(list)
this
.
sendChatMessage
(
`账号:
${
username
}
`
,
'text'
)
item
.
type
=
1
this
.
sendGameLog
(
item
)
console
.
log
(
err
)
})
this
.
sendChatMessage
(
`账号:
${
username
}
`
,
"text"
);
item
.
type
=
1
;
this
.
sendGameLog
(
item
)
;
console
.
log
(
err
)
;
})
;
},
500
),
sendMessage
:
throttle
(
function
(
item
,
type
)
{
if
(
!
this
.
transMemberStatus
)
{
this
.
$message
.
warning
(
'当前w账号不满足转端要求,请联系组长处理'
)
return
this
.
$message
.
warning
(
"当前w账号不满足转端要求,请联系组长处理"
);
return
;
}
const
result
=
this
.
handleAccount
()
const
result
=
this
.
handleAccount
()
;
if
(
!
result
)
{
this
.
$message
.
warning
(
'请稍后再试'
)
return
false
this
.
$message
.
warning
(
"请稍后再试"
);
return
false
;
}
let
str
=
''
let
str
=
""
;
if
(
type
==
2
)
{
str
=
'网页游戏链接:'
str
=
"网页游戏链接:"
;
}
else
if
(
type
==
3
)
{
str
=
'安卓游戏链接:'
str
=
"安卓游戏链接:"
;
}
else
if
(
type
==
4
)
{
str
=
'IOS游戏链接:'
str
=
"IOS游戏链接:"
;
}
else
{
}
const
username
=
this
.
bindGameUserList
.
find
(
(
items
)
=>
items
.
member_id
==
this
.
accountSelect
).
username
).
username
;
passwardEncryption
({
member_id
:
this
.
accountSelect
})
.
then
((
res
)
=>
{
const
list
=
[
{
msgtype
:
'text'
,
msgtype
:
"text"
,
text
:
{
content
:
`
${
str
}${
item
.
url
}
\n账号:
${
username
}
\n密码:
${
res
.
data
.
password
}
`
,
key
:
res
.
data
.
key
,
iv
:
res
.
data
.
iv
}
}
]
key
:
res
.
data
.
key
,
iv
:
res
.
data
.
iv
,
},
},
];
// this.set_sendSkillMessage(list)
this
.
sendChatMessage
(
`
${
str
}${
item
.
url
}
\n账号:
${
username
}
\n密码:
${
res
.
data
.
password
}
`
,
'text'
)
this
.
markTransScene
(
type
)
item
.
type
=
1
this
.
sendGameLog
(
item
)
this
.
sendChatMessage
(
`
${
str
}${
item
.
url
}
\n账号:
${
username
}
\n密码:
${
res
.
data
.
password
}
`
,
"text"
);
this
.
markTransScene
(
type
);
item
.
type
=
1
;
this
.
sendGameLog
(
item
);
})
.
catch
((
err
)
=>
{
const
list
=
[
{
msgtype
:
'text'
,
text
:
{
content
:
`
${
str
}${
item
.
url
}
\n账号:
${
username
}
`
}
}
]
msgtype
:
"text"
,
text
:
{
content
:
`
${
str
}${
item
.
url
}
\n账号:
${
username
}
`
}
,
}
,
]
;
// this.set_sendSkillMessage(list)
this
.
sendChatMessage
(
`
${
str
}${
item
.
url
}
\n账号:
${
username
}
`
,
'text'
)
this
.
sendGameLog
(
item
)
console
.
log
(
err
)
})
this
.
sendChatMessage
(
`
${
str
}${
item
.
url
}
\n账号:
${
username
}
`
,
"text"
);
this
.
sendGameLog
(
item
)
;
console
.
log
(
err
)
;
})
;
},
500
),
// 发送游戏落地页
startSendPage
(
value
)
{
console
.
log
(
value
,
'value'
)
console
.
log
(
value
,
"value"
);
// this.set_sendSkillMessage(list)
this
.
getMediaId
(
value
,
'image'
)
this
.
getMediaId
(
value
,
"image"
);
},
// 转端发送落地页面
sendDownLoadPage
:
throttleStart
(
function
(
items
,
type
,
index
)
{
if
(
!
this
.
transMemberStatus
)
{
this
.
$message
.
warning
(
'当前w账号不满足转端要求,请联系组长处理'
)
return
this
.
$message
.
warning
(
"当前w账号不满足转端要求,请联系组长处理"
);
return
;
}
this
.
$set
(
this
.
conversionGameList
[
index
],
"send_trans_page_id"
,
items
.
game_id
);
this
.
showSendPage
=
true
;
},
500
),
// 转端发送游戏二维码
sendDownLoadQrCode
:
throttleStart
(
async
function
(
items
,
type
,
index
)
{
if
(
!
this
.
transMemberStatus
)
{
this
.
$message
.
warning
(
"当前w账号不满足转端要求,请联系组长处理"
);
return
;
}
const
result
=
this
.
handleAccount
();
if
(
!
result
)
{
this
.
$message
.
warning
(
"请稍后再试"
);
return
false
;
}
try
{
this
.
sendLoading
=
true
;
// 获取游戏落地页链接
let
landingPageUrl
=
""
;
if
(
items
.
url
)
{
landingPageUrl
=
items
.
url
;
}
if
(
!
landingPageUrl
)
{
this
.
$message
.
error
(
"没有有效的链接可生成二维码"
);
return
;
}
// 设置二维码内容
this
.
qrCodeValue
=
landingPageUrl
;
// 等待DOM更新,确保二维码已生成
await
this
.
$nextTick
();
// 获取二维码canvas并转换为Blob
const
canvas
=
this
.
$refs
.
qrcode
.
$el
.
querySelector
(
"canvas"
);
if
(
!
canvas
)
{
throw
new
Error
(
"获取二维码canvas失败"
);
}
const
blob
=
await
new
Promise
((
resolve
)
=>
{
canvas
.
toBlob
((
blob
)
=>
{
resolve
(
blob
);
},
"image/png"
);
});
// 创建File对象
blob
.
name
=
"qrcode.png"
;
// 上传图片
const
uploadConfig
=
{
dir
:
"/company_wx/service/avatars/"
,
};
const
uploadResult
=
await
this
.
uploading
(
blob
,
uploadConfig
);
debugger
;
if
(
uploadResult
.
data
)
{
// 发送上传后的链接
// const list = [
// {
// msgtype: "image",
// image: {
// picurl: uploadResult.data,
// },
// },
// ];
const
image
=
{
picurl
:
uploadResult
.
data
,
};
this
.
sendChatMessage
(
image
,
"image"
);
this
.
markTransScene
(
type
);
item
.
type
=
1
;
this
.
sendGameLog
(
item
);
this
.
$message
.
success
(
"二维码发送成功"
);
}
else
{
throw
new
Error
(
"上传失败"
);
}
}
catch
(
error
)
{
console
.
error
(
"发送二维码失败:"
,
error
);
this
.
$message
.
error
(
"发送二维码失败,请重试"
);
}
finally
{
this
.
sendLoading
=
false
;
}
this
.
$set
(
this
.
conversionGameList
[
index
],
'send_trans_page_id'
,
items
.
game_id
)
this
.
showSendPage
=
true
},
500
),
// 转端标记
async
markTransScene
(
type
)
{
const
data
=
{
external_userid
:
this
.
chatUserInfo
.
external_userid
,
trans_scene
:
type
}
const
res
=
await
markTransScene
(
data
)
trans_scene
:
type
,
}
;
const
res
=
await
markTransScene
(
data
)
;
if
(
res
.
status_code
==
1
)
{
console
.
log
(
'标记转端成功'
)
if
(
this
.
chatUserInfo
.
trans_scene
&&
this
.
chatUserInfo
.
trans_scene
!==
''
&&
this
.
chatUserInfo
.
trans_scene
!=
type
)
{
this
.
chatUserInfo
.
trans_scene
=
type
console
.
log
(
"标记转端成功"
);
if
(
this
.
chatUserInfo
.
trans_scene
&&
this
.
chatUserInfo
.
trans_scene
!==
""
&&
this
.
chatUserInfo
.
trans_scene
!=
type
)
{
this
.
chatUserInfo
.
trans_scene
=
type
;
}
}
},
getZqCserWxBelong
()
{
return
new
Promise
(
async
(
resolve
,
reject
)
=>
{
const
data
=
{
zq_user_id
:
Number
(
this
.
userInfo
.
id
)
}
const
res
=
await
getZqCserWxBelong
(
data
)
zq_user_id
:
Number
(
this
.
userInfo
.
id
)
,
}
;
const
res
=
await
getZqCserWxBelong
(
data
)
;
if
(
res
.
status_code
===
1
&&
res
.
data
.
data
)
{
this
.
belongList
=
res
.
data
.
data
.
map
(
item
=>
{
this
.
belongList
=
res
.
data
.
data
.
map
(
(
item
)
=>
{
return
{
value
:
item
.
value
,
label
:
item
.
label
&&
item
.
label
.
split
(
'-'
)[
0
]
?
item
.
label
.
split
(
'-'
)[
0
]
:
''
}
})
resolve
(
this
.
belongList
)
label
:
item
.
label
&&
item
.
label
.
split
(
"-"
)[
0
]
?
item
.
label
.
split
(
"-"
)[
0
]
:
""
,
};
});
resolve
(
this
.
belongList
);
}
else
{
this
.
$message
.
warning
(
'暂无绑定项目,请先绑定项目'
)
reject
(
null
)
this
.
$message
.
warning
(
"暂无绑定项目,请先绑定项目"
);
reject
(
null
)
;
}
})
})
;
},
// 一键发送任务链接
async
sendTaskChannel
()
{
let
groupItem
=
{}
let
belonsList
=
{}
const
group
=
await
getZqCserGroup
({
zq_user_id
:
Number
(
this
.
userInfo
.
id
)
})
belonsList
=
await
this
.
getZqCserWxBelong
()
if
(
group
.
status_code
==
1
&&
group
.
data
.
data
.
length
>
0
&&
belonsList
&&
belonsList
.
length
>
0
)
{
groupItem
=
group
.
data
.
data
[
0
]
const
group_name_list
=
groupItem
.
label
.
split
(
'-'
)
let
groupItem
=
{};
let
belonsList
=
{};
const
group
=
await
getZqCserGroup
({
zq_user_id
:
Number
(
this
.
userInfo
.
id
),
});
belonsList
=
await
this
.
getZqCserWxBelong
();
if
(
group
.
status_code
==
1
&&
group
.
data
.
data
.
length
>
0
&&
belonsList
&&
belonsList
.
length
>
0
)
{
groupItem
=
group
.
data
.
data
[
0
];
const
group_name_list
=
groupItem
.
label
.
split
(
"-"
);
const
data
=
{
blongs_name
:
belonsList
[
0
].
label
,
member_id
:
this
.
accountSelect
,
...
...
@@ -880,27 +1280,27 @@ export default {
use_user_name
:
this
.
userInfo
.
username
,
group_id
:
groupItem
.
value
,
group_name
:
group_name_list
[
group_name_list
.
length
-
1
],
game_type
:
this
.
chatUserInfo
.
trans_scene
||
''
}
this
.
sendLoading
=
true
game_type
:
this
.
chatUserInfo
.
trans_scene
||
""
,
}
;
this
.
sendLoading
=
true
;
try
{
setTimeout
(()
=>
{
this
.
sendLoading
=
false
},
3000
)
const
res
=
await
quickRecallChannelLink
(
data
)
this
.
sendLoading
=
false
this
.
sendLoading
=
false
;
},
3000
)
;
const
res
=
await
quickRecallChannelLink
(
data
)
;
this
.
sendLoading
=
false
;
if
(
res
.
status_code
==
1
)
{
this
.
sendGameInfoSave
=
res
.
data
.
data
this
.
handleSendType
(
res
.
data
.
data
)
this
.
$message
.
success
(
res
.
msg
)
this
.
sendGameInfoSave
=
res
.
data
.
data
;
this
.
handleSendType
(
res
.
data
.
data
)
;
this
.
$message
.
success
(
res
.
msg
)
;
}
}
catch
(
error
)
{
this
.
$message
.
error
(
'获取召回链接失败,请重新再试'
)
this
.
sendLoading
=
false
this
.
$message
.
error
(
"获取召回链接失败,请重新再试"
);
this
.
sendLoading
=
false
;
}
}
else
{
this
.
$message
.
error
(
'获取分组失败,请到掌权添加分组'
)
return
this
.
$message
.
error
(
"获取分组失败,请到掌权添加分组"
);
return
;
}
},
/**
...
...
@@ -917,16 +1317,17 @@ export default {
*/
handleSendType
(
data
)
{
console
.
log
(
data
,
'获取一键发送的信息'
)
console
.
log
(
data
,
"获取一键发送的信息"
);
// 转端发送优先逻辑 不需要了 现在发送当前会话框选中的账号对应的注册游戏
data
?.
game_data
?.
game_type
?
this
.
chatUserInfo
.
trans_scene
=
data
.
game_data
.
game_type
:
''
data
?.
game_data
?.
game_type
?
(
this
.
chatUserInfo
.
trans_scene
=
data
.
game_data
.
game_type
)
:
""
;
if
(
this
.
chatUserInfo
.
trans_scene
&&
this
.
chatUserInfo
.
trans_scene
!=
1
)
{
this
.
sendCreateChannel
(
data
.
game_data
,
data
.
game_data
.
game_type
)
this
.
sendCreateChannel
(
data
.
game_data
,
data
.
game_data
.
game_type
)
;
}
else
{
// 没有转端标记过,发送小程序链接 判断标题和封面是否存在 存在发小程序卡片 不存在发二维码
if
(
data
.
share_data
.
share_title
&&
data
.
share_data
.
share_img
)
{
const
miniprogramInfo
=
{
const
miniprogramInfo
=
{
appid
:
data
.
share_data
.
app_id
,
rawid
:
data
.
share_data
.
raw_id
,
channle_id
:
data
.
share_data
.
channel_key
,
...
...
@@ -934,182 +1335,210 @@ export default {
title
:
data
.
share_data
.
share_title
,
platform
:
27
,
page
:
data
.
share_data
.
page
,
imgUrl
:
data
.
share_data
.
share_img
}
imgUrl
:
data
.
share_data
.
share_img
,
}
;
// this.set_sendSkillMessage(list)
this
.
sendChatMessage
(
miniprogramInfo
,
'miniprogram'
)
const
game_data
=
this
.
$clone
(
data
.
game_data
)
game_data
.
type
=
3
console
.
log
(
game_data
,
'data----------'
)
this
.
sendGameLog
(
game_data
)
this
.
sendChatMessage
(
miniprogramInfo
,
"miniprogram"
);
const
game_data
=
this
.
$clone
(
data
.
game_data
)
;
game_data
.
type
=
3
;
console
.
log
(
game_data
,
"data----------"
);
this
.
sendGameLog
(
game_data
)
;
}
else
{
// this.set_sendSkillMessage(list)
this
.
getMediaId
(
data
.
game_data
.
game_url
,
'image'
)
this
.
sendGameLog
(
data
.
game_data
)
this
.
getMediaId
(
data
.
game_data
.
game_url
,
"image"
);
this
.
sendGameLog
(
data
.
game_data
)
;
}
}
this
.
recallChannelSeq
(
data
)
this
.
recallChannelSeq
(
data
)
;
},
// 召回染色
async
recallChannelSeq
(
data
)
{
const
param
=
{
game_id
:
data
.
game_data
.
game_id
,
member_id
:
this
.
accountSelect
,
key
:
data
.
game_data
.
channel_key
||
data
.
share_data
.
channel_key
}
const
res
=
await
recallChannelSeq
(
param
)
key
:
data
.
game_data
.
channel_key
||
data
.
share_data
.
channel_key
,
}
;
const
res
=
await
recallChannelSeq
(
param
)
;
},
sendCreateChannel
:
throttle
(
function
(
item
,
type
)
{
const
result
=
this
.
handleAccount
()
const
result
=
this
.
handleAccount
()
;
if
(
!
result
)
{
this
.
$message
.
warning
(
'请稍后再试'
)
return
false
this
.
$message
.
warning
(
"请稍后再试"
);
return
false
;
}
let
str
=
''
let
str
=
""
;
if
(
type
==
2
)
{
str
=
'网页游戏链接:'
str
=
"网页游戏链接:"
;
}
else
if
(
type
==
3
)
{
str
=
'安卓游戏链接:'
str
=
"安卓游戏链接:"
;
}
else
if
(
type
==
4
)
{
str
=
'IOS游戏链接:'
str
=
"IOS游戏链接:"
;
}
else
{
}
const
username
=
this
.
bindGameUserList
.
find
(
(
items
)
=>
items
.
member_id
==
this
.
accountSelect
).
username
passwardEncryption
({
member_id
:
this
.
accountSelect
})
.
then
((
res
)
=>
{
).
username
;
passwardEncryption
({
member_id
:
this
.
accountSelect
}).
then
((
res
)
=>
{
const
list
=
[
{
msgtype
:
'text'
,
msgtype
:
"text"
,
// 一键发送渠道任务相关的参数
taskInfo
:
{
task_id
:
this
.
chatUser
.
task_id
,
game_id
:
item
.
game_id
,
member_id
:
this
.
accountSelect
,
channel_key
:
item
.
channel_key
channel_key
:
item
.
channel_key
,
},
text
:
{
content
:
`
${
str
}${
item
.
game_url
}
\n账号:
${
username
}
\n密码:
${
res
.
data
.
password
}
`
,
key
:
res
.
data
.
key
,
iv
:
res
.
data
.
iv
}
}
]
key
:
res
.
data
.
key
,
iv
:
res
.
data
.
iv
,
},
},
];
// 这里需要特殊处理,因为有taskInfo参数
// this.set_sendSkillMessage(list)
this
.
sendChatMessage
(
`
${
str
}${
item
.
game_url
}
\n账号:
${
username
}
\n密码:
${
res
.
data
.
password
}
`
,
'text'
)
item
.
type
=
3
this
.
sendGameLog
(
item
)
})
this
.
sendChatMessage
(
`
${
str
}${
item
.
game_url
}
\n账号:
${
username
}
\n密码:
${
res
.
data
.
password
}
`
,
"text"
);
item
.
type
=
3
;
this
.
sendGameLog
(
item
);
});
},
500
),
async
getLandingPageConfig
(
items
,
item
)
{
try
{
const
params
=
{
main_game_id
:
items
.
main_game_id
,
weixin_blongs_id
:
items
.
weixin_blongs_id
,
type
:
items
.
game_type
==
1
?
2
:
items
.
game_type
==
3
||
items
.
game_type
==
4
?
1
:
''
}
const
res
=
await
getLandingPageConfig
(
params
)
type
:
items
.
game_type
==
1
?
2
:
items
.
game_type
==
3
||
items
.
game_type
==
4
?
1
:
""
,
};
const
res
=
await
getLandingPageConfig
(
params
);
if
(
res
.
status_code
===
1
&&
res
.
data
)
{
return
{
data
:
res
.
data
,
game_type
:
items
.
game_type
}
game_type
:
items
.
game_type
,
}
;
}
else
{
return
null
}
}
catch
(
error
)
{
return
null
;
}
}
catch
(
error
)
{}
},
// 处理微信小程序游戏
handleWechatMiniGame
(
items
,
item
,
index
)
{
try
{
this
.
selectedWxGameList
=
[]
this
.
selectedWxGameList
=
[]
;
// 直接替换微信小游戏列表(单选)
this
.
selectedWxGameList
=
[
item
]
this
.
selectedWxGameList
[
0
].
send_trans_game_id
=
items
.
id
this
.
selectedWxGameList
[
0
].
send_trans_game_info
=
items
this
.
showWxGameDrawer
=
true
return
true
this
.
selectedWxGameList
=
[
item
]
;
this
.
selectedWxGameList
[
0
].
send_trans_game_id
=
items
.
id
;
this
.
selectedWxGameList
[
0
].
send_trans_game_info
=
items
;
this
.
showWxGameDrawer
=
true
;
return
true
;
}
catch
(
error
)
{
console
.
error
(
'处理微信小游戏失败:'
,
error
)
return
false
console
.
error
(
"处理微信小游戏失败:"
,
error
);
return
false
;
}
},
// 过滤游戏列表的公共方法
filterGameList
(
sourceGame
,
targetList
)
{
if
(
!
sourceGame
||
!
targetList
?.
length
)
return
[]
if
(
!
sourceGame
||
!
targetList
?.
length
)
return
[]
;
return
targetList
.
filter
(
game
=>
return
targetList
.
filter
(
(
game
)
=>
game
.
weixin_blongs_id
===
sourceGame
.
weixin_blongs_id
&&
game
.
main_game_id
===
sourceGame
.
main_game_id
)
)
;
},
handleAndroidList
(
items
,
item
)
{
const
androidGameList
=
this
.
regGameList
.
find
(
item
=>
item
.
label
.
includes
(
'安卓'
))
if
(
androidGameList
&&
androidGameList
.
children
&&
androidGameList
.
children
.
length
>
0
)
{
androidGameList
.
children
=
this
.
filterGameList
(
items
,
androidGameList
.
children
)
const
androidGameList
=
this
.
regGameList
.
find
((
item
)
=>
item
.
label
.
includes
(
"安卓"
)
);
if
(
androidGameList
&&
androidGameList
.
children
&&
androidGameList
.
children
.
length
>
0
)
{
androidGameList
.
children
=
this
.
filterGameList
(
items
,
androidGameList
.
children
);
}
else
{
androidGameList
.
children
=
[]
androidGameList
.
children
=
[]
;
}
androidGameList
.
game_type
=
3
androidGameList
.
game_type
=
3
;
if
(
items
.
game_type
==
3
)
{
androidGameList
.
android_game_id
=
items
.
id
androidGameList
.
android_game_info
=
items
androidGameList
.
android_game_id
=
items
.
id
;
androidGameList
.
android_game_info
=
items
;
}
return
androidGameList
return
androidGameList
;
},
handleIosList
(
items
,
item
)
{
const
IOSGameList
=
this
.
regGameList
.
find
(
item
=>
item
.
label
.
includes
(
'IOS'
||
'ios'
))
IOSGameList
.
game_type
=
4
if
(
IOSGameList
&&
IOSGameList
.
children
&&
IOSGameList
.
children
.
length
>
0
)
{
IOSGameList
.
children
=
this
.
filterGameList
(
items
,
IOSGameList
.
children
)
const
IOSGameList
=
this
.
regGameList
.
find
((
item
)
=>
item
.
label
.
includes
(
"IOS"
||
"ios"
)
);
IOSGameList
.
game_type
=
4
;
if
(
IOSGameList
&&
IOSGameList
.
children
&&
IOSGameList
.
children
.
length
>
0
)
{
IOSGameList
.
children
=
this
.
filterGameList
(
items
,
IOSGameList
.
children
);
}
else
{
IOSGameList
.
children
=
[]
IOSGameList
.
children
=
[]
;
}
if
(
items
.
game_type
==
4
)
{
IOSGameList
.
ios_game_id
=
items
.
id
IOSGameList
.
ios_game_info
=
items
IOSGameList
.
ios_game_id
=
items
.
id
;
IOSGameList
.
ios_game_info
=
items
;
}
return
IOSGameList
return
IOSGameList
;
},
// 处理安卓 IOS 游戏
handleAppGameList
(
items
,
item
,
index
)
{
this
.
showAppGameDrawer
=
true
const
androidGameList
=
this
.
handleAndroidList
(
items
,
item
)
const
IOSGameList
=
this
.
handleIosList
(
items
,
item
)
androidGameList
?
this
.
selectedAppGameList
.
push
(
androidGameList
)
:
''
IOSGameList
?
this
.
selectedAppGameList
.
push
(
IOSGameList
)
:
''
console
.
log
(
this
.
selectedAppGameList
,
'selectedAppGameList'
)
this
.
showAppGameDrawer
=
true
;
const
androidGameList
=
this
.
handleAndroidList
(
items
,
item
)
;
const
IOSGameList
=
this
.
handleIosList
(
items
,
item
)
;
androidGameList
?
this
.
selectedAppGameList
.
push
(
androidGameList
)
:
""
;
IOSGameList
?
this
.
selectedAppGameList
.
push
(
IOSGameList
)
:
""
;
console
.
log
(
this
.
selectedAppGameList
,
"selectedAppGameList"
);
},
// 主方法
async
handleGameType
(
items
,
item
,
type
,
index
)
{
if
((
items
.
game_type
==
1
||
items
.
game_type
==
3
||
items
.
game_type
==
4
)
&&
items
.
main_game_id
&&
items
.
weixin_blongs_id
)
{
const
result
=
await
this
.
getLandingPageConfig
(
items
,
item
)
if
(
(
items
.
game_type
==
1
||
items
.
game_type
==
3
||
items
.
game_type
==
4
)
&&
items
.
main_game_id
&&
items
.
weixin_blongs_id
)
{
const
result
=
await
this
.
getLandingPageConfig
(
items
,
item
);
if
(
result
&&
result
.
data
?.
data
?.
tag
)
{
if
(
items
.
game_type
==
1
)
{
// 处理微信小程序游戏
this
.
handleWechatMiniGame
(
items
,
item
,
index
)
this
.
handleWechatMiniGame
(
items
,
item
,
index
)
;
}
else
{
// 处理安卓/iOS游戏
this
.
handleAppGameList
(
items
,
item
,
index
)
this
.
handleAppGameList
(
items
,
item
,
index
)
;
}
}
else
{
this
.
sendChannelGame
(
items
,
item
)
this
.
sendChannelGame
(
items
,
item
)
;
}
}
else
{
this
.
sendChannelGame
(
items
,
item
)
this
.
sendChannelGame
(
items
,
item
)
;
}
},
// 不是小游戏 安卓 IOS 游戏处理
noH5AndroidIOSGame
(
items
,
item
)
{
this
.
sendChannelGame
(
items
,
item
)
this
.
sendChannelGame
(
items
,
item
)
;
},
// 小游戏游戏确认
async
handleWxGameConfirm
(
value
)
{
console
.
log
(
value
,
'value'
)
console
.
log
(
value
,
"value"
);
// const list = [
// {
// msgtype: 'image',
...
...
@@ -1119,17 +1548,17 @@ export default {
// }
// ]
// this.set_sendSkillMessage(list)
this
.
getMediaId
(
value
,
'image'
)
this
.
getMediaId
(
value
,
"image"
);
},
SendTransAppGameClose
()
{
this
.
selectedAppGameList
=
[]
this
.
selectedAppGameList
=
[]
;
},
SendTransWxGameClose
()
{
this
.
selectedWxGameList
=
[]
this
.
selectedWxGameList
=
[]
;
},
// 安卓或者 IOS 游戏处理
handleAppGameConfirm
(
data
)
{
this
.
selectedAppGameList
=
[]
this
.
selectedAppGameList
=
[]
;
// const list = [
// {
// msgtype: 'text',
...
...
@@ -1139,20 +1568,23 @@ export default {
// }
// ]
// this.set_sendSkillMessage(list)
this
.
sendChatMessage
(
`游戏地址:
${
data
.
landing_page_url
}
\n账号:
${
data
.
username
}
\n密码:
${
data
.
password
}
`
,
'text'
)
this
.
sendChatMessage
(
`游戏地址:
${
data
.
landing_page_url
}
\n账号:
${
data
.
username
}
\n密码:
${
data
.
password
}
`
,
"text"
);
},
async
getMediaId
(
picurl
)
{
// 发送图片作为链接消息
if
(
picurl
)
{
this
.
sendChatMessage
(
picurl
,
'image'
)
this
.
sendChatMessage
(
picurl
,
"image"
);
}
else
{
// 如果没有图片URL,提示用户
this
.
$message
.
error
(
'图片链接不存在,无法发送'
)
this
.
$message
.
error
(
"图片链接不存在,无法发送"
);
}
},
}
}
}
,
}
;
</
script
>
<
style
lang=
"scss"
scoped
>
.sendGameContent
{
...
...
@@ -1181,7 +1613,7 @@ export default {
}
.channelLoading
{
color
:
#3491
FA
;
color
:
#3491
fa
;
font-size
:
16px
;
text-align
:
center
;
padding
:
20px
;
...
...
@@ -1246,8 +1678,8 @@ export default {
}
::v-deep
.el-button
{
background
:
#3491
FA
;
border-color
:
#3491
FA
;
background
:
#3491
fa
;
border-color
:
#3491
fa
;
color
:
#fff
;
font-size
:
14px
;
height
:
32px
;
...
...
@@ -1268,8 +1700,8 @@ export default {
::v-deep
.el-popover__reference
{
.el-button
{
background
:
#3491
FA
;
border-color
:
#3491
FA
;
background
:
#3491
fa
;
border-color
:
#3491
fa
;
color
:
#fff
;
&:hover
{
...
...
@@ -1296,7 +1728,7 @@ export default {
font-size
:
14px
;
&:focus
{
border-color
:
#3491
FA
;
border-color
:
#3491
fa
;
}
}
...
...
@@ -1317,20 +1749,20 @@ export default {
/* 当转端按钮处于激活状态时保持自定义样式 */
::v-deep
.el-radio-button.is-active
{
.el-radio-button__inner
{
background
:
#
E8F7FF
;
border-color
:
#3491
FA
;
border
:
1px
solid
#3491
FA
;
color
:
#3491
FA
;
background
:
#
e8f7ff
;
border-color
:
#3491
fa
;
border
:
1px
solid
#3491
fa
;
color
:
#3491
fa
;
box-shadow
:
none
;
}
}
/* 统一collapse样式 */
::v-deep
.el-collapse-item__header
{
background-color
:
#
F7F8FA
;
background-color
:
#
f7f8fa
;
.el-collapse-item__arrow
{
color
:
#3491
FA
;
color
:
#3491
fa
;
}
}
}
...
...
@@ -1345,7 +1777,7 @@ export default {
}
.sendLink
:hover
{
color
:
#3491
FA
;
color
:
#3491
fa
;
background-color
:
#f5f7fa
;
}
</
style
>
src/views/components/roleInfo/roleInfoPanel.vue
浏览文件 @
a5bbf545
...
...
@@ -6,23 +6,69 @@
<p
class=
"textInfo"
>
角色充值金额信息会有5-10分钟延迟,请以订单信息为准
</p>
<el-button
type=
"primary"
size=
"small"
class=
"h-[30px]"
@
click
.
stop=
"appealLayer()"
>
申诉
</el-button>
</div>
<el-collapse
v-model=
"collapseActive"
@
change=
"handleChange"
>
<div
v-for=
"(items, indexs) in roleList"
:key=
"indexs"
class=
"contentItem mb-[10px]"
>
<el-button
type=
"primary"
size=
"small"
class=
"h-[30px]"
@
click
.
stop=
"appealLayer()"
>
申诉
</el-button
>
</div>
<el-collapse
v-model=
"collapseActive"
>
<div
v-for=
"(items, indexs) in roleList"
:key=
"indexs"
class=
"contentItem"
>
<div
class=
"title"
></div>
<el-collapse-item
:name=
"items.id"
>
<el-collapse-item
:name=
"items.
role_
id"
>
<template
slot=
"title"
>
<!--
<div
class=
"collapseTitle rowFlex columnCenter spaceBetween"
>
<p
class=
"hidden"
>
{{
items
.
role_name
}}
-
{{
items
.
server_name
}}
-
{{
items
.
recharge_total
?
items
.
recharge_total
+
'元'
:
'0元'
}}
</p>
<el-button
type=
"primary"
size=
"mini"
class=
"collapseTitleBtn"
@
click
.
stop=
"appealLayer(items)"
>
申诉
</el-button>
</div>
-->
<div
class=
"flex w-[100%] justify-between"
>
<div
class=
"py-[10px]"
>
<div
class=
"grid grid-cols-7 w-[100%] leading-[24px] gap-[8px] py-[12px]"
>
<div
class=
"col-span-3"
>
<div
class=
"text-[#323335] text-[16px] font-medium group hover:text-[#409EFF]"
>
<span
>
{{
items
.
role_name
}}
<i
class=
"group-hover:visible invisible"
v-copy=
"
`$
{items.role_name}-${items.server_name}-${
items.recharge_total || 0
}元`
"
>
</i
></span>
</div>
<div
class=
"text-[#4E5969] text-[14px]"
>
<span>
区服:
</span><span>
{{
items
.
server_name
}}
</span>
</div>
</div>
<div
class=
"col-span-2"
>
<div
class=
"text-[#4E5969] text-[14px]"
>
充值金额
</div>
<div
class=
"text-[#4E5969] text-[16px]"
>
<!--
<span>
{{
items
.
recharge_total
?
items
.
recharge_total
+
'元'
:
'0元'
}}
</span>
-->
<span>
{{
items
.
recharge_total
||
0
}}
</span>
</div>
</div>
<div
class=
"col-span-2"
@
click
.
stop=
"
() =>
recentActivitiesPopupInstance.instance.open(
items.role_id,
`$
{items.role_name}-${items.server_name}-${items.recharge_total}元`
)
"
>
<div
class=
"text-[#4E5969] text-[14px]"
>
近期要开
</div>
<el-button
type=
"text"
class=
"text-[16px] font-medium"
>
{{
getNumRoleIdList
(
items
.
role_id
)
}}
</el-button>
</div>
<!--
<div
class=
"py-[10px]"
>
<div
class=
"leading-[25px]"
>
<span>
角色名:
</span><span>
{{
items
.
role_name
}}
</span>
</div>
...
...
@@ -30,46 +76,38 @@
<span>
区服:
</span><span>
{{
items
.
server_name
}}
</span>
</div>
<div
class=
"leading-[25px]"
>
<span>
充值金额:
</span><span>
{{
items
.
recharge_total
?
items
.
recharge_total
+
'元'
:
'0元'
}}
</span>
<span>
充值金额:
</span><span>
{{
items
.
recharge_total
?
items
.
recharge_total
+
'元'
:
'0元'
}}
</span>
<vip-level
:role-info=
"items"
/>
</div>
</div>
<div
class=
"flex-1 h-0 flex justify-end items-start pt-[10px]"
>
<el-badge
:value=
"getNumRoleIdList(items.role_id)"
class=
"text-center leading-[0] ml-[8px]"
>
<el-button
type=
"primary"
size=
"mini"
@
click
.
stop=
"
() =>
recentActivitiesPopupInstance.instance.open(
items.role_id,
`$
{items.role_name}-${items.server_name}-${items.recharge_total}元`
)
">
近期要开
</el-button>
<el-button
type=
"primary"
size=
"mini"
@
click
.
stop=
"() => recentActivitiesPopupInstance.instance.open(items.role_id, `$
{items.role_name}-${items.server_name}-${items.recharge_total}元`)">近期要开
</el-button>
</el-badge>
</div>
</div>
-->
</div>
</
template
>
<div
class=
"item rowFlex columnCenter spaceBetween"
>
<div
class=
"w-full border-t-[1px] border-t-[#E5E7EB] border-dashed"
>
<!-- <div class="item rowFlex columnCenter spaceBetween">
<div class="rowFlex columnCenter">
<span class="label">区服:</span>
<p class="text">{{ items.server_name }}</p>
</div>
</div>
</div>
-->
<div
class=
"item rowFlex columnCenter spaceBetween"
>
<div
class=
"rowFlex columnCenter"
>
<span
class=
"label"
>
合区区服:
</span>
<p
class=
"text"
>
{{ items.merge_server_name }}
</p>
</div>
</div>
<div
class=
"item rowFlex columnCenter spaceBetween"
>
<!--
<div class="item rowFlex columnCenter spaceBetween">
<div class="rowFlex columnCenter">
<span class="label">角色名称:</span>
<p class="text">{{ items.role_name }}</p>
</div>
</div>
</div>
-->
<div
class=
"item rowFlex columnCenter spaceBetween"
>
<div
class=
"rowFlex columnCenter"
>
<span
class=
"label"
>
等级:
</span>
...
...
@@ -82,16 +120,16 @@
<p
class=
"text"
>
{{ items.combat_num }}
</p>
</div>
</div>
<div
class=
"item rowFlex columnCenter spaceBetween"
>
<!--
<div class="item rowFlex columnCenter spaceBetween">
<div class="rowFlex columnCenter">
<span class="label">充值金额:</span>
<p class="text">{{ items.recharge_total }}</p>
</div>
</div>
</div>
-->
<div
class=
"item rowFlex columnCenter spaceBetween"
>
<div
class=
"rowFlex columnCenter"
>
<span
class=
"label"
>
转端审核:
</span>
<p
class=
"text"
>
{{ items.trans_status_name || '无'
}}
</p>
<p
class=
"text"
>
{{ items.trans_status_name || "无"
}}
</p>
</div>
</div>
<div
class=
"item rowFlex columnCenter spaceBetween"
>
...
...
@@ -106,7 +144,7 @@
<p
class=
"text"
>
{{
$moment(items.last_login_time * 1000).format(
'YYYY-MM-DD HH:mm:ss'
"YYYY-MM-DD HH:mm:ss"
)
}}
</p>
...
...
@@ -118,7 +156,7 @@
<p
class=
"text"
>
{{
$moment(items.create_time * 1000).format(
'YYYY-MM-DD HH:mm:ss'
"YYYY-MM-DD HH:mm:ss"
)
}}
</p>
...
...
@@ -130,29 +168,48 @@
<p
class=
"text"
>
{{ items.create_role_day }}天
</p>
</div>
</div>
<div
class=
"item rowFlex columnCenter spaceBetween"
>
<div
class=
"rowFlex columnCenter"
>
<span
class=
"label"
>
开/合服天数:
</span>
<p
class=
"text"
v-if=
"items.server_day"
>
{{ items?.server_day }}天
</p>
</div>
</div>
</div>
</el-collapse-item>
</div>
</el-collapse>
</div>
<div
v-else-if=
"!loading && roleList.length == 0"
class=
"noContent rowFlex allCenter"
>
<noContent
title=
"暂无数据"
description=
"当前没有任何数据,请稍后再试或联系管理员"
/>
<div
v-else-if=
"!loading && roleList.length == 0"
class=
"noContent rowFlex allCenter"
>
<noContent
title=
"暂无数据"
description=
"当前没有任何数据,请稍后再试或联系管理员"
/>
</div>
</div>
<appeal
v-if=
"showAppeal"
:show
.
sync=
"showAppeal"
:appeal-info=
"appealInfo"
/>
<appeal
v-if=
"showAppeal"
:show
.
sync=
"showAppeal"
:appeal-info=
"appealInfo"
/>
</div>
</template>
<
script
>
import
{
mapState
,
mapMutations
,
mapActions
}
from
'vuex'
;
import
{
getRoleHoLo
,
marketingRoleGrade
}
from
'@/api/game'
;
import
noContent
from
'@/components/noContent.vue'
;
import
appeal
from
'./layer/appeal.vue'
;
import
watchMember
from
'@/mixins/watchMember'
;
import
{
createDetails
}
from
'@/views/popup/RecentActivitiesPopup/index.js'
;
import
{
createRoleRecentActivityNotPushNum
}
from
'@/views/hooks/useGetCount.js'
;
import
vipLevel
from
'@/views/userInfo/components/gameInfo/vipLevel.vue'
;
import
{
mapState
,
mapMutations
,
mapActions
}
from
"vuex"
;
import
{
getRoleHoLo
,
marketingRoleGrade
,
getServerDayApi
}
from
"@/api/game"
;
import
noContent
from
"@/components/noContent.vue"
;
import
appeal
from
"./layer/appeal.vue"
;
import
watchMember
from
"@/mixins/watchMember"
;
import
{
createDetails
}
from
"@/views/popup/RecentActivitiesPopup/index.js"
;
import
{
createRoleRecentActivityNotPushNum
}
from
"@/views/hooks/useGetCount.js"
;
import
vipLevel
from
"@/views/userInfo/components/gameInfo/vipLevel.vue"
;
export
default
{
name
:
'roleInfo'
,
name
:
"roleInfo"
,
components
:
{
noContent
,
appeal
,
...
...
@@ -162,7 +219,7 @@ export default {
return
{
collapseActive
:
[],
roleList
:
[],
nowTime
:
''
,
nowTime
:
""
,
loading
:
false
,
showAppeal
:
false
,
appealInfo
:
{},
...
...
@@ -178,7 +235,14 @@ export default {
};
},
computed
:
{
...
mapState
(
'game'
,
[
'accountSelect'
]),
...
mapState
(
"game"
,
[
"accountSelect"
]),
},
watch
:
{
collapseActive
(
newVal
,
oldVal
)
{
if
(
newVal
.
length
>
0
)
{
this
.
handleChange
(
newVal
.
filter
((
item
)
=>
!
oldVal
.
includes
(
item
)));
}
},
},
mixins
:
[
watchMember
],
mounted
()
{
...
...
@@ -208,29 +272,40 @@ export default {
this
);
},
async
handleRoleListLevel
(
roleList
)
{
async
handleRoleListLevel
(
roleList
)
{
try
{
const
role_id_list
=
roleList
.
map
((
item
)
=>
item
.
role_id
)
const
res
=
await
marketingRoleGrade
({
role_id
:
role_id_list
})
if
(
res
.
status_code
==
1
&&
res
?.
data
?.
data
?.
length
>
0
)
{
const
levelList
=
res
.
data
.
data
const
role_id_list
=
roleList
.
map
((
item
)
=>
item
.
role_id
);
const
res
=
await
marketingRoleGrade
({
role_id
:
role_id_list
});
if
(
res
.
status_code
==
1
&&
res
?.
data
?.
data
?.
length
>
0
)
{
const
levelList
=
res
.
data
.
data
;
roleList
.
forEach
((
item
)
=>
{
const
levelItem
=
levelList
.
find
((
level
)
=>
level
.
role_id
==
item
.
role_id
)
if
(
levelItem
){
item
.
vip_level
=
levelItem
.
vip_level
const
levelItem
=
levelList
.
find
(
(
level
)
=>
level
.
role_id
==
item
.
role_id
);
if
(
levelItem
)
{
item
.
vip_level
=
levelItem
.
vip_level
;
}
})
});
}
}
catch
(
error
)
{
console
.
log
(
error
)
console
.
log
(
error
);
}
finally
{
this
.
roleList
=
roleList
.
sort
((
a
,
b
)
=>
{
return
Number
(
b
.
recharge_total
)
-
Number
(
a
.
recharge_total
)
})
return
Number
(
b
.
recharge_total
)
-
Number
(
a
.
recharge_total
);
});
}
},
handleChange
()
{
},
async
handleChange
(
v
)
{
const
item
=
this
.
roleList
.
find
(
(
item
)
=>
v
.
includes
(
item
.
role_id
)
&&
!
item
.
server_day
);
if
(
item
)
{
const
res
=
await
getServerDayApi
({
role_id
:
item
.
role_id
});
item
.
server_day
=
res
.
data
.
data
?.
server_day
;
this
.
roleList
=
[...
this
.
roleList
,
item
];
}
},
memberChange
()
{
this
.
requestRoleList
();
},
...
...
@@ -240,15 +315,15 @@ export default {
this
.
showAppeal
=
true
;
},
requestRoleList
()
{
if
(
this
.
accountSelect
===
''
)
{
this
.
$message
.
warning
(
'暂无关联的账号,请先去关联账号!'
);
if
(
this
.
accountSelect
===
""
)
{
this
.
$message
.
warning
(
"暂无关联的账号,请先去关联账号!"
);
return
false
;
}
this
.
loading
=
true
;
const
data
=
{
api_search_name
:
''
,
api_search_name
:
""
,
member_id
:
this
.
accountSelect
,
search_type
:
'list'
,
search_type
:
"list"
,
...
this
.
pageInfo
,
};
getRoleHoLo
(
data
).
then
(
...
...
@@ -256,7 +331,7 @@ export default {
this
.
loading
=
false
;
if
(
res
.
status_code
==
1
)
{
if
(
res
.
data
.
data
.
length
>
0
)
{
this
.
handleRoleListLevel
(
res
.
data
.
data
)
this
.
handleRoleListLevel
(
res
.
data
.
data
)
;
}
else
{
this
.
roleList
=
[];
}
...
...
@@ -396,11 +471,12 @@ export default {
}
::v-deep
.el-collapse-item
{
margin-bottom
:
20
px
;
margin-bottom
:
1
px
;
}
::v-deep
.el-collapse-item__content
{
padding-bottom
:
10px
;
//
padding-bottom
:
10px
;
padding
:
0
0
10px
0
;
}
::v-deep
.el-collapse
{
...
...
@@ -408,13 +484,17 @@ export default {
}
::v-deep
.el-collapse-item__header
{
flex-direction
:
row-reverse
;
width
:
100%
;
height
:
auto
;
background
:
#f9faff
;
background
:
transparent
;
color
:
#333333
;
padding-left
:
10px
;
font-size
:
14px
;
font-weight
:
400
;
&:hover
{
background
:
#f7f8fa
;
}
}
::v-deep
.el-collapse
.el-collapse-item__header
.el-collapse-item__arrow
{
...
...
@@ -428,7 +508,15 @@ export default {
::v-deep
.el-card__header
,
::v-deep
.el-collapse
,
::v-deep
.el-collapse-item__header
{
border
:
0
!important
;
//
border
:
0
!important
;
}
::v-deep
.el-collapse-item__arrow
{
color
:
#b1b3b8
!important
;
margin-right
:
10px
!important
;
}
::v-deep
.el-collapse-item__wrap
{
background-color
:
transparent
!important
;
border-bottom
:
1px
solid
#ebeef5
!important
;
}
/* 已移除局部 el-collapse 样式,使用全局样式 */
...
...
src/views/components/skill/crossLibrary.vue
浏览文件 @
a5bbf545
...
...
@@ -4,23 +4,49 @@
<!-- 标签 -->
<el-collapse-transition>
<div
v-if=
"groupList.length > 0"
class=
"tagList columnFlex"
>
<div
v-for=
"(item, index) in groupList"
:key=
"index"
class=
"tagItem columnCenter"
:draggable=
"false"
<div
v-for=
"(item, index) in groupList"
:key=
"index"
class=
"tagItem columnCenter"
:draggable=
"false"
:class=
"groupActive == item.value ? 'tagItemActiveText' : ''"
@
dragstart=
"handleDragStart($event, item, index)"
@
dragover
.
prevent=
"handleDragOver($event, item)"
@
dragenter=
"handleDragEnter($event, item, 'group')"
@
dragend=
"handleDragEnd($event, item, 'group')"
>
<div
class=
"rowFlex columnCenter spaceBetween tagItemGroup"
@
click=
"groupFilter(item, index)"
>
@
dragstart=
"handleDragStart($event, item, index)"
@
dragover
.
prevent=
"handleDragOver($event, item)"
@
dragenter=
"handleDragEnter($event, item, 'group')"
@
dragend=
"handleDragEnd($event, item, 'group')"
>
<div
class=
"rowFlex columnCenter spaceBetween tagItemGroup"
@
click=
"groupFilter(item, index)"
>
<div
class=
"rowFlex columnCenter"
>
<el-tooltip
effect=
"dark"
placement=
"top"
:content=
"item.name"
v-if=
"item.name.length >= 6"
>
<el-tooltip
effect=
"dark"
placement=
"top"
:content=
"item.name"
v-if=
"item.name.length >= 6"
>
<p
class=
"text hidden"
>
{{
item
.
name
}}
</p>
</el-tooltip>
<p
v-else
class=
"text hidden"
>
{{
item
.
name
}}
</p>
</div>
<i
class=
"el-icon-caret-right rotageIcon"
:class=
"groupActive == item.value ? 'rotage' : ''"
></i>
<i
class=
"el-icon-caret-right rotageIcon"
:class=
"groupActive == item.value ? 'rotage' : ''"
></i>
</div>
<!-- 二级分组 -->
<div
v-if=
"item.child.length > 0 && groupActive == item.value"
class=
"childGroup"
>
<div
v-for=
"child in item.child"
:key=
"child._id"
class=
"childGroupText"
:class=
"[groupActiveChild == child._id ? 'tagItemActive' : '']"
@
click
.
stop=
"groupFilterChild(child)"
>
<div
v-if=
"item.child.length > 0 && groupActive == item.value"
class=
"childGroup"
>
<div
v-for=
"child in item.child"
:key=
"child._id"
class=
"childGroupText"
:class=
"[groupActiveChild == child._id ? 'tagItemActive' : '']"
@
click
.
stop=
"groupFilterChild(child)"
>
<p
class=
"text hidden"
>
{{
child
.
name
}}
</p>
</div>
</div>
...
...
@@ -33,27 +59,67 @@
<!-- 话术 -->
<div
class=
"libraryListContent"
>
<div
class=
"inputContent"
>
<el-input
v-model=
"requestData.title"
placeholder=
"请输入话术内容"
class=
"input-with-select"
>
<el-button
slot=
"append"
icon=
"el-icon-search"
@
click=
"contentSearch"
></el-button>
<el-input
v-model=
"requestData.title"
placeholder=
"请输入话术内容"
class=
"input-with-select"
>
<el-button
slot=
"append"
icon=
"el-icon-search"
@
click=
"contentSearch"
></el-button>
</el-input>
</div>
<div
ref=
"skillLibrary"
v-loading=
"skillLoading"
@
scroll=
"paperScroll"
class=
"scrollList"
>
<div
v-for=
"(items, indexs) in groupDataList"
:key=
"indexs"
class=
"answerContent"
>
<div
class=
"question"
><span
class=
"title"
>
Q:
</span>
{{
items
.
question
}}
</div>
<div
v-for=
"(answer, answerIndex) in items.answer"
:key=
"answerIndex"
class=
"answerItem"
style=
"width: 100%"
>
<div
ref=
"skillLibrary"
v-loading=
"skillLoading"
@
scroll=
"paperScroll"
class=
"scrollList"
>
<div
v-for=
"(items, indexs) in groupDataList"
:key=
"indexs"
class=
"answerContent"
>
<div
class=
"question"
>
<span
class=
"title"
>
Q:
</span>
{{
items
.
question
}}
</div>
<div
v-for=
"(answer, answerIndex) in items.answer"
:key=
"answerIndex"
class=
"answerItem"
style=
"width: 100%"
>
<!--
<span
class=
"question"
>
{{
answerIndex
+
1
}}
:
{{
answer
}}
</span>
-->
<div
v-if=
"answer.msgtype == 'text'"
class=
"answerText rowFlex spaceBetween"
>
<div
v-if=
"answer.msgtype == 'text'"
class=
"answerText rowFlex spaceBetween"
>
<span
class=
"title rowFlex"
>
A
{{
answerIndex
+
1
}}
:
</span>
<p
v-if=
"answer.msgtype == 'text'"
class=
"rowFlex textAnswer flex1"
>
{{
answer
.
text
.
content
||
''
}}
<p
v-if=
"answer.msgtype == 'text'"
class=
"rowFlex textAnswer flex1"
>
{{
answer
.
text
.
content
||
""
}}
</p>
<i
class=
"el-icon-document-copy copyIcon rowFlex"
@
click=
"sendMessageEdit(answer, items._id)"
></i>
<i
class=
"el-icon-document-copy copyIcon rowFlex"
@
click=
"sendMessageEdit(answer, items._id)"
></i>
</div>
<div
v-else-if=
"answer.msgtype == 'image'"
class=
"answerText rowFlex"
>
<div
v-else-if=
"answer.msgtype == 'image'"
class=
"answerText rowFlex"
>
<span
class=
"title rowFlex"
>
A
{{
answerIndex
+
1
}}
:
</span>
<el-image
style=
"max-width: 200px"
:src=
"answer.image.picurl"
@
click=
"sendMessageImage(answer, items._id)"
:preview-src-list=
"[answer.image.picurl]"
>
</el-image>
<el-image
style=
"max-width: 200px"
:src=
"answer.image.picurl"
@
click=
"sendMessageImage(answer, items._id)"
:preview-src-list=
"[answer.image.picurl]"
>
</el-image>
</div>
</div>
</div>
...
...
@@ -65,26 +131,34 @@
<
script
>
// procedure_group, procedureList, procedureSort, procedureGroupSort, skillQuote,
import
{
cross_corp_robot_knowledge_group_index
,
cross_corp_robot_knowledge_group_getList
}
from
'@/api/skill'
import
{
mapState
,
mapMutations
,
mapActions
}
from
'vuex'
import
{
throttle
,
debounce
,
copyToClipboard
,
sendChatMessage
}
from
'@/utils/index'
import
noContent
from
'@/components/noContent.vue'
import
{
cross_corp_robot_knowledge_group_index
,
cross_corp_robot_knowledge_group_getList
,
}
from
"@/api/skill"
;
import
{
mapState
,
mapMutations
,
mapActions
}
from
"vuex"
;
import
{
throttle
,
debounce
,
copyToClipboard
,
sendChatMessage
,
}
from
"@/utils/index"
;
import
noContent
from
"@/components/noContent.vue"
;
export
default
{
name
:
'skillLibrary'
,
name
:
"skillLibrary"
,
components
:
{
noContent
noContent
,
},
props
:
{
activeName
:
{
default
:
''
,
type
:
String
}
default
:
""
,
type
:
String
,
}
,
},
data
()
{
return
{
collapseActive
:
''
,
groupActive
:
'0'
,
groupActiveChild
:
'0'
,
collapseActive
:
""
,
groupActive
:
"0"
,
groupActiveChild
:
"0"
,
activeGroup
:
{},
groupList
:
[],
groupLastList
:
[],
...
...
@@ -93,93 +167,93 @@ export default {
pageInfo
:
{
page
:
1
,
page_size
:
20
,
total
:
0
total
:
0
,
},
skillLoading
:
false
,
loading
:
false
,
requestData
:
{
title
:
''
,
first_group_id
:
''
,
second_group_id
:
''
title
:
""
,
first_group_id
:
""
,
second_group_id
:
""
,
},
sortType
:
''
,
sortType
:
""
,
sortID
:
{
_id
:
''
,
before_id
:
''
,
after_id
:
''
_id
:
""
,
before_id
:
""
,
after_id
:
""
,
},
filterText
:
{},
dragging
:
null
,
orderList
:
[
{
label
:
'知识库'
,
type
:
'library'
},
{
label
:
'个人话术'
,
type
:
'personal'
},
{
label
:
'企业话术'
,
type
:
'company'
}
]
}
{
label
:
"知识库"
,
type
:
"library"
},
{
label
:
"个人话术"
,
type
:
"personal"
},
{
label
:
"企业话术"
,
type
:
"company"
},
]
,
}
;
},
computed
:
{
...
mapState
(
'game'
,
[
'accountSelect'
,
'chatUserInfo'
]),
...
mapState
(
"game"
,
[
"accountSelect"
,
"chatUserInfo"
]),
},
watch
:
{
accountSelect
(
newVal
,
oldVal
)
{
if
(
newVal
&&
newVal
!==
''
)
{
if
(
newVal
&&
newVal
!==
""
)
{
this
.
pageInfo
=
{
page
:
1
,
page_size
:
20
,
total
:
0
}
total
:
0
,
}
;
}
},
activeName
(
newVal
,
oldVal
)
{
if
(
newVal
==
'library'
&&
newVal
!=
oldVal
)
{
this
.
resizeSelect
()
this
.
requestLibraryData
()
}
if
(
newVal
==
"library"
&&
newVal
!=
oldVal
)
{
this
.
resizeSelect
();
this
.
requestLibraryData
();
}
},
},
mounted
()
{
this
.
requestLibraryData
()
this
.
requestLibraryData
()
;
},
methods
:
{
sendMessage
:
throttle
(
function
(
item
,
id
)
{
console
.
log
(
item
,
id
)
console
.
log
(
item
,
id
)
;
// this.skillQuote(id, item.length)
},
500
),
handleDragStart
(
e
,
item
,
index
)
{
this
.
sortID
.
_id
=
item
.
_id
this
.
dragging
=
item
this
.
sortID
.
_id
=
item
.
_id
;
this
.
dragging
=
item
;
},
paperScroll
:
debounce
(
function
()
{
const
el
=
this
.
$refs
.
skillLibrary
const
el
=
this
.
$refs
.
skillLibrary
;
if
(
el
.
offsetHeight
+
el
.
scrollTop
+
10
>=
el
.
scrollHeight
)
{
console
.
log
(
'下一页'
)
this
.
pageInfo
.
page
++
this
.
searchTable
()
console
.
log
(
"下一页"
);
this
.
pageInfo
.
page
++
;
this
.
searchTable
()
;
}
},
500
),
skillQuote
(
id
,
num
)
{
const
data
=
{
type
:
this
.
activeName
,
procedure_id
:
id
,
quote_count
:
num
||
1
}
quote_count
:
num
||
1
,
}
;
skillQuote
(
data
).
then
((
res
)
=>
{
console
.
log
(
res
)
})
console
.
log
(
res
)
;
})
;
},
sortSkill
()
{
procedureSort
(
this
.
sortID
).
then
((
res
)
=>
{
if
(
res
.
status_code
==
1
)
{
this
.
$message
.
success
(
res
.
msg
)
this
.
$message
.
success
(
res
.
msg
)
;
}
})
})
;
},
sortSkillGroup
()
{
procedureGroupSort
(
this
.
sortID
).
then
((
res
)
=>
{
if
(
res
.
status_code
==
1
)
{
this
.
$message
.
success
(
res
.
msg
)
this
.
$message
.
success
(
res
.
msg
)
;
}
})
})
;
},
// 发送语音的时候 先编辑再发送
sendMessageEdit
(
item
,
id
)
{
...
...
@@ -189,98 +263,107 @@ export default {
item
.
text
.
content
,
(
message
)
=>
this
.
$message
.
success
(
message
),
(
message
)
=>
this
.
$message
.
error
(
message
)
)
)
;
}
this
.
sendChatMessage
(
item
.
text
.
content
||
''
,
'text'
)
this
.
sendChatMessage
(
item
.
text
.
content
||
""
,
"text"
);
},
sendMessageImage
(
item
)
{
console
.
log
(
item
,
'item'
)
this
.
sendChatMessage
(
item
.
image
.
picurl
||
''
,
'image'
)
console
.
log
(
item
,
"item"
);
this
.
sendChatMessage
(
item
.
image
.
picurl
||
""
,
"image"
);
},
contentSearch
()
{
this
.
pageInfo
=
{
page
:
1
,
page_size
:
20
,
total
:
0
}
this
.
searchTable
(
'msg'
)
total
:
0
,
}
;
this
.
searchTable
(
"msg"
);
},
// 知识库话术
requestLibraryData
()
{
console
.
log
(
this
.
chatUserInfo
,
'chatUserInfo'
)
this
.
loading
=
true
console
.
log
(
this
.
chatUserInfo
,
"chatUserInfo"
);
this
.
loading
=
true
;
const
data
=
{
page
:
1
,
page_size
:
100
,
userid
:
this
.
chatUserInfo
.
userid
}
userid
:
this
.
chatUserInfo
.
userid
,
}
;
cross_corp_robot_knowledge_group_index
(
data
).
then
((
res
)
=>
{
this
.
loading
=
false
this
.
loading
=
false
;
if
(
res
.
data
.
data
)
{
res
.
data
.
data
.
unshift
({
name
:
'全部分组'
,
value
:
''
,
child
:
[]
})
name
:
"全部分组"
,
value
:
""
,
child
:
[]
,
})
;
this
.
groupList
=
res
.
data
.
data
.
map
((
item
,
index
)
=>
{
item
.
label
=
item
.
name
item
.
value
=
item
.
_id
return
item
})
this
.
groupLastList
=
this
.
groupList
this
.
groupFilter
(
this
.
groupList
[
0
])
item
.
label
=
item
.
name
;
item
.
value
=
item
.
_id
;
return
item
;
})
;
this
.
groupLastList
=
this
.
groupList
;
this
.
groupFilter
(
this
.
groupList
[
0
])
;
}
else
{
this
.
groupList
=
[]
this
.
groupLastList
=
[]
this
.
groupList
=
[]
;
this
.
groupLastList
=
[]
;
}
})
})
;
},
groupFilter
(
item
,
index
)
{
if
(
!
item
.
_id
)
{
this
.
requestData
.
second_group_id
=
''
this
.
activeGroup
=
{}
}
this
.
groupActive
=
item
.
value
item
.
child
&&
item
.
child
[
0
]
?
((
this
.
activeGroup
=
item
.
child
[
0
]),
(
this
.
groupActiveChild
=
item
.
child
[
0
].
_id
))
:
''
this
.
searchTable
()
this
.
requestData
.
second_group_id
=
""
;
this
.
activeGroup
=
{};
}
this
.
groupActive
=
item
.
value
;
item
.
child
&&
item
.
child
[
0
]
?
((
this
.
activeGroup
=
item
.
child
[
0
]),
(
this
.
groupActiveChild
=
item
.
child
[
0
].
_id
))
:
""
;
this
.
searchTable
();
},
groupFilterChild
(
child
)
{
this
.
groupActiveChild
=
0
this
.
activeGroup
=
child
this
.
groupActiveChild
=
child
.
_id
this
.
searchTable
()
this
.
$forceUpdate
()
this
.
groupActiveChild
=
0
;
this
.
activeGroup
=
child
;
this
.
groupActiveChild
=
child
.
_id
;
this
.
searchTable
()
;
this
.
$forceUpdate
()
;
},
// 搜索结果
async
searchTable
(
msg
)
{
this
.
skillLoading
=
true
this
.
requestData
.
second_group_id
=
this
.
activeGroup
.
_id
||
''
this
.
requestData
.
title
=
this
.
requestData
.
title
.
trim
()
const
data
=
{
...
this
.
requestData
,
...
this
.
pageInfo
,
log_scan
:
msg
?
1
:
0
,
userid
:
this
.
chatUserInfo
.
userid
}
this
.
skillLoading
=
true
;
this
.
requestData
.
second_group_id
=
this
.
activeGroup
.
_id
||
""
;
this
.
requestData
.
title
=
this
.
requestData
.
title
.
trim
();
const
data
=
{
...
this
.
requestData
,
...
this
.
pageInfo
,
log_scan
:
msg
?
1
:
0
,
userid
:
this
.
chatUserInfo
.
userid
,
};
cross_corp_robot_knowledge_group_getList
(
data
).
then
((
res
)
=>
{
this
.
skillLoading
=
false
this
.
pageInfo
.
page
===
1
?
this
.
groupDataList
=
res
.
data
.
data
:
this
.
groupDataList
=
this
.
groupDataList
.
concat
(
res
.
data
.
data
)
this
.
groupLastDataList
=
this
.
groupDataList
})
this
.
skillLoading
=
false
;
this
.
pageInfo
.
page
===
1
?
(
this
.
groupDataList
=
res
.
data
.
data
)
:
(
this
.
groupDataList
=
this
.
groupDataList
.
concat
(
res
.
data
.
data
));
this
.
groupLastDataList
=
this
.
groupDataList
;
});
},
handleChange
()
{
},
handleChange
()
{},
// 重置select
resizeSelect
()
{
this
.
groupActive
=
'0'
this
.
isResize
=
true
this
.
groupDataList
=
[]
this
.
requestData
.
content
=
''
this
.
pageInfo
.
page
=
1
this
.
groupActive
=
"0"
;
this
.
isResize
=
true
;
this
.
groupDataList
=
[]
;
this
.
requestData
.
content
=
""
;
this
.
pageInfo
.
page
=
1
;
setTimeout
(()
=>
{
this
.
isResize
=
false
},
2000
)
this
.
isResize
=
false
;
},
2000
)
;
},
sendChatMessage
(
content
,
type
)
{
sendChatMessage
(
content
,
type
)
sendChatMessage
(
content
,
type
)
;
},
}
}
}
,
}
;
</
script
>
<
style
lang=
"scss"
scoped
>
.skillLibrary
{
...
...
@@ -321,7 +404,7 @@ export default {
font-size
:
14px
;
font-family
:
PingFangSC-Regular
,
PingFang
SC
;
font-weight
:
400
;
color
:
#409
EFF
;
color
:
#409
eff
;
margin-right
:
10px
;
}
...
...
@@ -467,7 +550,6 @@ export default {
.skillBox
{
width
:
100%
;
height
:
calc
(
100%
-
20px
);
}
.tagList
{
...
...
@@ -513,14 +595,14 @@ export default {
}
.tagItemActive
{
color
:
#409
EFF
!important
;
color
:
#409
eff
!important
;
font-family
:
PingFangSC-Regular
,
PingFang
SC
;
font-weight
:
400
;
background
:
#e4fff1
;
}
.tagItemActiveText
{
color
:
#409
EFF
;
color
:
#409
eff
;
}
}
...
...
@@ -607,7 +689,7 @@ export default {
.copyIcon
{
width
:
20px
;
color
:
#409
EFF
;
color
:
#409
eff
;
font-size
:
16px
;
position
:
relative
;
top
:
2px
;
...
...
@@ -619,7 +701,7 @@ export default {
}
.scrollList
::-webkit-scrollbar
{
display
:
none
display
:
none
;
}
.container
{
...
...
@@ -676,7 +758,7 @@ export default {
}
.skillLibrary
::-webkit-scrollbar
{
display
:
none
display
:
none
;
}
::v-deep
.el-icon-circle-close
{
...
...
src/views/newLogin.vue
浏览文件 @
a5bbf545
...
...
@@ -27,21 +27,21 @@
</
template
>
<
script
>
import
*
as
ww
from
'@wecom/jssdk'
;
import
*
as
ww
from
"@wecom/jssdk"
;
import
{
getOrganization
,
getAuthUser
,
getSignature
,
getUserList
,
cserSelected
,
}
from
'@/api/user'
;
import
Cookies
from
'js-cookie'
;
import
{
getParams
}
from
'@/utils/index'
;
import
{
mapMutations
,
mapState
}
from
'vuex'
;
import
{
getToken
,
setToken
}
from
'@/utils/auth'
;
import
jsApiList
from
'@/utils/jsApiList'
;
}
from
"@/api/user"
;
import
Cookies
from
"js-cookie"
;
import
{
getParams
}
from
"@/utils/index"
;
import
{
mapMutations
,
mapState
}
from
"vuex"
;
import
{
getToken
,
setToken
}
from
"@/utils/auth"
;
import
jsApiList
from
"@/utils/jsApiList"
;
export
default
{
name
:
'login'
,
name
:
"login"
,
components
:
{},
data
()
{
return
{
...
...
@@ -57,10 +57,10 @@ export default {
showRefresh
:
false
,
// 控制刷新按钮显示
qrLoading
:
false
,
// 控制二维码 loading
redirectUri
:
process
.
env
.
NODE_ENV
===
'production'
?
'https://companywx.zwnet.cn/api/api/sidebar_login/ding'
:
'https://companywx.zwwlkj03.top/api/api/sidebar_login/ding'
,
DDTestUrl
:
''
,
process
.
env
.
NODE_ENV
===
"production"
?
"https://companywx.zwnet.cn/api/api/sidebar_login/ding"
:
"https://companywx.zwwlkj03.top/api/api/sidebar_login/ding"
,
DDTestUrl
:
""
,
token
:
getToken
(),
userList
:
[],
cser_user_id
:
null
,
...
...
@@ -72,23 +72,24 @@ export default {
});
},
computed
:
{
...
mapState
(
'user'
,
[
'corp_id'
]),
...
mapState
(
"user"
,
[
"corp_id"
]),
},
methods
:
{
...
mapMutations
(
'user'
,
[
'set_corp_id'
,
'set_userid'
,
'set_userInfo'
,
'set_token'
,
'set_cser_info'
,
'set_signData'
,
'set_cser_id'
,
'set_cser_name'
,
'set_external_userid'
,
...
mapMutations
(
"user"
,
[
"set_corp_id"
,
"set_userid"
,
"set_userInfo"
,
"set_token"
,
"set_cser_info"
,
"set_signData"
,
"set_cser_id"
,
"set_cser_name"
,
"set_external_userid"
,
"set_weixin_blongs_id"
,
]),
async
initLogin
()
{
const
urlParams
=
getParams
();
const
userid
=
Cookies
.
get
(
'userid'
);
const
userid
=
Cookies
.
get
(
"userid"
);
if
(
this
.
token
&&
userid
)
{
// 已经钉钉扫码过 重新获取授权 获取签名 注册企微js-sdk
this
.
getUserList
(
userid
);
...
...
@@ -101,20 +102,20 @@ export default {
},
async
getUserList
(
userid
)
{
this
.
urlParams
=
getParams
();
const
corp_id
=
Cookies
.
get
(
'corp_id'
)
||
this
.
urlParams
.
corp_id
;
const
corp_id
=
Cookies
.
get
(
"corp_id"
)
||
this
.
urlParams
.
corp_id
;
const
res
=
await
getUserList
({
userid
:
userid
,
corp_id
:
corp_id
});
this
.
userList
=
res
.
data
;
},
async
userStartLogin
()
{
if
(
!
this
.
cser_user_id
)
{
this
.
$message
.
error
(
'请选择客服人员'
);
this
.
$message
.
error
(
"请选择客服人员"
);
return
;
}
const
cser_user
=
this
.
userList
.
find
(
(
item
)
=>
item
.
zq_user_id
===
this
.
cser_user_id
);
const
corp_id
=
Cookies
.
get
(
'corp_id'
);
const
userid
=
Cookies
.
get
(
'userid'
);
const
corp_id
=
Cookies
.
get
(
"corp_id"
);
const
userid
=
Cookies
.
get
(
"userid"
);
this
.
cacheCser
(
cser_user
.
zq_user_id
,
cser_user
.
name
);
try
{
const
res
=
await
cserSelected
({
...
...
@@ -122,10 +123,10 @@ export default {
corp_id
:
corp_id
,
userid
:
userid
,
});
console
.
log
(
res
,
'选择客服人员登录'
);
console
.
log
(
res
,
"选择客服人员登录"
);
if
(
res
.
status_code
===
1
&&
res
.
data
.
tokens
)
{
this
.
$message
({
type
:
'warning'
,
type
:
"warning"
,
message
:
`当前【
${
cser_user
.
name
}
】已上线,下班后请记得点击下线哦~`
,
duration
:
3
*
1000
,
});
...
...
@@ -137,20 +138,20 @@ export default {
setTimeout
(()
=>
{
window
.
location
.
href
=
window
.
location
.
origin
+
'/company_app/index.html?corp_id='
+
"/company_app/index.html?corp_id="
+
corp_id
+
'&msg=cser_error'
;
"&msg=cser_error"
;
},
5000
);
}
}
catch
(
error
)
{
console
.
log
(
error
,
'选择客服人员登录失败'
);
console
.
log
(
error
,
"选择客服人员登录失败"
);
this
.
$message
.
error
(
error
.
msg
);
setTimeout
(()
=>
{
window
.
location
.
href
=
window
.
location
.
origin
+
'/company_app/index.html?corp_id='
+
"/company_app/index.html?corp_id="
+
corp_id
+
'&msg=cser_error'
;
"&msg=cser_error"
;
},
5000
);
}
},
...
...
@@ -160,32 +161,32 @@ export default {
);
this
.
$confirm
(
`确认登录上线吗,上线后所有会话都会归属到客服【
${
cser_user
.
name
}
】`
,
'提示'
,
"提示"
,
{
confirmButtonText
:
'确定'
,
cancelButtonText
:
'取消'
,
type
:
'warning'
,
confirmButtonText
:
"确定"
,
cancelButtonText
:
"取消"
,
type
:
"warning"
,
}
)
.
then
(()
=>
{
this
.
userStartLogin
();
})
.
catch
(()
=>
{
this
.
$message
.
info
(
'已取消登录'
);
this
.
$message
.
info
(
"已取消登录"
);
});
},
// 设置缓存
cacheCorp_id
(
corp_id
)
{
Cookies
.
set
(
'corp_id'
,
corp_id
,
{
expires
:
30
});
Cookies
.
set
(
"corp_id"
,
corp_id
,
{
expires
:
30
});
this
.
set_corp_id
(
corp_id
);
},
cacheuserid
(
userid
)
{
Cookies
.
set
(
'userid'
,
userid
,
{
expires
:
30
});
Cookies
.
set
(
"userid"
,
userid
,
{
expires
:
30
});
this
.
set_userid
(
userid
);
},
cacheCser
(
cser_id
,
cser_name
)
{
Cookies
.
set
(
'cser_id'
,
cser_id
,
{
expires
:
30
});
Cookies
.
set
(
'cser_name'
,
cser_name
,
{
expires
:
30
});
Cookies
.
set
(
"cser_id"
,
cser_id
,
{
expires
:
30
});
Cookies
.
set
(
"cser_name"
,
cser_name
,
{
expires
:
30
});
this
.
set_cser_info
({
cser_id
:
cser_id
,
cser_name
:
cser_name
,
...
...
@@ -194,16 +195,16 @@ export default {
this
.
set_cser_name
(
cser_name
);
},
cacheSignData
(
signData
)
{
Cookies
.
set
(
'signData'
,
JSON
.
stringify
(
signData
),
{
expires
:
30
});
Cookies
.
set
(
"signData"
,
JSON
.
stringify
(
signData
),
{
expires
:
30
});
this
.
set_signData
(
signData
);
},
// 进入的页面地址是 https://companywx.jianshuwenhua.com/company_app/index.html?corp_id=wweaefe716636df3d1
// 1. 企微静默授权
async
startWeComSilentAuth
()
{
this
.
urlParams
=
getParams
();
const
corp_id
=
Cookies
.
get
(
'corp_id'
)
||
this
.
urlParams
.
corp_id
;
const
corp_id
=
Cookies
.
get
(
"corp_id"
)
||
this
.
urlParams
.
corp_id
;
if
(
!
corp_id
)
{
this
.
$message
.
error
(
'当前客服号信息异常,请切换会话后重试'
);
this
.
$message
.
error
(
"当前客服号信息异常,请切换会话后重试"
);
return
;
}
// 确定是第一次进入页面 没有 code 和 state
...
...
@@ -224,18 +225,19 @@ export default {
if
(
res
.
data
.
userid
)
{
this
.
cacheuserid
(
res
.
data
.
userid
);
this
.
getUserList
(
res
.
data
.
userid
);
this
.
set_weixin_blongs_id
(
res
.
data
.
weixin_blongs_id
);
}
else
{
this
.
$message
.
error
(
'获取用户id失败'
);
this
.
$message
.
error
(
"获取用户id失败"
);
return
;
}
}
else
{
console
.
log
(
'获取useid失败'
,
res
);
console
.
log
(
"获取useid失败"
,
res
);
// 错误处理
}
},
async
getSignature
()
{
console
.
log
(
'获取签名'
,
window
.
location
.
href
);
const
corp_id
=
Cookies
.
get
(
'corp_id'
);
console
.
log
(
"获取签名"
,
window
.
location
.
href
);
const
corp_id
=
Cookies
.
get
(
"corp_id"
);
try
{
const
res
=
await
getSignature
({
corp_id
:
corp_id
,
...
...
@@ -247,42 +249,42 @@ export default {
try
{
this
.
registerWeComSDK
();
}
catch
(
err
)
{
console
.
log
(
err
,
'初始化sdk 失败'
);
console
.
log
(
err
,
"初始化sdk 失败"
);
}
}
}
catch
(
err
)
{
console
.
log
(
err
,
'获取签名失败'
);
console
.
log
(
err
,
"获取签名失败"
);
window
.
location
.
href
=
window
.
location
.
origin
+
'/company_app/index.html?corp_id='
+
"/company_app/index.html?corp_id="
+
corp_id
+
'&msg=signerror'
;
"&msg=signerror"
;
}
},
getCurExternalContact
()
{
this
.
$ww
.
getCurExternalContact
({
success
:
(
res
)
=>
{
if
(
res
.
err_msg
===
'getCurExternalContact:ok'
)
{
console
.
log
(
res
,
'重新进入获取企微外部联系人'
);
if
(
res
.
err_msg
===
"getCurExternalContact:ok"
)
{
console
.
log
(
res
,
"重新进入获取企微外部联系人"
);
this
.
set_external_userid
(
res
.
userId
);
// 确保 Vuex 状态更新后再跳转
this
.
$nextTick
(()
=>
{
this
.
$router
.
replace
(
'/'
);
console
.
log
(
window
.
location
.
href
,
'window.location.hrefuserInfo'
);
this
.
$router
.
replace
(
"/"
);
console
.
log
(
window
.
location
.
href
,
"window.location.hrefuserInfo"
);
});
}
},
fail
:
(
err
)
=>
{
console
.
log
(
err
,
'获取企微外部联系人失败'
);
console
.
log
(
err
,
"获取企微外部联系人失败"
);
// 错误处理
},
});
},
// 2. 注册企微JS-SDK
registerWeComSDK
()
{
console
.
log
(
'删除企业签名'
,
1231
);
console
.
log
(
"删除企业签名"
,
1231
);
this
.
$ww
.
register
({
corpId
:
Cookies
.
get
(
'corp_id'
),
corpId
:
Cookies
.
get
(
"corp_id"
),
agentId
:
this
.
signData
.
agent_id
,
jsApiList
:
jsApiList
,
// getConfigSignature: () => Promise.resolve({
...
...
@@ -298,12 +300,12 @@ export default {
signature
:
this
.
signData
.
agent_signature
,
}),
onAgentConfigSuccess
:
(
res
)
=>
{
console
.
log
(
'注册成功可以调用企微 js-sdk'
,
res
);
console
.
log
(
"注册成功可以调用企微 js-sdk"
,
res
);
// 注册成功后不立即获取外部联系人,等钉钉扫码后再获取
this
.
getCurExternalContact
();
},
onAgentConfigFail
:
(
err
)
=>
{
console
.
log
(
'注册失败不能使用企微js-sdk'
,
err
);
console
.
log
(
"注册失败不能使用企微js-sdk"
,
err
);
// 错误处理123
},
});
...
...
@@ -322,15 +324,15 @@ export default {
},
initCurrentApp
()
{
const
currentApp
=
this
.
orgList
.
find
(
(
item
)
=>
item
.
app_key
===
'dingjigp0ksn9nbljdli'
(
item
)
=>
item
.
app_key
===
"dingjigp0ksn9nbljdli"
);
this
.
$set
(
this
,
'currentOrg'
,
currentApp
);
this
.
$set
(
this
,
"currentOrg"
,
currentApp
);
},
// 7. 钉钉扫码回调页面处理
async
handleDingCallback
(
token
)
{
// 在这里处理钉钉扫码成功的回调
const
corp_id
=
Cookies
.
get
(
'corp_id'
);
if
(
token
&&
token
!=
'undefined'
)
{
const
corp_id
=
Cookies
.
get
(
"corp_id"
);
if
(
token
&&
token
!=
"undefined"
)
{
setToken
(
token
);
this
.
set_token
(
token
);
// 获取签名
...
...
@@ -338,9 +340,9 @@ export default {
}
else
{
window
.
location
.
href
=
window
.
location
.
origin
+
'/company_app/index.html?corp_id='
+
"/company_app/index.html?corp_id="
+
corp_id
+
'&msg=notoken'
;
"&msg=notoken"
;
}
},
},
...
...
src/views/quickReply.vue
浏览文件 @
a5bbf545
...
...
@@ -2,87 +2,81 @@
<div
class=
"details columnFlex"
>
<div
class=
"content search-form"
>
<el-tabs
v-model=
"activeName"
>
<el-tab-pane
label=
"个人话术"
name=
"personal"
>
<el-tab-pane
label=
"个人话术"
name=
"personal"
>
<skillPersonal
v-if=
"activeName === 'personal'"
:active-name=
"activeName"
/>
</el-tab-pane>
<el-tab-pane
label=
"企业话术"
name=
"company"
>
<skillCompany
:active-name=
"activeName"
/>
<el-tab-pane
label=
"企业话术"
name=
"company"
>
<skillCompany
:active-name=
"activeName"
/>
</el-tab-pane>
<el-tab-pane
label=
"知识库"
name=
"library"
>
<el-tab-pane
label=
"知识库"
name=
"library"
>
<skillLibrary
v-if=
"activeName === 'library'"
:active-name=
"activeName"
/>
</el-tab-pane>
<el-tab-pane
label=
"跨主体知识库"
name=
"robotLibrary"
>
<el-tab-pane
label=
"跨主体知识库"
name=
"robotLibrary"
>
<crossLibrary
v-if=
"activeName === 'robotLibrary'"
:active-name=
"activeName"
/>
</el-tab-pane>
<el-tab-pane
label=
"教学视频"
name=
"instructionalVideo"
>
<InstructionalVideo
v-if=
"activeName === 'instructionalVideo'"
:active-name=
"activeName"
/>
</el-tab-pane>
</el-tabs>
</div>
</div>
</
template
>
<
script
>
import
skillCompany
from
'./components/skill/skillCompany.vue'
import
skillPersonal
from
'./components/skill/skillPersonal.vue'
import
skillLibrary
from
'./components/skill/skillLibrary.vue'
import
crossLibrary
from
'./components/skill/crossLibrary.vue'
import
{
mapActions
}
from
'vuex'
import
skillCompany
from
"./components/skill/skillCompany.vue"
;
import
skillPersonal
from
"./components/skill/skillPersonal.vue"
;
import
skillLibrary
from
"./components/skill/skillLibrary.vue"
;
import
crossLibrary
from
"./components/skill/crossLibrary.vue"
;
import
InstructionalVideo
from
"./components/InstructionalVideo/index.vue"
;
import
{
mapActions
}
from
"vuex"
;
export
default
{
name
:
'quickReply'
,
name
:
"quickReply"
,
components
:
{
skillCompany
,
skillPersonal
,
skillLibrary
,
crossLibrary
crossLibrary
,
InstructionalVideo
,
},
data
()
{
return
{
activeName
:
'personal'
}
},
created
()
{
activeName
:
"personal"
,
};
},
created
()
{},
mounted
()
{
this
.
initializeWecom
()
this
.
initializeWecom
()
;
},
methods
:
{
...
mapActions
(
'user'
,
[
'initWecom'
]),
...
mapActions
(
"user"
,
[
"initWecom"
]),
async
initializeWecom
()
{
try
{
console
.
log
(
'🚀 开始初始化企业微信 SDK'
)
const
result
=
await
this
.
initWecom
()
console
.
log
(
'✅ 企业微信 SDK 初始化成功'
,
result
)
console
.
log
(
"🚀 开始初始化企业微信 SDK"
);
const
result
=
await
this
.
initWecom
()
;
console
.
log
(
"✅ 企业微信 SDK 初始化成功"
,
result
);
}
catch
(
error
)
{
console
.
error
(
'❌ 企业微信 SDK 初始化失败:'
,
error
)
console
.
error
(
"❌ 企业微信 SDK 初始化失败:"
,
error
);
}
},
}
}
}
,
}
;
</
script
>
<
style
lang=
"scss"
scoped
>
.details
{
::v-deep
.el-tabs__nav-next,::v-deep
.el-tabs__nav-prev{
::v-deep
.el-tabs__nav-next,
::v-deep
.el-tabs__nav-prev
{
line-height
:
50px
;
}
width
:
100
%;
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论