Web 毕设篇-适合小白、初级入门练手的 Spring Boot Web 毕业设计项目:电影院后台管理系统(前后端源码 + 数据库 sql 脚本)
🔥博客主页: 【小扳_-CSDN博客】
❤感谢大家点赞👍收藏⭐评论✍
文章目录
1.0 项目介绍
2.0 用户登录功能
3.0 用户管理功能
4.0 影院管理功能
5.0 电影管理功能
6.0 影厅管理功能
7.0 电影排片管理功能
8.0 用户评论管理功能
9.0 用户购票功能
10.0 用户购票记录管理
1.0 项目介绍
开发工具:IDEA、VScode
服务器:Tomcat, JDK 17
项目构建:maven
数据库:mysql 5.7
系统用户前台和管理后台两部分,项目采用前后端分离
前端技术:vue +elementUI
服务端技术:springboot+mybatis+redis+mysql
项目功能描述:
1)前台功能:
1.登录、注册、退出系统、首页、搜索
2.电影:正在热映、即将热映、经典影片
3.影院:选座订票、下单支付
4.榜单:TOP100榜
5.个人中心:我的订单、基本信息
2)后台功能:
1.登录、退出系统、首页
2.影院管理
(1)影院信息管理:添加、修改、删除、查询等功能
(2)影院区域管理:添加、修改、删除等功能
3.电影管理
(1)电影信息管理:添加、修改、删除、查询、演员和影片分类等功能
(2)电影评论管理:添加、删除等操作
(5)电影类别管理:添加、修改、删除等功能
4.影厅管理
(1)影厅信息管理:添加、修改、删除、查询、安排座位等功能
(2)影厅类别管理:添加、修改、删除等功能
5.场次管理
(1)场次信息管理:添加、修改、删除、查询、查看座位等功能
6.用户管理
(1)用户信息管理:添加、修改、删除、查询等功能
(2)订单信息管理:查询、删除等功能
(3)用户爱好管理:添加、修改、删除等功能
7.权限管理
(1)角色信息管理:添加、修改、删除、分配权限等功能
(2)资源信息管理:添加、修改、删除等功能
注意:不一定非要完全符合开发环境,有稍微的差别也是可以开发的。
2.0 用户登录功能
实现了登录校验,还有用户注册功能:
用到了 Spring Security 框架来实现登录、校验、验证等功能。
相关的部分源码:
@RestController public class SysLoginController {@Autowiredprivate SysLoginService loginService;@Autowiredprivate ISysMenuService menuService;@Autowiredprivate SysPermissionService permissionService;/*** 登录方法* * @param loginBody 登录信息* @return 结果*/@PostMapping("/login")public AjaxResult login(@RequestBody LoginBody loginBody){AjaxResult ajax = AjaxResult.success();// 生成令牌String token = loginService.login(loginBody.getUsername(), loginBody.getPassword(), loginBody.getCode(),loginBody.getUuid());ajax.put(Constants.TOKEN, token);return ajax;}/*** 获取用户信息* * @return 用户信息*/@GetMapping("getInfo")public AjaxResult getInfo(){SysUser user = SecurityUtils.getLoginUser().getUser();// 角色集合Set<String> roles = permissionService.getRolePermission(user);// 权限集合Set<String> permissions = permissionService.getMenuPermission(user);AjaxResult ajax = AjaxResult.success();ajax.put("user", user);ajax.put("roles", roles);ajax.put("permissions", permissions);return ajax;}/*** 获取路由信息* * @return 路由信息*/@GetMapping("getRouters")public AjaxResult getRouters(){Long userId = SecurityUtils.getUserId();List<SysMenu> menus = menuService.selectMenuTreeByUserId(userId);return AjaxResult.success(menuService.buildMenus(menus));} }
public String login(String username, String password, String code, String uuid){// 验证码校验validateCaptcha(username, code, uuid);// 登录前置校验loginPreCheck(username, password);// 用户验证Authentication authentication = null;try{UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(username, password);AuthenticationContextHolder.setContext(authenticationToken);// 该方法会去调用UserDetailsServiceImpl.loadUserByUsernameauthentication = authenticationManager.authenticate(authenticationToken);}catch (Exception e){if (e instanceof BadCredentialsException){AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match")));throw new UserPasswordNotMatchException();}else{AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, e.getMessage()));throw new ServiceException(e.getMessage());}}finally{AuthenticationContextHolder.clearContext();}AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success")));LoginUser loginUser = (LoginUser) authentication.getPrincipal();recordLoginInfo(loginUser.getUserId());// 生成tokenreturn tokenService.createToken(loginUser);}
3.0 用户管理功能
上传图片使用了第三方接口:x-File-Storage 框架。
相关的部分源码:
1)后端代码:
@RestController @RequestMapping("/manage/user") public class UserController extends BaseController {@Autowiredprivate IUserService userService;@Autowiredprivate SysUserServiceImpl sysUserService;/*** 查询用户信息列表*//*@PreAuthorize("@ss.hasPermi('manage:user:list')")*/@GetMapping("/list")public TableDataInfo list(User user){List<User> list = userService.selectUserList(user);TableDataInfo rspData = new TableDataInfo();rspData.setCode(HttpStatus.SUCCESS);rspData.setMsg("查询成功");rspData.setRows(list);rspData.setTotal(new PageInfo(list).getTotal());return rspData;}/*** 导出用户信息列表*/@PreAuthorize("@ss.hasPermi('manage:user:export')")@Log(title = "用户信息", businessType = BusinessType.EXPORT)@PostMapping("/export")public void export(HttpServletResponse response, User user){List<User> list = userService.selectUserList(user);ExcelUtil<User> util = new ExcelUtil<User>(User.class);util.exportExcel(response, list, "用户信息数据");}/*** 获取用户信息详细信息*/@PreAuthorize("@ss.hasPermi('manage:user:query')")@GetMapping(value = "/{userId}")public AjaxResult getInfo(@PathVariable("userId") Long userId){return success(userService.selectUserByUserId(userId));}/*** 新增用户信息*/@PreAuthorize("@ss.hasPermi('manage:user:add')")@Log(title = "用户信息", businessType = BusinessType.INSERT)@PostMappingpublic AjaxResult add(@RequestBody User user){return toAjax(userService.insertUser(user));}/*** 修改用户信息*/@PreAuthorize("@ss.hasPermi('manage:user:edit')")@Log(title = "用户信息", businessType = BusinessType.UPDATE)@PutMappingpublic AjaxResult edit(@RequestBody User user){return toAjax(userService.updateUser(user));}/*** 删除用户信息*/@PreAuthorize("@ss.hasPermi('manage:user:remove')")@Log(title = "用户信息", businessType = BusinessType.DELETE)@DeleteMapping("/{userIds}")public AjaxResult remove(@PathVariable Long[] userIds){return toAjax(userService.deleteUserByUserIds(userIds));}/*** 查询全部用户信息列表*//*@PreAuthorize("@ss.hasPermi('manage:user:list')")*/@GetMapping("/allUserList")public TableDataInfo allUserList(User user){List<User> list = userService.addUserList(user);return getDataTable(list);} }
2)前端代码:
<template><div class="app-container"><el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px"><el-form-item label="用户名" prop="userName"><el-inputv-model="queryParams.userName"placeholder="请输入用户名"clearable@keyup.enter="handleQuery"/></el-form-item><el-form-item label="手机号码" prop="phoneNumber"><el-inputv-model="queryParams.phoneNumber"placeholder="请输入手机号码"clearable@keyup.enter="handleQuery"/></el-form-item><el-form-item><el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button><el-button icon="Refresh" @click="resetQuery">重置</el-button></el-form-item></el-form><el-row :gutter="10" class="mb8"><el-col :span="1.5"><el-buttontype="primary"plainicon="Plus"@click="handleAdd"v-hasPermi="['manage:user:add']">新增</el-button></el-col><el-col :span="1.5"><el-buttontype="success"plainicon="Edit":disabled="single"@click="handleUpdate"v-hasPermi="['manage:user:edit']">修改</el-button></el-col><el-col :span="1.5"><el-buttontype="danger"plainicon="Delete":disabled="multiple"@click="handleDelete"v-hasPermi="['manage:user:remove']">删除</el-button></el-col><el-col :span="1.5"><el-buttontype="warning"plainicon="Download"@click="handleExport"v-hasPermi="['manage:user:export']">导出</el-button></el-col><right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar></el-row><el-table v-loading="loading" :data="userList" @selection-change="handleSelectionChange"><el-table-column type="selection" width="55" align="center" /><el-table-column label="用户ID" width="80" align="center" prop="userId" /><el-table-column label="用户名" width="100" align="center" prop="userName" /><el-table-column label="头像" align="center" prop="avatar" ><template #default="scope"><image-preview :src="scope.row.avatar" class="avatar-image" width="20" height="20" /></template></el-table-column><el-table-column label="性别" align="center" prop="gender"><template #default="scope"><dict-tag :options="sys_user_sex" :value="scope.row.gender"/></template></el-table-column><el-table-column label="手机号码" align="center" prop="phoneNumber" /><el-table-column label="个人签名" align="center" prop="signature" /><el-table-column label="操作" align="center" class-name="small-padding fixed-width"><template #default="scope"><el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['manage:user:edit']">修改</el-button><el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['manage:user:remove']">删除</el-button></template></el-table-column></el-table><paginationv-show="total>0":total="total"v-model:page="queryParams.pageNum"v-model:limit="queryParams.pageSize"@pagination="getList"/><!-- 添加或修改用户信息对话框 --><el-dialog :title="title" v-model="open" width="500px" append-to-body><el-form ref="userRef" :model="form" :rules="rules" label-width="80px"><el-form-item label="用户名" prop="userName"><el-input v-model="form.userName" placeholder="请输入用户名" /></el-form-item><el-form-item label="头像" prop="avatar"><image-upload v-model="form.avatar"/></el-form-item><el-form-item label="手机" prop="phoneNumber"><el-input v-model="form.phoneNumber" placeholder="请输入手机号码" /></el-form-item><el-form-item label="密码" prop="password"><el-input v-model="form.password" type="password" placeholder="请输入用户密码" /></el-form-item><el-form-item label="性别" prop="gender"><el-select v-model="form.gender" placeholder="请选择性别"><el-optionv-for="dict in sys_user_sex":key="dict.value":label="dict.label":value="parseInt(dict.value)"></el-option></el-select></el-form-item><el-form-item label="出生日期" prop="birthDate"><el-date-picker clearablev-model="form.birthDate"type="date"value-format="YYYY-MM-DD"placeholder="请选择出生日期"></el-date-picker></el-form-item><el-form-item label="个人签名" prop="signature"><el-input v-model="form.signature" type="textarea" placeholder="请输入内容" /></el-form-item></el-form><template #footer><div class="dialog-footer"><el-button type="primary" @click="submitForm">确 定</el-button><el-button @click="cancel">取 消</el-button></div></template></el-dialog></div> </template>
4.0 影院管理功能
相关的部分源码:
1)后端代码:
@RestController @RequestMapping("/manage/cinema") public class CinemaController extends BaseController {@Autowiredprivate ICinemaService cinemaService;/*** 查询影院信息列表*/@PreAuthorize("@ss.hasPermi('manage:cinema:list')")@GetMapping("/list")public TableDataInfo list(Cinema cinema){startPage();List<Cinema> list = cinemaService.selectCinemaList(cinema);return getDataTable(list);}/*** 导出影院信息列表*/@PreAuthorize("@ss.hasPermi('manage:cinema:export')")@Log(title = "影院信息", businessType = BusinessType.EXPORT)@PostMapping("/export")public void export(HttpServletResponse response, Cinema cinema){List<Cinema> list = cinemaService.selectCinemaList(cinema);ExcelUtil<Cinema> util = new ExcelUtil<Cinema>(Cinema.class);util.exportExcel(response, list, "影院信息数据");}/*** 获取影院信息详细信息*/@PreAuthorize("@ss.hasPermi('manage:cinema:query')")@GetMapping(value = "/{cinemaId}")public AjaxResult getInfo(@PathVariable("cinemaId") Long cinemaId){return success(cinemaService.selectCinemaByCinemaId(cinemaId));}/*** 新增影院信息*/@PreAuthorize("@ss.hasPermi('manage:cinema:add')")@Log(title = "影院信息", businessType = BusinessType.INSERT)@PostMappingpublic AjaxResult add(@RequestBody Cinema cinema){return toAjax(cinemaService.insertCinema(cinema));}/*** 修改影院信息*/@PreAuthorize("@ss.hasPermi('manage:cinema:edit')")@Log(title = "影院信息", businessType = BusinessType.UPDATE)@PutMappingpublic AjaxResult edit(@RequestBody Cinema cinema){return toAjax(cinemaService.updateCinema(cinema));}/*** 删除影院信息*/@PreAuthorize("@ss.hasPermi('manage:cinema:remove')")@Log(title = "影院信息", businessType = BusinessType.DELETE)@DeleteMapping("/{cinemaIds}")public AjaxResult remove(@PathVariable Long[] cinemaIds){return toAjax(cinemaService.deleteCinemaByCinemaIds(cinemaIds));} }
2)前端代码:
<template><div class="app-container"><el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px"><el-form-item label="影院名" prop="cinemaName"><el-inputv-model="queryParams.cinemaName"placeholder="请输入影院名"clearable@keyup.enter="handleQuery"/></el-form-item><el-form-item label="详细地址" prop="address"><el-inputv-model="queryParams.address"placeholder="请输入详细地址"clearable@keyup.enter="handleQuery"/></el-form-item><el-form-item label="营业状态" prop="operatingStatus"><el-select v-model="queryParams.operatingStatus" placeholder="请选择营业状态" clearable><el-optionv-for="dict in operating_status":key="dict.value":label="dict.label":value="dict.value"/></el-select></el-form-item><el-form-item><el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button><el-button icon="Refresh" @click="resetQuery">重置</el-button></el-form-item></el-form><el-row :gutter="10" class="mb8"><el-col :span="1.5"><el-buttontype="primary"plainicon="Plus"@click="handleAdd"v-hasPermi="['manage:cinema:add']">新增</el-button></el-col><el-col :span="1.5"><el-buttontype="success"plainicon="Edit":disabled="single"@click="handleUpdate"v-hasPermi="['manage:cinema:edit']">修改</el-button></el-col><el-col :span="1.5"><el-buttontype="danger"plainicon="Delete":disabled="multiple"@click="handleDelete"v-hasPermi="['manage:cinema:remove']">删除</el-button></el-col><el-col :span="1.5"><el-buttontype="warning"plainicon="Download"@click="handleExport"v-hasPermi="['manage:cinema:export']">导出</el-button></el-col><right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar></el-row><el-table v-loading="loading" :data="cinemaList" @selection-change="handleSelectionChange"><el-table-column type="selection" width="55" align="center" /><el-table-column label="序号ID" align="center" type="index" width="80"/><el-table-column label="影院名" align="center" prop="cinemaName" /><el-table-column label="联系电话" align="center" prop="contactNumber" /><el-table-column label="详细地址" align="left" prop="address" show-overflow-tooltip="true"/><el-table-column label="营业状态" align="center" prop="operatingStatus"><template #default="scope"><dict-tag :options="operating_status" :value="scope.row.operatingStatus"/></template></el-table-column><el-table-column label="更新时间" align="center" prop="updateTime" width="180"><template #default="scope"><span>{{ parseTime(scope.row.updateTime, '{y}-{m}-{d} {i}:{h}:{m}') }}</span></template></el-table-column><el-table-column label="操作" align="center" class-name="small-padding fixed-width"><template #default="scope"><el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['manage:cinema:edit']">修改</el-button><el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['manage:cinema:remove']">删除</el-button></template></el-table-column></el-table><paginationv-show="total>0":total="total"v-model:page="queryParams.pageNum"v-model:limit="queryParams.pageSize"@pagination="getList"/><!-- 添加或修改影院信息对话框 --><el-dialog :title="title" v-model="open" width="500px" append-to-body><el-form ref="cinemaRef" :model="form" :rules="rules" label-width="80px"><el-form-item label="影院名" prop="cinemaName"><el-input v-model="form.cinemaName" placeholder="请输入影院名" /></el-form-item><el-form-item label="联系电话" prop="contactNumber"><el-input v-model="form.contactNumber" placeholder="请输入联系电话" /></el-form-item><el-form-item label="详细地址" prop="address"><el-input v-model="form.address" placeholder="请输入详细地址" /></el-form-item><el-form-item label="营业状态" prop="operatingStatus"><el-select v-model="form.operatingStatus" placeholder="请选择营业状态"><el-optionv-for="dict in operating_status":key="dict.value":label="dict.label":value="parseInt(dict.value)"></el-option></el-select></el-form-item></el-form><template #footer><div class="dialog-footer"><el-button type="primary" @click="submitForm">确 定</el-button><el-button @click="cancel">取 消</el-button></div></template></el-dialog></div> </template>
5.0 电影管理功能
相关部分源码:
@Autowiredprivate IFilmService filmService;/*** 查询电影信息列表*/@PreAuthorize("@ss.hasPermi('manage:film:list')")@GetMapping("/list")public TableDataInfo list(Film film){startPage();List<Film> list = filmService.selectFilmList(film);return getDataTable(list);}/*** 导出电影信息列表*/@PreAuthorize("@ss.hasPermi('manage:film:export')")@Log(title = "电影信息", businessType = BusinessType.EXPORT)@PostMapping("/export")public void export(HttpServletResponse response, Film film){List<Film> list = filmService.selectFilmList(film);ExcelUtil<Film> util = new ExcelUtil<Film>(Film.class);util.exportExcel(response, list, "电影信息数据");}
6.0 影厅管理功能
相关源码:
/*** 获取影厅信息详细信息*/@PreAuthorize("@ss.hasPermi('manage:hall:query')")@GetMapping(value = "/{hallId}")public AjaxResult getInfo(@PathVariable("hallId") Long hallId){return success(hallService.selectHallByHallId(hallId));}/*** 新增影厅信息*/@PreAuthorize("@ss.hasPermi('manage:hall:add')")@Log(title = "影厅信息", businessType = BusinessType.INSERT)@PostMappingpublic AjaxResult add(@RequestBody Hall hall){return toAjax(hallService.insertHall(hall));}/*** 修改影厅信息*/@PreAuthorize("@ss.hasPermi('manage:hall:edit')")@Log(title = "影厅信息", businessType = BusinessType.UPDATE)@PutMappingpublic AjaxResult edit(@RequestBody Hall hall){return toAjax(hallService.updateHall(hall));}
7.0 电影排片管理功能
相关源码:
/*** 获取电影排片详细信息*/@PreAuthorize("@ss.hasPermi('manage:schedule:query')")@GetMapping(value = "/{scheduleId}")public AjaxResult getInfo(@PathVariable("scheduleId") Long scheduleId){return success(scheduleService.selectScheduleByScheduleId(scheduleId));}/*** 新增电影排片*/@PreAuthorize("@ss.hasPermi('manage:schedule:add')")@Log(title = "电影排片", businessType = BusinessType.INSERT)@PostMappingpublic AjaxResult add(@RequestBody Schedule schedule){return toAjax(scheduleService.insertSchedule(schedule));}/*** 修改电影排片*/@PreAuthorize("@ss.hasPermi('manage:schedule:edit')")@Log(title = "电影排片", businessType = BusinessType.UPDATE)@PutMappingpublic AjaxResult edit(@RequestBody Schedule schedule){return toAjax(scheduleService.updateSchedule(schedule));}
8.0 用户评论管理功能
相关源码:
/*** 获取用户评价详细信息*/@PreAuthorize("@ss.hasPermi('manage:review:query')")@GetMapping(value = "/{reviewId}")public AjaxResult getInfo(@PathVariable("reviewId") Long reviewId){return success(reviewService.selectReviewByReviewId(reviewId));}/*** 新增用户评价*/@PreAuthorize("@ss.hasPermi('manage:review:add')")@Log(title = "用户评价", businessType = BusinessType.INSERT)@PostMappingpublic AjaxResult add(@RequestBody Review review){return toAjax(reviewService.insertReview(review));}/*** 修改用户评价*/@PreAuthorize("@ss.hasPermi('manage:review:edit')")@Log(title = "用户评价", businessType = BusinessType.UPDATE)@PutMappingpublic AjaxResult edit(@RequestBody Review review){return toAjax(reviewService.updateReview(review));}
9.0 用户购票功能
相关源码:
1)后端代码:
/*** 获取购票数据详细信息*/@PreAuthorize("@ss.hasPermi('manage:byTicket:query')")@GetMapping(value = "/{ticketId}")public AjaxResult getInfo(@PathVariable("ticketId") Long ticketId){return success(byTicketService.selectByTicketByTicketId(ticketId));}/*** 新增购票数据*/@PreAuthorize("@ss.hasPermi('manage:byTicket:add')")@Log(title = "购票数据", businessType = BusinessType.INSERT)@PostMappingpublic AjaxResult add(@RequestBody ByTicket byTicket){if (byTicket.getUserId() == null){byTicket.setUserId(getUserId());}return toAjax(byTicketService.insertByTicket(byTicket));}/*** 修改购票数据*/@PreAuthorize("@ss.hasPermi('manage:byTicket:edit')")@Log(title = "购票数据", businessType = BusinessType.UPDATE)@PutMappingpublic AjaxResult edit(@RequestBody ByTicket byTicket){return toAjax(byTicketService.updateByTicket(byTicket));}
2)前端代码:
<template><div class="app-container background-image"><div class="movie-posters"><div v-for="movie in filmList" :key="movie.filmId" class="movie-poster" @click="handlePosterClick(movie.filmId)"><img :src="movie.posterImage" :alt="movie.filmName" /><div class="movie-title">{{ movie.filmName }}</div><div class="movie-info">主演:{{ movie.actors }}</div></div></div><el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px"><!-- 现有的表单内容 --></el-form><!-- 添加或修改购票数据对话框 --><el-dialog :title="title" v-model="open" width="500px" append-to-body><el-form ref="byTicketRef" :model="form" :rules="rules" label-width="80px"><!-- 现有的表单内容 --><el-form-item label="电影" prop="filmId"><el-select v-model="form.filmId" placeholder="请选择电影" disabled><el-optionv-for="item in filmList":key="item.filmId":value="item.filmId":label="item.filmName"/></el-select></el-form-item><el-form-item label="影院" prop="cinemaId"><el-selectv-model="form.cinemaId" placeholder="请选择影院"><el-optionv-for="item in cinemaList":key="item.cinemaId":value="item.cinemaId":label="item.cinemaName"/></el-select></el-form-item><el-form-item label="影厅" prop="hallId"><el-select v-model="form.hallId" placeholder="请选择影厅"><el-optionv-for="item in hallList":key="item.hallId":value="item.hallId":label="item.hallName"/></el-select></el-form-item><el-form-item label="座位号" prop="seatNumber"><el-input-number min="1" max="20" v-model="myRow" placeholder="行排" /> <el-input-number min="1" max="20" v-model="myColumn" placeholder="竖排" /></el-form-item><el-form-item label="票数" prop="numberOfTickets"><el-input-number :min="1" :max="100" v-model="form.numberOfTickets" placeholder="输入票数" /></el-form-item><el-form-item label="预约时间" prop="purchaseTime"><el-date-picker clearablev-model="form.purchaseTime"type="date"value-format="YYYY-MM-DD"placeholder="请选择购买时间"></el-date-picker></el-form-item></el-form><template #footer><div class="dialog-footer"><el-button type="primary" @click="submitForm">确 定</el-button><el-button @click="cancel">取 消</el-button></div></template></el-dialog></div> </template>
10.0 用户购票记录管理
相关部分代码:
//根据电影ID查询电影排片列表获取对应的电影院@GetMapping("/cinemaList/{filmId}")@PreAuthorize("@ss.hasPermi('manage:byTicket:list')")public AjaxResult cinemaList(@PathVariable("filmId") Long filmId){return success(byTicketService.cinemaSelectScheduleListByFilmId(filmId));}//根据电影ID查询电影排片列表获取对应的影厅@GetMapping("/hallList/{filmId}")@PreAuthorize("@ss.hasPermi('manage:byTicket:list')")public AjaxResult hallList(@PathVariable("filmId") Long filmId){return success(byTicketService.hallSelectScheduleListByFilmId(filmId));}
若需要项目完整源码,可以在 CSDN 私信给我,我每天都有查看消息的,感谢大家支持,希望可以帮助到大家!
相关文章:

