一、个人简介
💖💖作者:计算机编程果茶熊 💙💙个人简介:曾长期从事计算机专业培训教学,担任过编程老师,同时本人也热爱上课教学,擅长Java、微信小程序、Python、Golang、安卓Android等多个IT方向。会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。平常喜欢分享一些自己开发中遇到的问题的解决办法,也喜欢交流技术,大家有技术代码这一块的问题可以问我! 💛💛想说的话:感谢大家的关注与支持! 💜💜 网站实战项目 安卓/小程序实战项目 大数据实战项目 计算机毕业设计选题 💕💕文末获取源码联系计算机编程果茶熊
二、系统介绍
开发语言:Java 后端框架:Spring Boot(Spring+SpringMVC+Mybatis) 数据库:MySQL 系统架构:B/S 开发工具:IDEA
《影院订票系统》是一款基于Spring Boot框架开发的电影院票务管理平台,采用B/S架构设计,运用Java作为核心开发语言,结合Spring+SpringMVC+MyBatis技术栈构建稳定可靠的后端服务体系,使用MySQL数据库进行数据存储与管理。该系统整合了用户管理、电影类型管理、电影信息管理、充值记录管理、系统管理、订单管理以及个人中心管理等核心功能模块,为影院运营者提供全方位的票务管理解决方案,同时为观众用户提供便捷的在线购票服务体验。系统通过模块化设计实现各功能间的有效协调,确保票务流程的规范化管理,支持电影排片信息维护、座位预订、支付处理、订单跟踪等完整业务流程,有效提升影院运营效率和用户服务质量。
三、视频解说
四、部分功能展示
五、部分代码展示
import org.apache.spark.sql.SparkSession;
import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Row;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
@Transactional
public class CinemaBookingService {
@Autowired
private MovieMapper movieMapper;
@Autowired
private OrderMapper orderMapper;
@Autowired
private UserMapper userMapper;
@Autowired
private SeatMapper seatMapper;
private SparkSession spark = SparkSession.builder()
.appName("CinemaBookingAnalysis")
.master("local[*]")
.getOrCreate();
public Result processMovieBooking(BookingRequest request) {
try {
Movie movie = movieMapper.selectById(request.getMovieId());
if (movie == null || movie.getStatus() != 1) {
return Result.error("电影信息不存在或已下架");
}
List<Seat> selectedSeats = seatMapper.selectBatchIds(request.getSeatIds());
for (Seat seat : selectedSeats) {
if (seat.getStatus() != 0) {
return Result.error("座位" + seat.getSeatNo() + "已被占用");
}
}
BigDecimal totalAmount = movie.getPrice().multiply(new BigDecimal(selectedSeats.size()));
User user = userMapper.selectById(request.getUserId());
if (user.getBalance().compareTo(totalAmount) < 0) {
return Result.error("余额不足,请先充值");
}
Order order = new Order();
order.setUserId(request.getUserId());
order.setMovieId(request.getMovieId());
order.setShowTime(request.getShowTime());
order.setTotalAmount(totalAmount);
order.setStatus(1);
order.setCreateTime(new Date());
orderMapper.insert(order);
for (Seat seat : selectedSeats) {
seat.setStatus(1);
seat.setOrderId(order.getId());
seatMapper.updateById(seat);
}
user.setBalance(user.getBalance().subtract(totalAmount));
userMapper.updateById(user);
Dataset<Row> bookingData = spark.read()
.format("jdbc")
.option("url", "jdbc:mysql://localhost:3306/cinema")
.option("dbtable", "tb_order")
.option("user", "root")
.option("password", "123456")
.load();
bookingData.filter(bookingData.col("movie_id").equalTo(request.getMovieId()))
.groupBy("movie_id")
.count()
.show();
return Result.success("订票成功", order);
} catch (Exception e) {
throw new RuntimeException("订票处理失败: " + e.getMessage());
}
}
public Result processUserRecharge(RechargeRequest request) {
try {
User user = userMapper.selectById(request.getUserId());
if (user == null || user.getStatus() != 1) {
return Result.error("用户信息异常");
}
if (request.getAmount().compareTo(BigDecimal.ZERO) <= 0) {
return Result.error("充值金额必须大于0");
}
if (request.getAmount().compareTo(new BigDecimal("10000")) > 0) {
return Result.error("单次充值金额不能超过10000元");
}
RechargeRecord record = new RechargeRecord();
record.setUserId(request.getUserId());
record.setAmount(request.getAmount());
record.setPaymentMethod(request.getPaymentMethod());
record.setStatus(1);
record.setCreateTime(new Date());
rechargeMapper.insert(record);
BigDecimal newBalance = user.getBalance().add(request.getAmount());
user.setBalance(newBalance);
user.setUpdateTime(new Date());
userMapper.updateById(user);
Dataset<Row> rechargeData = spark.read()
.format("jdbc")
.option("url", "jdbc:mysql://localhost:3306/cinema")
.option("dbtable", "tb_recharge_record")
.option("user", "root")
.option("password", "123456")
.load();
rechargeData.filter(rechargeData.col("user_id").equalTo(request.getUserId()))
.agg(functions.sum("amount").alias("total_recharge"))
.show();
UserBalanceLog balanceLog = new UserBalanceLog();
balanceLog.setUserId(request.getUserId());
balanceLog.setOperationType(1);
balanceLog.setAmount(request.getAmount());
balanceLog.setBalanceBefore(user.getBalance().subtract(request.getAmount()));
balanceLog.setBalanceAfter(newBalance);
balanceLog.setCreateTime(new Date());
balanceLogMapper.insert(balanceLog);
return Result.success("充值成功", newBalance);
} catch (Exception e) {
throw new RuntimeException("充值处理失败: " + e.getMessage());
}
}
public Result processOrderManagement(OrderQueryRequest request) {
try {
QueryWrapper<Order> wrapper = new QueryWrapper<>();
if (request.getUserId() != null) {
wrapper.eq("user_id", request.getUserId());
}
if (request.getMovieId() != null) {
wrapper.eq("movie_id", request.getMovieId());
}
if (request.getStatus() != null) {
wrapper.eq("status", request.getStatus());
}
if (request.getStartDate() != null && request.getEndDate() != null) {
wrapper.between("create_time", request.getStartDate(), request.getEndDate());
}
wrapper.orderByDesc("create_time");
Page<Order> page = new Page<>(request.getPageNum(), request.getPageSize());
IPage<Order> orderPage = orderMapper.selectPage(page, wrapper);
List<OrderVO> orderVOList = new ArrayList<>();
for (Order order : orderPage.getRecords()) {
OrderVO vo = new OrderVO();
BeanUtils.copyProperties(order, vo);
Movie movie = movieMapper.selectById(order.getMovieId());
vo.setMovieName(movie.getName());
vo.setMoviePoster(movie.getPoster());
User user = userMapper.selectById(order.getUserId());
vo.setUserName(user.getNickname());
List<Seat> seats = seatMapper.selectList(
new QueryWrapper<Seat>().eq("order_id", order.getId())
);
vo.setSeatList(seats.stream().map(Seat::getSeatNo).collect(Collectors.toList()));
orderVOList.add(vo);
}
Dataset<Row> orderAnalysis = spark.read()
.format("jdbc")
.option("url", "jdbc:mysql://localhost:3306/cinema")
.option("dbtable", "tb_order")
.option("user", "root")
.option("password", "123456")
.load();
orderAnalysis.groupBy("status")
.agg(functions.count("id").alias("count"),
functions.sum("total_amount").alias("total_revenue"))
.orderBy("status")
.show();
PageResult result = new PageResult();
result.setRecords(orderVOList);
result.setTotal(orderPage.getTotal());
result.setCurrent(orderPage.getCurrent());
result.setSize(orderPage.getSize());
return Result.success("查询成功", result);
} catch (Exception e) {
throw new RuntimeException("订单管理处理失败: " + e.getMessage());
}
}
}
六、部分文档展示
七、END
💕💕文末获取源码联系计算机编程果茶熊