当前位置:   article > 正文

flask实现简易图书管理系统_python+htm+flaskl前后端交互的图书馆管理系统代码

python+htm+flaskl前后端交互的图书馆管理系统代码

项目结构

技术选型

flask 做后端, 提供数据和渲染html
暂时没有提供mysql, 后续会更新操作mysql和样式美化的版本

起一个flask服务

flask是python的一个web框架, 下面演示如何提供http接口, 并返回json数据

main.py

  1. # flask创建http接口
  2. from flask import Flask, request, jsonify,render_template
  3. # 支持flask跨域
  4. from flask_cors import CORS
  5. # 创建flask服务
  6. app = Flask(__name__)
  7. CORS(app, resources=r'/*') # 注册CORS, "/*" 允许访问域名所有api
  8. # 首页
  9. @app.route('/',methods=['get'])
  10. def index():
  11. # 自动在templates里找对应名称的文件
  12. return jsonify({"msg":"hello"})
  13. if __name__ == "__main__":
  14. # 运行web服务
  15. app.run(host='0.0.0.0', port=10086)
此时打开终端, 运行

python main.py
打开浏览器, 输入 http://localhost:10086/

渲染模板

flask可以渲染html文件(自动往项目根目录的templates里找), 并往里面填数据

main.py

  1. # flask创建http接口
  2. from flask import Flask, request, jsonify,render_template
  3. # 支持flask跨域
  4. from flask_cors import CORS
  5. # 创建flask服务
  6. app = Flask(__name__)
  7. CORS(app, resources=r'/*') # 注册CORS, "/*" 允许访问域名所有api
  8. # 首页
  9. @app.route('/',methods=['get'])
  10. def index():
  11. # 自动在templates里找对应名称的文件
  12. return render_template('index.html',msg="hello world")
  13. if __name__ == "__main__":
  14. # 运行web服务
  15. app.run(host='0.0.0.0', port=10086)

index.html

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. </head>
  9. <body>
  10. {{msg}}
  11. </body>
  12. </html>

浏览器

用对象数组来存放图书数据

main.py

通过模板渲染传递books到html里
  1. # flask创建http接口
  2. from flask import Flask, request, jsonify,render_template
  3. # 支持flask跨域
  4. from flask_cors import CORS
  5. # 创建flask服务
  6. app = Flask(__name__)
  7. CORS(app, resources=r'/*') # 注册CORS, "/*" 允许访问域名所有api
  8. # 暂时代替数据库
  9. books = [
  10. {
  11. "id":'1',
  12. "name":"hello world",
  13. "author":"迭名",
  14. "desc": "程序员入门第一本书",
  15. "price": 11.99
  16. },
  17. {
  18. "id":'2',
  19. "name":"0基础学it",
  20. "author":"xx程序员",
  21. "desc": "某培训机构精心出品教程",
  22. "price": 99.98
  23. },
  24. ]
  25. # 首页
  26. @app.route('/',methods=['get'])
  27. def index():
  28. # 自动在templates里找对应名称的文件
  29. return render_template('index.html',books=books)
  30. if __name__ == "__main__":
  31. # 运行web服务
  32. app.run(host='0.0.0.0', port=10086)

index.html

