Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
C
company_app
概览
概览
详情
活动
周期分析
版本库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
问题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程表
图表
维基
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
毛细亚
company_app
Commits
b9c7f92b
提交
b9c7f92b
authored
12月 18, 2025
作者:
毛细亚
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'release' into 7.2.1
上级
854d7fbc
f170e90a
显示空白字符变更
内嵌
并排
正在显示
16 个修改的文件
包含
2301 行增加
和
1132 行删除
+2301
-1132
index.html
public/index.html
+13
-8
App.vue
src/App.vue
+164
-106
game.js
src/api/game.js
+43
-0
copy.svg
src/assets/icon/svg/copy.svg
+2
-0
copy.js
src/directive/copy/copy.js
+86
-0
index.js
src/directive/copy/index.js
+13
-0
main.js
src/main.js
+2
-1
user.js
src/store/modules/user.js
+7
-0
index.scss
src/styles/index.scss
+4
-0
index.vue
src/views/components/InstructionalVideo/index.vue
+157
-0
emailGift.vue
src/views/components/giftRecord/emailGift.vue
+387
-196
sendGame.vue
src/views/components/quickSendGame/sendGame.vue
+937
-503
roleInfoPanel.vue
src/views/components/roleInfo/roleInfoPanel.vue
+164
-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
浏览文件 @
b9c7f92b
<!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_172.5464f393968eda872f41eab2242bbbd7.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/App.vue
浏览文件 @
b9c7f92b
<
template
>
<div
id=
"app"
class=
"mobile-app-wrapper"
>
<Debug
/>
<div
class=
"mobile-menu-bar"
v-if=
"token && external_userid && showMemberId"
>
<div
class=
"mobile-menu-bar"
v-if=
"token && external_userid && showMemberId"
>
<!-- 临时调试信息 -->
<div
class=
"menu-container"
>
<el-menu
:default-active=
"selectedPath"
mode=
"horizontal"
class=
"mobile-el-menu"
:class=
"
{ 'collapsed': !isMenuExpanded
&&
shouldShowToggle }" background-color="#fff" router
@select="handleSelect" ref="menuRef">
<el-menu-item
v-for=
"item in menuList"
:key=
"item.path"
:index=
"item.path"
class=
"mobile-menu-item"
>
<el-menu
:default-active=
"selectedPath"
mode=
"horizontal"
class=
"mobile-el-menu"
:class=
"
{ collapsed: !isMenuExpanded
&&
shouldShowToggle }"
background-color="#fff"
router
@select="handleSelect"
ref="menuRef"
>
<el-menu-item
v-for=
"item in menuList"
:key=
"item.path"
:index=
"item.path"
class=
"mobile-menu-item"
>
<!-- 任务列表菜单项显示红点 -->
<div
v-if=
"item.path === '/taskList' && hasTaskRedDot"
class=
"menu-item-with-badge"
>
<div
v-if=
"item.path === '/taskList' && hasTaskRedDot"
class=
"menu-item-with-badge"
>
<div
class=
"task-badge"
>
<el-badge
is-dot
>
<span>
{{
item
.
label
}}
</span>
...
...
@@ -22,9 +40,17 @@
</el-menu>
<!-- 展开收起按钮 -->
<el-button
type=
"text"
size=
"mini"
v-if=
"shouldShowToggle"
class=
"menu-toggle-btn"
@
click=
"toggleMenu"
>
<i
:class=
"isMenuExpanded ? 'el-icon-arrow-up' : 'el-icon-arrow-down'"
></i>
<span>
{{
isMenuExpanded
?
'收起'
:
'展开'
}}
</span>
<el-button
type=
"text"
size=
"mini"
v-if=
"shouldShowToggle"
class=
"menu-toggle-btn"
@
click=
"toggleMenu"
>
<i
:class=
"isMenuExpanded ? 'el-icon-arrow-up' : 'el-icon-arrow-down'"
></i>
<span>
{{
isMenuExpanded
?
"收起"
:
"展开"
}}
</span>
</el-button>
</div>
...
...
@@ -37,25 +63,25 @@
</div>
</
template
>
<
script
>
import
bindUserList
from
'@/views/components/bindGameAccount/bindUserList.vue'
import
{
getToken
}
from
'@/utils/auth'
import
{
mapState
,
mapMutations
,
mapActions
}
from
'vuex'
import
Cookies
from
'js-cookie'
import
{
getParams
}
from
'@/utils/index'
import
Debug
from
'@/components/debug.vue'
import
bindUserList
from
"@/views/components/bindGameAccount/bindUserList.vue"
;
import
{
getToken
}
from
"@/utils/auth"
;
import
{
mapState
,
mapMutations
,
mapActions
}
from
"vuex"
;
import
Cookies
from
"js-cookie"
;
import
{
getParams
}
from
"@/utils/index"
;
import
Debug
from
"@/components/debug.vue"
;
export
default
{
name
:
'App'
,
name
:
"App"
,
components
:
{
bindUserList
,
Debug
Debug
,
},
data
()
{
return
{
menuList
:
[
{
label
:
'客户资料'
,
path
:
'/userInfo'
label
:
"客户资料"
,
path
:
"/userInfo"
,
},
// {
// label: '角色信息',
...
...
@@ -66,16 +92,16 @@ export default {
// path: '/orderList'
// },
{
label
:
'快捷回复'
,
path
:
'/quickReply'
label
:
"快捷回复"
,
path
:
"/quickReply"
,
},
// {
// label: '违规记录',
// path: '/violationRecord'
// },
{
label
:
'礼包记录'
,
path
:
'/giftRecord'
label
:
"礼包记录"
,
path
:
"/giftRecord"
,
},
// {
...
...
@@ -83,188 +109,220 @@ export default {
// path: '/taskRecord'
// },
{
label
:
'申请记录'
,
path
:
'/applyRecord'
label
:
"申请记录"
,
path
:
"/applyRecord"
,
},
{
label
:
'通讯录'
,
path
:
'/addressBook'
label
:
"通讯录"
,
path
:
"/addressBook"
,
},
{
label
:
'快捷发送'
,
path
:
'/quickSendGame'
label
:
"快捷发送"
,
path
:
"/quickSendGame"
,
},
{
label
:
'任务列表'
,
path
:
'/taskList'
,
hasRedDot
:
false
// 红点状态
label
:
"任务列表"
,
path
:
"/taskList"
,
hasRedDot
:
false
,
// 红点状态
},
{
label
:
'微言助手'
,
path
:
'/aiChat'
label
:
"微言助手"
,
path
:
"/aiChat"
,
},
// {
// label: '通讯录',
// path: '/addressBook'
// },
],
selectedPath
:
'/userInfo'
,
selectedPath
:
"/userInfo"
,
showMemberId
:
false
,
isMenuExpanded
:
false
,
// 菜单展开状态
shouldShowToggle
:
false
,
// 是否显示展开收起按钮
}
}
;
},
computed
:
{
...
mapState
(
'user'
,
[
'external_userid'
,
'token'
,
'userInfo'
]),
...
mapState
(
'game'
,
[
'taskData'
]),
...
mapState
(
"user"
,
[
"external_userid"
,
"token"
,
"userInfo"
]),
...
mapState
(
"game"
,
[
"taskData"
]),
// 计算任务列表是否需要显示红点
hasTaskRedDot
()
{
return
this
.
taskData
.
user_task
>
0
||
this
.
taskData
.
account_task
>
0
}
return
this
.
taskData
.
user_task
>
0
||
this
.
taskData
.
account_task
>
0
;
}
,
},
watch
:
{
'$route.path'
(
val
)
{
"$route.path"
(
val
)
{
// 处理各种可能的路径情况
if
(
val
===
'/'
||
val
===
'/index.html'
)
{
this
.
selectedPath
=
'/userInfo'
if
(
val
===
"/"
||
val
===
"/index.html"
)
{
this
.
selectedPath
=
"/userInfo"
;
}
else
{
this
.
selectedPath
=
val
this
.
selectedPath
=
val
;
}
console
.
log
(
'路由变化:'
,
val
,
'选中路径:'
,
this
.
selectedPath
)
console
.
log
(
"路由变化:"
,
val
,
"选中路径:"
,
this
.
selectedPath
);
},
// 监听用户信息变化,只在初始化时获取一次任务数据
userInfo
:
{
handler
(
newVal
,
oldVal
)
{
if
(
newVal
&&
newVal
.
id
&&
(
!
oldVal
||
!
oldVal
.
id
)
&&
this
.
token
)
{
console
.
log
(
'用户信息初始化完成,获取任务数据:'
,
newVal
)
console
.
log
(
"用户信息初始化完成,获取任务数据:"
,
newVal
);
// 只在用户信息第一次设置时获取任务数据
this
.
getTaskUnReadData
()
this
.
getTaskUnReadData
()
;
}
},
deep
:
true
,
immediate
:
true
immediate
:
true
,
},
// 监听 external_userid 的变化,确保界面及时更新
external_userid
:
{
handler
(
newVal
)
{
if
(
newVal
)
{
this
.
$nextTick
(()
=>
{
this
.
showMemberId
=
true
console
.
log
(
'external_userid 已设置:'
,
newVal
,
window
.
location
.
href
,
this
.
token
,
Cookies
.
get
(
'token'
))
this
.
showMemberId
=
true
;
console
.
log
(
"external_userid 已设置:"
,
newVal
,
window
.
location
.
href
,
this
.
token
,
Cookies
.
get
(
"token"
)
);
// 强制更新组件
this
.
$forceUpdate
()
this
.
$forceUpdate
()
;
// 检查是否需要显示展开收起按钮
this
.
checkMenuOverflow
()
})
this
.
checkMenuOverflow
()
;
})
;
}
},
immediate
:
true
}
immediate
:
true
,
}
,
},
created
()
{
const
urlParams
=
getParams
();
// 每次进入页面都缓存corp_id
if
(
urlParams
.
corp_id
)
{
this
.
cacheCorp_id
(
urlParams
.
corp_id
)
// 缓存 corp_id
this
.
cacheCorp_id
(
urlParams
.
corp_id
)
;
// 缓存 corp_id
}
},
mounted
()
{
// 页面刷新时从 Cookie 恢复 token 到 store
const
cookieToken
=
Cookies
.
get
(
'token'
)
// Cookies.set(
// "token",
// "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOjQwOTAsImRhdGEiOnsiY3Nlcl9pZCI6NDA5MCwiY3Nlcl9uYW1lIjoi5q-b57uG5LqaIn0sImlhdCI6MTc2NTE3MjI0NywiZXhwIjoxNzY3NzY0MjQ3LCJuYmYiOjE3NjUxNzIyNDcsInN1YiI6InRva2Vu6K6k6K-BIiwianRpIjoiN2Q5NjYxNDVjNjgyZWU0Y2UyY2Y2MTc2ZjA0NTNlNGMifQ.QpEtYzoXK11RHwn8la-OMoS-BnlTyEEAa0lmlpYu2IQ"
// );
// Cookies.set("corp_id", "wweaefe716636df3d1");
// Cookies.set("userid", "maoxiya");
// Cookies.set("cser_name", "毛细亚");
// Cookies.set("external_userid", "wm5rUgMgAAG_vfF4AHClsrS1S6MImVsQ");
// Cookies.set("cser_id", 4090);
// Cookies.set("weixin_blongs_id", 2862);
const
cookieToken
=
Cookies
.
get
(
"token"
);
if
(
cookieToken
&&
!
this
.
token
)
{
this
.
set_token
(
cookieToken
)
console
.
log
(
'从 Cookie 恢复 token:'
,
cookieToken
)
this
.
set_token
(
cookieToken
)
;
console
.
log
(
"从 Cookie 恢复 token:"
,
cookieToken
);
}
// 初始化时处理路径
const
currentPath
=
this
.
$route
.
path
if
(
currentPath
===
'/'
||
currentPath
===
''
||
currentPath
===
'/index.html'
)
{
this
.
selectedPath
=
'/userInfo'
const
currentPath
=
this
.
$route
.
path
;
if
(
currentPath
===
"/"
||
currentPath
===
""
||
currentPath
===
"/index.html"
)
{
this
.
selectedPath
=
"/userInfo"
;
}
else
{
this
.
selectedPath
=
currentPath
this
.
selectedPath
=
currentPath
;
}
console
.
log
(
'创建时路径:'
,
currentPath
,
'选中路径:'
,
this
.
selectedPath
)
console
.
log
(
"创建时路径:"
,
currentPath
,
"选中路径:"
,
this
.
selectedPath
);
// 监听窗口大小变化
window
.
addEventListener
(
'resize'
,
this
.
handleResize
)
window
.
addEventListener
(
"resize"
,
this
.
handleResize
);
// 初始检查
this
.
$nextTick
(()
=>
{
this
.
checkMenuOverflow
()
this
.
initVuexValue
()
})
this
.
checkMenuOverflow
()
;
this
.
initVuexValue
()
;
})
;
},
beforeDestroy
()
{
window
.
removeEventListener
(
'resize'
,
this
.
handleResize
)
window
.
removeEventListener
(
"resize"
,
this
.
handleResize
);
// 移除 localStorage 中的 weixin_blongs_id
localStorage
.
removeItem
(
"weixin_blongs_id"
);
},
methods
:
{
...
mapMutations
(
'user'
,
[
'set_userid'
,
'set_corp_id'
,
'set_token'
,
'set_cser_info'
,
'set_cser_id'
,
'set_cser_name'
,
'set_userInfo'
]),
...
mapMutations
(
'game'
,
[
'set_accountSelect'
]),
...
mapActions
(
'game'
,
[
'getTaskUnReadData'
]),
...
mapMutations
(
"user"
,
[
"set_userid"
,
"set_corp_id"
,
"set_token"
,
"set_cser_info"
,
"set_cser_id"
,
"set_cser_name"
,
"set_userInfo"
,
]),
...
mapMutations
(
"game"
,
[
"set_accountSelect"
]),
...
mapActions
(
"game"
,
[
"getTaskUnReadData"
]),
// 设置缓存
cacheCorp_id
(
corp_id
)
{
Cookies
.
set
(
'corp_id'
,
corp_id
,
{
expires
:
30
})
this
.
set_corp_id
(
corp_id
)
Cookies
.
set
(
"corp_id"
,
corp_id
,
{
expires
:
30
});
this
.
set_corp_id
(
corp_id
)
;
},
initVuexValue
()
{
this
.
set_userid
(
Cookies
.
get
(
'userid'
))
this
.
set_corp_id
(
Cookies
.
get
(
'corp_id'
))
this
.
set_token
(
Cookies
.
get
(
'token'
))
this
.
set_cser_id
(
Cookies
.
get
(
'cser_id'
))
this
.
set_cser_name
(
Cookies
.
get
(
'cser_name'
))
this
.
set_userid
(
Cookies
.
get
(
"userid"
));
this
.
set_corp_id
(
Cookies
.
get
(
"corp_id"
));
this
.
set_token
(
Cookies
.
get
(
"token"
));
this
.
set_cser_id
(
Cookies
.
get
(
"cser_id"
));
this
.
set_cser_name
(
Cookies
.
get
(
"cser_name"
));
const
userinfo
=
{
cser_id
:
Cookies
.
get
(
'cser_id'
),
cser_name
:
Cookies
.
get
(
'cser_name'
),
username
:
Cookies
.
get
(
'cser_name'
),
id
:
Cookies
.
get
(
'cser_id'
),
}
this
.
set_userInfo
(
userinfo
)
const
cser_info
=
Cookies
.
get
(
'cser_info'
)
cser_info
?
this
.
set_cser_info
(
JSON
.
parse
(
cser_info
))
:
this
.
set_cser_info
({})
cser_id
:
Cookies
.
get
(
"cser_id"
),
cser_name
:
Cookies
.
get
(
"cser_name"
),
username
:
Cookies
.
get
(
"cser_name"
),
id
:
Cookies
.
get
(
"cser_id"
),
};
this
.
set_userInfo
(
userinfo
);
const
cser_info
=
Cookies
.
get
(
"cser_info"
);
cser_info
?
this
.
set_cser_info
(
JSON
.
parse
(
cser_info
))
:
this
.
set_cser_info
({});
},
handleSelect
(
key
,
keyPath
)
{
console
.
log
(
'菜单选择:'
,
key
,
keyPath
,
window
.
location
.
href
)
console
.
log
(
"菜单选择:"
,
key
,
keyPath
,
window
.
location
.
href
);
},
// 切换菜单展开收起状态
toggleMenu
()
{
this
.
isMenuExpanded
=
!
this
.
isMenuExpanded
this
.
isMenuExpanded
=
!
this
.
isMenuExpanded
;
},
// 检查菜单是否需要换行
checkMenuOverflow
()
{
this
.
$nextTick
(()
=>
{
const
menuElement
=
this
.
$refs
.
menuRef
?.
$el
if
(
!
menuElement
)
return
const
menuElement
=
this
.
$refs
.
menuRef
?.
$el
;
if
(
!
menuElement
)
return
;
// 临时展开菜单来检查实际高度
const
wasCollapsed
=
!
this
.
isMenuExpanded
&&
this
.
shouldShowToggle
const
wasCollapsed
=
!
this
.
isMenuExpanded
&&
this
.
shouldShowToggle
;
if
(
wasCollapsed
)
{
menuElement
.
classList
.
remove
(
'collapsed'
)
menuElement
.
classList
.
remove
(
"collapsed"
);
}
const
menuHeight
=
menuElement
.
scrollHeight
const
singleLineHeight
=
50
// 单行高度
const
menuHeight
=
menuElement
.
scrollHeight
;
const
singleLineHeight
=
50
;
// 单行高度
// 如果菜单高度超过单行,说明需要换行
this
.
shouldShowToggle
=
menuHeight
>
singleLineHeight
+
10
// 加10px容错
this
.
shouldShowToggle
=
menuHeight
>
singleLineHeight
+
10
;
// 加10px容错
// 如果不需要展开收起按钮,则直接展开
if
(
!
this
.
shouldShowToggle
)
{
this
.
isMenuExpanded
=
true
this
.
isMenuExpanded
=
true
;
}
else
if
(
wasCollapsed
)
{
// 恢复收起状态
menuElement
.
classList
.
add
(
'collapsed'
)
menuElement
.
classList
.
add
(
"collapsed"
);
}
})
})
;
},
// 窗口大小变化处理
handleResize
()
{
clearTimeout
(
this
.
resizeTimer
)
clearTimeout
(
this
.
resizeTimer
)
;
this
.
resizeTimer
=
setTimeout
(()
=>
{
this
.
checkMenuOverflow
()
},
150
)
}
this
.
checkMenuOverflow
();
},
150
);
},
}
},
};
</
script
>
<
style
scoped
>
...
...
@@ -352,14 +410,14 @@ export default {
overflow-y
:
auto
;
}
.mobile-content
>
div
{
.mobile-content
>
div
{
background
:
#fff
;
border-radius
:
8px
;
min-height
:
60vh
;
padding
:
10px
;
}
.el-menu--horizontal
>
.el-menu-item
{
.el-menu--horizontal
>
.el-menu-item
{
height
:
35px
;
line-height
:
35px
;
}
...
...
src/api/game.js
浏览文件 @
b9c7f92b
...
...
@@ -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/assets/icon/svg/copy.svg
0 → 100644
浏览文件 @
b9c7f92b
<svg
width=
"14"
height=
"14"
viewBox=
"0 0 14 14"
fill=
"none"
xmlns=
"http://www.w3.org/2000/svg"
><g
clip-path=
"url(#a)"
><mask
id=
"b"
style=
"mask-type:luminance"
maskUnits=
"userSpaceOnUse"
x=
"0"
y=
"0"
width=
"14"
height=
"14"
><path
d=
"M14 0H0v14h14z"
fill=
"#fff"
/></mask><g
mask=
"url(#b)"
stroke=
"#267ef0"
stroke-width=
".875"
stroke-linecap=
"round"
stroke-linejoin=
"round"
><path
d=
"M9.333 7.525v2.45c0 2.042-.816 2.858-2.858 2.858h-2.45c-2.042 0-2.858-.816-2.858-2.858v-2.45c0-2.042.816-2.858 2.858-2.858h2.45c2.042 0 2.858.816 2.858 2.858"
/><path
d=
"M12.833 4.025v2.45c0 2.042-.816 2.858-2.858 2.858h-.642V7.525c0-2.042-.816-2.858-2.858-2.858H4.667v-.642c0-2.042.816-2.858 2.858-2.858h2.45c2.042 0 2.858.816 2.858 2.858"
/></g></g><defs><clipPath
id=
"a"
><path
fill=
"#fff"
d=
"M0 0h14v14H0z"
/></clipPath></defs></svg>
\ No newline at end of file
src/directive/copy/copy.js
0 → 100644
浏览文件 @
b9c7f92b
import
Vue
from
'vue'
{
/* <iconpark-icon name="icon-fuzhi"></iconpark-icon> */
}
const
copy
=
{
// 当被绑定的元素插入到DOM中时
inserted
:
function
(
el
,
binding
)
{
// 创建复制图标元素
const
copyIcon
=
document
.
createElement
(
'iconpark-icon'
)
// const copyIcon = document.createElement('div')
// copyIcon.setAttribute('icon-class', 'copy')
copyIcon
.
name
=
'icon-fuzhi'
copyIcon
.
style
.
cursor
=
'pointer'
copyIcon
.
style
.
marginLeft
=
'8px'
copyIcon
.
style
.
fontSize
=
'16px'
copyIcon
.
title
=
'点击复制'
copyIcon
.
innerHTML
=
'<svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg"><g clip-path="url(#a)"><mask id="b" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="0" width="14" height="14"><path d="M14 0H0v14h14z" fill="#fff"/></mask><g mask="url(#b)" stroke="#267ef0" stroke-width=".875" stroke-linecap="round" stroke-linejoin="round"><path d="M9.333 7.525v2.45c0 2.042-.816 2.858-2.858 2.858h-2.45c-2.042 0-2.858-.816-2.858-2.858v-2.45c0-2.042.816-2.858 2.858-2.858h2.45c2.042 0 2.858.816 2.858 2.858"/><path d="M12.833 4.025v2.45c0 2.042-.816 2.858-2.858 2.858h-.642V7.525c0-2.042-.816-2.858-2.858-2.858H4.667v-.642c0-2.042.816-2.858 2.858-2.858h2.45c2.042 0 2.858.816 2.858 2.858"/></g></g><defs><clipPath id="a"><path fill="#fff" d="M0 0h14v14H0z"/></clipPath></defs></svg>'
// 设置元素的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
浏览文件 @
b9c7f92b
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
浏览文件 @
b9c7f92b
...
...
@@ -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
浏览文件 @
b9c7f92b
...
...
@@ -14,6 +14,7 @@ const state = {
external_userid
:
''
},
userid
:
Cookies
.
get
(
'userid'
),
weixin_blongs_id
:
localStorage
.
getItem
(
'weixin_blongs_id'
),
//客服号项目id
corp_id
:
''
,
external_userid
:
''
,
token
:
''
,
...
...
@@ -37,6 +38,12 @@ 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)
localStorage
.
setItem
(
'weixin_blongs_id'
,
weixin_blongs_id
)
},
set_userInfo
(
state
,
userInfo
){
state
.
userInfo
=
userInfo
},
...
...
src/styles/index.scss
浏览文件 @
b9c7f92b
...
...
@@ -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
浏览文件 @
b9c7f92b
<
template
>
<div
class=
"h-full flex flex-col"
>
<el-input
placeholder=
"请输入内容"
prefix-icon=
"el-icon-search"
v-model
.
trim=
"searchText"
@
input=
"debouncedGetVideoList"
>
</el-input>
<el-cascader
class=
"w-full mt-[8px]"
v-model=
"categoryValue"
:props=
"
{ emitPath: false, expandTrigger: 'click' }"
:options="categoryList"
@change="debouncedGetVideoList"
>
</el-cascader>
<div
class=
"mt-[2px] space-y-[8px] flex-1 overflow-auto pb-[10px]"
v-loading=
"loading"
>
<div
v-for=
"item in videoList"
: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] text-[14px]"
></iconpark-icon>
预览
</div>
</el-button>
<div
@
click=
"sendVideo(item)"
class=
"h-[24px] ml-[8px] cursor-pointer hover:bg-[#E7F1FD] text-[12px] w-[58px] p-0 flex justify-center items-center rounded-full bg-[#F7F8FA] text-[#267EF0]"
>
<iconpark-icon
name=
"icon-fasonghuashu"
class=
"text-[14px] mr-[4px]"
></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"
;
import
{
debounce
}
from
"@/utils"
;
export
default
{
name
:
"InstructionalVideo"
,
data
()
{
return
{
searchText
:
""
,
categoryValue
:
{},
categoryList
:
[],
videoList
:
[],
debouncedGetVideoList
:
()
=>
{},
loading
:
false
,
};
},
mounted
()
{
this
.
getCategoryList
();
// 初始化防抖函数,延迟300ms执行
this
.
debouncedGetVideoList
=
debounce
(()
=>
{
this
.
loading
=
true
;
this
.
getVideoList
().
finally
(()
=>
{
this
.
loading
=
false
;
});
},
300
);
},
computed
:
{
...
mapState
(
"user"
,
[
"userInfo"
,
"weixin_blongs_id"
]),
},
methods
:
{
...
mapMutations
(
"common"
,
[
"set_sendSkillMessage"
]),
// 视频分类
async
getCategoryList
()
{
// 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
||
this
.
weixin_blongs_id
,
main_game_id
:
this
.
categoryValue
.
main_game_id
,
video_type
:
this
.
categoryValue
.
id
,
video_name
:
this
.
searchText
,
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
:
#267ef0
!important
;
}
.button-color-hover.el-button--text
{
color
:
#86909c
;
}
</
style
>
src/views/components/giftRecord/emailGift.vue
浏览文件 @
b9c7f92b
<
template
>
<div
class=
"detailsGiftApply columnFlex"
>
<div
class=
"detailsGiftApplyContent"
v-scroll=
"requestemailGiftList"
v-loading=
"listLoading"
>
<div
class=
"detailsGiftApplyContent"
v-scroll=
"requestemailGiftList"
v-loading=
"listLoading"
>
<div
class=
"detailsGiftApplyTitle rowFlex spaceBetween columnCenter"
>
<!--
<p>
充值礼包
</p>
-->
<span></span>
<el-button
type=
"primary"
size=
"small"
@
click=
"showApplyGift = true"
>
礼包申请
</el-button>
<el-button
type=
"primary"
size=
"small"
@
click=
"showApplyGift = true"
>
礼包申请
</el-button
>
</div>
<!-- 过滤条件 -->
<el-form
class=
"filterList"
label-position=
"top"
:class=
"
{ 'collapsed-form': isCollapsed }">
<el-form
class=
"filterList"
label-position=
"top"
:class=
"
{ 'collapsed-form': isCollapsed }"
>
<div
class=
"filter-header"
>
<span
class=
"filter-title"
>
筛选条件
</span>
<i
:class=
"isCollapsed ? 'el-icon-arrow-down' : 'el-icon-arrow-up'"
class=
"collapse-icon"
@
click=
"toggleCollapse"
></i>
<i
:class=
"isCollapsed ? 'el-icon-arrow-down' : 'el-icon-arrow-up'"
class=
"collapse-icon"
@
click=
"toggleCollapse"
></i>
</div>
<el-form-item
label=
"主游戏"
>
<el-select
v-model
.
trim=
"form.main_game_id"
filterable
remote
clearable
reserve-keyword
placeholder=
"请输入主游戏名"
style=
"width:100%;"
:remote-method=
"remoteMethod"
:loading=
"loading"
@
change=
"searchInput"
@
focus=
"gameNameList = optionsList"
>
<el-option
v-for=
"item in gameNameList"
:key=
"item.value"
:label=
"item.label"
:value=
"item.value"
>
<el-select
v-model
.
trim=
"form.main_game_id"
filterable
remote
clearable
reserve-keyword
placeholder=
"请输入主游戏名"
style=
"width: 100%"
:remote-method=
"remoteMethod"
:loading=
"loading"
@
change=
"searchInput"
@
focus=
"gameNameList = optionsList"
>
<el-option
v-for=
"item in gameNameList"
:key=
"item.value"
:label=
"item.label"
:value=
"item.value"
>
</el-option>
</el-select>
</el-form-item>
<el-form-item
label=
"区服"
>
<el-select
v-model
.
trim=
"form.zyou_server_id"
filterable
remote
multiple
reserve-keyword
style=
"width:100%;"
placeholder=
"请先选择主游戏"
:remote-method=
"remoteMethodServer"
:loading=
"loading"
@
change=
"searchInput"
>
<el-option
v-for=
"item in serverNameList"
:key=
"item.id"
:label=
"item.label"
:value=
"item.value"
>
<el-select
v-model
.
trim=
"form.zyou_server_id"
filterable
remote
multiple
reserve-keyword
style=
"width: 100%"
placeholder=
"请先选择主游戏"
:remote-method=
"remoteMethodServer"
:loading=
"loading"
@
change=
"searchInput"
>
<el-option
v-for=
"item in serverNameList"
:key=
"item.id"
:label=
"item.label"
:value=
"item.value"
>
</el-option>
</el-select>
</el-form-item>
<el-form-item
label=
"svip权益"
>
<el-select
v-model
.
trim=
"form.right_type"
filterable
style=
"width:100%;"
placeholder=
"请选择svip权益"
@
change=
"searchInput"
>
<el-option
v-for=
"item in benefitOptions"
:key=
"item.value"
:label=
"item.label"
:value=
"item.value"
>
<el-select
v-model
.
trim=
"form.right_type"
filterable
style=
"width: 100%"
placeholder=
"请选择svip权益"
@
change=
"searchInput"
>
<el-option
v-for=
"item in benefitOptions"
:key=
"item.value"
:label=
"item.label"
:value=
"item.value"
>
</el-option>
</el-select>
</el-form-item>
<el-form-item
label=
"角色名称"
>
<el-input
v-model=
"form.role_name_or_cp_id"
placeholder=
"请输入角色名称"
style=
"width:100%;"
@
change=
"searchInput"
></el-input>
<el-input
v-model=
"form.role_name_or_cp_id"
placeholder=
"请输入角色名称"
style=
"width: 100%"
@
change=
"searchInput"
></el-input>
</el-form-item>
<el-form-item
label=
"礼包标题"
>
<el-input
v-model=
"form.active_title"
placeholder=
"请输入礼包名称"
style=
"width:100%;"
@
change=
"searchInput"
></el-input>
<el-input
v-model=
"form.active_title"
placeholder=
"请输入礼包名称"
style=
"width: 100%"
@
change=
"searchInput"
></el-input>
</el-form-item>
</el-form>
<el-tabs
v-model=
"form.gift_type"
class=
"tabStyle"
@
tab-click=
"tabChange"
>
<el-tab-pane
v-for=
"(item, index) in giftTypeList"
:key=
"index"
:label=
"item.label"
:name=
"item.value"
></el-tab-pane>
<el-tab-pane
v-for=
"(item, index) in giftTypeList"
:key=
"`$
{item.active_title}-${index}`"
:label="item.label"
:name="item.value"
>
</el-tab-pane>
</el-tabs>
<!-- 订单列表 -->
<div
class=
"email-gift-main-scroll"
>
<div
v-if=
"emailGiftList.length > 0"
style=
"height: auto"
>
<div
class=
"email-gift-main-scroll"
>
<div
v-if=
"emailGiftList.length > 0"
style=
"height:auto;"
>
<div
v-for=
"(item, index) in emailGiftList"
:key=
"index"
class=
"orderDetails"
>
v-for=
"(item, index) in emailGiftList"
:key=
"index"
class=
"orderDetails"
>
<div
class=
"orderDetailsTitle"
>
<div
class=
"rowFlex spaceBetween columnCenter"
>
<div>
<p
class=
"text"
><label>
角色信息:
</label>
{{
`${item.role_name
}
- ${item.server_name
}
`
}}
<
/p
>
<
p
class
=
"text hidden"
><
label
>
礼包标题:
<
/label> {{ item.active_title
}}
</
p
>
<
p
class
=
"text hidden"
><
label
>
充值金额
:
<
/label> ¥{{ item.amount
}}
</
p
>
<
p
class
=
"text hidden"
><
label
>
充值日期
:
<
/label> {{ item.apply_recharge_date
}}
</
p
>
<p
class=
"text"
>
<label>
角色信息:
</label>
{{
`${item.role_name
}
- ${item.server_name
}
`
}}
<
/p
>
<
p
class
=
"text hidden"
>
<
label
>
礼包标题:
<
/label> {{ item.active_title
}}
<
/p
>
<
p
class
=
"text hidden"
>
<
label
>
充值金额
:
<
/label> ¥{{ item.amount
}}
<
/p
>
<
p
class
=
"text hidden"
>
<
label
>
充值日期
:
<
/label> {{ item.apply_recharge_date
}}
<
/p
>
<
/div
>
<
i
v
-
if
=
"item.showDetails"
class
=
"el-icon-arrow-down iconStyle"
@
click
=
"closePage(item, index)"
><
/i
>
<
i
v
-
else
class
=
"el-icon-arrow-right iconStyle"
@
click
=
"openPage(item, index)"
><
/i
>
<
i
v
-
if
=
"item.showDetails"
class
=
"el-icon-arrow-down iconStyle"
@
click
=
"closePage(item, index)"
><
/i
>
<
i
v
-
else
class
=
"el-icon-arrow-right iconStyle"
@
click
=
"openPage(item, index)"
><
/i
>
<
/div
>
<
el
-
collapse
-
transition
>
<
div
v
-
if
=
"item.showDetails"
>
<
p
class
=
"text hidden"
><
label
>
svip
权益
:
<
/label> {{ item.right_type_name || '-'
}}
</
p
>
<
p
v
-
if
=
"item.status == '待提交'"
class
=
"text"
><
label
>
状态:
<
/label> <span class="noSend">{{ item.statu
s
}}
<
/span> </
p
>
<
p
v
-
else
-
if
=
"item.status == '已提交'"
class
=
"text"
><
label
>
状态:
<
/label> <span class="sended">{{
item
.
status
}}
<
/span> </
p
>
<
p
v
-
else
-
if
=
"item.status == '已驳回'"
class
=
"text"
><
label
>
状态:
<
/label> <span class="sendFail">{{
item
.
status
}}
<
/span> </
p
>
<
p
class
=
"text"
><
label
>
申请时间:
<
/label> {{ item.create_time
}}
</
p
>
<
p
class
=
"text"
><
label
>
提交时间:
<
/label> {{ item.confirm_time
}}
</
p
>
<
label
style
=
"margin-right:10px;margin-top:3px;"
class
=
"text"
>
<
label
>
奖品信息:
<
/label> </
label
>
<
div
v
-
for
=
"items in item.level_attribute"
:
key
=
"items.rule_id"
class
=
"columnCenter userInfoStyle"
style
=
"border-top: 1px solid rgb(196 205 226);margin-top: 5px;"
>
<
div
class
=
"contentConfirmItem rowFlex spaceBetween"
style
=
"padding-left:0;margin-top:10px;"
>
<
p
class
=
"text hidden"
>
<
label
>
svip
权益
:
<
/label> {{ item.right_type_name || "-"
}}
<
/p
>
<
p
v
-
if
=
"item.status == '待提交'"
class
=
"text"
>
<
label
>
状态:
<
/label
>
<
span
class
=
"noSend"
>
{{
item
.
status
}}
<
/span
>
<
/p
>
<
p
v
-
else
-
if
=
"item.status == '已提交'"
class
=
"text"
>
<
label
>
状态:
<
/label
>
<
span
class
=
"sended"
>
{{
item
.
status
}}
<
/span
>
<
/p
>
<
p
v
-
else
-
if
=
"item.status == '已驳回'"
class
=
"text"
>
<
label
>
状态:
<
/label
>
<
span
class
=
"sendFail"
>
{{
item
.
status
}}
<
/span
>
<
/p
>
<
p
class
=
"text"
>
<
label
>
申请时间:
<
/label> {{ item.create_time
}}
<
/p
>
<
p
class
=
"text"
>
<
label
>
提交时间:
<
/label> {{ item.confirm_time
}}
<
/p
>
<
label
style
=
"margin-right: 10px; margin-top: 3px"
class
=
"text"
>
<
label
>
奖品信息:
<
/label
>
<
/label
>
<
div
v
-
for
=
"items in item.level_attribute"
:
key
=
"items.rule_id"
class
=
"columnCenter userInfoStyle"
style
=
"
border-top: 1px solid rgb(196 205 226);
margin-top: 5px;
"
>
<
div
class
=
"contentConfirmItem rowFlex spaceBetween"
style
=
"padding-left: 0; margin-top: 10px"
>
<
p
class
=
"title"
>
{{
items
.
prize_level_name
}}
<
/p
>
<
p
v
-
if
=
"items.compare_amount"
>
{{
items
.
compare_amount
?
Number
(
items
.
compare_amount
)
/
100
+
(
item
.
exchange_score_status
==
1
?
'积分'
:
'金额'
)
:
items
.
compare_amount
}}
<
span
>
*
{{
items
.
apply_num
}}
<
/span></
p
>
{{
items
.
compare_amount
?
Number
(
items
.
compare_amount
)
/
100
+
(
item
.
exchange_score_status
==
1
?
"积分"
:
"金额"
)
:
items
.
compare_amount
}}
<
span
>
*
{{
items
.
apply_num
}}
<
/span
>
<
/p
>
<
/div
>
<!--
固定奖
-->
<
div
v
-
if
=
"items.prize_default"
>
<
div
class
=
"contentConfirmItem"
>
<
p
class
=
"title"
>
固定奖
<
span
v
-
if
=
"item.exchange_score_status == 1"
>
{{
items
.
apply_num
?
'*'
+
items
.
apply_num
:
''
}}
<
/span></
p
>
<
div
v
-
for
=
"(prize, prizeIndex) in items.prize_default"
:
key
=
"prizeIndex"
class
=
"contentConfirmItem rowFlex "
>
<
p
class
=
"info"
>
{{
prize
.
name
}}
<
/p
>
<
p
class
=
"info"
style
=
"margin-left:40px;"
>
ID
:
{{
prize
.
prize_id
}}
<
/p
>
<
p
class
=
"title"
>
固定奖
<
span
v
-
if
=
"item.exchange_score_status == 1"
>
{{
items
.
apply_num
?
"*"
+
items
.
apply_num
:
""
}}
<
/span
>
<
/p
>
<
div
v
-
for
=
"(prize, prizeIndex) in items.prize_default"
:
key
=
"prizeIndex"
class
=
"contentConfirmItem rowFlex"
>
<
p
class
=
"info"
>
{{
prize
.
name
}}
<
/p
>
<
p
class
=
"info"
style
=
"margin-left: 40px"
>
ID
:
{{
prize
.
prize_id
}}
<
/p
>
<
/div
>
<
/div
>
<
/div
>
<!--
自选奖
-->
<
div
v
-
if
=
"items.prize_auto"
class
=
"contentConfirmItem"
>
<
p
class
=
"title"
>
自选奖
({{
items
.
prize_auto
.
length
}}
选
{{
items
.
prize_auto_num
}}
)
<
/p
>
<
div
v
-
for
=
"(prize, prizeIndex) in items.prize_auto"
:
key
=
"prizeIndex"
class
=
"contentConfirmItem "
>
<
div
v
-
for
=
"(auto, autoIndex) in prize.group"
:
key
=
"autoIndex"
>
<
div
v
-
if
=
"prize.apply_num > 0"
class
=
"rowFlex spaceBetween"
>
<
p
class
=
"title"
>
自选奖
({{
items
.
prize_auto
.
length
}}
选
{{
items
.
prize_auto_num
}}
)
<
/p
>
<
div
v
-
for
=
"(prize, prizeIndex) in items.prize_auto"
:
key
=
"prizeIndex"
class
=
"contentConfirmItem"
>
<
div
v
-
for
=
"(auto, autoIndex) in prize.group"
:
key
=
"autoIndex"
>
<
div
v
-
if
=
"prize.apply_num > 0"
class
=
"rowFlex spaceBetween"
>
<
span
>
{{
auto
.
name
}}
<
/span
>
<
span
>
ID
:{{
auto
.
prize_id
}}
<
/span
>
<
div
>*
{{
prize
.
apply_num
}}
<
/div
>
...
...
@@ -114,17 +253,26 @@
<
/div
>
<
/div
>
<!--
返利
-->
<
div
v
-
if
=
"item.rebate_ratio_amount"
class
=
"contentConfirmItem"
>
<
p
class
=
"rowFlex spaceBetween"
>
<
span
>
返利
:
¥
{{
item
.
rebate_ratio_amount
}}
<
/span> <span>1:{{
items
.
rebate_ratio_rate
}}
<
/span> </
p
>
<
div
v
-
if
=
"item.rebate_ratio_amount"
class
=
"contentConfirmItem"
>
<
p
class
=
"rowFlex spaceBetween"
>
<
span
>
返利
:
¥
{{
item
.
rebate_ratio_amount
}}
<
/span
>
<
span
>
1
:{{
items
.
rebate_ratio_rate
}}
<
/span
>
<
/p
>
<
/div
>
<
/div
>
<
div
v
-
if
=
"item.prize && item.prize.length > 0"
>
<
div
v
-
for
=
"(prize, prizeIndex) in item.prize"
:
key
=
"prizeIndex"
class
=
"contentConfirmItem rowFlex "
>
<
p
class
=
"info"
>
{{
prize
.
name
}}
<
/p
>
<
p
class
=
"info"
style
=
"margin-left:40px;"
>
ID
:
{{
prize
.
prize_id
}}
<
/p
>
<
div
v
-
for
=
"(prize, prizeIndex) in item.prize"
:
key
=
"prizeIndex"
class
=
"contentConfirmItem rowFlex"
>
<
p
class
=
"info"
>
{{
prize
.
name
}}
<
/p
>
<
p
class
=
"info"
style
=
"margin-left: 40px"
>
ID
:
{{
prize
.
prize_id
}}
<
/p
>
<
/div
>
<
/div
>
<
/div
>
...
...
@@ -132,34 +280,47 @@
<
/div
>
<
/div
>
<
/div
>
<
div
v
-
else
-
if
=
"!listLoading && emailGiftList.length == 0"
class
=
"noContent rowFlex allCenter"
>
<
div
v
-
else
-
if
=
"!listLoading && emailGiftList.length == 0"
class
=
"noContent rowFlex allCenter"
>
<
noContent
/>
<
/div
>
<
/div
>
<
/div
>
<!--
申请礼包
-->
<
applyGift
v
-
if
=
"showApplyGift"
:
show
.
sync
=
"showApplyGift"
title
=
"礼包申请"
@
requestData
=
"requestData"
/>
<
applyGift
v
-
if
=
"showApplyGift"
:
show
.
sync
=
"showApplyGift"
title
=
"礼包申请"
@
requestData
=
"requestData"
/>
<
/div
>
<
/template
>
<
script
>
import
{
emailGiftList
,
memberView
,
completionOrder
,
selectSearch
}
from
'@/api/game'
import
{
mapMutations
,
mapActions
,
mapState
}
from
'vuex'
import
{
removeDp
,
debounce
}
from
'@/utils/index'
import
{
emailGiftList
,
memberView
,
completionOrder
,
selectSearch
,
}
from
"@/api/game"
;
import
{
mapMutations
,
mapActions
,
mapState
}
from
"vuex"
;
import
{
debounce
}
from
"@/utils/index"
;
// import
{
roleList
,
memberView
,
zyouBind
,
selectSearch
}
from
'@/api/game'
import
applyGift
from
'./applyGift.vue'
import
selectDate
from
'@/components/selectDate.vue'
import
applyGift
from
"./applyGift.vue"
;
import
selectDate
from
"@/components/selectDate.vue"
;
export
default
{
name
:
'emailGift'
,
name
:
"emailGift"
,
components
:
{
selectDate
,
applyGift
applyGift
,
}
,
data
()
{
return
{
isloadMore
:
true
,
showApplyGift
:
false
,
collapseValue
:
[
'1'
],
collapseValue
:
[
"1"
],
emailGiftList
:
[],
optionsList
:
[],
gameNameList
:
[],
...
...
@@ -168,188 +329,219 @@ export default {
serverNameList
:
[],
giftTypeList
:
[],
form
:
{
main_game_id
:
''
,
main_game_id
:
""
,
zyou_server_id
:
[],
role_name_or_cp_id
:
''
,
member_id
:
''
,
active_title
:
''
,
gift_type
:
''
,
right_type
:
''
,
role_name_or_cp_id
:
""
,
member_id
:
""
,
active_title
:
""
,
gift_type
:
""
,
right_type
:
""
,
}
,
benefitOptions
:
[],
inputValue
:
''
,
inputValue
:
""
,
pageInfo
:
{
page
:
0
,
page_size
:
20
,
total
:
0
total
:
0
,
}
,
isCollapsed
:
false
}
isCollapsed
:
false
,
}
;
}
,
computed
:
{
...
mapState
(
'game'
,
[
'accountSelect'
]),
...
mapState
(
"game"
,
[
"accountSelect"
]),
}
,
watch
:
{
accountSelect
(
newVal
,
oldVal
)
{
if
(
newVal
&&
newVal
!==
''
)
{
if
(
newVal
&&
newVal
!==
""
)
{
this
.
pageInfo
=
{
page
:
0
,
page_size
:
20
,
total
:
0
}
this
.
emailGiftList
=
[]
this
.
isloadMore
=
true
this
.
requestemailGiftList
()
}
total
:
0
,
}
;
this
.
emailGiftList
=
[];
this
.
isloadMore
=
true
;
this
.
requestemailGiftList
();
}
}
,
}
,
mounted
()
{
this
.
requestGameList
()
this
.
requestGiftType
()
this
.
getBenefitOptions
()
this
.
requestGameList
()
;
this
.
requestGiftType
()
;
this
.
getBenefitOptions
()
;
}
,
methods
:
{
// 重新拉去数据
requestData
()
{
this
.
emailGiftList
=
[]
this
.
isloadMore
=
true
this
.
requestemailGiftList
()
this
.
emailGiftList
=
[]
;
this
.
isloadMore
=
true
;
this
.
requestemailGiftList
()
;
}
,
tabChange
:
debounce
(
function
()
{
this
.
pageInfo
.
page
=
0
this
.
emailGiftList
=
[]
this
.
isloadMore
=
true
this
.
requestemailGiftList
()
this
.
pageInfo
.
page
=
0
;
this
.
emailGiftList
=
[]
;
this
.
isloadMore
=
true
;
this
.
requestemailGiftList
()
;
}
,
1000
),
async
requestGiftType
()
{
const
data
=
{
field_name
:
'gift_type'
,
table_name
:
'role_gift_bag'
,
type
:
'dictionaries'
}
const
res
=
await
selectSearch
(
data
)
field_name
:
"gift_type"
,
table_name
:
"role_gift_bag"
,
type
:
"dictionaries"
,
}
;
const
res
=
await
selectSearch
(
data
)
;
if
(
res
.
status_code
===
1
)
{
res
.
data
.
data
.
map
(
item
=>
{
item
.
value
=
item
.
value
.
toString
()
}
)
this
.
giftTypeList
=
res
.
data
.
data
res
.
data
.
data
.
map
(
(
item
)
=>
{
item
.
value
=
item
.
value
.
toString
()
;
}
)
;
this
.
giftTypeList
=
res
.
data
.
data
;
this
.
giftTypeList
.
unshift
({
value
:
''
,
label
:
'全部'
}
)
value
:
""
,
label
:
"全部"
,
}
)
;
}
}
,
requestGameList
()
{
const
data
=
{
type
:
'mainGameList'
,
value
:
''
,
weixin_blong_id
:
''
}
selectSearch
(
data
).
then
(
res
=>
{
this
.
loading
=
false
type
:
"mainGameList"
,
value
:
""
,
weixin_blong_id
:
""
,
}
;
selectSearch
(
data
).
then
(
(
res
)
=>
{
this
.
loading
=
false
;
if
(
res
.
status_code
==
1
)
{
this
.
gameNameList
=
this
.
optionsList
=
res
.
data
.
data
this
.
gameNameList
=
this
.
optionsList
=
res
.
data
.
data
;
}
}
)
}
)
;
}
,
closePage
(
item
,
index
)
{
this
.
$set
(
this
.
emailGiftList
[
index
],
'showDetails'
,
false
)
this
.
$set
(
this
.
emailGiftList
[
index
],
"showDetails"
,
false
);
}
,
openPage
(
item
,
index
)
{
this
.
$set
(
this
.
emailGiftList
[
index
],
'showDetails'
,
true
)
this
.
$set
(
this
.
emailGiftList
[
index
],
"showDetails"
,
true
);
}
,
remoteMethodServer
(
query
)
{
if
(
query
!==
''
)
{
this
.
loading
=
true
if
(
query
!==
""
)
{
this
.
loading
=
true
;
const
data
=
{
type
:
'server_info'
,
type
:
"server_info"
,
value
:
query
,
main_game_ids
:
this
.
form
.
main_game_id
}
selectSearch
(
data
).
then
(
res
=>
{
this
.
loading
=
false
main_game_ids
:
this
.
form
.
main_game_id
,
}
;
selectSearch
(
data
).
then
(
(
res
)
=>
{
this
.
loading
=
false
;
if
(
res
.
status_code
==
1
)
{
this
.
serverNameList
=
res
.
data
.
data
this
.
serverNameList
=
res
.
data
.
data
;
}
}
)
}
)
;
}
}
,
remoteMethod
(
query
)
{
if
(
query
!==
''
)
{
this
.
gameNameList
=
this
.
optionsList
.
filter
(
item
=>
{
return
item
.
label
.
toLowerCase
()
.
indexOf
(
query
.
toLowerCase
())
>
-
1
}
)
if
(
query
!==
""
)
{
this
.
gameNameList
=
this
.
optionsList
.
filter
((
item
)
=>
{
return
item
.
label
.
toLowerCase
().
indexOf
(
query
.
toLowerCase
())
>
-
1
;
}
);
}
else
{
this
.
gameNameList
=
[]
this
.
gameNameList
=
[]
;
}
}
,
searchInput
(
value
)
{
console
.
log
(
value
)
console
.
log
(
value
)
;
this
.
pageInfo
=
{
page
:
0
,
page_size
:
20
,
total
:
0
}
this
.
isloadMore
=
true
this
.
emailGiftList
=
[]
this
.
requestemailGiftList
()
total
:
0
,
}
;
this
.
isloadMore
=
true
;
this
.
emailGiftList
=
[]
;
this
.
requestemailGiftList
()
;
}
,
async
getBenefitOptions
()
{
try
{
const
data
=
{
type
:
'svip_right'
,
}
const
res
=
await
selectSearch
(
data
)
if
(
res
.
status_code
===
1
&&
res
.
data
&&
res
.
data
.
data
&&
res
.
data
.
data
.
length
>
0
)
{
const
showList
=
[
'转生石福利'
,
'月核心玩家礼包'
,
'超R生日福利礼包'
,
'超R行会专属礼包'
]
this
.
benefitOptions
=
res
.
data
.
data
.
filter
((
item
,
index
)
=>
{
return
showList
.
includes
(
item
.
label
)
}
).
map
(
item
=>
({
type
:
"svip_right"
,
}
;
const
res
=
await
selectSearch
(
data
);
if
(
res
.
status_code
===
1
&&
res
.
data
&&
res
.
data
.
data
&&
res
.
data
.
data
.
length
>
0
)
{
const
showList
=
[
"转生石福利"
,
"月核心玩家礼包"
,
"超R生日福利礼包"
,
"超R行会专属礼包"
,
];
this
.
benefitOptions
=
res
.
data
.
data
.
filter
((
item
,
index
)
=>
{
return
showList
.
includes
(
item
.
label
);
}
)
.
map
((
item
)
=>
({
...
item
,
value
:
item
.
value
||
item
.
id
// 确保每个选项都有value属性,优先使用value,不存在则使用id
value
:
item
.
value
||
item
.
id
,
// 确保每个选项都有value属性,优先使用value,不存在则使用id
}
));
console
.
log
(
this
.
benefitOptions
)
console
.
log
(
this
.
benefitOptions
)
;
}
}
catch
(
error
)
{
console
.
error
(
'获取权益选项失败:'
,
error
)
console
.
error
(
"获取权益选项失败:"
,
error
);
}
}
,
requestemailGiftList
()
{
this
.
listLoading
=
true
if
(
this
.
accountSelect
==
''
)
{
this
.
$message
.
warning
(
'暂无关联的账号,请先去关联账号!'
)
return
false
this
.
listLoading
=
true
;
if
(
this
.
accountSelect
==
""
)
{
this
.
$message
.
warning
(
"暂无关联的账号,请先去关联账号!"
);
return
false
;
}
if
(
!
this
.
isloadMore
)
{
console
.
log
(
'没有更多数据了'
)
this
.
listLoading
=
false
return
false
}
this
.
pageInfo
.
page
+=
1
this
.
form
.
member_id
=
this
.
accountSelect
emailGiftList
({
...
this
.
form
,
...
this
.
pageInfo
}
).
then
(
res
=>
{
this
.
listLoading
=
false
console
.
log
(
"没有更多数据了"
);
this
.
listLoading
=
false
;
return
false
;
}
this
.
pageInfo
.
page
+=
1
;
this
.
form
.
member_id
=
this
.
accountSelect
;
emailGiftList
({
...
this
.
form
,
...
this
.
pageInfo
}
).
then
(
(
res
)
=>
{
this
.
listLoading
=
false
;
if
(
res
.
data
.
data
&&
res
.
data
.
data
.
length
<
20
)
{
this
.
isloadMore
=
false
this
.
isloadMore
=
false
;
}
res
.
data
.
data
.
map
((
item
,
index
)
=>
{
item
.
showDetails
=
false
}
)
this
.
emailGiftList
=
removeDp
(
res
.
data
.
data
,
this
.
emailGiftList
,
'id'
)
}
,
err
=>
{
this
.
listLoading
=
false
}
)
item
.
showDetails
=
false
;
}
);
this
.
emailGiftList
=
this
.
removeDp
(
this
.
emailGiftList
,
res
.
data
.
data
,
"id"
);
}
,
toggleCollapse
()
{
this
.
isCollapsed
=
!
this
.
isCollapsed
}
(
err
)
=>
{
this
.
listLoading
=
false
;
}
}
);
}
,
toggleCollapse
()
{
this
.
isCollapsed
=
!
this
.
isCollapsed
;
}
,
removeDp
(
arr1
,
arr2
,
id
)
{
console
.
log
(
arr1
,
arr2
,
"合并"
);
let
arr
;
arr2
?
(
arr
=
arr1
.
concat
(
arr2
))
:
(
arr
=
arr1
);
const
obj
=
{
}
;
console
.
log
(
arr
,
"合并前"
);
const
newArray
=
arr
.
reduce
((
pre
,
cur
)
=>
{
if
(
!
obj
[
cur
[
id
]])
{
obj
[
cur
[
id
]]
=
true
;
pre
.
push
(
cur
);
}
return
pre
;
}
,
[]);
return
newArray
;
}
,
}
,
}
;
<
/script
>
<
style
lang
=
"scss"
scoped
>
.
detailsGiftApply
{
...
...
@@ -382,14 +574,14 @@ export default {
padding
:
0
10
px
;
overflow
:
auto
;
overflow
-
x
:
hidden
;
::
v
-
deep
.
el
-
tabs__content
{
::
v
-
deep
.
el
-
tabs__content
{
height
:
auto
;
}
::
v
-
deep
.
el
-
tabs
{
::
v
-
deep
.
el
-
tabs
{
height
:
auto
;
}
.
noContent
{
.
noContent
{
margin
-
top
:
50
px
;
}
...
...
@@ -439,7 +631,7 @@ export default {
display
:
inline
-
block
;
width
:
8
px
;
height
:
8
px
;
background
:
#
409
EFF
;
background
:
#
409
eff
;
border
-
radius
:
5
px
;
}
...
...
@@ -472,7 +664,7 @@ export default {
p
{
font
-
size
:
22
px
;
color
:
#
409
EFF
;
color
:
#
409
eff
;
}
}
}
...
...
@@ -480,7 +672,7 @@ export default {
.
filterList
{
margin
-
bottom
:
10
px
;
position
:
relative
;
border
:
1
px
solid
#
EBEEF
5
;
border
:
1
px
solid
#
ebeef
5
;
border
-
radius
:
4
px
;
padding
:
10
px
;
transition
:
all
0.3
s
;
...
...
@@ -491,7 +683,7 @@ export default {
align
-
items
:
center
;
margin
-
bottom
:
10
px
;
padding
-
bottom
:
5
px
;
border
-
bottom
:
1
px
dashed
#
EBEEF
5
;
border
-
bottom
:
1
px
dashed
#
ebeef
5
;
}
.
filter
-
title
{
...
...
@@ -502,7 +694,7 @@ export default {
.
collapse
-
icon
{
cursor
:
pointer
;
color
:
#
409
EFF
;
color
:
#
409
eff
;
font
-
size
:
16
px
;
padding
:
5
px
;
transition
:
all
0.3
s
;
...
...
@@ -585,7 +777,7 @@ export default {
.
iconStyle
{
font
-
size
:
18
px
;
cursor
:
pointer
;
color
:
#
409
EFF
;
color
:
#
409
eff
;
}
.
money
{
...
...
@@ -621,7 +813,7 @@ export default {
background
:
#
e1fff0
;
font
-
family
:
PingFangSC
-
Regular
,
PingFang
SC
;
font
-
weight
:
400
;
color
:
#
409
EFF
;
color
:
#
409
eff
;
border
:
none
;
}
}
...
...
@@ -661,7 +853,6 @@ export default {
}
}
}
}
.
tabStyle
{
...
...
src/views/components/quickSendGame/sendGame.vue
浏览文件 @
b9c7f92b
...
...
@@ -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,239 @@ 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,
// };
// console.log(image, 12312321);
this
.
sendChatMessage
(
uploadResult
.
data
,
"image"
);
this
.
markTransScene
(
type
);
items
.
type
=
1
;
this
.
sendGameLog
(
items
);
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 +1282,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 +1319,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 +1337,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 +1550,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 +1570,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 +1615,7 @@ export default {
}
.channelLoading
{
color
:
#3491
FA
;
color
:
#3491
fa
;
font-size
:
16px
;
text-align
:
center
;
padding
:
20px
;
...
...
@@ -1246,8 +1680,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 +1702,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 +1730,7 @@ export default {
font-size
:
14px
;
&:focus
{
border-color
:
#3491
FA
;
border-color
:
#3491
fa
;
}
}
...
...
@@ -1317,20 +1751,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 +1779,7 @@ export default {
}
.sendLink
:hover
{
color
:
#3491
FA
;
color
:
#3491
fa
;
background-color
:
#f5f7fa
;
}
</
style
>
src/views/components/roleInfo/roleInfoPanel.vue
浏览文件 @
b9c7f92b
...
...
@@ -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
class=
"flex items-center"
>
{{
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,42 @@ 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
index
=
this
.
roleList
.
findIndex
(
(
item
)
=>
v
.
includes
(
item
.
role_id
)
&&
!
item
.
server_day
);
if
(
index
!==
-
1
)
{
const
res
=
await
getServerDayApi
({
role_id
:
this
.
roleList
[
index
].
role_id
,
});
this
.
roleList
[
index
].
server_day
=
res
.
data
.
data
?.
server_day
;
this
.
roleList
=
[...
this
.
roleList
];
}
},
memberChange
()
{
this
.
requestRoleList
();
},
...
...
@@ -240,15 +317,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 +333,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 +473,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 +486,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 +510,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
浏览文件 @
b9c7f92b
...
...
@@ -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
浏览文件 @
b9c7f92b
...
...
@@ -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
浏览文件 @
b9c7f92b
...
...
@@ -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
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论