基于flask实现图书管理系统

前言

之前在学习flask时写了一个登录框,虽然实现了可视化登录,但是总感觉未完成,刚好有个朋友委托我写一个课设,我看要不直接就当练习全写了,所以就有如下图书管理系统。晚辈学艺不精,还请各位开发大佬多多指教

正文

功能

1.一个登录框,具备创建用户,并判断是否存在或者用户重名并插入数据库

2.登录后跳转用户查询界面并正常登出

3.利用flask的路由绑定,避免显示文件后缀,同时对没有路由的页面做404处理

4.有管理员专门的登录窗口,进去后进入管理员界面

5.管理员界面拥有查询图书、删除图书、修改图书、增加图书的功能

使用配置

1.通过phpstudy建立mysql数据库,我使用的是5.7.26版本,用户名和密码都是root

2.创建用户、管理员、图书表,并插入数据

3.开放5000端口

数据库预配置

# 创建用户/管理员数据库
create database www;
use www;
create table users (username varchar(100) not null,password varchar(100) not null);
create table administrator (username varchar(100) not null,password varchar(100) not null);

# 预设管理员账密,admin/admin,密码md5加密
insert into administrator values('admin','21232f297a57a5a743894a0e4a801fc3');

# 创建图书数据库
create database book_manager charset=utf8;
use book_manager;
CREATE TABLE books(id int UNSIGNED PRIMARY KEY AUTO_INCREMENT ,btitle VARCHAR(30) not NULL ,bauthor VARCHAR(30) NOT NULL ,bperson VARCHAR(30),bpub_date DATE NOT NULL ,bread INT UNSIGNED);

# 插入图书数据
insert into books(btitle, bauthor, bperson, bpub_date, bread) VALUES
('红楼梦','曹雪芹','宝玉','1980-5-1',12),
('西游记','施耐安','悟空','1986-7-24',36),
('水浒传','吴承恩','林冲','1995-12-24',20),
('三国演义','罗贯中','曹操','1980-5-1',58);

main.py主函数

import flask
from flask import *
import pymysql
import hashlib
import json

# 创建Flask程序并定义模板位置
app = Flask(__name__,
            static_url_path='/static',
            static_folder='static',
            template_folder='templates'
            )

# 将所有对主页面的访问都跳转到登录框
@app.route('/', methods=['GET', 'POST'])
def index():
    return flask.redirect(flask.url_for('log_in'))

# 处理普通用户登陆
@app.route('/log_handle', methods=['POST'])
def log_handle():
    find_user = False
    if request.method == 'POST':
        # username和password是前端log_in.html的name字段里的字符
        username = request.form.get('username')
        password = request.form.get('password')
        # 对密码进行md5处理
        encrypass = hashlib.md5()
        encrypass.update(password.encode(encoding='utf-8'))
        password = encrypass.hexdigest()

    # 通过mysql进行存储
    db = pymysql.connect(host="localhost", user="root", password="root", db="www")

    # 创建数据库指针cursor
    cursor = db.cursor()

    sql = "SELECT * FROM users"

    # 执行数据库命令并将数据提取到cursor中
    cursor.execute(sql)
    # 确认命令
    db.commit()
    user_list = []
    for item in cursor.fetchall():
        dict_user = {'username': item[0], 'password': item[1]}
        user_list.append(dict_user)
    # 对数据库中所有的数据进行遍历,找出username
    for i in range(len(user_list)):
        if user_list[i]['username'] == username:
            if user_list[i]['password'] == password:
                find_user = True
                break
            else:
                break

    db.close()
    if not find_user:
        # 登录失败就跳转倒log_fail中并弹窗
        return flask.render_template("log_fail.html")

    else:
        # 登录成功就跳转log_success(用户界面)
        return flask.redirect(flask.url_for('log_success'))

# 处理admin用户的登陆
@app.route("/log_handle_admin", methods=['POST'])
def log_handle_admin():
    find_user = False
    if request.method == 'POST':
        # username和password是前端log_in.html的name字段里的字符
        username = request.form.get('username')
        password = request.form.get('password')
        # 对密码进行md5处理
        encrypass = hashlib.md5()
        encrypass.update(password.encode(encoding='utf-8'))
        password = encrypass.hexdigest()

    # 通过mysql进行存储
    db = pymysql.connect(host="localhost", user="root", password="root", db="www")

    # 创建数据库指针cursor
    cursor = db.cursor()

    sql = "SELECT * FROM administrator"

    # 执行数据库命令并将数据提取到cursor中
    cursor.execute(sql)
    # 确认命令
    db.commit()
    user_list = []
    for item in cursor.fetchall():
        dict_user = {'username': item[0], 'password': item[1]}
        user_list.append(dict_user)
    # 对数据库中所有的数据进行遍历,找出username
    for i in range(len(user_list)):
        if user_list[i]['username'] == username:
            if user_list[i]['password'] == password:
                find_user = True
                break
            else:
                break

    db.close()
    if not find_user:
        # 登录失败就跳转倒log_fail中并弹窗
        return flask.render_template("log_fail_admin.html")

    else:
        # 登录成功就跳转log_success(管理员界面)
        return flask.redirect(flask.url_for('log_success_admin'))

