mirror of
https://github.com/chatopera/cosin.git
synced 2025-08-01 16:38:02 +08:00
Merge branch 'develop' of github.com:chatopera/cosin into develop
This commit is contained in:
commit
c3f7e46eed
@ -384,7 +384,7 @@
|
|||||||
<email>hailiang.hl.wang@gmail.com</email>
|
<email>hailiang.hl.wang@gmail.com</email>
|
||||||
<url>https://github.com/Samurais</url>
|
<url>https://github.com/Samurais</url>
|
||||||
<organization>Chatopera Inc.</organization>
|
<organization>Chatopera Inc.</organization>
|
||||||
<organizationUrl>http://www.chatopera.com</organizationUrl>
|
<organizationUrl>https://www.chatopera.com</organizationUrl>
|
||||||
<roles>
|
<roles>
|
||||||
<role>architect</role>
|
<role>architect</role>
|
||||||
<role>developer</role>
|
<role>developer</role>
|
||||||
|
@ -0,0 +1,70 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2018 Chatopera Inc, <https://www.chatopera.com>
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.chatopera.cc.app.handler.apps.chatbot;
|
||||||
|
|
||||||
|
import com.chatopera.cc.app.handler.Handler;
|
||||||
|
import com.chatopera.cc.app.model.Chatbot;
|
||||||
|
import com.chatopera.cc.app.model.SNSAccount;
|
||||||
|
import com.chatopera.cc.app.model.User;
|
||||||
|
import com.chatopera.cc.app.persistence.repository.ChatbotRepository;
|
||||||
|
import com.chatopera.cc.app.persistence.repository.SNSAccountRepository;
|
||||||
|
import com.chatopera.cc.util.Menu;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.stereotype.Controller;
|
||||||
|
import org.springframework.ui.ModelMap;
|
||||||
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
|
import org.springframework.web.servlet.ModelAndView;
|
||||||
|
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import javax.validation.Valid;
|
||||||
|
|
||||||
|
@Controller
|
||||||
|
@RequestMapping(value = "/apps/chatbot")
|
||||||
|
public class ChatbotController extends Handler {
|
||||||
|
@Autowired
|
||||||
|
private ChatbotRepository chatbotRes;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private SNSAccountRepository snsAccountRes;
|
||||||
|
|
||||||
|
@RequestMapping(value = "/index")
|
||||||
|
@Menu(type = "chatbot", subtype = "index", access = true)
|
||||||
|
public ModelAndView index(ModelMap map, HttpServletRequest request) {
|
||||||
|
|
||||||
|
return request(super.createAppsTempletResponse("/apps/chatbot/index"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@RequestMapping(value = "/edit")
|
||||||
|
@Menu(type = "chatbot", subtype = "index", access = true)
|
||||||
|
public ModelAndView eidt(ModelMap map, HttpServletRequest request, @Valid String id) {
|
||||||
|
User curruser = super.getUser(request);
|
||||||
|
|
||||||
|
ModelAndView view = request(super.createAppsTempletResponse("/apps/chatbot/edit"));
|
||||||
|
if (id != null) {
|
||||||
|
Chatbot c = chatbotRes.findOne(id);
|
||||||
|
SNSAccount snsAccount = snsAccountRes.findBySnsidAndOrgi(c.getSnsAccountIdentifier(), curruser.getOrgi());
|
||||||
|
view.addObject("snsurl", snsAccount.getBaseURL());
|
||||||
|
view.addObject("bot", c);
|
||||||
|
}
|
||||||
|
|
||||||
|
view.addObject("id", id);
|
||||||
|
|
||||||
|
return view;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -38,7 +38,7 @@ public class TestController extends Handler {
|
|||||||
for(int i=0 ; i<500; i++){
|
for(int i=0 ; i<500; i++){
|
||||||
String user = MainUtils.getUUID();
|
String user = MainUtils.getUUID();
|
||||||
try {
|
try {
|
||||||
OnlineUserUtils.newRequestMessage(user, "ukewo", "user", "system", "localhost" , "win10", "test" , MainContext.ChannelTypeEnum.WEBIM.toString() , null , null , "admin" , "标题" , "http://www.ukewo.cn" , "12434" , MainContext.ChatInitiatorType.USER.toString()) ;
|
OnlineUserUtils.newRequestMessage(user, "ukewo", "user", "system", "localhost" , "win10", "test" , MainContext.ChannelTypeEnum.WEBIM.toString() , null , null , "admin" , "标题" , "https://www.chatopera.com" , "12434" , MainContext.ChatInitiatorType.USER.toString()) ;
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
@ -32,7 +32,7 @@
|
|||||||
<div class="layui-form-item">
|
<div class="layui-form-item">
|
||||||
<label class="layui-form-label">欢迎提示语:</label>
|
<label class="layui-form-label">欢迎提示语:</label>
|
||||||
<div class="layui-input-inline">
|
<div class="layui-input-inline">
|
||||||
<textarea id="welcomemsg" style="width:450px;" name="welcomemsg" class="layui-textarea">${extention.welcomemsg!"您好,欢迎致电优客服智能IVR演示系统,这里是电话机器人演示系统,请说要进入的测试流程,比如,客服系统!"}</textarea>
|
<textarea id="welcomemsg" style="width:450px;" name="welcomemsg" class="layui-textarea">${extention.welcomemsg!"您好,欢迎致电春松客服智能IVR演示系统,这里是电话机器人演示系统,请说要进入的测试流程,比如,客服系统!"}</textarea>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
<div class="box-item">
|
<div class="box-item">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-lg-8">
|
<div class="col-lg-8">
|
||||||
<p>优客服系统界面颜色风格</p>
|
<p>春松客服系统界面颜色风格</p>
|
||||||
<p style="color:#888888;font-size:13px;margin-top:10px;">默认的配色是绿色,选择颜色可以在右侧预览风格,点击保存即可生效</p>
|
<p style="color:#888888;font-size:13px;margin-top:10px;">默认的配色是绿色,选择颜色可以在右侧预览风格,点击保存即可生效</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-lg-4">
|
<div class="col-lg-4">
|
||||||
@ -165,7 +165,8 @@
|
|||||||
<#if entim?? && entim == true>
|
<#if entim?? && entim == true>
|
||||||
<a href="/admin/config/stopentim.html" data-toggle="tip" title="请确认是否关闭EntIM功能?" class="layui-btn layui-btn-small layui-btn-danger">关闭EntIM功能</a>
|
<a href="/admin/config/stopentim.html" data-toggle="tip" title="请确认是否关闭EntIM功能?" class="layui-btn layui-btn-small layui-btn-danger">关闭EntIM功能</a>
|
||||||
<#else>
|
<#else>
|
||||||
<a href="/admin/config/startentim.html" data-toggle="tip" title="启用EntIM功能" class="layui-btn layui-btn-small">启用EntIM功能</a>
|
<!-- <a href="/admin/config/startentim.html" data-toggle="tip" title="启用EntIM功能" class="layui-btn layui-btn-small">启用EntIM功能</a> -->
|
||||||
|
<a href="" data-toggle="tip" title="启用EntIM功能" class="layui-btn layui-btn-small">启用EntIM功能</a>
|
||||||
</#if>
|
</#if>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -178,7 +179,7 @@
|
|||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-lg-8">
|
<div class="col-lg-8">
|
||||||
<p>启用权限数据采集功能后,会进入数据采集模式,当前状态:<#if infoace?? && infoace == true><small class="ukefu-label theme4">已启用</small><#else><small class="ukefu-label theme4" style="background-color:#FF5722;">已关闭</small></#if></p>
|
<p>启用权限数据采集功能后,会进入数据采集模式,当前状态:<#if infoace?? && infoace == true><small class="ukefu-label theme4">已启用</small><#else><small class="ukefu-label theme4" style="background-color:#FF5722;">已关闭</small></#if></p>
|
||||||
<p style="color:#888888;font-size:13px;margin-top:10px;">启用后,在优客服界面上的任何链接点击操作都会触发数据收集功能</p>
|
<p style="color:#888888;font-size:13px;margin-top:10px;">启用后,在春松客服界面上的任何链接点击操作都会触发数据收集功能</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-lg-4">
|
<div class="col-lg-4">
|
||||||
<#if infoace?? && infoace == true>
|
<#if infoace?? && infoace == true>
|
||||||
@ -192,7 +193,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="ukefu-webim-prop">
|
<div class="ukefu-webim-prop">
|
||||||
<div class="ukefu-webim-tl" style="clear:both;">10、停止优客服系统</div>
|
<div class="ukefu-webim-tl" style="clear:both;">10、停止春松客服系统</div>
|
||||||
<div class="box-item">
|
<div class="box-item">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-lg-8">
|
<div class="col-lg-8">
|
||||||
|
@ -50,7 +50,7 @@
|
|||||||
<p style="color:#888888;font-size:13px;margin-top:10px;">默认显示信息 企业名称</p>
|
<p style="color:#888888;font-size:13px;margin-top:10px;">默认显示信息 企业名称</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-lg-4">
|
<div class="col-lg-4">
|
||||||
<input type="text" name="dialog_name" value="${inviteData.dialog_name!'优客服'}" autocomplete="off" class="layui-input" oninput="$('#dialog_name').text($(this).val())" onchange="$('#dialog_name').text($(this).val())">
|
<input type="text" name="dialog_name" value="${inviteData.dialog_name!'春松客服'}" autocomplete="off" class="layui-input" oninput="$('#dialog_name').text($(this).val())" onchange="$('#dialog_name').text($(this).val())">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -205,7 +205,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="col-lg-4">
|
<div class="col-lg-4">
|
||||||
<div class="layui-input-block">
|
<div class="layui-input-block">
|
||||||
<input type="text" name="consult_skill_title" value="${inviteData.consult_skill_title!'优客服'}" autocomplete="off" class="layui-input">
|
<input type="text" name="consult_skill_title" value="${inviteData.consult_skill_title!'春松客服'}" autocomplete="off" class="layui-input">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -472,7 +472,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="col-lg-4">
|
<div class="col-lg-4">
|
||||||
<div class="layui-input-block">
|
<div class="layui-input-block">
|
||||||
<input type="text" name="aisuccesstip" maxlength="100" value="${inviteData.aisuccesstip!'欢迎使用优客服小E,我来帮您解答问题'}" autocomplete="off" class="layui-input">
|
<input type="text" name="aisuccesstip" maxlength="100" value="${inviteData.aisuccesstip!'欢迎使用春松客服小E,我来帮您解答问题'}" autocomplete="off" class="layui-input">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -584,7 +584,7 @@
|
|||||||
<div class="ukefu-im-profile" style="width:130px;font-size:12px;">
|
<div class="ukefu-im-profile" style="width:130px;font-size:12px;">
|
||||||
<div class="ukefu-profile-title" style="clear:both;">信息提示</div>
|
<div class="ukefu-profile-title" style="clear:both;">信息提示</div>
|
||||||
<div class="box-item" style="padding:5px;white-space: nowrap;text-overflow: ellipsis;">
|
<div class="box-item" style="padding:5px;white-space: nowrap;text-overflow: ellipsis;">
|
||||||
名称:<label id="dialog_name">${inviteData.dialog_name!'优客服'}</label>
|
名称:<label id="dialog_name">${inviteData.dialog_name!'春松客服'}</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="box-item" style="padding:5px;white-space: nowrap;text-overflow: ellipsis;">
|
<div class="box-item" style="padding:5px;white-space: nowrap;text-overflow: ellipsis;">
|
||||||
地址:<label id="dialog_address">${inviteData.dialog_address!'广东深圳'}</label>
|
地址:<label id="dialog_address">${inviteData.dialog_address!'广东深圳'}</label>
|
||||||
|
@ -193,7 +193,7 @@
|
|||||||
[知识概况] 45 浏览 , 15收藏 , 5评论 , 2017-10-02 15:40:33前有效
|
[知识概况] 45 浏览 , 15收藏 , 5评论 , 2017-10-02 15:40:33前有效
|
||||||
<span>
|
<span>
|
||||||
<i class="kfont"></i>
|
<i class="kfont"></i>
|
||||||
<a href="">优客服v3.1.0 产品说明书.pdf 等3个附件</a>
|
<a href="">春松客服v3.1.0 产品说明书.pdf 等3个附件</a>
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
@ -233,7 +233,7 @@
|
|||||||
[知识概况] 45 浏览 , 15收藏 , 5评论 , 2017-10-02 15:40:33前有效
|
[知识概况] 45 浏览 , 15收藏 , 5评论 , 2017-10-02 15:40:33前有效
|
||||||
<span>
|
<span>
|
||||||
<i class="kfont"></i>
|
<i class="kfont"></i>
|
||||||
<a href="">优客服v3.1.0 产品说明书.pdf 等3个附件</a>
|
<a href="">春松客服v3.1.0 产品说明书.pdf 等3个附件</a>
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
@ -273,7 +273,7 @@
|
|||||||
[知识概况] 45 浏览 , 15收藏 , 5评论 , 2017-10-02 15:40:33前有效
|
[知识概况] 45 浏览 , 15收藏 , 5评论 , 2017-10-02 15:40:33前有效
|
||||||
<span>
|
<span>
|
||||||
<i class="kfont"></i>
|
<i class="kfont"></i>
|
||||||
<a href="">优客服v3.1.0 产品说明书.pdf 等3个附件</a>
|
<a href="">春松客服v3.1.0 产品说明书.pdf 等3个附件</a>
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
@ -311,7 +311,7 @@
|
|||||||
[知识概况] 45 浏览 , 15收藏 , 5评论 , 2017-10-02 15:40:33前有效
|
[知识概况] 45 浏览 , 15收藏 , 5评论 , 2017-10-02 15:40:33前有效
|
||||||
<span>
|
<span>
|
||||||
<i class="kfont"></i>
|
<i class="kfont"></i>
|
||||||
<a href="">优客服v3.1.0 产品说明书.pdf 等3个附件</a>
|
<a href="">春松客服v3.1.0 产品说明书.pdf 等3个附件</a>
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
|
@ -94,7 +94,7 @@
|
|||||||
[知识概况] 45 浏览 , 15收藏 , 5评论 , 2017-10-02 15:40:33前有效
|
[知识概况] 45 浏览 , 15收藏 , 5评论 , 2017-10-02 15:40:33前有效
|
||||||
<span>
|
<span>
|
||||||
<i class="kfont"></i>
|
<i class="kfont"></i>
|
||||||
<a href="">优客服v3.1.0 产品说明书.pdf 等3个附件</a>
|
<a href="">春松客服v3.1.0 产品说明书.pdf 等3个附件</a>
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
@ -134,7 +134,7 @@
|
|||||||
[知识概况] 45 浏览 , 15收藏 , 5评论 , 2017-10-02 15:40:33前有效
|
[知识概况] 45 浏览 , 15收藏 , 5评论 , 2017-10-02 15:40:33前有效
|
||||||
<span>
|
<span>
|
||||||
<i class="kfont"></i>
|
<i class="kfont"></i>
|
||||||
<a href="">优客服v3.1.0 产品说明书.pdf 等3个附件</a>
|
<a href="">春松客服v3.1.0 产品说明书.pdf 等3个附件</a>
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
@ -174,7 +174,7 @@
|
|||||||
[知识概况] 45 浏览 , 15收藏 , 5评论 , 2017-10-02 15:40:33前有效
|
[知识概况] 45 浏览 , 15收藏 , 5评论 , 2017-10-02 15:40:33前有效
|
||||||
<span>
|
<span>
|
||||||
<i class="kfont"></i>
|
<i class="kfont"></i>
|
||||||
<a href="">优客服v3.1.0 产品说明书.pdf 等3个附件</a>
|
<a href="">春松客服v3.1.0 产品说明书.pdf 等3个附件</a>
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
@ -212,7 +212,7 @@
|
|||||||
[知识概况] 45 浏览 , 15收藏 , 5评论 , 2017-10-02 15:40:33前有效
|
[知识概况] 45 浏览 , 15收藏 , 5评论 , 2017-10-02 15:40:33前有效
|
||||||
<span>
|
<span>
|
||||||
<i class="kfont"></i>
|
<i class="kfont"></i>
|
||||||
<a href="">优客服v3.1.0 产品说明书.pdf 等3个附件</a>
|
<a href="">春松客服v3.1.0 产品说明书.pdf 等3个附件</a>
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
|
@ -0,0 +1,175 @@
|
|||||||
|
<style>
|
||||||
|
#create {
|
||||||
|
margin: 10px;
|
||||||
|
border-top: 1px solid #EEEEEE;
|
||||||
|
padding-top: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#create input {
|
||||||
|
width: 400px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-lg-12">
|
||||||
|
<div id="create">
|
||||||
|
<form class="layui-form uk-form" style="width: 700px;margin: auto;">
|
||||||
|
<input id="id" type="hidden" name="id" value="${id}">
|
||||||
|
<div class="layui-form-item">
|
||||||
|
<label class="layui-form-label">网站渠道</label>
|
||||||
|
<div class="layui-input-inline">
|
||||||
|
<#if id!=null>
|
||||||
|
<input type="text" name="snsurl" required lay-verify="required" value="${snsurl}"
|
||||||
|
autocomplete="off" class="layui-input" disabled>
|
||||||
|
<#else>
|
||||||
|
<select id="snsid" name="snsid" lay-verify="required">
|
||||||
|
<option></option>
|
||||||
|
</select>
|
||||||
|
</#if>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="layui-form-item">
|
||||||
|
<label class="layui-form-label">智能问答引擎地址</label>
|
||||||
|
<div class="layui-input-inline">
|
||||||
|
<input type="text" name="baseUrl" required lay-verify="required" placeholder="请输入智能问答引擎地址"
|
||||||
|
autocomplete="off" class="layui-input" value="${bot.baseUrl}" <#if id!=null>disabled</#if>>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="layui-form-item">
|
||||||
|
<label class="layui-form-label">名称</label>
|
||||||
|
<div class="layui-input-inline">
|
||||||
|
<input type="text" name="name" required lay-verify="required" placeholder="请输入名称" autocomplete="off"
|
||||||
|
class="layui-input" value="${bot.name}">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="layui-form-item">
|
||||||
|
<label class="layui-form-label">语言</label>
|
||||||
|
<div class="layui-input-inline">
|
||||||
|
<select name="primaryLanguage" lay-verify="required">
|
||||||
|
<option value="zh_CN" <#if bot.primaryLanguage=="zh_CN">selected="selected"</#if>>中文</option>
|
||||||
|
<option value="en_US" <#if bot.primaryLanguage=="en_US">selected="selected"</#if>>英文</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="layui-form-item">
|
||||||
|
<label class="layui-form-label">兜底回复</label>
|
||||||
|
<div class="layui-input-inline">
|
||||||
|
<input type="text" name="fallback" required lay-verify="required" autocomplete="off" value="${bot.fallback}"
|
||||||
|
class="layui-input">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="layui-form-item">
|
||||||
|
<label class="layui-form-label">工作模式</label>
|
||||||
|
<div class="layui-input-inline">
|
||||||
|
<select name="workmode" lay-verify="required">
|
||||||
|
<option <#if bot.workmode=="机器人客服优先">selected="selected"</#if>>机器人客服优先</option>
|
||||||
|
<option <#if bot.workmode=="人工客服优先">selected="selected"</#if>>人工客服优先</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="layui-form-item">
|
||||||
|
<label class="layui-form-label">描述</label>
|
||||||
|
<div class="layui-input-inline">
|
||||||
|
<input type="text" name="description" required lay-verify="required" autocomplete="off" value="${bot.description}"
|
||||||
|
class="layui-input">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="layui-form-item">
|
||||||
|
<div class="layui-input-inline">
|
||||||
|
<button class="layui-btn" lay-submit lay-filter="save">保存</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<script>
|
||||||
|
function request(data, cb) {
|
||||||
|
var postfix = '/api/';
|
||||||
|
var payload = {
|
||||||
|
url: postfix + 'chatbot',
|
||||||
|
method: 'POST',
|
||||||
|
contentType: 'application/json;charset=UTF-8',
|
||||||
|
headers: {
|
||||||
|
authorization: $.cookie('authorization')
|
||||||
|
},
|
||||||
|
dataType: 'json',
|
||||||
|
data: JSON.stringify(data)
|
||||||
|
};
|
||||||
|
|
||||||
|
$.ajax(payload)
|
||||||
|
.done(function (data) {
|
||||||
|
console.log('Rest api 返回的值:', data);
|
||||||
|
if (data.status && data.status === "AUTH_ERROR") {
|
||||||
|
layer.confirm('会话过期,请重新登录!', {
|
||||||
|
btn: ['是', '否'],
|
||||||
|
icon: 2,
|
||||||
|
title: '提示'
|
||||||
|
}, function (index, layero) {
|
||||||
|
layer.close(index)
|
||||||
|
top.location.href = '/logout.html'
|
||||||
|
}, function (index) {
|
||||||
|
// 取消方法
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (data.rc == 0) {
|
||||||
|
cb(null, data.data);
|
||||||
|
} else {
|
||||||
|
cb(data.error);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.fail(function (jqXHR, textStatus) {
|
||||||
|
console.error('Rest api 返回error:', jqXHR);
|
||||||
|
cb(textStatus);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
layui.use(['form'], function () {
|
||||||
|
var form = layui.form();
|
||||||
|
form.on('submit(save)', function (data) {
|
||||||
|
var field = data.field;
|
||||||
|
|
||||||
|
var submitFinish = function (err, bot) {
|
||||||
|
if (err) {
|
||||||
|
console.error(err);
|
||||||
|
} else {
|
||||||
|
layer.open({
|
||||||
|
title: '提示'
|
||||||
|
, content: '保存成功'
|
||||||
|
});
|
||||||
|
parent.init();
|
||||||
|
var index = parent.layer.getFrameIndex(window.name);
|
||||||
|
parent.layer.close(index);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (field.id) {
|
||||||
|
field.ops = 'update';
|
||||||
|
request(field, submitFinish);
|
||||||
|
} else {
|
||||||
|
field.ops = 'create';
|
||||||
|
request(field, submitFinish);
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log(data.field);
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!$('#id').val()) {
|
||||||
|
request({
|
||||||
|
ops: 'vacant'
|
||||||
|
}, function (err, list) {
|
||||||
|
if (err) {
|
||||||
|
console.error(err)
|
||||||
|
} else {
|
||||||
|
var options = $.map(list, function (r) {
|
||||||
|
return '<option value="' + r.snsid + '">' + r.snsurl + '</option>';
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#snsid').html(options);
|
||||||
|
form.render('select');
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
</script>
|
@ -0,0 +1,155 @@
|
|||||||
|
<style>
|
||||||
|
#create {
|
||||||
|
margin: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#create input {
|
||||||
|
width: 400px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<div class="layui-layout-body">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-lg-12">
|
||||||
|
<h1>机器人列表
|
||||||
|
<div style="float: right;" class="ukefu-bt-text-content">
|
||||||
|
<button class="layui-btn layui-btn-samll green" onclick="showCreate()">新建机器人</button>
|
||||||
|
</div>
|
||||||
|
</h1>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-lg-12">
|
||||||
|
<table class="layui-table" lay-skin="line">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>机器人名称</th>
|
||||||
|
<th>网站渠道</th>
|
||||||
|
<th>是否开启</th>
|
||||||
|
<th style="white-space:nowrap;" nowrap="nowrap">操作</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody id="bots">
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<script>
|
||||||
|
function request(path, data) {
|
||||||
|
var postfix = '/api/';
|
||||||
|
var payload = {
|
||||||
|
url: postfix + path,
|
||||||
|
method: 'POST',
|
||||||
|
contentType: 'application/json;charset=UTF-8',
|
||||||
|
headers: {
|
||||||
|
authorization: $.cookie('authorization')
|
||||||
|
},
|
||||||
|
dataType: 'json',
|
||||||
|
data: JSON.stringify(data)
|
||||||
|
};
|
||||||
|
return new Promise(function (resolve, reject) {
|
||||||
|
$.ajax(payload)
|
||||||
|
.done(function (data) {
|
||||||
|
console.log('Rest api 返回的值:', data);
|
||||||
|
if (data.status && data.status === "AUTH_ERROR") {
|
||||||
|
layer.confirm('会话过期,请重新登录!', {
|
||||||
|
btn: ['是', '否'],
|
||||||
|
icon: 2,
|
||||||
|
title: '提示'
|
||||||
|
}, function (index, layero) {
|
||||||
|
layer.close(index)
|
||||||
|
top.location.href = '/logout.html'
|
||||||
|
}, function (index) {
|
||||||
|
// 取消方法
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (data.rc == 0) {
|
||||||
|
resolve(data.data);
|
||||||
|
} else {
|
||||||
|
reject(data.error);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.fail(function (jqXHR, textStatus) {
|
||||||
|
console.error('Rest api 返回error:', jqXHR);
|
||||||
|
reject(textStatus)
|
||||||
|
});
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
function query(p, ps) {
|
||||||
|
request('chatbot?p=' + (p || 1) + '&ps=' + (ps || 10), { ops: 'fetch' }).then(function (rows) {
|
||||||
|
var tds = $.map(rows, function (r) {
|
||||||
|
var edit = $('<a href="#" data-width="550" data-height="300"><i class="layui-icon"></i>编辑</a>');
|
||||||
|
edit.click(function () {
|
||||||
|
layer.open({
|
||||||
|
title: '编辑机器人',
|
||||||
|
type: 2,
|
||||||
|
area: ['800px', '450px'],
|
||||||
|
content: 'edit.html?id=' + r.id
|
||||||
|
})
|
||||||
|
});
|
||||||
|
|
||||||
|
var remove = $('<a style="margin-left:10px;"><i class="layui-icon" style="color:red;">ဆ</i>删除</a>').click(function () {
|
||||||
|
var lindex = layer.confirm('请确认是否删除?', {
|
||||||
|
btn: ['确认', '删除']
|
||||||
|
}, function () {
|
||||||
|
console.log('ok', r.id)
|
||||||
|
window.remove(r.id);
|
||||||
|
|
||||||
|
layer.close(lindex);
|
||||||
|
}, function () {
|
||||||
|
console.log('cancel', r.id)
|
||||||
|
layer.close(lindex);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
var isEnabled = $('<td><input type="checkbox" lay-skin="switch" lay-text="开启|关闭" ' + (r.enabled ? 'checked' : '') + '></td>');
|
||||||
|
isEnabled.change(function () {
|
||||||
|
change(r.id, $(this).find('input').prop('checked'));
|
||||||
|
})
|
||||||
|
|
||||||
|
var rows = [
|
||||||
|
$('<td>' + r.name + '</td>'),
|
||||||
|
$('<td>' + r.snsurl + '</td>'),
|
||||||
|
isEnabled,
|
||||||
|
$('<td style="white-space:nowrap;" nowrap="nowrap"></td>').html([edit, remove])
|
||||||
|
];
|
||||||
|
|
||||||
|
var tr = $('<tr></tr>');
|
||||||
|
tr.html(rows);
|
||||||
|
return tr;
|
||||||
|
})
|
||||||
|
|
||||||
|
$('#bots').html(tds);
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
function remove(id) {
|
||||||
|
return request('chatbot', { ops: 'delete', id: id }).then(function () {
|
||||||
|
window.init();
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
function change(id, isEnabled) {
|
||||||
|
return request('chatbot', { ops: isEnabled ? 'enable' : 'disable', id: id })
|
||||||
|
}
|
||||||
|
|
||||||
|
function showCreate() {
|
||||||
|
layer.open({
|
||||||
|
title: '新建机器人',
|
||||||
|
type: 2,
|
||||||
|
area: ['800px', '450px'],
|
||||||
|
content: 'edit.html'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
function init() {
|
||||||
|
query(1, 10);
|
||||||
|
}
|
||||||
|
|
||||||
|
layui.use(['form'], function () {
|
||||||
|
init();
|
||||||
|
})
|
||||||
|
</script>
|
@ -77,10 +77,10 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="content-bottom">
|
<div class="content-bottom">
|
||||||
<span id="welcome-message">
|
<span id="welcome-message">
|
||||||
<p>欢迎使用优客服企业IM</p>
|
<p>欢迎使用春松客服企业IM</p>
|
||||||
<p>QQ群:<a target="_blank" href="//shang.qq.com/wpa/qunwpa?idkey=637134af30a27220211c843d801ada14700aca69ee8f4acf13f795fe38ea7b94"><img border="0" src="//pub.idqqimg.com/wpa/images/group.png" alt="优客服开源项目" title="优客服开源项目"></a></p>
|
<p>QQ群:<a target="_blank" href="//shang.qq.com/wpa/qunwpa?idkey=ef3061d99653e2f43619ddcefbf76ac2399196d89fd589501e19ae64423a5a31"><img border="0" src="//pub.idqqimg.com/wpa/images/group.png" alt="春松客服开源社区" title="春松客服开源社区"></a></p>
|
||||||
<p>优客服企业IM为收费产品</p>
|
<p>春松客服企业IM为收费产品</p>
|
||||||
<p>详情请咨询:<a href="http://www.ukewo.cn" target="_blank" style="color:#32c24d;">优客服</a></p>
|
<p>详情请咨询:<a href="https://www.chatopera.com" target="_blank" style="color:#32c24d;">春松客服</a></p>
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -172,7 +172,7 @@
|
|||||||
title: '关于' ,
|
title: '关于' ,
|
||||||
btn: '关闭' ,
|
btn: '关闭' ,
|
||||||
shade: 0 ,
|
shade: 0 ,
|
||||||
content : '<span id="welcome-message"><p>欢迎使用优客服企业IM</p><p>QQ群:<a target="_blank" href="//shang.qq.com/wpa/qunwpa?idkey=637134af30a27220211c843d801ada14700aca69ee8f4acf13f795fe38ea7b94"><img border="0" src="//pub.idqqimg.com/wpa/images/group.png" alt="优客服开源项目" title="优客服开源项目"></a></p><p>优客服企业IM为收费产品</p><p>详情请咨询:<a href="http://www.ukewo.cn" target="_blank" style="color:#32c24d;">优客服</a></p></span>'});
|
content : '<span id="welcome-message"><p>欢迎使用春松客服企业IM</p><p>QQ群:<a target="_blank" href="//shang.qq.com/wpa/qunwpa?idkey=ef3061d99653e2f43619ddcefbf76ac2399196d89fd589501e19ae64423a5a31"><img border="0" src="//pub.idqqimg.com/wpa/images/group.png" alt="春松客服开源社区" title="春松客服开源社区"></a></p><p>春松客服企业IM为收费产品</p><p>详情请咨询:<a href="https://www.chatopera.com" target="_blank" style="color:#32c24d;">春松客服</a></p></span>'});
|
||||||
}
|
}
|
||||||
function search(){
|
function search(){
|
||||||
layer.open({
|
layer.open({
|
||||||
|
@ -299,15 +299,15 @@
|
|||||||
-->
|
-->
|
||||||
|
|
||||||
|
|
||||||
<#if models?? && models["xiaoe"]?? && models["xiaoe"] == true>
|
<!--<#if models?? && models["xiaoe"]?? && models["xiaoe"] == true>-->
|
||||||
<#if user?? &&( user.roleAuthMap["A09"]?? || user.usertype == "0") >
|
<!--<#if user?? &&( user.roleAuthMap["A09"]?? || user.usertype == "0") >-->
|
||||||
<dd class="ukefu-left-menu" data-tooltip="智能机器人">
|
<!--<dd class="ukefu-left-menu" data-tooltip="智能机器人">-->
|
||||||
<a href="javascript:void(0)" data-title="智能机器人" data-href="/apps/xiaoe/index.html" class="iframe_btn" data-id="maincontent" data-type="tabChange">
|
<!--<a href="javascript:void(0)" data-title="智能机器人" data-href="/apps/xiaoe/index.html" class="iframe_btn" data-id="maincontent" data-type="tabChange">-->
|
||||||
<i class="kfont" style="position: relative;"></i>
|
<!--<i class="kfont" style="position: relative;"></i>-->
|
||||||
</a>
|
<!--</a>-->
|
||||||
</dd>
|
<!--</dd>-->
|
||||||
</#if>
|
<!--</#if>-->
|
||||||
</#if>
|
<!--</#if>-->
|
||||||
<#if models?? && models["sales"]?? && models["sales"] == true>
|
<#if models?? && models["sales"]?? && models["sales"] == true>
|
||||||
<#if user?? &&( user.roleAuthMap["A11"]?? || user.usertype == "0") >
|
<#if user?? &&( user.roleAuthMap["A11"]?? || user.usertype == "0") >
|
||||||
<dd class="ukefu-left-menu" data-tooltip="外呼系统">
|
<dd class="ukefu-left-menu" data-tooltip="外呼系统">
|
||||||
@ -317,6 +317,15 @@
|
|||||||
</dd>
|
</dd>
|
||||||
</#if>
|
</#if>
|
||||||
</#if>
|
</#if>
|
||||||
|
<#if models?? && models["sales"]?? && models["sales"] == true>
|
||||||
|
<#if user?? &&( user.roleAuthMap["A09"]?? || user.usertype == "0") >
|
||||||
|
<dd class="ukefu-left-menu" data-tooltip="智能机器人">
|
||||||
|
<a href="javascript:void(0)" data-title="智能机器人" data-href="/apps/chatbot/index.html" class="iframe_btn" data-id="maincontent" data-type="tabChange">
|
||||||
|
<i class="kfont" style="position: relative;"></i>
|
||||||
|
</a>
|
||||||
|
</dd>
|
||||||
|
</#if>
|
||||||
|
</#if>
|
||||||
<#if models?? && models["callcenter"]?? && models["callcenter"] == true>
|
<#if models?? && models["callcenter"]?? && models["callcenter"] == true>
|
||||||
<#if user?? && (user.roleAuthMap["A10"]?? || user.usertype == "0") >
|
<#if user?? && (user.roleAuthMap["A10"]?? || user.usertype == "0") >
|
||||||
<dd class="ukefu-left-menu" data-tooltip="语音渠道">
|
<dd class="ukefu-left-menu" data-tooltip="语音渠道">
|
||||||
|
@ -7130,9 +7130,7 @@ INSERT INTO `uk_sysdic` VALUES ('402881ef612b1f5b01612ce8b990057e', '在线坐
|
|||||||
INSERT INTO `uk_sysdic` VALUES ('402881ef612b1f5b01612ce8e6a2057f', '全部坐席', 'pub', 'A08_A04_A02', NULL, 'auth', '402881ef612b1f5b01612cdd1e930570', NULL, NULL, '�', NULL, NULL, '297e8c7b455798280145579c73e501c1', '2018-01-25 18:41:56', NULL, 0, 0, '402888815d2fe37f015d2fe75cc80002', 0, 0, '/service/user/index.html', 'webim', '3', NULL, 'left');
|
INSERT INTO `uk_sysdic` VALUES ('402881ef612b1f5b01612ce8e6a2057f', '全部坐席', 'pub', 'A08_A04_A02', NULL, 'auth', '402881ef612b1f5b01612cdd1e930570', NULL, NULL, '�', NULL, NULL, '297e8c7b455798280145579c73e501c1', '2018-01-25 18:41:56', NULL, 0, 0, '402888815d2fe37f015d2fe75cc80002', 0, 0, '/service/user/index.html', 'webim', '3', NULL, 'left');
|
||||||
INSERT INTO `uk_sysdic` VALUES ('402881ef612b1f5b01612ce964ae0580', '智能机器人', 'pub', 'A09_A01', NULL, 'auth', '402881ef612b1f5b01612cc602450546', NULL, NULL, '�', NULL, NULL, '297e8c7b455798280145579c73e501c1', '2018-01-25 18:42:28', NULL, 0, 0, '402888815d2fe37f015d2fe75cc80002', 0, 0, 'javascript:;', 'webim', '2', NULL, 'left');
|
INSERT INTO `uk_sysdic` VALUES ('402881ef612b1f5b01612ce964ae0580', '智能机器人', 'pub', 'A09_A01', NULL, 'auth', '402881ef612b1f5b01612cc602450546', NULL, NULL, '�', NULL, NULL, '297e8c7b455798280145579c73e501c1', '2018-01-25 18:42:28', NULL, 0, 0, '402888815d2fe37f015d2fe75cc80002', 0, 0, 'javascript:;', 'webim', '2', NULL, 'left');
|
||||||
INSERT INTO `uk_sysdic` VALUES ('402881ef612b1f5b01612ce996f80581', '语料库配置', 'pub', 'A09_A02', NULL, 'auth', '402881ef612b1f5b01612cc602450546', NULL, NULL, '�', NULL, NULL, '297e8c7b455798280145579c73e501c1', '2018-01-25 18:42:41', NULL, 0, 0, '402888815d2fe37f015d2fe75cc80002', 0, 0, 'javascript:;', 'webim', '2', NULL, 'left');
|
INSERT INTO `uk_sysdic` VALUES ('402881ef612b1f5b01612ce996f80581', '语料库配置', 'pub', 'A09_A02', NULL, 'auth', '402881ef612b1f5b01612cc602450546', NULL, NULL, '�', NULL, NULL, '297e8c7b455798280145579c73e501c1', '2018-01-25 18:42:41', NULL, 0, 0, '402888815d2fe37f015d2fe75cc80002', 0, 0, 'javascript:;', 'webim', '2', NULL, 'left');
|
||||||
INSERT INTO `uk_sysdic` VALUES ('402881ef612b1f5b01612ce9d8150582', '机器人选项', 'pub', 'A09_A01_A01', NULL, 'auth', '402881ef612b1f5b01612ce964ae0580', NULL, NULL, '�', NULL, NULL, '297e8c7b455798280145579c73e501c1', '2018-01-25 18:42:58', NULL, 0, 0, '402888815d2fe37f015d2fe75cc80002', 0, 0, '/apps/xiaoe/index.html', 'webim', '3', NULL, 'left');
|
INSERT INTO `uk_sysdic` VALUES ('402881ef612b1f5b01612ce9d8150582', '机器人管理', 'pub', 'A09_A01_A01', NULL, 'auth', '402881ef612b1f5b01612ce964ae0580', NULL, NULL, '�', NULL, NULL, '297e8c7b455798280145579c73e501c1', '2018-01-25 18:42:58', NULL, 0, 0, '402888815d2fe37f015d2fe75cc80002', 0, 0, '/apps/xiaoe/index.html', 'webim', '3', NULL, 'left');
|
||||||
INSERT INTO `uk_sysdic` VALUES ('402881ef612b1f5b01612cea04810583', '对话测试', 'pub', 'A09_A01_A02', NULL, 'auth', '402881ef612b1f5b01612ce964ae0580', NULL, NULL, '�', NULL, NULL, '297e8c7b455798280145579c73e501c1', '2018-01-25 18:43:09', NULL, 0, 0, '402888815d2fe37f015d2fe75cc80002', 0, 0, '/apps/xiaoe/chat.html', 'webim', '3', NULL, 'left');
|
|
||||||
INSERT INTO `uk_sysdic` VALUES ('402881ef612b1f5b01612cea430f0584', '用户提问历史', 'pub', 'A09_A01_A03', NULL, 'auth', '402881ef612b1f5b01612ce964ae0580', NULL, NULL, '�', NULL, NULL, '297e8c7b455798280145579c73e501c1', '2018-01-25 18:43:25', NULL, 0, 0, '402888815d2fe37f015d2fe75cc80002', 0, 0, '/apps/xiaoe/history.html', 'webim', '3', NULL, 'left');
|
|
||||||
INSERT INTO `uk_sysdic` VALUES ('402881ef612b1f5b01612ceaff050587', '对话场景', 'pub', 'A09_A02_A03', NULL, 'auth', '402881ef612b1f5b01612ce996f80581', NULL, NULL, '�', NULL, NULL, '297e8c7b455798280145579c73e501c1', '2018-01-25 18:44:13', NULL, 0, 0, '402888815d2fe37f015d2fe75cc80002', 0, 0, '/apps/xiaoe/scene.html', 'webim', '3', NULL, 'left');
|
INSERT INTO `uk_sysdic` VALUES ('402881ef612b1f5b01612ceaff050587', '对话场景', 'pub', 'A09_A02_A03', NULL, 'auth', '402881ef612b1f5b01612ce996f80581', NULL, NULL, '�', NULL, NULL, '297e8c7b455798280145579c73e501c1', '2018-01-25 18:44:13', NULL, 0, 0, '402888815d2fe37f015d2fe75cc80002', 0, 0, '/apps/xiaoe/scene.html', 'webim', '3', NULL, 'left');
|
||||||
INSERT INTO `uk_sysdic` VALUES ('402881ef612b1f5b01612ced9d5f0588', '知识维护', 'pub', 'A09_A02_A01', NULL, 'auth', '402881ef612b1f5b01612ce996f80581', NULL, NULL, '�', NULL, NULL, '297e8c7b455798280145579c73e501c1', '2018-01-25 18:47:05', NULL, 0, 0, '402888815d2fe37f015d2fe75cc80002', 0, 0, '/apps/xiaoe/knowledge.html', 'webim', '3', NULL, 'left');
|
INSERT INTO `uk_sysdic` VALUES ('402881ef612b1f5b01612ced9d5f0588', '知识维护', 'pub', 'A09_A02_A01', NULL, 'auth', '402881ef612b1f5b01612ce996f80581', NULL, NULL, '�', NULL, NULL, '297e8c7b455798280145579c73e501c1', '2018-01-25 18:47:05', NULL, 0, 0, '402888815d2fe37f015d2fe75cc80002', 0, 0, '/apps/xiaoe/knowledge.html', 'webim', '3', NULL, 'left');
|
||||||
INSERT INTO `uk_sysdic` VALUES ('402881ef612b1f5b01612cedca5e0589', '词库配置', 'pub', 'A09_A02_A02', NULL, 'auth', '402881ef612b1f5b01612ce996f80581', NULL, NULL, '�', NULL, NULL, '297e8c7b455798280145579c73e501c1', '2018-01-25 18:47:16', NULL, 0, 0, '402888815d2fe37f015d2fe75cc80002', 0, 0, '/apps/xiaoe/words.html', 'webim', '3', NULL, 'left');
|
INSERT INTO `uk_sysdic` VALUES ('402881ef612b1f5b01612cedca5e0589', '词库配置', 'pub', 'A09_A02_A02', NULL, 'auth', '402881ef612b1f5b01612ce996f80581', NULL, NULL, '�', NULL, NULL, '297e8c7b455798280145579c73e501c1', '2018-01-25 18:47:16', NULL, 0, 0, '402888815d2fe37f015d2fe75cc80002', 0, 0, '/apps/xiaoe/words.html', 'webim', '3', NULL, 'left');
|
||||||
|
Loading…
x
Reference in New Issue
Block a user