Przeglądaj źródła

Merge remote-tracking branch 'origin/developer' into developerB

zhengjinyi 3 lat temu
rodzic
commit
2f60147aec
28 zmienionych plików z 531 dodań i 256 usunięć
  1. 156 4
      src/main/java/com/caimei/www/controller/unlimited/ProductController.java
  2. 26 0
      src/main/java/com/caimei/www/service/page/ProductService.java
  3. 78 0
      src/main/java/com/caimei/www/service/page/impl/ProductServiceImpl.java
  4. 9 8
      src/main/resources/config/dev/application-dev.yml
  5. 23 14
      src/main/resources/static/css/activity/beautyTopic.css
  6. 12 0
      src/main/resources/static/css/activity/couponExp.css
  7. 4 4
      src/main/resources/static/css/article/article.css
  8. 4 3
      src/main/resources/static/css/base/base.pc.css
  9. 1 1
      src/main/resources/static/css/product/instruement-list.css
  10. BIN
      src/main/resources/static/img/activity/h5_entry.png
  11. BIN
      src/main/resources/static/img/activity/h5_entry_icon.png
  12. BIN
      src/main/resources/static/img/activity/pc_entry.png
  13. BIN
      src/main/resources/static/img/activity/pc_icon.png
  14. BIN
      src/main/resources/static/img/activity/pc_note.png
  15. BIN
      src/main/resources/static/img/base/icon-icp@2x.png
  16. 14 6
      src/main/resources/static/js/activity/beautyTopic.js
  17. 0 0
      src/main/resources/static/js/activity/beautyTopic/base.js
  18. 0 0
      src/main/resources/static/js/activity/beautyTopic/layout.js
  19. 0 0
      src/main/resources/static/js/activity/beautyTopic/mixin.js
  20. 0 0
      src/main/resources/static/js/activity/beautyTopic/swiper.min.js
  21. 0 0
      src/main/resources/static/js/activity/beautyTopic/utils.js
  22. 39 140
      src/main/resources/static/js/product/produce-list.js
  23. 35 24
      src/main/resources/templates/activity/beautyTopic.html
  24. 35 0
      src/main/resources/templates/activity/couponExp.html
  25. 15 6
      src/main/resources/templates/article/components/article-footer.html
  26. 11 3
      src/main/resources/templates/components/footer.html
  27. 15 15
      src/main/resources/templates/product/detail.html
  28. 54 28
      src/main/resources/templates/product/instruelist.html

+ 156 - 4
src/main/java/com/caimei/www/controller/unlimited/ProductController.java

@@ -1,6 +1,7 @@
 package com.caimei.www.controller.unlimited;
 
 import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
 import com.caimei.www.controller.BaseController;
 import com.caimei.www.pojo.page.ProductDetail;
 import com.caimei.www.service.page.ProductService;
@@ -10,8 +11,10 @@ import org.springframework.stereotype.Controller;
 import org.springframework.ui.Model;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PathVariable;
+import org.thymeleaf.util.StringUtils;
 
-import java.util.Map;
+import java.util.*;
+import java.util.concurrent.atomic.AtomicReference;
 
 /**
  * 商品(product)
@@ -31,6 +34,7 @@ public class ProductController extends BaseController {
     private static final String QUALITY_AUTHORRIZE_PATH = "product/qualityauthorize";
     private static final String ACTIVITY_TOP_PATH = "activity/activityTopic";
     private static final String CLOUD_BEAUTY_PATH = "activity/beautyTopic";
+    private static final String ACTIVITY_COUPON_EXP = "activity/couponExp";
     /** 优惠券活动商品列表 */
     private static final String PRODUCT_COUPON = "product/product-coupon";
     /**
@@ -61,7 +65,7 @@ public class ProductController extends BaseController {
     }
 
     /**
-     * 搜索结果 页面
+     * 优惠券活动商品列表
      */
     @GetMapping("/product/product-coupon.html")
     public String productCoupon() { return PRODUCT_COUPON; }
@@ -114,8 +118,149 @@ public class ProductController extends BaseController {
     /**
      * 商品分类列表页面
      */
-    @GetMapping("/product/classify{ids}.html")
-    public String instruelist(@PathVariable("ids") String ids) {
+    @GetMapping("/product/classify-{ids}.html")
+    public String instruelist(final Model model, @PathVariable("ids") String ids) {
+        String[] split = ids.split("-");
+        // 分类类型:1产品,2仪器,0全部
+        Integer typeSort =  split.length>=1 ? Integer.valueOf(split[0]) : 0;
+        model.addAttribute("typeSort", typeSort);
+        // 一级分类Id
+        Integer bigTypeId = split.length>=2 ? Integer.valueOf(split[1]) : 0;
+        model.addAttribute("bigTypeId", bigTypeId);
+        // 二级分类Id
+        Integer smallTypeId = split.length>=3 ? Integer.valueOf(split[2]) : 0;
+        model.addAttribute("smallTypeId", smallTypeId);
+        // 三级级分类Id
+        Integer tinyTypeId = split.length>=4 ? Integer.valueOf(split[3]) : 0;
+        model.addAttribute("tinyTypeId", tinyTypeId);
+        // 页码
+        Integer pageNum = split.length>=5 ? Integer.valueOf(split[4]) : 1;
+        // 每页数量
+        Integer pageSize = split.length>=6 ? Integer.valueOf(split[5]) : 24;
+        // 排序字段:价格price,销量sales,人气favorite
+        String sortField = split.length>=7 ? split[6] : "";
+        // 排序规则:1降序,其他升序
+        Integer sortType = split.length>=8 ? Integer.valueOf(split[7]) : 1;
+        /*
+         * 获取一级分类
+         */
+        JSONArray bigTypeArr = productService.getBigTypeJson(typeSort);
+        model.addAttribute("bigTypeJson", bigTypeArr);
+        AtomicReference<String> bigTypeName = new AtomicReference<>("");
+        bigTypeArr.forEach(temp -> {
+            JSONObject bigType = (JSONObject) temp;
+            if (null != bigType && bigTypeId.equals(bigType.getInteger("bigTypeId"))) {
+                bigTypeName.set(bigType.getString("name"));
+            }
+        });
+        model.addAttribute("bigTypeName", bigTypeName.get());
+        /*
+         * 获取二级分类
+         */
+        JSONArray smallTypeArr = productService.getSmallTypeJson(bigTypeId);
+        model.addAttribute("smallTypeJson", smallTypeArr);
+        AtomicReference<String> smallTypeName = new AtomicReference<>("");
+        smallTypeArr.forEach(temp -> {
+            JSONObject smallType = (JSONObject) temp;
+            if (null != smallType && smallTypeId.equals(smallType.getInteger("smallTypeId"))) {
+                smallTypeName.set(smallType.getString("name"));
+            }
+        });
+        model.addAttribute("smallTypeName", smallTypeName.get());
+        /*
+         * 获取三级分类
+         */
+        JSONArray tinyTypeArr = productService.getTinyTypeJson(smallTypeId);
+        model.addAttribute("tinyTypeJson", tinyTypeArr);
+        AtomicReference<String> tinyTypeName = new AtomicReference<>("");
+        tinyTypeArr.forEach(temp -> {
+            JSONObject tinyType = (JSONObject) temp;
+            if (null != tinyType && tinyTypeId.equals(tinyType.getInteger("tinyTypeId"))) {
+                tinyTypeName.set(tinyType.getString("name"));
+            }
+        });
+        model.addAttribute("tinyTypeName", tinyTypeName.get());
+        /*
+         * 获取商品信息
+         */
+        StringBuilder productParams = new StringBuilder();
+        if (tinyTypeId > 0) {
+            productParams.append("?id=").append(tinyTypeId).append("&idType=3");
+        } else if (smallTypeId > 0) {
+            productParams.append("?id=").append(smallTypeId).append("&idType=2");
+        } else {
+            productParams.append("?id=").append(bigTypeId).append("&idType=1");
+        }
+        productParams.append("&pageNum=").append(pageNum).append("&pageSize=").append(pageSize).append("&sortField=").append(sortField).append("&sortType=").append(sortType);
+        JSONObject productObj = productService.getProductListJson(productParams.toString());
+        Integer totalCount = productObj.getInteger("total");
+        JSONArray productList = (JSONArray) productObj.get("items");
+        model.addAttribute("productCount", totalCount);
+        model.addAttribute("productListJson", productList);
+
+        int totalPage = (int) Math.ceil((double) totalCount/pageSize);
+        totalPage = totalPage > 0 ? totalPage : 1;
+        int[] arr = null;
+        if (totalPage <= 6) {
+            int[] tmp = new int[]{1, 2, 3, 4, 5, 6};
+            arr = Arrays.copyOf(tmp, totalPage);
+        }else if (pageNum <= 3) {
+            arr = new int[]{1, 2, 3, 4, 5, 0, totalPage};
+        }else if (pageNum >= totalPage - 2) {
+            arr = new int[]{1, 0, totalPage - 4, totalPage - 3, totalPage - 2, totalPage - 1, totalPage};
+        }else{
+            arr = new int[]{1, 0, pageNum - 2, pageNum - 1, pageNum, pageNum + 1, pageNum + 2, 0, totalPage};
+        }
+
+        List<Map<String,Object>> arrPath = new ArrayList<>();
+
+        final String basePath = "/product/classify-" + typeSort + "-" + bigTypeId + "-" + smallTypeId + "-" + tinyTypeId;
+        if (pageNum > 1) {
+            StringBuilder prevPath = new StringBuilder(basePath);
+            prevPath.append("-").append(pageNum-1).append("-").append(pageSize);
+            if (!StringUtils.isEmpty(sortField)) {
+                prevPath.append("-").append(sortField).append("-").append(sortType).append(".html");
+            } else {
+                prevPath.append(".html");
+            }
+            Map<String,Object> tempPath = new HashMap<>();
+            tempPath.put("btn", -1);
+            tempPath.put("path", prevPath);
+            arrPath.add(tempPath);
+        }
+        for (int j : arr) {
+            Map<String,Object> tempPath = new HashMap<>();
+            tempPath.put("btn", j);
+            if (j > 0) {
+                StringBuilder btnPath = new StringBuilder(basePath);
+                btnPath.append("-").append(j).append("-").append(pageSize);
+                if (!StringUtils.isEmpty(sortField)) {
+                    btnPath.append("-").append(sortField).append("-").append(sortType).append(".html");
+                } else {
+                    btnPath.append(".html");
+                }
+                tempPath.put("path", btnPath);
+            } else {
+                tempPath.put("path", "");
+            }
+            arrPath.add(tempPath);
+        }
+        if (pageNum < totalPage) {
+            StringBuilder nextPath = new StringBuilder(basePath);
+            nextPath.append("-").append(pageNum+1).append("-").append(pageSize);
+            if (!StringUtils.isEmpty(sortField)) {
+                nextPath.append("-").append(sortField).append("-").append(sortType).append(".html");
+            } else {
+                nextPath.append(".html");
+            }
+            Map<String,Object> tempPath = new HashMap<>();
+            tempPath.put("btn", -2);
+            tempPath.put("path", nextPath);
+            arrPath.add(tempPath);
+        }
+        model.addAttribute("pageBtnNum", pageNum);
+        model.addAttribute("pageBtnList", arrPath);
+
         return INSTRUMENT_LIST_PATH;
     }
 
@@ -173,4 +318,11 @@ public class ProductController extends BaseController {
         return CLOUD_BEAUTY_PATH;
     }
 
+    /**
+     * 优惠券说明页
+     */
+    @GetMapping("/product/couponExp.html")
+    public String getCouponExpPath(){
+        return ACTIVITY_COUPON_EXP;
+    }
 }

+ 26 - 0
src/main/java/com/caimei/www/service/page/ProductService.java

@@ -1,6 +1,7 @@
 package com.caimei.www.service.page;
 
 import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
 import com.caimei.www.pojo.page.ProductDetail;
 
 import java.util.Map;
@@ -31,4 +32,29 @@ public interface ProductService {
      * @param pageId
      */
     Map<String, Object> getTypeFloorJson(Integer pageId);
+
+    /**
+     * 一级分类下拉
+     * @param typeSort
+     */
+    JSONArray getBigTypeJson(Integer typeSort);
+
+    /**
+     * 二级分类下拉
+     * @param bigTypeId
+     */
+    JSONArray getSmallTypeJson(Integer bigTypeId);
+
+    /**
+     * 获取三级分类
+     * @param smallTypeId
+     * @return
+     */
+    JSONArray getTinyTypeJson(Integer smallTypeId);
+
+    /**
+     * 获取分类列表商品信息
+     * @param params
+     */
+    JSONObject getProductListJson(String params);
 }

+ 78 - 0
src/main/java/com/caimei/www/service/page/impl/ProductServiceImpl.java

@@ -92,4 +92,82 @@ public class ProductServiceImpl implements ProductService {
         }
     }
 
