页面静态化、前后端分离(页面优化)

大概:将页面缓存到客户的浏览器上,当用户访问页面的时候,直接不与服务器有交互,直接从本地缓存中拿取页面,节省网络流量。

之前的逻辑:点击链接,访问后端controller 访问业务层,成功获取数据,将数据渲染到html页面再将整个html页面返回给客户显示

现在:点击链接,除了第一次访问。访问直接访问用户本地的缓存的html页面 (浏览器会缓存下来静态static下文件),静态资源,然后通过前端ajAx来访问后端,获取页面需要显示的数据返回即可。

<!DOCTYPE HTML>
<html>
<head>
    <title>商品详情</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <!-- jquery -->
    <script type="text/javascript" src="/js/jquery.min.js"></script>
    <!-- bootstrap -->
    <link rel="stylesheet" type="text/css" href="/bootstrap/css/bootstrap.min.css" />
    <script type="text/javascript" src="/bootstrap/js/bootstrap.min.js"></script>
    <!-- jquery-validator -->
    <script type="text/javascript" src="/jquery-validation/jquery.validate.min.js"></script>
    <script type="text/javascript" src="/jquery-validation/localization/messages_zh.min.js"></script>
    <!-- layer -->
    <script type="text/javascript" src="/layer/layer.js"></script>
    <!-- md5.js -->
    <script type="text/javascript" src="/js/md5.min.js"></script>
    <!-- common.js -->
    <script type="text/javascript" src="/js/common.js"></script>
</head>
<body>

<div class="panel panel-default">
    <div class="panel-heading">秒杀商品详情</div>
    <div class="panel-body">
        <span id="userTip"> 您还没有登录,请登陆后再操作<br/></span>
        <span>没有收货地址的提示。。。</span>
    </div>
    <table class="table" id="goodslist">
        <tr>
            <td>商品名称</td>
            <td colspan="3" id="goodsName"></td>
        </tr>
        <tr>
            <td>商品图片</td>
            <td colspan="3"><img id="goodsImg" width="200" height="200" /></td>
        </tr>
        <tr>
            <td>秒杀开始时间</td>
            <td id="startTime"></td> <!--时间 显示格式-->
            <td>
                <input type="hidden" id="remainSeconds" />
                <span id="miaoshaTip"></span>
            </td>
        </tr>
        <tr>
            <td>商品原价</td>
            <td colspan="3" id="goodsPrice"></td>
        </tr>
        <tr>
            <td>秒杀价</td>
            <td colspan="3" id="miaoshaPrice"></td>
        </tr>
        <tr>
            <td>库存数量</td>
            <td colspan="3" id="stockCount"></td>
        </tr>
        <tr>
            <td>
            <!--<form id="miaoshaForm" method="post" action="/miaosha/do_miaosha"> &lt;!&ndash;一个秒杀 按钮 将 秒杀订单提交到 do_miaosha&ndash;&gt;-->
                    <!--<button class="btn btn-primary btn-block" type="submit" id="buyButton">立即秒杀</button>-->
                    <!--<input type="hidden" name="goodsId" id="goodsId" />-->
            <!--</form>-->
            <div class="row">
                <div class="form-inline">
                    <img id="verifyCodeImg" width="80" height="32"  style="display:none" onclick="refreshVerifyCode()"/><!--onclick 是刷新 这个验证码-->
                    <input id="verifyCode"  class="form-control" style="display:none"/>
                    <button class="btn btn-primary" type="button" id="buyButton"onclick="getMiaoshaPath()">立即秒杀</button>
                </div>
            </div>
            <input type="hidden" name="goodsId" id="goodsId" /><!--a-->
            </td>
        </tr>
    </table>
