护肤品网站建设方案,外贸网站空间,推广过程,服务app开发公司目录标题 前言制作前后端分离图书信息管理系统的思路#xff1a;素材代码效果展示 后端部分接口部分前端部分尾语 前言
嗨喽~大家好呀#xff0c;这里是魔王呐 ❤ ~! 哈喽兄弟们#xff0c;今天咱们来用Python实现一个前后端分离的图书信息管理系统。
制作前后端分离图书信… 目录标题 前言制作前后端分离图书信息管理系统的思路素材代码效果展示 后端部分接口部分前端部分尾语 前言
嗨喽~大家好呀这里是魔王呐 ❤ ~! 哈喽兄弟们今天咱们来用Python实现一个前后端分离的图书信息管理系统。
制作前后端分离图书信息管理系统的思路
1、前端部分
首先我们可以使用 VueJS 作为前端框架并通过 Vue CLI 工具进行创建和管理项目。
2、后端部分
后端部分我们可以采用 Python Flask 框架,这个框架是一个轻量级的Web框架十分适合快速开发API接口。
3、前端和后端交互
前后端的交互可以采用 Restful API 设计的方式进行例如创建一个图书列表接口前端只需要发送一个 GET 请求给后端后端通过查询数据库返回 JSON 格式的数据给前端。
4、数据库
为了方便管理图书信息我们可以使用关系型数据库 MySQL 存储和管理相关数据。
5、部署
可以使用 Docker 将前后端应用部署在同一个容器内或者使用 CI/CD 工具将前后端应用分别部署在不同的服务器上。
总的来说通过使用以上技术栈我们就可以实现一个前后端分离的图书信息管理系统。 素材代码 有需要python源码/安装包/教程/电子书/资料等 点击此处跳转文末名片免费获取 效果展示 后端部分
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 here
return Welcome Books!数据库部分
# -*- coding: utf-8 -*-
from extension import db
class Book(db.Model):
__tablename__ book
id db.Column(db.Integer, primary_keyTrue, autoincrementTrue)
book_number db.Column(db.String(255), nullableFalse)
book_name db.Column(db.String(255), nullableFalse)
book_type db.Column(db.String(255), nullableFalse)
book_prize db.Column(db.Float, nullableFalse)
author db.Column(db.String(255))
book_publisher db.Column(db.String(255))
staticmethod
def 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.sqlite
完整源码文档加V:pytho8987免费获取验证记得备注“777”
app.config[SQLALCHEMY_TRACK_MODIFICATIONS] False
db.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 here
return 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_funcbook_api, methods[GET, ], defaults
{book_id: None})
app.add_url_rule(/books, view_funcbook_api, methods[POST, ])
app.add_url_rule(/books/int:book_id, view_funcbook_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\Desktopnpm init vitelatest
√ 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 vue
import App from ./App.vue
import ElementPlus from element-plus
import element-plus/dist/index.css
const app createApp(App)
app.use(ElementPlus)
app.mount(#app)页面创建
表单数据显示
template
div stylemargin: 0 auto;width: 50%;
h1 styletext-align: center图书管理系统/h1
!-- 添加图书按钮 --
el-button typeprimary clickadd_dialog_visible true sizesmall添
加图书/el-button
!-- 数据表格 --
el-table :databooks stylemargin: 20px auto;
el-table-column label编号 propbook_number/
el-table-column label书名 propbook_name/
el-table-column label类型 propbook_type/
el-table-column label价格 propbook_prize/
el-table-column label作者 propauthor/
el-table-column label出版社 propbook_publisher/
el-table-column alignright label操作 width200px
template #defaultscope
el-button sizesmall clickhandleEdit(scope.$index, scope.row)
编辑
/el-button
el-button
sizesmall
typedanger
clickhandleDelete(scope.$index, scope.row)删除
/el-button/template
/el-table-column
/el-table
/div
/templatescript setup
import axios from axios
import {reactive, ref, onMounted} from vue;
import {ElMessageBox} from element-plus
const 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-modeladd_dialog_visible
width30%
:before-closehandleCloseel-form
refruleFormRef
:modelbook_form
status-icon
label-width120px
classdemo-ruleFormel-form-item label编号 propbook_number
el-input v-modelbook_form.book_number autocompleteoff/
/el-form-item
el-form-item label书名 propbook_name
el-input v-modelbook_form.book_name autocompleteoff/
/el-form-item
el-form-item label类型 propbook_type
el-input v-modelbook_form.book_type autocompleteoff/
/el-form-item
el-form-item label价格 propbook_prize
# 完整源码文档加V:pytho8987免费获取验证记得备注“777”
el-input v-model.numberbook_form.book_prize autocompleteoff/
/el-form-item
el-form-item label作者 propauthor
el-input v-modelbook_form.author autocompleteoff/
/el-form-item
el-form-item label出版社 propbook_publisher
el-input v-modelbook_form.book_publisher autocompleteoff/
/el-form-item
el-form-item
el-button typeprimary clicksubmitForm(ruleFormRef)提交/elbutton
el-button clickresetForm(ruleFormRef)重置/el-button
/el-form-item
/el-form
/el-dialogJavaScript
/*表单添加*/
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:pytho8987免费获取验证记得备注“777”
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(() {
});
}尾语
感谢你观看我的文章呐~本次航班到这里就结束啦
希望本篇文章有对你带来帮助 有学习到一点知识~
躲起来的星星也在努力发光你也要努力加油让我们一起努力叭。 最后宣传一下呀~更多源码、资料、素材、解答、交流皆点击下方名片获取呀