Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

93 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

SWUFE Hotel Reservation

2025-2026-3 暑期学期《计算机系统综合实验》课程项目:酒店在线预定平台

本项目以真实酒店预定流程为背景,完成需求分析、系统设计、编码、测试、部署和答辩展示的全流程工作流。最终目的是交付一个模块清晰、接口明确、可测试、可演示、符合软件工程规范的应用系统。

核心业务

普通用户

  • 注册、登录并维护个人账号。
  • 在未来一周内按入住、离店、房间数和入住人数查询可用房型。
  • 查看房型名称、图片、价格、介绍、每间入住容量和剩余数量。
  • 在确认页获取后端实时报价,再按“天”提交预定,系统重新校验容量和库存后生成订单。
  • 查看个人订单列表、完整详情及其状态。
  • 至少提前一天取消预定,取消成功后释放库存。
  • 查看个人信用状态;连续违规取消三次后,一周内禁止再次预定。
  • 使用 AI 智能体描述日期、人数、预算和偏好,获得基于实时房态的房型推荐。

商家管理员

  • 每个商家管理账号只运营其唯一绑定的一家酒店。
  • 对本酒店房型名称、价格、库存、图片等信息进行增删改查。
  • 查看本酒店预定订单、库存变化和必要的用户信用摘要。
  • 使用 AI 智能体查询房态和订单,并在确认后执行库存或预定管理操作。

平台管理员

  • 不绑定具体酒店,管理全平台账号、酒店和商家归属。
  • 创建商家账号、酒店及其一对一绑定,并执行受控数据维护。
  • 数据结构变更只通过 Alembic 完成,不向网页或 AI 开放任意 SQL。

业务规则

  1. 普通用户、商家管理员和平台管理员采用同一身份体系、不同角色授权,后端必须校验角色、资源所有权和酒店归属。
  2. 可预定日期限制为未来一周内;入住日期必须早于离店日期。
  3. 房量按日期管理,不能只维护一个全局剩余库存。
  4. 入住人数不得超过“房型每间容量 × 房间数”,查询与创建订单均由后端校验。
  5. 创建订单与扣减库存必须在同一数据库事务中完成,避免超卖。
  6. 取消订单与释放库存必须在同一数据库事务中完成,且同一订单只能成功取消一次。
  7. 用户必须至少提前一天取消;具体截止时间统一按服务端配置和时区计算。
  8. “连续三次取消”以连续三个已结束订单均为用户主动取消为准;触发后禁订七天。成功入住完成后连续取消计数清零。
  9. 金额使用定点小数保存,报价和订单总价只由后端计算,禁止使用浮点数计算价格。

技术选型

层级 技术 选择理由
前端 React 18、TypeScript、Vite 组件化成熟、类型安全、开发反馈快,标杆项目已有可复用经验
UI Ant Design、CSS Modules 快速构建一致的桌面端界面,同时保留响应式定制能力
路由与请求 React Router、TanStack Query、Axios 明确页面边界,统一服务端状态、缓存、加载和错误处理
后端 Python 3.11+、FastAPI、Pydantic 2 接口契约清晰、开发效率高、自动生成 OpenAPI 文档
AI 智能体 LLM Provider Adapter、受控工具调用 模型负责理解与表达,工具复用业务服务并执行权限、确认和审计
ORM 与迁移 SQLAlchemy 2、Alembic 显式事务、成熟关系模型、数据库结构可追踪
数据库 MySQL 8 适合用户、房型、每日库存和订单等强关系、强事务业务
身份认证 JWT 短时访问令牌 + BCrypt/Argon2 密码哈希 前后端分离场景易落地;不存储明文密码
测试 Vitest、Testing Library、Pytest 覆盖前端组件、后端服务与关键接口
工程工具 pnpm、uv、ESLint、Prettier、Ruff、mypy 固定依赖、统一格式、尽早发现类型和质量问题

计划目录

Hotel-Reservation/
├─ frontend/                 # React 前端
│  ├─ src/
│  │  ├─ api/                # HTTP 客户端与接口函数
│  │  ├─ components/         # 可复用展示组件
│  │  ├─ features/           # auth、rooms、reservations、admin
│  │  ├─ hooks/              # 通用 Hooks
│  │  ├─ layouts/            # 页面布局
│  │  ├─ pages/              # 路由页面
│  │  ├─ routes/             # 路由与权限守卫
│  │  ├─ types/              # 前端类型
│  │  └─ utils/              # 无副作用工具函数
│  └─ tests/
├─ backend/                  # FastAPI 后端
│  ├─ app/
│  │  ├─ api/v1/             # 路由层
│  │  ├─ core/               # 配置、安全、异常、日志
│  │  ├─ models/             # ORM 模型
│  │  ├─ repositories/       # 数据访问
│  │  ├─ schemas/            # 请求与响应模型
│  │  └─ services/           # 业务规则与事务编排
│  ├─ migrations/            # Alembic 迁移
│  └─ tests/
├─ doc/                      # 需求、设计、UML、测试和答辩资料
├─ .env.example              # 可公开的配置模板
├─ README.md
└─ agents.md                 # 开发与代理执行规范

