当前位置:首页 > 杂谈 > 正文内容

python使用 flask+vue 制作前后端分离图书信息管理系统-flask vue axios 前后端分离

2023-07-10 06:20:00TONY杂谈128

哈喽兄弟们,今天咱们来用Python实现一个前后端分离的图书信息管理系统。

制作前后端分离图书信息管理系统的思路:

1、前端部分

首先,我们可以使用 VueJS 作为前端框架,并通过 Vue CLI 工具进行创建和管理项目。

2、后端部分

后端部分我们可以采用 Python Flask 框架,这个框架是一个轻量级的Web框架,十分适合快速开发API接口。

3、前端和后端交互

前后端的交互可以采用 Restful API 设计的方式进行,例如创建一个图书列表接口,前端只需要发送一个 GET 请求给后端,后端通过查询数据库,返回 JSON 格式的数据给前端。

4、数据库

为了方便管理图书信息,我们可以使用关系型数据库 MySQL 存储和管理相关数据。

5、部署

可以使用 Docker 将前后端应用部署在同一个容器内,或者使用 CI/CD 工具将前后端应用分别部署在不同的服务器上。

总的来说,通过使用以上技术栈,我们就可以实现一个前后端分离的图书信息管理系统。

素材+代码

素材和全部代码、详细视频讲解,我都打包好了,扫码添加小助手

备注【LL】快速通过领取

效果展示

后端部分

flask: https://flask.palletsprojects.com/en/2.1.x/

flask-sqlalchemy: https://flask-sqlalchemy.palletsprojects.com/en/2.x/

flask-cors: https://flask-cors.readthedocs.io/en/latest/

flask 快速上手

from flask import Flask,

request

app = Flask(__name__)@app.route(/)def hello_world(): # put applications code herereturn Welcome Books!

数据库部分

# -*- coding: utf-8 -*-from extension import

db

class Book(db.Model):__tablename__ = bookid = db.Column(db.Integer, primary_key=True, autoincrement=True)book_number = db.Column(db.String(255), nullable=False)book_name = db.Column(db.String(255), nullable=False)book_type = db.Column(db.String(255), nullable=False)book_prize = db.Column(db.Float, nullable=False)author = db.Column(db.String(255))book_publisher = db.Column(db.String(255))@staticmethoddef init_db():rets = [(1, 001, 活着, 小说, 39.9, 余华, 某某出版社),(2, 002, 三体, 科幻, 99.8, 刘慈欣, 重庆出版社)]for ret in rets:book = Book()book.id = ret[0]book.book_number = ret[1]book.book_name = ret[2]book.book_type = ret[3]book.book_prize = ret[4]book.author = ret[5]book.book_publisher = ret[6]db.session.add(book)db.session.commit()

使用之前需要 flask create 初始化一下数据

接口部分

RESTful API 最佳实践(阮一峰) : https://www.ruanyifeng.com/blog/2018/10/restful-api-best-practice

s.html

Method Views for APIs: https://flask.palletsprojects.com/en/2.1.x/views/#method-views-for-apis

from flask import Flask,

request

from flask_cors import

CORS

from flask.views import

MethodView

from extension import

db

from models import

Book

app = Flask(__name__)CORS().init_app(app)app.config[SQLALCHEMY_DATABASE_URI] = sqlite:///books.sqliteapp.config[SQLALCHEMY_TRACK_MODIFICATIONS] = Falsedb.init_app(app)@app.cli.command()def create():db.drop_all()db.create_all()Book.init_db()@app.route(/)def hello_world(): # put applications code herereturn Welcome Books!class BookApi(MethodView):def get(self, book_id):if not book_id:books: [Book] = Book.query.all()results = [{id: book.id,book_name: book.book_name,book_type: book.book_type,book_prize: book.book_prize,book_number: book.book_number,book_publisher: book.book_publisher,author: book.author,} for book in

books

]return {status: success,message: 数据查询成功,results:

results

}book: Book = Book.query.get(book_id)return {status: success,message: 数据查询成功,result: {id: book.id,book_name: book.book_name,book_type: book.book_type,book_prize: book.book_prize,book_number: book.book_number,book_publisher: book.book_publisher,author: book.author,}}def post(self):form = request.

json

