基于SSM框架的电影院购票系统
今天,博主分享一份基于SSM框架与maven管理的电影院购票系统项目结构该项目基本完成了电影购票流程内的所有功能,项目前端使用ajax进行请求,json数据流返还结果,是一份较为完善的项目技术简介基础框架:SSM SpringMVC+Spring+Mybatis前端框架:Bootstrap前台,Layui后台项目依赖管理:Maven分页插件:pagehelper数据库:MySQL 5.7开发软件及
今天,博主分享一份基于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>
至于其他模块,也是如法炮制,下面是项目实现截图
项目演示
前台功能:
后台功能
更多推荐
所有评论(0)