基于SSM框架的电影院购票系统

今天,博主分享一份基于SSM框架与maven管理的电影院购票系统

项目结构

请添加图片描述
该项目基本完成了电影购票流程内的所有功能,项目前端使用ajax进行请求,json数据流返还结果,是一份较为完善的项目

技术简介

基础框架:SSM SpringMVC+Spring+Mybatis
前端框架:Bootstrap前台,Layui后台
项目依赖管理:Maven
分页插件:pagehelper
数据库:MySQL 5.7
开发软件及环境:eclipse JDK 1.8 Tomcat 8.0
数据请求与响应:ajax,json

项目功能

前台功能:

用户登陆注册,影片查看,影片选择,影院选择,座位选择,购票下单,查看订单,个人信息,评论

后台功能:

影院管理,影片管理,场次管理,订单管理,用户管理,评论管理

数据库介绍

请添加图片描述
本文以影院首页为例,介绍该项目的实现流程
首先我们看看页面展示请添加图片描述
结果:

项目样例讲解

spring.xml 该文件将spring容器与视图解析器(也就是我们的spring-mvc)模块整合在了一起,并完成数据库链接,扫描资源包,进行事务处理,数据类型转换等各种功能。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc"
	xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:p="http://www.springframework.org/schema/p" xmlns:mongo="http://www.springframework.org/schema/data/mongo"
	xsi:schemaLocation="http://www.springframework.org/schema/data/mongo 
		http://www.springframework.org/schema/data/mongo/spring-mongo-1.8.xsd
		http://www.springframework.org/schema/aop 
		http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
		http://www.springframework.org/schema/mvc
		http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
		http://www.springframework.org/schema/beans 
		http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
		http://www.springframework.org/schema/tx 
		http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
		http://www.springframework.org/schema/context 
		http://www.springframework.org/schema/context/spring-context-4.0.xsd">
		
	<!-- 引入属性文件,获取配置参数 -->
    <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">  
		<property name="location" value="classpath:mysql.properties" /> 
	</bean>
	
	 <!-- 使用阿里巴巴的数据库连接池 -->
	<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"  destroy-method="close">  
		<property name="driverClassName" value="${driver}" />  
		<property name="url" value="${url}" />  
		<property name="username" value="${username}" />  
		<property name="password" value="${password}" /> 
		<!-- 连接池参数 --> 
		<property name="maxActive" value="800"/>
       	<property name="minIdle" value="10"/>
	</bean>  
	
	<!-- 注册sqlSessionFactoryBean -->
	<!-- spring和MyBatis完美整合,不需要单独配置mybatis的映射文件 -->	
	<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
		<!-- 指定数据源  连接池 -->
		<property name="dataSource" ref="dataSource" />
		<!-- 指定 mybatis 主配置文件 -->
		<property name="configLocation" value="classpath:mybatis.xml"/>
	</bean>
	
	<!-- Mapper接口所在的包名,Spring会自动找到其下的类 -->
	<!-- 生产dao代理对象 -->
	<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
		<property name="basePackage" value="com.mapper" />
		<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
	</bean>
	
	<!-- 注册事务管理器 -->
	<bean id="transactionManager"  class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dataSource" />
	</bean>
	
	<!--支持注解驱动的事务管理,指定事务管理器 -->
   	<tx:annotation-driven transaction-manager="transactionManager"/>
   	
   	<!--自动扫描IOC组件  -->
    <context:component-scan base-package="com"></context:component-scan>
 	
 	<!-- 开启aspectj代理 -->
 	<aop:aspectj-autoproxy/>
 	
 	
	<!-- Jackson配置-->
	<bean id="objectMapper" class="com.fasterxml.jackson.databind.ObjectMapper">
		<property name="serializationInclusion" value="NON_NULL" />
		<property name="dateFormat">
			<bean class="java.text.SimpleDateFormat">
				<constructor-arg value="yyyy-MM-dd HH:mm:ss" />
			</bean>
		</property>
	</bean>
	
	<!-- 注解映射支持;JSON转换器 -->
	<mvc:annotation-driven>
		<mvc:message-converters register-defaults="true">
			<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
				<property name="objectMapper" ref="objectMapper" />
				<property name="supportedMediaTypes">
					<list>
						<value>text/plain;charset=UTF-8</value>
						<value>application/json;charset=UTF-8</value>
					</list>
				</property>
			</bean>
			<!-- 对于字符串类型解析的配置 -->
			<bean class="org.springframework.http.converter.StringHttpMessageConverter">  
            	<property name="supportedMediaTypes" value = "text/html;charset=UTF-8" />  
        	</bean> 		
		</mvc:message-converters>
	</mvc:annotation-driven>
	
	<!-- freemarker的配置 -->
	<bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
		<property name="templateLoaderPath" value="/views/" />
		<property name="defaultEncoding" value="utf-8" />
		<property name="freemarkerSettings">
			<props>
				<prop key="default_encoding">UTF-8</prop>
				<prop key="output_encoding">UTF-8</prop>
				<prop key="template_update_delay">10</prop>
				<prop key="locale">zh_CN</prop>
				<prop key="datetime_format">yyyy-MM-dd HH:mm</prop>
				<prop key="date_format">yyyy-MM-dd</prop>
				<prop key="time_format">HH:mm:ss</prop>
				<prop key="number_format">#.##</prop>
			</props>
		</property>
	</bean>
	
	<!-- FreeMarker视图解析 -->
	<bean id="viewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
		<property name="viewClass" value="org.springframework.web.servlet.view.freemarker.FreeMarkerView"></property>
		<property name="suffix" value=".html" />
		<property name="contentType" value="text/html;charset=utf-8" />
		<property name="exposeRequestAttributes" value="true" />
		<property name="exposeSessionAttributes" value="true" />
		<property name="exposeSpringMacroHelpers" value="true" />
		<property name="cache" value="false" />
		<property name="requestContextAttribute" value="rc"></property>
	</bean>
	
	<!-- 文件解析器 -->
	<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
		<property name="maxUploadSize" value="1100000"></property>
		<property name="defaultEncoding" value="UTF-8"></property>
	</bean>
