1. 项目背景与核心价值
去年负责公司行政后勤改造时,我深刻体会到传统Excel管理员工宿舍的痛点:信息更新滞后、审批流程混乱、维修响应缓慢。这套基于Python+Vue3的宿舍管理系统,正是为解决这些实际问题而设计的全栈方案。
系统采用前后端分离架构,后端使用Python的FastAPI框架处理业务逻辑,前端基于Vue3+Element Plus构建管理界面。特别针对企业后勤场景,开发了入住审批、设备报修、费用核算等特色模块。上线后使宿舍分配效率提升60%,维修响应时间缩短至2小时内。
2. 技术架构设计
2.1 整体技术栈选型
选择Python作为后端主要基于:
- 快速开发:相比Java更适合中小型管理系统
- 生态丰富:有成熟的FastAPI、SQLAlchemy等库
- 维护成本低:行政人员也能看懂基础代码
前端选用Vue3+TypeScript组合:
- Composition API更适合复杂状态管理
- Element Plus组件库开箱即用
- TypeScript减少运行时错误
2.2 数据库设计要点
使用PostgreSQL存储核心数据,主要表结构包括:
CREATE TABLE dormitory ( id SERIAL PRIMARY KEY, building VARCHAR(10) NOT NULL, room_number VARCHAR(5) NOT NULL, capacity INT CHECK (capacity > 0), current_occupancy INT DEFAULT 0 ); CREATE TABLE employee ( id SERIAL PRIMARY KEY, name VARCHAR(50) NOT NULL, department VARCHAR(30), check_in_date DATE, dormitory_id INT REFERENCES dormitory(id) );特别注意点:
- 设置床位容量校验约束
- 使用外键确保数据一致性
- 添加入住日期索引加速查询
3. 核心功能实现
3.1 智能分配算法
开发了基于优先级的分配逻辑:
def allocate_dormitory(employee): # 1. 同部门优先分配 same_dept = session.query(Dormitory).filter( Dormitory.current_occupancy < Dormitory.capacity, Dormitory.id.in_( select(Employee.dormitory_id).filter_by( department=employee.department ) ) ).first() # 2. 就近分配空床位 if not same_dept: same_dept = session.query(Dormitory).filter( Dormitory.current_occupancy < Dormitory.capacity ).order_by( func.abs(Dormitory.building - employee.work_building) ).first() return same_dept3.2 维修工单系统
实现带图片上传的报修流程:
- 前端使用vue-upload-component处理图片
- 后端用FastAPI的UploadFile接收文件
- 使用阿里云OSS存储图片
- 自动推送微信通知维修人员
关键接口示例:
@app.post("/repairs") async def create_repair( description: str = Form(...), files: List[UploadFile] = File(None) ): urls = [] for file in files: url = oss_client.upload(file) urls.append(url) db.add(Repair( description=description, images=urls, status="pending" )) wechat.send_notification()4. 权限控制方案
4.1 RBAC模型设计
定义三种角色:
- 管理员:全功能权限
- 宿管:日常管理权限
- 员工:仅自助服务权限
使用JWT进行认证,在Vue路由守卫中检查权限:
router.beforeEach((to) => { if (to.meta.requiresAdmin && !store.state.user.isAdmin) { return '/forbidden' } })4.2 敏感操作审计
关键数据变更记录审计日志:
@app.middleware("http") async def audit_log(request: Request, call_next): response = await call_next(request) if request.method in ["POST", "PUT", "DELETE"]: db.add(AuditLog( user=request.user.id, action=f"{request.method} {request.url.path}", ip=request.client.host )) return response5. 部署与性能优化
5.1 Docker化部署
编写多阶段构建的Dockerfile:
# 前端构建阶段 FROM node:16 as frontend WORKDIR /app COPY frontend . RUN npm install && npm run build # 后端运行阶段 FROM python:3.9 WORKDIR /app COPY backend . COPY --from=frontend /app/dist ./static RUN pip install -r requirements.txt CMD ["uvicorn", "main:app", "--host", "0.0.0.0"]5.2 缓存策略
对高频查询使用Redis缓存:
@router.get("/dormitories") @cache(expire=300) async def list_dormitories(): return db.query(Dormitory).all()6. 踩坑经验分享
批量导入性能问题:
- 初始方案:单条SQL插入
- 优化后:使用bulk_insert_mappings
- 效果:1000条数据从58s → 1.2s
Vue3响应式陷阱:
// 错误写法 state.list = await fetchData() // 正确写法 state.list.push(...await fetchData())跨域文件上传:
- 需要单独配置CORS
- 前端设置withCredentials: true
- 后端指定allow_origins=["*"]
这套系统经过半年实际运行,日均处理300+次宿舍操作请求。最大的收获是:后勤系统必须考虑非技术人员的操作习惯,我们最终为宿管阿姨开发了特大字体模式和语音播报功能,这才是项目成功的关键。