Web 毕设篇-适合小白、初级入门练手的 Spring Boot Web 毕业设计项目:电影院后台管理系统(前后端源码 + 数据库 sql 脚本)
🔥博客主页: 【小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 文章目录 1.0 项目介绍 2.0 用户登录功能 3.0 用户管理功能 4.0 影院管理功能 5.0 电影管理功能 6.0 影厅管理功能 7.0 电影排片管理功能 8.0 用户评论管理功能 9.0 用户购票功…...

Linux(网络协议和管理)
后面也会持续更新,学到新东西会在其中补充。 建议按顺序食用,欢迎批评或者交流! 缺什么东西欢迎评论!我都会及时修改的! 在这里真的很感谢这位老师的教学视频让迷茫的我找到了很好的学习视频 王晓春老师的个人空间…...

C++ 入门第 20 天:STL 容器之无序集合与无序多重集合
往期回顾: C 入门17:STL 容器之映射(map)与多重映射(multimap)_-CSDN博客 C 入门18:STL 容器之栈(stack)与队列(queue)-CSDN博客 C 入门19&#x…...

devops-部署Harbor实现私有Docker镜像仓库
文章目录 概述下载配置安装安装后生成的文件使用和维护Harbor参考资料 概述 Harbor是一个开源注册中心,它使用策略和基于角色的访问控制来保护工件,确保镜像被扫描并且没有漏洞,并将镜像签名为可信的。Harbor是CNCF的一个毕业项目࿰…...