book = Book()book.book_number = form.get(book_number)book.book_name = form.get(book_name)book.book_type = form.get(book_type)book.book_prize = form.get(book_prize)book.author = form.get(author)book.book_publisher = form.get(book_publisher)db.session.add(book)db.session.commit()# id, book_number, book_name, book_type, book_prize, author,

book_publisher

return {status: success,message: 数据添加成功}def delete(self, book_id):book = Book.query.get(book_id)db.session.delete(book)db.session.commit()return {status: success,message: 数据删除成功}def put(self, book_id):book: Book = Book.query.get(book_id)book.book_type = request.json.get(book_type)book.book_name = request.json.get(book_name)book.book_prize = request.json.get(book_prize)book.book_number = request.json.get(book_number)book.book_publisher = request.json.get(book_type)book.author = request.json.get(book_type)db.session.commit()return {status: success,message: 数据修改成功}book_api = BookApi.as_view(book_api)app.add_url_rule(/books, view_func=book_api, methods=[GET, ], defaults={book_id: None})app.add_url_rule(/books, view_func=book_api, methods=[POST, ])app.add_url_rule(/books/<int:book_id>, view_func=book_api, methods=[GET,PUT, DELETE])

前端部分

vite: https://vitejs.cn/

vue3: https://v3.cn.vuejs.org/

Element Plus: https://element-plus.gitee.io/zh-CN/

axios: https://axios-http.com/docs/intro

项目创建

C:\Users\xxp\Desktop>

npm init vite@latest

√ Project name: ... book-

fontend

√ Select a framework:

» vue

√ Select a variant:

» vue

Scaffolding project in C:\Users\xxp\Desktop\book-fontend...Done. Now run:cd book-

fontend

npm install

npm run dev

项目初始化

npm install element-

plus

npm install axios

初始化 element-plus

import {createApp} from vueimport App from ./App.vueimport ElementPlus from element-plusimport element-plus/dist/index.cssconst app = createApp(App)app.use(ElementPlus)app.mount(#app)

页面创建

表单数据显示

<template><div style="margin: 0 auto;width: 50%;"><h1 style="text-align: center">图书管理系统</h1><!-- 添加图书按钮 --><el-button type="primary" @click="add_dialog_visible = true" size="small">

加图书</el-button><!-- 数据表格 --><el-table :data="books" style="margin: 20px auto;"><el-table-column label="编号" prop="book_number"/><el-table-column label="书名" prop="book_name"/><el-table-column label="类型" prop="book_type"/><el-table-column label="价格" prop="book_prize"/><el-table-column label="作者" prop="author"/><el-table-column label="出版社" prop="book_publisher"/><el-table-column align="right" label="操作" width="200px"><template #default="scope"><el-button size="small" @click="handleEdit(scope.$index, scope.row)">

编辑

</el-button><el-

button

size="small"type="danger"@click="handleDelete(scope.$index, scope.row)">

删除

</el-

button

></template></el-table-column></el-table></div></template><script setup>import axios from axiosimport {reactive, ref, onMounted} from "vue";import {ElMessageBox} from element-plusconst books = reactive([])const getStudents = () => {axios.get("http://localhost:5000/books",).then(res => {books.splice(0, books.length)books.push(...res.data.results)console.log(更新数据)})}//

页面渲染之后添加数据

onMounted(() => {getStudents()})//

删除数据

const handleDelete = (index, scope) => {axios.delete(`http://localhost:5000/books/${scope.id}`).then(() => {getStudents()})}</script>

添加数据

html表单

<!-- 添加图书页面 --><el-

dialog

title="添加图书"v-model="add_dialog_visible"width="30%":before-close="handleClose"><el-

form

ref="ruleFormRef":model="book_form"status-

icon

label-width="120px"class="demo-ruleForm"><el-form-item label="编号" prop="book_number"><el-input v-model="book_form.book_number" autocomplete="off"/></el-form-item><el-form-item label="书名" prop="book_name"><el-input v-model="book_form.book_name" autocomplete="off"/></el-form-item><el-form-item label="类型" prop="book_type"><el-input v-model="book_form.book_type" autocomplete="off"/></el-form-item><el-form-item label="价格" prop="book_prize">完整源码文档:加V:

python1018 备注【LL】快速通过领取

<el-input v-model.number="book_form.book_prize" autocomplete="off"/></el-form-item><el-form-item label="作者" prop="author"><el-input v-model="book_form.author" autocomplete="off"/></el-form-item><el-form-item label="出版社" prop="book_publisher"><el-input v-model="book_form.book_publisher" autocomplete="off"/></el-form-item><el-form-item><el-button type="primary" @click="submitForm(ruleFormRef)">提交</elbutton><el-button @click="resetForm(ruleFormRef)">重置</el-button></el-form-item></el-form></el-dialog>

JavaScript

/*表单添加*/const add_dialog_visible = ref(false)const ruleFormRef = ref()const book_form = reactive({book_number: "",book_name: "",book_type: "",book_prize: "",author: "",book_publisher: "",id: "",})//

表单提交事件

const submitForm = (formEl) => {完整源码文档:加V:

python1018 备注【LL】快速通过领取

axios.post(http://localhost:5000/books, book_form).then(() => {add_dialog_visible.value =

false

formEl.resetFields()getStudents()})}//

