前端:
$("#datatable").dataTable({
"bserverSide": true,
"proccessing": true,
"sEcho":0,
"sServerMethod": "post",
"iDisplayLength": 5,
"iDisplayStart":0,
"bLengthChange":true,
"sAjaxDataProp":"data",
"bPaginate": true,
"sAjaxSource" : 'api/listUser.php',
"sInfoFiltered":5,
"fnServerData" : function (sSource,aaData,fnCallback) {
// console.log($("#datatable_paginate").nodeType);
console.log(aaData);
$.ajax({
"type": "post",
"url": sSource,
"dataType": "json",
"success": function (result) {
fnCallback(result);
}
});
},
"aoColumns":[
{data:"id"}
]
})
后端:
$result = array(
'draw'=>0,
'code'=>'0000',
'message'=>"ok",
'recordsTotal'=>11,
'recordsFiltered'=>5,
'data'=>$arr
);
echo json_encode($result, JSON_UNESCAPED_UNICODE);
$arr是数据库返回的记录值
1,post到服务端并没有相关分页参数信息(比如当前第几页,就是start和length等信息)
2,返回的总记录数也没有体现,只在分页上显示当前所有记录的总和。
请帮助。万分感谢。
可以用element的pagination,我这有案例
发起请求的时候用url拼接前端的分页参数到后台,后台获取到相应参数获取到分页数据后把你想要的数据信息一并打包返回json返回然后更新下前端解析的分页信息 当前多少页,共多少条数据,需要你自己后台进行计算返回给前端
分页插件
(function ($) {
var ms = {
init: function (obj, args) {
return (function () {
ms.fillHtml(obj, args);
ms.bindEvent(obj, args);
})();
},
//填充html
fillHtml: function (obj, args) {
return (function () {
obj.empty();
//上一页
if (args.current > 1) {
obj.append('<a href="javascript:;" class="prevPage"><i class="fa fa-angle-double-left" aria-hidden="true"></i></a>');
} else {
obj.remove('.prevPage');
obj.append('<span class="disabled"><i class="fa fa-angle-double-left" aria-hidden="true"></i></span>');
}
//中间页码
if (args.current != 1 && args.current >= 4 && args.pageCount != 4) {
obj.append('<a href="javascript:;" class="tcdNumber">' + 1 + '</a>');
}
if (args.current - 2 > 2 && args.current <= args.pageCount && args.pageCount > 5) {
obj.append('<span class="tcdPageCode-ellipsis">...</span>');
}
var start = args.current - 2, end = args.current + 2;
if ((start > 1 && args.current < 4) || args.current == 1) {
end++;
}
if (args.current > args.pageCount - 4 && args.current >= args.pageCount) {
start--;
}
for (; start <= end; start++) {
if (start <= args.pageCount && start >= 1) {
if (start != args.current) {
obj.append('<a href="javascript:;" class="tcdNumber">' + start + '</a>');
} else {
obj.append('<span class="current">' + start + '</span>');
}
}
}
if (args.current + 2 < args.pageCount - 1 && args.current >= 1 && args.pageCount > 5) {
obj.append('<span class="tcdPageCode-ellipsis">...</span>');
}
if (args.current != args.pageCount && args.current < args.pageCount - 2 && args.pageCount != 4) {
obj.append('<a href="javascript:;" class="tcdNumber">' + args.pageCount + '</a>');
}
//下一页
if (args.current < args.pageCount) {
obj.append('<a href="javascript:;" class="nextPage"><i class="fa fa-angle-double-right"></i></a>');
} else {
obj.remove('.nextPage');
obj.append('<span class="disabled"><i class="fa fa-angle-double-right"></i></span>');
}
})();
},
//绑定事件
bindEvent: function (obj, args) {
return (function () {
$(obj).find('.tcdNumber').off("click").on("click", function () {
var current = parseInt($(this).text());
ms.fillHtml(obj, { "current": current, "pageCount": args.pageCount });
if (typeof (args.backFn) == "function") {
args.backFn(current);
}
});
$(obj).find('.prevPage').off('click').on("click", function () {
var current = parseInt(obj.children("span.current").text());
ms.fillHtml(obj, { "current": current - 1, "pageCount": args.pageCount });
if (typeof (args.backFn) == "function") {
args.backFn(current - 1);
}
});
$(obj).find('.nextPage').off('click').on("click", function () {
var current = parseInt(obj.children("span.current").text());
ms.fillHtml(obj, { "current": current + 1, "pageCount": args.pageCount });
if (typeof (args.backFn) == "function") {
args.backFn(current + 1);
}
});
})();
}
}
$.fn.createPage = function (options) {
var args = $.extend({
pageCount: 10,
current: 1,
backFn: function () { }
}, options);
ms.init(this, args);
}
})(jQuery);
调用方法:
$(".tcdPageCode").createPage({
pageCount: 总页数,
current: 当前页,
backFn: function (p) {
//单击回调方法,p是当前页码
查询方法(p);
}
});
样式
.tcdPageCode {
padding: 15px 20px;
color: #ccc;
display: inline-block;
padding-left: 0;
margin: 20px 0;
border-radius: 4px;
}
.tcdPageCode a {
display: inline-block;
color: #0D0D0D;
display: inline-block;
height: 25px;
line-height: 25px;
padding: 6px 12px;
border: 1px solid #ddd;
vertical-align: middle;
padding: 6px 12px;
line-height: 1.42857143;
text-decoration: none;
}
.tcdPageCode span.current {
display: inline-block;
height: 25px;
line-height: 25px;
padding: 6px 12px;
color: #0D0D0D;
background-color: #CCCCCC;
border: 1px solid #ddd;
vertical-align: middle;
line-height: 1.42857143;
text-decoration: none;
}
.tcdPageCode-ellipsis {
display: inline-block;
width: 24px;
text-align: center;
}
.tcdPageCode span.disabled {
display: inline-block;
height: 25px;
line-height: 25px;
padding: 6px 12px;
color: #bfbfbf;
background: #f2f2f2;
border: 1px solid #bfbfbf;
border-radius: 4px;
vertical-align: middle;
}
看看我的代码可以吗:
import json
# 暂时不清楚
import requests
# 引入数学方法
import math
# 引入时间函数
import time
# 引入时间函数
import datetime
# 引入连接oracle数据库的工具包
import cx_Oracle
# 数据库服务器地址
server = '*'
# 数据库的用户名
user = '*'
pasword = '***' # 数据库用户对应的密码
dbName = '*' # 数据库名称
corp_id = '*' # 微信企业号提供的CORP_ID
corp_secret = '*'
# 将字符串转化为时间数组
def datetime_timestamp(dt):
# dt时间参数的字符串
# 中间过程,一般都需要将字符串转化为时间数组
time.strptime(dt, '%Y-%m-%d %H:%M:%S')
# 将时间编程时间戳
s = time.mktime(time.strptime(dt, '%Y-%m-%d %H:%M:%S'))
# 返回结果
return int(s)
# 定义连接数据库方法
def get_link_server():
# 获取数据库的连接
conn = cx_Oracle.connect(user, password, server)
# 如果连接不为空
if conn:
# 返回结果
return conn
else:
# 否则报错
raise ValueError('连接数据库失败')
# 获取用户账号列表
def get_userid_list():
# 连接数据库
conn = get_link_server()
# 获取游标
cursor = conn.cursor()
# 拼写sql 把用户账号拉出来
sql = "select userid from EW_Employee_Data"
# 执行sql语句
cursor.execute(sql)
# 获取返回结果中的第一个结果
row = cursor.fetchone()
# 定义用户账号的数组
useridlist = []
# 遍历从数据库爬取到的数据
while row:
# 将账号数据存取到账号的数组
useridlist.append(row[0])
# 获取下个数据
row = cursor.fetchone()
# 如果账号数组为空的话
if useridlist:
# 返回人员数组
return useridlist
else:
# 否则报错
raise ValueError('获取用户账号列表失败')
# 关闭与数据库的连接
conn.close()
# 获取access_token
def get_access_token():
# 拼接url
# 参考链接
# https://developer.work.weixin.qq.com/document/path/91039
# 如果你看参考文档有压力
# 可以联系我
# 电话|WeChat 18252477531
# 我可以为你提供50RMB一次的答疑服务
api_access_token_url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?" \
"corpid=*" \
"&" \
"corpsecret=*"
# 向企业微信的接口发送请求,获得响应
response = requests.get(api_access_token_url, verify=False)
# 如果成功获取响应
if response.status_code == 200:
# 获取响应的json文本
rep_dict = json.loads(response.text)
# 过去错误码
errcode = rep_dict.get('errcode')
# 如果有错误码
if errcode:
# 报错
raise valueerror('get wechat access token failed, errcode=%s.' % errcode)
else:
# 获取响应得到的json文本中的access_token的编码
access_token = rep_dict.get('access_token')
# 返回access_token的文本形式
return access_token
else:
# 否则报错
raise valueerror('获取企业微信的access token并未成功')
def delete_this_month_pushcard_data():
# 获取与数据库的连接
conn = get_link_server()
# 获取游标
cursor = conn.cursor()
# 调用存储过程
cursor.callproc('delete_this_month_pushcard_data')
conn.close
# 获取微信打卡的json格式
def get_punchcard_info(access_token, opencheckindatatype, starttime, endtime, useridlist):
# 这里的url参考链接https://developer.work.weixin.qq.com/document/path/90262
# 如果你看参考文档有压力
# 可以联系我
# WeChat geyikun0001
# 我可以为你提供50RMB一次的答疑服务
api_punch_card_url = 'https://qyapi.weixin.qq.com/cgi-bin/checkin/getcheckindata?access_token=' + access_token
# 定义json文本的格式
json_str = json.dumps({
"opencheckindatatype": opencheckindatatype,
'starttime': starttime,
'endtime': endtime,
'useridlist': useridlist})
# 发送获取打卡数据的请求得到响应
response = requests.post(api_punch_card_url, data=json_str, verify=False)
# 如果响应的状态码为200
if response.status_code == 200:
# 获取响应的json文本对象
rep_dic = json.loads(response.text)
# 获取错误码
errcode = rep_dic.get('errcode')
if errcode == 42001:
access_token = get_access_token(true)
api_punch_card_url = 'https://qyapi.weixin.qq.com/cgi-bin/checkin/getcheckindata?access_token=' + access_token
json_str = json.dumps(
{'opencheckindatatype': opencheckindatatype, 'starttime': starttime, 'endtime': endtime,
'useridlist': useridlist})
response = requests.post(api_punch_card_url, data=json_str, verify=false)
rep_dic = json.loads(response.text)
errcode = rep_dic.get('errcode')
if errcode:
raise valueerror('get punch data failed1, errcode=%s' % errcode)
else:
value_str = rep_dic.get('checkindata')
# print(value_str._class_)
if value_str:
return value_str
else:
raise valueerror('get punch data failed2.')
elif errcode:
raise valueerror('get punch data failed3, errcode=%s' % errcode)
# 上面的注释我就不写了,全是报错
# 如果错误码为0的话,就是啥问题也没有
else:
# 获取数据
value_str = rep_dic.get('checkindata')
# 如果获取到的数据不为空
if value_str:
# 返回结果
return value_str
else:
# 报错
raise valueerror('i do not find employee punch data.')
else:
# 报错
raise valueerror('get punch data failed5.')
# 调用接口,获得数据
if __name__ == '__main__':
# 删除本月的打卡记录
delete_this_month_pushcard_data()
# 获取今天凌晨的时间
today = datetime.date.today()
print(today)
# oneday = datetime.timedelta(days=1) # days,即获取几天内的
# 获取昨天凌晨的时间
# yesterday = today - oneday
# print(yesterday)
print(today.strftime('%Y-%m') + '-01' + ' 00:00:00')
# 开始时间的时间戳
starttime = datetime_timestamp(today.strftime('%Y-%m') + '-01' + ' 00:00:00')
# 结束时间的时间戳
endtime = datetime_timestamp(today.strftime('%Y-%m-%d') + ' 00:00:00')
# 获取access_token
access_token = get_access_token()
# 如果获取access_token
if access_token:
# 获取用户账号的数组
useridlist = get_userid_list()
# 如果数组不为空
if useridlist:
# print("11")
# delete_this_month_pushcard_data()
# 已100次作为一组,因为返回的数组数量的上线为100
step = 100
# 获取用户数组的长度
total = len(useridlist)
# 计算要循环的次数
n = math.ceil(total / step)
# 遍历
for i in range(n):
# 打印遍历的用户账号的列表
print(useridlist[i * step:(i + 1) * step])
# 获取用户的打卡数据
punch_card = get_punchcard_info(access_token, 3, starttime, endtime,
useridlist[i * step:(i + 1) * step])
# 如果有打卡数据
if punch_card:
# 获取与数据库的连接
conn = get_link_server()
# 获取游标
cursor = conn.cursor()
# 遍历获取到的打卡数据
for dic_obj in punch_card:
# 获取一条打卡数据的json文本
json_data = json.loads(json.dumps(dic_obj))
# 拼接sql
sql = "insert into EW_PUSH_CARD_RECORD (userid,groupname,checkin_type,exception_type," \
"checkin_time,location_title,location_detail," \
"wifiname,notes,wifimac,deviceid,inputtime) values ('"
sql = sql + json_data["userid"] + "','" + json_data["groupname"] + "','" + json_data[
"checkin_type"] + "','" + json_data["exception_type"] + "','"
sql = sql + time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(int(json_data["checkin_time"])))
sql = sql + "','" + json_data["location_title"] + "','" + json_data["location_detail"] + "','"
sql = sql + json_data["wifiname"] + "','" + json_data["notes"] + "','" \
+ str(json_data["wifimac"]) \
+ "','" + json_data["deviceid"] + "','" + time.strftime("%Y-%m-%d %H:%M:%S",
time.localtime(
int(time.time()))) + "')"
# 把拼接好的sql打印出来
print(sql)
# 执行sql
cursor.execute(sql)
# 提交事务
conn.commit()
# 关闭与数据库的连接
conn.close()
else:
# 报错
raise valueerror('没有获取到用户账号数组')