848 lines
37 KiB
HTML
848 lines
37 KiB
HTML
|
<!DOCTYPE html>
|
|||
|
<head>
|
|||
|
<meta charset="utf-8">
|
|||
|
<meta name="renderer" content="webkit">
|
|||
|
<title>客服系统</title>
|
|||
|
<link rel="stylesheet" href="/static/cdn/element-ui/2.15.7/theme-chalk/index.min.css">
|
|||
|
<script src="/static/cdn/vue/2.6.11/vue.min.js"></script>
|
|||
|
<script src="/static/cdn/element-ui/2.15.7/index.js"></script>
|
|||
|
<script src="/static/cdn/jquery/3.6.0/jquery.min.js"></script>
|
|||
|
<script src="/static/cdn/jquery/jquery.qrcode.min.js"></script>
|
|||
|
|
|||
|
<link rel="stylesheet" href="/static/css/common.css?v=xx2222ddddddddd">
|
|||
|
<script src="/static/js/functions.js"></script>
|
|||
|
<script src="/static/js/chat-lang.js?v=1.0.1"></script>
|
|||
|
</head>
|
|||
|
<style>
|
|||
|
ul{
|
|||
|
margin-left:unset;
|
|||
|
}
|
|||
|
.el-message-box{
|
|||
|
width: 800px;
|
|||
|
overflow: auto;
|
|||
|
}
|
|||
|
</style>
|
|||
|
<body class="text-center">
|
|||
|
<div id="app">
|
|||
|
<template>
|
|||
|
<div class="guideHeader">
|
|||
|
<span>您好,<{nickname}> <{tel}></span>
|
|||
|
<span v-if="roleId=='1'">
|
|||
|
<el-button type="text" @click="cleanServer">清理</el-button>
|
|||
|
<el-button type="text" @click="stopServer">关闭</el-button>
|
|||
|
</span>
|
|||
|
</div>
|
|||
|
<div class="guideBg margin20" style="display: none">
|
|||
|
<{noticeContent}>
|
|||
|
</div>
|
|||
|
<div class="guideContent">
|
|||
|
<div class="guideNotice">
|
|||
|
<h6><img src="/static/images/banicon.svg" style="margin-right: 2px"/> 欢迎使用智能在线客服系统</h6>
|
|||
|
<p>我们是一站式的AI服务平台,轻松构建您和企业的多功能智能在线客服。</p>
|
|||
|
<p>可对接渠道:网站渠道、二维码对话、H5聊天链接、APP渠道、微信公众号、微信小程序、企业微信客服、企业微信应用、抖音视频评论、抖音小店飞鸽客服、抖音私信、个人微信、钉钉机器人、QQ机器人、
|
|||
|
视频号直播中控、淘宝直播中控、小红书直播中控 、抖音直播主播版、抖音直播间、支付宝直播中控</p>
|
|||
|
<div class="guideNoticeBtns">
|
|||
|
<div>
|
|||
|
<el-button size="small" type="primary" v-on:click="window.open(host+'/chatIndex?kefu_id='+kefuName+'&ent_id='+entId)">测试对话</el-button>
|
|||
|
<el-button size="small" type="primary" v-on:click="window.open(host+'/kefu/downloadDeploy?token='+localStorage.getItem('token'))">下载部署</el-button>
|
|||
|
</div>
|
|||
|
<div>
|
|||
|
<el-button size="small" type="primary" @click="payDialog=true;">在线充值</el-button>
|
|||
|
<el-button size="small" type="primary" v-on:click="window.location.href='/setting_pay'">查看订单</el-button>
|
|||
|
</div>
|
|||
|
</div>
|
|||
|
<img src="/static/images/banner.svg" class="guideNoticeBg"/>
|
|||
|
</div>
|
|||
|
<div class="left">
|
|||
|
<div style="display: flex;margin-top: 10px">
|
|||
|
<ul>
|
|||
|
<dl>
|
|||
|
<dt>商户编号</dt>
|
|||
|
<dd><{entId}></dd>
|
|||
|
</dl>
|
|||
|
<dl>
|
|||
|
<dt>客服账号</dt>
|
|||
|
<dd><{kefuName}>
|
|||
|
</dd>
|
|||
|
</dl>
|
|||
|
<dl v-show="kefu.role_id!='3'">
|
|||
|
<dt>子账号数</dt>
|
|||
|
<dd><{kefu.agent_num}>
|
|||
|
</dd>
|
|||
|
</dl>
|
|||
|
<dl v-show="kefuExpired=='on'">
|
|||
|
<dt><{flyLang.expireTime}></dt>
|
|||
|
<dd><{expireTime}>
|
|||
|
<a @click="payDialog=true;">充值</a>
|
|||
|
<a href="/setting_pay">订单</a>
|
|||
|
</dd>
|
|||
|
</dl>
|
|||
|
<dl>
|
|||
|
<dt>微信通知</dt>
|
|||
|
<dd>
|
|||
|
微信扫码并关注公众号即可开启,重要消息一个不漏
|
|||
|
</dd>
|
|||
|
</dl>
|
|||
|
|
|||
|
<dl style="display: none">
|
|||
|
<dt><{flyLang.wechatLink}></dt>
|
|||
|
<dd>
|
|||
|
<el-button size="small" type="primary" v-on:click="copyText(wechatMenuUrl)"><{flyLang.copy}></el-button>
|
|||
|
</dd>
|
|||
|
</dl>
|
|||
|
<dl v-if="roleId!='3'" style="display: none">
|
|||
|
<dt>关闭聊天</dt>
|
|||
|
<dd>
|
|||
|
<el-button size="small" type="primary" v-on:click="closeDialog=true">关闭</el-button>
|
|||
|
</dd>
|
|||
|
</dl>
|
|||
|
<dl style="display: none">
|
|||
|
<dt><{flyLang.dynLink}></dt>
|
|||
|
<dd>
|
|||
|
<el-button size="small" type="primary" v-on:click="dynicQrcodeDialog=true"><{flyLang.apply}></el-button>
|
|||
|
</dd>
|
|||
|
</dl>
|
|||
|
</ul>
|
|||
|
<div style="text-align: center">
|
|||
|
<div><img :src="wechatQrcode"></div>
|
|||
|
<a @click="showQrcode()"><i class="el-icon-refresh"></i>刷新</a>
|
|||
|
</div>
|
|||
|
</div>
|
|||
|
|
|||
|
<el-tabs>
|
|||
|
<el-tab-pane :label="flyLang.activity">
|
|||
|
|
|||
|
<div class="news">
|
|||
|
|
|||
|
<el-empty :description="flyLang.nodata" v-show="newsList.list.length==0"></el-empty>
|
|||
|
|
|||
|
<div class="newsItem" v-for="v in newsList.list">
|
|||
|
<el-tag effect="dark" :type='v.tag' class="newsTag">
|
|||
|
<{v.tag}>
|
|||
|
</el-tag>
|
|||
|
<a class="newsTitle" @click="showNewsContent(v)"><{v.title}></a>
|
|||
|
<span class="newsTime"><{v.created_at}></span>
|
|||
|
<div class="clear"></div>
|
|||
|
</div>
|
|||
|
|
|||
|
</div>
|
|||
|
<el-pagination
|
|||
|
background
|
|||
|
@current-change="getNews"
|
|||
|
:current-page="newsList.page"
|
|||
|
layout="prev,pager, next"
|
|||
|
:page-size="newsList.pagesize"
|
|||
|
:total="newsList.count">
|
|||
|
</el-pagination>
|
|||
|
</el-tab-pane>
|
|||
|
</el-tabs>
|
|||
|
</div>
|
|||
|
<div class="middle">
|
|||
|
<el-tabs>
|
|||
|
<el-tab-pane :label="flyLang.serviceStatistic">
|
|||
|
<div class="news" style="font-size: 12px;color: #333;">
|
|||
|
<el-table
|
|||
|
:empty-text="flyLang.nodata"
|
|||
|
:data="rate.list"
|
|||
|
style="width: 100%;">
|
|||
|
<el-table-column
|
|||
|
prop="created_at"
|
|||
|
:label="flyLang.createTime"
|
|||
|
>
|
|||
|
</el-table-column>
|
|||
|
<el-table-column
|
|||
|
prop="kefu_nickname"
|
|||
|
:label="flyLang.account">
|
|||
|
</el-table-column>
|
|||
|
<el-table-column
|
|||
|
:label="flyLang.content"
|
|||
|
prop="content">
|
|||
|
<template slot-scope="scope">
|
|||
|
<el-rate v-model="scope.row.score"
|
|||
|
disabled
|
|||
|
show-score
|
|||
|
text-color="#ff9900"
|
|||
|
score-template="{value}"
|
|||
|
></el-rate>
|
|||
|
<p><{scope.row.content}></p>
|
|||
|
</template>
|
|||
|
</el-table-column>
|
|||
|
</el-table>
|
|||
|
|
|||
|
</div>
|
|||
|
|
|||
|
</el-tab-pane>
|
|||
|
</el-tabs>
|
|||
|
</div>
|
|||
|
<div style="display: none" class="right">
|
|||
|
<el-tabs>
|
|||
|
<el-tab-pane :label="flyLang.updownLine">
|
|||
|
<div class="news" style="font-size: 12px;color: #333;">
|
|||
|
<el-table
|
|||
|
:empty-text="flyLang.nodata"
|
|||
|
:data="updownList.list"
|
|||
|
style="width: 100%;">
|
|||
|
<el-table-column
|
|||
|
prop="created_at"
|
|||
|
:label="flyLang.createTime"
|
|||
|
>
|
|||
|
</el-table-column>
|
|||
|
<el-table-column
|
|||
|
prop="client_ip"
|
|||
|
:label="flyLang.ipAddress"
|
|||
|
>
|
|||
|
</el-table-column>
|
|||
|
<el-table-column
|
|||
|
prop="kefu_name"
|
|||
|
:label="flyLang.account">
|
|||
|
</el-table-column>
|
|||
|
<el-table-column
|
|||
|
width="70px"
|
|||
|
:label="flyLang.status"
|
|||
|
prop="地址">
|
|||
|
<template slot-scope="scope">
|
|||
|
<el-tag v-if="scope.row.online_status==1" effect="dark" type='success'>
|
|||
|
<{flyLang.online}>
|
|||
|
</el-tag>
|
|||
|
<el-tag effect="dark" v-if="scope.row.online_status==2" type='danger'>
|
|||
|
<{flyLang.offline}>
|
|||
|
</el-tag>
|
|||
|
</template>
|
|||
|
</el-table-column>
|
|||
|
</el-table>
|
|||
|
|
|||
|
</div>
|
|||
|
<el-pagination
|
|||
|
background
|
|||
|
@current-change="getUpdownList"
|
|||
|
:current-page="updownList.page"
|
|||
|
layout="prev,pager, next"
|
|||
|
:page-size="updownList.pagesize"
|
|||
|
:total="updownList.count">
|
|||
|
</el-pagination>
|
|||
|
</el-tab-pane>
|
|||
|
</el-tabs>
|
|||
|
</div>
|
|||
|
</div>
|
|||
|
|
|||
|
<div class="guideStatistics" id="visitorNums" style="height:500px;"></div>
|
|||
|
|
|||
|
<el-table
|
|||
|
v-show="monitorList.length!=0"
|
|||
|
:data="monitorList"
|
|||
|
border
|
|||
|
style="margin-bottom: 10px;" class="guideStatistics">
|
|||
|
<el-table-column
|
|||
|
width="150px"
|
|||
|
prop="ClientIp"
|
|||
|
label="ClientIp">
|
|||
|
</el-table-column>
|
|||
|
<el-table-column
|
|||
|
prop="Title"
|
|||
|
label="Title">
|
|||
|
</el-table-column>
|
|||
|
|
|||
|
<el-table-column
|
|||
|
prop="Url"
|
|||
|
label="Url">
|
|||
|
</el-table-column>
|
|||
|
|
|||
|
<el-table-column
|
|||
|
prop="Refer"
|
|||
|
label="Refer">
|
|||
|
</el-table-column>
|
|||
|
<el-table-column
|
|||
|
prop="StartTime"
|
|||
|
label="StartTime">
|
|||
|
</el-table-column>
|
|||
|
<el-table-column
|
|||
|
:label="flyLang.doIt">
|
|||
|
<template slot-scope="scope">
|
|||
|
<el-button size="mini" type="warning" @click="sendMonitorMessage(scope.row.UinqId,'chat')">chat</el-button>
|
|||
|
</template>
|
|||
|
</el-table-column>
|
|||
|
</el-table>
|
|||
|
|
|||
|
|
|||
|
|
|||
|
<!--评价-->
|
|||
|
<el-dialog
|
|||
|
title="生成访客链接动态二维码"
|
|||
|
:close-on-click-modal="false"
|
|||
|
:show-close="true"
|
|||
|
width="500px"
|
|||
|
:visible.sync="dynicQrcodeDialog"
|
|||
|
>
|
|||
|
<el-alert
|
|||
|
style="margin-bottom: 10px"
|
|||
|
title="请谨慎生成新二维码,点击重置会使旧二维码失效。确认下面域名已经解析并绑定到客服平台服务器(例如当前网站域名),该域名访客链接可访问"
|
|||
|
type="warning"
|
|||
|
show-icon>
|
|||
|
</el-alert>
|
|||
|
<el-input
|
|||
|
style="margin-bottom: 10px"
|
|||
|
type="textarea"
|
|||
|
:rows="2"
|
|||
|
placeholder="二维码域名(http/https开头,留空为当前登录域名)"
|
|||
|
v-model="dynicQrDomain">
|
|||
|
</el-input>
|
|||
|
<div style="margin-bottom: 20px">
|
|||
|
<el-select v-model="dynicQrType" placeholder="请选择链接类型">
|
|||
|
<el-option label="普通链接" value="chatIndex"></el-option>
|
|||
|
<el-option label="微信链接" value="wechatIndex"></el-option>
|
|||
|
</el-select>
|
|||
|
</div>
|
|||
|
|
|||
|
<div id="qrcodeBox" style="position: relative;margin-bottom: 30px">
|
|||
|
<img :src="avator" id="qrcodeLogo" style="top:130px;margin-top:-30px;left:130px;margin-left:-30px;position:absolute;border:2px solid #fff;display: none;width: 60px;height:60px;border-radius: 8px;">
|
|||
|
<div id="dynicQrImg">
|
|||
|
</div>
|
|||
|
</div>
|
|||
|
|
|||
|
<el-button type="warning" @click="mkDynicImage(true)">重置</el-button>
|
|||
|
<el-button type="primary" @click="mkDynicImage(false)">生成</el-button>
|
|||
|
</el-dialog>
|
|||
|
<el-dialog
|
|||
|
title="关闭聊天界面公告"
|
|||
|
:close-on-click-modal="false"
|
|||
|
:show-close="true"
|
|||
|
width="500px"
|
|||
|
:visible.sync="closeDialog"
|
|||
|
>
|
|||
|
<el-alert
|
|||
|
style="margin-bottom: 10px"
|
|||
|
title="关闭聊天请填写,例如:您好,我现在正在休息,暂时停止服务; 如果想取消关闭,请置为空"
|
|||
|
type="warning"
|
|||
|
show-icon>
|
|||
|
</el-alert>
|
|||
|
<el-input
|
|||
|
style="margin-bottom: 10px"
|
|||
|
type="textarea"
|
|||
|
:rows="2"
|
|||
|
placeholder="您好,我现在正在休息,暂时停止服务"
|
|||
|
v-model="CloseNotice">
|
|||
|
</el-input>
|
|||
|
<el-button type="primary" @click="setCloseNotice()">确定</el-button>
|
|||
|
</el-dialog>
|
|||
|
|
|||
|
<el-dialog
|
|||
|
title="在线支付"
|
|||
|
:show-close="true"
|
|||
|
width="500px"
|
|||
|
:visible.sync="payDialog"
|
|||
|
>
|
|||
|
<div class="payBox">
|
|||
|
<div class="payItem">
|
|||
|
<div class="payKey">选择时长</div>
|
|||
|
<div class="payValue">
|
|||
|
<div class="payBtn" v-bind:class="{'active': payMonth==1}" @click="payMonth=1">一个月</div>
|
|||
|
<div class="payBtn" v-bind:class="{'active': payMonth==3}" @click="payMonth=3">三个月</div>
|
|||
|
<div class="payBtn" v-bind:class="{'active': payMonth==6}" @click="payMonth=6">六个月</div>
|
|||
|
<div class="payBtn" v-bind:class="{'active': payMonth==12}" @click="payMonth=12">十二个月</div>
|
|||
|
</div>
|
|||
|
</div>
|
|||
|
<div class="payItem">
|
|||
|
<div class="payKey">支付方式</div>
|
|||
|
<div class="payValue">
|
|||
|
<div class="payBtn" v-bind:class="{'active': payMethod=='wechat'}" @click="payMethod='wechat'">
|
|||
|
<i><img width="25" src="/static/images/ua/wechat-pay.svg"/></i>
|
|||
|
微信支付
|
|||
|
</div>
|
|||
|
</div>
|
|||
|
</div>
|
|||
|
<div class="payItem">
|
|||
|
<div class="payKey"></div>
|
|||
|
<div class="payValue">
|
|||
|
<el-button type="warning" @click="createOrder">确定</el-button>
|
|||
|
</div>
|
|||
|
</div>
|
|||
|
</div>
|
|||
|
</el-dialog>
|
|||
|
|
|||
|
</template>
|
|||
|
</div>
|
|||
|
</body>
|
|||
|
<script src="/static/js/functions.js?v=1.0.0"></script>
|
|||
|
<script src="/static/js/echarts.min.js?v=1.0.0"></script>
|
|||
|
<script src="/static/js/jquery.qrcode.js"></script>
|
|||
|
<script>
|
|||
|
var LANG=checkLang();
|
|||
|
new Vue({
|
|||
|
el: '#app',
|
|||
|
delimiters:["<{","}>"],
|
|||
|
data: {
|
|||
|
flyLang:KEFU_LANG[LANG],
|
|||
|
window:window,
|
|||
|
host:getBaseUrl(),
|
|||
|
kefuId:"",
|
|||
|
entId:"",
|
|||
|
nickname:"",
|
|||
|
kefuName:"",
|
|||
|
versionName:"",
|
|||
|
lastTime:"",
|
|||
|
ipAddress:"",
|
|||
|
noticeContent:"",
|
|||
|
versionCode:"",
|
|||
|
visitorQrcode:"",
|
|||
|
visitorUrl:"",
|
|||
|
wechatUrl:"",
|
|||
|
deployLink:"",
|
|||
|
wechatQrcode:"/static/images/textqrcode.png",
|
|||
|
wechatMenuUrl:"",
|
|||
|
avator:"",
|
|||
|
roleId:"",
|
|||
|
kefu:{},
|
|||
|
newsList:{
|
|||
|
list:[],
|
|||
|
count:0,
|
|||
|
page:1,
|
|||
|
pagesize:10,
|
|||
|
},
|
|||
|
updownList:{
|
|||
|
list:[],
|
|||
|
count:0,
|
|||
|
page:1,
|
|||
|
pagesize:7,
|
|||
|
},
|
|||
|
rate:{
|
|||
|
list:[],
|
|||
|
count:0,
|
|||
|
page:1,
|
|||
|
pagesize:10,
|
|||
|
},
|
|||
|
statistics:{},
|
|||
|
needUpdate:false,
|
|||
|
dynicQrcodeDialog:false,
|
|||
|
dynicQrDomain:"",
|
|||
|
dynicQrType:"chatIndex",
|
|||
|
dynicQrImg:"",
|
|||
|
expireTime:"",
|
|||
|
kefuExpired:"",
|
|||
|
KefuBindTel:"",
|
|||
|
tel:"",
|
|||
|
//访客监控列表
|
|||
|
monitorList:[],
|
|||
|
// 设置重连时间间隔(单位:毫秒)
|
|||
|
RECONNECT_INTERVAL: 1000,
|
|||
|
// 设置最大重连次数
|
|||
|
MAX_RECONNECT_TIMES:30,
|
|||
|
reconnectTimes :0,
|
|||
|
ws:null,
|
|||
|
configs:[],
|
|||
|
//关闭服务公告
|
|||
|
closeDialog:false,
|
|||
|
CloseNotice:"",
|
|||
|
//在线支付
|
|||
|
payDialog:false,
|
|||
|
payMonth:1,
|
|||
|
payMethod:"wechat",
|
|||
|
},
|
|||
|
methods: {
|
|||
|
//跳转
|
|||
|
openSelfUrl(url){
|
|||
|
window.location.href=url;
|
|||
|
//this.iframeUrl=url;
|
|||
|
},
|
|||
|
showStatistics(){
|
|||
|
var _this=this;
|
|||
|
sendAjax("/statistics","get",{},function(result) {
|
|||
|
_this.statistics = result.result;
|
|||
|
});
|
|||
|
sendAjax("/kefu/chartStatistics","get",{},function(data) {
|
|||
|
var result=data.result;
|
|||
|
var days=[];
|
|||
|
var nums=[];
|
|||
|
if(result.length<=0){
|
|||
|
return;
|
|||
|
}
|
|||
|
for(var i=result.length-1;i>=0;i--){
|
|||
|
days.push(result[i].day);
|
|||
|
nums.push(result[i].num)
|
|||
|
}
|
|||
|
|
|||
|
// 基于准备好的dom,初始化echarts实例
|
|||
|
$(function () {
|
|||
|
var myChart = echarts.init($('#visitorNums')[0],null, {
|
|||
|
width: document.documentElement.clientWidth-80,
|
|||
|
height: 500
|
|||
|
});
|
|||
|
// 指定图表的配置项和数据
|
|||
|
var option = {
|
|||
|
title: {
|
|||
|
text: _this.flyLang.visitorPerDay
|
|||
|
},
|
|||
|
tooltip: {},
|
|||
|
legend: {
|
|||
|
data: ['数量']
|
|||
|
},
|
|||
|
xAxis: {
|
|||
|
data: days
|
|||
|
},
|
|||
|
yAxis: {},
|
|||
|
series: [
|
|||
|
{
|
|||
|
name: 'nums',
|
|||
|
type: 'line',
|
|||
|
data: nums,
|
|||
|
barCategoryGap: '40%',
|
|||
|
}
|
|||
|
]
|
|||
|
};
|
|||
|
// 使用刚指定的配置项和数据显示图表。
|
|||
|
myChart.setOption(option);
|
|||
|
});
|
|||
|
});
|
|||
|
},
|
|||
|
copyText(text){
|
|||
|
copyText(text);
|
|||
|
this.$message({
|
|||
|
message: "ok",
|
|||
|
type: 'success'
|
|||
|
});
|
|||
|
},
|
|||
|
kefuInfo() {
|
|||
|
var _this = this;
|
|||
|
sendAjax("/kefu/kefuinfo","get",{},function (data) {
|
|||
|
if (data.code != 200) {
|
|||
|
window.location.href = "/ironMan/signInx";
|
|||
|
} else {
|
|||
|
let result = data.result;
|
|||
|
_this.kefu=result;
|
|||
|
_this.expireTime=dateFormat("Y-m-d",new Date(result.expired_at));
|
|||
|
_this.kefuId = result.id;
|
|||
|
_this.entId = result.ent_id;
|
|||
|
_this.kefuName = result.name;
|
|||
|
_this.nickname = result.nickname;
|
|||
|
_this.avator = result.avator;
|
|||
|
_this.roleId=result.role_id;
|
|||
|
_this.tel = result.tel.replace(/^(\d{3})\d{4}(\d{4})$/, "$1****$2");
|
|||
|
_this.visitorUrl=_this.host+'/chatIndex?kefu_id='+result.name+'%26ent_id='+result.ent_id;
|
|||
|
_this.wechatUrl=_this.host+'/wechat/server/'+result.ent_id+'/'+result.name;
|
|||
|
_this.visitorQrcode=_this.host+"/kefu/qrcode?str="+_this.visitorUrl+"&token="+localStorage.getItem("token");
|
|||
|
_this.wechatMenuUrl=_this.host+'/wechatIndex?ent_id='+result.ent_id+'&kefu_id='+result.name;
|
|||
|
_this.showQrcode();
|
|||
|
var info=_this.host+'/chatIndex?kefu_id='+result.name+'&ent_id='+result.ent_id;
|
|||
|
$("#qrcodeLogo2").show();
|
|||
|
$('#dynicQrImg2').empty().qrcode({
|
|||
|
text: info, // 二维码的内容
|
|||
|
render: "canvas", // 设置渲染方式
|
|||
|
width: 180, // 设置宽度: 默认256
|
|||
|
height: 180, // 设置高度: 默认256
|
|||
|
background: "#ffffff", // 背景颜色
|
|||
|
foreground: "#000000", // 前景颜色
|
|||
|
});
|
|||
|
|
|||
|
var info=_this.host+'/wechatIndex?kefu_id='+result.name+'&ent_id='+result.ent_id;
|
|||
|
$("#qrcodeLogo3").show();
|
|||
|
$('#dynicQrImg3').empty().qrcode({
|
|||
|
text: info, // 二维码的内容
|
|||
|
render: "canvas", // 设置渲染方式
|
|||
|
width: 180, // 设置宽度: 默认256
|
|||
|
height: 180, // 设置高度: 默认256
|
|||
|
background: "#ffffff", // 背景颜色
|
|||
|
foreground: "#000000", // 前景颜色
|
|||
|
});
|
|||
|
_this.getVersion();
|
|||
|
|
|||
|
}
|
|||
|
});
|
|||
|
},
|
|||
|
getVersion(){
|
|||
|
var _this=this;
|
|||
|
sendAjax("/other/systemConfig","get",{},function(data){
|
|||
|
var result=data.result;
|
|||
|
_this.versionName=result.versionName;
|
|||
|
var nowCode=result.version;
|
|||
|
_this.versionCode=nowCode;
|
|||
|
_this.kefuExpired=result.kefuExpired;
|
|||
|
_this.KefuBindTel=result.KefuBindTel;
|
|||
|
|
|||
|
//判断过期时间
|
|||
|
if(_this.kefuExpired){
|
|||
|
var endTime=new Date(_this.expireTime).getTime();
|
|||
|
var startTime=new Date().getTime();
|
|||
|
var day = parseInt((endTime - startTime) / (1000*3600*24))+1
|
|||
|
if(day<30){
|
|||
|
_this.$confirm('您的账户还剩 <span style="color:#ce3c39;font-weight: bold;">'+day+"</span> 天到期,到期时间"+_this.expireTime+",请充值时间后继续使用!", '通知', {
|
|||
|
confirmButtonText: '支付',
|
|||
|
cancelButtonText: '关闭',
|
|||
|
dangerouslyUseHTMLString: true,
|
|||
|
}).then(() => {
|
|||
|
_this.payDialog=true;
|
|||
|
}).catch(() => {
|
|||
|
|
|||
|
});
|
|||
|
}
|
|||
|
}
|
|||
|
//判断展示绑定手机号
|
|||
|
if(_this.KefuBindTel=="true" && _this.tel==""){
|
|||
|
_this.$alert("根据《中华人民共和国网络安全法》,互联网服务需手机实名验证,请前往【菜单=>修改资料】绑定手机号!", '通知', {
|
|||
|
confirmButtonText: '确定',
|
|||
|
dangerouslyUseHTMLString: true,
|
|||
|
});
|
|||
|
}
|
|||
|
});
|
|||
|
|
|||
|
},
|
|||
|
getNews(page) {
|
|||
|
var _this = this;
|
|||
|
sendAjax("/other/news","get",{page:page,pagesize:this.newsList.pagesize},function(result){
|
|||
|
_this.newsList=result.result;
|
|||
|
});
|
|||
|
},
|
|||
|
getUpdownList(page) {
|
|||
|
var _this = this;
|
|||
|
sendAjax("/kefu/upDownLineList","get",{page:page,pagesize:this.updownList.pagesize},function(result){
|
|||
|
_this.updownList=result.result;
|
|||
|
});
|
|||
|
},
|
|||
|
getServiceStatis() {
|
|||
|
var _this=this;
|
|||
|
var parames={pagesize:this.rate.pagesize,page:1};
|
|||
|
sendAjax("/kefu/rateList","get",parames,function(result){
|
|||
|
_this.rate=result.result;
|
|||
|
});
|
|||
|
},
|
|||
|
showNewsContent(item){
|
|||
|
this.$alert(item.content, item.title, {
|
|||
|
dangerouslyUseHTMLString: true,
|
|||
|
});
|
|||
|
},
|
|||
|
//
|
|||
|
showQrcode(){
|
|||
|
let _this=this;
|
|||
|
sendAjax("/wechat/showQrcode","get",{entId:this.entId,sceneName:"kf_"+this.kefuName},function(res){
|
|||
|
if(res.code!=200){
|
|||
|
}else{
|
|||
|
_this.wechatQrcode=res.result.url
|
|||
|
}
|
|||
|
});
|
|||
|
},
|
|||
|
mkDynicImage(reset){
|
|||
|
var _this=this;
|
|||
|
if(_this.dynicQrDomain==""){
|
|||
|
_this.dynicQrDomain=_this.host;
|
|||
|
}
|
|||
|
var resetFlag="";
|
|||
|
if(reset){
|
|||
|
resetFlag="reset";
|
|||
|
$confirmTitle='此操作将会使旧二维码失效,二维码图片请手动截图另存到本地,是否继续?';
|
|||
|
}else{
|
|||
|
$confirmTitle="此操作将生成新二维码,二维码图片请手动截图另存到本地,是否继续?"
|
|||
|
}
|
|||
|
this.$confirm($confirmTitle, '提示', {
|
|||
|
confirmButtonText: '确定',
|
|||
|
cancelButtonText: '取消',
|
|||
|
type: 'warning'
|
|||
|
}).then(function(){
|
|||
|
sendAjax("/kefu/mkDynicQrcode","post",{
|
|||
|
domain:_this.dynicQrDomain,
|
|||
|
dynicQrType:_this.dynicQrType,
|
|||
|
resetFlag:resetFlag,
|
|||
|
},function(res) {
|
|||
|
var uuid=res.result.uuid;
|
|||
|
var info=_this.dynicQrDomain+"/other/checkQrcode?uuid="+uuid;
|
|||
|
_this.dynicQrImg=_this.host+"/kefu/qrcode?str="+info+"&token="+localStorage.getItem("token");
|
|||
|
$("#qrcodeLogo").show();
|
|||
|
$('#dynicQrImg').empty().qrcode({
|
|||
|
text: info, // 二维码的内容
|
|||
|
render: "canvas", // 设置渲染方式
|
|||
|
width: 260, // 设置宽度: 默认256
|
|||
|
height: 260, // 设置高度: 默认256
|
|||
|
background: "#ffffff", // 背景颜色
|
|||
|
foreground: "#000000", // 前景颜色
|
|||
|
});
|
|||
|
});
|
|||
|
});
|
|||
|
|
|||
|
},
|
|||
|
//关闭服务
|
|||
|
stopServer(){
|
|||
|
var _this=this;
|
|||
|
sendAjax("/system/stop","get",{},function(res){
|
|||
|
_this.$message({
|
|||
|
message: "服务在守护模式下会重启,非守护则直接关闭",
|
|||
|
type: 'success'
|
|||
|
});
|
|||
|
});
|
|||
|
},
|
|||
|
//清理服务
|
|||
|
cleanServer(){
|
|||
|
var _this=this;
|
|||
|
sendAjax("/system/clean","get",{},function(res){
|
|||
|
_this.$message({
|
|||
|
message: "操作成功!",
|
|||
|
type: 'success'
|
|||
|
});
|
|||
|
});
|
|||
|
},
|
|||
|
//获取监控列表
|
|||
|
getMonitorList(){
|
|||
|
var _this=this;
|
|||
|
sendAjax("/kefu/monitorList","get",{},function(result){
|
|||
|
_this.monitorList=result.result;
|
|||
|
});
|
|||
|
},
|
|||
|
//发送监控消息
|
|||
|
sendMonitorMessage(id,message){
|
|||
|
var _this=this;
|
|||
|
sendAjax("/kefu/monitorMessage","post",{
|
|||
|
"uniqid":id,
|
|||
|
"message":message
|
|||
|
},function(result){
|
|||
|
_this.$message({
|
|||
|
message: "ok",
|
|||
|
type: 'success'
|
|||
|
});
|
|||
|
});
|
|||
|
},
|
|||
|
//创建支付订单
|
|||
|
createOrder(){
|
|||
|
var _this=this;
|
|||
|
sendAjax("/kefu/createOrder","post",{
|
|||
|
"pay_method":this.payMethod,
|
|||
|
"pay_month":this.payMonth
|
|||
|
},function(res){
|
|||
|
if(res.code!=20000){
|
|||
|
_this.$message({
|
|||
|
message: res.msg,
|
|||
|
type: 'error'
|
|||
|
});
|
|||
|
return;
|
|||
|
}
|
|||
|
let orderId=res.result.order_id;
|
|||
|
if(res.result.code_url){
|
|||
|
// window.open("/api/v2/qrcode?str="+res.result.code_url);
|
|||
|
let html='<div style="text-align: center"><h2>金额:'+res.result.ammount/100+'</h2><img src="/api/v2/qrcode?str='+res.result.code_url+'" /></div>';
|
|||
|
_this.$confirm(html, '通知', {
|
|||
|
confirmButtonText: '查询订单状态',
|
|||
|
dangerouslyUseHTMLString: true,
|
|||
|
}).then(() => {
|
|||
|
sendAjax("/kefu/queryWechatOrder","post",{
|
|||
|
"order_id":orderId,
|
|||
|
},function(res){
|
|||
|
if(res.code!="20000"){
|
|||
|
_this.$message({
|
|||
|
message: "订单未成功支付!",
|
|||
|
type: 'error'
|
|||
|
});
|
|||
|
}else{
|
|||
|
_this.$message({
|
|||
|
message: "订单已经成功支付!",
|
|||
|
type: 'success'
|
|||
|
});
|
|||
|
location.reload();
|
|||
|
}
|
|||
|
})
|
|||
|
}).catch(() => {
|
|||
|
|
|||
|
});
|
|||
|
|
|||
|
// _this.$alert('请在扫码支付后,点击同步状态,将查询微信支付订单结果并同步本地订单状态', '支付订单', {
|
|||
|
// confirmButtonText: '同步状态',
|
|||
|
// callback: action => {
|
|||
|
//
|
|||
|
// }
|
|||
|
// });
|
|||
|
}
|
|||
|
});
|
|||
|
},
|
|||
|
getConfigs(){
|
|||
|
let _this=this;
|
|||
|
sendAjax("/kefu/ent_configs","get",{},function(result){
|
|||
|
_this.configs=result.result;
|
|||
|
_this.CloseNotice=_this.getConfig("CloseNotice");
|
|||
|
});
|
|||
|
},
|
|||
|
getConfig(key){
|
|||
|
for(index in this.configs){
|
|||
|
if(key==this.configs[index].conf_key){
|
|||
|
return this.configs[index].conf_value;
|
|||
|
}
|
|||
|
}
|
|||
|
return "";
|
|||
|
},
|
|||
|
//切换机器人
|
|||
|
setCloseNotice(){
|
|||
|
let _this=this;
|
|||
|
sendAjax("/kefu/entConfigs","POST",{name:"服务关闭公告",key:"CloseNotice",value:_this.CloseNotice},function(result) {
|
|||
|
_this.$message({
|
|||
|
message: "success",
|
|||
|
type: 'success'
|
|||
|
});
|
|||
|
_this.getConfigs();
|
|||
|
});
|
|||
|
},
|
|||
|
/**
|
|||
|
* 连接websocket
|
|||
|
*/
|
|||
|
connect () {
|
|||
|
var _this=this;
|
|||
|
var domain=getDomainFromUrl("");
|
|||
|
var protocol=getProtocolFromUrl("");
|
|||
|
var wsProtocol="ws://";
|
|||
|
if(protocol=="https"){
|
|||
|
wsProtocol="wss://";
|
|||
|
}
|
|||
|
let ws = new WebSocket(wsProtocol+domain+"/ws_kefu?token="+localStorage.getItem("token"));
|
|||
|
|
|||
|
ws.onopen = function () {
|
|||
|
console.log('WebSocket 连接已打开');
|
|||
|
_this.reconnectTimes = 0;
|
|||
|
};
|
|||
|
|
|||
|
ws.onclose = function () {
|
|||
|
console.log('WebSocket 连接已关闭');
|
|||
|
// 尝试重连
|
|||
|
_this.reconnect();
|
|||
|
};
|
|||
|
ws.onmessage = function (event) {
|
|||
|
console.log(`收到服务器的消息:${event.data}`);
|
|||
|
// 解析消息
|
|||
|
const message = JSON.parse(event.data);
|
|||
|
//监控列表删除
|
|||
|
if (message.type === 'monitorOffline') {
|
|||
|
let id=message.data.UinqId;
|
|||
|
_this.monitorList=removeObjects(_this.monitorList,"UinqId",id);
|
|||
|
}
|
|||
|
//监控列表增加
|
|||
|
if (message.type === 'monitorOnline') {
|
|||
|
let obj=message.data;
|
|||
|
_this.monitorList.unshift(obj);
|
|||
|
}
|
|||
|
};
|
|||
|
_this.ws=ws;
|
|||
|
},
|
|||
|
// 尝试重连
|
|||
|
reconnect(){
|
|||
|
var _this=this;
|
|||
|
if (_this.reconnectTimes >= _this.MAX_RECONNECT_TIMES) {
|
|||
|
console.log('重连失败');
|
|||
|
return;
|
|||
|
}
|
|||
|
_this.reconnectTimes++;
|
|||
|
console.log(`正在尝试重连(第 ${_this.reconnectTimes} 次)`);
|
|||
|
setTimeout(function () {
|
|||
|
_this.connect();
|
|||
|
}, _this.RECONNECT_INTERVAL);
|
|||
|
}
|
|||
|
},
|
|||
|
mounted:function(){
|
|||
|
},
|
|||
|
created: function () {
|
|||
|
this.getConfigs();
|
|||
|
this.showStatistics();
|
|||
|
this.kefuInfo();
|
|||
|
this.getNews(1);
|
|||
|
this.getUpdownList(1);
|
|||
|
this.getServiceStatis();
|
|||
|
this.getMonitorList();
|
|||
|
var _this=this;
|
|||
|
setTimeout(function () {
|
|||
|
_this.connect();
|
|||
|
},5000)
|
|||
|
}
|
|||
|
})
|
|||
|
</script>
|
|||
|
</html>
|