使用python-fastApi框架開發一個學校宿舍管理系統-前后端分離項目

今天給大家分享一個我最近做的一個學校宿舍管理系統,python版,這個系統實現的功能有:首頁 | 學校管理 | 宿舍樓管理 | 宿舍管理 | 學生管理 | 學生調宿 | 學生退宿 | 報修等級 | 宿舍衛生評分 | 違紀記錄 | 管理員管理 。一共有11個菜單。
使用的技術:
編程語言:python
后端框架: fastApi
前端:vue2。
為了加強自己對python編程的理解,最近寫了大量的python相關的項目。今天就先來分享這個宿舍管理系統。
先給大家看一下頁面效果:
首頁:
在這里插入圖片描述
學生調宿:
在這里插入圖片描述
衛生評分:
在這里插入圖片描述
學生退宿:
在這里插入圖片描述
在這里插入圖片描述
代碼量還是有的,如果你是剛剛開始學習編程,需要相關的練習項目,希望這個項目能幫助到你,可以仿照著這個項目,自己嘗試著手敲一下。項目源碼我打包好了,有興趣的可以去看看。~ (非開源)
https://wwwoop.com/home/Index/projectInfo?goodsId=119&typeParam=1&subKey=-1

部分代碼:

from fastapi import APIRouter, Depends, HTTPException, Query
from sqlalchemy.orm import Session, joinedload
from sqlalchemy import and_, func
from typing import Optional
from datetime import datetime
import mathfrom core.deps import get_db, get_current_admin
from core.response import ResponseModel
from core.exceptions import CustomException
from models.repair_registration import RepairRegistration
from models.dormitory_building import DormitoryBuilding
from models.dormitory import Dormitory
from models.admin import Admin
from schemas.repair_registration import (RepairRegistrationCreate,RepairRegistrationUpdate,RepairRegistrationResponse,RepairRegistrationListResponse,BuildingOption,DormitoryOption
)router = APIRouter()@router.get("/list", response_model=dict)
def get_repair_registration_list(page: int = Query(1, ge=1, description="頁碼"),page_size: int = Query(10, ge=1, le=100, description="每頁數量"),reporter_name: Optional[str] = Query(None, description="報修人姓名"),db: Session = Depends(get_db),current_admin: Admin = Depends(get_current_admin)
):"""獲取報修登記列表"""try:# 構建查詢query = db.query(RepairRegistration).options(joinedload(RepairRegistration.building),joinedload(RepairRegistration.dormitory)).filter(RepairRegistration.is_deleted == 0)# 添加搜索條件if reporter_name:query = query.filter(RepairRegistration.reporter_name.like(f"%{reporter_name}%"))# 按創建時間倒序排列query = query.order_by(RepairRegistration.created_time.desc())# 獲取總數total = query.count()# 分頁查詢offset = (page - 1) * page_sizeitems = query.offset(offset).limit(page_size).all()# 構建響應數據repair_list = []for repair in items:# 時間格式化created_time = repair.created_time.strftime("%Y-%m-%d %H:%M:%S") if repair.created_time else Noneupdated_time = repair.updated_time.strftime("%Y-%m-%d %H:%M:%S") if repair.updated_time else Noneexpected_repair_time = repair.expected_repair_time.strftime("%Y-%m-%d %H:%M:%S") if repair.expected_repair_time else Nonerepair_list.append({"id": repair.id,"reporter_name": repair.reporter_name,"reporter_phone": repair.reporter_phone,"building_id": repair.building_id,"building_name": repair.building.building_name if repair.building else None,"dormitory_id": repair.dormitory_id,"dormitory_name": repair.dormitory.dormitory_name if repair.dormitory else None,"dormitory_number": repair.dormitory.dormitory_number if repair.dormitory else None,"repair_content": repair.repair_content,"remark": repair.remark,"expected_repair_time": expected_repair_time,"created_time": created_time,"updated_time": updated_time})# 計算總頁數total_pages = math.ceil(total / page_size) if total > 0 else 1return ResponseModel.success(data={"items": repair_list,"total": total,"page": page,"page_size": page_size,"total_pages": total_pages})except Exception as e:raise CustomException(msg=f"獲取報修登記列表失敗: {str(e)}")@router.get("/detail/{repair_id}", response_model=dict)
def get_repair_registration_detail(repair_id: int,db: Session = Depends(get_db),current_admin: Admin = Depends(get_current_admin)
):"""獲取報修登記詳情"""try:# 查詢報修登記信息repair = db.query(RepairRegistration).options(joinedload(RepairRegistration.building),joinedload(RepairRegistration.dormitory)).filter(RepairRegistration.id == repair_id,RepairRegistration.is_deleted == 0).first()if not repair:raise CustomException(msg="報修登記不存在")# 時間格式化created_time = repair.created_time.strftime("%Y-%m-%d %H:%M:%S") if repair.created_time else Noneupdated_time = repair.updated_time.strftime("%Y-%m-%d %H:%M:%S") if repair.updated_time else Noneexpected_repair_time = repair.expected_repair_time.strftime("%Y-%m-%d %H:%M:%S") if repair.expected_repair_time else Nonereturn ResponseModel.success(data={"id": repair.id,"reporter_name": repair.reporter_name,"reporter_phone": repair.reporter_phone,"building_id": repair.building_id,"building_name": repair.building.building_name if repair.building else None,"dormitory_id": repair.dormitory_id,"dormitory_name": repair.dormitory.dormitory_name if repair.dormitory else None,"dormitory_number": repair.dormitory.dormitory_number if repair.dormitory else None,"repair_content": repair.repair_content,"remark": repair.remark,"expected_repair_time": expected_repair_time,"created_time": created_time,"updated_time": updated_time})except CustomException:raiseexcept Exception as e:raise CustomException(msg=f"獲取報修登記詳情失敗: {str(e)}")@router.post("/create", response_model=dict)
def create_repair_registration(repair_data: RepairRegistrationCreate,db: Session = Depends(get_db),current_admin: Admin = Depends(get_current_admin)
):"""創建報修登記"""try:# 驗證宿舍樓是否存在building = db.query(DormitoryBuilding).filter(DormitoryBuilding.id == repair_data.building_id,DormitoryBuilding.is_deleted == 0).first()if not building:raise CustomException(msg="宿舍樓不存在")# 驗證宿舍是否存在且屬于指定宿舍樓dormitory = db.query(Dormitory).filter(Dormitory.id == repair_data.dormitory_id,Dormitory.building_id == repair_data.building_id,Dormitory.is_deleted == 0).first()if not dormitory:raise CustomException(msg="宿舍不存在或不屬于指定宿舍樓")# 創建報修登記repair = RepairRegistration(reporter_name=repair_data.reporter_name,reporter_phone=repair_data.reporter_phone,building_id=repair_data.building_id,dormitory_id=repair_data.dormitory_id,repair_content=repair_data.repair_content,remark=repair_data.remark,expected_repair_time=repair_data.expected_repair_time,created_id=current_admin.id,updated_id=current_admin.id)db.add(repair)db.commit()db.refresh(repair)return ResponseModel.success(msg="報修登記創建成功")except CustomException:raiseexcept Exception as e:db.rollback()raise CustomException(msg=f"創建報修登記失敗: {str(e)}")@router.get("/building-options", response_model=dict)
def get_building_options(db: Session = Depends(get_db),current_admin: Admin = Depends(get_current_admin)
):"""獲取宿舍樓選項"""try:buildings = db.query(DormitoryBuilding).filter(DormitoryBuilding.is_deleted == 0).order_by(DormitoryBuilding.building_name).all()options = [{"value": building.id,"label": building.building_name}for building in buildings]return ResponseModel.success(data=options)except Exception as e:raise CustomException(msg=f"獲取宿舍樓選項失敗: {str(e)}")@router.get("/dormitory-options", response_model=dict)
def get_dormitory_options(building_id: Optional[int] = Query(None, description="宿舍樓ID"),db: Session = Depends(get_db),current_admin: Admin = Depends(get_current_admin)
):"""獲取宿舍選項"""try:query = db.query(Dormitory).filter(Dormitory.is_deleted == 0)if building_id:query = query.filter(Dormitory.building_id == building_id)dormitories = query.order_by(Dormitory.dormitory_number).all()options = [{"value": dormitory.id,"label": f"{dormitory.dormitory_number} - {dormitory.dormitory_name}","building_id": dormitory.building_id}for dormitory in dormitories]return ResponseModel.success(data=options)except Exception as e:raise CustomException(msg=f"獲取宿舍選項失敗: {str(e)}")

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/97897.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/97897.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/97897.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

