feat: 后端全量更新 - 含所有本次需求

- Contract.php: 返回合约账户余额(balance_contract)
- My.php: 地址管理增加BTC/ETH
- AppContract.php: 一键平仓(closeall)
- AppProxy.php: 代理专属注册链接 + 分级权限(L1/L2)
- site.php: 手续费减半(0.018→0.009)
- agent_permission_setup.sql: 代理权限SQL
- crypto_news_crawler.py: 新闻自动采集脚本
This commit is contained in:
li
2026-03-30 20:16:32 +08:00
commit 1b24994e74
6721 changed files with 1308571 additions and 0 deletions
+66
View File
@@ -0,0 +1,66 @@
define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefined, Backend, Table, Form) {
var Controller = {
index: function () {
// 初始化表格参数配置
Table.api.init({
extend: {
index_url: 'kefu/blacklist/index' + location.search,
add_url: 'kefu/blacklist/add',
edit_url: 'kefu/blacklist/edit',
del_url: 'kefu/blacklist/del',
multi_url: 'kefu/blacklist/multi',
table: 'kefu_blacklist',
}
});
var table = $("#table");
// 初始化表格
table.bootstrapTable({
url: $.fn.bootstrapTable.defaults.extend.index_url,
pk: 'id',
sortName: 'id',
columns: [
[
{checkbox: true},
{field: 'id', title: __('Id')},
{field: 'user_id', title: __('User_id')},
{field: 'kefuuser.nickname', title: __('nickname'), operate: 'LIKE', placeholder: '模糊查找'},
{field: 'fu_user_nickname', title: __('fu_user_nickname')},
{field: 'admin.nickname', title: __('Admin_id'), operate: 'LIKE', placeholder: '模糊查找'},
{
field: 'createtime',
title: __('Createtime'),
operate: 'RANGE',
addclass: 'datetimerange',
formatter: Table.api.formatter.datetime
},
{
field: 'operate',
title: __('Operate'),
table: table,
events: Table.api.events.operate,
formatter: Table.api.formatter.operate
}
]
]
});
// 为表格绑定事件
Table.api.bindevent(table);
},
add: function () {
Controller.api.bindevent();
},
edit: function () {
Controller.api.bindevent();
},
api: {
bindevent: function () {
Form.api.bindevent($("form[role=form]"));
}
}
};
return Controller;
});
+118
View File
@@ -0,0 +1,118 @@
define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'upload'], function ($, undefined, Backend, Table, Form, Upload) {
var Controller = {
index: function () {
// 初始化表格参数配置
Table.api.init({
search: true,
advancedSearch: true,
pagination: true,
extend: {
"index_url": "kefu/config/index",
"add_url": "",
"edit_url": "",
"del_url": "",
"multi_url": "",
}
});
Form.api.bindevent($("form[role=form]"));
$('input[name="row[csr_admin]"]').data("eSelect", function () {
Controller.api.build_csr_config()
});
$('input[name="row[csr_admin]"]').data("eTagRemove", function (data) {
if (!Controller.selectPageReady) {
Controller.selectPageReady = true;
} else {
Controller.api.build_csr_config()
}
});
$(document).on('click', '.run_config', function () {
Fast.api.open("addon/config?name=kefu", __('Setting'));
});
$('input[name="row[csr_distribution]"]').on('change', function (that) {
var csr_distribution = $(that.target).val();
var tis = '';
if (csr_distribution == 0) {
tis = '按工作强度:优先分配给当前接待量最少的客服,若有多个客服接待量相同,则分配给其中最久未进行接待的客服';
} else if (csr_distribution == 1) {
tis = '智能分配:根据接待上限和当前接待量,分配给最能接待的客服';
} else if (csr_distribution == 2) {
tis = '轮流分配:每次都分配给最久未进行接待的客服';
}
$('#distribution_help').html(tis);
})
},
selectPageReady: false,
api: {
build_csr_config: function () {
var csr = $('input[name="row[csr_admin]"]').selectPageText();
var csrs = csr.split(",");
for (var i = 0; i < csrs.length; i++) {
Controller.api.build_csr_input(csrs[i]);
}
// 删除-获取已构建的配置框
var csr_config_list = $('#csr_config').children("div");
var csr_config_length = $('#csr_config').children("div").length;
if (csrs.length) {
for (var i = 0; i < csr_config_length; i++) {
let csr = $(csr_config_list[i]).data('name').toString();
if (csrs.indexOf(csr) == -1) {
Controller.api.build_csr_input(csr, true);
}
}
} else {
for (let i in csr_config_length) {
let csr = $(csr_config_list[i]).data('name')
Controller.api.build_csr_input(csr, true);
}
}
},
build_csr_input: function (username, is_del = false) {
if (!username) {
return;
}
var csr_item = $('#csr_config').children("[data-name='" + username + "']");
if (is_del && csr_item.length) {
// 删除
csr_item.remove();
return;
} else if (csr_item.length) {
return;
}
var el = $('\
<div data-name="' + username + '">\
<div class="form-group">\
<label class="control-label">' + username + ':</label>\
<div class="input-group">\
<div class="input-group-addon">接待上限</div>\
<input class="form-control" name="row[csr_config][' + username + ']" placeholder="请输入接待上限人数" value="1" />\
<div class="input-group-addon">人</div>\
</div>\
</div>\
</div>\
');
$('#csr_config').append(el)//插入
}
}
};
return Controller;
})
+85
View File
@@ -0,0 +1,85 @@
define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefined, Backend, Table, Form) {
var Controller = {
index: function () {
// 初始化表格参数配置
Table.api.init({
extend: {
index_url: 'kefu/csrkpi/index' + location.search,
add_url: 'kefu/csrkpi/add',
edit_url: 'kefu/csrkpi/edit',
del_url: 'kefu/csrkpi/del',
multi_url: 'kefu/csrkpi/multi',
table: 'kefu_csr_config',
}
});
var table = $("#table");
// 初始化表格
table.bootstrapTable({
url: $.fn.bootstrapTable.defaults.extend.index_url,
pk: 'id',
sortName: 'id',
columns: [
[
{checkbox: true},
{field: 'id', title: __('Id')},
{field: 'admin.nickname', title: __('Admin_id')},
{field: 'ceiling', title: __('Ceiling'), sortable: true},
{field: 'reception_count', title: __('Reception_count'), sortable: true},
{field: 'sum_message_count', title: __('sum_message_count')},
{field: 'sum_reception_count', title: __('sum_reception_count')},
{
field: 'last_reception_time',
title: __('Last_reception_time'),
operate: 'RANGE',
addclass: 'datetimerange',
formatter: Table.api.formatter.datetime,
sortable: true
},
{
field: 'keep_alive',
title: __('Keep Alive'),
searchList: {"0": __('关'), "1": __('开')},
formatter: Table.api.formatter.status
},
{
field: 'status',
title: __('Status'),
searchList: {
"0": __('Status 0'),
"1": __('Status 1'),
"2": __('Status 2'),
"3": __('Status 3')
},
formatter: Table.api.formatter.status
},
{
field: 'operate',
title: __('Operate'),
table: table,
events: Table.api.events.operate,
formatter: Table.api.formatter.operate
}
]
]
});
// 为表格绑定事件
Table.api.bindevent(table);
},
add: function () {
Controller.api.bindevent();
},
edit: function () {
Controller.api.bindevent();
},
api: {
bindevent: function () {
Form.api.bindevent($("form[role=form]"));
}
}
};
return Controller;
});
+144
View File
@@ -0,0 +1,144 @@
define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefined, Backend, Table, Form) {
var Controller = {
index: function () {
// 初始化表格参数配置
Table.api.init({
extend: {
index_url: 'kefu/fastreply/index' + location.search,
add_url: 'kefu/fastreply/add',
edit_url: 'kefu/fastreply/edit',
del_url: 'kefu/fastreply/del',
multi_url: 'kefu/fastreply/multi',
table: 'kefu_fast_reply',
}
});
var table = $("#table");
// 初始化表格
table.bootstrapTable({
url: $.fn.bootstrapTable.defaults.extend.index_url,
pk: 'id',
sortName: 'id',
columns: [
[
{checkbox: true},
{field: 'id', title: __('Id')},
{field: 'admin.nickname', title: __('Admin_id')},
{field: 'title', title: __('Title'), operate: 'LIKE', placeholder: '模糊查找'},
{
field: 'content',
title: __('Content'),
operate: 'LIKE',
placeholder: '模糊查找',
formatter: Controller.api.formatter.value_substring
},
{
field: 'status',
title: __('Status'),
searchList: {"0": __('Status 0'), "1": __('Status 1')},
formatter: Table.api.formatter.status
},
{
field: 'createtime',
title: __('Createtime'),
operate: 'RANGE',
addclass: 'datetimerange',
formatter: Table.api.formatter.datetime
},
{
field: 'operate',
title: __('Operate'),
table: table,
events: Table.api.events.operate,
formatter: Table.api.formatter.operate
}
]
]
});
// 为表格绑定事件
Table.api.bindevent(table);
},
recyclebin: function () {
// 初始化表格参数配置
Table.api.init({
extend: {
'dragsort_url': ''
}
});
var table = $("#table");
// 初始化表格
table.bootstrapTable({
url: 'kefu/fastreply/recyclebin' + location.search,
pk: 'id',
sortName: 'id',
columns: [
[
{checkbox: true},
{field: 'id', title: __('Id')},
{field: 'title', title: __('Title'), align: 'left'},
{
field: 'deletetime',
title: __('Deletetime'),
operate: 'RANGE',
addclass: 'datetimerange',
formatter: Table.api.formatter.datetime
},
{
field: 'operate',
width: '130px',
title: __('Operate'),
table: table,
events: Table.api.events.operate,
buttons: [
{
name: 'Restore',
text: __('Restore'),
classname: 'btn btn-xs btn-info btn-ajax btn-restoreit',
icon: 'fa fa-rotate-left',
url: 'kefu/fastreply/restore',
refresh: true
},
{
name: 'Destroy',
text: __('Destroy'),
classname: 'btn btn-xs btn-danger btn-ajax btn-destroyit',
icon: 'fa fa-times',
url: 'kefu/fastreply/destroy',
refresh: true
}
],
formatter: Table.api.formatter.operate
}
]
]
});
// 为表格绑定事件
Table.api.bindevent(table);
},
add: function () {
Controller.api.bindevent();
},
edit: function () {
Controller.api.bindevent();
},
api: {
bindevent: function () {
Form.api.bindevent($("form[role=form]"));
},
formatter: {
value_substring: function (value) {
let value_length = value.replace(/[\u0391-\uFFE5]/g, "aa").length;
return value_length > 20 ? value.substring(0, 20) + '...' : value;
}
}
}
};
return Controller;
});
+181
View File
@@ -0,0 +1,181 @@
define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefined, Backend, Table, Form) {
var Controller = {
index: function () {
// 初始化表格参数配置
Table.api.init({
extend: {
index_url: 'kefu/kbs/index' + location.search,
add_url: 'kefu/kbs/add',
edit_url: 'kefu/kbs/edit',
del_url: 'kefu/kbs/del',
multi_url: 'kefu/kbs/multi',
table: 'kefu_kbs',
}
});
var table = $("#table");
// 初始化表格
table.bootstrapTable({
url: $.fn.bootstrapTable.defaults.extend.index_url,
pk: 'id',
sortName: 'weigh',
columns: [
[
{checkbox: true},
{field: 'id', title: __('Id')},
{
field: 'questions',
title: __('Questions'),
formatter: Controller.api.formatter.value_substring,
operate: 'LIKE'
},
{field: 'match', title: __('Match')},
{field: 'admin_id', title: __('Admin_id')},
{field: 'weigh', title: __('Weigh')},
{
field: 'status',
title: __('Status'),
searchList: {"0": __('Status 0'), "1": __('Status 1'), "2": __('Status 2')},
formatter: Table.api.formatter.status
},
{
field: 'createtime',
title: __('Createtime'),
operate: 'RANGE',
addclass: 'datetimerange',
formatter: Table.api.formatter.datetime
},
{
field: 'operate',
title: __('Operate'),
table: table,
events: Table.api.events.operate,
formatter: Table.api.formatter.operate
}
]
]
});
// 为表格绑定事件
Table.api.bindevent(table);
},
recyclebin: function () {
// 初始化表格参数配置
Table.api.init({
extend: {
'dragsort_url': ''
}
});
var table = $("#table");
// 初始化表格
table.bootstrapTable({
url: 'kefu/kbs/recyclebin' + location.search,
pk: 'id',
sortName: 'id',
columns: [
[
{checkbox: true},
{field: 'id', title: __('Id')},
{
field: 'questions',
title: __('Questions'),
formatter: Controller.api.formatter.value_substring,
operate: 'LIKE'
},
{
field: 'deletetime',
title: __('Deletetime'),
operate: 'RANGE',
addclass: 'datetimerange',
formatter: Table.api.formatter.datetime
},
{
field: 'operate',
width: '130px',
title: __('Operate'),
table: table,
events: Table.api.events.operate,
buttons: [
{
name: 'Restore',
text: __('Restore'),
classname: 'btn btn-xs btn-info btn-ajax btn-restoreit',
icon: 'fa fa-rotate-left',
url: 'kefu/kbs/restore',
refresh: true
},
{
name: 'Destroy',
text: __('Destroy'),
classname: 'btn btn-xs btn-danger btn-ajax btn-destroyit',
icon: 'fa fa-times',
url: 'kefu/kbs/destroy',
refresh: true
}
],
formatter: Table.api.formatter.operate
}
]
]
});
// 为表格绑定事件
Table.api.bindevent(table);
},
add: function () {
Controller.api.bindevent();
},
edit: function () {
Controller.api.bindevent();
},
testmatch: function () {
$('#str1, #str2').on('change', function () {
Controller.api.test_match();
})
$('.post_test_match').on('click', function () {
Controller.api.test_match(true);
})
},
api: {
test_match: function (mandatory = false) {
var str1 = $('#str1').val();
var str2 = $('#str2').val();
if (str1 && str2) {
$.post("kefu/kbs/testMatch", {
'str1': str1,
'str2': str2
}, function (res) {
if (res.code == 1) {
$('.progress').show();
$('#match').css('width', res.data + '%').html('匹配度:' + res.data + '%');
}
})
} else {
if (mandatory) {
layer.msg('请输入要计算匹配度的字符串!');
}
}
},
bindevent: function () {
Form.api.bindevent($("form[role=form]"));
$('.test_match').on('click', function () {
Backend.api.addtabs('kefu/kbs/testMatch', '匹配度测试');
});
},
formatter: {
value_substring: function (value) {
let value_length = value.replace(/[\u0391-\uFFE5]/g, "aa").length;
return value_length > 20 ? value.substring(0, 20) + '...' : value;
}
}
}
};
return Controller;
});
+105
View File
@@ -0,0 +1,105 @@
define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefined, Backend, Table, Form) {
var Controller = {
index: function () {
// 初始化表格参数配置
Table.api.init({
extend: {
index_url: 'kefu/leavemessage/index' + location.search,
add_url: 'kefu/leavemessage/add',
edit_url: 'kefu/leavemessage/edit',
del_url: 'kefu/leavemessage/del',
multi_url: 'kefu/leavemessage/multi',
table: 'kefu_leave_message',
}
});
var table = $("#table");
// 初始化表格
table.bootstrapTable({
url: $.fn.bootstrapTable.defaults.extend.index_url,
pk: 'id',
sortName: 'id',
columns: [
[
{checkbox: true},
{field: 'id', title: __('Id')},
{
field: 'kefuuser.avatar',
title: __('Kefuuser.avatar'),
events: Table.api.events.image,
formatter: Table.api.formatter.image,
operate: false
},
{
field: 'kefuuser.nickname',
title: __('Kefuuser.nickname'),
operate: 'LIKE',
placeholder: '模糊查找'
},
{field: 'fu_user_nickname', 'title': __('绑定用户'), operate: false},
{field: 'name', title: __('Name'), operate: 'LIKE', placeholder: '模糊查找'},
{field: 'contact', title: __('Contact')},
{
field: 'kefuuser.referrer',
title: __('Kefuuser.referrer'),
formatter: Controller.api.formatter.url
},
{
field: 'message',
title: __('Message'),
operate: 'LIKE',
placeholder: '模糊查找',
formatter: Controller.api.formatter.value_substring
},
{
field: 'createtime',
title: __('Createtime'),
operate: 'RANGE',
addclass: 'datetimerange',
formatter: Table.api.formatter.datetime
},
{
field: 'operate',
title: __('Operate'),
table: table,
events: Table.api.events.operate,
formatter: Table.api.formatter.operate
}
]
]
});
// 为表格绑定事件
Table.api.bindevent(table);
},
add: function () {
Controller.api.bindevent();
},
edit: function () {
Controller.api.bindevent();
},
api: {
bindevent: function () {
Form.api.bindevent($("form[role=form]"));
},
formatter: {
value_substring: function (value) {
let value_length = value.replace(/[\u0391-\uFFE5]/g, "aa").length;
return value_length > 20 ? value.substring(0, 20) + '...' : value;
},
url: function (value, row, index) {
if (value) {
value = value.split(' IP');
return value[0] ? Table.api.formatter.url(value[0], row, index) : '';
} else {
return '';
}
}
}
}
};
return Controller;
});
+286
View File
@@ -0,0 +1,286 @@
define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefined, Backend, Table, Form) {
var Controller = {
offset: 0,
limit: 10,
index: function () {
// 初始化表格参数配置
Table.api.init({
extend: {
index_url: 'kefu/record/index' + location.search,
add_url: 'kefu/record/add',
edit_url: 'kefu/record/edit',
del_url: 'kefu/record/del',
multi_url: 'kefu/record/multi',
record_url: 'kefu/record/index/session_id/{session_id}',
table: 'kefu_record',
}
});
var table = $("#table");
// 初始化表格
table.bootstrapTable({
url: $.fn.bootstrapTable.defaults.extend.index_url,
pk: 'id',
sortName: 'id',
columns: [
[
{checkbox: true},
{field: 'id', title: __('Id')},
{field: 'session_id', title: __('Session_id')},
{
field: 'sender_identity',
title: __('Sender_identity'),
searchList: {"0": __('Sender_identity 0'), "1": __('Sender_identity 1')},
formatter: Table.api.formatter.normal,
sortable: true
},
{field: 'sender_id', title: __('Sender_id'), sortable: true},
{
field: 'message_type',
title: __('Message_type'),
searchList: {
"0": __('Message_type 0'),
"1": __('Message_type 1'),
"2": __('Message_type 2'),
"3": __('Message_type 3'),
"4": __('Message_type 4'),
"5": __('Message_type 5')
},
formatter: Table.api.formatter.normal,
sortable: true
},
{
field: 'message',
title: __('Message'),
operate: 'LIKE',
placeholder: '模糊查找',
formatter: Controller.api.formatter.message
},
{
field: 'status',
title: __('Status'),
searchList: {"0": __('Status 0'), "1": __('Status 1')},
formatter: Table.api.formatter.status,
sortable: true
},
{
field: 'createtime',
title: __('Createtime'),
operate: 'RANGE',
addclass: 'datetimerange',
formatter: Table.api.formatter.datetime,
sortable: true
},
{
field: 'operate',
title: __('Operate'),
table: table,
events: Table.api.events.operate,
formatter: Table.api.formatter.operate,
buttons: [
{
name: 'record',
title: '只看该会话',
classname: 'btn btn-xs btn-info btn-addtabs',
icon: 'fa fa-file-text-o',
url: $.fn.bootstrapTable.defaults.extend.record_url,
}
]
}
]
]
});
// 为表格绑定事件
Table.api.bindevent(table);
Controller.api.toolbar = Config.toolbar;
},
sessionrecord: function () {
var session_id = Fast.api.query('session_id');
Controller.api.toolbar = Config.toolbar;
Controller.api.loadRecord(session_id)
$(window).scroll(function (e) {
var scrollTop = $(this).scrollTop();
var scrollHeight = $(document).height();
var windowHeight = $(this).height();
if (scrollTop + windowHeight == scrollHeight) {
Controller.api.loadRecord(session_id)
}
});
$(document).on('click', '.record', function (e) {
var img_obj = $(e.target);
if (img_obj.hasClass('emoji')) {
return;
}
img_obj = img_obj[0];
var scrollTop = $(window).scrollTop();
layer.photos({
photos: {
"title": "聊天图片预览",
"id": "record",
data: [
{
"src": img_obj.src
}
]
}, end: function () {
$(window).scrollTop(scrollTop)
}, anim: 5
});
});
},
add: function () {
Controller.api.bindevent();
},
edit: function () {
Controller.api.bindevent();
},
api: {
bindevent: function () {
Form.api.bindevent($("form[role=form]"));
},
formatCard: function (message) {
var message = message.split('#');
var message_arr = [];
for (let i in message) {
let message_temp = message[i].split('=');
if (typeof message_temp[1] != 'undefined') {
message_arr[message_temp[0]] = message_temp[1];
}
}
return message_arr;
},
formatter: {
message: function (value, row, index) {
if (row.message_type == 0 || row.message_type == 3) {
let value_length = value.replace(/[\u0391-\uFFE5]/g, "aa").length;
return value_length > 20 ? value.substring(0, 20) + '...' : value;
} else if (row.message_type == 2) {
return Table.api.formatter.url(value, row, index);
} else if (row.message_type == 1) {
return Table.api.formatter.image(value, row, index);
} else if (row.message_type == 4 || row.message_type == 5) {
var message = Controller.api.formatCard(value);
var card_url = (row.message_type == 4) ? Controller.api.toolbar.goods.card_url : Controller.api.toolbar.order.card_url
card_url += '?ref=addtabs&id=' + message['id'];
return '<a class="btn-addtabs" href="' + card_url + '">查看</a>';
}
}
},
loadRecord: function (session_id) {
if (Controller.limit === false) {
return;
}
Fast.api.ajax({
url: 'kefu/record/sessionRecord',
type: 'GET',
dataType: "json",
loading: true,
data: {
addtabs: 1,
sort: 'id',
order: 'asc',
offset: Controller.offset,
limit: Controller.limit,
filter: '{"session_id":"' + session_id + '"}',
op: '{"session_id":"="}',
_: new Date().getTime()
},
success: function (ret) {
var index = Layer.load(true);
index && Layer.close(index);
Controller.offset += 10;
// Controller.limit += 10;
if (ret.rows.length) {
// 渲染到页面
for (var i in ret.rows) {
Controller.api.buildRecord(ret.rows[i])
}
if (ret.rows.length < 10) {
Controller.limit = false;
}
} else {
Controller.limit = false;
}
}
});
},
buildRecord: function (row) {
var message = '';
row.createtime = Table.api.formatter.datetime(row.createtime)
row.sender_identity = (row.sender_identity == 0) ? 'me' : 'you';
if (row.message_type == 1) {
message = Controller.api.buildChatImg(row.message, '聊天图片', 'record');
} else if (row.message_type == 2) {
var file_name = row.message.split('.');
var file_suffix = file_name[file_name.length - 1];
message = Controller.api.buildChatA(row.message, file_suffix, 'record');
} else if (row.message_type == 3) {
Controller.api.buildPrompt(row.message);
return;
} else if (row.message_type == 4 || row.message_type == 5) {
var message_arr = Controller.api.formatCard(row.message);
var card_url = (row.message_type == 4) ? Controller.api.toolbar.goods.card_url : Controller.api.toolbar.order.card_url
card_url += '?ref=addtabs&id=' + message_arr['id'];
message = '<a class="btn-addtabs" href="' + card_url + '">\n' +
' <div class="record_card">\n' +
' <img src="' + message_arr['logo'] + '" />\n' +
' <div class="record_card_body">\n' +
' <div class="record_card_title">' + message_arr['subject'] + '</div>\n' +
(message_arr['note'] ? '<div class="record_card_note">' + message_arr['note'] + '</div>\n' : '') +
' <div class="record_card_price">\n' +
(message_arr['price'] ? '<span>¥' + message_arr['price'] + '</span>\n' : '') +
(message_arr['number'] ? '<span>x' + message_arr['number'] + '</span>\n' : '') +
' </div>\n' +
' </div>\n' +
' </div>\n' +
' </a>';
} else {
message = row.message;
}
$('.chat').append('<div class="record_item">\
<p><span class="user_name">' + row.sender_id + '</span> ' + row.createtime + ' </p>\
<div class="bubble ' + row.sender_identity + '">' + message + '</div>\
</div>');
},
buildChatA: function (filepath, file_suffix, class_name) {
if (class_name == 'record') {
return '<a target="_blank" class="' + class_name + '" href="' + filepath + '">点击下载:' + file_suffix + ' 文件</a>';
} else {
return '<a target="_blank" class="' + class_name + '" href="' + filepath + '">点击下载:' + file_suffix + ' 文件</a>';
}
},
buildChatImg: function (filename, facename, class_name = 'emoji') {
return '<img class="' + class_name + '" title="' + facename + '" src="' + filename + '" />';
},
buildPrompt: function (data) {
$('.chat').append('<div class="status"><span>' + data + '</span></div>');
},
}
};
return Controller;
});
+141
View File
@@ -0,0 +1,141 @@
define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefined, Backend, Table, Form) {
var Controller = {
index: function () {
// 初始化表格参数配置
Table.api.init({
extend: {
index_url: 'kefu/session/index' + location.search,
add_url: 'kefu/session/add',
edit_url: 'kefu/session/edit',
del_url: 'kefu/session/del',
multi_url: 'kefu/session/multi',
record_url: 'kefu/record/sessionRecord/session_id/{ids}',
table: 'kefu_session',
}
});
var table = $("#table");
// 初始化表格
table.bootstrapTable({
url: $.fn.bootstrapTable.defaults.extend.index_url,
pk: 'id',
sortName: 'id',
columns: [
[
{checkbox: true},
{field: 'id', title: __('Id')},
{
field: 'kefuuser.nickname',
title: __('Kefuuser.nickname'),
operate: 'LIKE',
placeholder: '模糊查找'
},
{field: 'fu_user_nickname', 'title': __('绑定用户'), operate: false},
// {field: 'kefuuser.avatar', title: __('Kefuuser.avatar'),operate:false , events: Table.api.events.image, formatter: Table.api.formatter.image},
{field: 'csr.nickname', title: __('Crs Nickname'), operate: 'LIKE', placeholder: '模糊查找'},
// {field: 'csr_id', title: __('Csr_id')},
{field: 'user_message_count', title: __('user_message_count'), operate: false},
{field: 'csr_message_count', title: __('csr_message_count'), operate: false},
{
field: 'createtime',
title: __('Createtime'),
operate: 'RANGE',
addclass: 'datetimerange',
formatter: Table.api.formatter.datetime
},
{
field: 'operate', title: __('Operate'), table: table,
events: Table.api.events.operate,
formatter: Table.api.formatter.operate,
buttons: [
{
name: 'record',
title: '审查聊天记录',
classname: 'btn btn-xs btn-info btn-dialog',
icon: 'fa fa-file-text-o',
url: $.fn.bootstrapTable.defaults.extend.record_url,
}
]
}
]
]
});
// 为表格绑定事件
Table.api.bindevent(table);
},
recyclebin: function () {
// 初始化表格参数配置
Table.api.init({
extend: {
'dragsort_url': ''
}
});
var table = $("#table");
// 初始化表格
table.bootstrapTable({
url: 'kefu/session/recyclebin' + location.search,
pk: 'id',
sortName: 'id',
columns: [
[
{checkbox: true},
{field: 'id', title: __('Id')},
{
field: 'deletetime',
title: __('Deletetime'),
operate: 'RANGE',
addclass: 'datetimerange',
formatter: Table.api.formatter.datetime
},
{
field: 'operate',
width: '130px',
title: __('Operate'),
table: table,
events: Table.api.events.operate,
buttons: [
{
name: 'Restore',
text: __('Restore'),
classname: 'btn btn-xs btn-info btn-ajax btn-restoreit',
icon: 'fa fa-rotate-left',
url: 'kefu/session/restore',
refresh: true
},
{
name: 'Destroy',
text: __('Destroy'),
classname: 'btn btn-xs btn-danger btn-ajax btn-destroyit',
icon: 'fa fa-times',
url: 'kefu/session/destroy',
refresh: true
}
],
formatter: Table.api.formatter.operate
}
]
]
});
// 为表格绑定事件
Table.api.bindevent(table);
},
add: function () {
Controller.api.bindevent();
},
edit: function () {
Controller.api.bindevent();
},
api: {
bindevent: function () {
Form.api.bindevent($("form[role=form]"));
}
}
};
return Controller;
});
+135
View File
@@ -0,0 +1,135 @@
define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefined, Backend, Table, Form) {
var Controller = {
index: function () {
// 初始化表格参数配置
Table.api.init({
extend: {
index_url: 'kefu/toolbar/index' + location.search,
add_url: 'kefu/toolbar/add',
edit_url: 'kefu/toolbar/edit',
del_url: 'kefu/toolbar/del',
multi_url: 'kefu/toolbar/multi',
table: 'kefu_toolbar',
}
});
var table = $("#table");
// 初始化表格
table.bootstrapTable({
url: $.fn.bootstrapTable.defaults.extend.index_url,
pk: 'id',
sortName: 'id',
columns: [
[
{checkbox: true},
{field: 'id', title: __('Id')},
// {field: 'position', title: __('Position'), searchList: {"frontend":__('Position frontend'),"backend":__('Position backend'),"general":__('Position general')}, formatter: Table.api.formatter.flag, custom:{frontend: 'info', backend:'success', general:'warning'}},
{field: 'mark', title: __('Mark')},
{field: 'title', title: __('Title')},
{
field: 'icon_image',
title: __('Icon_image'),
events: Table.api.events.image,
formatter: Table.api.formatter.image
},
{
field: 'status',
title: __('Status'),
searchList: {"0": __('Status 0'), "1": __('Status 1')},
formatter: Table.api.formatter.status
},
{
field: 'operate',
title: __('Operate'),
table: table,
events: Table.api.events.operate,
formatter: Table.api.formatter.operate
}
]
]
});
// 为表格绑定事件
Table.api.bindevent(table);
},
recyclebin: function () {
// 初始化表格参数配置
Table.api.init({
extend: {
'dragsort_url': ''
}
});
var table = $("#table");
// 初始化表格
table.bootstrapTable({
url: 'kefu/toolbar/recyclebin' + location.search,
pk: 'id',
sortName: 'id',
columns: [
[
{checkbox: true},
{field: 'id', title: __('Id')},
{field: 'title', title: __('Title'), align: 'left'},
{
field: 'deletetime',
title: __('Deletetime'),
operate: 'RANGE',
addclass: 'datetimerange',
formatter: Table.api.formatter.datetime
},
{
field: 'operate',
width: '130px',
title: __('Operate'),
table: table,
events: Table.api.events.operate,
buttons: [
{
name: 'Restore',
text: __('Restore'),
classname: 'btn btn-xs btn-info btn-ajax btn-restoreit',
icon: 'fa fa-rotate-left',
url: 'kefu/toolbar/restore',
refresh: true
},
{
name: 'Destroy',
text: __('Destroy'),
classname: 'btn btn-xs btn-danger btn-ajax btn-destroyit',
icon: 'fa fa-times',
url: 'kefu/toolbar/destroy',
refresh: true
}
],
formatter: Table.api.formatter.operate
}
]
]
});
// 为表格绑定事件
Table.api.bindevent(table);
},
add: function () {
Controller.api.bindevent();
},
edit: function () {
Controller.api.bindevent();
},
api: {
bindevent: function () {
Form.api.bindevent($("form[role=form]"));
var mark = $('#c-mark').val();
if (mark == 'goods' || mark == 'order') {
$('.data_api').show(200);
$('#c-data_api').attr('placeholder', mark == 'goods' ? '请输入商品数据接口Url' : '请输入订单数据接口Url')
}
}
}
};
return Controller;
});
+71
View File
@@ -0,0 +1,71 @@
define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefined, Backend, Table, Form) {
var Controller = {
index: function () {
// 初始化表格参数配置
Table.api.init({
extend: {
index_url: 'kefu/user/index' + location.search,
add_url: 'kefu/user/add',
edit_url: 'kefu/user/edit',
del_url: 'kefu/user/del',
multi_url: 'kefu/user/multi',
table: 'kefu_user',
}
});
var table = $("#table");
// 初始化表格
table.bootstrapTable({
url: $.fn.bootstrapTable.defaults.extend.index_url,
pk: 'id',
sortName: 'id',
columns: [
[
{checkbox: true},
{field: 'id', title: __('Id')},
// {field: 'user_id', title: __('User_id')},
{field: 'user.nickname', title: __('User_id')},
// {field: 'avatar', title: __('Avatar'), events: Table.api.events.image, formatter: Table.api.formatter.image},
{field: 'nickname', title: __('Nickname')},
{field: 'referrer', title: __('Referrer')},
{field: 'contact', title: __('Contact')},
{field: 'note', title: __('Note')},
// {field: 'token', title: __('Token')},
// {field: 'wechat_openid', title: __('Wechat_openid')},
{
field: 'createtime',
title: __('Createtime'),
operate: 'RANGE',
addclass: 'datetimerange',
formatter: Table.api.formatter.datetime
},
{
field: 'operate',
title: __('Operate'),
table: table,
events: Table.api.events.operate,
formatter: Table.api.formatter.operate
}
]
]
});
// 为表格绑定事件
Table.api.bindevent(table);
},
add: function () {
Controller.api.bindevent();
},
edit: function () {
Controller.api.bindevent();
},
api: {
bindevent: function () {
Form.api.bindevent($("form[role=form]"));
}
}
};
return Controller;
});