+    /**
+     * 一级分类下拉
+     *
+     * @param typeSort
+     */
+    @Override
+    public JSONArray getBigTypeJson(Integer typeSort) {
+        String dataUrl = coreServer+"/commodity/type/first?typeSort="+typeSort;
+        try {
+            String classifyResult = RequestUtil.sendGet(dataUrl);
+            log.debug(classifyResult);
+            Map<String, Object> classifyMap = JSONObject.parseObject(classifyResult, Map.class);
+            return (JSONArray) classifyMap.get("data");
+        } catch (Exception e) {
+            log.error("try-catch:",e);
+            return null;
+        }
+    }
+
+    /**
+     * 二级分类下拉
+     *
+     * @param bigTypeId
+     */
+    @Override
+    public JSONArray getSmallTypeJson(Integer bigTypeId) {
+        String dataUrl = coreServer+"/commodity/type/second?bigTypeId="+bigTypeId;
+        try {
+            String classifyResult = RequestUtil.sendGet(dataUrl);
+            log.debug(classifyResult);
+            Map<String, Object> classifyMap = JSONObject.parseObject(classifyResult, Map.class);
+            return (JSONArray) classifyMap.get("data");
+        } catch (Exception e) {
+            log.error("try-catch:",e);
+            return null;
+        }
+    }
+
+    /**
+     * 获取三级分类
+     *
+     * @param smallTypeId
+     * @return
+     */
+    @Override
+    public JSONArray getTinyTypeJson(Integer smallTypeId) {
+        String dataUrl = coreServer+"/commodity/type/third?smallTypeId="+smallTypeId;
+        try {
+            String classifyResult = RequestUtil.sendGet(dataUrl);
+            log.debug(classifyResult);
+            Map<String, Object> classifyMap = JSONObject.parseObject(classifyResult, Map.class);
+            return (JSONArray) classifyMap.get("data");
+        } catch (Exception e) {
+            log.error("try-catch:",e);
+            return null;
+        }
+    }
+
+    /**
+     * 获取分类列表商品信息
+     *
+     * @param params
+     */
+    @Override
+    public JSONObject getProductListJson(String params) {
+        String dataUrl = coreServer+"/commodity/search/query/product/type"+params;
+        try {
+            String productResult = RequestUtil.sendGet(dataUrl);
+            log.debug(productResult);
+            Map<String, Object> productMap = JSONObject.parseObject(productResult, Map.class);
+            String data = (String) productMap.get("data");
+            return JSONObject.parseObject(data);
+        } catch (Exception e) {
+            log.error("try-catch:",e);
+            return null;
+        }
+    }
+
 }

+ 9 - 8
src/main/resources/config/dev/application-dev.yml

@@ -3,14 +3,15 @@ spring:
     cache: false  #是否使用缓存
   #数据源连接--start
   datasource:
+    #本地连接数据库
     #driverClassName: com.mysql.jdbc.Driver
-    url: jdbc:mysql://192.168.2.100:3306/caimei?characterEncoding=UTF8&serverTimezone=Asia/Shanghai
+    #url: jdbc:mysql://192.168.2.100:3306/caimei?characterEncoding=UTF8&serverTimezone=Asia/Shanghai
+    #username: developer
+    #password: 05bZ/OxTB:X+yd%1
+    #测试连接数据库
+    url: jdbc:mysql://120.79.25.27:3306/caimei?characterEncoding=UTF8&serverTimezone=Asia/Shanghai
     username: developer
-    password: 05bZ/OxTB:X+yd%1
-#    url: jdbc:mysql://119.29.0.46:3306/caimei?characterEncoding=UTF8&serverTimezone=Asia/Shanghai
-#    username: general
-#    password: 6#xsI%b4o@5c3RoE
-    # Hikari will use the above plus the following to setup connection pooling
+    password: J5p3tgOVazNl4ydf
     type: com.zaxxer.hikari.HikariDataSource
     hikari:
       minimum-idle: 5
@@ -54,9 +55,9 @@ logging:
 caimei:
   siteEnv: 0 #网站环境,(2:正式环境,1:测试环境,0:开发环境)
   spiServer: https://spi-b.caimei365.com
-#  spiServer: http://192.168.2.67:8008
+#  spiServer: http://192.168.2.68:8008
   coreServer: https://core-b.caimei365.com
-#  coreServer: http://192.168.2.67:18002
+#  coreServer: http://192.168.2.68:18002
   imageDomain: https://img-b.caimei365.com
   wwwDomain: http:localhost:8009
   destPath: D:/_PLAN_WORKSPACE/test/static

+ 23 - 14
src/main/resources/static/css/activity/beautyTopic.css

