当前位置: 首页 > article >正文

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
{
    @Autowired
    private SysLoginService loginService;

    @Autowired
    private ISysMenuService menuService;

    @Autowired
    private 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.loadUserByUsername
            authentication = 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());
        // 生成token
        return tokenService.createToken(loginUser);
    }

        3.0 用户管理功能

         上传图片使用了第三方接口:x-File-Storage 框架。

 相关的部分源码:

        1)后端代码:

@RestController
@RequestMapping("/manage/user")
public class UserController extends BaseController
{
    @Autowired
    private IUserService userService;
    @Autowired
    private 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)
    @PostMapping
    public AjaxResult add(@RequestBody User user)
    {
        return toAjax(userService.insertUser(user));
    }

    /**
     * 修改用户信息
     */
    @PreAuthorize("@ss.hasPermi('manage:user:edit')")
    @Log(title = "用户信息", businessType = BusinessType.UPDATE)
    @PutMapping
    public 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-input
          v-model="queryParams.userName"
          placeholder="请输入用户名"
          clearable
          @keyup.enter="handleQuery"
        />
      </el-form-item>
      <el-form-item label="手机号码" prop="phoneNumber">
        <el-input
          v-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-button
          type="primary"
          plain
          icon="Plus"
          @click="handleAdd"
          v-hasPermi="['manage:user:add']"
        >新增</el-button>
      </el-col>
      <el-col :span="1.5">
        <el-button
          type="success"
          plain
          icon="Edit"
          :disabled="single"
          @click="handleUpdate"
          v-hasPermi="['manage:user:edit']"
        >修改</el-button>
      </el-col>
      <el-col :span="1.5">
        <el-button
          type="danger"
          plain
          icon="Delete"
          :disabled="multiple"
          @click="handleDelete"
          v-hasPermi="['manage:user:remove']"
        >删除</el-button>
      </el-col>
      <el-col :span="1.5">
        <el-button
          type="warning"
          plain
          icon="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>
    
    <pagination
      v-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-option
              v-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 clearable
            v-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
{
    @Autowired
    private 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)
    @PostMapping
    public AjaxResult add(@RequestBody Cinema cinema)
    {
        return toAjax(cinemaService.insertCinema(cinema));
    }

    /**
     * 修改影院信息
     */
    @PreAuthorize("@ss.hasPermi('manage:cinema:edit')")
    @Log(title = "影院信息", businessType = BusinessType.UPDATE)
    @PutMapping
    public 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-input
          v-model="queryParams.cinemaName"
          placeholder="请输入影院名"
          clearable
          @keyup.enter="handleQuery"
        />
      </el-form-item>
      <el-form-item label="详细地址" prop="address">
        <el-input
          v-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-option
            v-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-button
          type="primary"
          plain
          icon="Plus"
          @click="handleAdd"
          v-hasPermi="['manage:cinema:add']"
        >新增</el-button>
      </el-col>
      <el-col :span="1.5">
        <el-button
          type="success"
          plain
          icon="Edit"
          :disabled="single"
          @click="handleUpdate"
          v-hasPermi="['manage:cinema:edit']"
        >修改</el-button>
      </el-col>
      <el-col :span="1.5">
        <el-button
          type="danger"
          plain
          icon="Delete"
          :disabled="multiple"
          @click="handleDelete"
          v-hasPermi="['manage:cinema:remove']"
        >删除</el-button>
      </el-col>
      <el-col :span="1.5">
        <el-button
          type="warning"
          plain
          icon="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>
    
    <pagination
      v-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-option
              v-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 电影管理功能

相关部分源码:

    @Autowired
    private 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)
    @PostMapping
    public AjaxResult add(@RequestBody Hall hall)
    {
        return toAjax(hallService.insertHall(hall));
    }

    /**
     * 修改影厅信息
     */
    @PreAuthorize("@ss.hasPermi('manage:hall:edit')")
    @Log(title = "影厅信息", businessType = BusinessType.UPDATE)
    @PutMapping
    public 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)
    @PostMapping
    public AjaxResult add(@RequestBody Schedule schedule)
    {
        return toAjax(scheduleService.insertSchedule(schedule));
    }

    /**
     * 修改电影排片
     */
    @PreAuthorize("@ss.hasPermi('manage:schedule:edit')")
    @Log(title = "电影排片", businessType = BusinessType.UPDATE)
    @PutMapping
    public 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)
    @PostMapping
    public AjaxResult add(@RequestBody Review review)
    {
        return toAjax(reviewService.insertReview(review));
    }

    /**
     * 修改用户评价
     */
    @PreAuthorize("@ss.hasPermi('manage:review:edit')")
    @Log(title = "用户评价", businessType = BusinessType.UPDATE)
    @PutMapping
    public 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)
    @PostMapping
    public 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)
    @PutMapping
    public 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-option
             v-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-select
          v-model="form.cinemaId" placeholder="请选择影院">
            <el-option
             v-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-option
             v-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="行排" /> &nbsp;
          <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 clearable
            v-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 私信给我,我每天都有查看消息的,感谢大家支持,希望可以帮助到大家!


http://www.kler.cn/a/408529.html

相关文章:

  • 微信小程序全局配置:导航栏、下拉刷新与上拉触底设置教程
  • Vue生命周期详解
  • 社交电商专业赋能高校教育与产业协同发展:定制开发AI智能名片及2+1链动商城小程序的创新驱动
  • Odoo :免费且开源的农牧行业ERP管理系统
  • 基于深度学习CNN算法的花卉分类识别系统01--带数据集-pyqt5UI界面-全套源码
  • 若依-一个请求中返回多个表的信息
  • 亚太杯数学建模C题思路与算法(2024)
  • 手机文件可以打印出来吗
  • linux 运维常用命令
  • 使用NAS开启无纸化办公,Docker部署开源文档管理系统『Paperless-ngx』
  • kali中信息收集的一些常用工具
  • hugo文章支持数学公式
  • 第三十章 TCP 客户端 服务器通信 - 作业服务器资源
  • 【c++篇】掌握动态内存的奥妙
  • 丑数 详解
  • 修改ffmpeg实现https-flv内容加密
  • apache、iis屏蔽限制ip访问(适用虚拟主机)
  • C语言-详细讲解-洛谷P1420 最长连号
  • 字符串-07-判断两个IP是否属于同一子网
  • 微信小程序中使用iconfont的详细教程
  • Python棉花病虫害图谱系统CNN识别+AI问答知识neo4j vue+flask深度学习神经网络可视化
  • grep/egrep正则表达式
  • Linux基本指令的使用
  • 力扣 239. 滑动窗口最大值
  • 数字化工厂 MES试点方案全解析(三)
  • 行为树详解(2)——最简单的行为树