rebase ‘A‘ onto ‘master‘ 和 merge ‘master‘ into ‘A‘有什么区别
在Git版本控制系统中,rebase 和 merge 是两种不同的操作,用于合并分支。rebase A onto master 和 merge master into A 虽然最终目的都是将两个分支的更改合并在一起,但它们在处理方式和结果上有所不同。 rebase ‘A’ onto ‘master’ 含义…...

Vulhub:Jackson[漏洞复现]
CVE-2017-7525(Jackson反序列化) 启动漏洞环境 docker-compose up -d 阅读vulhub给出的漏洞文档 cat README.zh-cn.md # Jackson-databind 反序列化漏洞(CVE-2017-7525) Jackson-databind 支持 [Polymorphic Deserialization](https://github.com/Fas…...

strongswan构建测试环境
make-testing脚本文件负责构建strongswan的虚拟化测试系统。位于目录strongswan-5.9.14/testing/,需要以管理员身份运行make-testing。生成测试用到的虚拟客户机镜像,KVM虚拟机和虚拟网络的配置文件位于目录:config/kvm。 ~/strongswan-5.9.14/testing$…...

前端:金额高精度处理
Decimal 是什么 想必大家在用js 处理 数字的 加减乘除的时候,或许都有遇到过 精度不够 的问题,还有那些经典的面试题 0.20.1 ! 0.3, 至于原因,那就是 js 计算底层用的是 IEEE 754 ,精度上有限制, 那么Deci…...