# 处理注册
@app.route('/register_handle', methods=['POST'])
def register_handle():
    if request.method == 'POST':
        username = request.form.get('username')
        password = request.form.get('password')
        confirm_password = request.form.get('confirm_password')
        # 判断两次密码是否正确
        if password == confirm_password:
            # 对密码进行md5处理
            encrypass = hashlib.md5()
            encrypass.update(password.encode(encoding='utf-8'))
            password = encrypass.hexdigest()

            db = pymysql.connect(host="localhost", user="root", password="root", db="www")
            cursor = db.cursor()

            search_sql = "SELECT * FROM users"
            cursor.execute(search_sql)
            db.commit()
            if cursor.fetchall() is None:
                user_list = []
                for item in cursor.fetchall():
                    dict_user = {'username': item[0], 'password': item[1]}
                    user_list.append(dict_user)
                for i in range(len(user_list)):
                    # 判断是否存在相同用户名
                    if user_list[i]['username'] != username:
                        # 将用户名和加密后的密码插入数据库
                        sql = "INSERT INTO users VALUES('%s','%s')" % (username, password)
                        cursor.execute(sql)
                        db.commit()
                    else:
                        have_same_username = 1
                        return flask.render_template("register_fail.html", have_same_username=have_same_username)
            else:
                sql = "INSERT INTO users VALUES('%s','%s')" % (username, password)
                cursor.execute(sql)
                db.commit()
        else:
            two_passwd_wrong = 1
            return flask.render_template("register_fail.html", two_passwd_wrong=two_passwd_wrong)
    db.close()
    return flask.redirect(flask.url_for('log_in'))

@app.route('/log_in', methods=['GET'])
def log_in():
    return render_template('log_in.html')

@app.route('/register', methods=['GET'])
def register():
    return render_template('register.html')

@app.route('/log_success')
def log_success():
    db = pymysql.connect(host="localhost", user="root", password="root", db="book_manager")
    cursor = db.cursor()
    sql = "SELECT * FROM books"
    cursor.execute(sql)
    db.commit()
    data = cursor.fetchall()
    db.close()
    return render_template('log_success.html', show_list=data)

@app.route('/log_success_admin')
def log_success_admin():
    db = pymysql.connect(host="localhost", user="root", password="root", db="book_manager")
    cursor = db.cursor()
    sql = "SELECT * FROM books"
    cursor.execute(sql)
    db.commit()
    data = cursor.fetchall()
    db.close()
    return render_template('log_success_admin.html', show_list=data)

@app.route('/log_in_admin')
def log_in_admin():
    return render_template('log_in_admin.html')

# 获取ajax前端POST请求
@app.route('/books/add', methods=['POST'])
def books_add():
    params_list = []
    btitle = request.form.get('btitle')
    bauthor = request.form.get('bauthor')
    bperson = request.form.get('bperson')
    bpub_date = request.form.get('bpub_date')
    bread = request.form.get('bread')
    params_list.append(btitle)
    params_list.append(bauthor)
    params_list.append(bperson)
    params_list.append(bpub_date)
    params_list.append(bread)

    # 创建Connection连接
    conn = pymysql.connect(host='localhost', port=3306, db='book_manager', user='root', password='root',
                           charset='utf8')
    # 获得Cursor对象
    cs1 = conn.cursor()

    cs1.execute("insert into books(btitle,bauthor,bperson,bpub_date,bread) values(%s,%s,%s,%s,%s)",
                params_list)
    # 得到数据库的数据
    conn.commit()

    # 关闭
    conn.close()
    # 返回json数据
    return Response('{"data": "增加成功!"}')

@app.route("/books/delete", methods=['POST'])
def books_delete():
    # 接收ajax发送的post请求的数据
    body_data = request.get_data()
    # 解析json成字典
    params_dict = json.loads(body_data)

    # 创建Connection连接
    conn = pymysql.connect(host='localhost', port=3306, db='book_manager', user='root', password='root',
                           charset='utf8')
    # 获得Cursor对象
    cs1 = conn.cursor()

    # 执行查询的sql语句
    cs1.execute("delete from books where id = %(id)s", params_dict)

    conn.commit()

    # 关闭
    conn.close()
    # 返回json数据
    return Response('{"data": "删除成功!"}')

@app.route("/books/update", methods=['POST'])
def books_update():
    # 接收ajax发送的post请求的数据
    body_data = request.get_data()
    # 解析json成字典
    params_dict = json.loads(body_data)

    # 创建Connection连接
    conn = pymysql.connect(host='localhost', port=3306, db='book_manager', user='root', password='root',
                           charset='utf8')
    # 获得Cursor对象
    cs1 = conn.cursor()

    cs1.execute(
        "update books set btitle = %(btitle)s,bauthor = %(bauthor)s,bperson = %(bperson)s,bpub_date =%("
        "bpub_date)s,bread = %(bread)s where id = %(id)s",
        params_dict
    )

    conn.commit()

    # 断开连接
    conn.close()

    # 返回json数据
    return Response('{"data": "更新成功!"}')

# 自定义404页面
@app.errorhandler(404)
def page_not_found(error):
    return flask.render_template("404.html"), 404

if __name__ == '__main__':
    # 调试时需要debug=True
    app.run()

总结

篇幅有限,其他HTML、CSS和JS代码都放在GitHub,详细见 https://github.com/Hilbert-art/Flask_BookManagement

之前在写这个课设的时候,对GitHub上一些项目也有参考,实现登录需求的找来找去只找到一个华中科技大学的前辈基于flask写的,但是已经封装好,细节看的不是很清楚,加上其他的代码也看不懂,放在本机有一个很重要的需求也跑不起来,也就作罢。后来发现某个培训机构的公开课有类似的,但是没有登录框,而且管理系统是tornado框架而不是flask开发,我没有学过tornado框架,所以总感觉差点意思。

后来索性不管了,根据自己之前写的flask登录框,在后面添加管理系统,并且尽可能将tornado框架的内容转换成flask进行编写,在经过半天的瞎捣鼓后终于确定方向,一晚上捣鼓出来,也是小有成就感。

该项目作为我学习flask的历程作为见证,同时如果有幸遇到开发大佬看见希望轻喷 😂

posted @ 2022-05-03 10:46  icui4cu  阅读(1216)  评论(0编辑  收藏  举报