目录
1.1流程图
实现
1.2.1前端校验
<!--表单校验
采用正则校验
1.用户名:单词字符,长度8到20位;
2.密码:单词字符,长度8到20位;
3.邮箱:邮箱格式
4.姓名:非空
5.手机号:手机号格式
6.出生日期:非空
7.验证码:非空 -->
<script>
//校验用户名函数
function checkUsername() {
var username = $("#username").val();
var re = new RegExp(/^[a-zA-Z]{2,20}$/);
if (re.test(username)){
$("#username").css("border","")
return true;
}else {
$("#username").css("border","1px solid red")
return false;
}
}
//校验密码函数
function checkPassword() {
var password = $("#password").val();
var re = new RegExp(/^[a-zA-Z0-9]{8,20}$/);
if (re.test(password)){
$("#password").css("border","")
return true;
}else {
$("#password").css("border","1px solid red")
return false;
}
}
//校验邮箱格式
function checkEmail() {
var email = $("#email").val();
var re = new RegExp(/^\w+@\w+\.\w+$/);
if (re.test(email)){
$("#email").css("border","")
return true;
}else{
$("#email").css("border","1px solid red")
return false
}
}
//校验姓名
function checkName() {
var name = $("#name").val();
if (name == null || name === "" || name === undefined) {
$("#name").css("border","1px solid red")
return false;
}else {
$("#name").css("border","")
return true;
}
}
//校验手机号
function checkPhoneNumber() {
var phoneNumber = $("#telephone").val();
var re = /^1(3[0-9]|4[01456879]|5[0-35-9]|6[2567]|7[0-8]|8[0-9]|9[0-35-9])\d{8}$/;
if (re.test(phoneNumber)){
$("#telephone").css("border","")
return true;
}else {
$("#telephone").css("border","1px solid red")
return false;
}
}
//校验出生日期
function checkBirthday() {
var birthday = $("#birthday").val();
if (birthday === "" || birthday == null) {
$("#birthday").css("border","1px solid red")
return false;
}else {
$("#birthday").css("border","")
return true;
}
}
//校验验证码非空
function checkCheckCode() {
var checkCode = $("#check").val();
if (checkCode === "" || checkCode == null) {
$("#check").css("border","1px solid red")
return false;
}else {
$("#check").css("border","")
return true;
}
}
$(function () {
$("#registerForm").submit(function () {
//判断主要校验项是否通过
if (checkName() && checkPassword() && checkEmail()) {
$.post("User/register",$(this).serialize(),function (data) {
//{"flag":false,"data":false,"errorMsg":"注册失败,用户名重复!"}
if (data.flag) {
location.href = "register_ok.html";
}else {
$("#errorMsg").html(data.errorMsg);
$("#checkCode").attr("src","checkCode?"+new Date().getTime())
}
});
}
return false
});
//绑定丢标事件
$("#username").blur(checkUsername);
$("#password").blur(checkPassword);
$("#email").blur(checkEmail);
$("#name").blur(checkName);
$("#telephone").blur(checkPhoneNumber);
$("#birthday").blur(checkBirthday);
$("#check").blur(checkCheckCode);
})
</script>
1.2.2验证码校验
//获取验证码,预防机器人操作
String check = request.getParameter("check");
//获取session
HttpSession session = request.getSession();
//强转
String checkcode_server =(String) session.getAttribute("CHECKCODE_SERVER");
//保证程序的健壮性,当获取了验证码后立即删除当前验证码信息,确保回退页面的验证码不重复
session.removeAttribute("CHECKCODE_SERVER");
//验证码如果为空或验证码错误,执行操作
if (checkcode_server == null || !checkcode_server.equalsIgnoreCase(check)) {
//将传输结果标准化,预防空指针异常
//获取结果传输对象
ResultInfo resultInfo = new ResultInfo();
//设置前端判断值
resultInfo.setFlag(false);
//设置提示信息
resultInfo.setErrorMsg("验证码错误!");
/**
* 未封装的方法
* */
/*ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(resultInfo);
response.setContentType("application/json;charset=utf-8");
response.getWriter().write(json);
System.out.println(json);*/
/**
* 封装后的方法
* 发送数据
* */
writeValue(resultInfo,response);
1.2.3用户名查重和邮箱查重
//如果验证码正确,则查询数据库
UserService userService = new UserServiceImpl();
//使用javaBean封装前端表单
Map<String, String[]> parameterMap = request.getParameterMap();
User user = new User();
//抓个异常
try {
BeanUtils.populate(user,parameterMap);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
ResultInfo resultInfo = new ResultInfo();
//查用户名是否重复
Boolean register = userService.register(user);
if (register) {
//查邮箱是否重复
Boolean registerEmail1 = userService.registerEmail(user);
if (registerEmail1){
resultInfo.setData(true);
//返回的数据添加状态
Boolean result = userService.registerAdd(user);
System.out.println(result);
if (result) {
resultInfo.setFlag(true);
}else {
resultInfo.setFlag(false);
resultInfo.setErrorMsg("信息添加失败,请检查!");
}
}else {
resultInfo.setFlag(false);
resultInfo.setErrorMsg("注册失败,邮箱已被注册!");
}
}else {
resultInfo.setFlag(false);
resultInfo.setErrorMsg("注册失败,用户名重复!");
}
/**
* 未封装的方法
* */
/*ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(resultInfo);
response.setContentType("application/json;charset=utf-8");
response.getWriter().write(json);
System.out.println(json);*/
/**
* 封装后的方法
* */
writeValue(resultInfo,response);
1.2.3.1用户名查重service操作
public Boolean register(User user) {
String username = user.getUsername();
User register = userDao.register(username);
Boolean flag = false;
if (register == null ) {
flag = true;
}
return flag;
}
1.2.3.2用户名查重dao操作
@Override
public User register(String username) {
User user = null;
try {
String sql = "select * from tab_user where username = ? ";
user = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<User>(User.class), username);
return user;
}catch (Exception e) {
}
return user;
}
1.2.3.3邮箱查重service操作
@Override
public Boolean registerEmail(User user) {
String email = user.getEmail();
User registerEmail = userDao.registerEmail(email);
Boolean flag = false;
if (registerEmail == null ) {
flag = true;
}
return flag;
}
1.2.3.4邮箱查重dao操作
@Override
public User registerEmail(String email) {
User user = null;
try {
String sql = "select * from tab_user where email = ?";
user = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<User>(User.class), email);
return user;
}catch (Exception e){
}
//如果没查到会报错,把错误抓一下,返回的就是空值
return null;
}
1.2.4.1表单数据存入数据库service
@Override
public Boolean registerAdd(User user) {
//获取全球唯一码并设置为User对象
user.setCode(UuidUtil.getUuid());
//设置Status码
user.setStatus("N");
//调dao
Boolean flag = userDao.registerAdd(user);
//发邮件
String content = "<a href='http://localhost/User/active?code="+user.getCode()+"'>点击激活旅游网</a>";
MailUtils.sendMail(user.getEmail(),content,"激活");
return flag;
}
1.2.4.2表单数据存入数据库dao
@Override
public Boolean registerAdd(User user) {
String sql = "insert into tab_user (username,password,name,birthday,sex,telephone,email,status,code) values (?,?,?,?,?,?,?,?,?)";
int update = jdbcTemplate.update(sql, user.getUsername(), user.getPassword(), user.getName(), user.getBirthday(), user.getSex(), user.getTelephone(), user.getEmail(),user.getStatus(),user.getCode());
//操作成功updata为1,否则为0
if (update > 0) {
return true;
}else {
return false;
}
}
1.2.5.1激活业务
/**
* 激活
* */
public void active(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
UserService userService = new UserServiceImpl();
//获取用户携带的唯一码
String code = request.getParameter("code");
//获取数据库的唯一码,并对比
boolean userCode = userService.findUserCode(code);
String msg = null;
if (userCode) {
//要加端口号否则无法访问------》???我也不知道写的时候为什么要加这句话,但是估计是个坑
msg = "激活成功,请<a href ='http://localhost/login.html'>登录</a>";
response.setContentType("text/html;charset=utf-8");
//将信息写到页面上
response.getWriter().write(msg);
}else {
msg = "激活失败,请联系管理员!";
response.setContentType("text/html;charset=utf-8");
response.getWriter().write(msg);
}
}
1.2.5.2激活service
@Override
public boolean findUserCode(String code) {
//根据激活码找用户,有则返回true,否则false
User user = userDao.findUserCode(code);
if (user != null) {
userDao.setStatus(user);
return true;
}else {
return false;
}
}
1.2.5.3激活dao
@Override
public User findUserCode(String code) {
User user = null;
//抓个异常,常用逻辑
try {
String sql = " select * from tab_user where code = ? ";
user = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<User>(User.class), code);
} catch (DataAccessException e) {
e.printStackTrace();
}
return user;
}
1.2.5.4改Status值
@Override
public boolean setStatus(User user) {
//逻辑很简单自己看。0_0
String sql = "update tab_user set status = 'Y' where uid = ?";
int update = jdbcTemplate.update(sql, user.getUid());
if (update > 0) {
return true;
}else {
return false;
}
}