今天給大家分享一個 我最近使用python 框架 fastapi 寫的一個web項目 ,叫圖書管理系統。項目主要是來鞏固 python的編程技術。使用的是前端后 分離開發。
主要實現的功能:
1、用戶管理:可以新增、編輯、刪除用戶信息。
2、圖書管理:添加、修改、刪除圖書,并能夠查看圖書列表。
3、借閱管理:記錄圖書借閱、歸還情況。
4、數據展示:通過前端頁面展示系統中的圖書、用戶信息,提供了簡潔、易用的界面。
使用技術
FastAPI:后端使用FastAPI框架
MySQL 5.7:作為關系型數據庫管理系統,MySQL用于存儲用戶和圖書信息,并支持CRUD操作。
Vue 2:前端使用Vue2框架,配合Element UI組件庫,提供響應式頁面和現代化用戶界面。
Element UI:幫助實現簡潔且功能豐富的UI設計,極大提高了前端開發效率。
先給大家看一下 頁面效果
首頁:
代碼結構:
菜單個別頁面截圖:
項目零星代碼:
<template><div class="home-container"><el-container><el-aside width="200px"><el-menu:default-active="$route.path"class="el-menu-vertical"background-color="#304156"text-color="#bfcbd9"active-text-color="#409EFF"router><el-menu-item index="/"><i class="el-icon-s-home"></i><span slot="title">首頁</span></el-menu-item><el-submenu index="1"><template slot="title"><i class="el-icon-reading"></i><span>圖書管理</span></template><el-menu-item index="/category/list"><i class="el-icon-collection"></i><span slot="title">圖書分類</span></el-menu-item><el-menu-item index="/book/list"><i class="el-icon-notebook-2"></i><span slot="title">圖書列表</span></el-menu-item></el-submenu><el-submenu index="2"><template slot="title"><i class="el-icon-document"></i><span>借用歸還</span></template><el-menu-item index="/borrow/list"><i class="el-icon-document-copy"></i><span slot="title">借用列表</span></el-menu-item><el-menu-item index="/return/list"><i class="el-icon-document-checked"></i><span slot="title">歸還列表</span></el-menu-item></el-submenu><el-submenu index="3"><template slot="title"><i class="el-icon-user-solid"></i><span>會員管理</span></template><el-menu-item index="/member/list"><i class="el-icon-user"></i><span slot="title">會員列表</span></el-menu-item><el-menu-item index="/recharge/list"><i class="el-icon-money"></i><span slot="title">充值記錄</span></el-menu-item></el-submenu><el-submenu index="4"><template slot="title"><i class="el-icon-user"></i><span>系統管理</span></template><el-menu-item index="/admin/list"><i class="el-icon-user"></i><span slot="title">管理員列表</span></el-menu-item></el-submenu></el-menu></el-aside><el-container><el-header><div class="header-right"><el-dropdown trigger="click" @command="handleCommand"><span class="el-dropdown-link">{{ userInfo ? userInfo.username : 'admin' }}<i class="el-icon-arrow-down el-icon--right"></i></span><el-dropdown-menu slot="dropdown"><el-dropdown-item command="logout">退出登錄</el-dropdown-item></el-dropdown-menu></el-dropdown></div></el-header><el-main><router-view /></el-main></el-container></el-container></div>
</template><script>
import { mapState } from 'vuex'export default {name: 'Home',computed: {...mapState('user', ['userInfo'])},methods: {handleCommand(command) {if (command === 'logout') {this.$store.dispatch('user/resetToken').then(() => {this.$router.push('/login')})}}}
}
</script><style lang="scss" scoped>
.home-container {height: 100vh;.el-container {height: 100%;}.el-aside {background-color: #304156;.el-menu {border: none;}}.el-header {background-color: #fff;box-shadow: 0 1px 4px rgba(0,21,41,.08);display: flex;justify-content: flex-end;align-items: center;.header-right {.el-dropdown-link {cursor: pointer;color: #409EFF;}}}.el-main {background-color: #f0f2f5;padding: 0;}
}
</style>
再分享一段pyhon 后端代碼:
from datetime import timedelta
from typing import Optional
from fastapi import APIRouter, Depends, Query
from sqlalchemy.orm import Session
from core.config import settings
from core.security import create_access_token
from core.response import ResponseModel
from core.exceptions import CustomException
from core.deps import get_current_admin
from db.database import get_db
from models.admin import Admin
from schemas.admin import AdminLogin, Token, AdminResponse, AdminCreate, AdminUpdate, AdminListResponse
import hashlibrouter = APIRouter()@router.post("/login")
async def login(login_data: AdminLogin, db: Session = Depends(get_db)):# 查詢管理員admin = db.query(Admin).filter(Admin.username == login_data.username).first()if not admin:raise CustomException(msg="用戶名或密碼錯誤")# MD5加密密碼進行比對md5_password = hashlib.md5(login_data.password.encode()).hexdigest()if admin.password != md5_password:raise CustomException(msg="用戶名或密碼錯誤")# 生成訪問令牌access_token_expires = timedelta(minutes=settings.ACCESS_TOKEN_EXPIRE_MINUTES)access_token = create_access_token(data={"sub": str(admin.id)},expires_delta=access_token_expires)token = Token(access_token=access_token,token_type="bearer")return ResponseModel.success(data=token.model_dump(),msg="登錄成功")@router.get("/info")
async def get_admin_info(admin: Admin = Depends(get_current_admin)):return ResponseModel.success(data=AdminResponse.model_validate(admin),msg="獲取成功")@router.get("/list")
async def get_admin_list(db: Session = Depends(get_db),current_admin: Admin = Depends(get_current_admin),page: int = Query(1, ge=1),page_size: int = Query(10, ge=1, le=100),username: Optional[str] = None
):query = db.query(Admin)if username:query = query.filter(Admin.username.like(f"%{username}%"))total = query.count()items = [AdminResponse.model_validate(item) for item in query.offset((page - 1) * page_size).limit(page_size).all()]response = AdminListResponse(total=total, items=items)return ResponseModel.success(data=response.model_dump())@router.get("/detail/{admin_id}")
async def get_admin_detail(admin_id: int,db: Session = Depends(get_db),current_admin: Admin = Depends(get_current_admin)
):admin = db.query(Admin).filter(Admin.id == admin_id).first()if not admin:raise CustomException(msg="管理員不存在")return ResponseModel.success(data=AdminResponse.model_validate(admin))@router.post("/create")
async def create_admin(admin_in: AdminCreate,db: Session = Depends(get_db),current_admin: Admin = Depends(get_current_admin)
):# 檢查用戶名是否已存在if db.query(Admin).filter(Admin.username == admin_in.username).first():raise CustomException(msg="用戶名已存在")# MD5加密密碼md5_password = hashlib.md5(admin_in.password.encode()).hexdigest()admin = Admin(username=admin_in.username,password=md5_password,nickname=admin_in.nickname,is_super=admin_in.is_super,created_by=current_admin.username)db.add(admin)db.commit()db.refresh(admin)return ResponseModel.success(data=AdminResponse.model_validate(admin))@router.put("/update/{admin_id}")
async def update_admin(admin_id: int,admin_in: AdminUpdate,db: Session = Depends(get_db),current_admin: Admin = Depends(get_current_admin)
):admin = db.query(Admin).filter(Admin.id == admin_id).first()if not admin:raise CustomException(msg="管理員不存在")update_data = admin_in.model_dump()admin.nickname = update_data['nickname']db.commit()db.refresh(admin)return ResponseModel.success(data=AdminResponse.model_validate(admin))@router.delete("/delete/{admin_id}")
async def delete_admin(admin_id: int,db: Session = Depends(get_db),current_admin: Admin = Depends(get_current_admin)
):admin = db.query(Admin).filter(Admin.id == admin_id).first()if not admin:raise CustomException(msg="管理員不存在")# 不允許刪除超級管理員if admin.is_super:raise CustomException(msg="不能刪除超級管理員")db.delete(admin)db.commit()return ResponseModel.success()
項目雖然功能不是很復雜,但是對于剛開始學習編程的小伙伴,有可能也是有難度的,不過如果自己能嘗試著 敲一些項目,會對自己的學習到的編程知識有一個更深的體會。對此項目有興趣的小伙伴可以去看看學習一下。【非開源項目】
https://wwwoop.com/home/Index/projectInfo?goodsId=98&typeParam=1&subKey=-1