本文将略过数据库创建及flask使用等过程,直接进入数据查询返回逻辑中。
flask-SQLAlchemy扩展中,数据库操作详见:http://docs.jinkan.org/docs/flask-sqlalchemy
user_count = User.query.filter(User.is_admin == False).count()
前提:用户表创建时有create_time字段用于记录创建时间。
import time
from datetime import datetime
...
# 当前时间
now = time.localtime()
# 本年度年初时间字符串格式:"2019-01-01"
year_begin_str = "%d-01-01" % now.tm_year # type:str
# 本年开始时间----->now.tm_year:01:01 00:00:00,其中datetime.striptime()是将字符串格式的时间转为datetime日期格式,最终year_begin_date类型为datetime:2019-01-01,默认00:00:00
year_begin_date = datetime.strptime(year_begin_str, '%Y-%m-%d')
# 数据库中查询年新增用户数,过滤条件为:不是管理员,且用户创建时间大于等于本年度开始时间
year_count = User.query.filter(User.is_admin == False, User.create_time >= year_begin_date).count()
...
------- 中间代码块:断点到now处:显示的是一个时间结构的类:
time.struct_time(tm_year=2019, tm_mon=5, tm_mday=19, tm_hour=20, tm_min=36, tm_sec=42, tm_wday=6, tm_yday=139, tm_isdst=0)
可以通过now.tm_year这种方式取到当前的年份。
同理,now.tm_mon可以取到当前的月份
# 当前时间
now = time.localtime()
# 当月开始时间(当前年/当前月/1号,不指定时分秒默认00:00:00),此时仍为字符串格式,%02d表示整数不足两位前面补0
mon_begin_str = '%d-%02d-01' % (now.tm_year, now.tm_mon)
# 将当月开始时间由str格式转为datetime格式
mon_begin_date = datetime.strptime(mon_begin_str , '%Y-%m-%d')
# 月新增用户数查询条件:不为管理员且用户创建时间大于等于当月开始时间
mon_count = User.query.filter(User.is_admin == False, User.create_time >= mon_begin_date).count()
now.tm_mday可以取到当天是几号
# 当前时间
now = time.localtime()
# 开始时间,str格式的时间字符串:"当前年-当前月-当天 00:00:00"
day_begin_str = "%d-%02d-%02d" % (now.tm_year, now.tm_mon, now.tm_mday)
# 将str格式的时间转为datetime格式的日期时间:str---> datetime xxxx-xx-xx 00:00:00
day_begin_date = datetime.strptime(day_begin_str, '%Y-%m-%d')
# 日新增用户数查询条件:不为管理员且用户创建时间大于等于当日开始时间
day_count = User.query.filter(User.is_admin == False, User.create_time >= day_begin_date).count()
# 查询图表信息
# 获取到当天00:00:00时间,且将(datetime类型)转str类型
# datetime.now()打印出来为datetime格式:2019-05-19 21:16:14.171340,但我们需要取到00:00:00点,所以需要将datetime格式先利用datetime.strftime(格式表达式)转为str格式:"2019-05-19",不指定时分秒就默认为00:00:00
current_time = datetime.now().strftime("%Y-%m-%d")
# 将年月日的str类型再转datetime类型,'2019-05-18'---> 2019-05-18 00:00:00
now_date = datetime.strptime(current_time, "%Y-%m-%d")
# 定义空列表保存活跃日期(取最近一个月的日期)和活跃数(最近登录时间在当天时段内)
active_date = []
active_count = []
# 遍历倒推一个月的活跃用户数,当天活跃数=最后一次登陆时间在当天零点开始到第二天零点之前的数据库查询结果
for i in range(0, 31):
# 开始日期,当天0点
begin_date = now_date - timedelta(days=i)
# 表示下一天的0点
end_date = now_date - timedelta(days=i-1)
# 时间格式转换,由datetime:2019-05-18 00:00:00 ----> str: '2019-05-18',因为前端需要str格式展示
active_date.append(begin_date.strftime("%Y-%m-%d"))
# 活跃用户:不为管理员且最近登录时间大于等于当天0点小于第二天0点
count = User.query.filter(User.is_admin == False, User.last_login >= begin_date, User.last_login <= end_date).count()
active_count.append(count)
# 反转列表,按时间由小到大排序,最近的时间排在后边
active_count.reverse()
active_date.reverse()
# 准备json格式的响应数据返给前端
data = {
"year_count": year_count,
"mon_count": mon_count,
"day_count": day_count,
"total_count": total_count,
"active_date": active_date,
"active_count": active_count
}
# 用到了flask框架的模板返回
return render_template("admin/user_count.html", data=data)
1.新增用户数:用户注册(创建)时间在指定时间之后,即创建时间大于指定查询的时间。
2.用户活跃数:用户最近一次登录时间介于某两个时刻之间查询到的总数。
3.常用模块之datetime模块可参考csdn各位大神博客之一:https://blog.csdn.net/z_xiaochuan/article/details/81324367