双十一活动开发技术总结

问题一:返现卷读接口展示品牌与接口的二级联动效果,并能跳转到相应的商城页

下面是读取商城接口返回的json数据格式,以及相关字段说明

[{
           "id": 274,                                //跳转到商城的优惠Id
           "serialGroupgName": "奥迪Q3",             //车系名称
           "title": "多项优惠类型小活动",
           "manufacturerId": 1,                     //品牌Id
           "serialGroupId": 8670,                   //车系Id
           "beginTime": "2014-10-24 00:00:00",
           "manufacturerName": "一汽奥迪",           //品牌名称
           "stockCount": 395,                       //库存
           "endTime": "2014-11-15 23:59:59"
}]

由于外部的接口只有一个,而且将品牌车系都一起返回,没有分别返回品牌和车系,因此之前用过的伪下拉框插件用不了,附带以前用过的伪下拉框

<script src="http://js.3conline.com/min/temp/v1/dpl-related_select_v2,dpl-search_car_form.js"></script>
<script type="text/javascript">
relatedSelect(
                   {id: "pBrandNameBottom", url: "http://price.pcauto.com.cn/interface/5_3/brand_json_chooser_v2.jsp", node: {root: "brands", value: "text", text: "text", custom: "id"}, defaultValue:0, load: true},
                   {id: "pSeriesNameBottom", url: "http://price.pcauto.com.cn/interface/5_3/serial_json_chooser.jsp?brand=", node: {root: "firms", value: "text", text: "text", custom: "id"}, defaultValue:0}
);
</script>

<select id="pBrandNameBottom">
    <option value="">请选择品牌</option>
</select>
<select id="pSeriesNameBottom">
    <option value="">请选择车系</option>
</select>

所以这次需要自己写接口处理商城接口返回的数据

先展示一下我们要实现的效果图

<span class="aBtn clearfix" id="JfxBtn">
      <a href="javascript:void(0);" id="fx_500" ><img src="http://www1.pcauto.com.cn/zt/s141103/images/img1.jpg"  width="325" height="162" ></a>
      <a href="javascript:void(0);" id="fx_1500" ><img src="http://www1.pcauto.com.cn/zt/s141103/images/img2.jpg"  width="325" height="162"></a>
      <a href="javascript:void(0);" id="fx_1000" ><img src="http://www1.pcauto.com.cn/zt/s141103/images/img3.jpg"  width="325" height="162"></a>
</span>

要达到的效果如:当我们点击“支付88元返现500”的图片时,弹窗中的数据是通过调用接口

http://mall.pcauto.com.cn/autoMall/interface/activity/activity_manuSgList.jsp?aId=大活动ID&price=88拿到的

弹窗如下:

<!-- 返现弹框-->
<div class="fx_box" id="Jfx_box" style="display:none">
    <a href="javascript:void(0)" class="closeBtn closeBtn1"></a>
    <form action="index_ok.jsp" id="fx_form" method="post">
        <input type="hidden" name="price" id="price" value="">
        <span class="how_much">200元返现</span>
        <p class="changecar"><strong>选择意向车系</strong>
        <select class="selwid148" id="pBrandNameBottom"><option value="">选择活动品牌</option></select>
        <select class="selwid148" id="pSeriesNameBottom"><option value="">选择活动车系</option></select></p>
        <a href="" class="fx_btn"></a>
    </form>
</div>

点击事件:

//返现
$("#JfxBtn a").click(function(){
   if ($(this).attr("id") == "fx_500") {
       $(".how_much").html("500元返现");//更换弹窗文字
       freshBrand(88);//调用接口展示品牌
   }else if ($(this).attr("id") == "fx_1000") {
       $(".how_much").html("1000元返现");
       freshBrand(188);
   }else if ($(this).attr("id") == "fx_1500") {
       $(".how_much").html("1500元返现");
       freshBrand(288);
   }
   $.blockUI({message: $("#Jfx_box"),css:{width:‘585px‘,height:‘256px‘,cursor:‘default‘,border:‘none‘,background:‘none‘}});  //弹窗
 });

