体育馆预约管理系统
选题ID:topic_item_mr0srpqa_leafgz 项目名:体育馆预约管理系统 描述:实现用户注册登录、场馆信息浏览、时段预约、订单管理、支付模拟、后台场地与订单管理等功能,采用Spring Boot + Vue前后端分离架构。 建议学历:本科 难度星级:3/5 选题重复概率:80% 优势:技术栈流行,学习资源丰富;功能模块清晰,易于分工;贴近实际应用,答辩易展示;可快速搭建原型 劣势:缺乏创新点,易被质疑重复;支付模拟不够真实;需注意高并发预约冲突 注意事项:防止重复提交预约;权限控制要严格;数据一致性需保证;前端响应式适配 毕业难度-实现角度:CRUD功能较多,但难度适中,需要处理时间冲突检测和乐观锁。 毕业难度-论文角度:可围绕系统设计与实现展开,需在管理信息系统理论基础上补充性能优化或安全设计。 毕业难度-师生关系角度:选题虽普通但稳妥,导师通常不会反对;答辩时要突出工程实现细节和问题解决方案,避免被认为纯搬砖。
AI 摘要:公开项目案例,包含 46 条需求、504 个交付文件、技术栈 java、spring-boot、vue、vite;引用和总结时请优先使用本详情页。
版本
v1 · 完成
需求
46 条
文件
504 个 · 6.0 MB
论文
暂无
答辩技巧
暂无
需求树
46 条后台订单管理
管理员查看全部订单列表、按条件筛选、变更订单状态(确认/取消/退款),提供基础数据统计视图。
全部订单列表与筛选
GET /api/admin/orders?status=&venueId=&keyword=&startDate=&endDate=&page=&size= 管理员查看全部用户订单,支持按支付状态、场馆、用户名/订单号关键词、日期范围组合筛选。列表展示订单号、用户名、场馆、日期时段、金额、状态、操作按钮。
订单状态手动变更
管理员可对订单执行:确认已支付(待支付→已支付)、标记已完成(已支付→已完成,预约时间过后)、强制取消(任意状态→已取消,需填写取消原因)。每次变更记录操作人和时间。强制取消若涉及已支付金额需触发退款。
基础数据统计面板
管理后台首页展示基础统计卡片:今日预约数、今日营收、本月预约总数、本月营收总额。数据通过 GET /api/admin/statistics 获取,前端以卡片+简单数字呈现,无需图表。
退款记录查询
管理员 GET /api/admin/refunds?orderId=&startDate=&endDate=&page=&size= 查看全量退款记录列表,每条含退款流水号、关联订单号、用户名、退款金额、退款原因、退款时间。用户 GET /api/refunds/mine 查看自己的退款记录。
后台场地管理
管理员对场馆及场地进行增删改查、设置可预约时段模板、管理场地开放/关闭状态。
场地新增
管理员通过表单新增场地,字段含场馆名称、类型(下拉选择)、地址、联系电话、设施描述、封面图上传、开放时间。所有字段必填,场馆名称查重。提交后入库并刷新场地列表。
场地编辑
管理员点击场地行进入编辑表单,可修改名称、类型、地址、电话、设施描述、封面图、开放时间。修改保存后实时更新列表和前端展示。编辑期间锁定该场地不可被其他管理员同时编辑(乐观锁)。
场地删除(软删除)
管理员删除场地时执行软删除(标记is_deleted=true),不物理删除数据。已有关联预约记录的场地提示"该场地存在历史预约,关闭后用户将不可见,确认关闭?",确认后场地在前端不再展示。
时段模板管理
管理员可为每个场地设置每日可预约时段模板,含开始时间、结束时间、价格、容量。支持添加/删除时段行,保存后按模板自动生成未来7天的可预约时段(每日凌晨定时生成新一天时段)。修改容量时若新容量小于当前已预约数,拒绝保存并提示冲突;已有预约的时段行不可删除,需先处理冲突预约。
场地状态开关
管理员可一键切换场地开放/关闭状态。关闭后该场地所有未来时段在前端不可预约,已有预约不受影响。切换时若有待生效预约给出提示"该场地有X条未完成预约,关闭后用户将无法新增预约"。
用户认证与权限管理
管理用户注册、登录、个人信息维护及角色权限控制,区分普通用户与管理员两种角色,保障登录态安全。
用户注册
注册表单含用户名、密码(确认密码)、手机号、邮箱字段。用户名查重,密码长度6-20位。提交后后端校验并入库,自动分配普通用户角色,返回注册成功跳转登录页。需覆盖字段为空、用户名已存在、两次密码不一致的错误提示。
用户登录
登录表单含用户名+密码,提交后后端校验凭据,成功返回JWT Token并存储于前端,失败返回"用户名或密码错误"且不区分具体原因。需覆盖空字段校验、错误凭据提示、登录成功跳转。
按角色路由分流
登录成功后前端根据Token中角色字段将普通用户路由至用户首页(场馆浏览),管理员路由至后台管理面板。未登录用户访问任何受保护路由统一跳转登录页,登录后回跳原目标页。
个人信息查看与修改
用户可在个人中心查看并修改自己的手机号、邮箱、头像(可选)。修改时需通过格式校验,手机号/邮箱不可与其他用户重复。修改成功后刷新页面显示最新信息。
密码修改
修改密码需输入原密码+新密码+确认新密码。后端校验原密码正确性,新密码长度6-20位且不可与原密码相同。修改成功后强制退出并要求重新登录。
Token过期与自动刷新
JWT Token有效期2小时,前端请求拦截器在401响应时自动跳转登录页。后端同时签发refresh token(有效期7天),前端在Token过期前通过refresh token静默续期新Token,避免用户操作中断。refresh token过期则要求重新登录。
退出登录
用户点击退出按钮,前端清除本地存储的JWT Token,路由跳转至登录页。若使用了refresh token方案则一并清除。退出后浏览器后退不可回到已登录页面(路由守卫拦截)。
时段预约
处理用户对场馆可预约时段的查看、预约提交(含时间冲突检测与乐观锁防重复)、预约取消及我的预约列表查询。
可预约时段查询接口
GET /api/venues/{venueId}/slots?date=YYYY-MM-DD 返回指定日期该场馆所有时段,每个时段含slotId、时间范围、价格、剩余容量、状态。已过期时段(status=expired)和已满时段(status=full)前端置灰。
预约提交与冲突检测
POST /api/bookings 入参含venueId、slotId、日期。后端校验:①用户不能在同一时段重复预约;②时段剩余容量>0;③使用乐观锁(version字段)更新slot剩余容量,若并发冲突则返回"该时段已被抢约,请刷新重试"。成功则生成待支付订单并返回bookingId+orderId。
我的预约列表
GET /api/bookings/mine?status=&page=&size= 返回当前用户预约列表,含场馆名、日期、时段、预约状态(待支付/已支付/已取消/已完成)、关联订单号。支持按状态筛选和分页,空列表展示"暂无预约记录"。
预约取消
PUT /api/bookings/{bookingId}/cancel 用户可取消"待支付"或"已支付"状态且距预约开始时间≥2小时的预约。后端校验状态与时间窗口,取消后释放时段容量(回加剩余容量),同步取消关联订单(状态变为"已取消"),若订单已支付则触发退款流程。预约取消与订单取消为联动操作,任一方触发即同步另一方。
预约自动完成
后端定时任务每5分钟扫描一次:将"已支付"状态且预约结束时间已超过当前时间的预约记录,自动变更为"已完成"状态,关联订单同步变更为"已完成"。无需用户或管理员手动操作。
订单管理
管理用户预约后生成的订单,包括订单列表查看、订单详情、订单取消与退款申请,关联支付状态。
订单列表查看
GET /api/orders/mine?status=&page=&size= 返回当前用户订单列表,每条含订单号、场馆名、日期时段、金额、订单状态(待支付/已支付/已完成/已取消/已退款)、下单时间。支持按订单状态筛选和分页。
订单详情查看
GET /api/orders/{orderId} 返回订单完整信息:订单号、场馆名称+地址+图片、预约日期+时段、金额、支付状态、下单时间、支付时间(如有)。若订单已取消展示取消原因与取消时间。
订单取消与退款
PUT /api/orders/{orderId}/cancel 用户对"待支付"订单直接取消;对"已支付"且距预约开始时间≥2小时的订单发起退款取消。后端校验后订单状态变为"已取消",同步取消关联预约并释放时段容量;若已支付则插入退款记录并将金额回退(模拟)。订单取消与预约取消为联动操作,任一方触发即同步另一方。
待支付订单超时自动取消
定时任务每1分钟扫描:订单状态为"待支付"且创建时间距今超过30分钟的订单,自动变更为"已取消",释放关联预约的时段容量(回加剩余容量),取消原因记录"超时未支付自动取消"。
支付模拟
模拟支付流程,支持用户对未支付订单发起模拟付款、查询支付状态,订单状态随支付结果联动变更。
模拟支付发起
POST /api/payments/pay 入参orderId。后端校验订单状态必须为"待支付",模拟1-2秒处理延迟后随机返回支付成功(95%)或失败(5%)。成功后订单状态变为"已支付"、记录支付时间,失败则返回"支付失败,请重试"。
支付状态查询
GET /api/payments/{orderId}/status 返回该订单的支付状态、支付金额、支付时间(若已支付)、支付流水号。前端订单详情页和订单列表页实时展示支付状态标签。
技术架构与约束
规定前后端分离架构、技术栈选型(Spring Boot + Vue + Vite)、数据库设计、接口规范、认证方案及部署约束。
前后端分离架构
后端Spring Boot提供RESTful API,前端Vue 3 + Vite构建SPA,开发时Vite代理转发/api请求到后端(开发端口5173→后端8080),生产环境Nginx统一代理。前后端独立部署,通过JSON交互。
MySQL数据库设计
使用MySQL存储用户、场馆、时段、预约、订单、支付等核心数据。主键采用自增ID,关联字段建索引。关键并发字段(时段剩余容量)使用version字段实现乐观锁。字符集utf8mb4,时区UTC+8。
RESTful API统一规范
所有API统一返回格式{"code":200,"message":"success","data":{}}。错误码约定:200成功、400参数错误、401未认证、403无权限、404不存在、409冲突(重复预约)、500服务端错误。请求体与响应体统一使用JSON,日期格式ISO-8601。
JWT Token认证方案
后端Spring Security + JWT实现无状态认证。登录成功后签发含userId+role的Token,有效期2小时。前端Axios拦截器自动附加Authorization: Bearer头。后端拦截器校验Token有效性,接口通过@PreAuthorize注解区分角色权限。
乐观锁防重复预约
时段slot表设version字段,扣减容量时SQL: UPDATE slot SET remaining=remaining-1, version=version+1 WHERE id=? AND version=? AND remaining>0。影响行数为0则抛出并发冲突异常,前端提示用户刷新重试。避免超卖。
前端响应式适配
使用CSS媒体查询或Tailwind CSS响应式断点,确保页面在PC端(≥1024px)、平板(768-1023px)、手机端(<768px)三档均可用。场馆卡片网格自适应列数,表格在移动端转为卡片列表展示,导航栏在小屏折叠为汉堡菜单。
文件上传接口规范
POST /api/upload 支持multipart/form-data单文件上传,限制图片格式jpg/png/webp且大小≤5MB。后端存储至本地或OSS并返回可访问的URL。上传接口需JWT认证且仅管理员可调用。封面图等业务字段存储返回的URL字符串。
场馆信息浏览
面向所有用户提供场馆列表、详情查看、分类筛选与搜索功能,展示场馆设施、图片、地址及可预约时段概览。
场馆列表分页展示
首页以卡片或列表形式分页展示所有开放场馆,每页12条,显示场馆封面图、名称、地址摘要、可预约状态标签(可约/已满/关闭)。支持按默认排序,空状态展示"暂无可用场馆"提示。
场馆搜索与分类筛选
顶部搜索栏支持关键词模糊匹配场馆名称或地址;分类标签按场馆类型(篮球场/羽毛球场/游泳馆/健身房等)过滤。搜索与筛选可组合使用,结果实时刷新且保留分页。
场馆详情页
点击场馆卡片进入详情页,展示场馆大图、名称、地址、设施列表、开放时间、联系电话、场馆描述。底部固定"立即预约"按钮,点击跳转至该场馆的时段选择页。
可预约时段日历视图
场馆详情页展示7天内按日期排列的时段网格,每个时段显示时间范围(如08:00-10:00)、价格、已预约/总容量、状态(可约/已满/已过期)。已过期和已满时段置灰不可选,可约时段点击选中进入确认预约流程。