修改模板路径增加是否编译模板到二进制的全局变量

pull/29/head
taoshihan1991 4 years ago
parent 06fc5eb013
commit 07d0e75c83

@ -1,157 +0,0 @@
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<faceTitles.length;i++){
faces[faceTitles[i]]="/static/images/face/"+i+".gif";
}
return faces;
}
function replaceContent (content,baseUrl) {// 转义聊天内容中的特殊字符
if(typeof baseUrl=="undefined"){
baseUrl="";
}
var faces=placeFace();
var html = function (end) {
return new RegExp('\\n*\\[' + (end || '') + '(pre|div|span|p|table|thead|th|tbody|tr|td|ul|li|ol|li|dl|dt|dd|h2|h3|h4|h5)([\\s\\S]*?)\\]\\n*', 'g');
};
content = (content || '').replace(/&(?!#?[a-zA-Z0-9]+;)/g, '&amp;')
.replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/'/g, '&#39;').replace(/"/g, '&quot;') // XSS
.replace(/face\[([^\s\[\]]+?)\]/g, function (face) { // 转义表情
var alt = face.replace(/^face/g, '');
return '<img alt="' + alt + '" title="' + alt + '" src="'+baseUrl + faces[alt] + '">';
})
.replace(/img\[([^\s\[\]]+?)\]/g, function (face) { // 转义图片
var src = face.replace(/^img\[/g, '').replace(/\]/g, '');;
return '<img onclick="bigPic(src,true)" src="' +baseUrl+ src + '" style="max-width: 100%"/></div>';
})
.replace(/file\[([^\s\[\]]+?)\]/g, function (face) { // 转义图片
var src = face.replace(/^file\[/g, '').replace(/\]/g, '');;
return '<div class="folderBtn" onclick="window.open(\''+baseUrl+src+'\')" style="font-size:25px;"/></div>';
})
.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 '<a href="'+src+'" target="_blank" />【'+text+'】</a>';
})
.replace(html(), '\<$1 $2\>').replace(html('/'), '\</$1\>') // 转移HTML代码
.replace(/\n/g, '<br>') // 转义换行
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)));
}
;

