# -*- coding: utf8 -*-
#--导入常用的python包
import os
import datetime
from flask import Blueprint, render_template, abort, request, jsonify
#--访问mongoDB
from database import mongo
#--采用Flask的Blueprint模版组织页面结构
pages_api_res = Blueprint("pages_api_res", __name__, template_folder="templates")
'''
---api所响应的url:http://moocbd.1024cloud.com/api/res_general
---接受的方法:GET、POST
---作用:查询大数据资源的概况信息,
POST时返回Json格式的记录文件数、课程数、课程学习统计量、学习者个数
等信息,GET时返回测试api的html页面
'''
@pages_api_res.route("/api/res_general", methods=['GET','POST'])
def api_res_general():
# 当api的调用方法为GET时,返回测试页面
if request.method=='GET':
return render_template("api/res_general.html")
ret = {'success':True, 'last_update':datetime.date.today().strftime('%Y-%m-%d')}
# 获取原始记录文件的个数
data = os.listdir('/data/logs/')
ret['count_rawfiles'] = len(data)
# 获取过滤后的记录文件的个数
data = os.listdir('/data/learn/')
ret['count_logfiles'] = len(data)
# 获取课程的个数
data = os.listdir('/data/typelogs/courses/')
ret['count_courses'] = len(data)
# 获取所有课程的记录文件总数
count = 0
for r,p,f in os.walk('/data/typelogs/courses/'):
count += len(f)
ret['count_courselogs'] = count
# 获取学习者的相关记录个数
data = os.listdir('/data/typelogs/learners/')
ret['count_learners'] = len(data)
# 获取所有学习者的记录文件总数
count = 0
for r,p,f in os.walk('/data/typelogs/learners/'):
count += len(f)
ret['count_learnerlogs'] = count
# 利用jsonify模块规范返回数据的格式
return jsonify(ret)
'''
---api所响应的url:http://moocbd.1024cloud.com/api/sys_uv_day
---接受的方法:GET、POST
---作用:独立访客的数量统计,
POST时返回Json格式的给定时段内的每日独立访客数量,GET时返回测试ap
i的html页面
'''
@pages_api_sys.route("/api/sys_uv_day", methods=['GET','POST'])
def api_sys_uv_day():
# 当api的调用方法为GET时,返回测试页面
if request.method=='GET':
return render_template("api/sys_uv_day.html")
idx = request.form.get('idx')
if idx not in ['uv_stu','uv_stu_list','uv_course','uv_course_list','uv_cid','uv_rid']:
abort(404)
# 获取提交的时段信息
ds = request.form.get('ds')
de = request.form.get('de')
rs = mongo.db.sys_uv_day \
.find({'date':{'$gte':ds, '$lte':de}}, {idx:1, 'date':1}) \
.sort([('date', 1)])
# 使用json格式保存数据库查询结果
ret = {'success':True, 'days':[], 'vals':[], 'idx':idx, 'ds':ds, 'de':de}
for r in rs:
ret['days'].append(r['date'])
ret['vals'].append(r[idx])
# 利用jsonify模块规范返回数据的格式
return jsonify(ret)
'''
---api所响应的url:http://moocbd.1024cloud.com/api/sys_tv_day
---接受的方法:GET、POST
---作用:用户行为统计,
POST时返回Json格式的给定时段内的用户选中课程、播放课程、暂停课程
、浏览课程等操作次数,GET时返回测试api的html页面
'''
@pages_api_sys.route("/api/sys_tv_day", methods=['GET','POST'])
def api_sys_tv_day():
# 当api的调用方法为GET时,返回测试页面
if request.method=='GET':
return render_template("api/sys_tv_day.html")
idx = request.form.get('idx')
if idx not in ['stackedoper', 'tv_alloper','tv_oper_selectchapter',\
'tv_oper_clickres', 'tv_oper_view', 'tv_oper_play', 'tv_oper_pause']:
abort(404)
# 获取提交的时段信息
ds = request.form.get('ds')
de = request.form.get('de')
# A special case
if idx == 'stackedoper':
stackedopers = ['tv_oper_selectchapter', 'tv_oper_clickres', \
'tv_oper_view', 'tv_oper_play', 'tv_oper_pause']
tmp = {}
for o in stackedopers: tmp[o] = {'name': o, 'data':[]}
rs = mongo.db.sys_tv_day \
.find({'date':{'$gte':ds, '$lte':de}}) \
.sort([('date', 1)])
ret = {'success':True, 'days':[], 'opers':stackedopers, 'vals':[], \
'idx':idx, 'ds':ds, 'de':de}
for r in rs:
ret['days'].append(r['date'])
for oper in stackedopers:
tmp[oper]['data'].append(r[oper])
ret['vals'] = tmp.values()
return jsonify(ret)
# General case
rs = mongo.db.sys_tv_day \
.find({'date':{'$gte':ds, '$lte':de}}, {idx:1, 'date':1}) \
.sort([('date', 1)])
# 使用json格式保存数据库查询结果
ret = {'success':True, 'days':[], 'vals':[], 'idx':idx, 'ds':ds, 'de':de}
for r in rs:
ret['days'].append(r['date'])
ret['vals'].append(r[idx])
# 利用jsonify模块规范返回数据的格式
return jsonify(ret)
'''
---api所响应的url:http://moocbd.1024cloud.com/api/sys_geo_day
---接受的方法:GET、POST
---作用:按地域的用户访问次数统计,
POST时返回Json格式的给定时段内的各省份的访问次数,GET时返回测试ap
i的html页面
'''
@pages_api_sys.route("/api/sys_geo_day", methods=['GET','POST'])
def api_sys_geo_day():
# 当api的调用方法为GET时,返回测试页面
if request.method=='GET':
return render_template("api/sys_geo_day.html")
idx = request.form.get('idx')
if idx not in ['stu','evt']:
abort(404)
# 从数据库中读取数据
ds = request.form.get('ds')
de = request.form.get('de')
rs = mongo.db.sys_geo_day \
.find({'date':{'$gte':ds, '$lte':de}}) \
.sort([('date', 1)])
ret = {'success':True, 'days':[], 'idx':idx, 'ds':ds, 'de':de, 'vals':[]}
for r in rs:
ret['days'].append(r['date'])
tmp = [{'name':loc.split()[-1], 'value':r['geo'][loc][idx]} for loc in r['geo']]
ret['vals'].append({'date':r['date'], 'data':tmp})
# 利用jsonify模块规范返回数据的格式
return jsonify(ret)
'''
---api所响应的url:http://moocbd.1024cloud.com/api/sys_cid_day
---接受的方法:GET、POST
---作用:章节访问情况,
POST时返回Json格式的给定课程章节给定日期内的访问量,GET时返回测试
api的html页面
'''
@pages_api_sys.route("/api/sys_uv_day", methods=['GET','POST'])
def api_sys_uv_day():
# 当api的调用方法为GET时,返回测试页面
if request.method=='GET':
return render_template("api/sys_uv_day.html")
idx = request.form.get('idx')
if idx not in ['uv_stu','uv_stu_list','uv_course','uv_course_list','uv_cid','uv_rid']:
abort(404)
# 获取提交的时段信息
ds = request.form.get('ds')
de = request.form.get('de')
rs = mongo.db.sys_uv_day \
.find({'date':{'$gte':ds, '$lte':de}}, {idx:1, 'date':1}) \
.sort([('date', 1)])
# 使用json格式保存数据库查询结果
ret = {'success':True, 'days':[], 'vals':[], 'idx':idx, 'ds':ds, 'de':de}
for r in rs:
ret['days'].append(r['date'])
ret['vals'].append(r[idx])
# 利用jsonify模块规范返回数据的格式
return jsonify(ret)
'''
---api所响应的url:http://moocbd.1024cloud.com/api/user_freq_avg
---接受的方法:GET、POST
---作用:学习者的平均访问周期,
POST时返回Json格式的根据所有用户统计得到的平均访问周期,GET时返回
测试api的html页面
'''
@pages_api_user.route("/api/user_freq_avg", methods=['GET','POST'])
def api_user_freq_avg():
# 当api的调用方法为GET时,返回测试页面
if request.method=='GET':
return render_template("api/user_freq_avg.html")
today = datetime.datetime.today()
r = mongo.db.user_freq_avg.find_one({'date':today.strftime('%Y-%m-%d')})
# 从数据库中读取数据
vals = [ u['fa'] for u in r['freq_avg_list'] ]
vals.sort()
v_y = vals
v_x = range(1, len(vals)+1)
ret = {'success':True, 'idx':'user_freq_avg', 'date': today.strftime('%Y-%m-%d'),\
'vals': zip(v_x, v_y) }
# 利用jsonify模块规范返回数据的格式
return jsonify(ret)
'''
---api所响应的url:http://moocbd.1024cloud.com/api/user_freq_hist
---接受的方法:GET、POST
---作用:学习者的访问周期的分布统计,
POST时返回Json格式的根据所有用户的访问周期分布统计结果,GET时返回
测试api的html页面
'''
@pages_api_user.route("/api/user_freq_hist", methods=['GET','POST'])
def api_user_freq_hist():
# 当api的调用方法为GET时,返回测试页面
if request.method=='GET':
return render_template("api/user_freq_hist.html")
today = datetime.datetime.today()
r = mongo.db.user_freq_avg.find_one({'date':today.strftime('%Y-%m-%d')})
# 从数据库中读取数据
vals = [ u['fa'] for u in r['freq_avg_list'] ]
# Hist the values
hist = np.histogram(vals, range(1,)+[, 1000])
h_y = list(hist[0])
h_x = list(hist[1][:-1])
ret = {'success':True, 'idx':'user_freq_hist', 'date': today.strftime('%Y-%m-%d'),\
'cats':h_x, 'vals':h_y }
# 利用jsonify模块规范返回数据的格式
return jsonify(ret)
'''
---api所响应的url:http://moocbd.1024cloud.com/api/user_freq_bydays
---接受的方法:GET、POST
---作用:学习者的平均访问周期与访问天数的关系,
POST时返回Json格式的根据所有用户的平均访问周期与访问天数统计结果
,GET时返回测试api的html页面
'''
@pages_api_user.route("/api/user_freq_bydays", methods=['GET','POST'])
def api_user_freq_bydays():
# 当api的调用方法为GET时,返回测试页面
if request.method=='GET':
return render_template("api/user_freq_bydays.html")
today = datetime.datetime.today()
r = mongo.db.user_freq_avg.find_one({'date':today.strftime('%Y-%m-%d')})
# 从数据库中读取数据
vals = [ u['fa'] for u in r['freq_avg_list'] ]
days = [ u['ds'] for u in r['freq_avg_list'] ]
ret = {'success':True, 'idx':'user_freq_bydays', 'date': today.strftime('%Y-%m-%d'),\
'vals': zip(days,vals) }
# 利用jsonify模块规范返回数据的格式
return jsonify(ret)