@@ -28,6 +28,7 @@ a{color:#333;text-decoration:none}
 .cm-img-responsive{max-width:100%;height:auto;display:block}
 .cm-container{width:100%;margin:0 auto}
 [class*='cm-col-']{float:left;-webkit-box-sizing:border-box;box-sizing:border-box}
+.cm-floor .swiper-slide{ height: auto;}
 @media (max-width:560px){.cm-col-xs-1{width:1.66667%}
 .cm-col-xs-2{width:3.33333%}
 .cm-col-xs-3{width:5%}
@@ -296,7 +297,7 @@ a{color:#333;text-decoration:none}
 .p-icon.i4::before{background-position-y:-804px}
 .p-icon.i5::before{background-position-y:-834px}
 .cm-container{padding-left:1vw;padding-right:1vw;-webkit-box-sizing:border-box;box-sizing:border-box}
-.cm-floor{padding:3.2vw 0}
+.cm-floor{padding:2.2vw 0}
 .cm-p-a{padding:1vw}
 .cm-m-a{padding:1vw}
 .cm-floor-title .cm-title{font-size:5vw;color:#4a4f58;font-weight:700;line-height:7.5vw;padding-top:1vw;padding-bottom:1vw}
@@ -304,7 +305,7 @@ a{color:#333;text-decoration:none}
 .cm-article-item{overflow:hidden;-webkit-box-sizing:border-box;box-sizing:border-box}
 .cm-article-item .cm-article-title{font-size:3.5vw;color:#4a4f58;-webkit-transition:all 0.4s;-o-transition:all 0.4s;transition:all 0.4s}
 .cm-article-item .cm-article-title.has-border{border-left:2px solid #fff}
-.cm-article-item .cm-article-desc{font-size:2.5vw;color:#93979f;line-height:2em;text-align:justify}
+.cm-article-item .cm-article-desc{font-size:2.5vw;color:#93979f;line-height:2em;text-align:justify;word-break: break-all;}
 .cm-article-item .cm-article-desc.h56{height:10.5vw}
 .cm-article-item .cm-article-cover.cover-168-168{width:27vw;height:27vw}
 .cm-article-item.h200{height:33vw}
@@ -334,31 +335,35 @@ a{color:#333;text-decoration:none}
 .cm-float-container .cm-slide .cm-toggle-btn{top:0;right:0;position:absolute;width:100%;height:100%}
 .cm-float-container .cm-slide:hover .cm-tooltop{display:block}
 .cm-float-container .cm-slide:hover .cm-toggle-btn{width:150%}
-.cm-float-container .cm-slide:nth-child(1){height:13.2vw;background:url(https://static.caimei365.com/app/img/icon2/pc_note.png) no-repeat center;background-size:12vw}
+.cm-float-container .cm-slide:nth-child(1){height:13.2vw;background:url(/img/activity/h5_entry_icon.png) no-repeat center;background-size:12vw}
 .cm-float-container .cm-slide:nth-child(2){background:#fff url(/img/activity/pc_01.png) no-repeat center}
 .cm-float-container .cm-slide:nth-child(2):hover{background:#ff5c00 url(/img/activity/pc_a1.png) no-repeat center}
 .cm-float-container .cm-slide:nth-child(3){background:#fff url(/img/activity/pc_02.png) no-repeat center}
 .cm-float-container .cm-slide:nth-child(3):hover{background:#ff5c00 url(/img/activity/pc_a2.png) no-repeat center}
 .cm-float-container .cm-tooltop{position:absolute;padding:3.5vw;background:#ff5c00;top:0;right:16vw;border-radius:6px;display:none}
 .cm-float-container .cm-tooltop::after{position:absolute;content:'';width:15px;height:15px;-webkit-transform:rotateZ(45deg);-ms-transform:rotate(45deg);transform:rotateZ(45deg);background:#ff5c00;right:-7px;top:15px}
-.cm-float-container .cm-tooltop .cm-tooltop-content{font-size:2.2vw;color:#fff}
+.cm-float-container .cm-tooltop .cm-tooltop-content{font-size:3.2vw;color:#fff}
 .cm-float-container .cm-tooltop .cm-tooltop-content.cm-tooltop-1{width:51.6vw}
 .cm-float-container .cm-tooltop .cm-tooltop-content.cm-tooltop-1 i{display:block;border-top:1px solid #f1f1f1}
 .cm-float-container .cm-tooltop .cm-tooltop-content.cm-tooltop-1 .cm-item{padding:2.5vw 0}
-.cm-float-container .cm-tooltop .cm-tooltop-content.cm-tooltop-2{text-align:center;width:40.8vw}
+.cm-float-container .cm-tooltop .cm-tooltop-content.cm-tooltop-2{text-align:center;width:44.8vw;}
 .cm-float-container .cm-tooltop .cm-tooltop-content.cm-tooltop-2 .line{height:11vw;margin:3vw 3vw 0;width:1px;background:#f1f1f1}
 .cm-float-container .cm-tooltop .cm-tooltop-content.cm-tooltop-2 img{display:inline-block;width:16.4vw;height:16.4vw}
 .cm-float-container .cm-tooltop .cm-tooltop-content.cm-tooltop-2 span{text-align:center;display:block;margin-top:2vw}
+.cm-float-container .cm-mobile-tooltop .cm-tooltop-content .cm-item{ font-size: 1.8vw; }
 .cm-entry{z-index:9999;position:fixed;top:0;width:100vw;height:100vh;background:rgba(0,0,0,0.5)}
 .cm-entry .cm-icon-content{position:absolute;width:75.1vw;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}
 .cm-entry .cm-icon-content img{width:100%}
-.cm-entry .cm-icon-content .cm-close{cursor:pointer;position:absolute;width:6.45vw;height:6.45vw;right:5vw;top:-5vw;background:url(/img/activity/pc_close.png) no-repeat center center;background-size:6.4vw}
+.cm-entry .cm-icon-content .cm-close{cursor:pointer;position:absolute;width:6.45vw;height:6.45vw;right:5vw;top:-8vw;background:url(/img/activity/pc_close.png) no-repeat center center;background-size:6.4vw}
+.cm-entry .cm-icon-content .btn{display: block;width: 10vw;height: 10vw;background: #666;position: absolute;right: 8vw;z-index: 999;cursor: pointer;opacity: 0;}
+.cm-entry .cm-icon-content .btn1{top: 24vw;}
+.cm-entry .cm-icon-content .btn2{top: 47.5vw;}
 .cm-footer{padding:4vw 0 2vw;background-color:#4a4f58;text-align:center;color:#fff;font-size:2.4vw;overflow:hidden}
 .cm-footer img{width:12vw}
-.banner-container{position:relative;width:100vw;height:45vw;background:pink;overflow:hidden}
+.banner-container{position:relative;width:100vw;height:45vw;overflow:hidden}
 .banner-container .banner{width:100vw;position:absolute;height:100%;top:0;left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}
 .banner-container .cm-container{height:100%;padding: 0;}
-.banner-container img{display:block;height:100%}
+.banner-container img{display:block;height:100%;width: 100%;}
 .has-player{position:absolute;top:0;left:0;width:100%;height:100%;}
 .has-player::before{content:'';display:block;position:absolute;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%);width:6vw;height:6vw; background:url(/img/activity/pc-palyer.png) no-repeat center center;background-size: 6vw;}
 .cm-to-top{width:12vw;height:12vw;position:fixed;z-index:999;bottom:5%;right:15px;border-radius:6px;text-align:center;background:#fff;cursor:pointer;-webkit-transition:all 0.2s;-o-transition:all 0.2s;transition:all 0.2s}
@@ -636,7 +641,7 @@ a{color:#333;text-decoration:none}
 .p-icon.i5::before{background-position-y:-834px}
 .cm-container{width:960px;padding-left:8px;padding-right:8px}
 .cm-container .cm-row{margin-left:-8px;margin-right:-8px}
-.cm-floor{padding:20px 0}
+.cm-floor{padding:10px 0}
 .cm-p-a{padding:8px}
 .cm-m-a{padding:8px}
 .cm-floor-title .cm-title{font-size:24px;color:#4a4f58;line-height:30px;font-weight:700;padding-top:4px;padding-bottom:4px}
@@ -644,7 +649,7 @@ a{color:#333;text-decoration:none}
 .cm-article-item{-webkit-box-sizing:border-box;box-sizing:border-box;overflow:hidden}
 .cm-article-item .cm-article-title{font-size:18px;color:#4a4f58;-webkit-transition:all 0.4s;-o-transition:all 0.4s;transition:all 0.4s}
 .cm-article-item .cm-article-title.has-border{border-left:2px solid #fff}
-.cm-article-item .cm-article-desc{font-size:14px;color:#93979f;line-height:2em;text-align:justify}
+.cm-article-item .cm-article-desc{font-size:14px;color:#93979f;line-height:2em;text-align:justify;word-break: break-all;}
 .cm-article-item .cm-article-desc.h56{height:56px}
 .cm-article-item .cm-article-cover.cover-168-168{width:168px;height:168px}
 .cm-article-item:hover .cm-article-title{color:#ff5c00}
@@ -677,12 +682,12 @@ a{color:#333;text-decoration:none}
 .cm-float-container .cm-slide .cm-toggle-btn{top:0;right:0;position:absolute;width:100%;height:100%}
 .cm-float-container .cm-slide:hover .cm-tooltop{display:block}
 .cm-float-container .cm-slide:hover .cm-toggle-btn{width:150%}
-.cm-float-container .cm-slide:nth-child(1){height:70px;background:url(https://static.caimei365.com/app/img/icon2/pc_note.png) no-repeat center;background-size:64px}
+.cm-float-container .cm-slide:nth-child(1){height:70px;background:url(/img/activity/h5_entry_icon.png) no-repeat center;background-size:64px}
 .cm-float-container .cm-slide:nth-child(2){background:#fff url(/img/activity/pc_01.png) no-repeat center}
 .cm-float-container .cm-slide:nth-child(2):hover{background:#ff5c00 url(/img/activity/pc_a1.png) no-repeat center}
 .cm-float-container .cm-slide:nth-child(3){background:#fff url(/img/activity/pc_02.png) no-repeat center}
 .cm-float-container .cm-slide:nth-child(3):hover{background:#ff5c00 url(/img/activity/pc_a2.png) no-repeat center}
-.cm-float-container .cm-tooltop{position:absolute;padding:15px;background:#ff5c00;top:0;right:80px;border-radius:6px;display:none}
+.cm-float-container .cm-tooltop{position:absolute;padding:15px;background:#ff5c00;top:0;right:80px;border-radius:6px;display: none}
 .cm-float-container .cm-tooltop::after{position:absolute;content:'';width:15px;height:15px;-webkit-transform:rotateZ(45deg);-ms-transform:rotate(45deg);transform:rotateZ(45deg);background:#ff5c00;right:-7px;top:15px}
 .cm-float-container .cm-tooltop .cm-tooltop-content{font-size:14px;color:#fff}
 .cm-float-container .cm-tooltop .cm-tooltop-content.cm-tooltop-1{width:190px}
@@ -694,8 +699,12 @@ a{color:#333;text-decoration:none}
 .cm-float-container .cm-tooltop .cm-tooltop-content.cm-tooltop-2 span{text-align:center;display:block;margin-top:8px}
 .cm-footer{padding:25px 0 12px;background-color:#4a4f58;text-align:center;color:#fff;font-size:12px;overflow:hidden}
 .cm-entry{z-index:9999;position:fixed;top:0;width:100vw;height:100vh;background:rgba(0,0,0,0.3)}
-.cm-entry .cm-icon-content{position:absolute;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}
-.cm-entry .cm-icon-content .cm-close{cursor:pointer;position:absolute;width:32px;height:32px;right:20px;top:-20px;background:url(/img/activity/pc_close.png) no-repeat center center}
+.cm-entry .cm-icon-content{width: 400px;position:absolute;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}
+.cm-entry .cm-icon-content img{display: block; width: 100%;}
+.cm-entry .cm-icon-content .cm-close{cursor:pointer;position:absolute;width:32px;height:32px;right:20px;top:-40px;background:url(/img/activity/pc_close.png) no-repeat center center}
+.cm-entry .cm-icon-content .btn{display: block;width: 60px;height: 60px;background: #666;position: absolute;right: 40px;z-index: 999;cursor: pointer;opacity: 0;}
+.cm-entry .cm-icon-content .btn1{top: 122px;}
+.cm-entry .cm-icon-content .btn2{top: 250px;}
 .banner-container{position:relative;height:480px;background:pink;overflow:hidden}
 .banner-container .banner{position:absolute;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}
 .banner-container .cm-container{height:100%}

+ 12 - 0
src/main/resources/static/css/activity/couponExp.css

@@ -0,0 +1,12 @@
+body{background-color:f5f5f5}
+.banner-container{position:relative;width:100%;height:480px;overflow:hidden}
+.banner-container .cm-container{position:absolute;width:1920px;height:480px;left:50%;top:0;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}
+.cm-content{width:1200px;margin:0 auto 80px;background:#fff}
+.cm-content img{width:100%}
+.cm-footer{background:#4a4f58;padding:28px;text-align:center;color:#fff;font-size:14px}
+.cm-content-h5{display:none}
+.cm-content-h5 img{display:block;width:100%}
+@media (max-width:1200px){.cm-content{width:850px !important}
+}@media (max-width:760px){.cm-content-h5{display:block}
+.banner-container,.cm-content{display:none !important}
+}

+ 4 - 4
src/main/resources/static/css/article/article.css

@@ -81,10 +81,10 @@ dl,dd,dt{zoom:1}
 	.search .keyword:-ms-input-placeholder{color:#fff}
 	.content.sea-top{margin-top:110px}
 	.foot{width:100%;height:130px;background:#262626;margin-top:100px}
-	.footer{width:1190px;margin:0 auto;text-align:center}
-	.footer .logo{display:inline-table;width:155px;height:80px;padding:25px 0}
-	.footer .logo img{width:92px;height:80px;vertical-align:middle}
-	.footer .dizhi{display:inline-table;color:#ccc;font-size:14px;line-height:26.28px;vertical-align:super}
+	.footer{width:1190px;margin:0 auto;text-align:center;height: 130px;box-sizing: border-box;padding: 39px 0;}
+	.footer p{line-height: 30px;color: #FFFFFF;}
+	.footer p span{margin:0 5px}
+	.footer p span img.icp{width: 18px;height: 18px;display: inline-block;}
 	.bar{width:1190px;margin:0 auto;padding-top:90px;padding-bottom:15px}
 	.bar a{color:#777;font-size:14px}
 	.classify.biaoqian{border-bottom:solid 1px #ededed}

+ 4 - 3
src/main/resources/static/css/base/base.pc.css

@@ -240,10 +240,11 @@ iframe{width:320px !important;height: 280px !important}
 .footContact .cellNumber{height:60px;line-height:60px;font-size:12px;color:#FFF;white-space:nowrap}
 .footContact .cellNumber span {margin: 0 12px;}
 .footContact .cellNumber a{color:#FFF;}
-.copyright{text-align:left;color:#FFF;font-size:12px;padding: 26px 0;}
-.copyright .item{white-space:nowrap;padding-left:35px;position:relative;float:left;margin-left:50%;transform:translateX(-50%)}
-.copyright .item:before{position:absolute;left:0;width:32px;height:32px;background-position:0 -140px}
+.copyright{text-align:center;color:#FFF;font-size:12px;padding: 26px 0;}
+.copyright .item{white-space:nowrap;position:relative;}
+.copyright .item p{line-height: 30px;}
 .copyright p span{margin:0 5px}
+.copyright p span img.icp{width: 18px;height: 18px;display: inline-block;}
 .copyright p:nth-of-type(2) span:first-child{margin-right:10px}
 @keyframes showAmnation {0% {top:-150px;display:none;}100% {top:-135px;display: block;} }
 /*商品Item*/

+ 1 - 1
src/main/resources/static/css/product/instruement-list.css

@@ -42,7 +42,7 @@
         border-left: 1px solid #f7f7f7;
         font-size: 0;
     }
-    .classification .class-nav-main div.on{
+    .classification .class-nav-main div.on, .classification .class-nav-main div.on a{
         color: #e15616;
     }
     .crumbs-nav >div{display: inline-block}

BIN
src/main/resources/static/img/activity/h5_entry.png


BIN
src/main/resources/static/img/activity/h5_entry_icon.png


BIN
src/main/resources/static/img/activity/pc_entry.png


BIN
src/main/resources/static/img/activity/pc_icon.png


BIN
src/main/resources/static/img/activity/pc_note.png


BIN
src/main/resources/static/img/base/icon-icp@2x.png


+ 14 - 6
src/main/resources/static/js/activity/index.js → src/main/resources/static/js/activity/beautyTopic.js

@@ -5,9 +5,12 @@ var activeApp = (function () {
         mixins: [swiperMixin, showMoreMixin],
         data: {
             isMobile: window.innerWidth < 992,
+            showCouponEntry: false,
             isActive: true,
             isRequest: true,
             isLoading: true,
+            showPhoneNum: false,
+            showWechat: false,
             // showScrollTop: false,
             activityEntryVisiable: false,
             contactVisiable: false,
@@ -141,8 +144,8 @@ var activeApp = (function () {
             // 初始化红包入口状态
             initActivityEntry: function initActivityEntry(begin, end) {
                 const nowTime = new Date().getTime();
-                const beginTime = new Date(begin).getTime();
-                const endTime = new Date(end).getTime();
+                const beginTime = new Date(begin.replace(/-/g, '/')).getTime();
+                const endTime = new Date(end.replace(/-/g, '/')).getTime();
                 return nowTime >= beginTime && nowTime <= endTime
             }
             ,
@@ -153,18 +156,18 @@ var activeApp = (function () {
 
             // 获取直播状态
             makeVideoStatus: function makeVideoStatus(floorData, index) {
-                var displayDate = new Date(floorData.floorContent['displayDate' + index]).getTime();
+                var displayDate = new Date(floorData.floorContent['displayDate' + index].replace(/-/g, '/')).getTime();
                 var nowDate = new Date().getTime();
                 // 一天的时间戳
                 var oneDay = 60 * 60 * 24 * 1000;
                 // 直播开始时间:displayDate
                 // 直播结束时间:displayDate + oneDay
-                if (nowDate >= displayDate && nowDate <= displayDate + oneDay) {
-                    return 1; // 已开始
-                }
                 if (nowDate < displayDate) {
                     return 0; // 未开始
                 }
+                if (nowDate >= displayDate && nowDate <= displayDate + oneDay) {
+                    return 1; // 已开始
+                }
                 if (nowDate - oneDay > displayDate) {
                     return 2; // 已结束
                 }
@@ -263,6 +266,11 @@ var activeApp = (function () {
                 console.log('窗口resize事件注册完毕...');
             }
             ,
+            // 优惠券入口
+            handleToggleCoupon: function handleToggleCoupon(flag){
+                this.showCouponEntry = flag;
+                this.isActive = false;
+            },
             //    初始化用户信息
             initUserInfo: function initUserInfo() {
                 var userInfo = localStorage.getItem('userInfo');

+ 0 - 0
src/main/resources/static/js/activity/base.js → src/main/resources/static/js/activity/beautyTopic/base.js


+ 0 - 0
src/main/resources/static/js/activity/layout.js → src/main/resources/static/js/activity/beautyTopic/layout.js


+ 0 - 0
src/main/resources/static/js/activity/mixin.js → src/main/resources/static/js/activity/beautyTopic/mixin.js


+ 0 - 0
src/main/resources/static/js/activity/swiper.min.js → src/main/resources/static/js/activity/beautyTopic/swiper.min.js


+ 0 - 0
src/main/resources/static/js/activity/utils.js → src/main/resources/static/js/activity/beautyTopic/utils.js


+ 39 - 140
src/main/resources/static/js/product/produce-list.js

@@ -2,20 +2,14 @@ var productList = new Vue({
     el:'#productList',
     data:{
         userId:0,
-        searchFlag: false,
         listLoading: true,
         requestFlag: true,
         noMore: false,
-        classify:[],
-        smalltypeList:[],//二级分类
-        tinytypeList:[],//三级分类
         listData:[],
-        bigName:'',
-        smallName:'',
-        tinyName:'',
-        bigTypeId:'',
-        smallTypeId:'',//二级分类id
-        tinyTypeId:'',//三级分类id
+        typeSort:0,
+        bigTypeId:0,
+        smallTypeId:0,//二级分类id
+        tinyTypeId:0,//三级分类id
         listRecord: 0,
         pageInput: '1',
         source:'www',
@@ -40,32 +34,8 @@ var productList = new Vue({
             var total = Math.ceil(this.listRecord / this.params.pageSize);
             return total > 0 ? total : 1;
         },
-        showPageBtn: function () {
-            var total = Math.ceil(this.listRecord / this.params.pageSize);
-            total = total > 0 ? total : 1;
-            var index = this.params.pageNum, arr = [];
-            if (total <= 6) {
-                for (var i = 1; i <= total; i++) {
-                    arr.push(i);
-                }
-                return arr;
-            }
-            if (index <= 3) return [1, 2, 3, 4, 5, 0, total];
-            if (index >= total - 2) return [1, 0, total - 4, total - 3, total - 2, total - 1, total];
-            return [1, 0, index - 2, index - 1, index, index + 1, index + 2, 0, total];
-        }
     },
     methods:{
-        getclassify:function(){
-            var _self = this;
-            ProductApi.GetbigTypeclassify({ typeId:_self.bigTypeId, idType:1, source:_self.source },function (res) {
-                if(res.code==0){
-                    _self.smalltypeList = res.data.smallTypeList;
-                }else {
-               CAIMEI.Alert(res.msg,'确定',false)
-                }
-            })
-        },
        getproductList:function(){//商品列表
            var _self=this;
            ProductApi.GetSearchProduct(_self.params,function (res) {
@@ -101,35 +71,22 @@ var productList = new Vue({
         },
         toPagination: function (pageNum) {
             if (pageNum <= this.pageTotal) {
-                this.params.pageNum = pageNum;
-                this.listData=[];
-                this.getproductList();
+                this.params.pageNum = pageNum*1;
+                var url = '/product/classify-'+this.typeSort+'-'+this.bigTypeId+'-'+this.smallTypeId+'-'+this.tinyTypeId+'-'+this.params.pageNum+'-'+this.params.pageSize;
+                if (this.params.sortField) {
+                    url += '-'+this.params.sortField+'-'+this.params.sortType+'.html';
+                } else {
+                    url += '.html';
+                }
+                window.location.href = url;
             }
         },
         toSortList: function (sortField, sortType) {
-             this.params.sortField= sortField;
-             this.params.sortType = sortType;
-             this.params.pageNum = 1;
-             this.listData=[];
-             this.getproductList();
-        },
-        removeNama:function(index){//删除三级分类+
-            this.params.idType = index;
-            switch (index) {
-                case 1:
-                    this.smallName = '';
-                    this.params.id = this.bigTypeId;
-                    this.smallTypeId='';
-                    this.getproductList();
-                    break;
-                case 2:
-                    this.tinyName = '';
-                    this.params.id = this.smallTypeId;
-                    this.tinyTypeId='';
-                    this.getproductList();
-                    break;
-            }
-
+            var url = '/product/classify-'+this.typeSort+'-'+this.bigTypeId+'-'+this.smallTypeId+'-'+this.tinyTypeId+'-1-'+this.params.pageSize+'-'+sortField+'-'+sortType+'.html';
+            this.params.sortField= sortField;
+            this.params.sortType = sortType;
+            this.params.pageNum = 1;
+            window.location.href = url;
         },
         PromotionsFormat:function(promo){//促销活动类型数据处理
             if(promo!=null){
@@ -141,102 +98,44 @@ var productList = new Vue({
             }
             return false
         },
-        checkedClasslyFn:function(item,index){
-            this.params.pageNum = 1;
-            this.params.idType = index;
-            switch (index) {
-                case 1://选择1集分类查询
-                    this.bigName=item.name;
-                    this.smallName = '';
-                    this.bigTypeId = item.bigTypeId;
-                    this.params.id = item.bigTypeId;
-                    this.smallName ='';
-                    this.tinyName ='';
-                    this.smallTypeId='';
-                    this.tinyTypeId='';
-                    this.tinytypeList=[];
-                    this.getclassify();
-                    break;
-                case 2://选择二级分类查询
-                    this.smallName = item.name;
-                    this.tinyName = '';
-                    this.smallTypeId = item.smallTypeId;
-                    this.params.id = item.smallTypeId;
-                    this.tinyTypeId='';
-                    this.tinytypeList =item.tinytypeList;
-                    break;
-                case 3://选择三级分类查询
-                    this.tinyName = item.name;
-                    this.tinyTypeId = item.tinyTypeId;
-                    this.params.id = item.tinyTypeId;
-                    break;
-            }
-           this.listData=[];
-           this.getproductList();
-        },
     },
     created:function () {
         var userInfo = localStorage.getItem('userInfo');
         if(userInfo){
             this.userId = JSON.parse(userInfo).userId;
         }
+        var paramsArr = window.location.pathname.split(".")[0].split("-");
+        this.typeSort =  paramsArr.length>=2 ? paramsArr[1]*1 : 0;
+        this.bigTypeId = paramsArr.length>=3 ? paramsArr[2]*1 : 0;
+        this.smallTypeId = paramsArr.length>=4 ? paramsArr[3]*1 : 0;
+        this.tinyTypeId = paramsArr.length>=5 ? paramsArr[4]*1 : 0;
+        this.params.pageNum = paramsArr.length>=6 ? paramsArr[5]*1 : 1;
+        this.params.sortField= paramsArr.length>=8 ? paramsArr[7] : "";
+        this.params.sortType = paramsArr.length>=9 ? paramsArr[8]*1 : 1;
     },
     mounted:function () {
         var _self = this;
-        var paramsArr = window.location.pathname.split(".")[0].split("-");
-        var typeSort =  paramsArr.length>=1 ? paramsArr[1] : '';
-        this.bigTypeId = paramsArr.length>=2 ? paramsArr[2] : '';
-        this.smallTypeId = paramsArr.length>=3 ? paramsArr[3] : '';
-        this.tinyTypeId = paramsArr.length>=4 ? paramsArr[4] : '';
-        console.log( this.smallTypeId)
-        console.log( this.tinyTypeId)
-        if(this.tinyTypeId==null &&  this.smallTypeId==null){
-            this.params.id=this.bigTypeId;
-            this.params.idType = 1;
-        }else if(this.tinyTypeId==null){
+        this.listRecord = $('#productCount').val() ? $('#productCount').val()*1 : 0;
+        if (this.bigTypeId && this.smallTypeId && this.tinyTypeId) {
+            this.params.id=this.tinyTypeId;
+            this.params.idType = 3;
+        } else if (this.bigTypeId && this.smallTypeId) {
             this.params.id=this.smallTypeId;
             this.params.idType = 2;
-        }else if(this.smallTypeId==null){
+        } else {
             this.params.id=this.bigTypeId;
             this.params.idType = 1;
-        }else {
-            this.params.id=this.tinyTypeId;
-            this.params.idType = 3;
         }
-
-
-        PublicApi.GetProductClassify({typeSort:typeSort,source:'www'},function (res) {
-                if (res.code==0){
-                    _self.classify = res.data;
-                    _self.classify.forEach(function (item) {
-                        if(_self.bigTypeId == item.bigTypeId){
-                            _self.bigName = item.name;
-                            if (item.smallTypeList!='' && item.smallTypeList!=null){
-                                _self.smalltypeList= item.smallTypeList;
-                                _self.smalltypeList.forEach(function (pros) {
-                                    if(_self.smallTypeId == pros.smallTypeId){
-                                        _self.smallName = pros.name;
-                                        if(pros.tinyTypeList!=''&&pros.tinyTypeList!=null){
-                                            _self.tinytypeList = pros.tinyTypeList;
-                                            _self.tinytypeList.forEach(function (thiny) {
-                                                if (thiny.tinyTypeId ==_self.tinyTypeId){
-                                                    _self.tinyName=thiny.name;
-                                                }
-                                            })
-                                        }
-                                    }
-                                })
-                            }
-                        }
-                    })
-                }else {
-                     CAIMEI.Alert(res.msg, '确定', false);
-                }
+        if (GLOBAL_USER_ID && GLOBAL_USER_ID>0) {
+            _self.getproductList();
+        } else {
+            _self.listLoading = false;
+            _self.$nextTick(function(){
+                // 图片懒加载
+                $("img[data-original]").lazyload();
             });
-        this.getclassify();
-        this.getproductList();
+        }
         if(!isPC){
-            _self.getproductList();
             $('footer').addClass("noneImportant");
             //移动端上垃加载更多
             $(window).on('scroll', function(){

+ 35 - 24
src/main/resources/templates/activity/beautyTopic.html

@@ -10,9 +10,8 @@
     <link href="/css/activity/normalize.css" rel="stylesheet" type="text/css">
     <link rel="stylesheet" href="/css/activity/swiper.min.css"/>
     <link th:href="@{/css/activity/beautyTopic.css(v=${version})}" rel="stylesheet" type="text/css">
-    <link th:href="@{/css/activity/beautyTopic.css(v=${version})}" rel="stylesheet" type="text/css">
 </head>
-<body>
+<body ontouchstart>
 <input type="hidden" th:value="${coreServer}" id="coreServer">
 <div id="app">
     <!-- 大图 -->
@@ -36,8 +35,7 @@
                 >
                     <div :class="fetchTemplate([22,23,24,25],floorData.floorContent.templateType)?['cm-col-md-40', 'cm-col-xs-36']:''">
                         <div class="cm-title cm-text-ellipsis-1">{{floorData.title}}</div>
-                        <div class="cm-subtitle cm-text-ellipsis-1">{{floorData.detail}}<span>{{floorData.floorContent.templateType}}</span>
-                        </div>
+                        <div class="cm-subtitle cm-text-ellipsis-1">{{floorData.detail}}</div>
                     </div>
                     <div
                             class="cm-tabs cm-p-t-12 cm-absolute cm-bottom-right"
@@ -92,7 +90,7 @@
                                                         {{pros.name}}
                                                     </div>
                                                     <div class="cm-tags cm-p-t-2 cm-p-b-2 h20">
-<!--                                                        <span class="cm-tag color2" v-if="pros.product.couponsLogo">优惠券</span>-->
+                                                        <!--                                                        <span class="cm-tag color2" v-if="pros.product.couponsLogo">优惠券</span>-->
                                                         <span class="cm-tag color3" v-if="pros.listType == 2">{{ pros.label }}</span>
                                                     </div>
                                                     <div class="cm-prodcut-price h24">
@@ -249,7 +247,7 @@
                                                     {{pros.name}}
                                                 </div>
                                                 <div class="cm-tags cm-p-t-2 cm-p-b-2 h20">
-<!--                                                     <span class="cm-tag color3" v-if="pros.product.couponsLogo">优惠券</span>-->
+                                                    <!--                                                     <span class="cm-tag color3" v-if="pros.product.couponsLogo">优惠券</span>-->
                                                     <span class="cm-tag color2" v-if="pros.listType == 2">{{ pros.label }}</span>
                                                 </div>
                                                 <div class="cm-prodcut-price h24">
@@ -747,24 +745,25 @@
                 <div class="cm-toggle-btn"></div>
                 <div class="cm-tooltop">
                     <div class="cm-tooltop-content cm-tooltop-1">
-                        <div class="cm-item">展会咨询电话:15338851365</div>
+                        <div class="cm-item">展会咨询电话:15338897365</div>
                         <i></i>
-                        <div class="cm-item">业务咨询电话:15338897365</div>
+                        <div class="cm-item">客服咨询电话:15338851365</div>
                     </div>
                 </div>
             </div>
             <div class="cm-slide">
                 <div class="cm-toggle-btn"></div>
-                <div class="cm-tooltop">
+                <div class="cm-tooltop cm-mobile-tooltop">
                     <div class="cm-tooltop-content cm-tooltop-2 cm-clearfix">
                         <div class="cm-item cm-left">
-                            <img width="108" height="108" src="https://static.caimei365.com/app/img/icon2/cm_wechat_01.png" alt=""/>
+                            <img width="108" height="108"
+                                 src="https://static.caimei365.com/app/img/icon2/cm_wechat_02.png" alt=""/>
                             <span>展会咨询微信</span>
                         </div>
                         <div class="cm-left line"></div>
                         <div class="cm-item cm-left">
-                            <img width="108" height="108" src="https://static.caimei365.com/app/img/icon2/cm_wechat_02.png" alt=""/>
-                            <span>业务咨询微信</span>
+                            <img width="108" height="108" src="https://static.caimei365.com/app/img/icon2/cm_wechat_01.png" alt=""/>
+                            <span>客服咨询微信</span>
                         </div>
                     </div>
                 </div>
@@ -773,14 +772,26 @@
     </div>
     <!-- 获取入口图标 -->
     <div class="cm-entry" v-show="activityEntryVisiable && isActive">
-        <div class="cm-icon-content">
+        <div id="cm-icon-content" class="cm-icon-content" onclick="_czc.push(['_trackEvent','云上美博会','红包弹窗点击','红包弹窗点击',1,'cm-icon-content'])">
             <span class="cm-close" @click="handleToggleActive(false)"></span>
-            <a id="entry" target="_blank" href="/user/coupon-collection.html"
-               onclick="_czc.push(['_trackEvent','云上美博会','点击','红包优惠券','1','entry'])">
-                <img src="https://static.caimei365.com/app/img/icon2/pc_icon.png" alt=""/>
-            </a>
+            <div @click="handleToggleCoupon(true)" style="cursor: pointer">
+                <img src="/img/activity/pc_entry.png" alt="" v-if="!isMobile"/>
+                <img src="/img/activity/h5_entry.png" alt="" v-else/>
+            </div>
         </div>
     </div>
+
+    <div class="cm-entry" v-show="showCouponEntry">
+        <div class="cm-icon-content" @click="handleToggleCoupon(false)">
+            <a href="/product-6898.html" id="conpun" target="_blank" onclick="_czc.push(['_trackEvent','云上美博会','优惠券弹窗点击','优惠券弹窗点击',1,'conpun'])"><span class="btn btn1"></span></a>
+            <a href="/product/couponExp.html" id="conpunDetail" target="_blank" onclick="_czc.push(['_trackEvent','云上美博会','优惠券说明弹窗点击','优惠券说明弹窗点击',1,'conpunDetail'])"><span class="btn btn2"></span></a>
+            <span class="cm-close" @click="handleToggleCoupon(false)"></span>
+            <img src="https://static.caimei365.com/app/img/icon2/coupon-entry-h5.png" alt="" v-if="!isMobile"/>
+            <img src="https://static.caimei365.com/app/img/icon2/coupon-entry-pc.png" alt="" v-else/>
+        </div>
+    </div>
+
+
     <!-- 返回顶部 -->
     <div class="cm-to-top" id="cm-to-top" v-show="showScrollTop">
         <span class="cm-icon-bar"></span>
@@ -797,17 +808,17 @@
 </div>
 <!-- 引入js文件 -->
 <script charset="utf-8" type="text/javascript" src="/lib/jquery-3.5.1.min.js"></script>
-<script charset="utf-8" type="text/javascript" src="/lib/vue2.6.12.min.js"></script>
-<script charset="utf-8" src="/js/activity/swiper.min.js"></script>
 <script charset="utf-8" type="text/javascript" src="/lib/lazyload.js"></script>
 <script charset="utf-8" type="text/javascript" th:src="@{/js/common/ajax.service.js(v=${version})}"></script>
-<script charset="utf-8" type="text/javascript" th:src="@{/js/activity/base.js(v=${version})}"></script>
 <script charset="utf-8" type="text/javascript"
         th:src="@{/js/common/serviceapi/product.service.js(v=${version})}"></script>
-<script charset="utf-8" type="text/javascript" th:src="@{/js/activity/utils.js(v=${version})}"></script>
-<script charset="utf-8" type="text/javascript" th:src="@{/js/activity/layout.js(v=${version})}"></script>
-<script charset="utf-8" type="text/javascript" th:src="@{/js/activity/mixin.js(v=${version})}"></script>
-<script charset="utf-8" type="text/javascript" th:src="@{/js/activity/index.js(v=${version})}"></script>
+<script charset="utf-8" type="text/javascript" src="/lib/vue2.6.12.min.js"></script>
+<script charset="utf-8" src="/js/activity/beautyTopic/swiper.min.js"></script>
+<script charset="utf-8" type="text/javascript" th:src="@{/js/activity/beautyTopic/base.js(v=${version})}"></script>
+<script charset="utf-8" type="text/javascript" th:src="@{/js/activity/beautyTopic/utils.js(v=${version})}"></script>
+<script charset="utf-8" type="text/javascript" th:src="@{/js/activity/beautyTopic/layout.js(v=${version})}"></script>
+<script charset="utf-8" type="text/javascript" th:src="@{/js/activity/beautyTopic/mixin.js(v=${version})}"></script>
+<script charset="utf-8" type="text/javascript" th:src="@{/js/activity/beautyTopic.js(v=${version})}"></script>
 <script>
     var isFormal = window.location.href.indexOf('www.caimei365.com') !== -1;
     if (isFormal) {

+ 35 - 0
src/main/resources/templates/activity/couponExp.html

@@ -0,0 +1,35 @@
+<html lang="zh-CN" xmlns:th="https://www.thymeleaf.org" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+      xsi:schemaLocation="https://www.thymeleaf.org ">
+<head>
+    <meta charset="utf-8"/>
+    <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
+    <title>优惠券说明</title>
+    <link href="/css/activity/normalize.css" rel="stylesheet" type="text/css">
+    <link href="/css/activity/couponExp.css?v=20210831-100013" rel="stylesheet"
+          type="text/css">
+</head>
+
+<body>
+<div>
+    <!-- 大图 -->
+    <div class="banner-container">
+        <div class="cm-container cm-relative">
+            <div class="banner">
+                <img src="https://static.caimei365.com/app/img/icon2/couponExp-banner.jpg" alt=""/>
+            </div>
+        </div>
+    </div>
+    <div class="cm-content">
+        <img src="https://static.caimei365.com/app/img/icon2/couponExp-content.jpg" alt="">
+    </div>
+
+    <div class="cm-content-h5">
+        <img src="https://static.caimei365.com/app/img/icon2/couponExp-content-h5.jpg" alt="">
+    </div>
+
+    <div class="cm-footer">
+        ——采美信息技术有限有限公司提供技术支持——
+    </div>
+</div>
+</body>
+</html>

+ 15 - 6
src/main/resources/templates/article/components/article-footer.html

@@ -1,15 +1,24 @@
 <!--底部内容-->
 <div class="foot">
     <div class="footer">
-        <div class="logo"><img src="/img/info/foot-logo.png" /></div>
-        <div class="dizhi">
-            <p>Copyright©2015-2021 CAIMEI365.com All Rights Reserved.</p>
-            <p>深圳市采美网络信息有限公司版权所有<a href="https://beian.miit.gov.cn" target="_blank" rel="nofollow" style="color:#FFF;text-decoration:underline;">粤ICP备14019824号</a></p>
+        <p>
+            <span>
+                <img class="icp" src="/img/base/icon-icp@2x.png" alt="粤B1-20160129 备案号 ">
+                粤B1-20160129 备案号
+                <a href="https://beian.miit.gov.cn" target="_blank" rel="nofollow" style="color:#FFF;text-decoration:underline;">粤ICP备14019824号</a>
+            </span>
+            <span>
+                <a href="https://static.caimei365.com/www/ppzs/互联网药品信息服务资格证.jpg" target="_blank" rel="nofollow" style="color:#FFF;text-decoration:underline;">互联网药品信息服务资格证编号(粤)-非经营性-2021-0339</a>
+            </span>
+            <span>中华人民共和国增值电信业务经营许可证</span>
+        </p>
+        <p>
+            <span>Copyright © 2015-2021 CAIMEI365.com All Rights Reserved.</span><span>深圳市采美网络信息有限公司</span>
             <span>
                 <!-- CNZZ统计 start -->
                 <script type="text/javascript">document.write(unescape("%3Cspan id='cnzz_stat_icon_1279558759'%3E%3C/span%3E%3Cscript src='https://s9.cnzz.com/z_stat.php%3Fid%3D1279558759%26show%3Dpic' type='text/javascript'%3E%3C/script%3E"));</script>
-                <!-- CNZZ统计 start -->
+            <!-- CNZZ统计 start -->
             </span>
-        </div>
+        </p>
     </div>
 </div>

+ 11 - 3
src/main/resources/templates/components/footer.html

@@ -62,11 +62,19 @@
         </div>
         <!--copyright-->
         <div class="wrap copyright clear">
-            <div class="item icon mIcon">
-                <p><span>Copyright © 2015-2021 CAIMEI365.com All Rights Reserved.</span><span>深圳市采美网络信息有限公司</span></p>
+            <div class="item">
                 <p>
-                    <span>粤B1-20160129 备案号 <a href="https://beian.miit.gov.cn" target="_blank" rel="nofollow" style="color:#FFF;text-decoration:underline;">粤ICP备14019824号</a></span>
+                    <span>
+                        <img class="icp" src="/img/base/icon-icp@2x.png" alt="粤B1-20160129 备案号 ">
+                        粤B1-20160129 备案号
+                        <a href="https://beian.miit.gov.cn" target="_blank" rel="nofollow" style="color:#FFF;text-decoration:underline;">粤ICP备14019824号</a></span>
+                    <span>
+                        <a href="https://static.caimei365.com/www/ppzs/互联网药品信息服务资格证.jpg" target="_blank" rel="nofollow" style="color:#FFF;text-decoration:underline;">互联网药品信息服务资格证编号(粤)-非经营性-2021-0339</a>
+                    </span>
                     <span>中华人民共和国增值电信业务经营许可证</span>
+                </p>
+                <p>
+                    <span>Copyright © 2015-2021 CAIMEI365.com All Rights Reserved.</span><span>深圳市采美网络信息有限公司</span>
                     <span>
                         <!-- CNZZ统计 start -->
                         <script type="text/javascript">document.write(unescape("%3Cspan id='cnzz_stat_icon_1279558759'%3E%3C/span%3E%3Cscript src='https://s9.cnzz.com/z_stat.php%3Fid%3D1279558759%26show%3Dpic' type='text/javascript'%3E%3C/script%3E"));</script>

+ 15 - 15
src/main/resources/templates/product/detail.html

@@ -23,13 +23,13 @@
                 <div v-if="isPC" class="bigImage">
                     <img :src="images[0]">
                     <span class="mask"></span>
-                    <span class="cm-product-cover-tag">云上美博会</span>
+                    <span class="cm-product-cover-tag" v-if="pcActType === 1 && isPC">云上美博会</span>
                 </div>
                 <div id="swiperImage" class="smallImage swiper-container">
                     <ul class="swiper-wrapper clear">
                         <li class="swiper-slide mfc" v-for="img in images">
                             <img :src="img">
-                            <span class="cm-product-cover-tag" v-if="!isPC">云上美博会</span>
+                            <span class="cm-product-cover-tag" v-if="pcActType === 0 && !isPC">云上美博会</span>
                         </li>
                     </ul>
                     <div class="swiper-pagination mfc"></div>
@@ -59,8 +59,8 @@
                     <div class="row price"><span class="l">采美价</span><i>:</i>
                         <template v-if="GLOBAL_USER_ID && GLOBAL_USER_ID>0">
                             <!--用户身份 0、个人 1、协销 2、会员机构 3、供应商 4,普通机构-->
-                            <em v-if="priceObj.priceFlag==1">¥价格未公开</em>
-                            <em v-else-if="priceObj.priceFlag==2 && priceObj.userIdentity==4">¥会员可见</em>
+                            <em v-if="priceObj.priceFlag==1" v-text="'¥价格未公开'"></em>
+                            <em v-else-if="priceObj.priceFlag==2 && priceObj.userIdentity==4" v-text="'¥会员可见'"></em>
                             <template v-else-if="(priceObj.priceFlag==0 && priceObj.userIdentity!=3) || priceObj.userIdentity==2 || (priceObj.userIdentity==3 && priceObj.shopId==GLOBAL_SHOP_ID)">
                                 <em v-if="priceObj.actStatus==1 && promotions && promotions.type==1 && promotions.mode==1" class="p">
                                     <del v-text="'¥'+parseFloat(priceObj.originalPrice).toFixed(2)"></del>
@@ -85,8 +85,8 @@
                                     <span>
                                         <em class="t"><i>价格</i><i>起订量</i></em>
                                         <em v-for="l in ladderList">
-                                            <i class="p">¥{{toFloat(l.buyPrice)}}</i>
-                                            <i>{{l.numRange}}</i>
+                                            <i class="p" v-text="'¥'+toFloat(l.buyPrice)"></i>
+                                            <i v-text="l.numRange"></i>
                                         </em>
                                         <em @click="hideThisLadder($event)" class="close">了解</em>
                                     </span>
@@ -99,11 +99,11 @@
                                 <div class="promotion mFixed">
                                     <div>
                                         <p class="t">
-                                            <em v-if="promotions.type==1 && promotions.mode==1">{{priceObj.priceFlag==1?'价格未公开':(promotions.name+':¥'+toFloat(promotions.touchPrice))}}</em>
-                                            <em v-if="promotions.mode==2">{{promotions.name+',满 ¥'+toFloat(promotions.touchPrice)+' 减 ¥'+toFloat(promotions.reducedPrice)}}</em>
-                                            <em v-if="promotions.mode==3">{{promotions.name+',满 ¥'+toFloat(promotions.touchPrice)+' 赠送商品'}}</em>
+                                            <em v-if="promotions.type==1 && promotions.mode==1" v-text="priceObj.priceFlag==1?'价格未公开':(promotions.name+':¥'+toFloat(promotions.touchPrice))"></em>
+                                            <em v-if="promotions.mode==2" v-text="promotions.name+',满 ¥'+toFloat(promotions.touchPrice)+' 减 ¥'+toFloat(promotions.reducedPrice)"></em>
+                                            <em v-if="promotions.mode==3" v-text="promotions.name+',满 ¥'+toFloat(promotions.touchPrice)+' 赠送商品'"></em>
                                         </p>
-                                        <p>促销时间:<em v-if="promotions.status==1">不限时</em><em v-else>{{promotions.beginTime.substr(0,10)+' ~ '+promotions.endTime.substr(0,10)}}</em></p>
+                                        <p>促销时间:<em v-if="promotions.status==1">不限时</em><em v-else v-text="promotions.beginTime.substr(0,10)+' ~ '+promotions.endTime.substr(0,10)"></em></p>
                                         <p v-if="promotions.type==2" class="r"><a class="more" :href="'/product/promotions.html?id='+promotions.id">更多凑单商品>>></a></p>
                                         <template v-if="promotions.mode==3">
                                             <p>赠品:</p>
@@ -144,7 +144,7 @@
                         <span class="l">优惠券</span>
                         <i>:</i>
                         <span class="coupon-tags">
-                            <em class="couponTag" v-for="(coupon, index) in productCoupon" :key="index">满{{ coupon.touchPrice }}减{{ coupon.couponAmount }} </em>
+                            <em class="couponTag" v-for="(coupon, index) in productCoupon" :key="index" v-text="'满'+coupon.touchPrice+'减'+coupon.couponAmount"></em>
                             <em class="couponTag-more" @click="showPopup">更多></em>
                         </span>
                     </div>
@@ -242,8 +242,8 @@
                 <div class="item" v-if="tabsIndex == 1">
                     <table>
                         <tr v-for="pa in parameters">
-                            <td> {{ pa.paramsName }}</td>
-                            <td> {{ pa.paramsContent }}</td>
+                            <td v-text="pa.paramsName"></td>
+                            <td v-text="pa.paramsContent"></td>
                         </tr>
                     </table>
                 </div>
@@ -254,8 +254,8 @@
                     <div th:utext="${product.serviceInfo}"></div>
                 </div>
                 <div class="item" v-if="tabsIndex == 3">
-                    <div><p class="tl">培训方式: <span class="sm">{{ trainingMethodText }}</span></p></div>
-                    <div><p class="tl">培训费用: <span class="sm">{{ trainingType }}</span></p></div>
+                    <div><p class="tl">培训方式: <span class="sm" v-text="trainingMethodText"></span></p></div>
+                    <div><p class="tl">培训费用: <span class="sm" v-text="trainingType"></span></p></div>
                 </div>
 <!--                <div class="item">-->
 <!--                <div style="text-align: left;margin: 10px 0">-->

+ 54 - 28
src/main/resources/templates/product/instruelist.html

@@ -10,9 +10,10 @@
 <body>
 <!-- 引用头部 -->
 <template th:replace="components/header"></template>
-
+<!--页面参数-->
+<input type="hidden" th:value="${productCount}" id="productCount">
 <!-- 商品列表 -->
-<div id="productList">
+<div id="productList" v-cloak>
      <!--loading-->
     <div v-if="listLoading" class="loading">
         <img src="/img/base/loading.gif">
@@ -21,10 +22,9 @@
         <div class="crumbs-nav" v-if="isPC">
             <div class="crumbs-link"> 筛选条件: </div>
             <div  class="crumbs-nav-main">
-               <div class="crumbs-nav-item" v-if="bigName !=''">{{bigName}}</div>
-               <div class="crumbs-nav-item" v-if="tinyName!=''&& smallName!=''">{{smallName}}</div>
-               <div class="crumbs-nav-item on" @click="removeNama(1)" v-if="smallName!=''&& tinyName==''">{{smallName}} x</div>
-               <div class="crumbs-nav-item on" @click="removeNama(2)" v-if="tinyName!=''">{{tinyName}} x</div>
+                <div class="crumbs-nav-item" th:if="not${#strings.isEmpty(bigTypeName)}" th:text="${bigTypeName}"></div>
+                <div class="crumbs-nav-item on" th:if="not${#strings.isEmpty(smallTypeName)}" th:text="${smallTypeName}"></div>
+                <div class="crumbs-nav-item on" th:if="not${#strings.isEmpty(tinyTypeName)}" th:text="${tinyTypeName}"></div>
             </div>
         </div>
         <div id="listClassify">
@@ -32,19 +32,25 @@
             <div class="classification">
                 <div class="class-title">分类</div>
                 <div class="class-nav-main">
-                    <div v-for="item in classify" @click="checkedClasslyFn(item,1)" :class="{'on':item.bigTypeId == bigTypeId}">{{item.name}}</div>
+                    <div th:each="bigType : ${bigTypeJson}" th:class="${bigType.bigTypeId == bigTypeId}?'on':''">
+                        <a th:text="${bigType.name}" th:href="'/product/classify-'+ ${typeSort} +'-'+ ${bigType.bigTypeId} +'.html'"></a>
+                    </div>
                 </div>
             </div>
-            <div class="classification" v-if="smalltypeList!='' && smalltypeList!=null">
+            <div class="classification" th:if="not${#lists.isEmpty(smallTypeJson)}">
                 <div class="class-title">二级</div>
                 <div class="class-nav-main">
-                    <div v-for="item in smalltypeList" @click="checkedClasslyFn(item,2)" :class="{'on':item.smallTypeId == smallTypeId}">{{item.name}}</div>
+                    <div th:each="smallType : ${smallTypeJson}" th:class="${smallType.smallTypeId == smallTypeId}?'on':''">
+                        <a th:text="${smallType.name}" th:href="'/product/classify-'+ ${typeSort} +'-'+ ${bigTypeId} +'-'+ ${smallType.smallTypeId} +'.html'"></a>
+                    </div>
                 </div>
             </div>
-            <div class="classification" v-if="params.smallTypeId!=''&& tinytypeList!=''&& tinytypeList!=null">
+            <div class="classification" th:if="not${#lists.isEmpty(tinyTypeJson)}">
                 <div class="class-title">三级</div>
                 <div class="class-nav-main">
-                    <div v-for="item in tinytypeList" @click="checkedClasslyFn(item,3)" :class="{'on':item.tinyTypeId == tinyTypeId}">{{item.name}}</div>
+                    <div th:each="tinyType : ${tinyTypeJson}" th:class="${tinyType.tinyTypeId == tinyTypeId}?'on':''">
+                        <a th:text="${tinyType.name}" th:href="'/product/classify-'+ ${typeSort} +'-'+ ${bigTypeId} +'-'+ ${smallTypeId} +'-'+ ${tinyType.tinyTypeId} +'.html'"></a>
+                    </div>
                 </div>
             </div>
         </template>
@@ -75,19 +81,39 @@
                 </ul>
             </div>
         </div>
-        <template v-if="listData && listData.length>0">
-            <div class="list-container">
+        <!--商品列表-->
+        <div th:if="not${#lists.isEmpty(productListJson)}" class="list-container">
+            <!--未登录游客,后台渲染便于SEO-->
+            <div v-if="!GLOBAL_USER_ID">
                 <ul class="clear mfw">
-                    <li class="productItem " v-for="p in listData">
+                    <li class="productItem" th:each="product : ${productListJson}" th:object="${product}">
+                        <a class="image" th:href="'/product-'+ *{productId} +'.html'">
+                            <img src="/img/base/placeholder.png"  th:attr="data-original=*{image}" th:alt="*{name}">
+                            <p class="name">
+                                <span th:if="*{beautyActFlag}==1" class="tag">美博会</span>
+                                <th:block th:text="*{name}"></th:block>
+                            </p>
+                            <div class="price">
+                                <div class="price_text_tag "></div>
+                                <div class="price_grade "><span class="bold">¥</span><i th:attr="class=*{'icon mIcon i'+priceGrade}"></i></div>
+                            </div>
+                        </a>
+                    </li>
+                </ul>
+            </div>
+            <div v-else>
+                <ul class="clear mfw">
+                    <!--登陆后获取动态数据-->
+                    <li class="productItem" v-for="p in listData">
                         <a class="image" :href="'/product-'+p.productId+'.html'">
                             <img src="/img/base/placeholder.png" :data-original="p.image" :alt="p.name">
                             <p class="name" v-html="addhtml + p.name" v-if="p.beautyActFlag==1"></p>
                             <p class="name" v-html="p.name" v-else></p>
                             <div class="price">
-                                <template v-if="GLOBAL_USER_ID && GLOBAL_USER_ID>0">
+                                <!--<template v-if="GLOBAL_USER_ID && GLOBAL_USER_ID>0">-->
                                     <!--用户身份 0、个人 1、协销 2、会员机构 3、供应商 4,普通机构-->
                                     <template v-if="p.priceFlag==1">
-                                       <div class="price_text_tag">
+                                        <div class="price_text_tag">
                                             <p class="listTag" v-if="p.actStatus==1">{{p.promotions.name}}</p>
                                         </div>
                                         <div class="main_price_unde">¥价格未公开</div>
@@ -120,22 +146,22 @@
                                         <div class="price_grade"><span class="bold">¥</span><i :class="'icon mIcon i'+p.priceGrade"></i></div>
                                         </template>
                                     </template>
-                                </template>
+                                <!--</template>
                                 <template v-else>
                                      <div class="price_text_tag ">
-<!--                                         <p class="couponTag" v-if="p.couponsLogo">优惠券</p>-->
+                                         <p class="couponTag" v-if="p.couponsLogo">优惠券</p>
                                          <p class="listTag" v-if="p.actStatus==1">{{p.promotions.name}}</p>
                                       </div>
                                       <div class="price_grade "><span class="bold">¥</span><i :class="'icon mIcon i'+p.priceGrade"></i></div>
-                                </template>
+                                </template>-->
                             </div>
                         </a>
                     </li>
                 </ul>
             </div>
-        </template>
-         <!--数据为空-->
-        <div v-if="!listLoading && (!listData || listData.length==0)" class="empty">
+        </div>
+         <!--数据为空 -->
+        <div th:if="${#lists.isEmpty(productListJson)}" class="empty">
             <img src="/img/common/list-empty.png">
             <div class="msg">
                 <p>此分类下暂无商品</p>
@@ -145,12 +171,12 @@
     <!--分页-->
     <div v-if="(!isPC) && noMore" class="noMore">---- 没有更多了 ----</div>
     <div v-if="isPC && pageTotal>1" class="pageWrap clear">
-        <a v-if="params.pageNum>1" class="prev" @click="toPagination(params.pageNum*1-1)" href="javascript:void(0);"></a>
-        <template v-for="n in showPageBtn">
-            <a v-if="n" :class="{'on':(n==params.pageNum)}" @click="toPagination(n)" href="javascript:void(0);" v-text="n"></a>
-            <span v-else>···</span>
-        </template>
-        <a v-if="params.pageNum<pageTotal" class="next" @click="toPagination(params.pageNum*1+1)" href="javascript:void(0);"></a>
+        <th:block th:each="page : ${pageBtnList}">
+            <a th:if="${page.btn} == -1" class="prev" th:href="${page.path}"></a>
+            <span th:if="${page.btn} == 0">···</span>
+            <a th:if="${page.btn} > 0" th:class="${page.btn == pageBtnNum} ? 'on' : ''" th:href="${page.path}" th:text="${page.btn}"></a>
+            <a th:if="${page.btn} == -2" class="next" th:href="${page.path}"></a>
+        </th:block>
         <span>共<b v-text="pageTotal>1?pageTotal:1"></b>页</span>
         <span>跳至</span>
         <input v-model="pageInput" @blur="checkNum()"/>