</beans>

mybatis.xml
配置分页插件,扫描mapper包

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
	<!-- 定义别名 -->
	<typeAliases>
		<package name="com.mapper"/>
	</typeAliases>
	
	<!-- 配置 mybatis的分页插件 -->
	<plugins>
		<!-- com.github.pagehelper 为 PageHelper类所在包名 -->
		<plugin interceptor="com.github.pagehelper.PageInterceptor">
			<!-- 分页参数合理化,默认为false。
			  启动合理化时,如果pageNum < 1 会查询第一页,
			  如果pageNum > pages 会查询最后一页;
			禁用合理化时,如果pageNum < 1或pageNum > pages会返回空数据。 -->
			<property name="reasonable" value="true"/>
			<!-- 设置数据库类型Oracle,Mysql,MariaDB,SQLite,Hsqldb,PostgreS -->
			<property name="helpetrDialect" value="mysql"/>
		</plugin>
	</plugins>
	<!-- mapper映射 -->
	<mappers>
		<package name="com.mapper"/>
	</mappers>
	
</configuration>

以上是配置文件的部分,完成以上配置后,我们就可以分析项目的执行过程了,即发出请求,springmvc拦截给controller,调用业务逻辑层,执行持久层数据库操作,访问并操作数据库,返还结果,层层返还,视图渲染,展示在浏览器上。
在这里插入图片描述
首先我们来看浏览器的请求,是以ajax的方式进行的

 $.ajax({
                type:'post',
                url:"${basePath}/movie/findAllMovies",
                dataType:'json',
                data: {},
                success:function (obj) {
                    console.log(obj)
            });

发生我们的查询所有影片的请求,并将数据打印出来,然后我们在使用javaScript来对obj内容进行解析获取并展示。
我们可以单独请求刚刚的链接,发现其返还的结果是一个json字符串
请添加图片描述
那么,接下来,我们的请求将会传递到Controller中,通过页面展示可知,其内容分为正在热映,即将上映,排行榜等,那么,我们的获取所有也需要将这些数据获取到
请添加图片描述

@RequestMapping("findAllMovies")
	@ResponseBody
	public JSONObject findAllMovies() {
		JSONObject obj = new JSONObject();
		List<Movie> list = movieService.findAllMovies(1);
		List<Movie> upcomingList = movieService.findAllMovies(0);
		List<Movie> offList = movieService.sortMovieByBoxOffice();
		String type[] = {"喜剧","动作","爱情","动画","科幻","惊悚","冒险","犯罪","悬疑"};
		ArrayList<Object> typeArr = new ArrayList<Object>();
		for(int i = 0;i < type.length;i++) {
			List<Movie> movieList = this.movieService.findMoviesLikeType(type[i]);
			float boxOffice = 0;
			for(int j = 0; j < movieList.size();j++) {
				boxOffice += movieList.get(j).getMovie_boxOffice();
			}
			JSONObject typeJson = new JSONObject();
			typeJson.put(type[i], boxOffice);
			typeArr.add(typeJson);
		}
		obj.put("code", 0);
		obj.put("count", list.size());
		obj.put("upcomingCount",upcomingList.size());
		obj.put("data", list);
		obj.put("data1", upcomingList);
		obj.put("sort", offList);
		obj.put("type", typeArr);
		return obj;
	}

上面的Controller中调用了多个业务层方法,我们以第一个调用为例
业务层方法

@Transactional(propagation=Propagation.REQUIRED,readOnly=true)
	@Override
	public List<Movie> findAllMovies(int movie_state) {
		return this.movieMapper.findAllMovies(movie_state);
	}

持久层接口
请添加图片描述

持久层实现
其中上面的是我们返还的数据封装,其是也可以由我们的实体类来封装完成,下面则是查询数据库的操作,数据信息在查询到后,经由层层返还,最终在我们的浏览器上得以显示。

<resultMap type="com.entity.Movie" id="BaseResultMap">
		<id property="movie_id" column="movie_id" javaType="long"/>
		<result property="movie_actor" column="movie_actor" javaType="java.lang.String"/>
		<result property="movie_boxOffice" column="movie_boxOffice" javaType="float"/>  
		<result property="movie_cn_name" column="movie_cn_name" javaType="java.lang.String"/>  
		<result property="movie_commentCount" column="movie_commentCount" javaType="long"/>  
		<result property="movie_country" column="movie_country" javaType="java.lang.String"/>
		<result property="movie_detail" column="movie_detail" javaType="java.lang.String"/>
		<result property="movie_director" column="movie_director" javaType="java.lang.String"/>
		<result property="movie_duration" column="movie_duration" javaType="java.lang.String"/>
		<result property="movie_fg_name" column="movie_fg_name" javaType="java.lang.String"/>
		<result property="movie_picture" column="movie_picture" javaType="java.lang.String"/>
		<result property="movie_score" column="movie_score" javaType="float"/>
		<result property="movie_type" column="movie_type" javaType="java.lang.String"/>
		<result property="movie_releaseDate" column="movie_releaseDate" javaType="java.sql.Date"/>
		<result property="movie_state" column="movie_state" javaType="java.lang.Integer"/>
	</resultMap>

<select id="findAllMovies" parameterType="java.lang.Integer" resultMap="BaseResultMap">
		select * from movie where movie_state = #{movie_state}
	</select>

至于其他模块,也是如法炮制,下面是项目实现截图

项目演示

前台功能:

请添加图片描述

请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
后台功能
请添加图片描述

请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述

  • 16
    点赞
  • 122
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 27
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 27
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

彭祥.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值