JavaWeb-旅遊網-註冊和登錄

最近仿照着黑馬旅遊網寫了個旅遊網項目,界面和圖片用的是黑馬的,畢竟界面太難畫…,但是不是響應式的,等改天用Bootstrap重構成響應式的,功能跟黑馬的基本一樣,我在此基礎上進行了一些添加和優化。
在寫的過程,收穫到了很多知識,所以總結一下這幾天所收穫同時也重新梳理整個項目的流程,涉及的功能較多,我會分成幾篇博客進行總結
本次沒有使用jsp,前端單純的就是html,後臺提供接口,通過Ajax進行請求
因爲用的是黑馬的界面和圖片,如果涉及侵權了,請聯繫我,我會道歉並且刪除博客。

JavaWeb-旅遊網-導航條和分頁展示
JavaWeb-旅遊網-線路搜索
JavaWeb-旅遊網-詳情展示
JavaWeb-旅遊網-點擊收藏

註冊

功能:註冊提交後會發送給用戶一封激活郵件,只有激活用戶纔可登錄到主界面
頁面:
在這裏插入圖片描述
前端使用JQuery對用戶輸入的信息進行校驗,只有當全部信息符合要求時纔可進行註冊

			//檢驗用戶名
			function checkUserName() {
				//1.獲取用戶名的值
				var username = $("#username").val();
				//2.定義正則
				var reg_username = /^\w{2,10}$/;
				//3.判斷
				var flag = reg_username.test(username);
				if (flag){
				    //合法用戶名
                    $("#username").css("border","");
				} else{
				    //非法用戶名,紅色邊框提示非法
					$("#username").css("border","1px solid red");
				}
				return flag;
            }
            //檢驗密碼
			function checkPassWord() {
                //1.獲取用戶名的值
                var password = $("#password").val();
                //2.定義正則
                var reg_password = /^\w{6,20}$/;
                //3.判斷
                var flag = reg_password.test(password);
                if (flag){
                    //合法用戶名
                    $("#password").css("border","");
                } else{
                    //非法用戶名,紅色邊框提示非法
                    $("#password").css("border","1px solid red");
                }
                return flag;
            }
            //檢驗郵箱
			function checkEmail(){
			    var email = $("#email").val();
			    //定義正則
				var reg_email = /^\w+@\w+\.\w+$/
				//判斷
				var flag = reg_email.test(email);
				if (flag){
                    $("#email").css("border","");
				} else {
                    $("#email").css("border","1px solid red");
				}
				return flag

			}
			//檢驗姓名
            function checkName() {
                //1.獲取用戶名的值
                var username = $("#name").val();
                //3.判斷
				var flag = true;
                if (username.length == 0){
                    //姓名爲空
					flag = false;
                    $("#name").css("border","1px solid red");
                } else{
                    flag = true;
                    $("#name").css("border","");
                }
                return flag;
            }
            //檢驗手機號
            function checkTel() {
                //1.獲取用戶名的值
                var telephone = $("#telephone").val();
                //正則
                var reg_tel = /^[1][3,4,5,7,8][0-9]{9}$/;
                //3.判斷
                var flag = reg_tel.test(telephone);
                if (!flag){
                    $("#telephone").css("border","1px solid red");
                } else{
                    $("#telephone").css("border","");
                }
                return flag;
            }
            //檢驗出生日期
            function checkBirth() {
                //1.獲取用戶名的值
                var birthday = $("#birthday").val();
                //3.判斷
                var flag = true;
                if (birthday.length == 0){
                    //姓名爲空
                    flag = false;
                    $("#birthday").css("border","1px solid red");
                } else{
                    flag = true;
                    $("#birthday").css("border","");
                }
                return flag;
            }
            $(function(){
                //當表單提交,調用所有校驗方法,返回爲true,表單提交
				$("#registerForm").submit(function(){
				    if (checkUserName()&&checkPassWord()&&checkEmail()&&checkName()&&checkTel()&&checkBirth()){
				        //檢驗通過,發送Ajax請求,提交表單的數據,$(this).serialize()該方法將表單數據序列化成: key=value&key=value的格式
						$.post("user/regist",$(this).serialize(),function (data) {
							if(data.flag){
							    //註冊成功
								location.href="register_ok.html"
							}else{
							    //註冊失敗,添加提示信息
								$("#errorMsg").html(data.errorMsg);
							}
                        })
					}
				    return false;
				});
                //當某個組件失去焦點,調用對應的校驗
				$("#username").blur(checkUserName)
				$("#password").blur(checkPassWord)
				$("#email").blur(checkEmail)
				$("#name").blur(checkName)
				$("#telephone").blur(checkTel)
				$("#birthday").blur(checkBirth)
            });