</div>
</body>
<script>
    $(function () {
      //  countDown();
        getDetail();//从后端取出对应数据

    })
    function getDetail() {
        var goodsId = g_getQueryString("goodsId");
        $.ajax({
            url : "/goods/to_detail/"+goodsId,
            type : "GET",
            success: function (data) {
                if (data.code  == 0) {// 访问后端detail 接口拿到数据
                    render(data.data);//渲染界面的方法
                }else {
                    layer.msg(data.msg)
                }
            },
            error:function () {
             layer.msg("客户端请求有误!")
            }
        })
    }

    function render(detail) {
        var  goodsVo =detail.goodsVo;
        var miaoshaStatus =detail.miaoshaStatus;
        var remainSeconds =detail.remainSeconds;
        var user =detail.user;
        if (user) {
            $("#userTip").hide();//没有就不展示
        }
        //用获取的参数 放入 对应的模板中
            $("#goodsName").text(goodsVo.goodsName);
            $("#goodsImg").attr("src", goodsVo.goodsImg);
            $("#startTime").text(new Date(goodsVo.startDate).format("yyyy-MM-dd hh:mm:ss"));
            $("#remainSeconds").val(remainSeconds);
            $("#goodsId").val(goodsVo.id);
            $("#goodsPrice").text(goodsVo.goodsPrice);
            $("#miaoshaPrice").text(goodsVo.miaoshaPrice);
            $("#stockCount").text(goodsVo.stockCount);
            countDown();//调用倒计时
    }
    function countDown() {
        var remainSeconds = $("#remainSeconds").val();
        // var remainSeconds = $("#remainSeconds").val();
        var timeout;//定义一个timeout 保存Timeout         if (remainSeconds>0){//秒杀未开始
            $("#buyButton").attr("disabled",true);/*还没开始的时候按钮不让点*/
            $("#miaoshaTip").html("秒杀倒计时:"+remainSeconds+"");
            /*且做一个倒计时*/
            timeout=setTimeout(function () {//setTimeout 为时间到了之后执行 该函数
                $("#countDown").text(remainSeconds-1);//将显示中的值 -1
                $("#remainSeconds").val(remainSeconds-1);// remianSeconds 值减一
                countDown();//在调用该方法 实现循环
            },1000)
        }else if (remainSeconds == 0){//秒杀进行中
            $("#buyButton").attr("disabled",false);
            //remainSeconds =0
            clearTimeout(timeout);//取消timeout 代码执行
            $("#miaoshaTip").html("秒杀进行中!")//修改其中的内容
            /**加入秒杀数学验证码 功能
             * 1.一开始图形验证码和输入框都是隐藏的
             * 2.当秒杀进行的时候,显示验证码和输入框
             * */
            $("#verifyCodeImg").attr("src", "/miaosha/verifyCode?goodsId="+$("#goodsId").val());//访问验证码接口
            $("#verifyCodeImg").show();
            $("#verifyCode").show();

        } else {//秒杀结束
            $("#buyButton").attr("disabled",true);
            $("#miaoshaTip").html("结束!!!")//修改其中的内容
        }
    }
function refreshVerifyCode() {
    $("#verifyCodeImg").attr("src", "/miaosha/verifyCode?goodsId="+$("#goodsId").val()+"&timestamp="+new Date().getTime());//访问验证码接口
    //这里 如果不加timestamp url 不变,重复申请,浏览器会直接取缓存,不重复请求
    
}
    // function countDown(){
    //     var remainSeconds = $("#remainSeconds").val();
    //     var timeout;
    //     if(remainSeconds > 0){//秒杀还没开始,倒计时
    //         $("#buyButton").attr("disabled", true);
    //         $("#miaoshaTip").html("秒杀倒计时:"+remainSeconds+"");
    //         timeout = setTimeout(function(){
    //             $("#countDown").text(remainSeconds - 1);
    //             $("#remainSeconds").val(remainSeconds - 1);
    //             countDown();
    //         },1000);
    //     }else if(remainSeconds == 0){//秒杀进行中
    //         $("#buyButton").attr("disabled", false);
    //         if(timeout){
    //             clearTimeout(timeout);
    //         }
    //         $("#miaoshaTip").html("秒杀进行中");
    //     }else{//秒杀已经结束
    //         $("#buyButton").attr("disabled", true);
    //         $("#miaoshaTip").html("秒杀已经结束");
    //     }
    // }
</script>
</html>

猜你喜欢

转载自blog.csdn.net/weixin_38035852/article/details/81054987
今日推荐