成都美誉网站设计,网站建设 6万,wordpress最大发布大小,呼和浩特建设厅网站首页#x1f525;博客主页#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞#x1f44d;收藏⭐评论✍ 文章目录 1.0 项目介绍 2.0 用户登录功能 3.0 用户管理功能 4.0 影院管理功能 5.0 电影管理功能 6.0 影厅管理功能 7.0 电影排片管理功能 8.0 用户评论管理功能 9.0 用户购票功… 博客主页 【小扳_-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 服务端技术springbootmybatisredismysql
项目功能描述
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();// 角色集合SetString roles permissionService.getRolePermission(user);// 权限集合SetString 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();ListSysMenu 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){ListUser 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){ListUser list userService.selectUserList(user);ExcelUtilUser util new ExcelUtilUser(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){ListUser list userService.addUserList(user);return getDataTable(list);}
} 2前端代码 templatediv classapp-containerel-form :modelqueryParams refqueryRef :inlinetrue v-showshowSearch label-width68pxel-form-item label用户名 propuserNameel-inputv-modelqueryParams.userNameplaceholder请输入用户名clearablekeyup.enterhandleQuery//el-form-itemel-form-item label手机号码 propphoneNumberel-inputv-modelqueryParams.phoneNumberplaceholder请输入手机号码clearablekeyup.enterhandleQuery//el-form-itemel-form-itemel-button typeprimary iconSearch clickhandleQuery搜索/el-buttonel-button iconRefresh clickresetQuery重置/el-button/el-form-item/el-formel-row :gutter10 classmb8el-col :span1.5el-buttontypeprimaryplainiconPlusclickhandleAddv-hasPermi[manage:user:add]新增/el-button/el-colel-col :span1.5el-buttontypesuccessplainiconEdit:disabledsingleclickhandleUpdatev-hasPermi[manage:user:edit]修改/el-button/el-colel-col :span1.5el-buttontypedangerplainiconDelete:disabledmultipleclickhandleDeletev-hasPermi[manage:user:remove]删除/el-button/el-colel-col :span1.5el-buttontypewarningplainiconDownloadclickhandleExportv-hasPermi[manage:user:export]导出/el-button/el-colright-toolbar v-model:showSearchshowSearch queryTablegetList/right-toolbar/el-rowel-table v-loadingloading :datauserList selection-changehandleSelectionChangeel-table-column typeselection width55 aligncenter /el-table-column label用户ID width80 aligncenter propuserId /el-table-column label用户名 width100 aligncenter propuserName /el-table-column label头像 aligncenter propavatar template #defaultscopeimage-preview :srcscope.row.avatar classavatar-image width20 height20 //template/el-table-columnel-table-column label性别 aligncenter propgendertemplate #defaultscopedict-tag :optionssys_user_sex :valuescope.row.gender//template/el-table-columnel-table-column label手机号码 aligncenter propphoneNumber /el-table-column label个人签名 aligncenter propsignature /el-table-column label操作 aligncenter class-namesmall-padding fixed-widthtemplate #defaultscopeel-button link typeprimary iconEdit clickhandleUpdate(scope.row) v-hasPermi[manage:user:edit]修改/el-buttonel-button link typeprimary iconDelete clickhandleDelete(scope.row) v-hasPermi[manage:user:remove]删除/el-button/template/el-table-column/el-tablepaginationv-showtotal0:totaltotalv-model:pagequeryParams.pageNumv-model:limitqueryParams.pageSizepaginationgetList/!-- 添加或修改用户信息对话框 --el-dialog :titletitle v-modelopen width500px append-to-bodyel-form refuserRef :modelform :rulesrules label-width80pxel-form-item label用户名 propuserNameel-input v-modelform.userName placeholder请输入用户名 //el-form-itemel-form-item label头像 propavatarimage-upload v-modelform.avatar//el-form-itemel-form-item label手机 propphoneNumberel-input v-modelform.phoneNumber placeholder请输入手机号码 //el-form-itemel-form-item label密码 proppasswordel-input v-modelform.password typepassword placeholder请输入用户密码 //el-form-itemel-form-item label性别 propgenderel-select v-modelform.gender placeholder请选择性别el-optionv-fordict in sys_user_sex:keydict.value:labeldict.label:valueparseInt(dict.value)/el-option/el-select/el-form-itemel-form-item label出生日期 propbirthDateel-date-picker clearablev-modelform.birthDatetypedatevalue-formatYYYY-MM-DDplaceholder请选择出生日期/el-date-picker/el-form-itemel-form-item label个人签名 propsignatureel-input v-modelform.signature typetextarea placeholder请输入内容 //el-form-item/el-formtemplate #footerdiv classdialog-footerel-button typeprimary clicksubmitForm确 定/el-buttonel-button clickcancel取 消/el-button/div/template/el-dialog/div
/template4.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();ListCinema 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){ListCinema list cinemaService.selectCinemaList(cinema);ExcelUtilCinema util new ExcelUtilCinema(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前端代码 templatediv classapp-containerel-form :modelqueryParams refqueryRef :inlinetrue v-showshowSearch label-width68pxel-form-item label影院名 propcinemaNameel-inputv-modelqueryParams.cinemaNameplaceholder请输入影院名clearablekeyup.enterhandleQuery//el-form-itemel-form-item label详细地址 propaddressel-inputv-modelqueryParams.addressplaceholder请输入详细地址clearablekeyup.enterhandleQuery//el-form-itemel-form-item label营业状态 propoperatingStatusel-select v-modelqueryParams.operatingStatus placeholder请选择营业状态 clearableel-optionv-fordict in operating_status:keydict.value:labeldict.label:valuedict.value//el-select/el-form-itemel-form-itemel-button typeprimary iconSearch clickhandleQuery搜索/el-buttonel-button iconRefresh clickresetQuery重置/el-button/el-form-item/el-formel-row :gutter10 classmb8el-col :span1.5el-buttontypeprimaryplainiconPlusclickhandleAddv-hasPermi[manage:cinema:add]新增/el-button/el-colel-col :span1.5el-buttontypesuccessplainiconEdit:disabledsingleclickhandleUpdatev-hasPermi[manage:cinema:edit]修改/el-button/el-colel-col :span1.5el-buttontypedangerplainiconDelete:disabledmultipleclickhandleDeletev-hasPermi[manage:cinema:remove]删除/el-button/el-colel-col :span1.5el-buttontypewarningplainiconDownloadclickhandleExportv-hasPermi[manage:cinema:export]导出/el-button/el-colright-toolbar v-model:showSearchshowSearch queryTablegetList/right-toolbar/el-rowel-table v-loadingloading :datacinemaList selection-changehandleSelectionChangeel-table-column typeselection width55 aligncenter /el-table-column label序号ID aligncenter typeindex width80/el-table-column label影院名 aligncenter propcinemaName /el-table-column label联系电话 aligncenter propcontactNumber /el-table-column label详细地址 alignleft propaddress show-overflow-tooltiptrue/el-table-column label营业状态 aligncenter propoperatingStatustemplate #defaultscopedict-tag :optionsoperating_status :valuescope.row.operatingStatus//template/el-table-columnel-table-column label更新时间 aligncenter propupdateTime width180template #defaultscopespan{{ parseTime(scope.row.updateTime, {y}-{m}-{d} {i}:{h}:{m}) }}/span/template/el-table-columnel-table-column label操作 aligncenter class-namesmall-padding fixed-widthtemplate #defaultscopeel-button link typeprimary iconEdit clickhandleUpdate(scope.row) v-hasPermi[manage:cinema:edit]修改/el-buttonel-button link typeprimary iconDelete clickhandleDelete(scope.row) v-hasPermi[manage:cinema:remove]删除/el-button/template/el-table-column/el-tablepaginationv-showtotal0:totaltotalv-model:pagequeryParams.pageNumv-model:limitqueryParams.pageSizepaginationgetList/!-- 添加或修改影院信息对话框 --el-dialog :titletitle v-modelopen width500px append-to-bodyel-form refcinemaRef :modelform :rulesrules label-width80pxel-form-item label影院名 propcinemaNameel-input v-modelform.cinemaName placeholder请输入影院名 //el-form-itemel-form-item label联系电话 propcontactNumberel-input v-modelform.contactNumber placeholder请输入联系电话 //el-form-itemel-form-item label详细地址 propaddressel-input v-modelform.address placeholder请输入详细地址 //el-form-itemel-form-item label营业状态 propoperatingStatusel-select v-modelform.operatingStatus placeholder请选择营业状态el-optionv-fordict in operating_status:keydict.value:labeldict.label:valueparseInt(dict.value)/el-option/el-select/el-form-item/el-formtemplate #footerdiv classdialog-footerel-button typeprimary clicksubmitForm确 定/el-buttonel-button clickcancel取 消/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();ListFilm 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){ListFilm list filmService.selectFilmList(film);ExcelUtilFilm util new ExcelUtilFilm(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前端代码 templatediv classapp-container background-imagediv classmovie-postersdiv v-formovie in filmList :keymovie.filmId classmovie-poster clickhandlePosterClick(movie.filmId)img :srcmovie.posterImage :altmovie.filmName /div classmovie-title{{ movie.filmName }}/divdiv classmovie-info主演:{{ movie.actors }}/div/div/divel-form :modelqueryParams refqueryRef :inlinetrue v-showshowSearch label-width68px!-- 现有的表单内容 --/el-form!-- 添加或修改购票数据对话框 --el-dialog :titletitle v-modelopen width500px append-to-bodyel-form refbyTicketRef :modelform :rulesrules label-width80px!-- 现有的表单内容 --el-form-item label电影 propfilmIdel-select v-modelform.filmId placeholder请选择电影 disabledel-optionv-foritem in filmList:keyitem.filmId:valueitem.filmId:labelitem.filmName//el-select/el-form-itemel-form-item label影院 propcinemaIdel-selectv-modelform.cinemaId placeholder请选择影院el-optionv-foritem in cinemaList:keyitem.cinemaId:valueitem.cinemaId:labelitem.cinemaName//el-select/el-form-itemel-form-item label影厅 prophallIdel-select v-modelform.hallId placeholder请选择影厅el-optionv-foritem in hallList:keyitem.hallId:valueitem.hallId:labelitem.hallName//el-select/el-form-itemel-form-item label座位号 propseatNumberel-input-number min1 max20 v-modelmyRow placeholder行排 / nbsp;el-input-number min1 max20 v-modelmyColumn placeholder竖排 //el-form-itemel-form-item label票数 propnumberOfTicketsel-input-number :min1 :max100 v-modelform.numberOfTickets placeholder输入票数 //el-form-itemel-form-item label预约时间 proppurchaseTimeel-date-picker clearablev-modelform.purchaseTimetypedatevalue-formatYYYY-MM-DDplaceholder请选择购买时间/el-date-picker/el-form-item/el-formtemplate #footerdiv classdialog-footerel-button typeprimary clicksubmitForm确 定/el-buttonel-button clickcancel取 消/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 私信给我我每天都有查看消息的感谢大家支持希望可以帮助到大家