diff --git a/static/js/functions.js b/static/js/functions.js
new file mode 100644
index 0000000..1ac71f9
--- /dev/null
+++ b/static/js/functions.js
@@ -0,0 +1,157 @@
+function getBaseUrl() {
+ var ishttps = 'https:' == document.location.protocol ? true : false;
+ var url = window.location.host;
+ if (ishttps) {
+ url = 'https://' + url;
+ } else {
+ url = 'http://' + url;
+ }
+ return url;
+}
+function getWsBaseUrl() {
+ var ishttps = 'https:' == document.location.protocol ? true : false;
+ var url = window.location.host;
+ if (ishttps) {
+ url = 'wss://' + url;
+ } else {
+ url = 'ws://' + url;
+ }
+ return url;
+}
+function notify(title, options, callback) {
+ // 先检查浏览器是否支持
+ if (!window.Notification) {
+ return;
+ }
+ var notification;
+ // 检查用户曾经是否同意接受通知
+ if (Notification.permission === 'granted') {
+ notification = new Notification(title, options); // 显示通知
+
+ } else {
+ var promise = Notification.requestPermission();
+ }
+
+ if (notification && callback) {
+ notification.onclick = function(event) {
+ callback(notification, event);
+ }
+ setTimeout(function () {
+ notification.close();
+ },5000);
+ }
+}
+var titleTimer=0;
+var titleNum=0;
+var originTitle = document.title;
+function flashTitle() {
+ if(titleTimer!=0){
+ return;
+ }
+ titleTimer = setInterval(function(){
+ titleNum++;
+ if (titleNum == 3) {
+ titleNum = 1;
+ }
+ if (titleNum == 1) {
+ document.title = '【】' + originTitle;
+ }
+ if (titleNum == 2) {
+ document.title = '【new message】' + originTitle;
+ }
+ }, 500);
+
+}
+function clearFlashTitle() {
+ clearInterval(titleTimer);
+ document.title = originTitle;
+}
+var faceTitles = ["[微笑]", "[嘻嘻]", "[哈哈]", "[可爱]", "[可怜]", "[挖鼻]", "[吃惊]", "[害羞]", "[挤眼]", "[闭嘴]", "[鄙视]", "[爱你]", "[泪]", "[偷笑]", "[亲亲]", "[生病]", "[太开心]", "[白眼]", "[右哼哼]", "[左哼哼]", "[嘘]", "[衰]", "[委屈]", "[吐]", "[哈欠]", "[抱抱]", "[怒]", "[疑问]", "[馋嘴]", "[拜拜]", "[思考]", "[汗]", "[困]", "[睡]", "[钱]", "[失望]", "[酷]", "[色]", "[哼]", "[鼓掌]", "[晕]", "[悲伤]", "[抓狂]", "[黑线]", "[阴险]", "[怒骂]", "[互粉]", "[心]", "[伤心]", "[猪头]", "[熊猫]", "[兔子]", "[ok]", "[耶]", "[good]", "[NO]", "[赞]", "[来]", "[弱]", "[草泥马]", "[神马]", "[囧]", "[浮云]", "[给力]", "[围观]", "[威武]", "[奥特曼]", "[礼物]", "[钟]", "[话筒]", "[蜡烛]", "[蛋糕]"];
+function placeFace() {
+ var faces=[];
+ for(var i=0;i/g, '>').replace(/'/g, ''').replace(/"/g, '"') // XSS
+ .replace(/face\[([^\s\[\]]+?)\]/g, function (face) { // 转义表情
+ var alt = face.replace(/^face/g, '');
+ return '
';
+ })
+ .replace(/img\[([^\s\[\]]+?)\]/g, function (face) { // 转义图片
+ var src = face.replace(/^img\[/g, '').replace(/\]/g, '');;
+ return '
';
+ })
+ .replace(/file\[([^\s\[\]]+?)\]/g, function (face) { // 转义图片
+ var src = face.replace(/^file\[/g, '').replace(/\]/g, '');;
+ return '
';
+ })
+ .replace(/\[([^\s\[\]]+?)\]+link\[([^\s\[\]]+?)\]/g, function (face) { // 转义超链接
+ var text = face.replace(/link\[.*?\]/g, '').replace(/\[|\]/g, '');
+ var src = face.replace(/^\[([^\s\[\]]+?)\]+link\[/g, '').replace(/\]/g, '');
+ return '【'+text+'】';
+ })
+ .replace(html(), '\<$1 $2\>').replace(html('/'), '\$1\>') // 转移HTML代码
+ .replace(/\n/g, '
') // 转义换行
+
+ return content;
+}
+function bigPic(src,isVisitor){
+ if (isVisitor) {
+ window.open(src);
+ return;
+ }
+}
+function filter (obj){
+ var imgType = ["image/jpeg","image/png","image/jpg","image/gif"];
+ var filetypes = imgType;
+ var isnext = false;
+ for (var i = 0; i < filetypes.length; i++) {
+ if (filetypes[i] == obj.type) {
+ return true;
+ }
+ }
+ return false;
+}
+function sleep(time) {
+ var startTime = new Date().getTime() + parseInt(time, 10);
+ while(new Date().getTime() < startTime) {}
+}
+function checkLang(){
+ var langs=["cn","en"];
+ var lang=getQuery("lang");
+ if(lang!=""&&langs.indexOf(lang) > 0 ){
+ return lang;
+ }
+ return "cn";
+}
+function getQuery(key) {
+ var query = window.location.search.substring(1);
+ var key_values = query.split("&");
+ var params = {};
+ key_values.map(function (key_val){
+ var key_val_arr = key_val.split("=");
+ params[key_val_arr[0]] = key_val_arr[1];
+ });
+ if(typeof params[key]!="undefined"){
+ return params[key];
+ }
+ return "";
+}
+function utf8ToB64(str) {
+ return window.btoa(unescape(encodeURIComponent(str)));
+}
+function b64ToUtf8(str) {
+ return decodeURIComponent(escape(window.atob(str)));
+}
+;
\ No newline at end of file
diff --git a/static/js/gofly-front.js b/static/js/gofly-front.js
new file mode 100644
index 0000000..632503d
--- /dev/null
+++ b/static/js/gofly-front.js
@@ -0,0 +1,333 @@
+var GOFLY={
+ GOFLY_URL:"https://gofly.sopans.com",
+ GOFLY_KEFU_ID:"",
+ GOFLY_BTN_TEXT:"Chat with me",
+ GOFLY_LANG:"en",
+ GOFLY_EXTRA: {},
+ GOFLY_AUTO_OPEN:true,
+ GOFLY_AUTO_SHOW:false,
+ GOFLY_WITHOUT_BTN:false,
+};
+GOFLY.launchButtonFlag=false;
+GOFLY.titleTimer=0;
+GOFLY.titleNum=0;
+GOFLY.noticeTimer=null;
+GOFLY.originTitle=document.title;
+GOFLY.chatPageTitle="GOFLY";
+GOFLY.kefuName="";
+GOFLY.kefuAvator="";
+GOFLY.init=function(config){
+ var _this=this;
+ if(typeof config=="undefined"){
+ return;
+ }
+
+ if (typeof config.GOFLY_URL!="undefined"){
+ this.GOFLY_URL=config.GOFLY_URL.replace(/([\w\W]+)\/$/,"$1");
+ }
+ this.dynamicLoadCss(this.GOFLY_URL+"/static/css/gofly-front.css?v=1");
+
+ if (typeof config.GOFLY_KEFU_ID!="undefined"){
+ this.GOFLY_KEFU_ID=config.GOFLY_KEFU_ID;
+ }
+ if (typeof config.GOFLY_BTN_TEXT!="undefined"){
+ this.GOFLY_BTN_TEXT=config.GOFLY_BTN_TEXT;
+ }
+ if (typeof config.GOFLY_EXTRA!="undefined"){
+ this.GOFLY_EXTRA=config.GOFLY_EXTRA;
+ }
+ if (typeof config.GOFLY_AUTO_OPEN!="undefined"){
+ this.GOFLY_AUTO_OPEN=config.GOFLY_AUTO_OPEN;
+ }
+ if (typeof config.GOFLY_AUTO_SHOW!="undefined"){
+ this.GOFLY_AUTO_SHOW=config.GOFLY_AUTO_SHOW;
+ }
+ if (typeof config.GOFLY_WITHOUT_BTN!="undefined"){
+ this.GOFLY_WITHOUT_BTN=config.GOFLY_WITHOUT_BTN;
+ }
+ var refer=document.referrer?document.referrer:"无";
+ this.GOFLY_EXTRA.refer=refer;
+ this.GOFLY_EXTRA.host=document.location.href;
+ this.GOFLY_EXTRA=JSON.stringify(_this.GOFLY_EXTRA);
+
+ this.dynamicLoadJs(this.GOFLY_URL+"/assets/js/functions.js?v=1",function(){
+ if (typeof config.GOFLY_LANG!="undefined"){
+ _this.GOFLY_LANG=config.GOFLY_LANG;
+ }else{
+ _this.GOFLY_LANG=checkLang();
+ }
+ _this.GOFLY_EXTRA=utf8ToB64(_this.GOFLY_EXTRA);
+ });
+ if (typeof $!="function"){
+ this.dynamicLoadJs("https://cdn.jsdelivr.net/npm/jquery/dist/jquery.min.js",function () {
+ _this.dynamicLoadJs("https://cdn.bootcdn.net/ajax/libs/layer/3.1.1/layer.min.js",function () {
+ _this.jsCallBack();
+ });
+ });
+ }else{
+ this.dynamicLoadJs("https://cdn.bootcdn.net/ajax/libs/layer/3.1.1/layer.min.js",function () {
+ _this.jsCallBack();
+ });
+ }
+ _this.addEventlisten();
+}
+GOFLY.jsCallBack=function(){
+ this.showKefuBtn();
+ this.addClickEvent();
+ this.getNotice();
+}
+GOFLY.showKefuBtn=function(){
+ var _this=this;
+ if(_this.GOFLY_WITHOUT_BTN){
+ return;
+ }
+ var html="';
+ $('body').append(html);
+}
+GOFLY.addClickEvent=function(){
+ var _this=this;
+ $(".launchButton").on("click",function() {
+ _this.GOFLY_AUTO_SHOW=true;
+ _this.showKefu();
+ $("#launchIcon").text(0).hide();
+ });
+
+ $("body").on("click","#launchNoticeClose",function() {
+ $("#launchButtonNotice").hide();
+ });
+
+ $("body").click(function () {
+ clearTimeout(_this.titleTimer);
+ document.title = _this.originTitle;
+ });
+}
+GOFLY.addEventlisten=function(){
+ var _this=this;
+ window.addEventListener('message',function(e){
+ var msg=e.data;
+ if(msg.type=="message"){
+ clearInterval(_this.noticeTimer);
+ var width=$(window).width();
+ if(width>768){
+ _this.flashTitle();//标题闪烁
+ }
+ if (this.launchButtonFlag) return;
+ var welcomeHtml="
"+_this.kefuName+"" +
+ "
×" +
+ "
";
+ welcomeHtml+=""+replaceContent(msg.data.content,_this.GOFLY_URL)+"
";
+ $("#launchButtonNotice").html(welcomeHtml).show();
+ var news=$("#launchIcon").text();
+ $("#launchIcon").text(++news).show();
+ }
+ if(msg.type=="focus"){
+ clearTimeout(_this.titleTimer);
+ _this.titleTimer=0;
+ document.title = _this.originTitle;
+ }
+ });
+ window.onfocus = function () {
+ clearTimeout(_this.titleTimer);
+ _this.titleTimer=0;
+ document.title = _this.originTitle;
+ };
+}
+GOFLY.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);
+}
+GOFLY.dynamicLoadJs=function(url, callback){
+ var head = document.getElementsByTagName('head')[0];
+ var script = document.createElement('script');
+ script.type = 'text/javascript';
+ script.src = url;
+ 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);
+}
+
+GOFLY.getNotice=function(){
+ var _this=this;
+ $.get(this.GOFLY_URL+"/notice?kefu_id="+this.GOFLY_KEFU_ID,function(res) {
+ if(res.result.status=='offline'){
+ _this.chatPageTitle="";
+ }else{
+ _this.chatPageTitle="";
+ setTimeout(function(){
+ var userInfo="
"+res.result.username+""
+ $('.launchButtonText').html(userInfo);
+ },3000);
+ }
+ _this.kefuAvator=res.result.avatar;
+ _this.kefuName=res.result.username;
+ _this.chatPageTitle+="
"+res.result.username;
+ if(_this.GOFLY_AUTO_OPEN&&_this.isIE()<=0){
+ _this.showKefu();
+ $(".launchButtonBox").show();
+ _this.launchButtonFlag=false;
+ }
+ if (res.result.welcome != null) {
+ var msg = res.result.welcome;
+ var len=msg.length;
+ var i=0;
+ if(len>0){
+
+ _this.noticeTimer=setInterval(function(){
+ if(i>=len||typeof msg[i]=="undefined"||msg[i]==null){
+ clearInterval(_this.noticeTimer);
+ return;
+ }
+ var content = msg[i];
+ if(typeof content.content =="undefined"){
+ return;
+ }
+ var welcomeHtml="
"+res.result.username+"" +
+ "
×" +
+ "
";
+ welcomeHtml+=""+replaceContent(content.content,_this.GOFLY_URL)+"
";
+
+ var obj=$("#launchButtonNotice");
+ if(obj[0]){
+ obj[0].innerHTML=welcomeHtml;
+ obj.show();
+ }
+ i++;
+ $("#launchIcon").text(i).show();
+ },4000);
+ }
+
+ }
+ });
+}
+GOFLY.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浏览器
+ }
+}
+GOFLY.showPanel=function (){
+ var width=$(window).width();
+ this.GOFLY_AUTO_SHOW=true;
+ if(this.isIE()>0){
+ this.windowOpen();
+ return;
+ }
+ if(width<768){
+ this.layerOpen("100%","100%");
+ return;
+ }
+ this.layerOpen("400px","530px");
+ this.launchButtonFlag=true;
+}
+GOFLY.showKefu=function (){
+ if (this.launchButtonFlag) return;
+ var width=$(window).width();
+ if(this.isIE()>0){
+ this.windowOpen();
+ return;
+ }
+ if(width<768){
+ this.layerOpen("100%","100%");
+ return;
+ }
+ this.layerOpen("400px","530px");
+ this.launchButtonFlag=true;
+ $(".launchButtonBox").hide();
+}
+GOFLY.layerOpen=function (width,height){
+ if (this.launchButtonFlag) return;
+ var layBox=$("#layui-layer19911116");
+ if(layBox.css("display")=="none"){
+ layBox.show();
+ return;
+ }
+ var _this=this;
+ layer.index="19911115";
+ layer.open({
+ type: 2,
+ title: this.chatPageTitle,
+ closeBtn: 1, //不显示关闭按钮
+ shade: 0,
+ area: [width, height],
+ offset: 'rb', //右下角弹出
+ anim: 2,
+ content: [this.GOFLY_URL+'/chatIndex?kefu_id='+this.GOFLY_KEFU_ID+'&lang='+this.GOFLY_LANG+'&refer='+window.document.title+'&extra='+this.GOFLY_EXTRA , 'yes'], //iframe的url,no代表不显示滚动条
+ success:function(){
+ var layBox=$("#layui-layer19911116");
+ if(_this.GOFLY_AUTO_SHOW&&layBox.css("display")=="none"){
+ _this.launchButtonFlag=true;
+ layBox.show();
+ }
+ },
+ end: function(){
+ _this.launchButtonFlag=false;
+ $(".launchButtonBox").show();
+ },
+ cancel: function(index, layero){
+ $("#layui-layer19911116").hide();
+ _this.launchButtonFlag=false;
+ $(".launchButtonBox").show();
+ return false;
+ }
+ });
+}
+GOFLY.windowOpen=function (){
+ window.open(this.GOFLY_URL+'/chatIndex?kefu_id='+this.GOFLY_KEFU_ID+'&lang='+this.GOFLY_LANG+'&refer='+window.document.title+'&extra='+this.GOFLY_EXTRA);
+}
+GOFLY.flashTitle=function () {
+ if(this.titleTimer!=0){
+ return;
+ }
+ this.titleTimer = setInterval("GOFLY.flashTitleFunc()", 500);
+}
+GOFLY.flashTitleFunc=function(){
+ this.titleNum++;
+ if (this.titleNum >=3) {
+ this.titleNum = 1;
+ }
+ if (this.titleNum == 1) {
+ document.title = '【】' + this.originTitle;
+ }
+ if (this.titleNum == 2) {
+ document.title = '【new message】' + this.originTitle;
+ }
+}
+
+