master
taoshihan 1 year ago
parent 0f63c824fd
commit 5dbbecd242

@ -0,0 +1,743 @@
.launchButtonBox{
position: fixed!important;
bottom: 25px;
right: 30px;
left: auto;
z-index: 999999;
}
.launchButtonNotice{
width: 270px;
padding: 10px;
margin: 0 auto;
clear: both;
position: absolute;
bottom: 60px;
right: 0;
z-index: 999999;
color: #545454;
line-height: 1.5;
font-size: 14px;
display: none;
}
.launchNoticeContent{
border-radius: 8px;
background-color: #fff;
border: 1px solid #f7f7f9;
box-shadow: 0 2px 8px rgb(0 0 0 / 10%);
padding: 10px;
}
.flexBox{
display: flex;
align-items: flex-end;
margin-top: 10px;
}
.launchButtonNotice a{
color: #07a9fe;!important;
text-decoration: none;
}
.launchIcon{
background: #ff305f;
width: 18px;
height: 18px;
font-size: 12px;
line-height: 18px;
text-align: center;
border-radius: 50%;
position: absolute;
top: -2px;
left: 14px;
color: #fff;
display: none;
}
.launchButton{
border-radius: 30px;
z-index: 10000000000000!important;
background: #2d8cf0;
box-shadow: rgb(0 0 0 / 6%) 0px 1px 6px, rgb(0 0 0 / 16%) 0px 2px 32px;
box-sizing: border-box!important;
padding: 15px 20px;
cursor: pointer!important;
outline: 0!important;
display: flex;
justify-content: center;
align-items: center;
margin: 0!important;
-webkit-font-smoothing: antialiased!important;
-webkit-tap-highlight-color: transparent!important;
color: #ffffff;
position: relative;
}
.launchButton:hover {
box-shadow: 0 8px 32px rgb(0 0 0 / 40%) !important;
}
.launchButton svg{
width: 28px;
height: 48px;
}
.launchButtonText {
display: inline-block;
/*font-size: 14px;*/
letter-spacing:1px;
text-overflow: ellipsis!important;
vertical-align: top!important;
white-space: nowrap;
}
.launchButtonText img{
width: 26px;
display: inline-block;
}
.launchButtonNotice .flyAvatar{
width: 36px;
height: 36px;
border-radius: 50%;
border: 1px solid #fff;
}
.flyAvatar{
width: 30px;
height: 30px;
border-radius: 50%;
display: inline-block;
border:2px solid #fff;
margin-right: 5px;
}
.layui-layer-title .flyAvatar{
margin-top: 5px;
}
.launchButtonNotice .flyUsername{
font-weight: bold;
float: left;
margin-left: 4px;
}
.launchButtonNotice .flyUser{
width: 36px;
height: 36px;
overflow: hidden;
flex-shrink: 0;
margin-right: 4px;
box-shadow: 0 2px 8px rgb(0 0 0 / 10%);
border-radius: 50%;
}
.launchButtonNotice .flyClose {
text-align: center;
border-radius: 50%;
width: 30px;
height: 30px;
line-height: 30px;
color: #464646;
cursor: pointer;
position: absolute;
top: -25px;
right: 0px;
background-color: #fff;
border: 1px solid #f7f7f9;
box-shadow: 0 2px 8px rgb(0 0 0 / 10%);
}
#layui-layer19911116{
/*display: none;*/
box-shadow: 0 5px 40px rgb(0 0 0 / 16%);
border-radius: 12px;
border: none;
animation: up 0.5s ease-in-out both
}
#layui-layer-iframe19911116{
border-radius: 0 0 12px 12px;
}
.launchPointer{
background: #3cc51f;
width: 10px;
height: 10px;
display: inline-block;
border-radius: 50%;
position: absolute;
top: 25px;
left: 42px;
border:2px solid #fff;
}
.launchPointer.offline{
background: #ce3c39;
}
.folderBtn {
display: inline-block;
background-color: transparent;
overflow: hidden;
font-size: 1px;
}
.folderBtn:before {
content: '';
float: left;
background-color: #9da0a0;
width: 15px;
height: 3px;
margin-left: 2px;
border-top-left-radius: 2px;
border-top-right-radius: 2px;
box-shadow: 2px 2px 0 0 #9da0a0;
}
.folderBtn:after {
content: '';
float: left;
clear: left;
background-color: #d4d6d6;
width: 33px;
height: 22px;
border-radius: 1px;
}
@-webkit-keyframes bounce-up {
25% {-webkit-transform: translateY(4px);}
50%, 100% {-webkit-transform: translateY(0);}
75% {-webkit-transform: translateY(-4px);}
}
@keyframes bounce-up {
25% {transform: translateY(4px);}
50%, 100% {transform: translateY(0);}
75% {transform: translateY(-4px);}
}
.animateUpDown{
-webkit-animation: bounce-up 0.5s linear infinite;
animation: bounce-up 0.5s linear infinite;
}
@keyframes up {
0% {
-webkit-transform: translateY(20px);
transform: translateY(20px);
opacity: 0
}
to {
-webkit-transform: translateY(-20px);
transform: translateY(-20px);
opacity: 1
}
}
@media screen and (max-width: 500px) {
.launchButtonBox{
width: 100%;
right: 0px;
}
.launchButton{
width: 43px;
height: auto;
position: absolute;
right: 6px;
bottom: 140px;
padding: 10px 0px;
}
.launchButtonNotice{
bottom: 120px;
right: 42px;
}
.launchButtonText{
white-space: normal;
word-wrap: break-word;
text-align: center;
writing-mode: vertical-lr;
text-orientation: mixed;
text-align: center;
justify-content: center;
display: flex;
align-items: center;
letter-spacing: 2px;
}
.launchButtonText img{margin-bottom: 5px;}
.launchButtonText .flyAvatar{
display: block;
margin-right: 0px;
float: none;
}
.launchButtonNotice:after{
right: 4%;
}
}
/*看板娘*/
.waifu-toggle {
background-color: #fa0;
border-radius: 5px;
bottom: 66px;
color: #fff;
cursor: pointer;
font-size: 12px;
left: 0;
margin-left: -100px;
padding: 5px 2px 5px 5px;
position: fixed;
transition: margin-left 1s;
width: 60px;
writing-mode: vertical-rl;
}
.waifu-toggle.waifu-toggle-active {
margin-left: -50px;
}
.waifu-toggle.waifu-toggle-active:hover {
margin-left: -30px;
}
.waifu {
bottom: -1000px;
left: 0;
line-height: 0;
margin-bottom: -10px;
position: fixed;
transform: translateY(3px);
transition: transform .3s ease-in-out, bottom 3s ease-in-out;
z-index: 1;
}
.waifu:hover {
transform: translateY(0);
}
.waifu-tips {
top:-50px;
animation: shake 50s ease-in-out 5s infinite;
background-color: rgba(236, 217, 188, .5);
border: 1px solid rgba(224, 186, 140, .62);
border-radius: 12px;
box-shadow: 0 3px 15px 2px rgba(191, 158, 118, .2);
font-size: 14px;
line-height: 24px;
margin: 0px 20px;
min-height: 70px;
opacity: 0;
overflow: hidden;
padding: 5px 10px;
position: absolute;
text-overflow: ellipsis;
transition: opacity 1s;
width: 250px;
word-break: break-all;
}
.waifu-tips.waifu-tips-active {
opacity: 1;
transition: opacity .2s;
background-color: rgba(236, 217, 188, 0.8);
}
.waifu-tips span {
color: #0099cc;
}
.waifu #live2d {
cursor: grab;
height: 300px;
position: relative;
width: 300px;
}
.waifu #live2d:active {
cursor: grabbing;
}
.waifu-tool {
color: #aaa;
opacity: 0;
position: absolute;
right: -10px;
top: 70px;
transition: opacity 1s;
}
.waifu:hover #waifu-tool {
opacity: 1;
}
.waifu-tool span {
color: #7b8c9d;
cursor: pointer;
display: block;
line-height: 30px;
text-align: center;
transition: color .3s;
}
.waifu-tool span:hover {
color: #0684bd; /* #34495e */
}
.waifu-input{
background-color: rgba(236, 217, 188, .9);
border: 1px solid rgba(224, 186, 140, .8);
border-radius: 12px;
box-shadow:0 3px 15px 2px rgba(191, 158, 118, .4);
left: 20px;
bottom: 30px;
width: 250px;
position: absolute;
padding: 6px;
z-index: 2;
}
@keyframes shake {
2% {
transform: translate(.5px, -1.5px) rotate(-.5deg);
}
4% {
transform: translate(.5px, 1.5px) rotate(1.5deg);
}
6% {
transform: translate(1.5px, 1.5px) rotate(1.5deg);
}
8% {
transform: translate(2.5px, 1.5px) rotate(.5deg);
}
10% {
transform: translate(.5px, 2.5px) rotate(.5deg);
}
12% {
transform: translate(1.5px, 1.5px) rotate(.5deg);
}
14% {
transform: translate(.5px, .5px) rotate(.5deg);
}
16% {
transform: translate(-1.5px, -.5px) rotate(1.5deg);
}
18% {
transform: translate(.5px, .5px) rotate(1.5deg);
}
20% {
transform: translate(2.5px, 2.5px) rotate(1.5deg);
}
22% {
transform: translate(.5px, -1.5px) rotate(1.5deg);
}
24% {
transform: translate(-1.5px, 1.5px) rotate(-.5deg);
}
26% {
transform: translate(1.5px, .5px) rotate(1.5deg);
}
28% {
transform: translate(-.5px, -.5px) rotate(-.5deg);
}
30% {
transform: translate(1.5px, -.5px) rotate(-.5deg);
}
32% {
transform: translate(2.5px, -1.5px) rotate(1.5deg);
}
34% {
transform: translate(2.5px, 2.5px) rotate(-.5deg);
}
36% {
transform: translate(.5px, -1.5px) rotate(.5deg);
}
38% {
transform: translate(2.5px, -.5px) rotate(-.5deg);
}
40% {
transform: translate(-.5px, 2.5px) rotate(.5deg);
}
42% {
transform: translate(-1.5px, 2.5px) rotate(.5deg);
}
44% {
transform: translate(-1.5px, 1.5px) rotate(.5deg);
}
46% {
transform: translate(1.5px, -.5px) rotate(-.5deg);
}
48% {
transform: translate(2.5px, -.5px) rotate(.5deg);
}
50% {
transform: translate(-1.5px, 1.5px) rotate(.5deg);
}
52% {
transform: translate(-.5px, 1.5px) rotate(.5deg);
}
54% {
transform: translate(-1.5px, 1.5px) rotate(.5deg);
}
56% {
transform: translate(.5px, 2.5px) rotate(1.5deg);
}
58% {
transform: translate(2.5px, 2.5px) rotate(.5deg);
}
60% {
transform: translate(2.5px, -1.5px) rotate(1.5deg);
}
62% {
transform: translate(-1.5px, .5px) rotate(1.5deg);
}
64% {
transform: translate(-1.5px, 1.5px) rotate(1.5deg);
}
66% {
transform: translate(.5px, 2.5px) rotate(1.5deg);
}
68% {
transform: translate(2.5px, -1.5px) rotate(1.5deg);
}
70% {
transform: translate(2.5px, 2.5px) rotate(.5deg);
}
72% {
transform: translate(-.5px, -1.5px) rotate(1.5deg);
}
74% {
transform: translate(-1.5px, 2.5px) rotate(1.5deg);
}
76% {
transform: translate(-1.5px, 2.5px) rotate(1.5deg);
}
78% {
transform: translate(-1.5px, 2.5px) rotate(.5deg);
}
80% {
transform: translate(-1.5px, .5px) rotate(-.5deg);
}
82% {
transform: translate(-1.5px, .5px) rotate(-.5deg);
}
84% {
transform: translate(-.5px, .5px) rotate(1.5deg);
}
86% {
transform: translate(2.5px, 1.5px) rotate(.5deg);
}
88% {
transform: translate(-1.5px, .5px) rotate(1.5deg);
}
90% {
transform: translate(-1.5px, -.5px) rotate(-.5deg);
}
92% {
transform: translate(-1.5px, -1.5px) rotate(1.5deg);
}
94% {
transform: translate(.5px, .5px) rotate(-.5deg);
}
96% {
transform: translate(2.5px, -.5px) rotate(-.5deg);
}
98% {
transform: translate(-1.5px, -1.5px) rotate(-.5deg);
}
0%, 100% {
transform: translate(0, 0) rotate(0);
}
}
.flySimpleIconBox{
position: fixed;
bottom: 150px;
right: 10px;
z-index: 999999;
}
.flySimpleIcon{
width: 60px;
height: 60px;
text-align: center;
box-shadow: rgba(0, 0, 0, 0.16) 0px 5px 14px;
border-radius: 50%;
cursor: pointer;
}
.flySimpleIcon .flySimpleDefaultImg{
display: inline-block;
margin-top: 12px;
width: 35px;
}
.flySimpleIcon .flySimpleUserImg{
width: 60px;
height: 60px;
border-radius: 50%;
}
.flySimpleIconTip{
display: none;
width: 250px;
max-height: 200px;
overflow-y: auto;
background: #fff;
position: absolute;
top:5px;
right: 70px;
border-radius: 4px;
box-shadow: 0 3px 15px 0 rgba(0,0,0,.25)!important;
padding: 14px;
font-size: 14px;
}
.flySimpleIconBox .flyClose{
text-align: center;
width: 30px;
height: 30px;
line-height: 30px;
cursor: pointer;
position: absolute;
right: 0px;
top: 2px;
}
.chatImagePic{
max-width: 100%;
}
.lineBox{
position: fixed!important;
bottom: 30%;
right: 0px;
left: auto;
z-index: 999999;
}
.lineBox .lineItem{
cursor: pointer;
width: 50px;
height: 55px;
background: #2d8cf0;
margin-bottom: 1px;
color: #fff;
line-height: 55px;
text-align: center;
position: relative;
}
.lineItem .layui-icon{
font-size: 26px;
}
.lineItem:hover{
opacity: 0.8;
}
.lineTop{
margin-top: 4px;
}
.lineTip{
border-radius: 2px;
box-shadow: 1px 1px 3px rgba(0,0,0,.2);
position: absolute;
top:0px;
right: 59px;
color: #000;
padding: 0 10px;
background: #fff;
display: none;
}
.lineTip:before, .lineTip:after {
content: "";
display: block;
position: absolute;
width: 0;
height: 0;
border: 10px solid transparent;
border-left-color: rgba(255,255,255,1);
right: -16px;
top: 10px;
z-index: 1;
}
.lineTip:after{
right: -18px;
border-left-color: rgb(237,237,237);
z-index: 0;
}
.lineWechat{
width: 100px;
height: 100px;
padding: 0px;
}
.kfLayer .layui-layer-title{
background-color: #3369FF;
background-image: linear-gradient(to right, #0d6efd, #2aadeb);
height: 60px;
border: 0px;
color: #fff;
padding: 0px;
line-height: normal;
border-radius: 12px 12px 0 0;
}
.kfLayer .kfBar{
display: flex;
align-items: center;
height: 60px;
}
.kfLayer .kfBarLogo{
width: 40px;
height: 40px;
border-radius: 50%;
}
.kfLayer .kfBarText{
float: left;
margin:0px 0px 0px 10px;
max-width: 220px;
}
.kfLayer .kfBarBtn{
margin-right: 40px;
margin-left: auto;
margin-bottom: 7px;
}
.kfLayer .kfBarBtn .cursor{
cursor: pointer;
}
.kfLayer .kfDesc{
font-size: 12px;
margin-top: 5px;
}
.kfLayer .layui-layer-setwin .layui-layer-close1{
background: url("../images/zoom_out.png") no-repeat 0;
width: 22px;
}
.kfBarAvator{
width: 40px;
height: 40px;
position: relative;
margin: 0 0px 0 15px;
}
.kfBarStatus{
width: 8px;
height: 8px;
border-radius: 50%;
--bg-opacity: 1;
background-color: #00c41d;
background-color: rgba(0,196,29,var(--bg-opacity));
border:1px solid #fff;
display: inline-block;
}
.kfBarAvator i.offline{
background: #f56c6c;
}

File diff suppressed because one or more lines are too long

@ -0,0 +1 @@
html #layuicss-skincodecss{display:none;position:absolute;width:1989px}.layui-code-h3,.layui-code-view{position:relative;font-size:12px}.layui-code-view{display:block;margin:10px 0;padding:0;border:1px solid #eee;border-left-width:6px;background-color:#FAFAFA;color:#333;font-family:Courier New}.layui-code-h3{padding:0 10px;height:40px;line-height:40px;border-bottom:1px solid #eee}.layui-code-h3 a{position:absolute;right:10px;top:0;color:#999}.layui-code-view .layui-code-ol{position:relative;overflow:auto}.layui-code-view .layui-code-ol li{position:relative;margin-left:45px;line-height:20px;padding:0 10px;border-left:1px solid #e2e2e2;list-style-type:decimal-leading-zero;*list-style-type:decimal;background-color:#fff}.layui-code-view .layui-code-ol li:first-child{padding-top:10px}.layui-code-view .layui-code-ol li:last-child{padding-bottom:10px}.layui-code-view pre{margin:0}.layui-code-notepad{border:1px solid #0C0C0C;border-left-color:#3F3F3F;background-color:#0C0C0C;color:#C2BE9E}.layui-code-notepad .layui-code-h3{border-bottom:none}.layui-code-notepad .layui-code-ol li{background-color:#3F3F3F;border-left:none}.layui-code-demo .layui-code{visibility:visible!important;margin:-15px;border-top:none;border-right:none;border-bottom:none}.layui-code-demo .layui-tab-content{padding:15px;border-top:none}

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 701 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 299 KiB

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 1023 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 946 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 927 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 946 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 975 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1022 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 988 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 130 B

@ -0,0 +1,364 @@
const KEFU={
KEFU_URL:"",
KEFU_KEFU_ID:"",
KEFU_ENT:"",
KEFU_LANG:"en",
KEFU_EXTRA: {},
KEFU_AUTO_OPEN:true,//是否自动打开
KEFU_SHOW_TYPES:1,//展示样式1普通右下角2圆形icon
KEFU_AUTO_SHOW:false,
KEFU_WITHOUT_BOX:false,
VISITOR_ID:"",
VISITOR_NAME:"",
VISITOR_AVATOR:"",
};
KEFU.launchButtonFlag=false;
KEFU.titleTimer=0;
KEFU.titleNum=0;
KEFU.noticeTimer=null;
KEFU.originTitle=document.title;
KEFU.chatPageTitle="KEFU";
KEFU.kefuName="";
KEFU.kefuAvator="";
KEFU.kefuIntroduce="";
KEFU.kefuDialogDelay="3000";
KEFU.offLine=false;
KEFU.TEXT={
"cn":{
"online_notice":"在线咨询",
"offline_notice":"离线留言",
},
"en":{
"online_notice":"chat with us",
"offline_notice":"we are offline",
},
"ru":{
"online_notice":"Разговор с нами",
"offline_notice":"Мы оффлайн",
},
};
KEFU.init=function(config){
var _this=this;
if (!config) { config = {}; }
for (var key in KEFU) {
if (typeof config[key] !== 'undefined') {
this[key] = config[key];
} else {
this[key] = KEFU[key];
}
}
if (typeof config.KEFU_URL!="undefined"){
this.KEFU_URL=config.KEFU_URL.replace(/([\w\W]+)\/$/,"$1");
}
this.dynamicLoadCss(this.KEFU_URL+"/static/css/kefu-front.css?v="+Date.now());
this.dynamicLoadCss(this.KEFU_URL+"/static/css/layui/css/layui.css?v="+Date.now());
var refer=document.referrer?document.referrer:"none";
this.KEFU_EXTRA.refer=refer;
this.KEFU_EXTRA.host=document.location.href;
this.KEFU_EXTRA=JSON.stringify(_this.KEFU_EXTRA);
this.dynamicLoadJs(this.KEFU_URL+"/static/js/functions.js?v=1",function(){
_this.dynamicLoadJs("https://cdn.staticfile.org/jquery/3.6.0/jquery.min.js",function () {
jQuery.noConflict();
_this.dynamicLoadJs(_this.KEFU_URL+"/static/js/layer/layer.js",function () {
_this.jsCallBack();
});
});
//}
});
_this.addEventlisten();
}
KEFU.jsCallBack=function(){
var _this=this;
_this.showPcTips();
_this.addClickEvent();
}
//pc端的样式
KEFU.showPcTips=function(){
var _this=this;
//自动展开
if(_this.KEFU_AUTO_OPEN&&_this.isIE()<=0){
setTimeout(function () {
_this.showKefu();
},_this.kefuDialogDelay);
}
var html=`
<div class='launchButtonBox'>
<div id="launchButton" class="launchButton">
<div id="launchIcon" class="launchIcon">1</div>
<div class="launchButtonText">
<img src="`+_this.KEFU_URL+`/static/images/wechatLogo.png"/>
<span class='flyUsername'>在线咨询</span>
</div>
</div>
<div id="launchButtonNotice" class="launchButtonNotice"></div>
</div>
`
jQuery('body').append(html);
if(_this.KEFU_AUTO_OPEN){
return;
}
}
KEFU.addClickEvent=function(){
var _this=this;
var launchButton=jQuery("#launchButton");
if(launchButton){
launchButton.on("click",function() {
if(_this.launchButtonFlag){
return;
}
_this.KEFU_AUTO_SHOW=true;
_this.showKefu();
jQuery("#launchIcon").text(0).hide();
});
}
}
KEFU.postMessageToIframe=function(str){
var msg={}
msg.type='inputing_message';
msg.content=str;
this.postToIframe(msg);
}
KEFU.postToIframe=function(messageObj){
var obj=document.getElementById('layui-layer-iframe19911116');
if(!obj||!messageObj){
return;
}
document.getElementById('layui-layer-iframe19911116').contentWindow.postMessage(messageObj, "*");
}
KEFU.addEventlisten=function(){
var _this=this;
window.addEventListener('message',function(e){
var msg=e.data;
if(msg.type=="message"){
clearInterval(_this.noticeTimer);
var width=jQuery(window).width();
if(width>768){
_this.flashTitle();//标题闪烁
}
if (_this.launchButtonFlag){
return;
}
var welcomeHtml="<div id='launchNoticeClose' class='flyClose'>×</div>"
+"<div class='flexBox'><div class='flyUser'><img class='flyAvatar' src='"+_this.kefuAvator+"'/>"
+ "</div>"
+"<div class='launchNoticeContent' id='launchNoticeContent'>"
+replaceSpecialTag(msg.data.content,_this.KEFU_URL)+"</div></div>";
var obj=jQuery("#launchButtonNotice");
if(obj){
obj.html(welcomeHtml).fadeIn();
// setTimeout(function (obj) {
// obj.fadeOut();
// },3000,obj);
}
var news=jQuery("#launchIcon").text();
jQuery("#launchIcon").text(++news).show();
}
if(msg.type=="focus"){
clearTimeout(_this.titleTimer);
_this.titleTimer=0;
document.title = _this.originTitle;
}
if(msg.type=="force_close"){
kayer.close(kayer.index);
}
});
window.onfocus = function () {
clearTimeout(_this.titleTimer);
_this.titleTimer=0;
document.title = _this.originTitle;
_this.postToIframe({type:"focus"});
};
}
KEFU.dynamicLoadCss=function(url){
var head = document.getElementsByTagName('head')[0];
var link = document.createElement('link');
link.type='text/css';
link.rel = 'stylesheet';
link.href = url;
head.appendChild(link);
}
KEFU.dynamicLoadJs=function(url, callback){
var head = document.getElementsByTagName('head')[0];
var script = document.createElement('script');
script.type = 'text/javascript';
script.src = url;
script.defer = true;
if(typeof(callback)=='function'){
script.onload = script.onreadystatechange = function () {
if (!this.readyState || this.readyState === "loaded" || this.readyState === "complete"){
callback();
script.onload = script.onreadystatechange = null;
}
};
}
head.appendChild(script);
}
KEFU.isIE=function(){
var userAgent = navigator.userAgent; //取得浏览器的userAgent字符串
var isIE = userAgent.indexOf("compatible") > -1 && userAgent.indexOf("MSIE") > -1; //判断是否IE<11浏览器
var isEdge = userAgent.indexOf("Edge") > -1 && !isIE; //判断是否IE的Edge浏览器
var isIE11 = userAgent.indexOf('Trident') > -1 && userAgent.indexOf("rv:11.0") > -1;
if(isIE) {
var reIE = new RegExp("MSIE (\\d+\\.\\d+);");
reIE.test(userAgent);
var fIEVersion = parseFloat(RegExp["$1"]);
if(fIEVersion == 7) {
return 7;
} else if(fIEVersion == 8) {
return 8;
} else if(fIEVersion == 9) {
return 9;
} else if(fIEVersion == 10) {
return 10;
} else {
return 6;//IE版本<=7
}
} else if(isEdge) {
return 'edge';//edge
} else if(isIE11) {
return 11; //IE11
}else{
return -1;//不是ie浏览器
}
}
KEFU.showPanel=function (){
var width=jQuery(window).width();
this.KEFU_AUTO_SHOW=true;
if(this.isIE()>0){
this.windowOpen();
return;
}
if(width<768){
this.layerOpen("100%","72%","rb");
return;
}
var width=380;
var height=580;
var x=document.documentElement.clientWidth-parseInt(width)-20;
var y=document.documentElement.clientHeight-parseInt(height)-20;
this.layerOpen(width+"px",height+"px",[y,x]);
this.launchButtonFlag=true;
}
KEFU.showKefu=function (){
if (this.launchButtonFlag) return;
var width=jQuery(window).width();
if(this.isIE()>0){
this.windowOpen();
return;
}
if(width<768){
this.layerOpen("100%","72%","rb");
return;
}
var width=380;
var height=580;
var x=document.documentElement.clientWidth-parseInt(width)-20;
var y=document.documentElement.clientHeight-parseInt(height)-20;
this.layerOpen(width+"px",height+"px",[y,x]);
this.launchButtonFlag=true;
jQuery(".launchButtonBox").hide();
}
KEFU.layerOpen=function (width,height,offset){
if (this.launchButtonFlag) return;
var layBox=jQuery("#layui-layer19911116");
if(layBox.css("display")=="none"){
this.launchButtonFlag=true;
layBox.show();
return;
}
var onlineStatus="<i class='kfBarStatus'></i>";
if(this.offLine){
onlineStatus="<i class='offline kfBarStatus'></i>";
}
var title=`
<div class="kfBar">
<div class="kfBarText">
<div class="kfName">在线客服系统</div>
</div>
</div>
`;
var _this=this;
if(!offset){
offset="rb";
}
var chatUrl=this.KEFU_URL+'/chatIndex?kefu_id='+this.KEFU_KEFU_ID+'&lang='+this.KEFU_LANG+'&extra='+this.KEFU_EXTRA;
if(this.VISITOR_ID!=""){
chatUrl+="&visitor_id="+this.VISITOR_ID;
}
if(this.VISITOR_NAME!=""){
chatUrl+="&visitor_name="+this.VISITOR_NAME;
}
if(this.VISITOR_AVATOR!=""){
chatUrl+="&avator="+this.VISITOR_AVATOR;
}
kayer.index="19911115";
kayer.open({
type: 2,
title: title,
skin:"kfLayer",
closeBtn: 1, //不显示关闭按钮
shade: 0,
area: [width, height],
offset: offset, //右下角弹出
anim: 2,
content: [chatUrl , 'yes'], //iframe的urlno代表不显示滚动条
move:false,
success:function(layero, index){
var layBox=jQuery("#layui-layer19911116");
_this.launchButtonFlag=true;
if(!_this.KEFU_WITHOUT_BOX&&_this.KEFU_AUTO_SHOW&&layBox.css("display")=="none"){
layBox.show();
}
jQuery("#layui-layer-iframe19911116 .chatEntTitle").hide();
},
end: function(){
_this.launchButtonFlag=false;
jQuery(".launchButtonBox").show();
},
cancel: function(index, layero){
jQuery("#layui-layer19911116").hide();
_this.launchButtonFlag=false;
jQuery(".launchButtonBox").show();
return false;
}
});
}
KEFU.windowOpen=function (){
window.open(this.KEFU_URL+'/chatIndex?kefu_id='+this.KEFU_KEFU_ID+'&lang='+this.KEFU_LANG+'&refer='+window.document.title+'&ent_id='+this.KEFU_ENT+'&extra='+this.KEFU_EXTRA);
}
KEFU.flashTitle=function () {
flashTitle();
}
/**
* 判断是否是手机访问
* @returns {boolean}
*/
KEFU.isMobile=function () {
if( /Mobile|Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) ) {
return true;
}
return false;
}