不符合要求的信息會有紅框提示
在這裏插入圖片描述
信息都符合要求後,發送Ajax請求,後臺進行註冊,使用了MD5加鹽(用戶名+密碼)的方式對用戶密碼進行加密,註冊完成後發送激活郵件給用戶
後臺代碼:

public void regist(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //獲取數據
        Map<String,String[]> map = request.getParameterMap();
        //封裝對象
        User user = new User();
        try {
            BeanUtils.populate(user,map );
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
        //調用service完成註冊
        UserService service = new UserServiceImpl();
        boolean flag = service.regist(user);
        ResultInfo info = new ResultInfo();
        //響應消息
        if(flag){
            //註冊成功
            info.setFlag(true);
        }else {
            //註冊失敗
            info.setFlag(false);
            info.setErrorMsg("註冊失敗");
        }
        //將info對象序列化爲Json,返回客戶端
        //將json數據寫回客戶端
        response.setContentType("application/json;charset=utf-8");
        response.getWriter().write(getJson(info));

    }

用戶只有在激活了賬戶後才能進行正常的使用,每個用戶都會自動生成唯一的激活碼,後臺根據唯一的激活碼進行激活狀態的更改

  public boolean regist(User user) {
        //根據用戶名查詢用戶對象
        User u = userDao.findByUserName(user.getUsername());
        if(null != u){
            return false;
        }
        //郵件激活準備
        //設置激活碼,唯一字符串
        user.setCode(UuidUtil.getUuid());
        //設置激活狀態
        user.setStatus("N");
        //保存用戶信息
        userDao.regist(user);
        //激活郵件發送
        String content = "<a href ='http://localhost/travel/activeUserServlet?code="+user.getCode()+"'>點擊激活【黑馬旅遊網】</a>";
        MailUtils.sendMail(user.getEmail(),content ,"激活郵件" );

        return true;
    }

在這裏插入圖片描述
激活賬戶

     //獲取激活碼
        String code = request.getParameter("code");
        if(null != code){
            //調用service完成激活
            UserService service = new UserServiceImpl();
            boolean flag = service.active(code);
            //判斷標記
            String msg = null;
            if(flag){
                msg = "激活成功,請<a href='login.html'>登錄</a>";
            }else {
                msg = "激活失敗";
            }
            response.setContentType("text/html;charset=utf-8");
            response.getWriter().write(msg);
        }

用戶收到的郵件
在這裏插入圖片描述
在這裏插入圖片描述

登錄

功能:用戶輸入用戶名,密碼和驗證碼,來到主界面
頁面:
在這裏插入圖片描述
前端通過JavaScript對登錄信息進行簡單的非空判斷,只有都寫了才能點擊登錄

	function checkUserName(){
		    var username = $("#username").val();
            var flag = true;
            if (username.length == 0){
                //姓名爲空
                flag = false;
                $("#username").css("border","1px solid red");
            } else{
                flag = true;
                $("#username").css("border","");
            }
            return flag;
		}
        //檢查密碼是否輸入
        function checkPassWord(){
            var password = $("#password").val();
            var flag = true;
            if (password.length == 0){
                //姓名爲空
                flag = false;
                $("#password").css("border","1px solid red");
            } else{
                flag = true;
                $("#password").css("border","");
            }
            return flag;
        }
        //檢查驗證碼是否輸入
        function checkCode(){
            var code = $("#check").val();
            var flag = true;
            if (code.length == 0){
                //姓名爲空
                flag = false;
                $("#check").css("border","1px solid red");
            } else{
                flag = true;
                $("#check").css("border","");
            }
            return flag;
        }

發送Ajax,後臺對登錄信息進行認證將結果以json格式返回到前端,前端根據結果進行相應處理,
前端代碼:

$(function () {
            //給登錄按鈕註冊點擊事件
            $("#btn_submit").click(function(){
				//Ajax請求,提交表單數據
				if (checkUserName&&checkPassWord()&&checkCode()){
                    $.post("user/login",$("#loginForm").serialize(),function (data) {
                        //處理響應結果
                        if (data.flag){
                            //登錄成功
                            location.href="index.html"
                        }else{
                            //登錄錯誤,顯示提示信息同時更新驗證碼
                            $("#errorMsg").css("visibility","visible");
                            $("#errorMsg").html(data.errorMsg);
                            changeCheckCode();
                        }
                    });
				}
				return false;
            });
        })

後臺代碼:後臺進行認證時,先將前端傳過來的密碼進行MD5加密,然後再同數據庫進行認證,同時判斷驗證碼是否正確以及賬戶是否激活,提示以相應的信息

   public void login(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //驗證碼校驗
        String check = request.getParameter("check");
        String checkcode_server = (String) request.getSession().getAttribute("CHECKCODE_SERVER");
        //保證驗證碼只能使用一次
        request.getSession().removeAttribute("CHECKCODE_SERVER");
        if(checkcode_server == null || !checkcode_server.equalsIgnoreCase(check)){
            ResultInfo info = new ResultInfo();
            info.setFlag(false);
            info.setErrorMsg("驗證碼錯誤");
            //將info對象序列化爲Json,返回客戶端
            //將json數據寫回客戶端
            response.setContentType("application/json;charset=utf-8");
            response.getWriter().write(getJson(info));
            return;
        }
        //獲取用戶名和密碼
        Map<String,String[]> map = request.getParameterMap();
        //封裝對象
        User user = new User();
        try {
            BeanUtils.populate(user,map );
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
        //將密碼轉換成MD5加密,再後數據進行對比
        String password = user.getPassword();
        try {
            user.setPassword(Md5Util.encodeByMd5(user.getUsername()+password));
            System.out.println("MD5: "+Md5Util.encodeByMd5(user.getUsername()+password));
        } catch (Exception e) {
            e.printStackTrace();
        }
        //查詢
        UserService service = new UserServiceImpl();
        User u = service.login(user);
        //判斷用戶信息是否正確
        ResultInfo info = new ResultInfo();
        if(null == u){
            info.setFlag(false);
            info.setErrorMsg("用戶名或密碼錯誤");
        }
        if(null != u&& !"Y".equals(u.getStatus())){
            //未激活
            info.setFlag(false);
            info.setErrorMsg("尚未激活,請激活後重新登錄");
        }
        if(null != u &&"Y".equals(u.getStatus())){
            //將user對象存進session
            request.getSession().setAttribute("user",u);
            info.setFlag(true);
        }
        //JSON格式
        response.setContentType("application/json;charset=utf-8");
        response.getWriter().write(getJson(info));

    }

登錄後的用戶名顯示

未登錄前
在這裏插入圖片描述
登錄後
在這裏插入圖片描述
因爲前後端分離,所以沒法像之前那樣通過session獲得用戶,這裏依然使用Ajax向後臺請求用戶信息

 $.get("user/findUser",{},function (data) {
           var msg = "歡迎,"+data.username;
           //顯示登錄後的div
           $("#login").css('display','block');
           //將登錄前的div隱藏
           $("#logout").css('display','none');
           $("#name").html(msg);
        });

後臺代碼

    public void findUser(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //從session中獲取登錄用戶
        Object user = request.getSession().getAttribute("user");
        //將user寫回客戶端
        response.setContentType("application/json;charset=utf-8");
        response.getWriter().write(getJson(user));
    }

這裏額外記錄一點,display屬性把元素隱藏後,隱藏的元素不會佔據位置,看不見也摸不着,而visibility屬性把元素隱藏後,隱藏的元素還是會佔據位置,看不見但摸得着

visibility:visible(顯示)/hidden(隱藏)
display:none(隱藏)/show(顯示)

退出

退出就會簡單了,把用戶信息從session中移除,刪除session,然後重定向到登錄頁面即可

    public void exit(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        HttpSession session = request.getSession();
        session.removeAttribute("user");
        session.invalidate();
        response.sendRedirect(request.getContextPath()+"/login.html");
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章