小徐影城管理系统是一个基于SpringBoot+Vue+MySQL技术栈的现代化影院管理平台。作为一名参与过多个企业级项目开发的全栈工程师,我认为这类系统真正解决了传统影院管理的三大痛点:人工售票效率低下、排片管理混乱、数据统计困难。这个毕业设计项目采用了前后端分离架构,不仅符合当前主流开发模式,也为后续功能扩展提供了良好基础。
系统核心功能模块包括:
提示:在实际开发中,我建议将系统拆分为三个独立子项目(前端、后端、管理端),这样既便于团队协作,也能实现更灵活的部署方案。
SpringBoot 2.7.x作为后端框架是经过深思熟虑的选择。相比原生Spring,它提供了以下优势:
数据库选用MySQL 8.0主要考虑:
java复制// 典型Controller示例
@RestController
@RequestMapping("/api/movie")
public class MovieController {
@Autowired
private MovieService movieService;
@GetMapping("/list")
public Result listMovies(@RequestParam(required = false) String keyword) {
return Result.success(movieService.queryMovies(keyword));
}
}
Vue 3 + Element Plus的组合提供了良好的开发体验:
前端工程化配置要点:
javascript复制// vite.config.js 关键配置
export default defineConfig({
plugins: [vue()],
server: {
proxy: {
'/api': {
target: 'http://localhost:8080',
changeOrigin: true
}
}
}
})
影片表(movie)的设计经历了三次迭代:
sql复制CREATE TABLE `movie` (
`movie_id` int NOT NULL AUTO_INCREMENT,
`movie_name` varchar(50) COLLATE utf8mb4_bin NOT NULL,
`director` varchar(30) COLLATE utf8mb4_bin DEFAULT NULL,
`actors` varchar(100) COLLATE utf8mb4_bin DEFAULT NULL,
`release_date` date DEFAULT NULL,
`duration` int DEFAULT NULL COMMENT '分钟',
`description` text COLLATE utf8mb4_bin,
`cover_url` varchar(200) COLLATE utf8mb4_bin DEFAULT NULL,
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`movie_id`),
KEY `idx_name` (`movie_name`),
KEY `idx_date` (`release_date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
订单创建需要保证数据一致性:
java复制@Transactional
public Result createOrder(OrderDTO dto) {
// 1. 验证场次和座位
Schedule schedule = scheduleMapper.selectById(dto.getScheduleId());
if (schedule.getRemainingSeats() < dto.getSeats().size()) {
throw new BusinessException("座位不足");
}
// 2. 扣减库存
scheduleMapper.updateRemainingSeats(
dto.getScheduleId(),
-dto.getSeats().size()
);
// 3. 生成订单
Order order = new Order();
BeanUtils.copyProperties(dto, order);
orderMapper.insert(order);
// 4. 记录日志
logService.saveOperationLog("创建订单", order.getOrderId());
return Result.success(order.getOrderId());
}
前端实现要点:
vue复制<template>
<div class="seat-map">
<canvas ref="canvas" @click="handleSeatClick"></canvas>
<div class="legend">
<span v-for="(item,index) in legend" :key="index">
<i :style="{backgroundColor:item.color}"></i>
{{item.text}}
</span>
</div>
</div>
</template>
<script setup>
import { onMounted, ref } from 'vue'
const props = defineProps({
seats: { type: Array, required: true }
})
const canvas = ref(null)
const ctx = ref(null)
onMounted(() => {
ctx.value = canvas.value.getContext('2d')
drawSeatMap()
})
function drawSeatMap() {
// 绘制座位逻辑
}
</script>
后台排片时需要检测:
java复制public boolean checkScheduleConflict(Schedule newSchedule) {
// 查询该影厅已有排期
List<Schedule> exists = scheduleMapper.selectByHallId(
newSchedule.getHallId(),
newSchedule.getStartTime(),
newSchedule.getEndTime()
);
// 检测时间冲突
return exists.stream().anyMatch(s ->
!s.getScheduleId().equals(newSchedule.getScheduleId()) &&
timeOverlap(
s.getStartTime(), s.getEndTime(),
newSchedule.getStartTime(), newSchedule.getEndTime()
)
);
}
private boolean timeOverlap(LocalDateTime s1, LocalDateTime e1,
LocalDateTime s2, LocalDateTime e2) {
return s1.isBefore(e2) && e1.isAfter(s2);
}
推荐使用Docker Compose编排服务:
yaml复制version: '3'
services:
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
volumes:
- ./mysql-data:/var/lib/mysql
ports:
- "3306:3306"
backend:
build: ./backend
ports:
- "8080:8080"
depends_on:
- mysql
environment:
SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/cinema
frontend:
build: ./frontend
ports:
- "80:80"
缓存策略:
数据库优化:
sql复制-- 添加复合索引
ALTER TABLE `schedule`
ADD INDEX `idx_hall_time` (`hall_id`, `start_time`);
-- 查询优化示例
EXPLAIN SELECT * FROM `schedule`
WHERE hall_id = 3
AND start_time BETWEEN '2023-12-01' AND '2023-12-31';
前端性能:
跨域问题:
java复制@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("*")
.maxAge(3600);
}
}
时区不一致:
properties复制# application.properties
spring.jpa.properties.hibernate.jdbc.time_zone=Asia/Shanghai
spring.datasource.url=jdbc:mysql://localhost:3306/cinema?serverTimezone=Asia/Shanghai
Vue路由刷新404:
nginx复制location / {
try_files $uri $uri/ /index.html;
}
自调用问题:
java复制// 错误示例
public void updateMovie(Movie movie) {
this.saveLog(movie); // 事务失效
}
@Transactional
public void saveLog(Movie movie) {
logRepository.save(new Log("UPDATE", movie.getId()));
}
异常类型不匹配:
java复制@Transactional(rollbackFor = Exception.class) // 默认只回滚RuntimeException
public void complexOperation() throws BusinessException {
// ...
}
数据库引擎不支持:
sql复制ALTER TABLE order_detail ENGINE=InnoDB;
微信小程序端开发:
数据分析看板:
智能推荐系统:
在真实项目迭代中,我通常会先实现核心票务流程,再逐步添加增值功能。对于毕业设计而言,建议重点保证基础功能的完整性和代码质量,扩展功能可以作为加分项适当展示技术广度。