layui分页sort只限制当前页解决
问题描述:
layui排序只能对当前点击当页的数据进行排序,后续页面的数据不涉及(也就导致了我们本来想要最大值或这最小值,大部分时候获取的都不准确)
解决这个问题需要前端和后端都改写代码
前端代码:
<table class="layui-hide" id="instance_info" lay-filter="ins_info"></table>
注意lay-filter是ins_info
在JavaScript脚本中需要添加的是
table.on('sort(ins_info)', function(obj){ //注:tool是工具条事件名,test是table原始容器的属性 lay-filter="对应的值"
console.log(obj.field); //当前排序的字段名
console.log(obj.type); //当前排序类型:desc(降序)、asc(升序)、null(空对象,默认排序)
console.log(this); //当前排序的 th 对象
table.reload('testReload', {
initSort: obj //记录初始排序,如果不设的话,将无法标记表头的排序状态。 layui 2.1.1 新增参数
,where: { //请求参数(注意:这里面的参数可任意定义,并非下面固定的格式)
field: obj.field //排序字段 在接口作为参数字段 field order
,order: obj.type //排序方式 在接口作为参数字段 field order
}
});
});
通过在Google浏览器点击我们的排序按钮可以看到得到变量已经输出来了
通过network可以看到我们post的变量值,这位后端的获取提供了方法
前端到此为止已经结束了,接下来我们编写后端获取代码
@csrf_exempt
def InstanceDisplay(request):
mydb = MySQLdb.MysqlHelper('192.168.56.104', 'dbadmin', 'dbadmin', 'jkdb', '3306')
if request.method=='POST':
id=request.POST.get('key[id]')
ip = request.POST.get('key[ip]')
insname = request.POST.get('key[insname]')
ordername = request.POST.get('field')
ordertype = request.POST.get('order')
print(ordername,ordertype)
id=id if id else 'a.id'
if ip and insname:
sql="""SELECT a.id,a.ip,a.port,b.instance_name,
CASE a.role WHEN 1 THEN '主' ELSE '从' END 'instance_status',
CASE b.single_flag WHEN 1 THEN '集群' ELSE '单机' END 'cluster_status',b.create_time,b.apply_user,b.create_user
FROM instanceinfo a,instancegroup b WHERE a.cluster=b.id and a.id={0} and a.ip='{1}' and b.instance_name like '%%{2}%%'""".format(id,ip,insname)
elif ip and not insname:
insname = 'b.instance_name'
sql = """SELECT a.id,a.ip,a.port,b.instance_name,
CASE a.role WHEN 1 THEN '主' ELSE '从' END 'instance_status',
CASE b.single_flag WHEN 1 THEN '集群' ELSE '单机' END 'cluster_status',b.create_time,b.apply_user,b.create_user
FROM instanceinfo a,instancegroup b WHERE a.cluster=b.id and a.id={0} and a.ip='{1}' and b.instance_name={2}""" .format(id, ip, insname)
elif not ip and insname:
ip = 'a.ip'
sql = """SELECT a.id,a.ip,a.port,b.instance_name,
CASE a.role WHEN 1 THEN '主' ELSE '从' END 'instance_status',
CASE b.single_flag WHEN 1 THEN '集群' ELSE '单机' END 'cluster_status',b.create_time,b.apply_user,b.create_user
FROM instanceinfo a,instancegroup b WHERE a.cluster=b.id and a.id={0} and a.ip={1} and b.instance_name like '%%{2}%%'""".format(id, ip, insname)
else:
ip = ip if ip else 'a.ip'
insname = insname if insname else 'b.instance_name'
sql = """SELECT a.id,a.ip,a.port,b.instance_name,
CASE a.role WHEN 1 THEN '主' ELSE '从' END 'instance_status',
CASE b.single_flag WHEN 1 THEN '集群' ELSE '单机' END 'cluster_status',b.create_time,b.apply_user,b.create_user
FROM instanceinfo a,instancegroup b WHERE a.cluster=b.id and a.id={0} and a.ip={1} and b.instance_name={2}""".format(id, ip, insname)
# print(sql)
sql=sql+' order by {0} {1}'.format(ordername,ordertype) if ordername and ordername else sql
print(sql)
column_list,res=mydb.get_all(sql)
result=[dict(zip(column_list, i)) for i in res]
context={
'code':0,
'msg':'' ,
'count': len(result),
'data':result
}
return HttpResponse(json.dumps(context,cls=DateEncoder,ensure_ascii=False))
else:
sql = """SELECT a.id,a.ip,a.port,b.instance_name,
CASE a.role WHEN 1 THEN '主' ELSE '从' END 'instance_status',
CASE b.single_flag WHEN 1 THEN '集群' ELSE '单机' END 'cluster_status',b.create_time,b.apply_user,b.create_user
FROM instanceinfo a,instancegroup b WHERE a.cluster=b.id"""
# print(sql)
column_list, res = mydb.get_all(sql)
result = [dict(zip(column_list, i)) for i in res]
context = {
'code': 0,
'msg': '',
'count': len(result),
'data': result
}
return HttpResponse(json.dumps(context, cls=DateEncoder, ensure_ascii=False))
需要注意的是上面对sql通过排序字段是否存在进行相应的拼接
sql=sql+’ order by {0} {1}'.format(ordername,ordertype) if ordername and ordername else sql
下面是排序的几个结果集合
未排序前
asc排序
desc排序
实现了我们想要的效果,layui目前只涉及到单列的排序,多列的排序需要修改源代码,通过数组的方式添加,有兴趣的同学可以尝试
- 技术无止境