html接收flask后端传来的数据, 渲染到table里
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. </head>
  9. <!-- 加样式,居中 -->
  10. <style>
  11. * {
  12. margin: 0 auto;
  13. }
  14. </style>
  15. <body>
  16. <br>
  17. <table border="1">
  18. <thead>
  19. <tr>
  20. <th>书名</th>
  21. <th>作者</th>
  22. <th>描述</th>
  23. <th>价格</th>
  24. <th>操作</th>
  25. </tr>
  26. </thead>
  27. <tbody>
  28. {% for book in books %} {# 遍历 books 变量 #}
  29. <tr id={{book.id}}>
  30. <th>{{book.name}}</th>
  31. <th>{{book.author}}</th>
  32. <th>{{book.desc}}</th>
  33. <th>{{book.price}}</th>
  34. <th>
  35. <button id={{book.id}}>删除</button>
  36. <a href='http://localhost:10086/uptbook?id={{book.id}}'>修改</a>
  37. </th>
  38. </tr>
  39. {% endfor %} {# 使用 endfor 标签结束 for 语句 #}
  40. </tbody>
  41. </table>
  42. <br>
  43. </body>
  44. </html>

查看效果

添加图书

使用a标签请求flask后端, flask后端返回html模板, 实现跳转添加页面(add.html)
这里add.html是在book下, 这是因为如果还有别的服务(比如用户的crud), 可以通过不同文件夹区分模块

添加两个接口, 我们的id就用book对象在books数组里的下标(索引/序号), 添加就直接append添加到books数组的末尾
  1. # 跳转添加页面
  2. @app.route('/addbook',methods=['get'])
  3. def addbook_html():
  4. # 自动在templates里找对应名称的文件
  5. return render_template('book/add.html')
  6. # 添加
  7. @app.route('/addbook',methods=['post'])
  8. def addbook():
  9. # 获取json数据
  10. book = request.get_json()
  11. book['id']= str(len(book)-1)
  12. books.append(book)
  13. return jsonify({"books":books})

main.py

  1. # flask创建http接口
  2. from flask import Flask, request, jsonify,render_template
  3. # 支持flask跨域
  4. from flask_cors import CORS
  5. # 创建flask服务
  6. app = Flask(__name__)
  7. CORS(app, resources=r'/*') # 注册CORS, "/*" 允许访问域名所有api
  8. # 暂时代替数据库
  9. books = [
  10. {
  11. "id":'1',
  12. "name":"hello world",
  13. "author":"迭名",
  14. "desc": "程序员入门第一本书",
  15. "price": 11.99
  16. },
  17. {
  18. "id":'2',
  19. "name":"0基础学it",
  20. "author":"xx程序员",
  21. "desc": "某培训机构精心出品教程",
  22. "price": 99.98
  23. },
  24. ]
  25. # 首页
  26. @app.route('/',methods=['get'])
  27. def index():
  28. # 自动在templates里找对应名称的文件
  29. return render_template('index.html',books=books)
  30. # 跳转添加页面
  31. @app.route('/addbook',methods=['get'])
  32. def addbook_html():
  33. # 自动在templates里找对应名称的文件
  34. return render_template('book/add.html')
  35. # 添加
  36. @app.route('/addbook',methods=['post'])
  37. def addbook():
  38. # 获取json数据
  39. book = request.get_json()
  40. # 用数组下标表示id
  41. book['id']= str(len(book)-1)
  42. # 添加到books末尾
  43. books.append(book)
  44. return jsonify({"books":books})
  45. if __name__ == "__main__":
  46. # 运行web服务
  47. app.run(host='0.0.0.0', port=10086)

index.html

我们使用axios(js的一个库)来发送http请求
  1. <!-- 引入axios发送请求给后端 -->
  2. <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
发送请求前, 通过input框的value获取数据, 然后axios发送post请求, 并传递一个json对象给后端
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. </head>
  9. <body>
  10. <form id="form">
  11. <lable>书名</lable>
  12. <input type="text" name="book-name" id="book-name">
  13. <label>作者</label>
  14. <input type="text" name="book-author" id="book-author">
  15. <label>描述</label>
  16. <input type="text" name="book-desc" id="book-desc">
  17. <label>价格</label>
  18. <input type="text" name="book-price" id="book-price">
  19. <button type="submit">提交</button>
  20. </form>
  21. <!-- 引入axios发送请求给后端 -->
  22. <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
  23. <script>
  24. const addform = document.querySelector("#form")
  25. const bookName = document.querySelector("#book-name")
  26. const bookDesc = document.querySelector("#book-desc")
  27. const bookAuthor = document.querySelector("#book-author")
  28. const bookPrice = document.querySelector("#book-price")
  29. addform.addEventListener("submit", function (e) {
  30. e.preventDefault();
  31. // console.log(bookName.value);
  32. // 发送请求给后端
  33. axios.post('http://localhost:10086/addbook',
  34. // 传递json数据给后端
  35. {
  36. name: bookName.value,
  37. author: bookAuthor.value,
  38. desc: bookDesc.value,
  39. price: bookPrice.value
  40. })
  41. // axios请求完成后
  42. .then((res) => {
  43. // 后端处理完请求,axios拿到的结果
  44. console.log(res);
  45. alert('添加成功')
  46. // 跳转首页
  47. window.location.href = 'http://localhost:10086/'
  48. })
  49. })
  50. </script>
  51. </body>
  52. </html>

查看效果

删除图书

我们通过axios发送delete请求给后端, 同时传递id, 后端遍历books, 找到对应id的元素下标, 然后删除

main.py

  1. # flask创建http接口
  2. from flask import Flask, request, jsonify,render_template
  3. # 支持flask跨域
  4. from flask_cors import CORS
  5. # 创建flask服务
  6. app = Flask(__name__)
  7. CORS(app, resources=r'/*') # 注册CORS, "/*" 允许访问域名所有api
  8. # 暂时代替数据库
  9. books = [
  10. {
  11. "id":'1',
  12. "name":"hello world",
  13. "author":"迭名",
  14. "desc": "程序员入门第一本书",
  15. "price": 11.99
  16. },
  17. {
  18. "id":'2',
  19. "name":"0基础学it",
  20. "author":"xx程序员",
  21. "desc": "某培训机构精心出品教程",
  22. "price": 99.98
  23. },
  24. ]
  25. # 首页
  26. @app.route('/',methods=['get'])
  27. def index():
  28. # 自动在templates里找对应名称的文件
  29. return render_template('index.html',books=books)
  30. # 跳转添加页面
  31. @app.route('/addbook',methods=['get'])
  32. def addbook_html():
  33. # 自动在templates里找对应名称的文件
  34. return render_template('book/add.html')
  35. # 添加
  36. @app.route('/addbook',methods=['post'])
  37. def addbook():
  38. # 获取json数据
  39. book = request.get_json()
  40. # 用数组下标表示id
  41. book['id']= str(len(book)-1)
  42. # 添加到books末尾
  43. books.append(book)
  44. return jsonify({"books":books})
  45. # 删除
  46. @app.route('/delete',methods=['delete'])
  47. def delbook():
  48. id = request.args.get('id')
  49. # 下标
  50. index = -1
  51. # 遍历,找到id相同的元素
  52. for i in range(len(books)):
  53. if books[i]['id'] == id:
  54. # 记录元素下标
  55. index = i
  56. # id不是-1表示有找到要删除的元素
  57. if i != -1:
  58. # 删除
  59. books.remove(books[index])
  60. return jsonify({'books': books})
  61. else:
  62. return jsonify({'books': books})
  63. if __name__ == "__main__":
  64. # 运行web服务
  65. app.run(host='0.0.0.0', port=10086)

index.html

我们在渲染table的时候, 将每行(tr标签)的id设为book的id, 删除时, 可以通过tr的id获取要删除的book的id, 实现删除特定的book
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. </head>
  9. <!-- 加样式,居中 -->
  10. <style>
  11. * {
  12. margin: 0 auto;
  13. text-align: center;
  14. }
  15. </style>
  16. <body>
  17. <br>
  18. <table border="1">
  19. <thead>
  20. <tr>
  21. <th>书名</th>
  22. <th>作者</th>
  23. <th>描述</th>
  24. <th>价格</th>
  25. <th>操作</th>
  26. </tr>
  27. </thead>
  28. <tbody>
  29. {% for book in books %} {# 遍历 books 变量 #}
  30. <tr id={{book.id}}>
  31. <th>{{book.name}}</th>
  32. <th>{{book.author}}</th>
  33. <th>{{book.desc}}</th>
  34. <th>{{book.price}}</th>
  35. <th>
  36. <button id={{book.id}}>删除</button>
  37. <a href='http://localhost:10086/uptbook?id={{book.id}}'>修改</a>
  38. </th>
  39. </tr>
  40. {% endfor %} {# 使用 endfor 标签结束 for 语句 #}
  41. </tbody>
  42. </table>
  43. <br>
  44. <a href="http://localhost:10086/addbook">添加图书</a>
  45. <!-- axios,可以发送请求给后端 -->
  46. <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
  47. <script>
  48. // 按钮
  49. const btns = document.querySelectorAll('th > button')
  50. // 遍历
  51. btns.forEach((b) => {
  52. console.log(b.id);
  53. // 给按钮添加click事件
  54. b.addEventListener('click', function (e) {
  55. // todo 弹出确认框,是否删除
  56. // 删除
  57. axios.delete(("http://localhost:10086/delete?id=" + b.id))
  58. .then((res) => {
  59. if (res.status == 200 && res.data) {
  60. // 刷新页面
  61. location.reload();
  62. alert('删除成功')
  63. } else {
  64. alert('删除失败')
  65. }
  66. })
  67. })
  68. })
  69. </script>
  70. </body>
  71. </html>

查看效果

修改图书信息

前端点击修改后跳转修改页面
<a href='http://localhost:10086/uptbook?id={{book.id}}'>修改</a>

main.py

  1. # flask创建http接口
  2. from flask import Flask, request, jsonify,render_template
  3. # 支持flask跨域
  4. from flask_cors import CORS
  5. # 创建flask服务
  6. app = Flask(__name__)
  7. CORS(app, resources=r'/*') # 注册CORS, "/*" 允许访问域名所有api
  8. # 暂时代替数据库
  9. books = [
  10. {
  11. "id":'1',
  12. "name":"hello world",
  13. "author":"迭名",
  14. "desc": "程序员入门第一本书",
  15. "price": 11.99
  16. },
  17. {
  18. "id":'2',
  19. "name":"0基础学it",
  20. "author":"xx程序员",
  21. "desc": "某培训机构精心出品教程",
  22. "price": 99.98
  23. },
  24. ]
  25. # 首页
  26. @app.route('/',methods=['get'])
  27. def index():
  28. # 自动在templates里找对应名称的文件
  29. return render_template('index.html',books=books)
  30. # 跳转添加页面
  31. @app.route('/addbook',methods=['get'])
  32. def addbook_html():
  33. # 自动在templates里找对应名称的文件
  34. return render_template('book/add.html')
  35. # 添加
  36. @app.route('/addbook',methods=['post'])
  37. def addbook():
  38. # 获取json数据
  39. book = request.get_json()
  40. # 用数组下标表示id
  41. book['id']= str(len(book)-1)
  42. # 添加到books末尾
  43. books.append(book)
  44. return jsonify({"books":books})
  45. # 删除
  46. @app.route('/delete',methods=['delete'])
  47. def delbook():
  48. id = request.args.get('id')
  49. # 下标
  50. index = -1
  51. # 遍历,找到id相同的元素
  52. for i in range(len(books)):
  53. if books[i]['id'] == id:
  54. # 记录元素下标
  55. index = i
  56. # id不是-1表示有找到要删除的元素
  57. if i != -1:
  58. # 删除
  59. books.remove(books[index])
  60. return jsonify({'books': books})
  61. else:
  62. return jsonify({'books': books})
  63. # 跳转修改页面
  64. @app.route('/uptbook',methods=['get'])
  65. def uptbook_html():
  66. id = request.args.get('id')
  67. book = {}
  68. for b in books:
  69. if b['id'] == id:
  70. book = b
  71. return render_template('book/update.html',book=book)
  72. # 修改
  73. @app.route('/uptbook',methods=['patch'])
  74. def uptbook():
  75. id = request.args.get('id')
  76. book = request.get_json()
  77. index = -1
  78. for i in range(len(books)):
  79. if books[i]['id'] == id:
  80. index = i
  81. if index == -1:
  82. return jsonify({"books":books})
  83. else:
  84. if(book['name']!=None):
  85. books[index]['name'] = book['name']
  86. if(book['author']!=None):
  87. books[index]['author'] = book['author']
  88. if(book['desc']!=None):
  89. books[index]['desc'] = book['desc']
  90. if(book['price']!=None):
  91. books[index]['price'] = book['price']
  92. return jsonify({"books":books})
  93. if __name__ == "__main__":
  94. # 运行web服务
  95. app.run(host='0.0.0.0', port=10086)

update.html

和添加图书页面基本相同
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. </head>
  9. <body>
  10. <!-- 自定义属性,值为book.id -->
  11. <form id="form" data-id={{book.id}}>
  12. <lable>书名</lable>
  13. <input type="text" name="book-name" value={{book.name}} id="book-name">
  14. <label for="">作者</label>
  15. <input type="text" name="book-author" value={{book.author}} id="book-author">
  16. <label for="">描述</label>
  17. <input type="text" name="book-desc" value={{book.desc}} id="book-desc">
  18. <label for="">价格</label>
  19. <input type="text" name="book-price" value={{book.price}} id="book-price">
  20. <button type="submit">提交</button>
  21. </form>
  22. <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
  23. <script>
  24. const uptform = document.querySelector("#form")
  25. const bookName = document.querySelector("#book-name")
  26. const bookDesc = document.querySelector("#book-desc")
  27. const bookAuthor = document.querySelector("#book-author")
  28. const bookPrice = document.querySelector("#book-price")
  29. // 自定义属性
  30. const id = uptform.dataset.id
  31. uptform.addEventListener("submit", function (e) {
  32. e.preventDefault();
  33. // console.log(bookName.value);
  34. // 发送请求给后端
  35. axios.patch(("http://localhost:10086/uptbook?id=" + id), {
  36. name: bookName.value,
  37. author: bookAuthor.value,
  38. desc: bookDesc.value,
  39. price: bookPrice.value
  40. }).then((res) => {
  41. console.log(res);
  42. alert('修改成功')
  43. // 跳转回首页
  44. window.location.href = 'http://localhost:10086/'
  45. })
  46. })
  47. </script>
  48. </body>
  49. </html>

查看效果

完结, 恭喜
声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号