zoukankan      html  css  js  c++  java
  • 商铺项目(店铺列表开发)

    先做后端:

    package com.ouyan.o2o.dao;
    
    import static org.junit.Assert.assertEquals;
    
    import java.util.Date;
    import java.util.List;
    
    import org.junit.Ignore;
    import org.junit.Test;
    import org.springframework.beans.factory.annotation.Autowired;
    
    import com.ouyan.o2o.BaseTest;
    import com.ouyan.o2o.entity.Area;
    import com.ouyan.o2o.entity.PersonInfo;
    import com.ouyan.o2o.entity.Shop;
    import com.ouyan.o2o.entity.ShopCategory;
    
    public class ShopDaoTest extends BaseTest {
        @Autowired
        private ShopDao shopDao;
    
        @Test
        public void testQueryShopListAndCount(){
            Shop shopCondition = new Shop();
            PersonInfo owner = new PersonInfo();
            owner.setUserId(1L);
            shopCondition.setOwner(owner);
            List<Shop> shopList = shopDao.queryShopList(shopCondition, 0, 5);
            System.out.println(shopList.size());
            int i = shopDao.queryShopCount(shopCondition);
            System.out.println(i);
        }
        
        @Test
        @Ignore
        public void testQueryByshopId() {
            Shop shop = shopDao.queryByShopId(62L);
            System.out.println(shop.getShopId());
            System.out.println(shop.getShopName());
        }
    
        @Test
        @Ignore
        public void testInsertShop() {
            Shop shop = new Shop();
            PersonInfo owner = new PersonInfo();
            Area area = new Area();
            ShopCategory shopCategory = new ShopCategory();
            owner.setUserId(1L);
            area.setAreaId(2);
            shopCategory.setShopCategoryId(33L);
            shop.setOwner(owner);
            shop.setArea(area);
            shop.setShopCategory(shopCategory);
            shop.setShopName("测试的店铺");
            shop.setShopDesc("test");
            shop.setShopAddr("test");
            shop.setPhone("test");
            shop.setShopImg("test");
            shop.setCreateTime(new Date());
            shop.setEnableStatus(1);
            shop.setAdvice("审核中");
            int effectedNum = shopDao.insertShop(shop);
            assertEquals(1, effectedNum);
        }
    
        @Test
        @Ignore
        public void testUpdateShop() {
            Shop shop = new Shop();
            shop.setShopId(30L);
            shop.setShopDesc("测试描述");
            shop.setShopAddr("测试地址");
            shop.setLastEditTime(new Date());
            int effectedNum = shopDao.updateShop(shop);
            assertEquals(1, effectedNum);
        }
    }

    package com.ouyan.o2o.service.impl;
    
    import java.io.IOException;
    import java.util.Date;
    import java.util.List;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    import org.springframework.transaction.annotation.Transactional;
    
    import com.ouyan.o2o.dao.ShopDao;
    import com.ouyan.o2o.dto.ImageHolder;
    import com.ouyan.o2o.dto.ShopExecution;
    import com.ouyan.o2o.entity.Shop;
    import com.ouyan.o2o.enums.ShopStateEnum;
    import com.ouyan.o2o.exceptions.ShopOperationException;
    import com.ouyan.o2o.service.ShopService;
    import com.ouyan.o2o.util.ImageUtil;
    import com.ouyan.o2o.util.PageCalculator;
    import com.ouyan.o2o.util.PathUtil;
    @Service
    public class ShopServiceImpl implements ShopService{
        @Autowired
        private ShopDao shopDao;
        
        @Override
        @Transactional
        public ShopExecution addShop(Shop shop, ImageHolder thumbnail) {
            //空值判断
            if(shop==null){
                return new ShopExecution(ShopStateEnum.NULL_SHOP_INFO);
            }
            try {
                //给店铺信息赋值初始值
                shop.setEnableStatus(0);
                shop.setCreateTime(new Date());
                shop.setLastEditTime(new Date());
                //添加店铺信息
                int effectedNum = shopDao.insertShop(shop);
                if(effectedNum<=0){
                    throw new ShopOperationException("店铺创建失败");
                }else{
                    if(thumbnail.getImage()!=null){
                        //存储图片
                        try {
                            addShopImg(shop,thumbnail);
                        } catch (Exception e) {
                            throw new ShopOperationException("addShopImg error:"+e.getMessage());
                        }
                        effectedNum = shopDao.updateShop(shop);
                        if(effectedNum<=0){
                            throw new ShopOperationException("更新图片地址失败");
                        }
                    }
                }
            } catch (Exception e) {
                throw new ShopOperationException("addShop error: "+ e.getMessage());
            }
            return new ShopExecution(ShopStateEnum.CHECK,shop);
        }
    
        private void addShopImg(Shop shop, ImageHolder thumnail) throws ShopOperationException, IOException {
            //获取shop图片的相对路径
            String dest = PathUtil.getShopImagePath(shop.getShopId());
            String shopImgAddr = ImageUtil.generateThumbnail(thumnail,dest);
            shop.setShopImg(shopImgAddr);
        }
    
        @Override
        public Shop getByShopId(long shopId) {
            return shopDao.queryByShopId(shopId);
        }
    
        @Override
        public ShopExecution modifyShop(Shop shop,ImageHolder thumbnail)
                throws ShopOperationException {
            if(shop==null||shop.getShopId()==null){
                return new ShopExecution(ShopStateEnum.NULL_SHOP_INFO);
            }else{
                //判断是否需要处理图片
                try{
                if(thumbnail.getImage()!=null&&thumbnail.getImageName()!=null&&!"".equals(thumbnail.getImageName())){
                    Shop tempShop = shopDao.queryByShopId(shop.getShopId());
                    if(tempShop.getShopImg()!=null){
                        ImageUtil.deleteFileOrPath(tempShop.getShopImg());
                    }
                    try {
                        addShopImg(shop,thumbnail);
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
                //更新店铺信息
                shop.setLastEditTime(new Date());
                int effectedNum = shopDao.updateShop(shop);
                if(effectedNum<=0){
                    return new ShopExecution(ShopStateEnum.INNER_ERROR);
                }else{
                    shop=shopDao.queryByShopId(shop.getShopId());
                    return new ShopExecution(ShopStateEnum.SUCCESS,shop);
                }}catch(Exception e){
                    throw new ShopOperationException("modifyShop error: "+e.getMessage());
                }
            }
        }
    
        @Override
        public ShopExecution getShopList(Shop shopCondition, int pageIndex, int pageSize) {
            int rowIndex = PageCalculator.calculateRowIndex(pageIndex,pageSize);
            List<Shop> shopList = shopDao.queryShopList(shopCondition, rowIndex, pageSize);
            int count = shopDao.queryShopCount(shopCondition);
            ShopExecution se = new ShopExecution();
            if(shopList!=null){
                se.setShopList(shopList);
                se.setCount(count);
            }else{
                se.setState(ShopStateEnum.INNER_ERROR.getState());
            }
            return se;
        }
    }

    package com.ouyan.o2o.dao;
    
    import java.util.List;
    
    import org.apache.ibatis.annotations.Param;
    
    import com.ouyan.o2o.entity.Shop;
    
    public interface ShopDao {
        /**
         * 分页查询店铺,可输入的条件有:店铺名(模糊),店铺状态,店铺类别,区域ID,owner
         * @param shopCondition
         * @param rowIndex从第几行开始取数据
         * @param pageSize返回的条数
         * @return
         */
        List<Shop> queryShopList(@Param("shopCondition") Shop shopCondition,@Param("rowIndex") int rowIndex,@Param("pageSize") int pageSize);
        
        /**
         * 返回queryShopList总数
         * @param shopCondition
         * @return
         */
        int queryShopCount(@Param("shopCondition") Shop shopCondition);
        /**
         * 通过shopId查询店鋪
         */
        Shop queryByShopId(Long shopId);
        /**
         * 新增店铺
         */
        int insertShop(Shop shop);
        
        /**
         * 更新店铺信息
         */
        int updateShop(Shop shop);
    }

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="com.ouyan.o2o.dao.ShopDao">
        <resultMap id="shopMap" type="com.ouyan.o2o.entity.Shop">
            <id column="shop_id" property="shopId" />
            <result column="shop_name" property="shopName" />
            <result column="shop_desc" property="shopDesc" />
            <result column="shop_addr" property="shopAddr" />
            <result column="phone" property="phone" />
            <result column="shop_img" property="shopImg" />
            <result column="priority" property="priority" />
            <result column="create_time" property="createTime" />
            <result column="last_edit_time" property="lastEditTime" />
            <result column="enable_status" property="enableStatus" />
            <result column="advice" property="advice" />
            <association property="area" column="area_id"
                javaType="com.ouyan.o2o.entity.Area">
                <id column="area_id" property="areaId" />
                <result column="area_name" property="areaName" />
            </association>
            <association property="shopCategory" column="shop_category_id"
                javaType="com.ouyan.o2o.entity.ShopCategory">
                <id column="shop_category_id" property="shopCategoryId" />
                <result column="shop_category_name" property="shopCategoryName" />
            </association>
            <association property="owner" column="user_id"
                javaType="com.ouyan.o2o.entity.PersonInfo">
                <id column="user_id" property="userId" />
                <result column="name" property="name" />
            </association>
        </resultMap>
        <select id="queryShopList" resultMap="shopMap">
            SELECT
            s.shop_id,
            s.shop_name,
            s.shop_desc,
            s.shop_addr,
            s.phone,
            s.shop_img,
            s.priority,
            s.create_time,
            s.last_edit_time,
            s.enable_status,
            s.advice,
            a.area_id,
            a.area_name,
            sc.shop_category_id,
            sc.shop_category_name
            FROM
            tb_shop s,
            tb_area a,
            tb_shop_category sc
            <where>
                <if
                    test="shopCondition.shopCategory!=null and shopCondition.shopCategory.shopCategoryId !=null">
                    and
                    s.shop_category_id=#{shopCondition.shopCategory.shopCategoryId}
                </if>
                <if test="shopCondition.area!=null and shopCondition.area.areaId !=null">
                    and s.area_id=#{shopCondition.area.areaId}
                </if>
                <if test="shopCondition.shopName!=null">
                    and s.shop_name like '%${shopCondition.shopName}%'
                </if>
                <if test="shopCondition.enableStatus!=null">
                    and s.enable_Status=#{shopCondition.enableStatus}
                </if>
                <if test="shopCondition.owner!=null and shopCondition.owner.userId !=null">
                    and s.owner_id=#{shopCondition.owner.userId}
                </if>
                AND
                a.area_id=a.area_id
                AND
                s.shop_category_id=sc.shop_category_id
            </where>
            ORDER BY
            s.priority desc
            LIMIT #{rowIndex},#{pageSize}
        </select>
        <select id="queryShopCount" resultType="int">
            select
            count(1)
            from
            tb_shop s,
            tb_area a,
            tb_shop_category sc
            <where>
                <if
                    test="shopCondition.shopCategory!=null and shopCondition.shopCategory.shopCategoryId !=null">
                    and
                    s.shop_category_id=#{shopCondition.shopCategory.shopCategoryId}
                </if>
                <if test="shopCondition.area!=null and shopCondition.area.areaId !=null">
                    and s.area_id=#{shopCondition.area.areaId}
                </if>
                <if test="shopCondition.shopName!=null">
                    and s.shop_name like '%${shopCondition.shopName}%'
                </if>
                <if test="shopCondition.enableStatus!=null">
                    and s.enable_Status=#{shopCondition.enableStatus}
                </if>
                <if test="shopCondition.owner!=null and shopCondition.owner.userId !=null">
                    and s.owner_id=#{shopCondition.owner.userId}
                </if>
                AND
                a.area_id=a.area_id
                AND
                s.shop_category_id=sc.shop_category_id
            </where>
        </select>
    
        <select id="queryByShopId" resultMap="shopMap" parameterType="Long">
            <!-- 具体的sql -->
            SELECT
            s.shop_id,
            s.shop_name,
            s.shop_desc,
            s.shop_addr,
            s.phone,
            s.shop_img,
            s.priority,
            s.create_time,
            s.last_edit_time,
            s.enable_status,
            s.advice,
            a.area_id,
            a.area_name,
            sc.shop_category_id,
            sc.shop_category_name
            FROM
            tb_shop s,
            tb_area a,
            tb_shop_category sc
            WHERE
            s.area_id=a.area_id
            and
            s.shop_category_id=sc.shop_category_id
            and
            shop_id = #{shopId}
        </select>
        <insert id="insertShop" useGeneratedKeys="true" keyColumn="shop_id"
            keyProperty="shopId">
            insert into
            tb_shop(owner_id,area_id,shop_category_id,shop_name,shop_desc,shop_addr,phone,shop_img,priority,create_time,last_edit_time,enable_status,advice)
            values(#{owner.userId},#{area.areaId},#{shopCategory.shopCategoryId},#{shopName},#{shopDesc},#{shopAddr},#{phone},#{shopImg},#{priority},#{createTime},#{lastEditTime},#{enableStatus},#{advice})
        </insert>
    
        <update id="updateShop" parameterType="com.ouyan.o2o.entity.Shop">
            update tb_shop
            <set>
                <if test="shopName != null">shop_name=#{shopName},</if>
                <if test="shopDesc != null">shop_desc=#{shopDesc},</if>
                <if test="shopAddr != null">shop_addr=#{shopAddr},</if>
                <if test="phone != null">phone=#{phone},</if>
                <if test="shopImg != null">shop_img=#{shopImg},</if>
                <if test="priority != null">priority=#{priority},</if>
                <if test="lastEditTime != null">last_edit_time=#{lastEditTime},</if>
                <if test="enableStatus != null">enable_status=#{enableStatus},</if>
                <if test="advice != null">advice=#{advice},</if>
                <if test="area != null">area_id=#{area.areaId},</if>
                <if test="shopCategory != null">shop_category_id=#{shopCategory.shopCategoryId}</if>
            </set>
            where shop_id=#{shopId}
        </update>
    </mapper>

    package com.ouyan.o2o.web.frontend;
    
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    import javax.servlet.http.HttpServletRequest;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.ResponseBody;
    
    import com.ouyan.o2o.dto.ShopExecution;
    import com.ouyan.o2o.entity.Area;
    import com.ouyan.o2o.entity.Shop;
    import com.ouyan.o2o.entity.ShopCategory;
    import com.ouyan.o2o.service.AreaService;
    import com.ouyan.o2o.service.ShopCategoryService;
    import com.ouyan.o2o.service.ShopService;
    import com.ouyan.o2o.util.HttpServletRequestUtil;
    
    @Controller
    @RequestMapping("/frontend")
    public class ShopListController {
        @Autowired
        private AreaService areaService;
        @Autowired
        private ShopCategoryService shopCategoryService;
        @Autowired
        private ShopService shopService;
    
        /**
         * 返回商品列表页里的ShopCategory列表(二级或者一级),以及区域信息列表
         * 
         * @param request
         * @return
         */
        @RequestMapping(value = "/listshopspageinfo", method = RequestMethod.GET)
        @ResponseBody
        private Map<String, Object> listShopsPageInfo(HttpServletRequest request) {
            Map<String, Object> modelMap = new HashMap<String, Object>();
            // 试着从前端请求中获取parentId
            long parentId = HttpServletRequestUtil.getLong(request, "parentId");
            List<ShopCategory> shopCategoryList = null;
            if (parentId != -1) {
                // 如果parentId存在,则取出该一级ShopCategory下的二级ShopCategory列表
                try {
                    ShopCategory shopCategoryCondition = new ShopCategory();
                    ShopCategory parent = new ShopCategory();
                    parent.setShopCategoryId(parentId);
                    shopCategoryCondition.setParent(parent);
                    shopCategoryList = shopCategoryService.getShopCategoryList(shopCategoryCondition);
                } catch (Exception e) {
                    modelMap.put("success", false);
                    modelMap.put("errMsg", e.getMessage());
                }
            } else {
                try {
                    // 如果parentId不存在,则取出所有一级ShopCategory(用户在首页选择的是全部商店列表)
                    shopCategoryList = shopCategoryService.getShopCategoryList(null);
                } catch (Exception e) {
                    modelMap.put("success", false);
                    modelMap.put("errMsg", e.getMessage());
                }
            }
            modelMap.put("shopCategoryList", shopCategoryList);
            List<Area> areaList = null;
            try {
                // 获取区域列表信息
                areaList = areaService.getAreaList();
                modelMap.put("areaList", areaList);
                modelMap.put("success", true);
                return modelMap;
            } catch (Exception e) {
                modelMap.put("success", false);
                modelMap.put("errMsg", e.getMessage());
            }
            return modelMap;
        }
    
        /**
         * 获取指定查询条件下的店铺列表
         * 
         * @param request
         * @return
         */
        @RequestMapping(value = "/listshops", method = RequestMethod.GET)
        @ResponseBody
        private Map<String, Object> listShops(HttpServletRequest request) {
            Map<String, Object> modelMap = new HashMap<String, Object>();
            // 获取页码
            int pageIndex = HttpServletRequestUtil.getInt(request, "pageIndex");
            // 获取一页需要显示的数据条数
            int pageSize = HttpServletRequestUtil.getInt(request, "pageSize");
            // 非空判断
            if ((pageIndex > -1) && (pageSize > -1)) {
                // 试着获取一级类别Id
                long parentId = HttpServletRequestUtil.getLong(request, "parentId");
                // 试着获取特定二级类别Id
                long shopCategoryId = HttpServletRequestUtil.getLong(request, "shopCategoryId");
                // 试着获取区域Id
                int areaId = HttpServletRequestUtil.getInt(request, "areaId");
                // 试着获取模糊查询的名字
                String shopName = HttpServletRequestUtil.getString(request, "shopName");
                // 获取组合之后的查询条件
                Shop shopCondition = compactShopCondition4Search(parentId, shopCategoryId, areaId, shopName);
                // 根据查询条件和分页信息获取店铺列表,并返回总数
                ShopExecution se = shopService.getShopList(shopCondition, pageIndex, pageSize);
                modelMap.put("shopList", se.getShopList());
                modelMap.put("count", se.getCount());
                modelMap.put("success", true);
            } else {
                modelMap.put("success", false);
                modelMap.put("errMsg", "empty pageSize or pageIndex");
            }
    
            return modelMap;
        }
    
        /**
         * 组合查询条件,并将条件封装到ShopCondition对象里返回
         * 
         * @param parentId
         * @param shopCategoryId
         * @param areaId
         * @param shopName
         * @return
         */
        private Shop compactShopCondition4Search(long parentId, long shopCategoryId, int areaId, String shopName) {
            Shop shopCondition = new Shop();
            if (parentId != -1L) {
                // 查询某个一级ShopCategory下面的所有二级ShopCategory里面的店铺列表
                ShopCategory childCategory = new ShopCategory();
                ShopCategory parentCategory = new ShopCategory();
                parentCategory.setShopCategoryId(parentId);
                childCategory.setParent(parentCategory);
                shopCondition.setShopCategory(childCategory);
            }
            if (shopCategoryId != -1L) {
                // 查询某个二级ShopCategory下面的店铺列表
                ShopCategory shopCategory = new ShopCategory();
                shopCategory.setShopCategoryId(shopCategoryId);
                shopCondition.setShopCategory(shopCategory);
            }
            if (areaId != -1L) {
                // 查询位于某个区域Id下的店铺列表
                Area area = new Area();
                area.setAreaId(areaId);
                shopCondition.setArea(area);
            }
    
            if (shopName != null) {
                // 查询名字里包含shopName的店铺列表
                shopCondition.setShopName(shopName);
            }
            // 前端展示的店铺都是审核成功的店铺
            shopCondition.setEnableStatus(1);
            return shopCondition;
        }
    }

    package com.ouyan.o2o.entity;
    
    import java.util.Date;
    
    public class Area {
        private Integer areaId;
        private String areaName;
        private String areaDesc;
        private Integer priority;
        private Date createTime;
        private Date lastEditTime;
    
        public Integer getAreaId() {
            return areaId;
        }
    
        public void setAreaId(Integer areaId) {
            this.areaId = areaId;
        }
    
        public String getAreaName() {
            return areaName;
        }
    
        public void setAreaName(String areaName) {
            this.areaName = areaName;
        }
    
        public String getAreaDesc() {
            return areaDesc;
        }
    
        public void setAreaDesc(String areaDesc) {
            this.areaDesc = areaDesc;
        }
    
        public Integer getPriority() {
            return priority;
        }
    
        public void setPriority(Integer priority) {
            this.priority = priority;
        }
    
        public Date getCreateTime() {
            return createTime;
        }
    
        public void setCreateTime(Date createTime) {
            this.createTime = createTime;
        }
    
        public Date getLastEditTime() {
            return lastEditTime;
        }
    
        public void setLastEditTime(Date lastEditTime) {
            this.lastEditTime = lastEditTime;
        }
    
    }

    然后自己测试下。

    接下来看前端:

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>商店列表</title>
    <meta name="viewport" content="initial-scale=1, maximum-scale=1">
    <link rel="shortcut icon" href="/favicon.ico">
    <meta name="apple-mobile-web-app-capable" content="yes">
    <meta name="apple-mobile-web-app-status-bar-style" content="black">
    <link rel="stylesheet"
        href="//g.alicdn.com/msui/sm/0.6.2/css/sm.min.css">
    <link rel="stylesheet"
        href="//g.alicdn.com/msui/sm/0.6.2/css/sm-extend.min.css">
    <link rel="stylesheet" href="../resources/css/frontend/shoplist.css">
    </head>
    <body>
        <div class="page-group">
            <div class="page">
                <header class="bar bar-nav">
                    <a class="button button-link button-nav pull-left" external
                        href="index" data-transition='slide-out'> <span
                        class="icon icon-left"></span> 返回
                    </a>
                    <h1 class="title">商店列表</h1>
                </header>
                <div class="bar bar-header-secondary">
                    <div class="searchbar">
                        <a class="searchbar-cancel">取消</a>
                        <!-- 搜索栏 -->
                        <div class="search-input">
                            <label class="icon icon-search" for="search"></label> <input
                                type="search" id='search' placeholder='输入关键字...' />
                        </div>
                    </div>
                </div>
                <nav class="bar bar-tab">
                    <a class="tab-item" href="/o2o/frontend/index" external> <span
                        class="icon icon-home"></span> <span class="tab-label">首页</span>
                    </a> <a class="tab-item" href="#" id="me"> <span
                        class="icon icon-me"></span> <span class="tab-label"></span>
                    </a>
                </nav>
                <div class="content infinite-scroll infinite-scroll-bottom"
                    data-distance="100">
                    <!-- 类别列表展示区 -->
                    <div class="shoplist-button-div" id="shoplist-search-div">
                        <!-- <a href="#" class="button">所有货物</a>
                            <a href="#" class="button">吃的</a>
                            <a href="#" class="button">喝的</a>
                            <a href="#" class="button">Usual Button 1</a>
                            <a href="#" class="button">Usual Button 1</a>
                            <a href="#" class="button">Usual Button 1</a> -->
                    </div>
                    <div class="select-wrap">
                        <!-- 区域列表展示区 -->
                        <select class="select" id="area-search"></select>
                    </div>
                    <!-- 店铺列表在此添加 -->
                    <div class="list-div shop-list">
                        <!-- <div class="card">
                                <div class="card-header">传统火锅店</div>
                                <div class="card-content">
                                    <div class="list-block media-list">
                                        <ul>
                                            <li class="item-content">
                                                <div class="item-media">
                                                    <img src="http://gqianniu.alicdn.com/bao/uploaded/i4//tfscom/i3/TB10LfcHFXXXXXKXpXXXXXXXXXX_!!0-item_pic.jpg_250x250q60.jpg" width="44">
                                                </div>
                                                <div class="item-inner">
                                                    <div class="item-subtitle"></div>
                                                </div>
                                            </li>
                                        </ul>
                                    </div>
                                </div>
                                <div class="card-footer">
                                    <span>2015/01/15</span>
                                    <span>5 评论</span>
                                </div>
                            </div> -->
                    </div>
                    <div class="infinite-scroll-preloader">
                        <div class="preloader"></div>
                    </div>
                </div>
            </div>
        </div>
        <!--侧边栏  -->
        <div class="panel-overlay"></div>
        <div class="panel panel-right panel-reveal" id="panel-right-demo">
            <div class="content-block">
                <p>
                    <a href="/o2o/local/accountbind?usertype=1" class="close-panel">绑定帐号</a>
                </p>
                <p>
                    <a href="/o2o/local/changepsw?usertype=1" class="close-panel">修改密码</a>
                </p>
                <p>
                    <a href="/o2o/frontend/myrecord" class="close-panel">消费记录</a>
                </p>
                <p>
                    <a href="/o2o/frontend/mypoint" class="close-panel">我的积分</a>
                </p>
                <p>
                    <a href="/o2o/frontend/pointrecord" class="close-panel">兑换记录</a>
                </p>
                <p>
                    <a href="#" usertype="1" class="close-panel" id="log-out">登出系统</a>
                </p>
                <!-- Click on link with "close-panel" class will close panel -->
            </div>
        </div>
    
        <script type='text/javascript'
            src='//g.alicdn.com/sj/lib/zepto/zepto.min.js' charset='utf-8'></script>
        <script type='text/javascript'
            src='//g.alicdn.com/msui/sm/0.6.2/js/sm.min.js' charset='utf-8'></script>
        <script type='text/javascript'
            src='//g.alicdn.com/msui/sm/0.6.2/js/sm-extend.min.js' charset='utf-8'></script>
        <script type='text/javascript' src='../resources/js/common/common.js'
            charset='utf-8'></script>
        <script type='text/javascript'
            src='../resources/js/frontend/shoplist.js' charset='utf-8'></script>
        <script type='text/javascript' src='../resources/js/local/login.js'
            charset='utf-8'></script>
    </body>
    </html>

    Date.prototype.Format = function(fmt) {
        var o = {
            "M+" : this.getMonth() + 1, // 月份
            "d+" : this.getDate(), //
            "h+" : this.getHours(), // 小时
            "m+" : this.getMinutes(), //
            "s+" : this.getSeconds(), //
            "q+" : Math.floor((this.getMonth() + 3) / 3), // 季度
            "S" : this.getMilliseconds()
        // 毫秒
        };
        if (/(y+)/.test(fmt))
            fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "")
                    .substr(4 - RegExp.$1.length));
        for ( var k in o)
            if (new RegExp("(" + k + ")").test(fmt))
                fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k])
                        : (("00" + o[k]).substr(("" + o[k]).length)));
        return fmt;
    }
    /**
     * 
     */
    function changeVerifyCode(img) {
        img.src = "../Kaptcha?" + Math.floor(Math.random() * 100);
    }
    
    function getQueryString(name) {
        var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");
        var r = window.location.search.substr(1).match(reg);
        if (r != null) {
            return decodeURIComponent(r[2]);
        }
        return '';
    }

    .infinite-scroll-preloader {
        margin-top: -5px;
    }
    .shoplist-button-div {
        margin: 0 .3rem;
    }
    .shoplist-button-div > .button {
        width: 30%;
        height: 1.5rem;
        line-height: 1.5rem;
        display: inline-block;
        margin: 1%;
        overflow: hidden;
    }
    .select-wrap {
        margin: 0 .5rem;
    }
    .select {
        border: 1px solid #0894ec;
        color: #0894ec;
        background-color: #efeff4;
        width: 100%;
        height: 1.5rem;
        font-size: .7rem;
    }

    $(function() {
        var loading = false;
        // 分页允许返回的最大条数,超过此数则禁止访问后台
        var maxItems = 999;
        // 一页返回的最大条数
        var pageSize = 3;
        // 获取店铺列表的URL
        var listUrl = '/o2o/frontend/listshops';
        // 获取店铺类别列表以及区域列表的URL
        var searchDivUrl = '/o2o/frontend/listshopspageinfo';
        // 页码
        var pageNum = 1;
        // 从地址栏URL里尝试获取parent shop category id.
        var parentId = getQueryString('parentId');
        var areaId = '';
        var shopCategoryId = '';
        var shopName = '';
        // 渲染出店铺类别列表以及区域列表以供搜索
        getSearchDivData();
        // 预先加载10条店铺信息
        addItems(pageSize, pageNum);
        /**
         * 获取店铺类别列表以及区域列表信息
         * 
         * @returns
         */
        function getSearchDivData() {
            // 如果传入了parentId,则取出此一级类别下面的所有二级类别
            var url = searchDivUrl + '?' + 'parentId=' + parentId;
            $
                    .getJSON(
                            url,
                            function(data) {
                                if (data.success) {
                                    // 获取后台返回过来的店铺类别列表
                                    var shopCategoryList = data.shopCategoryList;
                                    var html = '';
                                    html += '<a href="#" class="button" data-category-id=""> 全部类别  </a>';
                                    // 遍历店铺类别列表,拼接出a标签集
                                    shopCategoryList
                                            .map(function(item, index) {
                                                html += '<a href="#" class="button" data-category-id='
                                                        + item.shopCategoryId
                                                        + '>'
                                                        + item.shopCategoryName
                                                        + '</a>';
                                            });
                                    // 将拼接好的类别标签嵌入前台的html组件里
                                    $('#shoplist-search-div').html(html);
                                    var selectOptions = '<option value="">全部街道</option>';
                                    // 获取后台返回过来的区域信息列表
                                    var areaList = data.areaList;
                                    // 遍历区域信息列表,拼接出option标签集
                                    areaList.map(function(item, index) {
                                        selectOptions += '<option value="'
                                                + item.areaId + '">'
                                                + item.areaName + '</option>';
                                    });
                                    // 将标签集添加进area列表里
                                    $('#area-search').html(selectOptions);
                                }
                            });
        }
    
        /**
         * 获取分页展示的店铺列表信息
         * 
         * @param pageSize
         * @param pageIndex
         * @returns
         */
        function addItems(pageSize, pageIndex) {
            // 拼接出查询的URL,赋空值默认就去掉这个条件的限制,有值就代表按这个条件去查询
            var url = listUrl + '?' + 'pageIndex=' + pageIndex + '&pageSize='
                    + pageSize + '&parentId=' + parentId + '&areaId=' + areaId
                    + '&shopCategoryId=' + shopCategoryId + '&shopName=' + shopName;
            // 设定加载符,若还在后台取数据则不能再次访问后台,避免多次重复加载
            loading = true;
            // 访问后台获取相应查询条件下的店铺列表
            $.getJSON(url, function(data) {
                if (data.success) {
                    // 获取当前查询条件下店铺的总数
                    maxItems = data.count;
                    var html = '';
                    // 遍历店铺列表,拼接出卡片集合
                    data.shopList.map(function(item, index) {
                        html += '' + '<div class="card" data-shop-id="'
                                + item.shopId + '">' + '<div class="card-header">'
                                + item.shopName + '</div>'
                                + '<div class="card-content">'
                                + '<div class="list-block media-list">' + '<ul>'
                                + '<li class="item-content">'
                                + '<div class="item-media">' + '<img src="'
                                + item.shopImg + '" width="44">' + '</div>'
                                + '<div class="item-inner">'
                                + '<div class="item-subtitle">' + item.shopDesc
                                + '</div>' + '</div>' + '</li>' + '</ul>'
                                + '</div>' + '</div>' + '<div class="card-footer">'
                                + '<p class="color-gray">'
                                + new Date(item.lastEditTime).Format("yyyy-MM-dd")
                                + '更新</p>' + '<span>点击查看</span>' + '</div>'
                                + '</div>';
                    });
                    // 将卡片集合添加到目标HTML组件里
                    $('.list-div').append(html);
                    // 获取目前为止已显示的卡片总数,包含之前已经加载的
                    var total = $('.list-div .card').length;
                    // 若总数达到跟按照此查询条件列出来的总数一致,则停止后台的加载
                    if (total >= maxItems) {
                        // 隐藏提示符
                        $('.infinite-scroll-preloader').hide();
                    } else {
                        $('.infinite-scroll-preloader').show();
                    }
                    // 否则页码加1,继续load出新的店铺
                    pageNum += 1;
                    // 加载结束,可以再次加载了
                    loading = false;
                    // 刷新页面,显示新加载的店铺
                    $.refreshScroller();
                }
            });
        }
    
        // 下滑屏幕自动进行分页搜索
        $(document).on('infinite', '.infinite-scroll-bottom', function() {
            if (loading)
                return;
            addItems(pageSize, pageNum);
        });
    
        // 点击店铺的卡片进入该店铺的详情页
        $('.shop-list').on('click', '.card', function(e) {
            var shopId = e.currentTarget.dataset.shopId;
            window.location.href = '/o2o/frontend/shopdetail?shopId=' + shopId;
        });
    
        // 选择新的店铺类别之后,重置页码,清空原先的店铺列表,按照新的类别去查询
        $('#shoplist-search-div').on(
                'click',
                '.button',
                function(e) {
                    if (parentId) {// 如果传递过来的是一个父类下的子类
                        shopCategoryId = e.target.dataset.categoryId;
                        // 若之前已选定了别的category,则移除其选定效果,改成选定新的
                        if ($(e.target).hasClass('button-fill')) {
                            $(e.target).removeClass('button-fill');
                            shopCategoryId = '';
                        } else {
                            $(e.target).addClass('button-fill').siblings()
                                    .removeClass('button-fill');
                        }
                        // 由于查询条件改变,清空店铺列表再进行查询
                        $('.list-div').empty();
                        // 重置页码
                        pageNum = 1;
                        addItems(pageSize, pageNum);
                    } else {// 如果传递过来的父类为空,则按照父类查询
                        parentId = e.target.dataset.categoryId;
                        if ($(e.target).hasClass('button-fill')) {
                            $(e.target).removeClass('button-fill');
                            parentId = '';
                        } else {
                            $(e.target).addClass('button-fill').siblings()
                                    .removeClass('button-fill');
                        }
                        // 由于查询条件改变,清空店铺列表再进行查询
                        $('.list-div').empty();
                        // 重置页码
                        pageNum = 1;
                        addItems(pageSize, pageNum);
                        parentId = '';
                    }
    
                });
    
        // 需要查询的店铺名字发生变化后,重置页码,清空原先的店铺列表,按照新的名字去查询
        $('#search').on('change', function(e) {
            shopName = e.target.value;
            $('.list-div').empty();
            pageNum = 1;
            addItems(pageSize, pageNum);
        });
    
        // 区域信息发生变化后,重置页码,清空原先的店铺列表,按照新的区域去查询
        $('#area-search').on('change', function() {
            areaId = $('#area-search').val();
            $('.list-div').empty();
            pageNum = 1;
            addItems(pageSize, pageNum);
        });
    
        // 点击后打开右侧栏
        $('#me').click(function() {
            $.openPanel('#panel-right-demo');
        });
    
        // 初始化页面
        $.init();
    });
  • 相关阅读:
    Solr与Lucene的区别
    查询如下课程平均成绩和及格率的百分数(用"1行"显示): 企业管理(001),马克思(002),OO&UML (003),数据库(004)
    按平均成绩从高到低显示所有学生的“数据库”、“企业管理”、“英语”三门的课程成绩,按如下形式显示: 学生ID,,数据库,企业管理,英语,有效课程数,有效平均分
    按各科平均成绩从低到高和及格率的百分数从高到低顺序
    设计模式
    查询各科成绩最高和最低的分:以如下形式显示:课程ID,最高分,最低分
    什么是Session共享?请举出使用场景
    vue中监听路由参数变化
    获取DOM元素到页面顶部的距离,亲测有效版本(转载)
    css页面滚动条出现时防止页面跳动的方法
  • 原文地址:https://www.cnblogs.com/XJJD/p/7703814.html
Copyright © 2011-2022 走看看