基于javaweb+mysql的springboot+jpa电影售票网站购票平台管理系统(前台、后台)(javaweb+springboot+jpa+freemarker+bootstrap+mysql)
运行环境
Java≥8、MySQL≥5.7
开发工具
eclipse/idea/myeclipse/sts等均可配置运行
适用
课程设计,大作业,毕业设计,项目练习,学习演示等
功能说明
前台:查看电影、影院、评论、购票下单等…………
后台: 管理电影、影院、排片、管理员、前端用户、订单等…………
前台
后台
技术框架
JavaWeb SpringBoot JPA Freemarker Bootstrap JavaScript SpringMVC MySQL
基于javaweb+mysql的SpringBoot+JPA电影售票网站购票平台管理系统(前台、后台)(javaweb+springboot+jpa+freemarker+bootstrap+mysql)
* 排片场次编辑页面
* @param model
* @param id
* @return
*/
@RequestMapping(value="/edit",method=RequestMethod.GET)
public String edit(Model model,@RequestParam(name="id",required=true)Long id){
model.addAttribute("cinemaHallSession", cinemaHallSessionService.findById(id));
model.addAttribute("movieList", movieService.findAll());
model.addAttribute("cinemaList", cinemaService.findAll());
model.addAttribute("cinemaSessionTypeList", CinemaSessionType.values());
return "admin/cinema_hall_session/edit";
}
/**
* 添加排片场次表单提交
* @param cinemaHallSession
* @return
*/
@RequestMapping(value="/add",method=RequestMethod.POST)
@ResponseBody
public Result<Boolean> add(CinemaHallSession cinemaHallSession){
if(cinemaHallSession == null){
return Result.error(CodeMsg.DATA_ERROR);
}
CodeMsg validate = ValidateEntityUtil.validate(cinemaHallSession);
if(validate.getCode() != CodeMsg.SUCCESS.getCode()){
return Result.error(validate);
}
//判断是否是编辑
if(cinemaHallSession.getId() != null && cinemaHallSession.getId() > 0){
CinemaHallSession findById = cinemaHallSessionService.findById(cinemaHallSession.getId());
cinemaHallSession.setCreateTime(findById.getCreateTime());
}
//生成散场时间
String startTime = cinemaHallSession.getShowDate() + " " + cinemaHallSession.getShowTime();
cinemaHallSession.setStartTime(startTime);
cinemaHallSession.setEndTime(StringUtil.getFormatterDate(startTime, "yyyy-MM-dd HH:mm", Integer.valueOf(cinemaHallSession.getMovie().getTime())));
if(cinemaHallSessionService.isExistHall(cinemaHallSession.getId(),cinemaHallSession.getCinemaHall().getId(), cinemaHallSession.getShowDate(), startTime,cinemaHallSession.getEndTime())){
return Result.error(CodeMsg.ADMIN_CINEMA_HALL_SESSION_SAVE_EXIST);
}
//表示数据合法,可以保存到数据库
if(cinemaHallSessionService.save(cinemaHallSession) == null){
return Result.error(CodeMsg.ADMIN_CINEMA_HALL_SESSION_SAVE_ERROR);
}
return Result.success(true);
}
/**
* 删除
* @param id
* @return
*/
* 项目通用工具类
*
*/
public class StringUtil {
/**
* 返回指定格式的日期字符串
* @param date
* @param formatter
* @return
*/
public static String getFormatterDate(Date date,String formatter){
SimpleDateFormat sdf = new SimpleDateFormat(formatter);
return sdf.format(date);
}
/**
* 判断请求是否是ajax
* @param request
* @return
*/
public static boolean isAjax(HttpServletRequest request){
String header = request.getHeader("X-Requested-With");
if("XMLHttpRequest".equals(header))return true;
return false;
}
/**
* 从流读取字符串
* @param inputStream
* @return
*/
public static String getStringFromInputStream(InputStream inputStream){
String string = "";
try {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream,"GB2312"));
String buf = null;
try {
while((buf = bufferedReader.readLine()) != null){
string += buf;
}
} catch (Exception e) {
// TODO Auto-generated catch block
}
operaterLogService.add("添加用户,用户名:" + user.getUsername());
return Result.success(true);
}
/**
* 用户编辑页面
* @param model
* @return
*/
@RequestMapping(value="/edit",method=RequestMethod.GET)
public String edit(Model model,@RequestParam(name="id",required=true)Long id){
model.addAttribute("roles", roleService.findAll());
model.addAttribute("user", userService.find(id));
return "admin/user/edit";
}
/**
* 编辑用户信息表单提交处理
* @param user
* @return
*/
@RequestMapping(value="/edit",method=RequestMethod.POST)
@ResponseBody
public Result<Boolean> edit(User user){
//用统一验证实体方法验证是否合法
CodeMsg validate = ValidateEntityUtil.validate(user);
if(validate.getCode() != CodeMsg.SUCCESS.getCode()){
return Result.error(validate);
}
if(user.getRole() == null || user.getRole().getId() == null){
return Result.error(CodeMsg.ADMIN_USER_ROLE_EMPTY);
}
if(user.getId() == null || user.getId().longValue() <= 0){
return Result.error(CodeMsg.ADMIN_USE_NO_EXIST);
}
if(userService.isExistUsername(user.getUsername(), user.getId())){
return Result.error(CodeMsg.ADMIN_USERNAME_EXIST);
}
//到这说明一切符合条件,进行数据库保存
User findById = userService.find(user.getId());
//讲提交的用户信息指定字段复制到已存在的user对象中,该方法会覆盖新字段内容
BeanUtils.copyProperties(user, findById, "id","createTime","updateTime");
if(userService.save(findById) == null){
return Result.error(CodeMsg.ADMIN_USE_EDIT_ERROR);
}
*/
@RequestMapping(value="/operator_log_list")
public String operatorLogList(Model model, OperaterLog operaterLog, PageBean<OperaterLog> pageBean){
model.addAttribute("pageBean", operaterLogService.findList(operaterLog, pageBean));
model.addAttribute("operator", operaterLog.getOperator());
model.addAttribute("title", "日志列表");
return "admin/system/operator_log_list";
}
/**
* 删除操作日志,可删除多个
* @param ids
* @return
*/
@RequestMapping(value="/delete_operator_log",method=RequestMethod.POST)
@ResponseBody
public Result<Boolean> delete(String ids){
if(!StringUtils.isEmpty(ids)){
String[] splitIds = ids.split(",");
for(String id : splitIds){
operaterLogService.delete(Long.valueOf(id));
}
}
return Result.success(true);
}
/**
* 验证订单
* @param orderSn
* @param phone
* @return
*/
@RequestMapping(value="/auth_order",method=RequestMethod.POST)
@ResponseBody
public Result<Boolean> authOrder(@RequestParam(name="orderSn",required=true)String orderSn,@RequestParam(name="phone",required=true)String phone){
if(orderSn.length() < 18){
return Result.error(CodeMsg.ORDER_SN_ERROR);
}
if(phone.length() < 11){
return Result.error(CodeMsg.PHONE_ERROR);
}
if(!StringUtil.authOrder(orderSn, phone)){
return Result.error(CodeMsg.ORDER_AUTH_ERROR);
}
OrderAuth orderAuth = new OrderAuth();
orderAuth.setMac(StringUtil.getMac());
orderAuth.setOrderSn(orderSn);
orderAuth.setPhone(phone);
orderAuthService.save(orderAuth);
AppConfig.ORDER_AUTH = 1;
return Result.success(true);
}
/**
public String list(Model model, Cinema cinema, PageBean<Cinema> pageBean){
model.addAttribute("pageBean", cinemaService.findPage(cinema, pageBean));
model.addAttribute("name",cinema.getName());
return "admin/cinema/list";
}
/**
* 电影院添加页面
* @param model
* @return
*/
@RequestMapping(value="/add",method=RequestMethod.GET)
public String add(Model model){
model.addAttribute("provinceList", areaService.getAllProvince());
model.addAttribute("cinemaServiceList", CinemaServices.values());
return "admin/cinema/add";
}
/**
* 电影院编辑页面
* @param model
* @param id
* @return
*/
@RequestMapping(value="/edit",method=RequestMethod.GET)
public String edit(Model model,@RequestParam(name="id",required=true)Long id){
Cinema cinema = cinemaService.findById(id);
model.addAttribute("cinema", cinema);
model.addAttribute("provinceList", areaService.getAllProvince());
model.addAttribute("cityList", areaService.getAllCity(cinema.getArea().getProvinceId()));
model.addAttribute("districtList", areaService.getAllDistrict(cinema.getArea().getCityId()));
model.addAttribute("cinemaServiceList", CinemaServices.values());
return "admin/cinema/edit";
}
/**
* 添加电影院表单提交
* @param cinema
* @return
*/
@RequestMapping(value="/add",method=RequestMethod.POST)
@ResponseBody
public Result<Boolean> add(Cinema cinema){
if(cinema == null){
return Result.error(CodeMsg.DATA_ERROR);
}
CodeMsg validate = ValidateEntityUtil.validate(cinema);
if(validate.getCode() != CodeMsg.SUCCESS.getCode()){
return Result.error(validate);
}
//判断是否是编辑
if(cinema.getId() != null && cinema.getId() > 0){
/**
* 后台角色管理控制器
*
*/
@RequestMapping("/admin/role")
@Controller
public class RoleController {
private Logger log = LoggerFactory.getLogger(RoleController.class);
@Autowired
private MenuService menuService;
@Autowired
private OperaterLogService operaterLogService;
@Autowired
private RoleService roleService;
/**
* 分页搜索角色列表
* @param model
* @param role
* @param pageBean
* @return
*/
@RequestMapping(value="/list")
public String list(Model model, Role role, PageBean<Role> pageBean){
model.addAttribute("title", "角色列表");
model.addAttribute("name", role.getName());
model.addAttribute("pageBean", roleService.findByName(role, pageBean));
return "admin/role/list";
}
/**
* 角色添加页面
* @param model
model.addAttribute("provinceList", areaService.getAllProvince());
model.addAttribute("cityList", areaService.getAllCity(cinema.getArea().getProvinceId()));
model.addAttribute("districtList", areaService.getAllDistrict(cinema.getArea().getCityId()));
model.addAttribute("cinemaServiceList", CinemaServices.values());
return "admin/cinema/edit";
}
/**
* 添加电影院表单提交
* @param cinema
* @return
*/
@RequestMapping(value="/add",method=RequestMethod.POST)
@ResponseBody
public Result<Boolean> add(Cinema cinema){
if(cinema == null){
return Result.error(CodeMsg.DATA_ERROR);
}
CodeMsg validate = ValidateEntityUtil.validate(cinema);
if(validate.getCode() != CodeMsg.SUCCESS.getCode()){
return Result.error(validate);
}
//判断是否是编辑
if(cinema.getId() != null && cinema.getId() > 0){
Cinema findById = cinemaService.findById(cinema.getId());
cinema.setCreateTime(findById.getCreateTime());
cinema.setRate(findById.getRate());
cinema.setRateCount(findById.getRateCount());
}
if(cinema.getArea() != null){
Area province = areaService.findById(cinema.getArea().getProvinceId());
Area city = areaService.findById(cinema.getArea().getCityId());
String address = "";
if(province != null){
address = province.getName();
}
if(city != null){
address += city.getName();
}
cinema.setAddress(address+cinema.getAddress());
}
//表示数据合法,可以保存到数据库
if(cinemaService.save(cinema) == null){
return Result.error(CodeMsg.ADMIN_CINEMA_SAVE_ERROR);
}
return Result.success(true);
}
/**
* 删除
* @param id
* @return
*/
@RequestMapping(value="/delete",method=RequestMethod.POST)
}
/**
* 影院详情页面
* @param model
* @param id
* @return
*/
@RequestMapping("/detail")
public String detail(Model model,@RequestParam(name="id",required=true) Long id){
Cinema findById = cinemaService.findById(id);
model.addAttribute("cinema", findById);
model.addAttribute("cinemaHallSessionList", cinemaHallSessionService.findDistinctShowDateByCinemaList(id));
model.addAttribute("nearCinemaList", cinemaService.findAll(findById.getArea().getCityId()));
model.addAttribute("commentList", cinemaCommentService.findByCinema(id));
return "home/cinema/detail";
}
/**
* 获取指定影院、指定日期下的上映影片
* @param model
* @param cid
* @param showDate
* @return
*/
@RequestMapping("/get_show_movie")
public String getShowMovie(Model model,
@RequestParam(name="cid",required=true) Long cid,
@RequestParam(name="showDate",required=true) String showDate){
model.addAttribute("cinemaHallSessionList", cinemaHallSessionService.findDistinctMovieByCinemaList(cid, showDate));
return "home/cinema/get_show_movie";
}
/**
* 统计影院上映场次
* @param cinemaId
* @return
*/
@RequestMapping("/get_show_stats")
@ResponseBody
public Result<List<Integer>> getShowStats(@RequestParam(name="cid",required=true) Long cinemaId) {
List<Integer> ret = new ArrayList<Integer>();
List<Integer> showTotal = cinemaHallSessionService.getCinemaShowTotal(cinemaId);
if(showTotal == null || showTotal.size() <= 0){
ret.add(0);
ret.add(0);
return Result.success(ret);
}
ret.add(showTotal.size());//上映的电影数
//计算场次数
int totalSession = 0;
for(int i=0; i< showTotal.size();i++){
//检查手机号是否已经注册
Account account = accountService.find(mobile);
if(account != null){
return Result.error(CodeMsg.HOME_ACCOUNT_REGISTER_MOBILE_EXIST);
}
account = new Account();
account.setHeadPic("default-head-pic.jpg");
account.setMobile(mobile);
account.setPassword(password);
if(accountService.save(account) == null){
return Result.error(CodeMsg.HOME_ACCOUNT_REGISTER_ERROR);
}
//表示用户已经注册成功,放入session
SessionUtil.set(SessionConstant.SESSION_ACCOUNT_LOGIN_KEY, account);
return Result.success(true);
}
/**
* 用户登录
* @param mobile
* @param password
* @param checkCode
* @param tag
* @return
*/
@RequestMapping(value="/login",method=RequestMethod.POST)
@ResponseBody
public Result<Boolean> login(@RequestParam(name="mobile",required=true)String mobile,
@RequestParam(name="password")String password,
@RequestParam(name="checkCode")String checkCode,
@RequestParam(name="tag")Integer tag
){
Account account = null;
if(tag == 1){
//表示是密码登录
if(StringUtils.isEmpty(password)){
return Result.error(CodeMsg.ADMIN_PASSWORD_EMPTY);
}
account = accountService.find(mobile);
*/
@RequestMapping(value="/delete",method=RequestMethod.POST)
@ResponseBody
public Result<Boolean> delete(@RequestParam(name="id",required=true)Long id){
try {
movieService.delete(id);
} catch (Exception e) {
return Result.error(CodeMsg.ADMIN_MOVIE_DELETE_ERROR);
}
return Result.success(true);
}
/**
* ----------电影评价管理-------------
*/
/**
* 电影评价列表
* @param model
* @param movieComment
* @param pageBean
* @return
*/
@RequestMapping(value="/comment_list")
public String list(Model model,MovieComment movieComment,PageBean<MovieComment> pageBean){
model.addAttribute("pageBean", movieCommentService.findPage(movieComment, pageBean));
model.addAttribute("content",movieComment.getContent());
return "admin/movie/comment_list";
}
/**
* 删除评价
* @param id
* @return
*/
@RequestMapping(value="/delete_comment",method=RequestMethod.POST)
@ResponseBody
public Result<Boolean> deleteComment(@RequestParam(name="id",required=true)Long id){
movieCommentService.delete(id);
return Result.success(true);
}
/**
* 电影添加页面
* @param model
* @return
*/
@RequestMapping(value="/add",method=RequestMethod.GET)
public String add(Model model){
model.addAttribute("movieAreaList", MovieArea.values());
model.addAttribute("movieTypeList", MovieType.values());
model.addAttribute("movieLangList", MovieLang.values());
return "admin/movie/add";
}
/**
* 电影编辑页面
* @param model
* @param id
* @return
*/
@RequestMapping(value="/edit",method=RequestMethod.GET)
public String edit(Model model,@RequestParam(name="id",required=true)Long id){
model.addAttribute("movie", movieService.findById(id));
model.addAttribute("movieAreaList", MovieArea.values());
model.addAttribute("movieTypeList", MovieType.values());
model.addAttribute("movieLangList", MovieLang.values());
return "admin/movie/edit";
}
/**
* 添加电影表单提交
* @param movie
* @return
*/
@RequestMapping(value="/add",method=RequestMethod.POST)
@ResponseBody
public Result<Boolean> add(Movie movie){
if(movie == null){
return Result.error(CodeMsg.DATA_ERROR);
}
CodeMsg validate = ValidateEntityUtil.validate(movie);
if(validate.getCode() != CodeMsg.SUCCESS.getCode()){
return Result.error(validate);
}
//判断是否是编辑
if(movie.getId() != null && movie.getId() > 0){
Movie findById = movieService.findById(movie.getId());
movie.setCreateTime(findById.getCreateTime());
movie.setRate(findById.getRate());
/**
* 后台用户管理控制器
*
*/
@RequestMapping("/admin/user")
@Controller
public class UserController {
@Autowired
private UserService userService;
@Autowired
private RoleService roleService;
@Autowired
private OperaterLogService operaterLogService;
/**
* 用户列表页面
* @param model
* @param user
* @param pageBean
* @return
*/
@RequestMapping(value="/list")
public String list(Model model, User user, PageBean<User> pageBean){
model.addAttribute("title", "用户列表");
model.addAttribute("username", user.getUsername());
model.addAttribute("pageBean", userService.findList(user, pageBean));
return "admin/user/list";
return Result.success(null);
}
/**
* 订单列表
* @param model
* @return
*/
@RequestMapping(value="/user-order-list",method=RequestMethod.GET)
public String userOrderList(Model model){
Account account = (Account)SessionUtil.get(SessionConstant.SESSION_ACCOUNT_LOGIN_KEY);
model.addAttribute("orderList", orderService.findAll(account.getId()));
return "home/account/user-order-list";
}
/**
* 用户评价列表
* @param model
* @return
*/
@RequestMapping(value="/user-comment",method=RequestMethod.GET)
public String userComment(Model model,@RequestParam(name="type",defaultValue="0")Integer type){
Account account = (Account)SessionUtil.get(SessionConstant.SESSION_ACCOUNT_LOGIN_KEY);
if(type != 0){
model.addAttribute("cinemaCommentList", cinemaCommentService.findByAccount(account.getId()));
}else{
model.addAttribute("movieCommentList", movieCommentService.findByAccount(account.getId()));
}
model.addAttribute("type", type);
return "home/account/user-comment";
}
/**
* 获取订单子项
* @param sn
* @return
*/
@RequestMapping(value="/get_order_item",method=RequestMethod.POST)
@ResponseBody
public Result<List<OrderItem>> getOrderItem(@RequestParam(name="order_sn",required=true)String sn){
Order order = orderService.find(sn);
if(order == null){
return Result.error(CodeMsg.HOME_ORDER_NO_EXIST);
}
return Result.success(orderItemService.find(order.getId()));
}
/**
* 删除订单
* @param sn
* @return
*/
@RequestMapping(value="/delete_order",method=RequestMethod.POST)
String trade_status = request.getParameter("trade_status");
if("TRADE_SUCCESS".equals(trade_status)){
//表示是支付成功
//查询支付记录
PayLog payLog = payLogService.find(sn);
if(payLog == null){
log.error("支付记录未找到sn=" + sn);
return "fail";
}
//检查支付记录的状态
if(payLog.getStatus() != PayLog.status_unpay){
log.error("支付记录状态错误,status=" + payLog.getStatus());
return "fail";
}
//检查支付的金额是否与支付记录中相符
if(payLog.getMoney().compareTo(new BigDecimal(total_amount)) != 0){
log.error("支付金额错误,支付记录金额=" + payLog.getMoney() + "支付宝通知支付金额=" + total_amount);
return "fail";
}
//所有一切都符合,此时增加用户的余额
Account account = payLog.getAccount();
account.setBalance(account.getBalance().add(payLog.getMoney()));
accountService.save(account);
payLog.setStatus(PayLog.status_paid);
payLogService.save(payLog);
log.info("支付成功,用户最新余额=" + account.getBalance());
}
return "success";
}
}
if(menu.getParent() != null){
if(menu.getParent().getId() == null){
menu.setParent(null);
}
}
Menu existMenu = menuService.find(menu.getId());
if(existMenu == null){
Result.error(CodeMsg.ADMIN_MENU_ID_ERROR);
}
//表示验证都通过,开始添加数据库
existMenu.setIcon(menu.getIcon());
existMenu.setName(menu.getName());
existMenu.setParent(menu.getParent());
existMenu.setSort(menu.getSort());
existMenu.setUrl(menu.getUrl());
existMenu.setButton(menu.isButton());
existMenu.setShow(menu.isShow());
if(menuService.save(existMenu) == null){
Result.error(CodeMsg.ADMIN_MENU_ADD_ERROR);
}
//数据库添加操作成功,记录日志
operaterLogService.add("编辑菜单信息【" + existMenu + "】");
return Result.success(true);
}
/**
* 删除菜单信息
* @param request
* @param id
* @return
*/
@RequestMapping(value="/delete",method=RequestMethod.POST)
@ResponseBody
public Result<Boolean> delete(@RequestParam(name="id",required=true)Long id){
try {
menuService.delete(id);
} catch (Exception e) {
return Result.error(CodeMsg.ADMIN_MENU_DELETE_ERROR);
}
//数据库添加操作成功,记录日志
operaterLogService.add("删除菜单信息,菜单ID【" + id + "】");
return Result.success(true);
}
}
@RequestMapping(value="/edit",method=RequestMethod.GET)
public String edit(Model model,@RequestParam(name="id",required=true)Long id){
model.addAttribute("movie", movieService.findById(id));
model.addAttribute("movieAreaList", MovieArea.values());
model.addAttribute("movieTypeList", MovieType.values());
model.addAttribute("movieLangList", MovieLang.values());
return "admin/movie/edit";
}
/**
* 添加电影表单提交
* @param movie
* @return
*/
@RequestMapping(value="/add",method=RequestMethod.POST)
@ResponseBody
public Result<Boolean> add(Movie movie){
if(movie == null){
return Result.error(CodeMsg.DATA_ERROR);
}
CodeMsg validate = ValidateEntityUtil.validate(movie);
if(validate.getCode() != CodeMsg.SUCCESS.getCode()){
return Result.error(validate);
}
//判断是否是编辑
if(movie.getId() != null && movie.getId() > 0){
Movie findById = movieService.findById(movie.getId());
movie.setCreateTime(findById.getCreateTime());
movie.setRate(findById.getRate());
movie.setRateCount(findById.getRateCount());
movie.setTotalMoney(findById.getTotalMoney());
}
//表示数据合法,可以保存到数据库
if(movieService.save(movie) == null){
return Result.error(CodeMsg.ADMIN_AREA_SAVE_ERROR);
}
return Result.success(true);
}
/**
* 删除
* @param id
/**
* 前台用户中心
*
*/
@RequestMapping("/home/account")
@Controller
public class HomeAccountController {
@Autowired
private AccountService accountService;
@Autowired
private PayLogService payLogService;
@Autowired
private OrderService orderService;
@Autowired
private OrderItemService orderItemService;
@Autowired
private MovieCommentService movieCommentService;