API 约定

  • 所有业务接口使用 /api/v1 前缀,交换格式统一为 JSON。
  • 资源路径使用复数名词,例如 /room-types/reservations
  • 使用标准 HTTP 方法和状态码,不以 200 包装所有错误。
  • 错误响应统一包含稳定的 code、面向用户的 message 和可选 details
  • 时间通过 ISO 8601 传输,服务端统一使用 Asia/Shanghai 解释业务截止时间。
  • 分页、排序和筛选参数采用统一命名;接口变更必须同步 OpenAPI 和前端类型。
  • 图片第一阶段使用受控 URL 或本地上传目录,数据库仅保存元数据和地址。

核心数据模型

  • users:账户、密码摘要、角色、状态和禁订截止时间。
  • hotels:独立酒店主体、状态和平台创建者。
  • merchant_hotel_bindings:商家账号与酒店的严格一对一绑定。
  • auth_sessions:JWT 对应的可撤销短时登录会话。
  • room_types:房型名称、说明、价格、基础库存、每间入住容量和展示信息。
  • room_type_images:房型图片及排序。
  • daily_inventories:房型、日期、总量、已预定量;房型与日期联合唯一。
  • reservations:订单号、用户、房型、入住/离店日期、房间数、入住人数、金额、状态和时间戳。
  • credit_events:取消、完成、禁订等信用事件审计记录。

数据库迁移是结构变更的唯一入口。禁止只修改本地数据库、不提交迁移脚本。

Quick Start

本节覆盖从拉取代码、启动数据库、执行迁移,到注入三类 M1 测试账号并启动前后端的完整流程。团队成员按顺序执行即可得到一致的本地验收环境。

环境要求

  • Node.js 20+
  • pnpm 9+
  • Python 3.11+
  • uv
  • MySQL 8+

配置

复制根目录 .env.example.env,按说明填写数据库地址。前后端开发命令统一读取这份根配置;只有 VITE_ 前缀的变量会暴露给浏览器。真实密码、密钥、个人配置和生产数据不得提交到 Git。

启动本地数据库

项目提供独立的 MySQL 8 开发容器。默认映射到本机 3308 端口,避免与其他项目常用的 3306 端口冲突。

docker compose up -d
docker compose ps

确认容器状态为 healthy 后,再执行后端迁移。

启动后端

cd backend
uv sync
uv run alembic upgrade head
uv run uvicorn app.main:app --reload --port 8000

如需创建个人平台管理员,执行以下命令。终端会安全提示输入密码,不会把密码写入命令历史或迁移文件。

uv run python -m app.commands.create_platform_admin --username admin --display-name "平台管理员"

注入演示账号、酒店和房型

团队成员拉取代码、启动 MySQL 并执行迁移后,运行一次以下命令即可获得相同的测试账号、演示酒店、商家绑定和三个在售房型:

cd backend
uv sync
uv run alembic upgrade head
uv run python -m app.commands.seed_m1_demo_accounts
角色 账号 密码 数据范围
平台管理员 demo_admin Admin12345 全平台
商家管理员 demo_merchant Merchant12345 DEMO-001 成都太古里亚朵S酒店
开发测试用户 demo_customer Customer12345 普通会员数据

该命令具备以下行为:

  • 只允许在 developmenttest 环境运行,生产环境会直接拒绝。
  • 可以重复执行,不会产生重复账号、酒店或绑定。
  • 会创建或重置 雅致大床房城景双床房行政套房,便于查看用户端房型浏览与商家端管理页面。
  • 重复执行会恢复上表中的演示密码和启用状态,并撤销这些账号的旧登录会话。
  • 如果同名账号已被其他角色占用,或演示酒店已绑定其他商家,命令会拒绝覆盖并回滚。
  • 这些是公开的本地测试凭据,不得用于部署环境或真实业务数据。

接口文档默认位于 http://localhost:8000/docs/api/v1/health 用于检查后端进程是否存活,/api/v1/health/ready 还会检查数据库是否可用。

启动前端

cd frontend
pnpm install
pnpm dev

前端默认使用 http://localhost:5173,通过环境变量配置 API 基地址。

上述命令对应当前脚手架;执行数据库迁移前,需要先创建空数据库并确保 .env 中的 MySQL 连接可用。

开发流程(面向团队同学)

  1. 从 issue 处领取本次开发任务。例如:修复某 bug、重构前端界面、增加某功能。
  2. 如果对于开发任务不清楚的,务必与组长或对应负责人沟通清楚,避免返工。
  3. 从最新 main 创建短生命周期功能分支,命名为 feat/*fix/*docs/*refactor/*
  4. 进行开发。与 AI 协作开发,我们的同学争取不写一句代码,全部 vibe coding。
  5. commit 你的代码,一次 commit 尽量只做一个功能点。也就是提交代码要少量多次。使用 Conventional Commits,例如 feat(reservation): prevent overselling
  6. 拉 PR(Pull Request),组长或对应负责人会审查代码。如果可以的话核查者会直接合并到 main 分支。这意味着你的代码被采用了!

实训交付物

课程评价侧重以下三部分:

  • 系统分析与设计(30%):需求分析、概要设计、详细设计、UML 模型和测试报告。
  • 系统实现(55%):工作量、模块质量与复杂度,以及稳定性、易用性和容错性。
  • 演示答辩(15%):主要功能与界面演示、项目汇报 PPT、团队分工及问答。

项目按需求分析、概要设计、详细设计、程序编码、测试、集成验收的阶段推进。团队人数不超过 6 人,每位成员对自己承担的模块、提交和答辩内容负责。

可参考文档

About

本项目为 2025-2026-3 暑期学期实训项目。

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages