一、运行环境
mysql5.6以上
tomcat8.0+
jdk1.8
idea、eclipse或者myeclipse
二、功能截图
前端网站
![](https://img-blog.csdnimg.cn/img_convert/76a85976cd74e2eda8be2c3fc31c4e6b.png)
![](https://img-blog.csdnimg.cn/img_convert/0dc042e84ee4a95df4c057aaead09ca8.png)
后端管理
![](https://img-blog.csdnimg.cn/img_convert/fb5cbc23e8abc43d636260b186952be6.png)
![](https://img-blog.csdnimg.cn/img_convert/d019264ddf62fef6f6a8beefe11d5a99.png)
![](https://img-blog.csdnimg.cn/img_convert/889062ff395831be2b8d21b91eae4462.png)
三、主要代码
<%@ page language="java" import="dao.*" pageEncoding="UTF-8"%>
<%@ page language="java" import="java.util.*"%>
<%@page import="util.Info"%>
<%@ taglib prefix="ssm" uri="http://ssm" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!doctype html>
<html class="x-admin-sm">
<head>
<meta charset="UTF-8">
<title>影院票务系统-后台登录</title>
<meta name="renderer" content="webkit|ie-comp|ie-stand">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width,user-scalable=yes, minimum-scale=0.4, initial-scale=0.8,target-densitydpi=low-dpi" />
<meta http-equiv="Cache-Control" content="no-siteapp" />
<link rel="stylesheet" href="./css/font.css">
<link rel="stylesheet" href="./css/login.css">
<link rel="stylesheet" href="./css/xadmin.css">
<script type="text/javascript" src="./js/jquery.min.js"></script>
<script src="./lib/layui/layui.js" charset="utf-8"></script>
<!--[if lt IE 9]>
<script src="https://cdn.staticfile.org/html5shiv/r29/html5.min.js"></script>
<script src="https://cdn.staticfile.org/respond.js/1.4.2/respond.min.js"></script>
<![endif]-->
</head>
<body class="login-bg">
<div class="login layui-anim layui-anim-up">
<div class="message">影院票务系统-管理登录</div>
<div id="darkbannerwrap"></div>
<form method="post" class="layui-form" action="authAdminLogin.do?a=a">
<input name="username" placeholder="用户名" type="text" lay-verify="required" class="layui-input" >
<hr class="hr15">
<input name="pwd" lay-verify="required" placeholder="密码" type="password" class="layui-input">
<hr class="hr15">
<select name="cx" class="layui-select">
<option value="管理员">管理员</option>
<option value="注册用户">注册用户</option> </select>
<hr class="hr15">
<div class="layui-form-item">
<div class="layui-inline">
<div class="layui-input-inline" style="width: 100px;">
<input type="text" name="pagerandom" placeholder="验证码" class="layui-input" lay-verify="required">
</div>
<img alt="刷新验证码" onClick="this.src='captcha.do?time='+new Date().getTime();"
src="captcha.do" style="cursor:pointer; padding-top:10px;">
</div>
</div>
<hr class="hr15">
<input value="登录" lay-submit lay-filter="login" style="width:100%;" type="submit">
<hr class="hr20" >
</form>
</div>
<script>
$(function () {
layui.use('form', function(){
var form = layui.form;
// layer.msg('玩命卖萌中', function(){
// //关闭后的操作
// });
//监听提交
form.on('submit(login)', function(data){
// alert(888)
return true;
});
});
})
</script>
<!-- 底部结束 -->
</body>
</html>
package com.spring.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.annotation.Resource;
import javax.servlet.http.HttpSession;
import util.Request;
import com.spring.entity.Admins;
import com.spring.service.AdminsService;
import com.spring.entity.Zhuceyonghu;
import com.spring.service.ZhuceyonghuService;
@Controller
public class UserController extends BaseController{
@Resource
private AdminsService adminsService;
@Resource
private ZhuceyonghuService zhuceyonghuService;
/**
* 登录页面
* @return
*/
@RequestMapping("/login")
public String Index()
{
return "login";
}
/**
* 退出
* @return
*/
@RequestMapping("/logout")
public String Logout()
{
request.getSession().invalidate();
return showSuccess("退出成功" , "./");
}
protected String authLoginUser(boolean isAdmin,String username , String pwd,String cx)
{
if(username == null || "".equals(username) ){
return showError( "账号不允许为空" );
}
if(pwd == null || "".equals(pwd) ){
return showError( "密码不允许为空" );
}
if(cx == null){
return showError( "请选中登录类型" );
}
String random = (String) request.getSession().getAttribute("random");
String pagerandom = request.getParameter("pagerandom") == null ? "" : request.getParameter("pagerandom");
if(request.getParameter("a") !=null && !pagerandom.equals(random)){
return showError( "验证码不正确" );
}
if (cx.equals("管理员")) {
Admins user = adminsService.login(username , pwd);
if(user == null){
return showError("用户名或密码错误");
}
session.setAttribute("id" , user.getId());
session.setAttribute("username" , user.getUsername());
session.setAttribute("cx" , cx);
session.setAttribute("login" , cx);
session.setAttribute("username", user.getUsername());
session.setAttribute("pwd", user.getPwd());
}
if (cx.equals("注册用户")) {
Zhuceyonghu user = zhuceyonghuService.login(username , pwd);
if(user == null){
return showError("用户名或密码错误");
}
session.setAttribute("id" , user.getId());
session.setAttribute("username" , user.getYonghuming());
session.setAttribute("cx" , cx);
session.setAttribute("login" , cx);
session.setAttribute("yonghuming", user.getYonghuming());
session.setAttribute("mima", user.getMima());
session.setAttribute("xingming", user.getXingming());
session.setAttribute("xingbie", user.getXingbie());
session.setAttribute("shoujihao", user.getShoujihao());
session.setAttribute("touxiang", user.getTouxiang());
}
String referer = request.getParameter("referer");
if(referer == null){
if(isAdmin){
referer = "./main.do";
}else{
referer = "./";
}
}
return showSuccess("登录成功" , referer);
}
@RequestMapping("/main")
public String main() {
return "main";
}
@RequestMapping("/sy")
public String sy() {
return "sy";
}
@RequestMapping("/mygo")
public String mygo() {
return "mygo";
}
@RequestMapping("/top")
public String top() {
return "top";
}
@RequestMapping("/authLogin")
public String authLogin()
{
String username = Request.get("username");
String pwd = Request.get("pwd");
String cx = Request.get("cx");
return authLoginUser(false , username,pwd,cx);
}
@RequestMapping("/authAdminLogin")
public String authAdminLogin()
{
String username = Request.get("username");
String pwd = Request.get("pwd");
String cx = Request.get("cx");
return authLoginUser(true , username,pwd,cx);
}
@RequestMapping("/mod")
public String mod()
{
return "mod";
}
@RequestMapping("/editPassword")
public String editPassword()
{
String username = request.getSession().getAttribute("username").toString();
String cx = request.getSession().getAttribute("login").toString();
String oldPassword = Request.get("oldPassword");
String newPwd = Request.get("newPwd");
String newPwd2 = Request.get("newPwd2");
if(!newPwd.equals(newPwd2)){
return showError("两次密码不一致");
}
if (cx.equals("管理员")) {
Admins user = adminsService.login(username , oldPassword);
if(user == null){
return showError("原密码不正确");
}
adminsService.updatePassword(user.getId() , newPwd);
}
if (cx.equals("注册用户")) {
Zhuceyonghu user = zhuceyonghuService.login(username , oldPassword);
if(user == null){
return showError("原密码不正确");
}
zhuceyonghuService.updatePassword(user.getId() , newPwd);
}
return showSuccess("修改密码成功" , "./mod.do");
}
}
package com.spring.service;
import com.base.IServiceBase;
import com.spring.entity.Admins;
public interface AdminsService extends IServiceBase<Admins> {
public Admins login(String username, String password);
public boolean updatePassword(int id, String newPassword);
}
package com.spring.service.impl;
import com.base.ServiceBase;
import com.spring.dao.AdminsMapper;
import com.spring.entity.Admins;
import com.spring.service.AdminsService;
import org.springframework.stereotype.Service;
import util.Info;
import javax.annotation.Resource;
@Service("AdminsService")
public class AdminsServiceImpl extends ServiceBase<Admins> implements AdminsService {
@Resource
private AdminsMapper dao;
@Override
protected AdminsMapper getDao() {
return dao;
}
public Admins login(String username, String password) {
Admins user = new Admins();
user.setUsername(username);
user.setPwd(password);
return this.dao.login(user);
}
public boolean updatePassword(int id, String newPassword) {
Admins user = new Admins();
user.setId(id);
user.setPwd(newPassword);
int i = this.dao.updateByPrimaryKeySelective(user);
return i == 1;
}
}
package com.spring.dao;
import com.base.MapperBase;
import com.spring.entity.Admins;
import org.springframework.stereotype.Repository;
@Repository
public interface AdminsMapper extends MapperBase<Admins> {
Admins login(Admins admins);
}
package com.spring.entity;
import javax.persistence.Column;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import java.io.Serializable;
import java.util.Date;
@Table(name = "admins")
public class Admins implements Serializable {
@GeneratedValue(generator = "JDBC") // 自增的主键映射
@Id
@Column(name = "id",insertable=false)
private Integer id;
@Column(name = "username")
private String username;
@Column(name = "pwd")
private String pwd;
@Column(name = "addtime")
private String addtime;
private static final long serialVersionUID = 1L;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username == null ? "" : username.trim();
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd == null ? "" : pwd.trim();
}
public String getAddtime() {
return addtime;
}
public void setAddtime(String addtime) {
this.addtime = addtime;
}
}
driver=com.mysql.jdbc.Driver
#以下链接为mysql8.0以上使用,去掉下面的#号
#driver=com.mysql.cj.jdbc.Driver
#mytest为我本地的数据库名
url=jdbc:mysql://localhost:3306/ssmdianying?useUnicode=true&characterEncoding=UTF-8&useOldAliasMetadataBehavior=true
#以下链接为mysql8.0以上使用
#url=jdbc:mysql://localhost:3306/ssm01493jyssmdyypwxtdsjysx?useUnicode=true&characterEncoding=UTF-8&useSSL=FALSE&serverTimezone=UTC&useOldAliasMetadataBehavior=true
username=root
#下面输入自己数据库的密码
password=
#定义初始连接数
initialSize=0
#定义最大连接数
maxActive=20
#定义最大空闲
maxIdle=20
#定义最小空闲
minIdle=1
#定义最长等待时间
maxWait=60000
#entity 包名和 java目录
modelPackage=com.spring.entity
modelProject=src/java
#sqlmap包名 和resources目录
sqlPackage=sqlmap
sqlProject=src/resources
#mapper包名和 java目录
mapperPackage=com.spring.dao
mapperProject=src/java
table=xxstart
<?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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.2.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd">
<!-- ①:对com.springmvc包中的所有类进行扫描,以完成Bean创建和自动依赖注入的功能 -->
<context:component-scan base-package="com.spring"/>
<context:component-scan base-package="com.spring.controller"/>
<context:component-scan base-package="com.spring.dao"/>
<context:component-scan base-package="com.spring.service"/>
<mvc:annotation-driven/>
<!-- 静态资源访问 -->
<!--如果webapp下你新建了文件夹,想访问里面的静态资源,那么就要在这配置一下-->
<mvc:resources location="/images/" mapping="/images/**"/>
<mvc:resources location="/css/" mapping="/css/**"/>
<mvc:resources location="/upload/" mapping="/upload/**"/>
<mvc:resources location="/js/" mapping="/js/**"/>
<!-- Configures the @Controller programming model
<mvc:annotation-driven />-->
<!-- ②:启动Spring MVC的注解功能,完成请求和注解POJO的映射 -->
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">
<list>
<ref bean="mappingJacksonHttpMessageConverter"/>
</list>
</property>
</bean>
<bean id="mappingJacksonHttpMessageConverter"
class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>application/json;charset=UTF-8</value>
</list>
</property>
</bean>
<!-- 配置视图解析器,把控制器的逻辑视频映射为真正的视图 -->
<!-- /WEB-INF/jsp/start.jsp -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/"/>
<property name="suffix" value=".jsp"/>
</bean>
<!-- 配置dbcp数据库连接池 -->
<!-- <context:property-placeholder location="classpath:db.properties"/> -->
<!--数据库配置 -->
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:jdbc.properties</value>
</list>
</property>
</bean>
<!-- 数据库连接池 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" 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="initialSize" value="1"/>
<property name="maxActive" value="100"/>
<property name="maxIdle" value="5"/>
<property name="maxWait" value="80000"/>
</bean>
<!-- 配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 拦截器 -->
<mvc:interceptors>
<!-- 国际化操作拦截器 如果采用基于(请求/Session/Cookie)则必需配置 -->
<bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"/>
<mvc:interceptor>
<mvc:mapping path="/main.do"/>
<bean class="com.main.interceptor.AuthInterceptor"/>
</mvc:interceptor>
<mvc:interceptor>
<mvc:mapping path="/*_*.do"/>
<bean class="com.main.interceptor.AuthInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
<!-- 定义无Controller的path<->view直接映射 -->
<!--<mvc:view-controller path="/" view-name="redirect:/" />-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 数据源 -->
<property name="dataSource" ref="dataSource"/>
<property name="mapperLocations" value="classpath:sqlmap/*Mapper.xml"/>
<property name="typeAliasesPackage" value="com.spring.entity"/>
<!--载入mybatis配置文件-->
<property name="configLocation" value="classpath:mybatis-config.xml"/>
</bean>
<!-- 在spring容器中配置mapper的扫描器产生的动态代理对象在spring的容器中自动注册,bean的id就是mapper类名(首字母小写)-->
<bean id="mapperScannerConfigurer" class="tk.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 指定扫描包的路径,就是mapper接口的路径,多个包中间以 半角逗号隔开 -->
<property name="basePackage" value="com.spring.dao"/>
<!-- 配置sqlSessionFactoryBeanName -->
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
</bean>
</beans>