ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

基于flask实现图书管理系统

2022-05-03 11:04:00  阅读:247  来源: 互联网

标签:username log 管理系统 flask db cursor user password 图书


前言

之前在学习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 user (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的历程作为见证,同时如果有幸遇到开发大佬看见希望轻喷

标签:username,log,管理系统,flask,db,cursor,user,password,图书
来源: https://www.cnblogs.com/icui4cu/p/16217855.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有