面试题整理3----nc命令的常见用法
面试题整理3----nc命令的常见用法 1. NC是什么2. NC的常用参数2.1 开启指定端口TCP监听(-l小写的L)2.2 测试端口是否能访问(-v)2.3 开启指定端口UDP监听(-u)2.4 端口扫描(-z)2.5 指定超时时间(-w)2.6 指定本地端口号连接(-p)2.7 指定的命令(-e) 1. NC是什么 nc(Net…...

Trimble天宝三维激光扫描仪在建筑工程竣工测量中的应用【沪敖3D】
竣工测量是建筑项目竣工阶段的一个至关重要的环节,它为建筑工程的质量验收和成果核查提供了核心的参考依据。传统的竣工测量方法,如全站仪测量,主要依赖于现场人工操作,存在一些明显的局限性,例如作业时间长、工作量大…...

IntelliJ IDEA 使用技巧与插件推荐
目录 常用使用技巧 1. 使用快捷键提升开发效率 2. 多光标编辑 3. 代码自动补全 4. 使用 Find Action 快速执行操作 5. 集成版本控制系统(VCS) 6. 快速查看代码文档 推荐插件 1. Lombok Plugin 2. Rainbow Brackets 3. Key Promoter X 4. Chec…...

Oracle 技术精选学习
Oracle 技术犹如一座闪耀着无尽光芒的灯塔,为众多 IT 从业者和技术爱好者照亮了前行的道路。无论是数据库管理、企业应用开发还是数据分析,Oracle 都以其强大、稳定和广泛的应用而占据着行业的重要地位。学习 Oracle 技术,更是能为个人带来诸…...

sqlilabs第三十关到第三十五关靶场攻略
第三十关 第三十关和二十九关差不多,将单引号换成双引号 查询表名,字段名,数据 ?id1&id-2" union select 1,group_concat(table_name),3 from information_schema.tables where table_schemadatabase()-- ?id1&id-2" …...

windows免登录linux
windows 生成秘钥文件 ssh-keygen -t rsa 将公钥传送到服务器 scp C:\Users\xx/.ssh/id_rsa.pub xxxx:/home/ruoyi/id_rsa.pub linux 使用ssh-copy-id -i ~/.ssh/id_rsa.pub userhost 如果禁用root登录,先开启 vim /etc/ssh/sshd_config PermitRootLogin yes …...

matlab绘图时设置左、右坐标轴为不同颜色
目录 一、需求描述 二、实现方法 一、需求描述 当图中存在两条曲线,需要对两条曲线进行分别描述时,应设置左、右坐标轴为不同颜色,并设置刻度线,且坐标轴颜色需要和曲线颜色相同。 二、实现方法 1.1、可以实现: 1…...

springboot+javafx使用aop切面导致的fx:id不能被注入问题
记录一个我遇到得问题 问题描述 我本来使用AOP切面来进行全局异常管理,但是使用AOP之后fxml中通过fx:id绑定得参数无法被注入 Slf4j Component Aspect public class GlobalExceptionAspect {AfterThrowing(pointcut "execution(* com.shkj.videoclassifica…...

说说你对java lambda表达式的理解?
大家好,我是锋哥。今天分享关于【说说你对java lambda表达式的理解?】面试题。希望对大家有帮助; 说说你对java lambda表达式的理解? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Java Lambda 表达式是 Java 8 引入的一项重要特性&#…...

优化你的 3D Tiles:性能与质量的平衡
优化你的 3D Tiles:性能与质量的平衡 在现代的三维场景渲染中,3D Tiles 是一种强大的技术,它能以高效、分级加载的方式呈现海量的三维数据。然而,优化 3D Tiles 以实现性能与质量的平衡,却是一个复杂且关键的任务。本…...

【数据结构——线性表】单链表的基本运算(头歌实践教学平台习题)【合集】
目录😋 任务描述 相关知识 测试说明 我的通关代码: 测试结果: 任务描述 本关任务:编写一个程序实现单链表的基本运算。 相关知识 为了完成本关任务,你需要掌握:初始化线性表、销毁线性表、判定是否为空表、求线性…...

设计模式之桥接模式:抽象与实现之间的分离艺术
~犬📰余~ “我欲贱而贵,愚而智,贫而富,可乎? 曰:其唯学乎” 桥接模式概述与角色组成 想象一下你家里的电视遥控器,无论是索尼还是三星的电视机,遥控器的按键功能都差不多࿱…...

网络隧道与代理
文章目录 网络隧道网络代理参考 网络隧道 使用隧道的原因是在不兼容的网络上传输数据,或在不安全网络上提供一个安全路径。网络隧道的一个典型特征就是封装报文和对报文加密。如下是两个典型的案例:IPv4到IPv6的迁移、VPN。 图3.1 IPv4到IPv6的迁移 图…...

游戏关卡分析:荒野大镖客2雪山终战
1、相关剧情 主角约翰一家在农场过着悠闲的日子,突然平静被打破, 女枪手来报信,在某小镇找到了迈卡的消息。 于是激发了约翰的满腔怒气,不顾妻子的反对,坚决要出战, 要彻底歼灭迈卡,为亚瑟…...

Java 中的 LocalDateTime、DateTime 和 Date 的区别解析
目录 前言 一、LocalDateTime:新的 Java 8 日期时间 API 1.1 LocalDateTime 简介 1.2 设计理念 1.3 适用场景 1.4 示例代码 二、DateTime:没有明确标准的类 2.1 DateTime 的模糊性 2.2 适用场景 三、Date:老旧的日期时间类 3.1 Da…...

MATLAB引用矩阵元素的几种方法
引用矩阵元素可以通过索引,也可以通过逻辑值 索引 通过引用元素在矩阵中的位置来提取元素,例如: - 逻辑值 通过某种逻辑运算来使得要提取的值变为逻辑 1 1 1,用 A ( ) A() A()提取即可, A A A为原矩阵的名称。 例如&…...

Linux、File System、Linux基本常用命令
一、File System 文件系统 Linux文件系统是操作系统用来组织、管理和存储问价及目录结构的方式。它不仅定义了如何将数据保存到磁盘上,还规定了用户如何与这些数据进行交互。 1、层次结构 根目录(/):所有文件和目录都从根目录开始…...

大数据治理:开启数据价值挖掘之旅
在当今数字化时代,数据呈爆炸式增长,大数据已经渗透到各个行业和领域,成为企业竞争和创新的关键驱动力。而大数据治理作为有效管理和利用大数据资源的核心手段,在教学领域也具有至关重要的地位。 一、大数据治理的内涵与重要性 大…...

Linux排查cpu运行负载过高
方式1:top 先输入top再输入1,查看 %CPU 列,找出占用 CPU 最多的进程 作用:切换显示每个逻辑 CPU 的使用情况。效果: 如果系统有多个 CPU 核心或超线程逻辑处理器,按下 1 会使得 top 分别显示每个逻辑 CPU…...

Cobalt Strike 4.8 用户指南-第十四节 Aggressor 脚本
14.1、什么是Aggressor脚本 Aggressor Script 是Cobalt Strike 3.0版及更高版本中内置的脚本语言。Aggressor 脚本允许你修改和扩展 Cobalt Strike 客户端。 历史 Aggressor Script 是 Armitage 中开源脚本引擎Cortana的精神继承者。Cortana 是通过与 DARPA 的网络快速跟踪计…...

C++并发与多线程(高级函数async)
async 在 C 中,async 关键字用于实现异步编程,它允许你定义异步操作,这些操作可以在后台执行,而不会阻塞当前线程。这是 C11 引入的特性,与 std::async 函数和 std::future 类一起使用。与thread函数模板的区别在于as…...

安卓课设版算法计算器
安卓课设版算法计算器(HNUST) 前言: 如果只想看函数使用说明请跳转到“四、使用函数介绍” 该版本为课设版,富含多个界面,是前版的plus版本,进行了更多的复杂化操作,故因此会觉得对于计算器有点…...