今天给大家分享一个我最近做的一个学校宿舍管理系统,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)}")