@ -1,333 +0,0 @@
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.staticfile.org/jquery/3.6.0/jquery.min.js",function () {
_this.dynamicLoadJs("https://cdn.staticfile.org/layer/3.4.0/layer.min.js",function () {
_this.jsCallBack();
});
});
}else{
this.dynamicLoadJs("https://cdn.staticfile.org/layer/3.4.0/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="<div class='launchButtonBox'>" +
'<div id="launchButton" class="launchButton">' +
'<div id="launchIcon" class="launchIcon animateUpDown">1</div> ' +
'<div class="launchButtonText">'+_this.GOFLY_BTN_TEXT+'</div></div>' +
'<div id="launchButtonNotice" class="launchButtonNotice"></div>' +
'</div>';
$('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="<div class='flyUser'><img class='flyAvatar' src='"+_this.GOFLY_URL+_this.kefuAvator+"'/> <span class='flyUsername'>"+_this.kefuName+"</span>" +
"<span id='launchNoticeClose' class='flyClose'>×</span>" +
"</div>";
welcomeHtml+="<div id='launchNoticeContent'>"+replaceContent(msg.data.content,_this.GOFLY_URL)+"</div>";
$("#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="<div class='launchPointer offline'></div>";
}else{
_this.chatPageTitle="<div class='launchPointer'></div>";
setTimeout(function(){
var userInfo="<img style='margin-top: 5px;' class='flyAvatar' src='"+_this.GOFLY_URL+res.result.avatar+"'/> <span class='flyUsername'>"+res.result.username+"</span>"
$('.launchButtonText').html(userInfo);
},3000);
}
_this.kefuAvator=res.result.avatar;
_this.kefuName=res.result.username;
_this.chatPageTitle+="<img src='"+_this.GOFLY_URL+res.result.avatar+"' class='flyAvatar'>"+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="<div class='flyUser'><img class='flyAvatar' src='"+_this.GOFLY_URL+res.result.avatar+"'/> <span class='flyUsername'>"+res.result.username+"</span>" +
"<span id='launchNoticeClose' class='flyClose'>×</span>" +
"</div>";
welcomeHtml+="<div id='launchNoticeContent'>"+replaceContent(content.content,_this.GOFLY_URL)+"</div>";
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的urlno代表不显示滚动条
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;
}
}

@ -1,13 +1,14 @@
package cmd
import (
"embed"
"fmt"
"github.com/gin-contrib/pprof"
"github.com/gin-gonic/gin"
"github.com/spf13/cobra"
"github.com/taoshihan1991/imaptool/common"
"github.com/taoshihan1991/imaptool/middleware"
"github.com/taoshihan1991/imaptool/router"
"github.com/taoshihan1991/imaptool/static"
"github.com/taoshihan1991/imaptool/tools"
"github.com/taoshihan1991/imaptool/ws"
"github.com/zh-five/xdaemon"
@ -31,12 +32,6 @@ var serverCmd = &cobra.Command{
},
}
//go:embed templates/*
var templatesEmbed embed.FS
//go:embed js/*
var jsEmbed embed.FS
func init() {
serverCmd.PersistentFlags().StringVarP(&port, "port", "p", "8081", "监听端口号")
serverCmd.PersistentFlags().BoolVarP(&daemon, "daemon", "d", false, "是否为守护进程模式")
@ -63,10 +58,15 @@ func run() {
tools.Logger().Println("start server...\r\ngohttp://" + baseServer)
engine := gin.Default()
//engine.LoadHTMLGlob("static/html/*")
templ := template.Must(template.New("").ParseFS(templatesEmbed, "templates/*.html"))
engine.SetHTMLTemplate(templ)
engine.StaticFS("/assets", http.FS(jsEmbed))
if common.IsCompireTemplate {
templ := template.Must(template.New("").ParseFS(static.TemplatesEmbed, "templates/*.html"))
engine.SetHTMLTemplate(templ)
engine.StaticFS("/assets", http.FS(static.JsEmbed))
} else {
engine.LoadHTMLGlob("static/templates/*")
engine.Static("/assets", "./static")
}
engine.Static("/static", "./static")
engine.Use(tools.Session("gofly"))
engine.Use(middleware.CrossSite)

@ -1,11 +1,12 @@
package common
var (
PageSize uint = 10
VisitorPageSize uint = 8
Version string = "0.3.9"
VisitorExpire float64 = 600
Upload string = "static/upload/"
Dir string = "config/"
MysqlConf string = Dir + "mysql.json"
PageSize uint = 10
VisitorPageSize uint = 8
Version string = "0.3.9"
VisitorExpire float64 = 600
Upload string = "static/upload/"
Dir string = "config/"
MysqlConf string = Dir + "mysql.json"
IsCompireTemplate bool = true //是否编译静态模板到二进制
)

@ -0,0 +1,9 @@
package static
import "embed"
//go:embed templates/*
var TemplatesEmbed embed.FS
//go:embed js/*
var JsEmbed embed.FS

@ -4,13 +4,13 @@
<meta name="description" content="">
<meta name="author" content="陶士涵">
<title>GO语言开源客服系统-GOFLY</title>
<link rel="stylesheet" href="https://cdn.staticfile.org/element-ui/2.15.1/theme-chalk/index.min.css">
<script src="https://cdn.staticfile.org/vue/2.6.9/vue.min.js"></script>
<script src="https://cdn.staticfile.org/element-ui/2.15.1/index.js"></script>
<script src="https://cdn.staticfile.org/jquery/3.6.0/jquery.min.js"></script>
<link rel="stylesheet" href="/static/css/common.css?v=0.3.8">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/element-ui@2.13.1/lib/theme-chalk/index.css">
<script src="/assets/js/functions.js"></script>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script src="https://cdn.jsdelivr.net/npm/element-ui@2.13.1/lib/index.js"></script>
<script src="https://cdn.jsdelivr.net/npm/jquery/dist/jquery.min.js"></script>
<script src="https://cdn.bootcss.com/reconnecting-websocket/1.0.0/reconnecting-websocket.min.js"></script>
<script src="/assets/js/reconnecting-websocket.min.js"></script>
<style>
html, body {overflow:hidden;height: 100%;padding: 0;margin: 0;background-color: #f5f5f5;}
.el-row{width:100%}

@ -6,11 +6,12 @@
<meta name="description" content="">
<meta name="author" content="陶士涵">
<title>GO语言开源客服系统-GOFLY</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/element-ui@2.13.1/lib/theme-chalk/index.css">
<link rel="stylesheet" href="https://cdn.staticfile.org/element-ui/2.15.1/theme-chalk/index.min.css">
<script src="https://cdn.staticfile.org/vue/2.6.9/vue.min.js"></script>
<script src="https://cdn.staticfile.org/element-ui/2.15.1/index.js"></script>
<script src="https://cdn.staticfile.org/jquery/3.6.0/jquery.min.js"></script>
<link rel="stylesheet" href="/static/css/common.css">
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script src="https://cdn.jsdelivr.net/npm/element-ui@2.13.1/lib/index.js"></script>
<script src="https://cdn.jsdelivr.net/npm/jquery/dist/jquery.min.js"></script>
<style>
html,
body {

@ -5,11 +5,12 @@
<meta name="description" content="">
<meta name="author" content="陶士涵">
<title>GO语言开源客服系统-GOFLY</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/element-ui@2.13.1/lib/theme-chalk/index.css">
<link rel="stylesheet" href="https://cdn.staticfile.org/element-ui/2.15.1/theme-chalk/index.min.css">
<script src="https://cdn.staticfile.org/vue/2.6.9/vue.min.js"></script>
<script src="https://cdn.staticfile.org/element-ui/2.15.1/index.js"></script>
<script src="https://cdn.staticfile.org/jquery/3.6.0/jquery.min.js"></script>
<link rel="stylesheet" href="/static/css/common.css">
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script src="https://cdn.jsdelivr.net/npm/element-ui@2.13.1/lib/index.js"></script>
<script src="https://cdn.jsdelivr.net/npm/jquery/dist/jquery.min.js"></script>
<script src="/assets/js/functions.js"></script>
<style>
html,
Loading…
Cancel
Save