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