• Welcome to the world's largest Chinese hacker forum

    Welcome to the world's largest Chinese hacker forum, our forum registration is open! You can now register for technical communication with us, this is a free and open to the world of the BBS, we founded the purpose for the study of network security, please don't release business of black/grey, or on the BBS posts, to seek help hacker if violations, we will permanently frozen your IP and account, thank you for your cooperation. Hacker attack and defense cracking or network Security

    business please click here: Creation Security  From CNHACKTEAM

Recommended Posts

前言

在学习flask之前,我写了一个登录框。虽然实现了可视化登录,但总觉得意犹未尽。刚好有个朋友委托我写一个课程。我觉得应该写成一个练习,所以有了下面这个图书管理系统。年轻一代不善于学习技能,请开发大佬们给我指点迷津。

正文

功能

1.一个登录框,具有创建用户,判断用户是否存在或同名并插入数据库的功能。

2.登录后,跳转到用户查询界面,正常注销

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

4.管理员有一个特殊的登录窗口。进入后,进入管理员界面。

5.管理员界面具有图书查询、图书删除、图书修改、图书添加等功能。

使用配置

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

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

3.开放5000个端口

数据库预配置

#创建用户/管理员数据库

创建数据库www

使用www

创建表用户(用户名varchar(100)不为空,密码varchar(100)不为空);

创建表管理员(用户名varchar(100)不为空,密码varchar(100)不为空);

#预设管理员帐户密码,admin/admin,密码md5加密

插入到管理员值中(' admin ',' 21232 f 297 a 57 a5a 743894 a 0 E4 a 801 fc 3 ');

#创建图书数据库

创建数据库book _ manager charset=utf8

使用book _ manager

创建表书(id int无符号主键AUTO_INCREMENT,btitle VARCHAR(30)不为空,bauthor VARCHAR(30)不为空,bperson VARCHAR(30),bpub_date日期不为空,bread INT无符号);

#插入图书数据

插入到图书中(btitle,bauthor,bperson,bpub_date,bread)值

(《红楼梦》,《曹雪芹》,《宝玉》,《1980年5月1日》,第12期),

(《西游记》,《施耐庵》,《悟空》,《1986年7月24日》,36),

(《水浒传》,《吴承恩》,《林冲》,《1995年12月24日》,第20页),

(《三国演义》,《罗贯中》,《曹操》,《1980年5月1日》,58);

main.py主函数

进口烧瓶

从烧瓶进口*

导入pymysql

导入hashlib

导入json

#创建一个烧瓶程序并定义模板位置

app=Flask(__name__,

static_url_path='/static ',

static _ folder=“static”,

template_folder='模板'

)

#将所有对主页面的访问跳转到登录框

@app.route('/',methods=['GET ',' POST'])

定义索引():

返回flask . redirect(flask . URL _ for(' log _ in '))

#处理普通用户的登录

@app.route('/log_handle ',methods=['POST'])

定义日志句柄():

find_user=False

if request.method=='POST':

#用户名和密码是前端log_in.html的名称字段中的字符

用户名=request.form.get('用户名')

password=request . form . get(' password ')

# md5处理密码

encrypass=hashlib.md5()

encrypass . update(password . encode(编码='utf-8 '))

password=encrypass.hexdigest()

#通过我的

sql进行存储 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['username'] == username: if user_list['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['username'] == username: if user_list['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['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的历程作为见证,同时如果有幸遇到开发大佬看见希望轻喷

Link to comment
Share on other sites