阻塞 vs 非阻塞:程序等待的兩種哲學

當程序需要等待外部操作時,是應該"干等"還是"邊等邊干"?為什么有些程序會卡住不動,而另一些卻能流暢運行?這一切都取決于阻塞與非阻塞的編程選擇!本文將為你揭示這兩種模式的本質區別!…

MySQL 核心操作全解析(用戶 + SHOW+DML+DCL)

MySQL 核心操作全解析(用戶 SHOWDMLDCL) 基于你提供的實操筆記,我們將 MySQL 核心操作拆解為用戶管理、SHOW 查詢命令、DML 數據操作、TRUNCATE 與 DELETE 對比、DCL 權限控制五大模塊,梳理語法邏輯、補充避坑提示,幫…

多語言編碼Agent解決方案(6)-部署和使用指南

部署和使用指南 本指南提供完整的部署和使用說明,幫助您設置后端服務并在VSCode、Eclipse和IntelliJ中使用相應的插件。這個解決方案基于vLLM提供AI編碼輔助,支持英語、中文和日文。 前提條件 操作系統:Linux、macOS或Windows(推薦…

濾波器的三重境界:從信號處理到自動駕駛測試的基石

在自動駕駛的宏大敘事中,我們常常聚焦于人工智能、深度學習、高精地圖等"明星技術"。然而,在這些耀眼的光環背后,有一個低調卻至關重要的"幕后英雄"——濾波器。它不僅是信號處理的工具,更是連接物理世界與數…

Part4.第8章:神經網絡

第8章 激活函數 如果沒有激活函數,不論幾層的神經網絡都是一個線性回歸。激活函數的作用是引入非線性。

nextjs+shadcn+tailwindcss實現博客中的overview

最近在用nextjsshadcntailwindcss練手,實現一個博客。做到了overView這里,可實現如下效果1.首先要安裝tailwindcss,這個在創建項目的時候就安裝了。2.然后安裝shadcn,官網教程:3.代碼如下:import {Card,CardContent } …

Kotlin 高階語法解析

Kotlin 高級語法深度解析1. 協程(Coroutines)1.1 基礎概念1.掛起和恢復2.協程構建器 (Coroutine Builders)3.協程作用域4.調度器1.2 核心用法1.3 實戰示例2. 密封類(Sealed Classes)2.1 定義與特性2.2 模式匹配2.3 應用場景3. 內聯…

9 基于機器學習進行遙感影像參數反演-以隨機森林為例

目錄 1 讀取數據 2 數據預處理 3模型訓練 4模型預測 5精度分析 由于回歸任務的標簽數據獲取比較困難,我們這次用水體指數NDWI來模擬作為回歸任務的標簽,通過隨機森林來擬合回歸NDWI,其計算公式如下: NDWI = (band3 - band5) / (band3 + band5) 實際情況下需要回歸的數…

C++多線程編程:跨線程操作全解析

C中的"線程"通常指單個執行流(如std::thread對象),而"多線程"指程序中同時存在多個這樣的執行流,并涉及它們的創建、管理和同步。實現跨線程操作的核心在于安全地處理共享數據和線程間通信。 以下是實現跨線程…

【腦電分析系列】第13篇:腦電源定位:從頭皮到大腦深處,EEG源定位的原理、算法與可視化

前言腦電信號(Electroencephalography, EEG)是一種非侵入性的神經成像技術,能夠實時捕捉大腦的電活動。然而,頭皮上記錄到的信號是腦源活動經過頭皮、顱骨等介質“模糊”后的投影。想要從這些頭皮EEG信號追溯到大腦深處的電活動&a…

MySQL知識筆記

DATE_ADD(date,INTERVAL expr type) date 參數是合法的日期表達式。expr 參數是您希望添加的時間間隔。多查官方手冊!!命令行啟動和停止sql服務net start 數據庫名; 這是啟動服務命令; 例如:net start Mysql56…

2025算法八股——深度學習——MHA MQA GQA

MHA、MQA、GQA 都是深度學習中注意力機制的相關概念,其中 MHA 是標準的多頭注意力機制,MQA 和 GQA 則是其優化變體,以下是它們的區別、優缺點介紹:區別MHA(多頭注意力):是 Transformer 架構的核…

Vue3》》eslint Prettier husky

安裝必要的依賴 npm install -D eslint eslint/js vue/eslint-config-prettier prettier eslint-plugin-vue 初始化 ESLint 配置 npm init eslint/config// eslint.config.js // 針對 JavaScript 的 ESLint 配置和規則。保持 JavaScript 代碼的一致性和質量 import js from &qu…

Custom SRP - Point and Spot Lights

https://catlikecoding.com/unity/tutorials/custom-srp/point-and-spot-lights/Lights with Limited Influence1 Point Lights1.1 Other Light Data (Point )同方向光一樣,我們支持有限數量的 Other Light.盡管場景中可能有很多 Other Lights,可能有超過光源上限的光源時可見的…

hive數據倉庫的搭建

提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔 文章目錄前言一、內嵌模式二、本地模式三、遠程模式前言 HIVE是基于HDFS的數據倉庫,要首先搭建好HADOOP的集群才可以正常使用HIVE,HADOOP集運搭建詳見…

域名SSL證書免費申請lcjmSSL

.-.lcjmSSL(又名“來此加密”)是一個提供免費SSL證書申請的一站式平臺。它支持單域名、多域名以及泛域名證書申請,且單張證書最高可覆蓋100個域名,讓您輕松實現全站HTTPS加密。為什么您的網站必須安裝SSL證書?數據加密…

“能量逆流泵”:一種基于電容陣與開關矩陣的超高效大功率降壓架構

摘要本文提出并驗證了一種面向大功率降壓應用的革命性電源架構——"能量逆流泵"(Energy Inversion Pump, EIP)。該架構摒棄了傳統Buck轉換器中的電感元件,通過高速開關矩陣控制的電容陣列,將高壓側能量以"分時、分…

打造精簡高效的 uni-app 網絡請求工具

在 uni-app 開發中,網絡請求是連接前端與后端的核心橋梁。一個設計良好的請求工具能夠顯著提升開發效率,減少重復代碼。本文將分享一個精簡版的 uni-app 網絡請求工具實現,它保留了核心功能同時保持了足夠的靈活性。設計思路一個優秀的網絡請…

【面試場景題】交易流水表高qps寫入會有鎖等待或死鎖問題嗎

文章目錄一、先明確交易流水表的核心特性二、InnoDB的鎖機制在流水表寫入場景的表現1. 行鎖(Record Lock):基本不涉及2. 間隙鎖(Gap Lock)與Next-Key Lock:幾乎不觸發3. 表鎖:僅在極端場景出現三…

項目部署——LAMP、LNMP和LTMJ

前情提要問:如何通過nginx的反向代理,代理多臺虛擬主機(一臺apache服務器上的虛擬主機)?1.在nginx的配置文件中,將基于域名的訪問改為基于端口的訪問(nginx.conf)upstream daili{ser…