@ -0,0 +1,672 @@
/*! layer-v3.5.1 Web 通用弹出层组件 MIT License */ ;
! function(e, t) {
"use strict";
var i, n, a = e.layui && layui.define,
o = {
getPath: function() {
var t = document.currentScript ? document.currentScript.src : function() {
for (var e, t = document.scripts, i = t.length - 1, n = i; n > 0; n--)
if ("interactive" === t[n].readyState) {
e = t[n].src;
break
} return e || t[i].src
}(),
i = e.LAYUI_GLOBAL || {};
return i.layer_dir || t.substring(0, t.lastIndexOf("/") + 1)
}(),
config: {},
end: {},
minIndex: 0,
minLeft: [],
btn: ["&#x786E;&#x5B9A;", "&#x53D6;&#x6D88;"],
type: ["dialog", "page", "iframe", "loading", "tips"],
getStyle: function(t, i) {
var n = t.currentStyle ? t.currentStyle : e.getComputedStyle(t, null);
return n[n.getPropertyValue ? "getPropertyValue" : "getAttribute"](i)
},
link: function(t, i, n) {
if (r.path) {
var a = document.getElementsByTagName("head")[0],
s = document.createElement("link");
"string" == typeof i && (n = i);
var l = (n || t).replace(/\.|\//g, ""),
f = "layuicss-" + l,
c = "creating",
u = 0;
s.rel = "stylesheet", s.href = r.path + t, s.id = f, document.getElementById(f) || a.appendChild(s), "function" == typeof i && ! function d(t) {
var n = 100,
a = document.getElementById(f);
return ++u > 1e4 / n ? e.console && console.error(l + ".css: Invalid") : void(1989 === parseInt(o.getStyle(a, "width")) ? (t === c && a.removeAttribute("lay-status"), a.getAttribute("lay-status") === c ? setTimeout(d, n) : i()) : (a.setAttribute("lay-status", c), setTimeout(function() {
d(c)
}, n)))
}()
}
}
},
r = {
v: "3.5.1",
ie: function() {
var t = navigator.userAgent.toLowerCase();
return !!(e.ActiveXObject || "ActiveXObject" in e) && ((t.match(/msie\s(\d+)/) || [])[1] || "11")
}(),
index: e.layer && e.layer.v ? 1e5 : 0,
path: o.getPath,
config: function(e, t) {
return e = e || {}, r.cache = o.config = i.extend({}, o.config, e), r.path = o.config.path || r.path, "string" == typeof e.extend && (e.extend = [e.extend]), o.config.path && r.ready(), e.extend ? (a ? layui.addcss("modules/layer/" + e.extend) : o.link("theme/" + e.extend), this) : this
},
ready: function(e) {
var t = "layer",
i = "",
n = (a ? "modules/layer/" : "theme/") + "default/layer.css?v=" + r.v + i;
return a ? layui.addcss(n, e, t) : o.link(n, e, t), this
},
alert: function(e, t, n) {
var a = "function" == typeof t;
return a && (n = t), r.open(i.extend({
content: e,
yes: n
}, a ? {} : t))
},
confirm: function(e, t, n, a) {
var s = "function" == typeof t;
return s && (a = n, n = t), r.open(i.extend({
content: e,
btn: o.btn,
yes: n,
btn2: a
}, s ? {} : t))
},
msg: function(e, n, a) {
var s = "function" == typeof n,
f = o.config.skin,
c = (f ? f + " " + f + "-msg" : "") || "layui-layer-msg",
u = l.anim.length - 1;
return s && (a = n), r.open(i.extend({
content: e,
time: 3e3,
shade: !1,
skin: c,
title: !1,
closeBtn: !1,
btn: !1,
resize: !1,
end: a
}, s && !o.config.skin ? {
skin: c + " layui-layer-hui",
anim: u
} : function() {
return n = n || {}, (n.icon === -1 || n.icon === t && !o.config.skin) && (n.skin = c + " " + (n.skin || "layui-layer-hui")), n
}()))
},
load: function(e, t) {
return r.open(i.extend({
type: 3,
icon: e || 0,
resize: !1,
shade: .01
}, t))
},
tips: function(e, t, n) {
return r.open(i.extend({
type: 4,
content: [e, t],
closeBtn: !1,
time: 3e3,
shade: !1,
resize: !1,
fixed: !1,
maxWidth: 260
}, n))
}
},
s = function(e) {
var t = this,
a = function() {
t.creat()
};
t.index = ++r.index, t.config.maxWidth = i(n).width() - 30, t.config = i.extend({}, t.config, o.config, e), document.body ? a() : setTimeout(function() {
a()
}, 30)
};
s.pt = s.prototype;
var l = ["layui-layer", ".layui-layer-title", ".layui-layer-main", ".layui-layer-dialog", "layui-layer-iframe", "layui-layer-content", "layui-layer-btn", "layui-layer-close"];
l.anim = ["layer-anim-00", "layer-anim-01", "layer-anim-02", "layer-anim-03", "layer-anim-04", "layer-anim-05", "layer-anim-06"], l.SHADE = "layui-layer-shade", l.MOVE = "layui-layer-move", s.pt.config = {
type: 0,
shade: .3,
fixed: !0,
move: l[1],
title: "&#x4FE1;&#x606F;",
offset: "auto",
area: "auto",
closeBtn: 1,
time: 0,
zIndex: 19891014,
maxWidth: 360,
anim: 0,
isOutAnim: !0,
minStack: !0,
icon: -1,
moveType: 1,
resize: !0,
scrollbar: !0,
tips: 2
}, s.pt.vessel = function(e, t) {
var n = this,
a = n.index,
r = n.config,
s = r.zIndex + a,
f = "object" == typeof r.title,
c = r.maxmin && (1 === r.type || 2 === r.type),
u = r.title ? '<div class="layui-layer-title" style="' + (f ? r.title[1] : "") + '">' + (f ? r.title[0] : r.title) + "</div>" : "";
return r.zIndex = s, t([r.shade ? '<div class="' + l.SHADE + '" id="' + l.SHADE + a + '" times="' + a + '" style="' + ("z-index:" + (s - 1) + "; ") + '"></div>' : "", '<div class="' + l[0] + (" layui-layer-" + o.type[r.type]) + (0 != r.type && 2 != r.type || r.shade ? "" : " layui-layer-border") + " " + (r.skin || "") + '" id="' + l[0] + a + '" type="' + o.type[r.type] + '" times="' + a + '" showtime="' + r.time + '" conType="' + (e ? "object" : "string") + '" style="z-index: ' + s + "; width:" + r.area[0] + ";height:" + r.area[1] + ";position:" + (r.fixed ? "fixed;" : "absolute;") + '">' + (e && 2 != r.type ? "" : u) + '<div id="' + (r.id || "") + '" class="layui-layer-content' + (0 == r.type && r.icon !== -1 ? " layui-layer-padding" : "") + (3 == r.type ? " layui-layer-loading" + r.icon : "") + '">' + (0 == r.type && r.icon !== -1 ? '<i class="layui-layer-ico layui-layer-ico' + r.icon + '"></i>' : "") + (1 == r.type && e ? "" : r.content || "") + '</div><span class="layui-layer-setwin">' + function() {
var e = c ? '<a class="layui-layer-min" href="javascript:;"><cite></cite></a><a class="layui-layer-ico layui-layer-max" href="javascript:;"></a>' : "";
return r.closeBtn && (e += '<a class="layui-layer-ico ' + l[7] + " " + l[7] + (r.title ? r.closeBtn : 4 == r.type ? "1" : "2") + '" href="javascript:;"></a>'), e
}() + "</span>" + (r.btn ? function() {
var e = "";
"string" == typeof r.btn && (r.btn = [r.btn]);
for (var t = 0, i = r.btn.length; t < i; t++) e += '<a class="' + l[6] + t + '">' + r.btn[t] + "</a>";
return '<div class="' + l[6] + " layui-layer-btn-" + (r.btnAlign || "") + '">' + e + "</div>"
}() : "") + (r.resize ? '<span class="layui-layer-resize"></span>' : "") + "</div>"], u, i('<div class="' + l.MOVE + '" id="' + l.MOVE + '"></div>')), n
}, s.pt.creat = function() {
var e = this,
t = e.config,
a = e.index,
s = t.content,
f = "object" == typeof s,
c = i("body");
if (!t.id || !i("#" + t.id)[0]) {
switch ("string" == typeof t.area && (t.area = "auto" === t.area ? ["", ""] : [t.area, ""]), t.shift && (t.anim = t.shift), 6 == r.ie && (t.fixed = !1), t.type) {
case 0:
t.btn = "btn" in t ? t.btn : o.btn[0], r.closeAll("dialog");
break;
case 2:
var s = t.content = f ? t.content : [t.content || "", "auto"];
t.content = '<iframe scrolling="' + (t.content[1] || "auto") + '" allowtransparency="true" id="' + l[4] + a + '" name="' + l[4] + a + '" onload="this.className=\'\';" class="layui-layer-load" frameborder="0" src="' + t.content[0] + '"></iframe>';
break;
case 3:
delete t.title, delete t.closeBtn, t.icon === -1 && 0 === t.icon, r.closeAll("loading");
break;
case 4:
f || (t.content = [t.content, "body"]), t.follow = t.content[1], t.content = t.content[0] + '<i class="layui-layer-TipsG"></i>', delete t.title, t.tips = "object" == typeof t.tips ? t.tips : [t.tips, !0], t.tipsMore || r.closeAll("tips")
}
if (e.vessel(f, function(n, r, u) {
c.append(n[0]), f ? function() {
2 == t.type || 4 == t.type ? function() {
i("body").append(n[1])
}() : function() {
s.parents("." + l[0])[0] || (s.data("display", s.css("display")).show().addClass("layui-layer-wrap").wrap(n[1]), i("#" + l[0] + a).find("." + l[5]).before(r))
}()
}() : c.append(n[1]), i("#" + l.MOVE)[0] || c.append(o.moveElem = u), e.layero = i("#" + l[0] + a), e.shadeo = i("#" + l.SHADE + a), t.scrollbar || l.html.css("overflow", "hidden").attr("layer-full", a)
}).auto(a), e.shadeo.css({
"background-color": t.shade[1] || "#000",
opacity: t.shade[0] || t.shade
}), 2 == t.type && 6 == r.ie && e.layero.find("iframe").attr("src", s[0]), 4 == t.type ? e.tips() : function() {
e.offset(), parseInt(o.getStyle(document.getElementById(l.MOVE), "z-index")) || function() {
//e.layero.css("visibility", "hidden"),
r.ready(function() {
e.offset(), e.layero.css("visibility", "visible")
})
}()
}(), t.fixed && n.on("resize", function() {
e.offset(), (/^\d+%$/.test(t.area[0]) || /^\d+%$/.test(t.area[1])) && e.auto(a), 4 == t.type && e.tips()
}), t.time <= 0 || setTimeout(function() {
r.close(e.index)
}, t.time), e.move().callback(), l.anim[t.anim]) {
var u = "layer-anim " + l.anim[t.anim];
e.layero.addClass(u).one("webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend", function() {
i(this).removeClass(u)
})
}
t.isOutAnim && e.layero.data("isOutAnim", !0)
}
}, s.pt.auto = function(e) {
var t = this,
a = t.config,
o = i("#" + l[0] + e);
"" === a.area[0] && a.maxWidth > 0 && (r.ie && r.ie < 8 && a.btn && o.width(o.innerWidth()), o.outerWidth() > a.maxWidth && o.width(a.maxWidth));
var s = [o.innerWidth(), o.innerHeight()],
f = o.find(l[1]).outerHeight() || 0,
c = o.find("." + l[6]).outerHeight() || 0,
u = function(e) {
e = o.find(e), e.height(s[1] - f - c - 2 * (0 | parseFloat(e.css("padding-top"))))
};
switch (a.type) {
case 2:
u("iframe");
break;
default:
"" === a.area[1] ? a.maxHeight > 0 && o.outerHeight() > a.maxHeight ? (s[1] = a.maxHeight, u("." + l[5])) : a.fixed && s[1] >= n.height() && (s[1] = n.height(), u("." + l[5])) : u("." + l[5])
}
return t
}, s.pt.offset = function() {
var e = this,
t = e.config,
i = e.layero,
a = [i.outerWidth(), i.outerHeight()],
o = "object" == typeof t.offset;
e.offsetTop = (n.height() - a[1]) / 2, e.offsetLeft = (n.width() - a[0]) / 2, o ? (e.offsetTop = t.offset[0], e.offsetLeft = t.offset[1] || e.offsetLeft) : "auto" !== t.offset && ("t" === t.offset ? e.offsetTop = 0 : "r" === t.offset ? e.offsetLeft = n.width() - a[0] : "b" === t.offset ? e.offsetTop = n.height() - a[1] : "l" === t.offset ? e.offsetLeft = 0 : "lt" === t.offset ? (e.offsetTop = 0, e.offsetLeft = 0) : "lb" === t.offset ? (e.offsetTop = n.height() - a[1], e.offsetLeft = 0) : "rt" === t.offset ? (e.offsetTop = 0, e.offsetLeft = n.width() - a[0]) : "rb" === t.offset ? (e.offsetTop = n.height() - a[1], e.offsetLeft = n.width() - a[0]) : e.offsetTop = t.offset), t.fixed || (e.offsetTop = /%$/.test(e.offsetTop) ? n.height() * parseFloat(e.offsetTop) / 100 : parseFloat(e.offsetTop), e.offsetLeft = /%$/.test(e.offsetLeft) ? n.width() * parseFloat(e.offsetLeft) / 100 : parseFloat(e.offsetLeft), e.offsetTop += n.scrollTop(), e.offsetLeft += n.scrollLeft()), i.attr("minLeft") && (e.offsetTop = n.height() - (i.find(l[1]).outerHeight() || 0), e.offsetLeft = i.css("left")), i.css({
top: e.offsetTop,
left: e.offsetLeft
})
}, s.pt.tips = function() {
var e = this,
t = e.config,
a = e.layero,
o = [a.outerWidth(), a.outerHeight()],
r = i(t.follow);
r[0] || (r = i("body"));
var s = {
width: r.outerWidth(),
height: r.outerHeight(),
top: r.offset().top,
left: r.offset().left
},
f = a.find(".layui-layer-TipsG"),
c = t.tips[0];
t.tips[1] || f.remove(), s.autoLeft = function() {
s.left + o[0] - n.width() > 0 ? (s.tipLeft = s.left + s.width - o[0], f.css({
right: 12,
left: "auto"
})) : s.tipLeft = s.left
}, s.where = [function() {
s.autoLeft(), s.tipTop = s.top - o[1] - 10, f.removeClass("layui-layer-TipsB").addClass("layui-layer-TipsT").css("border-right-color", t.tips[1])
}, function() {
s.tipLeft = s.left + s.width + 10, s.tipTop = s.top, f.removeClass("layui-layer-TipsL").addClass("layui-layer-TipsR").css("border-bottom-color", t.tips[1])
}, function() {
s.autoLeft(), s.tipTop = s.top + s.height + 10, f.removeClass("layui-layer-TipsT").addClass("layui-layer-TipsB").css("border-right-color", t.tips[1])
}, function() {
s.tipLeft = s.left - o[0] - 10, s.tipTop = s.top, f.removeClass("layui-layer-TipsR").addClass("layui-layer-TipsL").css("border-bottom-color", t.tips[1])
}], s.where[c - 1](), 1 === c ? s.top - (n.scrollTop() + o[1] + 16) < 0 && s.where[2]() : 2 === c ? n.width() - (s.left + s.width + o[0] + 16) > 0 || s.where[3]() : 3 === c ? s.top - n.scrollTop() + s.height + o[1] + 16 - n.height() > 0 && s.where[0]() : 4 === c && o[0] + 16 - s.left > 0 && s.where[1](), a.find("." + l[5]).css({
"background-color": t.tips[1],
"padding-right": t.closeBtn ? "30px" : ""
}), a.css({
left: s.tipLeft - (t.fixed ? n.scrollLeft() : 0),
top: s.tipTop - (t.fixed ? n.scrollTop() : 0)
})
}, s.pt.move = function() {
var e = this,
t = e.config,
a = i(document),
s = e.layero,
l = s.find(t.move),
f = s.find(".layui-layer-resize"),
c = {};
return t.move && l.css("cursor", "move"), l.on("mousedown", function(e) {
e.preventDefault(), t.move && (c.moveStart = !0, c.offset = [e.clientX - parseFloat(s.css("left")), e.clientY - parseFloat(s.css("top"))], o.moveElem.css("cursor", "move").show())
}), f.on("mousedown", function(e) {
e.preventDefault(), c.resizeStart = !0, c.offset = [e.clientX, e.clientY], c.area = [s.outerWidth(), s.outerHeight()], o.moveElem.css("cursor", "se-resize").show()
}), a.on("mousemove", function(i) {
if (c.moveStart) {
var a = i.clientX - c.offset[0],
o = i.clientY - c.offset[1],
l = "fixed" === s.css("position");
if (i.preventDefault(), c.stX = l ? 0 : n.scrollLeft(), c.stY = l ? 0 : n.scrollTop(), !t.moveOut) {
var f = n.width() - s.outerWidth() + c.stX,
u = n.height() - s.outerHeight() + c.stY;
a < c.stX && (a = c.stX), a > f && (a = f), o < c.stY && (o = c.stY), o > u && (o = u)
}
s.css({
left: a,
top: o
})
}
if (t.resize && c.resizeStart) {
var a = i.clientX - c.offset[0],
o = i.clientY - c.offset[1];
i.preventDefault(), r.style(e.index, {
width: c.area[0] + a,
height: c.area[1] + o
}), c.isResize = !0, t.resizing && t.resizing(s)
}
}).on("mouseup", function(e) {
c.moveStart && (delete c.moveStart, o.moveElem.hide(), t.moveEnd && t.moveEnd(s)), c.resizeStart && (delete c.resizeStart, o.moveElem.hide())
}), e
}, s.pt.callback = function() {
function e() {
var e = a.cancel && a.cancel(t.index, n);
e === !1 || r.close(t.index)
}
var t = this,
n = t.layero,
a = t.config;
t.openLayer(), a.success && (2 == a.type ? n.find("iframe").on("load", function() {
a.success(n, t.index)
}) : a.success(n, t.index)), 6 == r.ie && t.IE6(n), n.find("." + l[6]).children("a").on("click", function() {
var e = i(this).index();
if (0 === e) a.yes ? a.yes(t.index, n) : a.btn1 ? a.btn1(t.index, n) : r.close(t.index);
else {
var o = a["btn" + (e + 1)] && a["btn" + (e + 1)](t.index, n);
o === !1 || r.close(t.index)
}
}), n.find("." + l[7]).on("click", e), a.shadeClose && t.shadeo.on("click", function() {
r.close(t.index)
}), n.find(".layui-layer-min").on("click", function() {
var e = a.min && a.min(n, t.index);
e === !1 || r.min(t.index, a)
}), n.find(".layui-layer-max").on("click", function() {
i(this).hasClass("layui-layer-maxmin") ? (r.restore(t.index), a.restore && a.restore(n, t.index)) : (r.full(t.index, a), setTimeout(function() {
a.full && a.full(n, t.index)
}, 100))
}), a.end && (o.end[t.index] = a.end)
}, o.reselect = function() {
i.each(i("select"), function(e, t) {
var n = i(this);
n.parents("." + l[0])[0] || 1 == n.attr("layer") && i("." + l[0]).length < 1 && n.removeAttr("layer").show(), n = null
})
}, s.pt.IE6 = function(e) {
i("select").each(function(e, t) {
var n = i(this);
n.parents("." + l[0])[0] || "none" === n.css("display") || n.attr({
layer: "1"
}).hide(), n = null
})
}, s.pt.openLayer = function() {
var e = this;
r.zIndex = e.config.zIndex, r.setTop = function(e) {
var t = function() {
r.zIndex++, e.css("z-index", r.zIndex + 1)
};
return r.zIndex = parseInt(e[0].style.zIndex), e.on("mousedown", t), r.zIndex
}
}, o.record = function(e) {
var t = [e.width(), e.height(), e.position().top, e.position().left + parseFloat(e.css("margin-left"))];
e.find(".layui-layer-max").addClass("layui-layer-maxmin"), e.attr({
area: t
})
}, o.rescollbar = function(e) {
l.html.attr("layer-full") == e && (l.html[0].style.removeProperty ? l.html[0].style.removeProperty("overflow") : l.html[0].style.removeAttribute("overflow"), l.html.removeAttr("layer-full"))
}, e.kayer = r, r.getChildFrame = function(e, t) {
return t = t || i("." + l[4]).attr("times"), i("#" + l[0] + t).find("iframe").contents().find(e)
}, r.getFrameIndex = function(e) {
return i("#" + e).parents("." + l[4]).attr("times")
}, r.iframeAuto = function(e) {
if (e) {
var t = r.getChildFrame("html", e).outerHeight(),
n = i("#" + l[0] + e),
a = n.find(l[1]).outerHeight() || 0,
o = n.find("." + l[6]).outerHeight() || 0;
n.css({
height: t + a + o
}), n.find("iframe").css({
height: t
})
}
}, r.iframeSrc = function(e, t) {
i("#" + l[0] + e).find("iframe").attr("src", t)
}, r.style = function(e, t, n) {
var a = i("#" + l[0] + e),
r = a.find(".layui-layer-content"),
s = a.attr("type"),
f = a.find(l[1]).outerHeight() || 0,
c = a.find("." + l[6]).outerHeight() || 0;
a.attr("minLeft");
s !== o.type[3] && s !== o.type[4] && (n || (parseFloat(t.width) <= 260 && (t.width = 260), parseFloat(t.height) - f - c <= 64 && (t.height = 64 + f + c)), a.css(t), c = a.find("." + l[6]).outerHeight(), s === o.type[2] ? a.find("iframe").css({
height: parseFloat(t.height) - f - c
}) : r.css({
height: parseFloat(t.height) - f - c - parseFloat(r.css("padding-top")) - parseFloat(r.css("padding-bottom"))
}))
}, r.min = function(e, t) {
t = t || {};
var a = i("#" + l[0] + e),
s = i("#" + l.SHADE + e),
f = a.find(l[1]).outerHeight() || 0,
c = a.attr("minLeft") || 181 * o.minIndex + "px",
u = a.css("position"),
d = {
width: 180,
height: f,
position: "fixed",
overflow: "hidden"
};
o.record(a), o.minLeft[0] && (c = o.minLeft[0], o.minLeft.shift()), t.minStack && (d.left = c, d.top = n.height() - f, a.attr("minLeft") || o.minIndex++, a.attr("minLeft", c)), a.attr("position", u), r.style(e, d, !0), a.find(".layui-layer-min").hide(), "page" === a.attr("type") && a.find(l[4]).hide(), o.rescollbar(e), s.hide()
}, r.restore = function(e) {
var t = i("#" + l[0] + e),
n = i("#" + l.SHADE + e),
a = t.attr("area").split(",");
t.attr("type");
r.style(e, {
width: parseFloat(a[0]),
height: parseFloat(a[1]),
top: parseFloat(a[2]),
left: parseFloat(a[3]),
position: t.attr("position"),
overflow: "visible"
}, !0), t.find(".layui-layer-max").removeClass("layui-layer-maxmin"), t.find(".layui-layer-min").show(), "page" === t.attr("type") && t.find(l[4]).show(), o.rescollbar(e), n.show()
}, r.full = function(e) {
var t, a = i("#" + l[0] + e);
o.record(a), l.html.attr("layer-full") || l.html.css("overflow", "hidden").attr("layer-full", e), clearTimeout(t), t = setTimeout(function() {
var t = "fixed" === a.css("position");
r.style(e, {
top: t ? 0 : n.scrollTop(),
left: t ? 0 : n.scrollLeft(),
width: n.width(),
height: n.height()
}, !0), a.find(".layui-layer-min").hide()
}, 100)
}, r.title = function(e, t) {
var n = i("#" + l[0] + (t || r.index)).find(l[1]);
n.html(e)
}, r.close = function(e, t) {
var n = i("#" + l[0] + e),
a = n.attr("type"),
s = "layer-anim-close";
if (n[0]) {
var f = "layui-layer-wrap",
c = function() {
if (a === o.type[1] && "object" === n.attr("conType")) {
n.children(":not(." + l[5] + ")").remove();
for (var r = n.find("." + f), s = 0; s < 2; s++) r.unwrap();
r.css("display", r.data("display")).removeClass(f)
} else {
if (a === o.type[2]) try {
var c = i("#" + l[4] + e)[0];
c.contentWindow.document.write(""), c.contentWindow.close(), n.find("." + l[5])[0].removeChild(c)
} catch (u) {}
n[0].innerHTML = "", n.remove()
}
"function" == typeof o.end[e] && o.end[e](), delete o.end[e], "function" == typeof t && t()
};
n.data("isOutAnim") && n.addClass("layer-anim " + s), i("#layui-layer-moves, #" + l.SHADE + e).remove(), 6 == r.ie && o.reselect(), o.rescollbar(e), n.attr("minLeft") && (o.minIndex--, o.minLeft.push(n.attr("minLeft"))), r.ie && r.ie < 10 || !n.data("isOutAnim") ? c() : setTimeout(function() {
c()
}, 200)
}
}, r.closeAll = function(e, t) {
"function" == typeof e && (t = e, e = null);
var n = i("." + l[0]);
i.each(n, function(a) {
var o = i(this),
s = e ? o.attr("type") === e : 1;
s && r.close(o.attr("times"), a === n.length - 1 ? t : null), s = null
}), 0 === n.length && "function" == typeof t && t()
};
var f = r.cache || {},
c = function(e) {
return f.skin ? " " + f.skin + " " + f.skin + "-" + e : ""
};
r.prompt = function(e, t) {
var a = "";
if (e = e || {}, "function" == typeof e && (t = e), e.area) {
var o = e.area;
a = 'style="width: ' + o[0] + "; height: " + o[1] + ';"', delete e.area
}
var s, l = 2 == e.formType ? '<textarea class="layui-layer-input"' + a + "></textarea>" : function() {
return '<input type="' + (1 == e.formType ? "password" : "text") + '" class="layui-layer-input">'
}(),
f = e.success;
return delete e.success, r.open(i.extend({
type: 1,
btn: ["&#x786E;&#x5B9A;", "&#x53D6;&#x6D88;"],
content: l,
skin: "layui-layer-prompt" + c("prompt"),
maxWidth: n.width(),
success: function(t) {
s = t.find(".layui-layer-input"), s.val(e.value || "").focus(), "function" == typeof f && f(t)
},
resize: !1,
yes: function(i) {
var n = s.val();
"" === n ? s.focus() : n.length > (e.maxlength || 500) ? r.tips("&#x6700;&#x591A;&#x8F93;&#x5165;" + (e.maxlength || 500) + "&#x4E2A;&#x5B57;&#x6570;", s, {
tips: 1
}) : t && t(n, i, s)
}
}, e))
}, r.tab = function(e) {
e = e || {};
var t = e.tab || {},
n = "layui-this",
a = e.success;
return delete e.success, r.open(i.extend({
type: 1,
skin: "layui-layer-tab" + c("tab"),
resize: !1,
title: function() {
var e = t.length,
i = 1,
a = "";
if (e > 0)
for (a = '<span class="' + n + '">' + t[0].title + "</span>"; i < e; i++) a += "<span>" + t[i].title + "</span>";
return a
}(),
content: '<ul class="layui-layer-tabmain">' + function() {
var e = t.length,
i = 1,
a = "";
if (e > 0)
for (a = '<li class="layui-layer-tabli ' + n + '">' + (t[0].content || "no content") + "</li>"; i < e; i++) a += '<li class="layui-layer-tabli">' + (t[i].content || "no content") + "</li>";
return a
}() + "</ul>",
success: function(t) {
var o = t.find(".layui-layer-title").children(),
r = t.find(".layui-layer-tabmain").children();
o.on("mousedown", function(t) {
t.stopPropagation ? t.stopPropagation() : t.cancelBubble = !0;
var a = i(this),
o = a.index();
a.addClass(n).siblings().removeClass(n), r.eq(o).show().siblings().hide(), "function" == typeof e.change && e.change(o)
}), "function" == typeof a && a(t)
}
}, e))
}, r.photos = function(t, n, a) {
function o(e, t, i) {
var n = new Image;
return n.src = e, n.complete ? t(n) : (n.onload = function() {
n.onload = null, t(n)
}, void(n.onerror = function(e) {
n.onerror = null, i(e)
}))
}
var s = {};
if (t = t || {}, t.photos) {
var l = !("string" == typeof t.photos || t.photos instanceof i),
f = l ? t.photos : {},
u = f.data || [],
d = f.start || 0;
s.imgIndex = (0 | d) + 1, t.img = t.img || "img";
var y = t.success;
if (delete t.success, l) {
if (0 === u.length) return r.msg("&#x6CA1;&#x6709;&#x56FE;&#x7247;")
} else {
var p = i(t.photos),
h = function() {
u = [], p.find(t.img).each(function(e) {
var t = i(this);
t.attr("layer-index", e), u.push({
alt: t.attr("alt"),
pid: t.attr("layer-pid"),
src: t.attr("layer-src") || t.attr("src"),
thumb: t.attr("src")
})
})
};
if (h(), 0 === u.length) return;
if (n || p.on("click", t.img, function() {
h();
var e = i(this),
n = e.attr("layer-index");
r.photos(i.extend(t, {
photos: {
start: n,
data: u,
tab: t.tab
},
full: t.full
}), !0)
}), !n) return
}
s.imgprev = function(e) {
s.imgIndex--, s.imgIndex < 1 && (s.imgIndex = u.length), s.tabimg(e)
}, s.imgnext = function(e, t) {
s.imgIndex++, s.imgIndex > u.length && (s.imgIndex = 1, t) || s.tabimg(e)
}, s.keyup = function(e) {
if (!s.end) {
var t = e.keyCode;
e.preventDefault(), 37 === t ? s.imgprev(!0) : 39 === t ? s.imgnext(!0) : 27 === t && r.close(s.index)
}
}, s.tabimg = function(e) {
if (!(u.length <= 1)) return f.start = s.imgIndex - 1, r.close(s.index), r.photos(t, !0, e)
}, s.event = function() {
s.bigimg.find(".layui-layer-imgprev").on("click", function(e) {
e.preventDefault(), s.imgprev(!0)
}), s.bigimg.find(".layui-layer-imgnext").on("click", function(e) {
e.preventDefault(), s.imgnext(!0)
}), i(document).on("keyup", s.keyup)
}, s.loadi = r.load(1, {
shade: !("shade" in t) && .9,
scrollbar: !1
}), o(u[d].src, function(n) {
r.close(s.loadi), a && (t.anim = -1), s.index = r.open(i.extend({
type: 1,
id: "layui-layer-photos",
area: function() {
var a = [n.width, n.height],
o = [i(e).width() - 100, i(e).height() - 100];
if (!t.full && (a[0] > o[0] || a[1] > o[1])) {
var r = [a[0] / o[0], a[1] / o[1]];
r[0] > r[1] ? (a[0] = a[0] / r[0], a[1] = a[1] / r[0]) : r[0] < r[1] && (a[0] = a[0] / r[1], a[1] = a[1] / r[1])
}
return [a[0] + "px", a[1] + "px"]
}(),
title: !1,
shade: .9,
shadeClose: !0,
closeBtn: !1,
move: ".layui-layer-phimg img",
moveType: 1,
scrollbar: !1,
moveOut: !0,
anim: 5,
isOutAnim: !1,
skin: "layui-layer-photos" + c("photos"),
content: '<div class="layui-layer-phimg"><img src="' + u[d].src + '" alt="' + (u[d].alt || "") + '" layer-pid="' + u[d].pid + '">' + function() {
return u.length > 1 ? '<div class="layui-layer-imgsee"><span class="layui-layer-imguide"><a href="javascript:;" class="layui-layer-iconext layui-layer-imgprev"></a><a href="javascript:;" class="layui-layer-iconext layui-layer-imgnext"></a></span><div class="layui-layer-imgbar" style="display:' + (a ? "block" : "") + '"><span class="layui-layer-imgtit"><a href="javascript:;">' + (u[d].alt || "") + "</a><em>" + s.imgIndex + " / " + u.length + "</em></span></div></div>" : ""
}() + "</div>",
success: function(e, i) {
s.bigimg = e.find(".layui-layer-phimg"), s.imgsee = e.find(".layui-layer-imgbar"), s.event(e), t.tab && t.tab(u[d], e), "function" == typeof y && y(e)
},
end: function() {
s.end = !0, i(document).off("keyup", s.keyup)
}
}, t))
}, function() {
r.close(s.loadi), r.msg("&#x5F53;&#x524D;&#x56FE;&#x7247;&#x5730;&#x5740;&#x5F02;&#x5E38;<br>&#x662F;&#x5426;&#x7EE7;&#x7EED;&#x67E5;&#x770B;&#x4E0B;&#x4E00;&#x5F20;&#xFF1F;", {
time: 3e4,
btn: ["&#x4E0B;&#x4E00;&#x5F20;", "&#x4E0D;&#x770B;&#x4E86;"],
yes: function() {
u.length > 1 && s.imgnext(!0, !0)
}
})
})
}
}, o.run = function(t) {
i = t, n = i(e), l.html = i("html"), r.open = function(e) {
var t = new s(e);
return t.index
}
}, e.layui && layui.define ? (r.ready(), layui.define("jquery", function(t) {
r.path = layui.cache.dir, o.run(layui.$), e.kayer = r, t("layer", r)
})) : "function" == typeof define && define.amd ? define(["jquery"], function() {
return o.run(e.jQuery), r
}) : function() {
r.ready(), o.run(e.jQuery)
}()
}(window);

@ -0,0 +1,2 @@
/*! layer mobile-v2.0.0 Web 通用弹出层组件 MIT License */
;!function(e){"use strict";var t=document,n="querySelectorAll",i="getElementsByClassName",a=function(e){return t[n](e)},s={type:0,shade:!0,shadeClose:!0,fixed:!0,anim:"scale"},l={extend:function(e){var t=JSON.parse(JSON.stringify(s));for(var n in e)t[n]=e[n];return t},timer:{},end:{}};l.touch=function(e,t){e.addEventListener("click",function(e){t.call(this,e)},!1)};var r=0,o=["layui-m-layer"],c=function(e){var t=this;t.config=l.extend(e),t.view()};c.prototype.view=function(){var e=this,n=e.config,s=t.createElement("div");e.id=s.id=o[0]+r,s.setAttribute("class",o[0]+" "+o[0]+(n.type||0)),s.setAttribute("index",r);var l=function(){var e="object"==typeof n.title;return n.title?'<h3 style="'+(e?n.title[1]:"")+'">'+(e?n.title[0]:n.title)+"</h3>":""}(),c=function(){"string"==typeof n.btn&&(n.btn=[n.btn]);var e,t=(n.btn||[]).length;return 0!==t&&n.btn?(e='<span yes type="1">'+n.btn[0]+"</span>",2===t&&(e='<span no type="0">'+n.btn[1]+"</span>"+e),'<div class="layui-m-layerbtn">'+e+"</div>"):""}();if(n.fixed||(n.top=n.hasOwnProperty("top")?n.top:100,n.style=n.style||"",n.style+=" top:"+(t.body.scrollTop+n.top)+"px"),2===n.type&&(n.content='<i></i><i class="layui-m-layerload"></i><i></i><p>'+(n.content||"")+"</p>"),n.skin&&(n.anim="up"),"msg"===n.skin&&(n.shade=!1),s.innerHTML=(n.shade?"<div "+("string"==typeof n.shade?'style="'+n.shade+'"':"")+' class="layui-m-layershade"></div>':"")+'<div class="layui-m-layermain" '+(n.fixed?"":'style="position:static;"')+'><div class="layui-m-layersection"><div class="layui-m-layerchild '+(n.skin?"layui-m-layer-"+n.skin+" ":"")+(n.className?n.className:"")+" "+(n.anim?"layui-m-anim-"+n.anim:"")+'" '+(n.style?'style="'+n.style+'"':"")+">"+l+'<div class="layui-m-layercont">'+n.content+"</div>"+c+"</div></div></div>",!n.type||2===n.type){var d=t[i](o[0]+n.type),y=d.length;y>=1&&layer.close(d[0].getAttribute("index"))}document.body.appendChild(s);var u=e.elem=a("#"+e.id)[0];n.success&&n.success(u),e.index=r++,e.action(n,u)},c.prototype.action=function(e,t){var n=this;e.time&&(l.timer[n.index]=setTimeout(function(){layer.close(n.index)},1e3*e.time));var a=function(){var t=this.getAttribute("type");0==t?(e.no&&e.no(),layer.close(n.index)):e.yes?e.yes(n.index):layer.close(n.index)};if(e.btn)for(var s=t[i]("layui-m-layerbtn")[0].children,r=s.length,o=0;o<r;o++)l.touch(s[o],a);if(e.shade&&e.shadeClose){var c=t[i]("layui-m-layershade")[0];l.touch(c,function(){layer.close(n.index,e.end)})}e.end&&(l.end[n.index]=e.end)},e.layer={v:"2.0",index:r,open:function(e){var t=new c(e||{});return t.index},close:function(e){var n=a("#"+o[0]+e)[0];n&&(n.innerHTML="",t.body.removeChild(n),clearTimeout(l.timer[e]),delete l.timer[e],"function"==typeof l.end[e]&&l.end[e](),delete l.end[e])},closeAll:function(){for(var e=t[i](o[0]),n=0,a=e.length;n<a;n++)layer.close(0|e[0].getAttribute("index"))}},"function"==typeof define?define(function(){return layer}):function(){var e=document.scripts,n=e[e.length-1],i=n.src,a=i.substring(0,i.lastIndexOf("/")+1);n.getAttribute("merge")||document.head.appendChild(function(){var e=t.createElement("link");return e.href=a+"need/layer.css?2.0",e.type="text/css",e.rel="styleSheet",e.id="layermcss",e}())}()}(window);

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 701 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

@ -5,28 +5,99 @@
<meta name="renderer" content="webkit">
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<title>独立私有化智能在线客服系统</title>
<link rel="stylesheet" type="text/css" href="static/css/bootstrap.min.css?v=0.5.5" />
<style>
body{
display: flex;
align-items: center;
justify-content: center;
line-height: 23px;
}
h1{
border-bottom: 1px solid #eee;
}
h1, h2, h3{
margin: 15px 0px!important;
padding: 15px 0px!important;
}
.main{
max-width: 900px;
width: 100%;
margin-top: 30px;
}
</style>
</head>
<body>
<style>
.deployLink {
width: 800px;
margin: 150px auto;
background-color: #ecf5ff;
padding: 25px;
color: #0061c5;
border: 1px solid #d9ecff;
line-height: 20px;
font-size: 12px;
font-size: 20px;
}
</style>
<div class="deployLink">
<h1>智能在线客服系统,欢迎您</h1>
<a class="btn btn-primary mt-4" href="/chatIndex?kefu_id=kefu2" target="_blank">访客地址</a>
<a class="btn btn-primary mt-4" href="/login" target="_blank">登录后台</a>
</div>
<div class="main">
<h1>开源在线客服系统</h1>
<h3 id="郑重提示">郑重提示</h3>
<p>禁止将本项目用于含病毒、木马、色情、赌博、诈骗、违禁用品、假冒产品、虚假信息、数字货币、金融等违法违规业务</p>
<p>当前项目仅供个人学习测试,禁止一切线上商用行为,禁止一切违法使用!!!</p>
<h3 id="项目简介">项目简介</h3>
<p>Golang语言开源客服系统主要使用了gin + jwt-go + websocket + go.uuid + gorm + cobra + VueJS + ElementUI + MySQL等技术</p>
<h3 id="安装使用">安装使用</h3>
<ul>
<li>先安装和运行mysql数据库 ,版本&gt;=5.5 ,创建数据库</li>
</ul>
<pre><code> create database gofly charset utf8mb4;</code></pre>
<ul>
<li><p>配置数据库链接信息在config目录mysql.json中</p>
<pre><code class="language-php">{
&quot;Server&quot;:&quot;127.0.0.1&quot;,
&quot;Port&quot;:&quot;3306&quot;,
&quot;Database&quot;:&quot;gofly&quot;,
&quot;Username&quot;:&quot;go-fly&quot;,
&quot;Password&quot;:&quot;go-fly&quot;
}</code></pre>
</li>
<li><p>安装配置Golang运行环境请参照下面的命令去执行</p>
<pre><code class="language-php">wget https://studygolang.com/dl/golang/go1.20.2.linux-amd64.tar.gz
tar -C /usr/local -xvf go1.20.2.linux-amd64.tar.gz
mv go1.20.2.linux-amd64.tar.gz /tmp
echo &quot;PATH=\$PATH:/usr/local/go/bin&quot; &gt;&gt; /etc/profile
echo &quot;PATH=\$PATH:/usr/local/go/bin&quot; &gt;&gt; ~/.bashrc
source /etc/profile
go version
go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.cn,direct</code></pre>
</li>
<li><p>下载代码</p>
<p> 在任意目录 git clone <a href="https://github.com/taoshihan1991/go-fly.git">https://github.com/taoshihan1991/go-fly.git</a></p>
<p> 进入go-fly 目录</p>
</li>
<li><p>导入数据库 go run go-fly.go install</p>
</li>
<li><p>源码运行 go run go-fly.go server</p>
</li>
<li><p>源码打包 go build -o kefu 会生成kefu可以执行文件</p>
</li>
<li><p>二进制文件运行</p>
<p> linux: ./kefu server [可选 -p 8082 -d]</p>
<p> windows: kefu.exe server [可选 -p 8082 -d]</p>
</li>
<li><p>关闭程序</p>
<p> killall kefu</p>
</li>
</ul>
<p>程序正常运行后监听端口8081可以直接ip+端口8081访问</p>
<p>也可以配置域名访问反向代理到8081端口就能隐藏端口号</p>
<h3 id="版权声明">版权声明</h3>
<p>当前项目是完整功能代码 , 但是仍然仅支持个人演示测试 , 不包含线上使用 ,禁止一切商用行为。
使用本软件时,请遵守当地法律法规,任何违法用途一切后果请自行承担.</p>
</div>
<script type='text/javascript'>
(function(a, b, c, d) {
let h = b.getElementsByTagName('head')[0];let s = b.createElement('script');
s.type = 'text/javascript';s.src = c+"/static/js/kefu-front.js";s.onload = s.onreadystatechange = function () {
if (!this.readyState || this.readyState === "loaded" || this.readyState === "complete") d(c);
};h.appendChild(s);
})(window, document,"http://127.0.0.1:8081",function(u){
KEFU.init({
KEFU_URL:u,
KEFU_KEFU_ID: "kefu2",
})
});
</script>
</body>
</html>
Loading…
Cancel
Save