实现访客上传附件

pull/23/head
陶士涵 4 years ago
parent 4733c8133e
commit add0f5b92c

@ -110,6 +110,7 @@ INSERT INTO `config` (`id`, `conf_name`, `conf_key`, `conf_value`) VALUES (NULL,
INSERT INTO `config` (`id`, `conf_name`, `conf_key`, `conf_value`) VALUES (NULL, 'Server酱API', 'ServerJiangAPI', '')|
INSERT INTO `config` (`id`, `conf_name`, `conf_key`, `conf_value`) VALUES (NULL, '微信小程序Token', 'WeixinToken', '')|
INSERT INTO `config` (`id`, `conf_name`, `conf_key`, `conf_value`) VALUES (NULL, '当前小程序审核状态', 'MiniAppAudit', 'yes')|
INSERT INTO `config` (`id`, `conf_name`, `conf_key`, `conf_value`) VALUES (NULL, '是否允许上传附件', 'SendAttachment', 'ture')|
DROP TABLE IF EXISTS `about`|
CREATE TABLE `about` (

@ -55,3 +55,12 @@ func GetIpblacks(c *gin.Context) {
},
})
}
func GetIpblacksByKefuId(c *gin.Context) {
kefuId, _ := c.Get("kefu_name")
list := models.FindIpsByKefuId(kefuId.(string))
c.JSON(200, gin.H{
"code": 200,
"msg": "ok",
"result": list,
})
}