车系与品牌联动的js:

        //车系下拉
        function freshSeries(price, brandId) {
            $("#pSeriesNameBottom").html("<option value=‘‘>选择活动车系</option>");
            $.get("http://mall.pcauto.com.cn/huodong/20141111e/interface/fx_activity.jsp", {price:price, brandId: brandId, r:(new Date()).getTime()}, function(data){
                data =  $.trim(data);
                var jsonObj = eval("("+data+")");
                var text = "";
                //拼接下拉框文本
                for (i = 0; i < jsonObj.list.length; i++) {
                    var series = jsonObj.list[i];
                    text += "<option value=‘" + series.target_id + "‘>" + series.name + "</option>";
                    if (i == 0) {
                        $(".fx_btn").prop("href", "http://mall.pcauto.com.cn/r3/s" + series.target_id + "/");
                    }
                }
                if (text != ‘‘)
                    $("#pSeriesNameBottom").html(text);
                $("#pSeriesNameBottom").unbind("change");
                //车系下拉框触发改变事件,跳转链接发生改变
                $("#pSeriesNameBottom").change(function(){
                    var seriesId = $(this).val();
                    $(".fx_btn").prop("href", "http://mall.pcauto.com.cn/r3/s" + seriesId + "/");
                });

            });
        }

        //品牌下拉
        function freshBrand(price) {
            $("#pBrandNameBottom").html("<option value=‘‘>选择活动品牌</option>");
            $("#pSeriesNameBottom").html("<option value=‘‘>选择活动车系</option>");
            $.get("http://mall.pcauto.com.cn/huodong/20141111e/interface/fx_activity.jsp", {price:price, r:(new Date()).getTime()}, function(data){
                data =  $.trim(data);
                var jsonObj = eval("("+data+")");
                var text = "";
                //拼接下拉框文本
                for (i = 0; i < jsonObj.list.length; i++) {
                    var brand = jsonObj.list[i];
                    text += "<option value=‘" + brand.id + "‘>" + brand.name + "</option>";
                    if (i == 0) {
                        freshSeries(price, brand.id);
                    }
                }
                //显示
                if (text != ‘‘)
                    $("#pBrandNameBottom").html(text);
                $("#pBrandNameBottom").unbind("change");
                //品牌下拉框改变触发事件,同步车系
                $("#pBrandNameBottom").change(function() {
                    var brandId = $(this).val();
                    freshSeries(price, brandId);
                });
            });
        }      

无brandId时

http://mall.pcauto.com.cn/huodong/20141111e/interface/fx_activity.jsp?price=88

接口返回的数据:

{"list":[{id:57, name:"奇瑞汽车", target_id:121},{id:375, name:"上海大众斯柯达", target_id:123},{id:17, name:"一汽马自达", target_id:131},{id:78, name:"江淮汽车", target_id:133},{id:407, name:"长安马自达", target_id:186},{id:30, name:"雷克萨斯", target_id:135},{id:660, name:"上汽大通MAXUS", target_id:146}]}

接口返回的数据中id表示品牌id,name 是品牌名称,target_id表示商城优惠Id,不过由于优惠是与车系关联的,在这里没什么用

有brandId时

http://mall.pcauto.com.cn/huodong/20141111e/interface/fx_activity.jsp?price=88&brandId=57

接口返回的数据:

{"list":[{id:9313, name:"艾瑞泽7", target_id:121},{id:8580, name:"奇瑞E3", target_id:114},{id:8880, name:"奇瑞QQ", target_id:122},{id:10771, name:"瑞虎3", target_id:134},{id:4100, name:"风云2", target_id:145}]}

接口返回的数据中id表示车系id,name 是车系名称,target_id表示商城优惠Id,用于组装跳转到商城的链接

下面看看fx_activity.jsp接口是怎样实现的

