今天給大家分享一個我最近做的一個學校宿舍管理系統,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)}")