python-flask框架-mysql-月新增用户数、当月活跃用户数等的查询及返回数据的逻辑

总用户数、年新增用户、月新增用户、用户活跃度等数据统计实现(主要分析后端python代码实现)

1.需求分析

  • 展示当前总用户数,月新增用户数,日活跃用户数
  • 使用图表的形式展示活跃曲线

2.开发工具

  • 前端:使用 Echarts库,开发者可以创建直观的、可自定义的交互式图表,让数据的展示和分析变得十分容易。(前端实现过程本文略过)
  • 后端:python3.0,flask框架
  • 开发软件:pycharm

3.实现准备

模块 flask、SQLAlchemy、time、datatime

本文将略过数据库创建及flask使用等过程,直接进入数据查询返回逻辑中。
flask-SQLAlchemy扩展中,数据库操作详见:http://docs.jinkan.org/docs/flask-sqlalchemy

4.分析实现过程

4.1 总用户数

  • 前提:已有用户模型User,及对应的用户表名user, is_admin表示是否是管理员
user_count = User.query.filter(User.is_admin == False).count()

4.2 年新增用户

前提:用户表创建时有create_time字段用于记录创建时间。

  • 年新增数:获取到本年第1天0点0分0秒的时间对象,然后查询创建时间比其大的所有数据

    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这种方式取到当前的年份。

4.3 月新增用户

同理,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()
   

4.4 日新增用户

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()

4.5 查询日活跃用户、近一个月日期(得到这两组数据,返给前端,图表展示出来)

  • 前提:用户表有last_login字段,用于记录用户最近一次登录时间
  • timedelta :timedalte 是datetime中的一个对象,该对象表示两个时间的差值
  • 构造函数:datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)
	# 查询图表信息
    #  获取到当天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)

5.总结

  • 1.新增用户数:用户注册(创建)时间在指定时间之后,即创建时间大于指定查询的时间。

  • 2.用户活跃数:用户最近一次登录时间介于某两个时刻之间查询到的总数。

  • 3.常用模块之datetime模块可参考csdn各位大神博客之一:https://blog.csdn.net/z_xiaochuan/article/details/81324367

你可能感兴趣的:(flask框架)