温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片!
1. 项目背景与需求分析
随着摄影行业的快速发展,摄影师与用户之间的约拍需求日益增长。传统的约拍方式多依赖社交平台或线下沟通,存在信息不对称、流程不透明、交易无保障等问题。本文设计并实现一个基于 Spring Boot 的摄影约拍平台,旨在为摄影师和用户搭建一个高效、便捷、可信的在线约拍桥梁。
平台核心用户分为两类:摄影师和普通用户。摄影师可以在平台发布作品集、设置服务套餐、管理档期;用户则可以浏览摄影师作品、查看档期、在线预约并完成支付。系统需要覆盖从浏览、预约、支付到评价的全流程。
2. 技术选型
本平台采用前后端分离架构,后端基于 Spring Boot 构建,前端使用 Vue 框架,数据库选用 MySQL,缓存层使用 Redis。整体技术栈如下:
| 层次 | 技术选型 | 说明 |
|---|---|---|
| 后端框架 | Spring Boot 2.7 | 快速构建 RESTful API |
| 持久层 | MyBatis-Plus | 简化数据库操作 |
| 数据库 | MySQL 8.0 | 存储业务数据 |
| 缓存 | Redis | 会话管理、热点数据缓存 |
| 安全认证 | Spring Security + JWT | 接口鉴权与身份认证 |
| 前端框架 | Vue 3 + Element Plus | 管理后台与用户端界面 |
| 文件存储 | 阿里云 OSS | 存储作品图片与头像 |
3. 系统功能模块设计
根据需求分析,平台划分为以下核心功能模块:
- 用户模块:注册登录、个人信息管理、身份切换(摄影师/用户)。
- 摄影师模块:作品集管理、服务套餐配置、档期管理、接单管理。
- 预约模块:浏览摄影师、查看档期、提交预约、确认订单。
- 订单支付模块:在线支付、订单状态流转、退款处理。
- 评价模块:订单完成后双方互评,形成信用体系。
- 消息通知模块:预约状态变更、系统公告等站内信通知。
4. 数据库设计
数据库是平台的核心支撑。根据业务需求,主要设计以下数据表:
- user:用户表,存储账号、昵称、头像、角色等基本信息。
- photographer:摄影师信息表,关联用户表,存储个人简介、服务区域、价格区间等。
- portfolio:作品集表,存储摄影师上传的作品图片与描述。
- package:服务套餐表,定义不同拍摄类型、时长与价格。
- schedule:档期表,记录摄影师可预约的时间段。
- appointment:预约订单表,记录用户与摄影师的预约关系及状态。
- review:评价表,存储订单完成后的互评内容与评分。
以预约订单表为例,核心字段包括:订单编号、用户 ID、摄影师 ID、套餐 ID、预约时间、拍摄地点、订单状态(待支付、已确认、已完成、已取消)、支付金额、创建时间等。订单状态通过状态机进行流转,确保流程严谨。
5. 核心功能实现
5.1 用户认证与权限控制
系统采用 JWT 实现无状态认证。用户登录成功后,后端签发 Token,前端在后续请求中携带 Token 访问受保护接口。Spring Security 负责拦截请求并校验 Token 合法性,同时根据用户角色(普通用户、摄影师、管理员)进行接口级权限控制。
@Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.csrf().disable() .authorizeRequests() .antMatchers("/api/auth/**").permitAll() .antMatchers("/api/photographer/**").hasRole("PHOTOGRAPHER") .antMatchers("/api/admin/**").hasRole("ADMIN") .anyRequest().authenticated() .and() .addFilterBefore(jwtFilter, UsernamePasswordAuthenticationFilter.class); } }5.2 摄影师档期管理
摄影师可以维护自己的可预约档期。系统提供按周视图展示档期,摄影师可批量设置空闲时间段。用户浏览时,系统自动过滤已预约或已过期的档期,避免冲突。
@Service public class ScheduleService { @Autowired private ScheduleMapper scheduleMapper; public List<Schedule> getAvailableSchedules(Long photographerId, LocalDate date) { LambdaQueryWrapper<Schedule> wrapper = new LambdaQueryWrapper<>(); wrapper.eq(Schedule::getPhotographerId, photographerId) .eq(Schedule::getScheduleDate, date) .eq(Schedule::getStatus, ScheduleStatus.AVAILABLE); return scheduleMapper.selectList(wrapper); } }5.3 预约下单与状态流转
用户选定摄影师和档期后提交预约,系统生成待支付订单。支付成功后订单进入已确认状态,摄影师可确认接单。拍摄完成后双方确认,订单变为已完成状态,随后可进行互评。整个状态流转通过枚举和状态机统一管理,保证业务逻辑清晰。
public enum OrderStatus { PENDING_PAYMENT(0, "待支付"), CONFIRMED(1, "已确认"), COMPLETED(2, "已完成"), CANCELLED(3, "已取消"); private final int code; private final String desc; OrderStatus(int code, String desc) { this.code = code; this.desc = desc; } }6. 系统测试与部署
系统开发完成后,对核心模块进行了功能测试和接口测试。使用 Postman 对预约下单、支付回调、档期查询等关键接口进行验证,确保接口返回正确、状态流转符合预期。同时使用 JUnit 编写单元测试覆盖服务层核心逻辑。
部署方面,后端打包为 Jar 包部署在云服务器,前端构建为静态资源部署在 Nginx,数据库使用云数据库 MySQL,图片资源存储于阿里云 OSS。通过域名解析和 HTTPS 证书配置,实现线上环境的正式访问。
7. 总结与展望
本文设计并实现了一个基于 Spring Boot 的摄影约拍平台,覆盖了用户认证、摄影师管理、档期预约、订单支付和评价等核心业务流程。系统采用前后端分离架构,具有良好的可维护性和扩展性。
后续可以从以下方向继续优化:引入消息队列提升支付回调的异步处理能力;增加基于地理位置的摄影师推荐功能;完善信用评价体系,引入更细粒度的评分维度;探索基于大模型的智能客服与拍摄风格推荐,进一步提升用户体验。