@ -11,6 +11,7 @@ import (
"github.com/taoshihan1991/imaptool/ws"
"os"
"path"
"strconv"
"strings"
"time"
)
@ -322,7 +323,51 @@ func UploadImg(c *gin.Context) {
})
}
}
func UploadFile(c *gin.Context) {
SendAttachment, err := strconv.ParseBool(models.FindConfig("SendAttachment"))
if !SendAttachment || err != nil {
c.JSON(200, gin.H{
"code": 400,
"msg": "禁止上传附件!",
})
return
}
config := config.CreateConfig()
f, err := c.FormFile("realfile")
if err != nil {
c.JSON(200, gin.H{
"code": 400,
"msg": "上传失败!",
})
return
} else {
fileExt := strings.ToLower(path.Ext(f.Filename))
if f.Size >= 90*1024*1024 {
c.JSON(200, gin.H{
"code": 400,
"msg": "上传失败!不允许超过90M",
})
return
}
fileName := tools.Md5(fmt.Sprintf("%s%s", f.Filename, time.Now().String()))
fildDir := fmt.Sprintf("%s%d%s/", config.Upload, time.Now().Year(), time.Now().Month().String())
isExist, _ := tools.IsFileExist(fildDir)
if !isExist {
os.Mkdir(fildDir, os.ModePerm)
}
filepath := fmt.Sprintf("%s%s%s", fildDir, fileName, fileExt)
c.SaveUploadedFile(f, filepath)
c.JSON(200, gin.H{
"code": 200,
"msg": "上传成功!",
"result": gin.H{
"path": filepath,
},
})
}
}
func GetMessagesV2(c *gin.Context) {
visitorId := c.Query("visitor_id")
messages := models.FindMessageByVisitorId(visitorId)

@ -26,6 +26,11 @@ func FindIp(ip string) Ipblack {
DB.Where("ip = ?", ip).First(&ipblack)
return ipblack
}
func FindIpsByKefuId(id string) []Ipblack {
var ipblack []Ipblack
DB.Where("kefu_id = ?", id).Find(&ipblack)
return ipblack
}
func FindIps(query interface{}, args []interface{}, page uint, pagesize uint) []Ipblack {
offset := (page - 1) * pagesize
if offset < 0 {

@ -38,6 +38,8 @@ func InitApiRouter(engine *gin.Engine) {
engine.GET("/message_close", controller.SendCloseMessage)
//上传文件
engine.POST("/uploadimg", middleware.Ipblack, controller.UploadImg)
//上传文件
engine.POST("/uploadfile", middleware.Ipblack, controller.UploadFile)
//获取未读消息数
engine.GET("/message_status", controller.GetVisitorMessage)
//设置消息已读
@ -78,6 +80,7 @@ func InitApiRouter(engine *gin.Engine) {
engine.POST("/ipblack", middleware.JwtApiMiddleware, controller.PostIpblack)
engine.DELETE("/ipblack", middleware.JwtApiMiddleware, middleware.RbacAuth, controller.DelIpblack)
engine.GET("/ipblacks_all", middleware.JwtApiMiddleware, controller.GetIpblacks)
engine.GET("/ipblacks", middleware.JwtApiMiddleware, controller.GetIpblacksByKefuId)
engine.GET("/configs", middleware.JwtApiMiddleware, middleware.RbacAuth, controller.GetConfigs)
engine.POST("/config", middleware.JwtApiMiddleware, middleware.RbacAuth, controller.PostConfig)
engine.GET("/config", controller.GetConfig)

@ -130,6 +130,37 @@
top: 5px;
right: 5px
}
.visitorFolderBtn{
float: left;
margin-left: 20px;
}
.folderBtn {
display: inline-block;
background-color: transparent;
overflow: hidden;
font-size: 1px;
}
.folderBtn:before {
content: '';
float: left;
background-color: #9da0a0;
width: 1.5em;
height: 0.45em;
margin-left: 0.07em;
margin-bottom: -0.07em;
border-top-left-radius: 0.1em;
border-top-right-radius: 0.1em;
box-shadow: 1.25em 0.25em 0 0em #9da0a0;
}
.folderBtn:after {
content: '';
float: left;
clear: left;
background-color: #d4d6d6;
width: 2.5em;
height: 1.8em;
border-radius: 0.1em;
}
.visitorImageBtn{
float: left;
margin-left: 20px;

@ -187,10 +187,12 @@
</el-menu>
</el-tab-pane>
<el-tab-pane label="黑名单" name="blackList">
<el-row v-for="item in visitors" :key="item.uid" class="">
<div style="cursor:pointer" class="onlineUsers imgGray">
待开发
<el-row v-for="item in ipBlacks" :key="item.id" class="">
<el-tooltip content="点击删除黑名单" placement="left">
<div v-on:click="delIpblack(item.ip)" style="cursor:pointer" class="onlineUsers imgGray">
<{item.ip}>
</div>
</el-tooltip>
</el-row>
</el-tab-pane>
</el-tabs>
@ -285,5 +287,5 @@
</template>
</div>
</body>
<script src="/static/js/chat-main.js?v=0.3.7"></script>
<script src="/static/js/chat-main.js?v=0.3.8"></script>
</html>

@ -13,7 +13,7 @@
<!-- Bootstrap core CSS -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.4.1/dist/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous">
<link rel="stylesheet" href="/static/css/front.css?v=0.2.3" />
<link rel="stylesheet" href="/static/css/common.css?v=0.2.3" />
<link rel="stylesheet" href="/static/css/common.css?v=0.2.4" />
</head>
<body>
<div id="app" class="chatCenter">
@ -47,6 +47,7 @@
<div class="iconBtns">
<div class="faceBtn visitorFaceBtn"></div>
<div class="imageBtn visitorImageBtn" id="uploadImg" v-on:click="uploadImg('/uploadimg')"></div>
<div class="folderBtn visitorFolderBtn" id="uploadFile" v-on:click="uploadFile('/uploadfile')"></div>
<div class="clear"></div>
</div>
<el-input type="textarea" class="chatArea" v-model="messageContent" v-on:keyup.enter.native="chatToUser"></el-input>
@ -78,5 +79,5 @@
var KEFU_ID='{{.KEFU_ID}}';
var REFER='{{.Refer}}';
</script>
<script src="/static/js/chat-page.js?v=0.3.6"></script>
<script src="/static/js/chat-page.js?v=0.3.7"></script>
</html>

@ -43,7 +43,7 @@ var app=new Vue({
groupId:"",
replys:[],
replyContent:"",
ipBlacks:[],
},
methods: {
//跳转
@ -659,6 +659,22 @@ var app=new Vue({
_this.getReplys();
});
},
//获取黑名单
getIpblacks(){
var _this=this;
this.sendAjax("/ipblacks","get",{},function(result){
_this.ipBlacks=result;
});
},
//删除黑名单
delIpblack(ip){
let _this=this;
this.sendAjax("/ipblack?ip="+ip,"DELETE",{ip:ip},function(result){
_this.sendAjax("/ipblacks","get",{},function(result){
_this.ipBlacks=result;
});
});
},
sendAjax(url,method,params,callback){
let _this=this;
$.ajax({
@ -702,6 +718,7 @@ var app=new Vue({
this.getKefuInfo();
this.getOnlineVisitors();
this.getReplys();
this.getIpblacks();
//心跳
this.ping();
}

@ -344,6 +344,42 @@ new Vue({
});
});
},
//上传文件
uploadFile (url){
let _this=this;
$('#uploadFile').after('<input type="file" id="uploadRealFile" name="file2" style="display:none" >');
$("#uploadRealFile").click();
$("#uploadRealFile").change(function (e) {
var formData = new FormData();
var file = $("#uploadRealFile")[0].files[0];
formData.append("realfile",file); //传给后台的file的key值是可以自己定义的
console.log(formData);
$.ajax({
url: url || '',
type: "post",
data: formData,
contentType: false,
processData: false,
dataType: 'JSON',
mimeType: "multipart/form-data",
success: function (res) {
if(res.code!=200){
_this.$message({
message: res.msg,
type: 'error'
});
}else{
_this.messageContent+='file[/' + res.result.path + ']';
_this.chatToUser();
}
},
error: function (data) {
console.log(data);
}
});
});
},
//粘贴上传图片
onPasteUpload(event){
let items = event.clipboardData && event.clipboardData.items;

@ -77,6 +77,10 @@ function replaceContent (content) {// 转义聊天内容中的特殊字符
var src = face.replace(/^img\[/g, '').replace(/\]/g, '');;
return '<img onclick="bigPic(src,true)" src="' + 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(\''+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, '');

Loading…
Cancel
Save