记:最近两天在完善毕业设计和论文终稿,完善毕业设计时想要在登录注册模块添加一个验证码功能,在网上找了很多参考资料,但是在实现的时候都不是很尽如人意。后来找了一个在前端直接生成的验证码代码,根据自己的毕设项目进行了修改,已经可以完美运行(姑且认为是完美吧~)并且符合我的要求。有点长,但是很详细,如果没有c币的可以留下邮箱~
(完整项目资源中包含的也有lib,js,css包,可以只下载完整登录注册项目)
完整登录注册项目下载地址:https://download.csdn.net/download/qq_38938670/12344968
js和css,lib包下载地址(image文件夹在登录注册时用不到):https://download.csdn.net/download/qq_38938670/12344986
1、效果图如下:
我的数据库中管理员账号:admin 密码:123456,普通用户自己注册就可以。后面我会给出数据库的相关代码,具体的界面就自己根据自己的项目进行添加和修改,我的毕设完整项目还未完全完成,完成后会进一步更新全部的项目。
2、登录注册小项目结构图如下:
3、详细代码如下:
(1)FormController.java
package org.fkit.dym.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
/**
*
* @author
*页面跳转控制
*/
@Controller
public class FormController {
@RequestMapping(value="/{formName}")
/**pathvariabe注解可以方便获得请求url中的动态参数*/
public String loginForm(@PathVariable String formName) {
return formName;
}
}
(2)UserController.java
package org.fkit.dym.controller;
import javax.servlet.http.HttpSession;
import org.fkit.dym.domain.User;
import org.fkit.dym.service.DymService;
import org.fkit.dym.util.common.DymConstants;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
/**
* 处理用户请求控制器
* @author
*
*/
@Controller
public class UserController {
//自动注入UserService
@Autowired
@Qualifier("dymService")
private DymService dymService;
/**
* 处理登陆请求
* @param loginname 登录名
* @param password 密码
* @param session 保存user对象
* @param mv 跳转的视图
*/
@RequestMapping(value="/login")
public ModelAndView login(
@RequestParam("loginname") String loginname,
@RequestParam("password") String password,
@RequestParam("flag") Integer flag,
HttpSession session,
ModelAndView mv) {
//调用业务逻辑组件判断用户是否可以登陆
User user=dymService.login(loginname, password);
Integer status=dymService.testpass(loginname);
if(flag==1)
{
if(user!=null) {
//将用户保存到httpSession中
session.setAttribute(DymConstants.USER_SESSION, user);
if(loginname.equals("admin"))
{
//管理员登陆跳转到main页面,客户端跳转
mv.setViewName("redirect:/main");
}
else
{
if(status==1)
{
//普通已审核用户登陆跳转到usermian页面
mv.setViewName("redirect:/usermain");
}
else
{
//普通未审核用户跳转到LoginForm
mv.addObject("message","用户信息未审核,请等待审核通过再登陆");
mv.setViewName("forward:/LoginForm");
}
}
}else {
//设置登陆失败提示信息
mv.addObject("message","用户未注册或者登录名、密码错误,请重新输入");
//服务器内部跳转到登陆页面
mv.setViewName("forward:/LoginForm");
}
}else {
mv.addObject("message","验证码错误!");
mv.setViewName("forward:/LoginForm");
}
return mv;
}
/**
* 处理用户注册信息
* @param loginname
* @param password
* @param realname
* @param realclass
* @param phonenum
* @param mv
* @return
*/
@RequestMapping(value="/register")
public ModelAndView register(
@RequestParam("loginname") String loginname,
@RequestParam("password") String password,
@RequestParam("realname") String realname,
@RequestParam("realclass") String realclass,
@RequestParam("phonenum") String phonenum,
ModelAndView mv) {
dymService.register(loginname,password,realname,realclass,phonenum);
mv.setViewName("redirect:/LoginForm");
return mv;
}
}
(3)UserDao.java
package org.fkit.dym.dao;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.fkit.dym.domain.User;
import static org.fkit.dym.util.common.DymConstants.USERTABLE;
/**
* UserMapper接口
* @author
*
*/
public interface UserDao {
//根据登录名和密码查询用户是否注册
@Select("select * from "+USERTABLE+" where loginname=#{loginname} and password = #{password}")
User selectByLoginnameAndPassword(
@Param("loginname") String loginname,
@Param("password") String password);
//根据员工注册的信息将员工信息插入到数据库表user_inf中
@Insert("insert into "+USERTABLE+"(loginname,password,realname,realclass,phonenum) values(#{loginname},#{password},#{realname},#{realclass},#{phonenum})")
void insertByall(@Param("loginname") String loginname,
@Param("password") String password,
@Param("realname") String realname,
@Param("realclass") String realclass,
@Param("phonenum") String phonenum);
//根据用户名查询已注册用户是否审核通过
@Select("select userstatus from "+USERTABLE+" where loginname=#{loginname}")
Integer selectByLoginnametostatus(@Param("loginname") String loginname);
}
(4)User.java
package org.fkit.dym.domain;
import java.io.Serializable;
import java.util.Date;
public class User implements Serializable {
private static final long serialVersionUID=1L;
private Integer id;
private String loginname;
private String password;
private Date createdate;
private String realname;
private String realclass;
private String phonenum;
private Integer userstatus;
//无参数构造器
public User() {
super();
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getLoginname() {
return loginname;
}
public void setLoginname(String loginname) {
this.loginname = loginname;
}
public Date getCreatedate() {
return createdate;
}
public void setCreatedate(Date createdate) {
this.createdate = createdate;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getRealname() {
return realname;
}
public void setRealname(String realname) {
this.realname = realname;
}
public String getRealclass() {
return realclass;
}
public void setRealclass(String realclass) {
this.realclass = realclass;
}
public String getPhonenum() {
return phonenum;
}
public void setPhonenum(String phonenum) {
this.phonenum = phonenum;
}
public Integer getUserstatus() {
return userstatus;
}
public void setUserstatus(Integer userstatus) {
this.userstatus = userstatus;
}
}
(5)AuthorizedInterceptor.java
package org.fkit.dym.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.fkit.dym.domain.User;
import org.fkit.dym.util.common.DymConstants;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
/**
* 判断用户权限的Spring MVC的拦截器
*/
public class AuthorizedInterceptor implements HandlerInterceptor {
/** 定义不需要拦截的请求 */
private static final String[] IGNORE_URI = {"/LoginForm", "/login","/404.html","registeForm"};
/**
* 该方法需要preHandle方法的返回值为true时才会执行。
* 该方法将在整个请求完成之后执行,主要作用是用于清理资源。
*/
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception exception)
throws Exception {
}
/**
* 这个方法在preHandle方法返回值为true的时候才会执行。
* 执行时间是在处理器进行处理之 后,也就是在Controller的方法调用之后执行。
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response,
Object handler, ModelAndView mv) throws Exception {
}
/**
* preHandle方法是进行处理器拦截用的,该方法将在Controller处理之前进行调用,
* 当preHandle的返回值为false的时候整个请求就结束了。
* 如果preHandle的返回值为true,则会继续执行postHandle和afterCompletion。
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object handler) throws Exception {
/** 默认用户没有登录 */
boolean flag = false;
/** 获得请求的ServletPath */
String servletPath = request.getServletPath();
/** 判断请求是否需要拦截 */
for (String s : IGNORE_URI) {
if (servletPath.contains(s)) {
flag = true;
break;
}
}
/** 拦截请求 */
if (!flag){
/** 1.获取session中的用户 */
User user = (User) request.getSession().getAttribute(DymConstants.USER_SESSION);
/** 2.判断用户是否已经登录 */
if(user == null){
/** 如果用户没有登录,跳转到登录页面 */
request.setAttribute("message", "请先登录再访问网站!");
request.getRequestDispatcher(DymConstants.LOGIN).forward(request, response);
return flag;
}else{
flag = true;
}
}
return flag;
}
}
(6)DymService.java
package org.fkit.dym.service;
import org.fkit.dym.domain.User;
/**
* @Description:服务层接口
* @author
*
*/
public interface DymService {
/**
* 用户登陆
* @param loginname
* @param password
* @return User对象
*/
User login(String loginname,String password);
/**
* 用户注册
* @param loginname
* @param password
* @param realname
* @param realclass
* @param phonenum
* @return
*/
void register(String loginname, String password, String realname, String realclass, String phonenum);
/**
* 判断用户是否审核通过
* @param loginname
* @return
*/
Integer testpass(String loginname);
}
(7)DymServiceImpl.java
package org.fkit.dym.service.impl;
import org.fkit.dym.dao.UserDao;
import org.fkit.dym.domain.User;
import org.fkit.dym.service.DymService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* @Description:服务层接口实现类
* @author
*
*/
@Service("dymService")
public class DymServiceImpl implements DymService {
//自动注入持久层dao对象
@Autowired
private UserDao userDao;
/**
* DymServiceImpl接口login方法实现
* 通过登录名和密码来查看用户是否已注册,返回值为user对象
*/
@Override
public User login(String loginname, String password) {
// TODO Auto-generated method stub
return userDao.selectByLoginnameAndPassword(loginname, password);
}
/**
* DymServiceImpl接口testpass方法实现
* 通过登录名查看已注册的用户是否审核通过,范围之为userstatus的值,为1则审核通过,2审核为通过
*/
@Override
public Integer testpass(String loginname) {
// TODO Auto-generated method stub
return userDao.selectByLoginnametostatus(loginname);
}
/**
* DymServiceImpl接口register方法实现
* 通过用户注册的信息将信息插入到数据库中
*/
@Override
public void register(String loginname, String password, String realname, String realclass, String phonenum) {
// TODO Auto-generated method stub
userDao.insertByall(loginname,password,realname,realclass,phonenum);
}
}
(8)DymConstants.java
package org.fkit.dym.util.common;
public class DymConstants {
//数据库表常量
public static final String USERTABLE="user_inf";
//登陆以及用户的session对象
public static final String LOGIN="LoginForm";
public static final String USER_SESSION="user_session";
}
(9)db.properties
dataSource.driverClass=org.gjt.mm.mysql.Driver
dataSource.jdbcUrl=jdbc:mysql://127.0.0.1:3306/dymapp?useSSL=false
dataSource.user=你的数据库名
dataSource.password=你的数据库密码
dataSource.maxPoolSize=20
dataSource.maxIdleTime = 1000
dataSource.minPoolSize=6
dataSource.initialPoolSize=5
(10)LoginForm.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html lang="zh">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GBK">
<title>电脑医院信息管理与预约系统</title>
<link href="${ctx}/js/metronic/plugins/bootstrap/css/bootstrap.min.css"
rel="stylesheet" type="text/css" />
<link
href="${ctx}/js/metronic/plugins/bootstrap/css/bootstrap-responsive.min.css"
rel="stylesheet" type="text/css" />
<link
href="${ctx}/js/metronic/plugins/font-awesome/css/font-awesome.min.css"
rel="stylesheet" type="text/css" />
<link href="${ctx}/js/metronic/css/style-metro.css" rel="stylesheet"
type="text/css" />
<link href="${ctx}/js/metronic/css/style.css" rel="stylesheet"
type="text/css" />
<link href="${ctx}/js/metronic/css/style-responsive.css" rel="stylesheet"
type="text/css" />
<link href="${ctx}/js/metronic/css/themes/default.css" rel="stylesheet"
type="text/css" id="style_color" />
<link href="${ctx}/js/metronic/plugins/uniform/css/uniform.default.css"
rel="stylesheet" type="text/css" />
<link href="${ctx}/js/metronic/css/pages/lock.css" rel="stylesheet"
type="text/css" />
<link rel="shortcut icon" href="favicon.ico" />
<script type="text/javascript" src="${ctx }/js/jquery-1.11.0.js"></script>
<script type="text/javascript" src="${ctx }/js/jquery-migrate-1.2.1.js"></script>
<link href="${ctx }/js/ligerUI/skins/Aqua/css/ligerui-all.css" rel="stylesheet" type="text/css" />
<script src="${ctx }/js/ligerUI/js/core/base.js" type="text/javascript"></script>
<script src="${ctx }/js/ligerUI/js/plugins/ligerDialog.js" type="text/javascript"></script>
<script src="${ctx }/js/ligerUI/js/plugins/ligerDrag.js" type="text/javascript"></script>
<script src="${ctx }/js/ligerUI/js/plugins/ligerResizable.js" type="text/javascript"></script>
<script src="js/gVerify.js"></script>
<script type="text/javascript">
!(function(window, document) {
var size = 5;//设置验证码长度
function GVerify(options) { //创建一个图形验证码对象,接收options对象为参数
this.options = { //默认options参数值
id: "", //容器Id
canvasId: "verifyCanvas", //canvas的ID
width: "100", //默认canvas宽度
height: "30", //默认canvas高度
type: "blend", //图形验证码默认类型blend:数字字母混合类型、number:纯数字、letter:纯字母
code: "",
}
if(Object.prototype.toString.call(options) == "[object Object]"){//判断传入参数类型
for(var i in options) { //根据传入的参数,修改默认参数值
this.options[i] = options[i];
}
}else{
this.options.id = options;
}
this.options.numArr = "0,1,2,3,4,5,6,7,8,9".split(",");
this.options.letterArr = getAllLetter();
this._init();
this.refresh();
}
GVerify.prototype = {
/**版本号**/
version: '1.0.0',
/**初始化方法**/
_init: function() {
var con = document.getElementById(this.options.id);
var canvas = document.createElement("canvas");
this.options.width = con.offsetWidth > 0 ? con.offsetWidth : "100";
this.options.height = con.offsetHeight > 0 ? con.offsetHeight : "30";
canvas.id = this.options.canvasId;
canvas.width = this.options.width;
canvas.height = this.options.height;
canvas.style.cursor = "pointer";
canvas.innerHTML = "您的浏览器版本不支持canvas";
con.appendChild(canvas);
var parent = this;
canvas.onclick = function(){
parent.refresh();
}
},
/**生成验证码**/
refresh: function() {
this.options.code = "";
var canvas = document.getElementById(this.options.canvasId);
if(canvas.getContext) {
var ctx = canvas.getContext('2d');
}else{
return;
}
ctx.textBaseline = "middle";
ctx.fillStyle = randomColor(180, 240);
ctx.fillRect(0, 0, this.options.width, this.options.height);
if(this.options.type == "blend") { //判断验证码类型
var txtArr = this.options.numArr.concat(this.options.letterArr);
} else if(this.options.type == "number") {
var txtArr = this.options.numArr;
} else {
var txtArr = this.options.letterArr;
}
for(var i = 1; i <=size; i++) {
var txt = txtArr[randomNum(0, txtArr.length)];
this.options.code += txt;
ctx.font = randomNum(this.options.height/2, this.options.height) + 'px SimHei'; //随机生成字体大小
ctx.fillStyle = randomColor(50, 160); //随机生成字体颜色
ctx.shadowOffsetX = randomNum(-3, 3);
ctx.shadowOffsetY = randomNum(-3, 3);
ctx.shadowBlur = randomNum(-3, 3);
ctx.shadowColor = "rgba(0, 0, 0, 0.3)";
var x = this.options.width / (size+1) * i;
var y = this.options.height / 2;
var deg = randomNum(-30, 30);
/**设置旋转角度和坐标原点**/
ctx.translate(x, y);
ctx.rotate(deg * Math.PI / 180);
ctx.fillText(txt, 0, 0);
/**恢复旋转角度和坐标原点**/
ctx.rotate(-deg * Math.PI / 180);
ctx.translate(-x, -y);
}
/**绘制干扰线**/
for(var i = 0; i < 4; i++) {
ctx.strokeStyle = randomColor(40, 180);
ctx.beginPath();
ctx.moveTo(randomNum(0, this.options.width), randomNum(0, this.options.height));
ctx.lineTo(randomNum(0, this.options.width), randomNum(0, this.options.height));
ctx.stroke();
}
/**绘制干扰点**/
for(var i = 0; i < this.options.width/4; i++) {
ctx.fillStyle = randomColor(0, 255);
ctx.beginPath();
ctx.arc(randomNum(0, this.options.width), randomNum(0, this.options.height), 1, 0, 2 * Math.PI);
ctx.fill();
}
},
/**验证验证码**/
validate: function(code){
var code = code.toLowerCase();
var v_code = this.options.code.toLowerCase();
if(code == v_code){
return true;
}else{
this.refresh();
return false;
}
}
}
/**生成字母数组**/
function getAllLetter() {
var letterStr = "a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z";
return letterStr.split(",");
}
/**生成一个随机数**/
function randomNum(min, max) {
return Math.floor(Math.random() * (max - min) + min);
}
/**生成一个随机色**/
function randomColor(min, max) {
var r = randomNum(min, max);
var g = randomNum(min, max);
var b = randomNum(min, max);
return "rgb(" + r + "," + g + "," + b + ")";
}
window.GVerify = GVerify;
})(window, document);
</script>
</head>
<body style="font-family: 微软雅黑">
<div class="page-lock">
<div class="page-logo" style="margin-bottom: 2px">
<a class="brand" style="font-size: 22px; color: #FFF;"> 电脑医院信息管理与预约系统</a>
</div>
<span style="padding-top: 5px;margin-left:50px;font-size:20px"><font color="red">${requestScope.message}</font></span>
<form action="login" method="post" id="LoginForm">
<div class="page-body">
<div>
<img class="page-lock-img" src="${ctx}/js/metronic/img/profile/logo2.jpg" alt="">
</div>
<div style="margin-left:250px;margin-top:20px">
<input type="text" placeholder="账号" id="loginname" name="loginname" value="${loginname}"><br>
<input type="password" placeholder="密码" id="password" name="password" value="${password}"><br>
<input type="text" id="code_input" value="" placeholder="请输入验证码"/><br><input type="hidden" name="flag" id="flag" value="0">
<div id="v_container" style="margin-left:15px; margin-top:0px; width:100px; height:40px"></div><br>
<button type="submit" style="margin-left:0px" id="login-submit-btn" class="btn green" >登录 </button>
</div>
</div>
</form>
<form action="registeForm" method="post" id="registeForm">
<button type="submit" style="margin-left:350px;margin-top:-140px" id="registe" class="btn green">注册</button>
</form>
</div>
<script src="js/gVerify.js"></script>
<script type="text/javascript">
var verifyCode = new GVerify("v_container");
// var flag=0;
document.getElementById("login-submit-btn").onclick = function(){
var res = verifyCode.validate(document.getElementById("code_input").value);
if(res){
document.getElementById("flag").value=1;
// $("#LoginForm").submit();
}
}
$(function(){
/** 按了回车键 */
$(document).keydown(function(event){
if(event.keyCode == 13){
$("#login-submit-btn").trigger("click");
}
})
/** 给登录按钮绑定点击事件 */
$("#login-submit-btn").on("click",function(){
/** 校验登录参数 ctrl+K */
var loginname = $("#loginname").val();
var password = $("#password").val();
var msg = "";
if(!/^\w{4,20}$/.test(loginname)){
msg = "登录名长度必须是6~20之间";
}else if(!/^\w{4,20}$/.test(password)){
msg = "密码长度必须是6~20之间";
}
if(msg !=""||flag==0){
$.ligerDialog.error(msg);
return;
}
if(flag==1&&msg!=""){
$("#LoginForm").submit();
}
})
})
</script>
<script
src="${ctx}/js/metronic/plugins/jquery-ui/jquery-ui-1.10.1.custom.min.js"
type="text/javascript">
</script>
<script src="${ctx}/js/metronic/plugins/bootstrap/js/bootstrap.min.js"
type="text/javascript">
</script>
<script src="${ctx}/js/metronic/plugins/breakpoints/breakpoints.js"
type="text/javascript">
</script>
<script src="${ctx}/js/metronic/plugins/uniform/jquery.uniform.min.js"
type="text/javascript">
</script>
<script
src="${ctx}/js/metronic/plugins/backstretch/jquery.backstretch.min.js"
type="text/javascript">
</script>
<script src="${ctx}/js/metronic/scripts/app.js"></script>
<script src="${ctx}/js/metronic/scripts/lock.js"></script>
<script>
$(function() {
App.init();
Lock.init();
});
</script>
</body>
</html>
(11)registerForm.jsp(我自己写了个register.js保存在js包中,上面有js包的下载地址)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>User Register</title>
<script src="${ctx}/js/metronic/scripts/register.js"></script>
<link href="${ctx}/js/metronic/plugins/bootstrap/css/bootstrap.min.css"
rel="stylesheet" type="text/css" />
<link
href="${ctx}/js/metronic/plugins/bootstrap/css/bootstrap-responsive.min.css"
rel="stylesheet" type="text/css" />
<link
href="${ctx}/js/metronic/plugins/font-awesome/css/font-awesome.min.css"
rel="stylesheet" type="text/css" />
<link href="${ctx}/js/metronic/css/style-metro.css" rel="stylesheet"
type="text/css" />
<link href="${ctx}/js/metronic/css/style.css" rel="stylesheet"
type="text/css" />
<link href="${ctx}/js/metronic/css/style-responsive.css" rel="stylesheet"
type="text/css" />
<link href="${ctx}/js/metronic/css/themes/default.css" rel="stylesheet"
type="text/css" id="style_color" />
<link href="${ctx}/js/metronic/plugins/uniform/css/uniform.default.css"
rel="stylesheet" type="text/css" />
<link href="${ctx}/js/metronic/css/pages/lock.css" rel="stylesheet"
type="text/css" />
<link rel="shortcut icon" href="favicon.ico" />
<script type="text/javascript" src="${ctx }/js/jquery-1.11.0.js"></script>
<script type="text/javascript" src="${ctx }/js/jquery-migrate-1.2.1.js"></script>
<link href="${ctx }/js/ligerUI/skins/Aqua/css/ligerui-all.css" rel="stylesheet" type="text/css" />
<script src="${ctx }/js/ligerUI/js/core/base.js" type="text/javascript"></script>
<script src="${ctx }/js/ligerUI/js/plugins/ligerDialog.js" type="text/javascript"></script>
<script src="${ctx }/js/ligerUI/js/plugins/ligerDrag.js" type="text/javascript"></script>
<script src="${ctx }/js/ligerUI/js/plugins/ligerResizable.js" type="text/javascript"></script>
</head>
<body οnlοad="SubmitCheck()">
<!-- 从页面加载开始就检测是否可以提交 -->
<div class="page-lock">
<br/>
<br/>
<div class="page-logo" style="margin-bottom: 2px">
<a class="brand" style="font-size: 22px; color: #FFF;"> 电脑医院信息管理与预约系统--用户注册</a>
</div>
<br/><br/>
<form action="register" method="POST">
<div class="page-body">
<div>
<span></span>登录名称: <input onmouseout = "loginnameCheck()" id="loginname" type="text" name="loginname" /><span id="1"></span><br>
<span></span>登陆密码: <input onmouseout = "passCheck()" id="password" type="password" name="password" ></input><span id="2"></span><br>
<span></span>重复密码: <input onmouseout = "passTwoCheck()" id = "passtwo" type="password" name="passTwo" ></input><span id="3"></span><br>
<span></span>真实姓名: <input id="realname" type="text" name="realname" ></input><span id="4"></span><br>
<span></span>所在班级: <input id = "realclass" type="text" name="realclass" ></input><span id="5"></span><br>
<span></span>手机号码: <input onmouseout = "phonenumCheck()" id = "phonenum" type="text" name="phonenum" ></input><span id="6"></span><br>
</div>
<br><br>
<div>
<input id = "submit" class="btn green" disabled style="margin-left:150px" type="submit" value="立即注册"/><br>
</div>
</div>
</form>
</div>
<script
src="${ctx}/js/metronic/plugins/jquery-ui/jquery-ui-1.10.1.custom.min.js"
type="text/javascript">
</script>
<script src="${ctx}/js/metronic/plugins/bootstrap/js/bootstrap.min.js"
type="text/javascript">
</script>
<script src="${ctx}/js/metronic/plugins/breakpoints/breakpoints.js"
type="text/javascript">
</script>
<script src="${ctx}/js/metronic/plugins/uniform/jquery.uniform.min.js"
type="text/javascript">
</script>
<script
src="${ctx}/js/metronic/plugins/backstretch/jquery.backstretch.min.js"
type="text/javascript">
</script>
<script src="${ctx}/js/metronic/scripts/app.js"></script>
<script src="${ctx}/js/metronic/scripts/lock.js"></script>
<script>
$(function() {
App.init();
Lock.init();
});
</script>
</body>
</html>
(12)taglib.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!-- 设置一个项目路径的变量 -->
<c:set var="ctx" value="${pageContext.request.contextPath}"></c:set>
(13)main.jsp和usermain.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="GBK">
<title>Insert title here</title>
</head>
<body>
管理员登录成功!!!
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="GBK">
<title>Insert title here</title>
</head>
<body>
普通用户登录成功!!
</body>
</html>
(14)applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mybatis="http://mybatis.org/schema/mybatis-spring"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://mybatis.org/schema/mybatis-spring
http://mybatis.org/schema/mybatis-spring.xsd ">
<!-- 扫描org.fkit.dym.dao包里的所有接口当作spring的bean配置,之后可以进行依赖注入 -->
<mybatis:scan base-package="org.fkit.dym.dao"/>
<!-- 扫描org.fkit包下的所有Java文件,有spring的相关注解的类,则把这些类注册为spring的bean -->
<context:component-scan base-package="org.fkit.dym"/>
<!-- 使用PropertyOverrideConfigurer后处理器加载数据源参数 -->
<context:property-override location="classpath:db.properties"/>
<!-- 配置c3p0数据源 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"/>
<!-- 配置SqlSessionFactory,org.mybaties.spring.SqlSessionFactoryBean是mybaties社区开发用于整合spring的bean-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"
p:dataSource-ref="dataSource"/>
<!-- JDBC事务管理器 -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
p:dataSource-ref="dataSource"/>
<!-- 启用支持annotation注解方式事务管理 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
</beans>
(15)springmvc-config.xml
<?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:mvc="http://www.springframework.org/schema/mvc"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd ">
<!-- 自动扫描该包,SpringMVC会将包下用了@controller注解的类注册为Spring的controller -->
<context:component-scan base-package="org.fkit.dym.controller"/>
<!-- 设置默认配置方案 -->
<mvc:annotation-driven/>
<!-- 使用默认的Servlet来响应静态文件 -->
<mvc:default-servlet-handler/>
<!-- 定义Spring MVC的拦截器 -->
<mvc:interceptors>
<mvc:interceptor>
<!-- 拦截所有请求 -->
<mvc:mapping path="/*"/>
<!-- 自定义判断用户权限的拦截类 -->
<bean class="org.fkit.dym.interceptor.AuthorizedInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
<!-- 视图解析器 -->
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver"
p:prefix="/WEB-INF/jsp/" p:suffix=".jsp"/>
<!-- 文件上传下载 -->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 上传文件大小上限,单位为字节(10MB) -->
<property name="maxUploadSize">
<value>10485760</value>
</property>
<!-- 请求的编码格式,必须和jSP的pageEncoding属性一致,以便正确读取表单的内容,默认为ISO-8859-1 -->
<property name="defaultEncoding">
<value>UTF-8</value>
</property>
</bean>
</beans>
(16)web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<!-- 配置spring核心监听器,默认会以 /WEB-INF/applicationContext.xml作为配置文件 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- contextConfigLocation参数用来指定Spring的配置文件 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext*.xml</param-value>
</context-param>
<!-- 定义Spring MVC的前端控制器 -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/springmvc-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- 让Spring MVC的前端控制器拦截所有请求 -->
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- 编码过滤器 -->
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- jsp的配置 -->
<jsp-config>
<jsp-property-group>
<!-- 配置拦截所有的jsp页面 -->
<url-pattern>*.jsp</url-pattern>
<!-- 可以使用el表达式 -->
<el-ignored>false</el-ignored>
<!-- 不能在页面使用java脚本 -->
<scripting-invalid>true</scripting-invalid>
<!-- 给所有的jsp页面导入要依赖的库,tablib.jsp就是一个全局的标签库文件 -->
<include-prelude>/WEB-INF/jsp/taglib.jsp</include-prelude>
</jsp-property-group>
</jsp-config>
<error-page>
<error-code>404</error-code>
<location>/404.html</location>
</error-page>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
(17)404.html和index.jsp
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>电脑医院信息管理与预约系统-资源不存在!</title>
<base href="${basePath}">
</head>
<body style="background-color:#fff; ">
<div style="margin:0 auto; width:500px; height:306px;">
<input type="image" src="images/404.jpg" style="padding-top: 150px;"/>
</div>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!-- 立即请求/main -->
<jsp:forward page="main"/>
(18)数据库(直接从数据库导出的,应该没有错)
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for `user_inf`
-- ----------------------------
DROP TABLE IF EXISTS `user_inf`;
CREATE TABLE `user_inf` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`loginname` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`password` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`createdate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`realname` varchar(20) NOT NULL,
`realclass` varchar(20) NOT NULL,
`phonenum` varchar(20) NOT NULL,
`userstatus` int(10) NOT NULL DEFAULT '2',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of user_inf
-- ----------------------------
INSERT INTO `user_inf` VALUES ('1', 'admin', '123456', '2020-02-09 19:16:27', '范', '计科', '18838256188', '1');
INSERT INTO `user_inf` VALUES ('2', 'test', '123456', '2020-02-11 19:17:11', '范范', '软工', '15936948976', '1');
INSERT INTO `user_inf` VALUES ('3', 'test1', '123456', '2020-02-11 19:17:44', 'fanjunjjie', '信管', '15939845881', '2');
INSERT INTO `user_inf` VALUES ('4', 'test2', '123456', '2020-02-20 11:16:24', '小范', '计科', '18823456789', '2');
INSERT INTO `user_inf` VALUES ('5', 'test3', '123456', '2020-02-28 11:18:23', '公孙砾', '16制药工程', '15933457862', '2');
INSERT INTO `user_inf` VALUES ('6', 'test4', '123456', '2020-03-10 11:19:18', '松江', '17第一临床', '15858952881', '2');