Flask小demo---代码统计系统
Posted weihengblog
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Flask小demo---代码统计系统相关的知识,希望对你有一定的参考价值。
功能要求:
管理员登录 # 第一天
班级管理 # 第一天
学生管理 # 第一天
学生登录
上传代码(zip文件和.py文件)
查看个人提交记录列表
highchar统计
学生列表上方使用柱状图展示现班级所有人代码总数
学生提交记录列表上方使用折线图展示所有的提交记录
参考表结构(mysql+pymysql):
管理员表
ID 用户名 密码 邮箱
班级表
ID 班级名称
学生表
ID 学生姓名 班级ID
提交记录表
ID 学生ID 提交日期 代码行数
创建数据库语句
create database statisticalrow; use statisticalrow create table manager( id int primary key auto_increment, name char(32) not null, password char(32) not null, email varchar(30) not null); create table student( id int primary key auto_increment, name char(20) not null, password char(32) not null, class_id int, foreign key(class_id) references class(id)); create table class( id int primary key auto_increment, classname char(40) not null); create table recordchart( id int primary key auto_increment, stu_id int, put_date datetime not null, row_count int not null);
代码(没有使用blueprint):
import os import zipfile from datetime import datetime from functools import wraps import pymysql from pymysql.err import IntegrityError from flask import Flask,render_template,request,redirect,session # 1.建立数据库连接 conn = pymysql.connect( host="127.0.0.1", port=3306, user="root", password="123456", database="statisticalrow" ) # 2. 生成游标 cursor = conn.cursor() # 上传文件路径 PROJECT_DIR = os.getcwd() UPLOAD_FOLDER = ‘uploads/demo/‘ ALLOWED_EXTENSIONS = set([‘txt‘, ‘py‘, ‘zip‘, ‘html‘, ‘js‘, ‘css‘]) app = Flask(__name__) app.secret_key = ‘salt‘ def islogin(func): @wraps(func) def inner(*args,**kwargs): if not session.get(‘username‘): return redirect(‘/login‘) ret = func(*args,**kwargs) return ret return inner def auth(func): @wraps(func) def inner(*args, **kwargs): userIdentity = session.get(‘userIdentity‘) if not session.get(‘username‘): return redirect(‘/login‘) if not userIdentity: return redirect(‘/login‘) if userIdentity != 1: return redirect(‘/authwrong‘) ret = func(*args, **kwargs) return ret return inner @app.route(‘/login‘,methods=["GET","POST"]) def login(): if request.method == ‘GET‘: return render_template("login.html") else: username = request.form.get("username") password = request.form.get("password") userIdentity = 0 # 3. 执行sql # sql = "select * from student where name = ‘%s‘ and password = ‘%s‘;"%(username,password) # sql = ‘select * from userinfo where name = %s and pwd=%s;‘ sql = "select * from student where name = %s and password = %s;" ret = cursor.execute(sql,[username,password]) if not ret: sql = "select * from manager where name = %s and password = %s;" ret = cursor.execute(sql, [username, password]) if not ret: context = { "msg": "用户名或密码错误" } username="" password="" userIdentity = 0 return render_template(‘login.html‘,**context) userIdentity = 1 #老师 else: userIdentity = 2 #学生 # 将用户信息放入cookie和session session[‘username‘] = username if userIdentity == 2: cursor.execute("select classname from class where id = (select class_id from student where name = ‘%s‘);"%(username)) session[‘coursename‘] = str(cursor.fetchone()[0]) session[‘userIdentity‘] = userIdentity # print( "学生" if userIdentity == 2 else "老师") return redirect("/index") #查看所有班级 @app.route("/showclass") @auth def showClass(): sql = "select * from class" cursor.execute(sql) all_data = cursor.fetchall() return render_template("showclass.html",all_data=all_data) @app.route("/editclass",methods=["GET","POST"]) @auth def editClass(): if request.method == "GET": class_id = request.args.get("class_id") sql = "select * from class where id = %s"%(class_id) cursor.execute(sql) class_data = cursor.fetchall()[0] return render_template("editclass.html",class_data=class_data) if request.method == "POST": class_id = request.form.get("class_id") classname = request.form.get("classname") sql = "update class set classname = ‘%s‘ where id = %s" % (classname,class_id) cursor.execute(sql) # 注意:保存结果 conn.commit() return redirect("/showclass") @app.route("/addclass",methods=["GET","POST"]) @auth def addClass(): if request.method == "GET": return render_template("addclass.html") classname = request.form.get("classname") sql = "insert into class (classname) values (‘%s‘)"%(classname) cursor.execute(sql) # 注意:保存结果 涉及操作都要提交 conn.commit() return redirect("/showclass") @app.route("/delclass") @auth def delClass(): class_id = request.args.get("class_id") sql = "delete from class where id=%s;"%(class_id) cursor.execute(sql) # 注意:保存结果 涉及操作都要提交 conn.commit() return redirect("/showclass") #学生管理 @app.route("/showstu") @auth def showStu(): sql = "select * from student" cursor.execute(sql) all_data = cursor.fetchall() #((1, ‘wei‘, 1, ‘123‘), (2, ‘heng‘, 2, ‘123‘), (3, ‘hengheng‘, 3, ‘123‘)) stu_data = [] for item in all_data: sql = "select classname from class where id=%s"%(item[2]) cursor.execute(sql) classname = cursor.fetchone()[0] stu_data.append((item[0],item[1],classname,item[3])) return render_template("showStu.html",all_data=stu_data) @app.route("/editstu",methods=["GET","POST"]) @auth def editStu(): if request.method == "GET": stu_id = request.args.get("stu_id") sql = "select * from student where id = %s"%(stu_id) cursor.execute(sql) stu_data = cursor.fetchall()[0] classsql = "select * from class" cursor.execute(classsql) class_data = cursor.fetchall() context = { "stu_data":stu_data, "class_data":class_data, } return render_template("editstu.html",**context) if request.method == "POST": stu_id = request.form.get("stu_id") classinfo = request.form.get("classinfo") sql = "update student set class_id = ‘%s‘ where id = %s" % (classinfo,stu_id) cursor.execute(sql) # # 注意:保存结果 conn.commit() return redirect("/showstu") @app.route("/addstu",methods=["GET","POST"]) @auth def addStu(): if request.method == "GET": #获取所有的班级 classsql = "select * from class" cursor.execute(classsql) class_data = cursor.fetchall() context = { "class_data": class_data, } return render_template("addstu.html",**context) username= request.form.get("username") password = request.form.get("password") classinfo = request.form.get("classinfo") sql = "insert into student(name,class_id,password) values (‘%s‘,‘%s‘,‘%s‘)"%(username,classinfo,password) cursor.execute(sql) conn.commit() return redirect(‘/showstu‘) @app.route("/delstu") @auth def delStu(): stu_id = request.args.get("stu_id") sql = "delete from student where id = ‘%s‘"%(stu_id) cursor.execute(sql) conn.commit() return redirect(‘/showstu‘) @app.route(‘/index‘) @islogin def index(): # 判断是学生,还是老师 # 如果是学生,重定向到 /stuindex userIdentity = session.get(‘userIdentity‘) if userIdentity == 1: return redirect(‘/manindex‘) elif userIdentity == 2: return redirect(‘/stuindex‘) else: return redirect(‘/login‘) @app.route(‘/stuindex‘,methods=["GET","POST"]) @islogin def stuindex(): if request.method == "GET": return render_template("stuindex.html") classname = session.get(‘coursename‘) username = session.get(‘username‘) file = request.files[‘file‘] #ALLOWED_EXTENSIONS filename = file.filename if not filename.split(".")[1] in ALLOWED_EXTENSIONS: return "文件类型错误" path = PROJECT_DIR + os.sep + UPLOAD_FOLDER os.chdir(path) path = os.getcwd() + os.sep + classname + os.sep + username if not os.path.exists(path): os.makedirs(classname + os.sep + username) save_path = os.path.join(path, filename) # f = open(save_path, ‘wb‘) with open(save_path,‘wb‘) as f: file.save(f) # ret = file.save(f) # 判断是否是zip包 if filename.split(".")[1] == "zip": # # 将zip包解压 print(filename) zippath = path + os.sep + filename os.chdir(path + os.sep) zipFile = zipfile.ZipFile(""+ filename +"", mode="r") if not os.path.exists(os.getcwd() + os.sep + filename.split(".")[0]): os.makedirs(os.getcwd() + os.sep + filename.split(".")[0]) os.chdir(os.getcwd() + os.sep + filename.split(".")[0]) for name in zipFile.namelist(): utf8name = name.encode(‘cp437‘).decode(‘gbk‘) # print("Extracting" + utf8name) pathname = os.path.dirname(utf8name) if not os.path.exists(pathname) and pathname != "": os.makedirs(pathname) data = zipFile.read(name) if not os.path.exists(utf8name): fo = open(utf8name, "wb") fo.write(data) fo.close() count = 1 for dirpath, dirnames, filenames in os.walk(os.getcwd()): for filepath in filenames: filepath = os.path.join(dirpath, filepath) print(filepath) with open(filepath, ‘rb‘) as f: for line in f.readlines(): print(line) count = count + 1 stu_id = 0 put_date = "" sql = "select id from student where name = ‘%s‘"%(username) cursor.execute(sql) stu_id = cursor.fetchone()[0] put_date = datetime.strptime(‘Apr-16-2017 21:01:35‘, ‘%b-%d-%Y %H:%M:%S‘) # sql = "select * from student where name = %s and password = %s;" # ret = cursor.execute(sql, [username, password]) try: sql2 = "insert into recordchart (stu_id, put_date, row_count) values (%s,%s,%s);" cursor.execute(sql2,[stu_id,put_date,count]) conn.commit() except IntegrityError as e: msg = "今日已提交!" context={ "msg":msg, "tag":2 } return render_template("wrong.html",**context) return "上传成功!,demo行数:" + str(count) count = 0 with open(save_path, ‘r‘) as f: for line in f.readlines(): count = count + 1 return "上传成功!,demo行数:" + str(count) @app.route(‘/manindex‘) @islogin def manindex(): return "老师主页" @app.route(‘/authwrong‘) def authwrong(): msg = "权限不足" context = { "msg": msg, "tag": 1 } return render_template("wrong.html",**context) @app.route(‘/loginout‘) def loginout(): del session[‘username‘] return "删除成功" if __name__ == "__main__": app.run()
以上是关于Flask小demo---代码统计系统的主要内容,如果未能解决你的问题,请参考以下文章