zoukankan      html  css  js  c++  java
  • 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()



  • 相关阅读:
    对javascript的一点点认识总结——《javascript高级程序设计》读书笔记
    .Net Garbage Collection学习心得
    上网本重装系统的历程
    让验证控件进行分组验证
    .net应用程序分层的个人认识
    asp.net 4.0的变化(官网链接地址)
    SQL 延时 插入 修改 删除
    SQL 删除前100条 with as
    jQuery RadioButtonList
    网站推广的100个方法
  • 原文地址:https://www.cnblogs.com/weihengblog/p/9368383.html
Copyright © 2011-2022 走看看