<%@page language="java" contentType="text/html;charset=GBK" pageEncoding="GBK"%>
<%@ include file="/WEB-INF/jspf/import.jspf"%><%
    request.setCharacterEncoding("utf-8");

    String price = request.getParameter("price");
    String brandId = request.getParameter("brandId");    

    //查询活动车系库存
    BaseConfig baseConfig = EnvUtils.getEnv().getBean(BaseConfig.class);
    String actId = (String)baseConfig.get("actId");
    String data = HttpClientUtils.httpGet(SysConfig.BRAND_URI + "?aId=" + actId + "&price=" + price, "utf-8", true);
    //System.out.println("-------" + data);
    List<Map<String, Object>> resultList = new ArrayList<Map<String, Object>>();
    Map<String, Boolean> brandMap = new HashMap<String, Boolean>();
    if (StringUtils.isNotEmpty(data)) {
        JSONArray jsonArray = JSONArray.parseArray(data);
        if (jsonArray != null && jsonArray.size() > 0) {
            for (int i = 0 ; i < jsonArray.size(); i++) {
                try {
                       JSONObject json = jsonArray.getJSONObject(i);
                       if (json.getInteger("stockCount") <= 0) //库存<0不能显示
                           continue;

                       //查品牌
                       if (brandId == null && brandMap.get(json.getString("manufacturerName")) == null) {
                           Map<String, Object> map = new HashMap<String, Object>();
                           map.put("id", json.getInteger("manufacturerId"));
                           map.put("name", json.getString("manufacturerName"));
                           map.put("target_id", json.getInteger("id"));
                           resultList.add(map);
                           brandMap.put(json.getString("manufacturerName"), true);
                       }else {
                           //查某品牌下所有车系
                           String brandIdStr = json.getString("manufacturerId");
                           if (brandIdStr != null && brandIdStr.equals(brandId)) {
                               Map<String, Object> map = new HashMap<String, Object>();
                               map.put("id", json.getInteger("serialGroupId"));
                               map.put("name", json.getString("serialGroupgName"));
                               map.put("target_id", json.getInteger("id"));
                               resultList.add(map);
                           }
                       }
                }catch(Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }
    request.setAttribute("resultList", resultList);
%>
{"list":[
    <c:forEach var="o" items="${resultList }" varStatus="idx">
        {id:${o.id}, name:"${o.name}", target_id:${o.target_id}}
        <c:if test="${!idx.last }">,</c:if>
    </c:forEach>
]}
时间: 2024-08-04 10:31:27

双十一活动开发技术总结的相关文章

ios客户端发现_华为爱奇艺手机活动开发总结

这个项目自发布需求.活动原型图交付.修订需求.测试.修改.再测试通过上线可谓旷日持久.回过头来看整个项目工期主要卡在活动原型图交付这儿.而为了避免项目上线最后开发赶工期,在这次获取需求的情况下,先对除了需要图以外的模块进行了开发,并调通接口,从而在得到图之后快速完成需求.而深挖这个项目,可追到爱奇艺与华为合作交付没有顺畅达成,才促使一系列后期延期.     再拿原型图交付.修改需求.测试.修改.再测试上线这几个流程来说,每个环节对需求认识不同,就会做出一定的需求误判,而流程图及原型图又不能兼顾到

考研学生应该知道:研究方向和开发技术

我自己的一位大二学生,由參加ACM不安心.后来体会了应用的核心在算法,能在竞赛中坐住了.但如今,又有新问题了. [来信] 贺老师,我想问一下,假设打算考研,在这四年里仅仅搞算法不搞应用,或者说仅仅是懂一点应用.这样合适吗. [回复] 算法在计算机和软件project中都非常重要,但不是所有.大学期间的学习,是专业教育中的基础阶段.其它的也要好好学.研究生開始.要钻研详细的研究方向,须要对专业全面的了解作为支撑.对于应用,能够理解为要从事这方面的工作,但我觉得更关键的数据在于,为理解基础理论提供一

迭代式开发技术

迭代是一开发种技术,用来把系统功能传递到一系列的增量的完整版本,每个版本一个特定固定的时间段被开发,该时间段称之为迭代. 每个迭代的经历过程: 整个迭代过程: 图中颜色代表每次开发每项活动所占的比重不同 迭代式开发的优点: 1.降低风险 2.得到早期用户反馈 3.持续测试和集成 4.适应变更 开发特征: 1.在进行大规模的投资前,就解决了关键的风险问题 2.使的早期用户反馈在初始迭代中就能出现 3.连续进行测试和集成. 4.各个目标里程碑提供了短期的焦点. 5.对过程的测量是通过实现的评定来进行

视频网站开发技术独家报道

视频网站的确算是现代生活中必不可缺的一项娱乐活动,你可以在上面看电影.看电视剧.看新闻.看综艺节目.看体育赛事.看国外节目等,被现代生活的人们所 接受,所以有很多朋友想自己去开发一个这样的网站,其实这样的网站开发起来的确是有一定的困难,因为其中牵扯到很多技术,下面为大家稍微介绍几个: 做网站你首先必须要有一定的网站架构基础,了解前端开发技术(html+css).后台开发技术(比如java.c+等技术),还要需要懂绘图制作软件 (比如dreamweaver),这些东西你都必须要会,如果是小的企业站

Android开发技术周报 Issue#31

教程 LeakCanary: 让内存泄露无所遁形 一些对象有着有限的生命周期.当这些对象所要做的事情完成了,我们希望他们会被回收掉.但是如果有一系列对这个对象的引用,那么在我们期待这个对象生命周期结束的时候被收回的时候,它是不会被回收的.它还会占用内存,这就造成了内存泄露.持续累加,内存很快被耗尽. 移动端尺寸基础知识 (@慕课网) 初涉移动端设计和开发的同学们,基本都会在尺寸问题上纠结好一阵子才能摸到头绪.我也花了很长时间才弄明白,感觉有必要写一篇足够通俗易懂的教程来帮助大家.从原理说起,理清

【异周话题 第 16 期】2018年,你最期待的前端开发技术有哪些?

[异周话题 第 16 期]2018年,你最期待的前端开发技术有哪些?话题背景2017年已经过去,2018年如约而至.2017年在前端领域里,react已经逐渐占据主流,Angular 发布了 v4 以及 v5,Vue.js 继续流行:谷歌也宣布PWA将获得与安卓原生应用同等的待遇与权限,PWA将会得到迅速的普及.微软开发的TypeScript也逐渐得到关注,angular已经开始使用typeScript进行开发,react和vue也进一步加深对typeScript的支持.在过去的一年里前端领域的

混合模式为什么成为占有率最高的app开发技术

在企业移动战略布局中,app已成为连接业务与用户最主要的载体,同样其开发技术目前也处于十分成熟的阶段,而从技术实现的角度去考量,很多从业者可能并不知道,越是大企业.越是IT预算多的企业,他们的移动app大部分是基于混合开发模式实现的,尤其对于混合app技术开发的B2B.B2C和B2E类型的移动应用,占比甚至要远超市场的预期和想象. 目前,在各大银行.保险公司.烟草.电力.航空.铁路.家电制造.食品.零售等行业的领军型公司中,都大量的使用混合开发模式来开发和管理自己的app.那么也许很多人不禁要问

区块链应用开发技术架构模式介绍

区块链应用开发技术架构模式介绍区块链应用场景多样,从数字货币金融到去中心化互联网.大多数用例都可以归纳为几种模式.源中瑞ruiecjo给大家讲解基于区块链的去中心化应用的常见的4种架构模式.1.IAM的架构模式背景信息: IAM环境包括许多用户和服务提供商.IAM系统为每个用户提供一个帐户和一组功能,使用户可以前往服务提供商,展示其帐户所有权,然后根据其功能接收服务.力量:需要实现一个分散的IAM环境,在该环境中,一个恶意用户或几个用户不会对系统造成重大影响.解决方案:建议的模式候选者以以下方式

静态网页开发技术-HTML

今天我重新复习了一下静态网页开发技术,概括如下. 一 .HTML文档结构与基本语法 :放置了标签的文本文档,可供浏览器解释执行的网页文件 1.注释标记 2.标记 3.属性 二.基本标记与使用 1.网页基本结构与标记 2.文本与段落标记 3.列表标签 4.超链接标签 5.图片标记 6.定时刷新或跳转 7.表格 三 HTML表单标签与表单设计 1.<FORM>标记及其属性 2  <INPUT>标记及其属性 3 <下拉列表框<SELECT>,<OPTION>