重置表单

const resetForm = (formEl) => {formEl.resetFields()}//

关闭弹窗前确认

const handleClose = (done) => {ElMessageBox.confirm(确认关闭?).then(() => {done();}).catch(() => {});}

好了,今天的分享就差不多到这里了!

对下一篇大家想看什么,可在评论区留言,看到我会更新的。

喜欢就关注一下博主,或点赞收藏评论一下我的文章吧!!!

“python使用 flask+vue 制作前后端分离图书信息管理系统-flask vue axios 前后端分离” 的相关文章

强势美元掀起货币风暴,卢布却成全球表现最佳货币,人民币贬值压力几何

强势美元掀起货币风暴,卢布却成全球表现最佳货币,人民币贬值压力几何

前摩根士丹利货币策略分析师Stephen Jen曾提出著名的“美元微笑曲线”:美元在经济不景气和繁荣时都会走强。如今,美元指数刷新20年新高,开启“微笑模式”,非美货币纷纷下挫。...

微软IE浏览器6月16日正式退出历史舞台 网友:几多欢喜几多愁

微软IE浏览器6月16日正式退出历史舞台 网友:几多欢喜几多愁

整天用电脑办公或者上网的朋友,我要是问 IE浏览器好用吗?想必是仁者见仁,智者见智。 下个月,这位曾经的浏览器“霸主”就要和网友们告别了,陪伴了27年的IE浏览器,有什么想说说的吗? 点个关注不迷路。今天阿伟就和大家一起聊聊微软IE浏览器6月16日正式退出历史舞台,此后...

“27岁”的微软IE浏览器正式退役,考试报名、网银办理该咋办?

“27岁”的微软IE浏览器正式退役,考试报名、网银办理该咋办?

据悉,微软将于当地时间6月15日(北京时间16日)结束对“Internet Explorer(IE)”的支持。IE浏览器正式退役后,其功能将由Edge浏览器接棒。 Microsoft Edge浏览器5月16日通过其官方微博宣布,IE浏览器正式退役后,其功能将由Edge浏览...

校园招聘进工行,派去成都95588一年,这一年到底什么样子,求分享经历?

校园招聘进工行,派去成都95588一年,这一年到底什么样子,求分享经历?

不会是今年来吧?随便说点吧,想到什么说什么。 怎么说呢,95588处于成都高新区,属于新开发的地区,周边什么都是新的,但工地也多,工区周边没什么娱乐项目,吃处也少(找吃的要跑好远),除非自己有车否则交通也不便利,自行车电瓶车是必不可少的,这...

被质疑局长拍写真,她道出了真相

被质疑局长拍写真,她道出了真相

  来源:环球人物   “要抓住机会,   过去3年才没有白熬。”   作者:王秦怡   都波是黑龙江省塔河县文旅局长,一位不太典型的、思维极其跳跃的领导。   前不久,她身着“白鹿仙子”服饰的短视频,在没有任何征兆的情况下突然爆火。...

用好安全稳定“十字诀”谱写道路交通安全整治宗地新篇章

用好安全稳定“十字诀”谱写道路交通安全整治宗地新篇章

     (图/文  黄竹胜)自开展道路交通安全整治行动以来,宗地镇高度重视,紧紧围绕安全稳定“十字诀”暨深入道路安全隐患排查、强化交通安全宣传、积极引导安全行驶、切实预防安全隐患和严厉违规违章查处。组织镇派出所、镇综治办、镇安监办和镇交管站,联合县猴场中心交警中队等职能...