From d2c5aeeb8e059dbdeb2a8b28d187bf5ad1d9dc82 Mon Sep 17 00:00:00 2001
From: peng <peng.com>
Date: 星期一, 21 七月 2025 11:40:02 +0800
Subject: [PATCH] 解决主包过大问题

---
 pages/cusbar/home/template/tpl_menu.vue                |   62 
 pages/cusbar/home/title.vue                            |  193 +
 pages/product/home/template/tpl_flex_one.vue           |   38 
 pages/product/home/template/tpl_flex_two.vue           |   49 
 pages/product/home/template/tpl_group.vue              |   40 
 pages/cusbar/home/template/tpl_join_group.vue          |   90 
 pages/product/m-goods-recommend/index.vue              |    2 
 pages/cusbar/home/views.vue                            |  250 ++
 pages/product/home/template/tpl.scss                   |   32 
 pages/product/home/template/tpl_promotions_detail.vue  |  274 ++
 pages/cusbar/home/template/tpl_flex_three.vue          |   40 
 pages/cusbar/home/template/tpl_group.vue               |   40 
 pages/cusbar/home/template/tpl.scss                    |   32 
 pages/product/home/template/tpl_left_one_right_two.vue |   46 
 pages/product/home/index.vue                           |   43 
 pages/product/home/template/tpl_flex_five.vue          |   32 
 pages/product/home/template/tpl.js                     |  208 +
 pages/product/home/template/tpl_spike.vue              |   38 
 pages/product/goods.vue                                |   26 
 pages/cusbar/home/template/tpl_goods.vue               |  263 ++
 pages.json                                             |  399 +-
 pages/product/home/template/tpl_banner.vue             |   38 
 pages/product/home/views.vue                           |  250 ++
 pages/product/home/template/tpl_notice.vue             |   50 
 pages/product/home/template/tpl_search.vue             |   64 
 pages/cusbar/home/template/tpl.js                      |  208 +
 pages/cusbar/home/template/tpl_flex_two.vue            |   49 
 pages/cusbar/home/template/tpl_spike.vue               |   38 
 pages/cusbar/home/template/tpl_promotions_detail.vue   |  274 ++
 pages/cusbar/home/template/tpl_title.vue               |   58 
 pages/product/home/template/tpl_flex_four.vue          |   36 
 pages/cusbar/home/template/tpl_left_one_right_two.vue  |   46 
 pages/cusbar/home/web-view.vue                         |   53 
 pages/product/home/web-view.vue                        |   53 
 pages/cusbar/home/template/tpl_text_picture.vue        |  101 
 pages/product/home/template/tpl_flex_three.vue         |   40 
 pages/cusbar/home/template/fetch_coupon.vue            |  172 +
 pages/cusbar/home/template/tpl_flex_five.vue           |   32 
 pages/product/home/template/tpl_text_picture.vue       |  101 
 pages/product/home/template/tpl_title.vue              |   58 
 pages/cusbar/home/template/tpl_notice.vue              |   50 
 pages/product/home/template/tpl_goods.vue              |  263 ++
 pages/product/home/template/tpl_join_group.vue         |   90 
 pages/cusbar/home/template/tpl_flex_four.vue           |   36 
 pages/cusbar/home/template/tpl_search.vue              |   64 
 pages/product/home/template/tpl_top_two_bottom_one.vue |   80 
 pages/product/shopPage.vue                             |   32 
 pages/cusbar/home/template/tpl_flex_one.vue            |   38 
 pages/promotion/m-goods-recommend/README.md            |   10 
 pages/cusbar/home/template/tpl_top_one_bottom_two.vue  |   73 
 pages/product/home/template/tpl_hot_zone.vue           |   57 
 pages/cusbar/home/template/tpl_left_two_right_one.vue  |   45 
 pages/product/home/template/tpl_menu.vue               |   62 
 pages/cusbar/home/template/tpl_hot_zone.vue            |   57 
 pages/cusbar/home/template/tpl_top_two_bottom_one.vue  |   80 
 pages/product/home/template/tpl_top_one_bottom_two.vue |   73 
 pages/subComponents/comment.vue                        |  379 +++
 pages/product/home/template/advertising.scss           |   57 
 pages/cusbar/home/template/tpl_banner.vue              |   38 
 pages/cusbar/home/index.vue                            |   43 
 pages/cusbar/home/template/advertising.scss            |   57 
 pages/product/home/template/fetch_coupon.vue           |  172 +
 pages/product/home/template/tpl_integral.vue           |   85 
 pages/product/home/template/tpl_left_two_right_one.vue |   45 
 pages/promotion/m-goods-recommend/index.vue            |  137 +
 pages/cusbar/home/template/tpl_integral.vue            |   85 
 pages/product/home/title.vue                           |  193 +
 67 files changed, 6,098 insertions(+), 221 deletions(-)

diff --git a/pages.json b/pages.json
index 93752ba..4c5472b 100644
--- a/pages.json
+++ b/pages.json
@@ -2,8 +2,8 @@
   "easycom": {
     "autoscan": true,
     "custom": {
-      "^u-(.*)": "@/pages/subComponents/uview-components/uview-ui/components/u-$1/u-$1.vue",
-	  "__placeholder__": true
+      "^u-(.*)": "@/pages/subComponents/uview-components/uview-ui/components/u-$1/u-$1.vue",	  
+      "__placeholder__": true
       //uview,
       // "^uni-(.*)": "@/uni_modules/uni-$1/components/uni-$1/uni-$1.vue" // uniapp缁勪欢
     }
@@ -146,18 +146,18 @@
     //     }
     //   }
     // }
-	// ,
- //    {
- //      "path": "components/m-buy/goods",
- //      "style": {
- //        "navigationBarTitleText": "",
- //        "componentPlaceholder": {
- //          "u-popup": "view",
- //          "u-image": "view",
- //          "u-alert-tips": "view"
- //        }
- //      }
- //    }
+    // ,
+    //    {
+    //      "path": "components/m-buy/goods",
+    //      "style": {
+    //        "navigationBarTitleText": "",
+    //        "componentPlaceholder": {
+    //          "u-popup": "view",
+    //          "u-image": "view",
+    //          "u-alert-tips": "view"
+    //        }
+    //      }
+    //    }
     // {
     //   "path": "components/m-take-down-sale-goods/index",
     //   "style": {
@@ -530,13 +530,13 @@
           "path": "deposit/index",
           "style": {
             // "navigationStyle": "custom"
-			"navigationBarTitleText": "棰勫瓨娆惧垪琛�"
+            "navigationBarTitleText": "棰勫瓨娆惧垪琛�"
           }
         },
         {
           "path": "deposit/operation",
           "style": {
-			  "navigationBarTitleText": "浣欓"
+            "navigationBarTitleText": "浣欓"
             // "navigationStyle": "custom"
           }
         },
@@ -651,11 +651,11 @@
             // 闅愯棌绯荤粺瀵艰埅鏍�
             "enablePullDownRefresh": true,
             "app-plus": {},
-			"componentPlaceholder": {
-			  "u-navbar": "view",
-			  "u-image": "view",
-			  "u-avatar": "view"
-			}
+            "componentPlaceholder": {
+              "u-navbar": "view",
+              "u-image": "view",
+              "u-avatar": "view"
+            }
           }
         },
         {
@@ -770,12 +770,12 @@
           "path": "msgTips/packageMsg/logisticsDetail",
           "style": {
             "navigationBarTitleText": "璁㈠崟璺熻釜",
-			"componentPlaceholder": {
-			  "u-time-line": "view",
-			  "u-time-line-item": "view",
-			  "u-icon": "view",
-			  "u-empty": "view"
-			}
+            "componentPlaceholder": {
+              "u-time-line": "view",
+              "u-time-line-item": "view",
+              "u-icon": "view",
+              "u-empty": "view"
+            }
           }
         },
         {
@@ -893,87 +893,111 @@
     },
     {
       "root": "pages/product",
-		  // 鍏抽敭閰嶇疆
+      // 鍏抽敭閰嶇疆
       "pages": [
         {
           "path": "shopPage",
           "style": {
-            "navigationBarTitleText": ""
+            "navigationBarTitleText": "",
+			"componentPlaceholder": {
+			  "u-image": "view",
+			  "u-navbar": "view",
+			  "u-no-network": "view",
+			  "u-icon": "view",
+			  "tpl_banner": "view",
+			  "tpl_title": "view",
+			  "tpl_left_one_right_two":"view",
+			  "tpl_left_two_right_one":"view",
+			  "tpl_top_one_bottom_two":"view",
+			  "tpl_top_two_bottom_one":"view",
+			  "tpl_flex_three":"view",
+			  "tpl_flex_five":"view",
+			  "tpl_flex_four":"view",
+			  "tpl_flex_two":"view",
+			  "tpl_text_picture":"view",
+			  "tpl_menu":"view",
+			  "tpl_search":"view",
+			  "tpl_flex_one":"view",
+			  "tpl_goods":"view",
+			  "tpl_group":"view"
+			  
+			  
+			}
           }
         },
-		{
-		  "path": "m-share/index",
-		  "style": {
-		    "navigationBarTitleText": "",
-		    "navigationStyle": "custom",
-		    "componentPlaceholder": {
-		      "u-popup": "view",
-		      "u-icon": "view"
-		    }
-		  }
-		},
-		{
-		  "path": "m-goods-list/list",
-		  "style": {
-		    "navigationBarTitleText": "",
-		    "navigationStyle": "custom",
-		    "app-plus": {
-		      //app椤甸潰涓嶆樉绀烘粴鍔ㄦ潯
-		      "scrollIndicator": "none",
-		      "bottom": "0",
-		      "contentAdjust": "false",
-		      "bounce": "none",
-		      "safearea": {
-		        "bottom": "none"
-		      }
-		    },
-		    "componentPlaceholder": {
-		      "u-image": "view",
-		      "u-loading": "view",
-		      "u-tag": "view",
-		      "u-icon": "view"
-		    }
-		  }
-		},
-		   {
-		     "path": "m-buy/goods",
-		     "style": {
-		       "navigationBarTitleText": "",
-		       "componentPlaceholder": {
-		         "u-popup": "view",
-		         "u-image": "view",
-		         "u-alert-tips": "view"
-		       }
-		     }
-		   },
-		   {
-		     "path": "m-take-down-sale-goods/index",
-		     "style": {
-		       "navigationBarTitleText": "",
-		       "componentPlaceholder": {
-		         "u-popup": "view"
-		       }
-		     }
-		   },
-		// {
-		//   "path": "popups/popups",
-		//   "style": {
-		//     "navigationBarTitleText": "",
-		// 	"componentPlaceholder": {
-		// 	  "u-icon": "view",
-		// 	  "u-button": "view",
-		// 	  "u-form": "view",
-		// 	  "u-form-item": "view",
-		// 	  "u-input": "view",
-		// 	  "u-popup": "view",
-		// 	  "u-search": "view",
-		// 	  "u-loading": "view",
-		// 	  "u-navbar": "view",
-		// 	  "u-image": "view",
-		// 	  "u-loadmore": "view"
-		// 	}
-		//   }
-		// },
+        {
+          "path": "m-goods-list/list",
+          "style": {
+            "navigationBarTitleText": "",
+            "navigationStyle": "custom",
+            "app-plus": {
+              //app椤甸潰涓嶆樉绀烘粴鍔ㄦ潯
+              "scrollIndicator": "none",
+              "bottom": "0",
+              "contentAdjust": "false",
+              "bounce": "none",
+              "safearea": {
+                "bottom": "none"
+              }
+            },
+            "componentPlaceholder": {
+              "u-image": "view",
+              "u-loading": "view",
+              "u-tag": "view",
+              "u-icon": "view"
+            }
+          }
+        },
+        {
+          "path": "m-share/index",
+          "style": {
+            "navigationBarTitleText": "",
+            "navigationStyle": "custom",
+            "componentPlaceholder": {
+              "u-popup": "view",
+              "u-icon": "view"
+            }
+          }
+        },
+        {
+          "path": "m-buy/goods",
+          "style": {
+            "navigationBarTitleText": "",
+            "componentPlaceholder": {
+              "u-popup": "view",
+              "u-image": "view",
+              "u-alert-tips": "view"
+            }
+          }
+        },
+        {
+          "path": "m-take-down-sale-goods/index",
+          "style": {
+            "navigationBarTitleText": "",
+            "componentPlaceholder": {
+              "u-popup": "view"
+            }
+          }
+        },
+        // {
+        //   "path": "popups/popups",
+        //   "style": {
+        //     "navigationBarTitleText": "",
+        // 	"componentPlaceholder": {
+        // 	  "u-icon": "view",
+        // 	  "u-button": "view",
+        // 	  "u-form": "view",
+        // 	  "u-form-item": "view",
+        // 	  "u-input": "view",
+        // 	  "u-popup": "view",
+        // 	  "u-search": "view",
+        // 	  "u-loading": "view",
+        // 	  "u-navbar": "view",
+        // 	  "u-image": "view",
+        // 	  "u-loadmore": "view"
+        // 	}
+        //   }
+        // },
         {
           "path": "shopList",
           "style": {
@@ -984,7 +1008,10 @@
         {
           "path": "licencePhoto",
           "style": {
-            "navigationBarTitleText": "钀ヤ笟鎵х収"
+            "navigationBarTitleText": "钀ヤ笟鎵х収",
+			"componentPlaceholder": {
+			  "u-image": "view"
+			}
           }
         },
         {
@@ -992,19 +1019,19 @@
           "style": {
             "navigationBarTitleText": "",
             "navigationStyle": "custom",
-			"componentPlaceholder": {
-			  "u-icon": "view",
-			  "u-button": "view",
-			  "u-form": "view",
-			  "u-form-item": "view",
-			  "u-input": "view",
-			  "u-popup": "view",
-			  "u-search": "view",
-			  "u-loading": "view",
-			  "u-navbar": "view",
-			  "u-image": "view",
-			  "u-loadmore": "view"
-			}
+            "componentPlaceholder": {
+              "u-icon": "view",
+              "u-button": "view",
+              "u-form": "view",
+              "u-form-item": "view",
+              "u-input": "view",
+              "u-popup": "view",
+              "u-search": "view",
+              "u-loading": "view",
+              "u-navbar": "view",
+              "u-image": "view",
+              "u-loadmore": "view"
+            }
           }
         },
         {
@@ -1027,7 +1054,7 @@
               "u-icon": "view",
               "u-navbar": "view",
               "u-popup": "view",
-			  "popups":"view"
+              "popups": "view"
             }
           }
         },
@@ -1127,7 +1154,13 @@
           "style": {
             "navigationBarTitleText": "鍟嗗搧璇勪环",
             //app椤甸潰涓嶆樉绀烘粴鍔ㄦ潯
-            "scrollIndicator": "none"
+            "scrollIndicator": "none",
+            "componentPlaceholder": {
+              "u-empty": "view",
+              "u-loadmore": "view",
+              "u-image": "view",
+              "u-empty": "view"
+            }
           }
         },
         {
@@ -1146,7 +1179,6 @@
     },
     {
       "root": "pages/floor",
-	   
       "pages": [
         {
           "path": "empty"
@@ -1199,7 +1231,6 @@
     },
     {
       "root": "pages/passport",
-	   
       "pages": [
         {
           "path": "login",
@@ -1308,7 +1339,6 @@
     },
     {
       "root": "pages/promotion",
-	   
       "pages": [
         {
           "path": "seckill",
@@ -1385,7 +1415,6 @@
     },
     {
       "root": "pages/cart",
-	   
       "pages": [
         {
           "path": "coupon/myCoupon",
@@ -1430,11 +1459,11 @@
               "popGesture": "none"
               //绂佹渚ф粦閫�鍑�
             },
-			"componentPlaceholder": {
-			  "u-count-down": "view",
-			  "u-row": "view",
-			  "u-icon": "view"
-			}
+            "componentPlaceholder": {
+              "u-count-down": "view",
+              "u-row": "view",
+              "u-icon": "view"
+            }
           }
         },
         {
@@ -1462,7 +1491,6 @@
     },
     {
       "root": "pages/order",
-	   
       "pages": [
         {
           "path": "complain/complain",
@@ -1531,17 +1559,17 @@
           "path": "orderDetail",
           "style": {
             "navigationBarTitleText": "璁㈠崟璇︽儏",
-			"componentPlaceholder": {
-			  "u-icon": "view",
-			  "u-image": "view",
-			  "u-tag": "view",
-			  "u-button": "view",
-			  "u-popup": "view",
-			  "u-radio-group": "view",
-			  "u-radio": "view",
-			  "u-toast": "view",
-			  "u-modal": "view"
-			}
+            "componentPlaceholder": {
+              "u-icon": "view",
+              "u-image": "view",
+              "u-tag": "view",
+              "u-button": "view",
+              "u-popup": "view",
+              "u-radio-group": "view",
+              "u-radio": "view",
+              "u-toast": "view",
+              "u-modal": "view"
+            }
           }
         },
         {
@@ -1554,23 +1582,23 @@
           "path": "evaluate/evaluateDetail",
           "style": {
             "navigationBarTitleText": "璇勪环璇︽儏",
-			"componentPlaceholder": {
-			  "u-image": "view"
-			}
+            "componentPlaceholder": {
+              "u-image": "view"
+            }
           }
         },
         {
           "path": "evaluate/releaseEvaluate",
           "style": {
             "navigationBarTitleText": "鍙戝竷璇勪环",
-		  "componentPlaceholder": {
-		    "u-icon": "view",
-		    "u-image": "view",
-		    "u-input": "view",
-		    "u-upload": "view",
-		    "u-rate": "view",
-		    "u-toast": "view"
-		  }
+            "componentPlaceholder": {
+              "u-icon": "view",
+              "u-image": "view",
+              "u-input": "view",
+              "u-upload": "view",
+              "u-rate": "view",
+              "u-toast": "view"
+            }
           }
         },
         {
@@ -1626,10 +1654,10 @@
           "path": "afterSales/afterSalesSelect",
           "style": {
             "navigationBarTitleText": "鐢宠鍞悗",
-			"componentPlaceholder": {
-			  "u-image": "view",
-			  "u-icon": "view"
-			}
+            "componentPlaceholder": {
+              "u-image": "view",
+              "u-icon": "view"
+            }
           }
         },
         {
@@ -1672,7 +1700,6 @@
     },
     {
       "root": "pages/health",
-	   
       "pages": [
         {
           "path": "healthVideo",
@@ -1685,7 +1712,6 @@
     },
     {
       "root": "pages/tabbar/home",
-	   
       "pages": [
         {
           "path": "web-view",
@@ -1695,7 +1721,6 @@
     },
     {
       "root": "pages/kitchen",
-	   
       "pages": [
         {
           "path": "KitchenVideo",
@@ -1707,33 +1732,32 @@
         }
       ]
     },
-	{
-	  "root": "pages/subComponents",
-	  "pages": [{
-	  	"path" : "empty/empty",
-	  	"style" : 
-	  	{
-	  		"navigationBarTitleText" : "鍒嗗寘鍗犱綅"
-	  	}
-	  },{
-	  	"path" : "popups/popups",
-	  	"style" : 
-	  	{
-	  		"componentPlaceholder": {
-	  		  "u-modal": "view",
-	  		  "u-tabs": "view",
-	  		  "u-image": "view",
-	  		  "u-search": "view",
-	  		  "u-icon": "view",
-	  		  "u-loadmore": "view"
-	  		}
-	  	}
-	  }
-	  ]
-	},
+    {
+      "root": "pages/subComponents",
+      "pages": [
+        {
+          "path": "empty/empty",
+          "style": {
+            "navigationBarTitleText": "鍒嗗寘鍗犱綅"
+          }
+        },
+        {
+          "path": "popups/popups",
+          "style": {
+            "componentPlaceholder": {
+              "u-modal": "view",
+              "u-tabs": "view",
+              "u-image": "view",
+              "u-search": "view",
+              "u-icon": "view",
+              "u-loadmore": "view"
+            }
+          }
+        }
+      ]
+    },
     {
       "root": "pages/tabbar/user",
-	   
       "pages": [
         {
           "path": "my",
@@ -1752,7 +1776,6 @@
     },
     {
       "root": "pages/supplier/suppler-order",
-	   
       "pages": [
         {
           "path": "suppler-order",
@@ -1772,7 +1795,6 @@
     },
     {
       "root": "pages/supplier/publish-goods",
-	   
       "pages": [
         {
           "path": "publishGoods",
@@ -1801,7 +1823,6 @@
     },
     {
       "root": "pages/goods-manager",
-	   
       "pages": [
         {
           "path": "goodsList/goodsList",
@@ -1838,7 +1859,6 @@
     },
     {
       "root": "pages/news",
-	   
       "pages": [
         {
           "path": "news",
@@ -1855,8 +1875,7 @@
               "u-loading": "view",
               "u-navbar": "view",
               "u-loadmore": "view",
-			  "u-empty": "view"
-			  
+              "u-empty": "view"
             }
           }
         },
@@ -1882,7 +1901,6 @@
     },
     {
       "root": "pages/userPermissions",
-	   
       "pages": [
         {
           "path": "addStoreMember",
@@ -1929,7 +1947,6 @@
     },
     {
       "root": "pages/commodity-square",
-	   
       "pages": [
         {
           "path": "commoditySquare",
@@ -1952,7 +1969,6 @@
     },
     {
       "root": "pages/navigation",
-	   
       "pages": [
         {
           "path": "search/searchPage",
@@ -1981,7 +1997,6 @@
     },
     {
       "root": "pages/cusbar",
-	   
       "pages": [
         {
           "path": "special/special",
diff --git a/pages/cusbar/home/index.vue b/pages/cusbar/home/index.vue
new file mode 100644
index 0000000..aa8b37a
--- /dev/null
+++ b/pages/cusbar/home/index.vue
@@ -0,0 +1,43 @@
+<template>
+  <div class="wrapper">
+    <!-- 妤煎眰瑁呬慨缁勪欢 -->
+    <tpl ref="tpl" />
+  </div>
+</template>
+<script>
+import tpl from "@/pages/tabbar/home/views.vue";
+
+export default {
+  data() {
+    return {
+      background: {
+        backgroundColor: "#fff",
+      },
+    };
+  },
+  onShow(){
+    setTimeout(()=>{
+      this.$refs.tpl.fetchCoupon();
+    },1000)
+  },
+  methods: {
+
+  },
+  onReachBottom(){
+    // 缁欏瓙绾х洃鍚Е搴曞姞杞�
+    uni.$emit('onReachBottom',true)
+  },
+  
+  onPullDownRefresh() {
+    this.$refs.tpl.init();
+
+    uni.stopPullDownRefresh();
+  },
+  components: {
+    tpl,
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+</style>
diff --git a/pages/cusbar/home/template/advertising.scss b/pages/cusbar/home/template/advertising.scss
new file mode 100644
index 0000000..be5228c
--- /dev/null
+++ b/pages/cusbar/home/template/advertising.scss
@@ -0,0 +1,57 @@
+.position-box{
+    position: absolute;
+    right: 0;
+    bottom: 0;
+}
+.join-box {
+    display: flex;
+  }
+  .item-price {
+    > span {
+      font-size: 15px;
+      font-weight: 500;
+      color: #e1212b;
+    }
+  }
+  .join-item {
+    flex: 1;
+  }
+  .item-img {
+    width: 75px;
+    height: 75px;
+    margin: 0 auto;
+    display: block;
+  }
+  .item-img-box {
+    position: relative;
+  }
+  .item-line-through {
+    > span {
+      font-size: 10px;
+      font-weight: 400;
+      text-decoration: line-through;
+      color: #999;
+    }
+  }
+  .item-position-tips {
+    position: absolute;
+    right: 0;
+    color: #fff;
+    font-size: 12px;
+    bottom: 0;
+  }
+  .join-title {
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    background: #fff;
+    height: 50px;
+    > div:nth-of-type(1) {
+      font-size: 16px;
+      font-weight: bold;
+    }
+    > div:nth-of-type(2) {
+      font-size: 12px;
+      color: #999;
+    }
+  }
\ No newline at end of file
diff --git a/pages/cusbar/home/template/fetch_coupon.vue b/pages/cusbar/home/template/fetch_coupon.vue
new file mode 100644
index 0000000..7058fd8
--- /dev/null
+++ b/pages/cusbar/home/template/fetch_coupon.vue
@@ -0,0 +1,172 @@
+<template>
+  <div>
+    <u-popup v-model="enableShowCoupon" mode="center" width="550rpx" height="400px">
+      <view style="height: 130rpx">
+        <view
+          style="
+            width: 200rpx;
+            height: 120rpx;
+            float: left;
+            line-height: 120rpx;
+            font-size: 35rpx;
+            color: #28a4f2;
+            font-weight: 600;
+            margin-left: 20rpx;
+          "
+          >浼樻儬鍒告椿鍔�</view
+        >
+        <view style="width: 120rpx; height: 120rpx; float: right">
+          <image
+            @click="enableShowCoupon = false"
+            src="/static/cpauto1.png"
+            style="width: 100%; height: 100%"
+          ></image>
+        </view>
+      </view>
+      <scroll-view scroll-y="true" style="height: 620rpx">
+        <!-- {{coupList}} -->
+        <view v-for="(item, index) in coupList" :key="index">
+          <view class="grad1">
+            <view style="float: right">
+              <view v-if="item.couponType == 'DISCOUNT'"
+                >{{ item.discount }}鎶�</view
+              >
+              <view v-else
+                >浼樻儬閲戦锛�<span style="color: red; font-size: 32rpx">{{
+                  item.price | unitPrice
+                }}</span
+                >鍏�</view
+              >
+              <view
+                >婊�<span style="color: red; font-size: 32rpx"
+                  >{{ item.consumeThreshold | unitPrice }}鍏�</span
+                >鍙敤</view
+              >
+              <view v-if="item.scopeType == 'ALL' && item.storeId == '0'"
+                >鍏ㄥ钩鍙�</view
+              >
+              <view v-if="item.scopeType == 'PORTION_GOODS_CATEGORY'"
+                >浠呴檺鍝佺被</view
+              >
+              <view v-else
+                >{{
+                  item.storeName == "platform"
+                    ? "鍏ㄥ钩鍙�"
+                    : item.storeName + "搴楅摵"
+                }}浣跨敤
+              </view>
+              <view v-if="item.endTime"
+                >鏈夋晥鏈熻嚦锛歿{ item.endTime.split(" ")[0] }}</view
+              >
+            </view>
+            <view
+              style="
+                color: white;
+                font-size: 28rpx;
+                font-weight: 500;
+                float: left;
+                writing-mode: vertical-rl;
+                flex: auto;
+                height: 100%;
+                display: flex;
+                flex-direction: column;
+                justify-content: center;
+                align-items: center;
+              "
+              @click="enableShowCoupon = false"
+            >
+              绔嬪嵆浣跨敤
+            </view>
+          </view>
+        </view>
+      </scroll-view>
+    </u-popup>
+  </div>
+</template>
+
+<script>
+import '@/components/uview-components/uview-ui'
+import { getAutoCoup } from "@/api/login";
+import storage from "@/utils/storage.js";
+export default {
+  data() {
+    return {
+      storage,
+      enableShowCoupon: false,
+      coupList:[]
+    };
+  },
+  mounted() {
+    this.firstGetAuto();
+  },
+  methods: {
+    firstGetAuto() {
+      if(!this.$options.filters.isLogin('auth')) return false
+      let data = new Date();
+      let now = data.getDate();
+      let hours = data.getHours();
+      let flagCoup = storage.getAutoCp();
+      if (
+        storage.getAutoCp() &&
+        storage.getAutoCp() != "" &&
+        storage.getAutoCp() != undefined &&
+        storage.getAutoCp() != null
+      ) {
+        if (Number(now) > Number(flagCoup)) {
+          if (Number(hours) >= 6) {
+            storage.setAutoCp(now);
+            this.getAutoCp();
+          }
+        }
+      } else {
+        this.getAutoCp();
+      }
+    },
+    getAutoCp() {
+      let data = new Date();
+      let now = data.getDate();
+      getAutoCoup().then((res) => {
+        console.log(res);
+        if (res.data.success) {
+          this.coupList.push(...res.data.result);
+          if (this.coupList != "") {
+            this.enableShowCoupon = true;
+          } else {
+            this.enableShowCoupon = false;
+          }
+          storage.setAutoCp(now);
+          let objs = {};
+          this.coupList = this.coupList.reduce((cur, next) => {
+            //瀵硅薄鍘婚噸
+            if (next.id != undefined) {
+              objs[next.id] ? "" : (objs[next.id] = true && cur.push(next));
+            }
+            return cur;
+          }, []);
+        }
+      });
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.grad1 {
+  width: 500rpx;
+  height: 200rpx;
+  background: radial-gradient(circle at right top, transparent 20rpx, #ff6b35 0)
+      top left / 120rpx 51% no-repeat,
+    radial-gradient(circle at right bottom, transparent 20rpx, #ff6b35 0) bottom
+      left / 120rpx 51% no-repeat,
+    radial-gradient(circle at left top, transparent 20rpx, #ffffff 0) top right /
+      380rpx 51% no-repeat,
+    radial-gradient(circle at left bottom, transparent 20rpx, #ffffff 0) bottom
+      right / 380rpx 51% no-repeat;
+  filter: drop-shadow(6rpx 6rpx 6rpx rgba(0, 0, 0, 0.3));
+  margin: 30rpx auto;
+  padding-top: 2rpx;
+  padding-bottom: 10rpx;
+  padding-left: 38rpx;
+  padding-right: 30rpx;
+}
+</style>
diff --git a/pages/cusbar/home/template/tpl.js b/pages/cusbar/home/template/tpl.js
new file mode 100644
index 0000000..5701e89
--- /dev/null
+++ b/pages/cusbar/home/template/tpl.js
@@ -0,0 +1,208 @@
+/** 閰嶇疆妤煎眰妯″潡鐨勮烦杞� */
+export function modelNavigateTo(item) {
+	let val = item.url || item;
+	//閾炬帴璺宠浆鍒颁笓棰�
+
+	if (val && val.id && val.pageType == "special") {
+		uni.navigateTo({
+			url: `/pages/tabbar/special/special?id=${val.id}`,
+		});
+	}
+	switch (val.___type || val.type) {
+		case "goods":
+			uni.navigateTo({
+				url: "/pages/product/goods?id=" + val.id + "&goodsId=" + val.goodsId,
+			});
+			break;
+		case "category":
+			if (val.id) {
+				uni.navigateTo({
+					url: `/pages/navigation/search/searchPage?category=${val.id}`,
+				});
+			} else {
+				uni.navigateTo({
+					url: `/pages/navigation/search/searchPage`,
+				});
+			}
+			break;
+		case "shops":
+			uni.navigateTo({
+				url: `/pages/product/shopPage?id=${val.id}`,
+			});
+			break;
+			// 娲诲姩
+		case "marketing":
+			uni.navigateTo({
+				url: "/pages/product/goods?id=" + val.skuId + "&goodsId=" + val.goodsId,
+			});
+			break;
+		case "pages":
+			uni.navigateTo({
+				url: val.___path + "?id=" + val.id + "&title=" + val.title,
+			});
+			break;
+		case "other":
+			switch (val.title || item.title) {
+				case "棣栭〉":
+					uni.switchTab({
+						url: `/pages/tabbar/home/index`,
+					});
+					break;
+				case "璐墿杞�":
+					uni.switchTab({
+						url: `/pages/tabbar/cart/cartList`,
+					});
+					return;
+				case "涓汉涓績":
+					uni.switchTab({
+						url: `/pages/tabbar/user/my`,
+					});
+					break;
+				case "鏀惰棌鍟嗗搧":
+					uni.navigateTo({
+						url: `/pages/mine/myCollect`,
+					});
+					break;
+				case "鎴戠殑璁㈠崟":
+					uni.navigateTo({
+						url: `/pages/order/myOrder?status=0`,
+					});
+					break;
+				case "棰嗗埜涓績":
+					uni.navigateTo({
+						url: `/pages/cart/coupon/couponCenter`,
+					});
+					break;
+				case "绛惧埌":
+					uni.navigateTo({
+						url: `/pages/mine/signIn`,
+					});
+					break;
+				case "绉掓潃棰戦亾":
+					uni.navigateTo({
+						url: `/pages/promotion/seckill`,
+					});
+					break;
+				case "鎷煎洟棰戦亾":
+					uni.navigateTo({
+						url: `/pages/promotion/joinGroup`,
+					});
+					break;
+				case "灏忕▼搴忕洿鎾�":
+					uni.navigateTo({
+						url: `/pages/promotion/lives`,
+					});
+					break;
+				case "鐮嶄环":
+					uni.navigateTo({
+						url: `/pages/promotion/bargain/list`,
+					});
+					break;
+				case "绉垎鍟嗗煄":
+					uni.navigateTo({
+						url: `/pages/promotion/point/pointList`,
+					});
+					break;
+				case "搴楅摵鍒楄〃":
+					uni.navigateTo({
+						url: `/pages/product/shopList`,
+					});
+					break;
+				default:
+					// #ifdef H5
+					window.location.href = val.url || item.link;
+					// #endif
+					// #ifdef APP-PLUS
+					plus.runtime.openURL(val.url || item.link) //涓嶉渶瑕佹嫾鎺
+					// #endif
+					break;
+			}
+
+			break;
+	}
+}
+
+
+	
+
+import config from "@/config/config";
+
+async function scan() {
+  // #ifdef APP-PLUS
+  let isIos = plus.os.name == "iOS";
+  // 鍒ゆ柇鏄惁鏄疘os
+  if (isIos) {
+    const iosFirstCamera = uni.getStorageSync("iosFirstCamera"); //鏄笉鏄涓�娆″紑鍚浉鏈�
+    if (iosFirstCamera !== "false") {
+      uni.setStorageSync("iosFirstCamera", "false"); //璁句负false灏变唬琛ㄤ笉鏄涓�娆″紑鍚浉鏈�
+      seacnCode();
+    } else {
+      if (permision.judgeIosPermission("camera")) {
+        seacnCode();
+      } else {
+        // 娌℃湁鏉冮檺鎻愰啋鏄惁鍘荤敵璇锋潈闄�
+        tipsGetSettings();
+      }
+    }
+  } else {
+    /**
+     * TODO 瀹夊崜 鏉冮檺宸茬粡鎺堟潈浜嗭紝璋冪敤api鎬绘槸鏄剧ず鐢ㄦ埛宸叉案涔呮嫆缁濈敵璇枫�備汉鍌讳簡
+     * TODO 濡傛灉xdm鏈夋洿濂界殑鍔炴硶璇峰湪 https://gitee.com/beijing_hongye_huicheng/lilishop/issues 鎻愪笅璋㈣阿
+     */
+    seacnCode();
+  }
+
+  // #endif
+
+  // #ifdef MP-WEIXIN
+  seacnCode();
+  // #endif
+}
+/**
+ * 鎻愮ず鑾峰彇鏉冮檺
+ */
+function tipsGetSettings() {
+  uni.showModal({
+    title: "鎻愮ず",
+    content: "鎮ㄥ凡缁忓叧闂浉鏈烘潈闄�,鍘昏缃�",
+    success: function (res) {
+      if (res.confirm) {
+        if (isIos) {
+          plus.runtime.openURL("app-settings:");
+        } else {
+          permision.gotoAppPermissionSetting();
+        }
+      }
+    },
+  });
+}
+
+function seacnCode() {
+  uni.scanCode({
+    success: function (res) {
+      let path = encodeURIComponent(res.result);
+
+      // WX_CODE 涓哄皬绋嬪簭鐮�
+      if (res.scanType == "WX_CODE") {
+        console.log(res);
+        uni.navigateTo({
+          url: `/${res.path}`,
+        });
+      } else {
+        config.scanAuthNavigation.forEach((src) => {
+          if (res.result.indexOf(src) != -1) {
+            uni.navigateTo({
+              url: `/${res.result.substring(src.length)}`,
+            });
+          } else {
+            setTimeout(() => {
+              uni.navigateTo({
+                url: "/pages/tabbar/home/web-view?src=" + path,
+              });
+            }, 100);
+          }
+        });
+      }
+    },
+  });
+	}
\ No newline at end of file
diff --git a/pages/cusbar/home/template/tpl.scss b/pages/cusbar/home/template/tpl.scss
new file mode 100644
index 0000000..a9702fb
--- /dev/null
+++ b/pages/cusbar/home/template/tpl.scss
@@ -0,0 +1,32 @@
+.image-mode {
+   width: 100%;
+   height: 100%;
+    display: block;
+    padding: 2rpx;
+}
+.layout {
+    padding: 16rpx;
+    margin: 8rpx 0;
+    background: #fff;
+}
+.layout,
+.view-height-75,
+.view-height-150 {
+    overflow: hidden;
+}
+.view-width-100 {
+    width: 100%;
+}
+.view-height-75 {
+    // height: 150rpx;
+}
+.view-height-150 {
+    // height: 300rpx;
+    flex: 1;
+}
+
+.view-height-85 {
+    height: 170rpx;
+    flex: 1;
+}
+
diff --git a/pages/cusbar/home/template/tpl_banner.vue b/pages/cusbar/home/template/tpl_banner.vue
new file mode 100644
index 0000000..1442865
--- /dev/null
+++ b/pages/cusbar/home/template/tpl_banner.vue
@@ -0,0 +1,38 @@
+<template>
+  <div class="layout">
+    <div class="box">
+      <u-swiper @click="clickSwiper" interval="5000" duration="500" height="350" v-if="res" name="img" :list="res.list">
+        <u-loading slot="loading"></u-loading>
+      </u-swiper>
+    </div>
+  </div>
+</template>
+
+<script>
+import '@/components/uview-components/uview-ui'
+import { modelNavigateTo } from "./tpl";
+export default {
+  title: "瀵艰埅鏍�",
+  props: ["res"],
+  watch: {
+    res: {
+      handler(newValue, oldValue) {
+        this.$set(this, "res", newValue);
+      },
+      deep: true,
+    },
+  },
+
+  mounted() {
+   
+  },
+  methods: {
+    clickSwiper(index) {
+      modelNavigateTo(this.res.list[index]);
+    },
+  },
+};
+</script>
+<style lang="scss" scoped>
+@import "./tpl.scss";
+</style>
diff --git a/pages/cusbar/home/template/tpl_flex_five.vue b/pages/cusbar/home/template/tpl_flex_five.vue
new file mode 100644
index 0000000..c7618ab
--- /dev/null
+++ b/pages/cusbar/home/template/tpl_flex_five.vue
@@ -0,0 +1,32 @@
+
+<template>
+  <div class="layout">
+    <u-image width="140rpx" mode="aspectFit" height="140rpx" @click="modelNavigateTo(item)" class="image-mode" v-for="(item,index) in res.list" :key="index" :src="item.img" alt="">
+      <u-loading slot="loading"></u-loading>
+    </u-image>
+  </div>
+</template>
+
+<script>
+import '@/components/uview-components/uview-ui'
+import { modelNavigateTo } from "./tpl";
+export default {
+  title: "浜斿垪鍗曡鍥剧墖妯″潡",
+  props: ["res"],
+  data() {
+    return {
+      modelNavigateTo,
+    };
+  },
+  mounted() {},
+};
+</script>
+<style lang="scss" scoped>
+@import "./tpl.scss";
+.layout {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  background-size: cover;
+}
+</style>
\ No newline at end of file
diff --git a/pages/cusbar/home/template/tpl_flex_four.vue b/pages/cusbar/home/template/tpl_flex_four.vue
new file mode 100644
index 0000000..c802a92
--- /dev/null
+++ b/pages/cusbar/home/template/tpl_flex_four.vue
@@ -0,0 +1,36 @@
+
+<template>
+  <div class="layout">
+    <u-image height="175rpx" mode="aspectFit" width="175rpx" @click="modelNavigateTo(item)" class="image-mode" :src="item.img" v-for="(item,index) in res.list" :key="index">
+      <u-loading slot="loading"></u-loading>
+    </u-image>
+  </div>
+</template>
+
+<script>
+import '@/components/uview-components/uview-ui'
+import { modelNavigateTo } from "./tpl";
+export default {
+  title: "鍥涘垪鍗曡鍥剧墖妯″潡",
+  props: ["res"],
+  data() {
+    return {
+      modelNavigateTo,
+    };
+  },
+  mounted() {},
+};
+</script>
+<style lang="scss" scoped>
+@import "./tpl.scss";
+.layout {
+ 
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  background-size: cover;
+}
+img {
+  width: 84px;
+}
+</style>
\ No newline at end of file
diff --git a/pages/cusbar/home/template/tpl_flex_one.vue b/pages/cusbar/home/template/tpl_flex_one.vue
new file mode 100644
index 0000000..5c7ebc6
--- /dev/null
+++ b/pages/cusbar/home/template/tpl_flex_one.vue
@@ -0,0 +1,38 @@
+<template>
+  <div class="layout">
+    <div class="flex-one">
+      <u-image v-if="res.list[0].zoneInfo == ''" @click="modelNavigateTo(res.list[0])" width="100%" mode="aspectFit" height="280rpx" :src="res.list[0].img" alt=""></u-image>
+      <hotzone v-else :res="res"></hotzone>
+    </div>
+  </div>
+</template>
+<script>
+import '@/components/uview-components/uview-ui'
+import { modelNavigateTo } from "./tpl";
+import hotzone from "@/pages/tabbar/home/template/tpl_hot_zone.vue";
+
+export default {
+  title: "鍗曡鍥剧墖妯″潡",
+  components: {
+    hotzone,
+  },
+  data() {
+    return {
+      modelNavigateTo
+    };
+  },
+  props: ["res"],
+};
+</script>
+<style lang="scss" scoped>
+@import "./tpl.scss";
+.flex-one {
+  width: 100%;
+  display: block;
+  overflow: hidden;
+  > img {
+    width: 100%;
+    height: 100%;
+  }
+}
+</style>
\ No newline at end of file
diff --git a/pages/cusbar/home/template/tpl_flex_three.vue b/pages/cusbar/home/template/tpl_flex_three.vue
new file mode 100644
index 0000000..65831e1
--- /dev/null
+++ b/pages/cusbar/home/template/tpl_flex_three.vue
@@ -0,0 +1,40 @@
+
+<template>
+  <div class="layout">
+    <u-image @click="modelNavigateTo(item)" height="240rpx" width="240rpx" class="image-mode" :src="item.img" v-for="(item, index) in res.list" :key="index">
+      <u-loading slot="loading"></u-loading>
+    </u-image>
+  </div>
+</template>
+
+<script>
+import '@/components/uview-components/uview-ui'
+import { modelNavigateTo } from "./tpl";
+
+export default {
+  title: "涓夊垪鍗曡鍥剧墖妯″潡",
+  props: ["res"],
+  mounted() {
+   
+  },
+  data() {
+    return {
+      modelNavigateTo,
+    };
+  },
+};
+</script>
+<style lang="scss" scoped>
+@import "./tpl.scss";
+.layout {
+  padding: 0;
+
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  background-size: cover;
+}
+img {
+  width: 111px;
+}
+</style>
\ No newline at end of file
diff --git a/pages/cusbar/home/template/tpl_flex_two.vue b/pages/cusbar/home/template/tpl_flex_two.vue
new file mode 100644
index 0000000..296dc35
--- /dev/null
+++ b/pages/cusbar/home/template/tpl_flex_two.vue
@@ -0,0 +1,49 @@
+<template>
+  <div class="layout">
+    <div class="flex-two">
+      <div class="flex-item" @click="modelNavigateTo(res.list[0])">
+        <u-image height="250rpx" width="100%" mode="scaleToFill" :src="res.list[0].img" alt>
+          <u-loading slot="loading"></u-loading>
+        </u-image>
+      </div>
+      <div class="flex-item" @click="modelNavigateTo(res.list[1])">
+        <u-image height="250rpx" width="100%" mode="scaleToFill" :src="res.list[1].img" alt>
+          <u-loading slot="loading"></u-loading>
+        </u-image>
+      </div>
+    </div>
+  </div>
+</template>
+<script>
+import '@/components/uview-components/uview-ui'
+
+import { modelNavigateTo } from "./tpl";
+export default {
+  title: "涓ゅ紶妯浘",
+  props: ["res"],
+  mounted() {
+   
+  },
+  data() {
+    return {
+      modelNavigateTo,
+    };
+  },
+};
+</script>
+<style lang="scss" scoped>
+@import "./tpl.scss";
+.flex-two {
+  width: 100%;
+  display: flex;
+  overflow: hidden;
+}
+.flex-item {
+  width: 50%;
+  > img {
+    display: block;
+    max-width: 100%;
+    height: 100%;
+  }
+}
+</style>
\ No newline at end of file
diff --git a/pages/cusbar/home/template/tpl_goods.vue b/pages/cusbar/home/template/tpl_goods.vue
new file mode 100644
index 0000000..768e44a
--- /dev/null
+++ b/pages/cusbar/home/template/tpl_goods.vue
@@ -0,0 +1,263 @@
+<template>
+  <div class="layout">
+    <u-sticky>
+      <div class="goods-cell-title">
+        <div
+          class="goods-item-title"
+          :class="{ 'selected-title': selected.index == index }"
+          @click="handleClickTitle(title, index)"
+          v-for="(title, index) in res.list[0].titleWay"
+          :key="index"
+        >
+          <h4 class="h4">{{ title.title }}</h4>
+          <div>{{ title.desc }}</div>
+        </div>
+      </div>
+    </u-sticky>
+    <div class="goods-list">
+      <div
+        v-if="
+          item.___index != undefined
+            ? selected.index == item.___index
+            : selected.val == item.type
+        "
+        @click="handleClick(item)"
+        class="goods-item"
+        v-for="(item, item_index) in res.list[0].listWay"
+        :key="item_index"
+      >
+        <div class="goods-img">
+          <u-image
+            :src="item.img"
+            height="350rpx"
+            mode="aspectFit"
+            width="100%"
+          >
+            <u-loading slot="loading"></u-loading>
+          </u-image>
+        </div>
+        <div class="goods-desc">
+          <div class="goods-title">
+            {{ item.title }}
+          </div>
+          <div class="goods-bottom">
+            <div class="goods-price">
+              楼<span
+                >{{ $options.filters.goodsFormatPrice(item.price)[0] }} </span
+              >.{{ $options.filters.goodsFormatPrice(item.price)[1] }}
+            </div>
+          </div>
+        </div>
+      </div>
+
+      <div
+        v-if="res.list[0].titleWay[selected.index].bindCategory && goodsData.length"
+        v-for="(item, index) in goodsData"
+        :key="index"
+        class="goods-item"
+        @click="handleClick(item)"
+      >
+        <div class="goods-img">
+          <u-image
+            :src="item.thumbnail"
+            height="350rpx"
+            mode="aspectFit"
+            width="100%"
+          >
+            <u-loading slot="loading"></u-loading>
+          </u-image>
+        </div>
+        <div class="goods-desc">
+          <div class="goods-title">
+            {{ item.goodsName }}
+          </div>
+          <div class="goods-bottom">
+            <div class="goods-price">
+              楼<span
+                >{{ $options.filters.goodsFormatPrice(item.price)[0] }} </span
+              >.{{ $options.filters.goodsFormatPrice(item.price)[1] }}
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+<script>
+import '@/components/uview-components/uview-ui'
+import { getGoodsList } from "@/api/goods.js";
+export default {
+  title: "鍟嗗搧鍒嗙被浠ュ強鍟嗗搧",
+  data() {
+    return {
+      selected: {
+        index: 0,
+        val: "",
+      },
+      params: {
+        pageNumber: 1,
+        pageSize: 100,
+        categoryId: "",
+      },
+      goodsData: [], //鍟嗗搧寰幆鍐呭
+      goodsResult:"", //es鎬昏繑鍥炲唴瀹�
+    };
+  },
+  props: ["res","enableBottomLoad"],
+  watch: {
+    res: {
+      handler(val) {
+        // 鐩戝惉鐖剁骇鐨勫�� 濡傛灉鏈夊�煎皢鍊艰祴缁檚elected
+        if (val) {
+          console.log(val)
+          // 濡傛灉绗竴涓爣绛鹃〉缁戝畾涓哄晢鍝�
+          this.selected.val = this.res.list[0].listWay[0] ? this.res.list[0].listWay[0].type: '';
+          // 濡傛灉绗竴涓爣绛句负缁戝畾涓哄垎绫�
+          this.res.list[0].titleWay[0].bindCategory ? this.initGoods(this.res.list[0].titleWay[0]) : ''
+        }
+      },
+      immediate: true,
+    },
+  },
+  mounted() {
+    uni.$on('onReachBottom',()=>{
+      if(this.enableBottomLoad && this.goodsResult.totalElements >= this.params.pageNumber * this.params.pageSize){
+        this.params.pageNumber++
+        this.initGoods(this.res.list[0].titleWay[this.selected.index])
+      }
+      
+    })
+  },
+  destroyed(){
+    uni.$off('onReachBottom')
+  },
+  methods: {
+    handleClick(item) {
+      uni.navigateTo({
+        url: `/pages/product/goods?id=${item.id}&goodsId=${item.goodsId}`,
+      });
+    },
+    closeGoods(val, index) {
+      this.res.list[0].listWay.splice(index, 1);
+    },
+    async initGoods(val) {
+      if(this.enableBottomLoad) this.params.pageSize = 20
+      val ? this.params.categoryId = val.bindCategory.id : '';
+      const res = await getGoodsList(this.params);
+      if (res.data.success) {
+        this.goodsResult = res.data.result
+        const result = res.data.result.records
+        this.goodsData.push(...result);
+        console.log(this.goodsData)
+      }
+    },
+    handleClickTitle(val, index) {
+      this.selected.index = index;
+      this.selected.val = val.title;
+      if (val.bindCategory) {
+        this.params.pageNumber = 1
+        this.goodsData = []
+        this.initGoods(val);
+      }
+    },
+  },
+};
+</script>
+<style lang="scss" scoped>
+$w_94: 94%;
+
+.layout {
+  padding: 8px 0;
+  background: #f9f9f9;
+}
+
+.selected-title {
+  > h4 {
+    font-size: 30rpx;
+    color: #000 !important;
+  }
+
+  > div {
+    font-weight: bold;
+    color: $main-color !important;
+  }
+}
+
+.goods-cell-title {
+  background: #f9f9f9;
+  padding: 10px;
+  transition: 0.35s;
+  display: flex;
+
+  > .goods-item-title {
+    flex: 1;
+    text-align: center;
+
+    > h4 {
+      font-size: 32rpx;
+    }
+
+    > div {
+      color: #999;
+      font-size: 24rpx;
+    }
+  }
+}
+
+.goods-list {
+  width: 100%;
+  display: flex;
+  flex-wrap: wrap;
+}
+
+.goods-item {
+  width: 50%;
+  margin-bottom: 10px;
+  border-radius: 0.4em;
+  overflow: hidden;
+}
+
+.goods-img {
+  position: relative;
+  margin: 0 auto;
+  // width: 158px;
+  width: $w_94;
+  border-top-left-radius: 20rpx;
+  border-top-right-radius: 20rpx;
+  overflow: hidden;
+  > img {
+    width: 100%;
+    height: 100%;
+  }
+}
+
+.goods-desc {
+  border-bottom-left-radius: 20rpx;
+  border-bottom-right-radius: 20rpx;
+  width: $w_94;
+  background: #fff;
+  padding: 8rpx 0 8rpx 8rpx;
+  margin: 0 auto;
+  > .goods-title {
+    font-size: 24rpx;
+    height: 67rpx;
+    display: -webkit-box;
+    font-weight: 500;
+    -webkit-box-orient: vertical;
+    -webkit-line-clamp: 2;
+    overflow: hidden;
+  }
+
+  > .goods-bottom {
+    display: flex;
+    font-weight: bold;
+    > .goods-price {
+      line-height: 2;
+      color: $main-color;
+      > span {
+        font-size: 42rpx;
+      }
+    }
+  }
+}
+</style>
diff --git a/pages/cusbar/home/template/tpl_group.vue b/pages/cusbar/home/template/tpl_group.vue
new file mode 100644
index 0000000..b234a80
--- /dev/null
+++ b/pages/cusbar/home/template/tpl_group.vue
@@ -0,0 +1,40 @@
+<template>
+  <div class="layout">
+    <div class="join-list">
+      <div class="join-title">
+        <div>{{ res.list[0].title }}</div>
+        <div>鏇村</div>
+      </div>
+      <div class="join-box">
+        <div class="join-item" @click="modelNavigateTo(item)" v-for="item in 4" :key="item">
+          <div class="item-img-box">
+            <img class="item-img" src="https://picsum.photos/id/268/200/200" alt />
+          </div>
+          <div class="item-price">
+            <span>锟�120.00</span>
+          </div>
+          <div class="item-line-through">
+            <span>锟�190.00</span>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+<script>
+// TODO 鍚庣画鐗堟湰寮�鍙戞鍔熻兘 灏芥儏鏈熷緟
+import { modelNavigateTo } from "./tpl";
+export default {
+  props: ["res"],
+  title: "鎷煎洟",
+  data() {
+    return {
+      modelNavigateTo,
+    };
+  },
+};
+</script>
+<style lang="scss" scoped>
+@import "./tpl.scss";
+@import "./advertising.scss";
+</style>
\ No newline at end of file
diff --git a/pages/cusbar/home/template/tpl_hot_zone.vue b/pages/cusbar/home/template/tpl_hot_zone.vue
new file mode 100644
index 0000000..ba51470
--- /dev/null
+++ b/pages/cusbar/home/template/tpl_hot_zone.vue
@@ -0,0 +1,57 @@
+<template>
+  <div class="layout">
+    <div class="flex-one hot-image">
+      <image mode="widthFix" :src="res.list[0].img" alt=""></image>
+
+      <image
+        v-for="(area, index) in res.list[0].zoneInfo"
+				:key="index"
+        @click="modelNavigateTo(area)"
+        mode="widthFix"
+        class="hot-area"
+        :style="{
+          left: area.leftPer * 100 + '%',
+          top: area.topPer * 100 + '%',
+          width: area.widthPer * 100 + '%',
+          height: area.heightPer * 100 + '%',
+        }"
+        :src="area.img"
+        alt=""
+      ></image>
+    </div>
+  </div>
+</template>
+<script>
+import { modelNavigateTo } from "./tpl";
+
+export default {
+  title: "鐑尯妯″潡",
+  data() {
+    return {
+      modelNavigateTo,
+    };
+  },
+  props: ["res"],
+};
+</script>
+<style lang="scss" scoped>
+@import "./tpl.scss";
+.hot-image {
+  position: relative;
+}
+.hot-area {
+  position: absolute;
+  z-index: 99;
+}
+.flex-one {
+  width: 100%;
+  display: block;
+  overflow: hidden;
+  image {
+    width: 100%;
+   
+    min-height: 200rpx;
+    // height: 100%;
+  }
+}
+</style>
diff --git a/pages/cusbar/home/template/tpl_integral.vue b/pages/cusbar/home/template/tpl_integral.vue
new file mode 100644
index 0000000..8f73a78
--- /dev/null
+++ b/pages/cusbar/home/template/tpl_integral.vue
@@ -0,0 +1,85 @@
+<template>
+  <div class="layout">
+    <div class="join-list">
+      <div class="join-title">
+        <div>{{ res.list[0].title }}</div>
+        <div>鏇村</div>
+      </div>
+      <div class="join-box">
+        <div class="join-item" v-for="item in 4" :key="item">
+          <div class="item-img-box">
+            <img class="item-img" src="https://picsum.photos/id/268/200/200" alt />
+          </div>
+          <div class="item-price">
+            <span>20绉垎</span>
+          </div>
+          <div class="item-line-through">
+            <span>30绉垎</span>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+<script>
+// TODO 鍚庣画鐗堟湰寮�鍙戞鍔熻兘 灏芥儏鏈熷緟
+export default {
+  title:"绉垎鍟嗗搧",
+  props: ["res"],
+};
+</script>
+<style lang="scss" scoped>
+@import "./tpl.scss";
+.join-box {
+  display: flex;
+}
+.item-price {
+  > span {
+    font-size: 15px;
+    font-weight: 500;
+    color: #e1212b;
+  }
+}
+.join-item {
+  flex: 1;
+}
+.item-img {
+  width: 75px;
+  height: 75px;
+  margin: 0 auto;
+  display: block;
+}
+.item-img-box {
+  position: relative;
+}
+.item-line-through {
+  > span {
+    font-size: 10px;
+    font-weight: 400;
+    text-decoration: line-through;
+    color: #999;
+  }
+}
+.item-position-tips {
+  position: absolute;
+  right: 0;
+  color: #fff;
+  font-size: 12px;
+  bottom: 0;
+}
+.join-title {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  background: #fff;
+  height: 50px;
+  > div:nth-of-type(1) {
+    font-size: 16px;
+    font-weight: bold;
+  }
+  > div:nth-of-type(2) {
+    font-size: 12px;
+    color: #999;
+  }
+}
+</style>
\ No newline at end of file
diff --git a/pages/cusbar/home/template/tpl_join_group.vue b/pages/cusbar/home/template/tpl_join_group.vue
new file mode 100644
index 0000000..9309331
--- /dev/null
+++ b/pages/cusbar/home/template/tpl_join_group.vue
@@ -0,0 +1,90 @@
+<template>
+  <div class="layout">
+    <div class="join-list">
+      <div class="join-title">
+        <div>{{ res.list[0].title }}</div>
+        <div>鏇村</div>
+      </div>
+      <div class="join-box">
+        <div class="join-item" v-for="item in 4" :key="item">
+          <div class="item-img-box">
+            <img
+              class="item-img"
+              src="https://picsum.photos/id/268/200/200"
+              alt
+            />
+            <div class="item-position-tips">2浜哄洟</div>
+          </div>
+          <div class="item-price">
+            <span>锟�120.00</span>
+          </div>
+          <div class="item-line-through">
+            <span>锟�120.00</span>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+<script>
+// TODO 鍚庣画鐗堟湰寮�鍙戞鍔熻兘 灏芥儏鏈熷緟
+export default {
+  props: ["res"],
+  title:"鍥㈣喘"
+};
+</script>
+<style lang="scss" scoped>
+@import "./tpl.scss";
+.join-box {
+  display: flex;
+}
+.item-price {
+  > span {
+    font-size: 15px;
+    font-weight: 500;
+    color: #e1212b;
+  }
+}
+.join-item {
+  flex: 1;
+}
+.item-img {
+  width: 75px;
+  height: 75px;
+  margin: 0 auto;
+  display: block;
+}
+.item-img-box {
+  position: relative;
+}
+.item-line-through {
+  > span {
+    font-size: 10px;
+    font-weight: 400;
+    text-decoration: line-through;
+    color: #999;
+  }
+}
+.item-position-tips {
+  position: absolute;
+  right: 0;
+  color: #fff;
+  font-size: 12px;
+  bottom: 0;
+}
+.join-title {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  background: #fff;
+  height: 50px;
+  > div:nth-of-type(1) {
+    font-size: 16px;
+    font-weight: bold;
+  }
+  > div:nth-of-type(2) {
+    font-size: 12px;
+    color: #999;
+  }
+}
+</style>
\ No newline at end of file
diff --git a/pages/cusbar/home/template/tpl_left_one_right_two.vue b/pages/cusbar/home/template/tpl_left_one_right_two.vue
new file mode 100644
index 0000000..5edeefd
--- /dev/null
+++ b/pages/cusbar/home/template/tpl_left_one_right_two.vue
@@ -0,0 +1,46 @@
+
+<template>
+  <div class="layout">
+    <div class="view-height-150" @click="modelNavigateTo(res.list[0])">
+      <u-image width="100%" height="340rpx" class="image-mode" :src="res.list[0].img">
+        <u-loading slot="loading"></u-loading>
+      </u-image>
+    </div>
+    <div class="view-height-150">
+      <div class="view-height-75" @click="modelNavigateTo(res.list[1])">
+        <u-image width="100%" height="170rpx" class="image-mode" :src="res.list[1].img" alt>
+          <u-loading slot="loading"></u-loading>
+        </u-image>
+      </div>
+      <div class="view-height-75" @click="modelNavigateTo(res.list[2])">
+        <u-image width="100%" height="170rpx" class="image-mode" :src="res.list[2].img" alt>
+          <u-loading slot="loading"></u-loading>
+        </u-image>
+      </div>
+    </div>
+  </div>
+</template>
+<script>
+import '@/components/uview-components/uview-ui'
+import { modelNavigateTo } from "./tpl";
+export default {
+  title: "宸︿竴鍙充簩",
+  props: ["res"],
+  data() {
+    return {
+      modelNavigateTo,
+    };
+  },
+  mounted() {},
+};
+</script>
+<style lang="scss" scoped>
+@import "./tpl.scss";
+.layout {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+
+  background-size: cover;
+}
+</style>
\ No newline at end of file
diff --git a/pages/cusbar/home/template/tpl_left_two_right_one.vue b/pages/cusbar/home/template/tpl_left_two_right_one.vue
new file mode 100644
index 0000000..94a57d0
--- /dev/null
+++ b/pages/cusbar/home/template/tpl_left_two_right_one.vue
@@ -0,0 +1,45 @@
+
+<template>
+  <div class="layout ">
+    <div class="view-height-150">
+      <div class="view-height-75"  @click="modelNavigateTo(res.list[0])">
+        <u-image class="image-mode"  width="100%" height="150rpx" :src="res.list[0].img" ></u-image>
+      </div>
+      <div class="view-height-75"  @click="modelNavigateTo(res.list[1])">
+        <u-image class="image-mode" width="100%" height="150rpx"  :src="res.list[1].img" ></u-image>
+      </div>
+    </div>
+    <div class="view-height-150"  @click="modelNavigateTo(res.list[2])">
+      <u-image class="image-mode"  width="100%" height="300rpx"  :src="res.list[2].img" ></u-image>
+    </div>
+  </div>
+</template>
+
+<script>
+import '@/components/uview-components/uview-ui'
+import {modelNavigateTo} from './tpl'
+export default {
+  title: "宸︿簩鍙充竴",
+  props: ["res"],
+   data () {
+    return {
+      modelNavigateTo,
+    }
+  },
+  mounted() {
+   
+  }
+};
+</script>
+<style lang="scss" scoped>
+@import "./tpl.scss";
+.layout {
+  height: 300rpx;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+
+  background-size: cover;
+}
+
+</style>
\ No newline at end of file
diff --git a/pages/cusbar/home/template/tpl_menu.vue b/pages/cusbar/home/template/tpl_menu.vue
new file mode 100644
index 0000000..79a500c
--- /dev/null
+++ b/pages/cusbar/home/template/tpl_menu.vue
@@ -0,0 +1,62 @@
+<template>
+  <div class="layout">
+    <div class="menu-list">
+      <div
+        class="menu-item"
+        @click="modelNavigateTo(item)"
+        v-for="(item, index) in res.list"
+        :key="index"
+      >
+        <div>
+          <u-image
+            width="88rpx"
+            height="88rpx"
+            class="menu-img"
+            :src="item.img"
+          >
+            <u-loading slot="loading"></u-loading>
+          </u-image>
+        </div>
+        <div class="menu-title">{{ item.title }}</div>
+      </div>
+    </div>
+  </div>
+</template>
+<script>
+import '@/components/uview-components/uview-ui'
+import { modelNavigateTo } from "./tpl";
+export default {
+  title: "浜斿垪鑿滃崟",
+  props: ["res"],
+  data() {
+    return {
+      modelNavigateTo,
+    };
+  },
+};
+</script>
+<style lang="scss" scoped>
+@import "./tpl.scss";
+.menu-list {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  flex-wrap: wrap;
+
+  > .menu-item {
+    text-align: center;
+    width: 20%;
+    // flex: 1;
+    margin: 20rpx 0;
+  }
+}
+.menu-img {
+  display: flex;
+  margin: 0 auto;
+  width: 88rpx;
+  height: 88rpx;
+}
+.menu-title {
+  font-size: 24rpx;
+}
+</style>
\ No newline at end of file
diff --git a/pages/cusbar/home/template/tpl_notice.vue b/pages/cusbar/home/template/tpl_notice.vue
new file mode 100644
index 0000000..98d6466
--- /dev/null
+++ b/pages/cusbar/home/template/tpl_notice.vue
@@ -0,0 +1,50 @@
+<template>
+  <div class="layout">
+    <div class="background">
+      <u-notice-bar mode="vertical" :bg-color="res.list[0].bk_color" :color="res.list[0].color" :list="list"></u-notice-bar>
+    </div>
+  </div>
+</template>
+
+<script>
+import '@/components/uview-components/uview-ui'
+  export default {
+    title: "鍏憡",
+    props: ["res"],
+    data() {
+      return {
+        list: []
+      }
+    },
+    mounted() {
+      this.list = this.res.list[0].title.map(i => i.context);
+    },
+  };
+</script>
+<style lang="scss" scoped>
+  @import "./tpl.scss";
+  .background {
+    position: absolute;
+    z-index: 2;
+    width: 100%;
+    height: 84rpx;
+    text-align: left;
+    font-size: 20rpx;
+    background-size: cover;
+  }
+  .layout {
+    text-align: center;
+    position: relative;
+    height: 84rpx;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+
+    background: #ffffff;
+  }
+  .title {
+    line-height: 84rpx;
+    font-size: 20px;
+    font-weight: bold;
+  }
+</style>
diff --git a/pages/cusbar/home/template/tpl_promotions_detail.vue b/pages/cusbar/home/template/tpl_promotions_detail.vue
new file mode 100644
index 0000000..cb2e925
--- /dev/null
+++ b/pages/cusbar/home/template/tpl_promotions_detail.vue
@@ -0,0 +1,274 @@
+<template>
+  <div class="layout">
+    <div class="join-list">
+      <div
+        v-for="(item, index) in res.list"
+        :key="index"
+        class="join-list-item"
+        @click="goToDetail(item.type)"
+      >
+        <div>
+          <div class="join-title">
+            <div>{{ item.title }}</div>
+            <div
+              class="sub"
+              v-if="item.type !== 'SECKILL'"
+              :style="{
+                backgroundColor: item.bk_color,
+                color: item.color1,
+                borderColor: item.bk_color,
+              }"
+            >
+              {{ item.title1 }}
+            </div>
+            <div class="sub-seckill" v-else>
+              <div class="sub-seckill-block flex">
+                <div class="sub-seckill-block-text">
+                  {{ timeLine[0] ? timeLine[0].timeLine : "x" }}鐐瑰満
+                </div>
+                {{ times.hours == "00" ? "0" : times.hours }}:{{
+                  times.minutes
+                }}:{{ times.seconds }}
+              </div>
+            </div>
+          </div>
+          <div class="join-box">
+            <div
+              class="join-item"
+              v-for="(i, _index) in item.data"
+              :key="_index"
+            >
+              <div class="item-img-box">
+                <u-image
+                  class="item-img"
+                  width="156rpx"
+                  height="156rpx"
+                  :src="i.thumbnail ? i.thumbnail : i.goodsImage"
+                  alt
+                />
+              </div>
+              <div
+                class="ellipsis"
+                :class="{ 'max-width': res.list.length <= 1 }"
+              >
+                {{ i.goodsName ? i.goodsName : i.name }}
+              </div>
+              <div class="item-price">
+                <span>锟{ i.price ? i.price : i.originalPrice }}</span>
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+<script>
+import '@/components/uview-components/uview-ui'
+import * as API_Promotions from "@/api/promotions";
+import Foundation from "@/utils/Foundation.js";
+export default {
+  props: ["res"],
+  data() {
+    return {
+      timeLine: "", //鑾峰彇鍑犱釜鐐规椿鍔�
+      resTime: 0, //褰撳墠鏃堕棿
+      time: 0, //璺濈涓嬩竴涓椿鍔ㄧ殑鏃堕棿鍊�
+      times: {}, //鏃堕棿闆嗗悎
+      onlyOne: "", //鏄惁鏈�鍚庝竴涓晢鍝�
+    };
+  },
+  mounted() {
+    let params = {
+      pageNumber: 1,
+      pageSize: 2,
+      status: "START",
+      promotionStatus: "START",
+    };
+    this._setTimeInterval = setInterval(() => {
+      if (this.time <= 0) {
+        clearInterval(this._setTimeInterval);
+      } else {
+        this.times = Foundation.countTimeDown(this.time);
+        this.time--;
+      }
+    }, 1000);
+    this.res.list.forEach((ele) => {
+      switch (ele.type) {
+        case "PINTUAN":
+          API_Promotions.getAssembleList(params).then((response) => {
+            const data = response.data.result.records;
+            if (data) {
+              ele.data = data;
+            }
+          });
+          break;
+        case "SECKILL":
+          API_Promotions.getSeckillTimeLine().then((response) => {
+            if (response.data.success && response.data.result) {
+              ele.data = response.data.result[0].seckillGoodsList.slice(0, 2);
+              let timeLine = response.data.result.sort(
+                (x, y) => Number(x.timeLine) - Number(y.timeLine)
+              );
+              this.timeLine = timeLine.slice(0, 5);
+              this.resTime = parseInt(new Date().getTime() / 1000);
+              this.onlyOne = response.data.result.length === 1;
+              this.diffTime = parseInt(new Date().getTime() / 1000) - this.resTime;
+
+              this.time =
+                this.timeLine[0].distanceStartTime ||
+                (this.timeLine[1] && this.timeLine[1].distanceStartTime) ||
+                Foundation.theNextDayTime() - this.diffTime;
+              this.times = Foundation.countTimeDown(this.time);
+              console.log(this.timeLine);
+            }
+          });
+          break;
+        case "LIVE":
+          API_Promotions.getLiveList(params).then((response) => {
+            if (response.success && response.result.records) {
+              ele.data = response.result.records[0].commodityList.slice(0, 2);
+            }
+          });
+          break;
+        case "KANJIA":
+          API_Promotions.getBargainList(params).then((response) => {
+            if (response.success && response.result) {
+              ele.data = response.result.records(0, 2);
+            }
+          });
+          break;
+        default:
+          break;
+      }
+    });
+  },
+  methods: {
+    //璺宠浆璇︽儏
+    goToDetail(type) {
+      switch(type) {
+        case "SECKILL":
+          uni.navigateTo({
+            url: `/pages/promotion/seckill`,
+          });
+          break;
+        case "PINTUAN":
+          uni.navigateTo({
+            url: `/pages/promotion/joinGroup`,
+          });
+          break;
+        case "LIVE":
+          uni.navigateTo({
+            url: `/pages/promotion/lives`,
+          });
+          break;
+        case "KANJIA":
+          uni.navigateTo({
+            url: `/pages/promotion/bargain/list`,
+          });
+          break;
+      };
+    }
+  },
+};
+</script>
+<style lang="scss" scoped>
+@import "./tpl.scss";
+.join-box {
+  display: flex;
+}
+.join-list {
+  width: 100%;
+  display: flex;
+  overflow: hidden;
+}
+.join-list-item {
+  flex: 1;
+}
+.ellipsis {
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+  width: 108rpx; // 澶т簬1涓椿鍔�
+  font-size: 22rpx;
+}
+.max-width {
+  width: 316rpx !important;
+}
+.item-price {
+  > span {
+    font-size: 28rpx;
+    font-weight: 500;
+    color: #e1212b;
+  }
+}
+.join-item {
+  flex: 1;
+}
+.item-img {
+  width: 150rpx;
+  height: 150rpx;
+  margin: 0 auto;
+  display: block;
+}
+.item-img-box {
+  position: relative;
+}
+.item-line-through {
+  > span {
+    font-size: 20rpx;
+    font-weight: 400;
+    text-decoration: line-through;
+    color: #999;
+  }
+}
+.item-position-tips {
+  position: absolute;
+  right: 0;
+  color: #fff;
+  font-size: 24rpx;
+  bottom: 0;
+}
+.join-title {
+  display: flex;
+
+  align-items: center;
+  background: #fff;
+  height: 100rpx;
+  > div:nth-of-type(1) {
+    font-size: 30rpx;
+    font-weight: bold;
+  }
+  > div:nth-of-type(2) {
+    font-size: 20rpx;
+    line-height: 1.75;
+    border-radius: 16rpx;
+    text-align: center;
+    padding: 0 16rpx;
+    margin-left: 20rpx;
+  }
+  .sub {
+    background-color: #e1212b;
+    margin-right: 80rpx;
+  }
+  .sub-seckill {
+    white-space: nowrap;
+    padding: 0 !important;
+  }
+  .sub-seckill-block {
+    background: rgba($main-color, 0.3);
+    border-radius: 100px !important;
+    color: rgba($main-color, 0.7);
+    overflow: hidden;
+    padding-right: 8rpx;
+  }
+  .sub-seckill-block-text {
+    background-color: $main-color;
+    color: #fff;
+    border-top-right-radius: 100px;
+    border-bottom-right-radius: 100px;
+    padding: 0 12rpx !important;
+    margin-right: 12rpx;
+  }
+}
+</style>
diff --git a/pages/cusbar/home/template/tpl_search.vue b/pages/cusbar/home/template/tpl_search.vue
new file mode 100644
index 0000000..7da30eb
--- /dev/null
+++ b/pages/cusbar/home/template/tpl_search.vue
@@ -0,0 +1,64 @@
+<template>
+  <div class="layout">
+    <div class="search" @click="handleSearch">
+      <u-icon name="search"></u-icon>
+      {{ res.list[0].title }}
+    </div>
+    <div slot="right" open-type="contact" class="navbar-right message" @click="linkMsgDetail" style="border-style:none;background:rgb(234,234,234);" >
+		  <image style="width:53rpx;height:53rpx;margin-top:6rpx;" src="@/pages/subComponents/static/img/title.png"></image>
+	  </div>
+  </div>
+</template>
+<script>
+import '@/components/uview-components/uview-ui'
+export default {
+  title:"鎼滅储鏍�",
+  props: ["res","storeId"],
+  methods: {
+    linkMsgDetail(){
+      uni.navigateTo({
+        url:`/pages/tabbar/home/title`
+      })
+    },
+ 
+    handleSearch() {
+      if(this.storeId){
+        uni.navigateTo({
+        url: `/pages/navigation/search/searchPage?storeId=${this.storeId}`,
+      });
+      }else{
+         uni.navigateTo({
+        url: `/pages/navigation/search/searchPage`,
+      });
+      }
+      
+    },
+  },
+};
+</script>
+<style lang="scss" scoped>
+@import "./tpl.scss";
+
+.search {
+  height: 64rpx;
+  border-radius: 10rpx;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  background: #ededed;
+}
+
+.layout {
+  background: #fff;
+  padding: 0 16rpx;
+  position: relative;
+}
+.navbar-right{
+	position: absolute;
+	top: 0;
+	// right: 0;
+}
+.message{
+	right:40rpx;
+}
+</style>
diff --git a/pages/cusbar/home/template/tpl_spike.vue b/pages/cusbar/home/template/tpl_spike.vue
new file mode 100644
index 0000000..c77a51b
--- /dev/null
+++ b/pages/cusbar/home/template/tpl_spike.vue
@@ -0,0 +1,38 @@
+<template>
+  <div class="layout">
+    <div class="join-list">
+      <div class="join-title">
+        <div>{{ res.list[0].title }}</div>
+        <div>鏇村</div>
+      </div>
+      <div class="join-box">
+        <div class="join-item" v-for="item in 4" :key="item">
+          <div class="item-img-box">
+            <img
+              class="item-img"
+              src="https://picsum.photos/id/268/200/200"
+              alt
+            />
+          </div>
+          <div class="item-price">
+            <span>锟�120.00</span>
+          </div>
+          <div class="item-line-through">
+            <span>锟�190.00</span>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+<script>
+// TODO 鍚庣画鐗堟湰寮�鍙戞鍔熻兘 灏芥儏鏈熷緟
+export default {
+  props: ["res"],
+};
+</script>
+<style lang="scss" scoped>
+@import "./tpl.scss";
+@import './advertising.scss';
+
+</style>
\ No newline at end of file
diff --git a/pages/cusbar/home/template/tpl_text_picture.vue b/pages/cusbar/home/template/tpl_text_picture.vue
new file mode 100644
index 0000000..a071a0e
--- /dev/null
+++ b/pages/cusbar/home/template/tpl_text_picture.vue
@@ -0,0 +1,101 @@
+
+<template>
+  <div class="layout">
+    <div class="view-list">
+      <div class="view-item" @click="modelNavigateTo(res.list[0])">
+        <div class="-item-tilte">{{res.list[0].title}}</div>
+        <div class="-item-image">
+          <u-image width="120rpx" mode="scaleToFill" height="120rpx" :src="res.list[0].img" alt ></u-image>
+        </div>
+      </div>
+      <div class="view-item" @click="modelNavigateTo(res.list[1])">
+        <div class="-item-tilte">{{res.list[1].title}}</div>
+        <div class="-item-image">
+          <u-image width="120rpx" mode="scaleToFill" height="120rpx"  :src="res.list[1].img" alt ></u-image>
+        </div>
+      </div>
+    </div>
+    <div class="view-list">
+      <div class="view-item" @click="modelNavigateTo(res.list[2])">
+        <div class="-item-tilte">{{res.list[2].title}}</div>
+        <div class="-item-image">
+          <u-image width="120rpx" mode="scaleToFill" height="120rpx"  :src="res.list[2].img" alt ></u-image>
+        </div>
+      </div>
+      <div class="view-item" @click="modelNavigateTo(res.list[3])">
+        <div class="-item-tilte">{{res.list[3].title}}</div>
+        <div class="-item-image">
+          <u-image width="120rpx" mode="scaleToFill" height="120rpx"  :src="res.list[3].img" alt ></u-image>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import '@/components/uview-components/uview-ui'
+import {modelNavigateTo} from './tpl'
+export default {
+  title: "鏂囧瓧鍥剧墖妯℃澘",
+  props: ["res"],
+   data () {
+    return {
+      modelNavigateTo,
+    }
+  },
+  mounted() {
+
+  }
+};
+</script>
+<style lang="scss" scoped>
+@import "./tpl.scss";
+.layout {
+  display: flex;
+  background: #e8e8e8;
+  align-items: center;
+  justify-content: center;
+  background-size: cover;
+  padding: 0;
+}
+.-item-image{
+     
+     padding: 10px ;
+     >img{
+        
+         width: 100%;
+     }
+}
+.-item-tilte {
+  background: $aider-light-color;
+  height: 60rpx;
+  color: #fff;
+  font-size: 14px;
+  text-align: center;
+  line-height: 30px;
+}
+
+.view-list {
+  width: 48%;
+  margin: 0 auto;
+  display: flex;
+  background: #fff;
+   border-top-left-radius: 0.8em;
+    border-top-right-radius: 0.8em;
+    border: 1px solid #ededed;
+    
+  > .view-item {
+    width: 50%;
+  }
+  > .view-item:nth-of-type(1) {
+    > .-item-tilte {
+      border-top-left-radius: 0.8em;
+    }
+  }
+  > .view-item:nth-of-type(2) {
+    > .-item-tilte {
+      border-top-right-radius: 0.8em;
+    }
+  }
+}
+</style>
\ No newline at end of file
diff --git a/pages/cusbar/home/template/tpl_title.vue b/pages/cusbar/home/template/tpl_title.vue
new file mode 100644
index 0000000..ded00d1
--- /dev/null
+++ b/pages/cusbar/home/template/tpl_title.vue
@@ -0,0 +1,58 @@
+<template>
+  <div class="layout" :style="{textAlign: res.list[0].textAlign}"  @click="modelNavigateTo(res.list[0])" >
+    <div class="background" :style="{ backgroundColor: res.list[0].bk_color}">
+      <div class="title" :style="{ color: res.list[0].color }">
+        {{ res.list[0].title }}
+      </div>
+      <div style="position: absolute;right: 10px;top:2px;color: #fff;line-height: 42px;font-size: 10px">
+        <a  :style="{ color: res.list[0].color1 }" style="text-decoration: none">{{ res.list[0].title1 }}</a>
+      </div>
+    </div>
+  </div>
+</template>
+
+
+<script>
+import { modelNavigateTo } from "./tpl";
+export default {
+  title: "鏍囬鏍�",
+  props: ["res"],
+  data() {
+    return {
+      modelNavigateTo,
+    };
+  },
+  mounted() {},
+};
+</script>
+<style lang="scss" scoped>
+@import "./tpl.scss";
+.background {
+  // background: url("/pages/subComponents/static/title.png") no-repeat;
+  position: absolute;
+  z-index: 2;
+  width: 100%;
+  height: 84rpx;
+  background-position-x: center;
+  background-position-y: center;
+  background-size: cover;
+}
+
+.layout {
+  text-align: center;
+  position: relative;
+  height: 84rpx;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+
+  background: #ffffff;
+}
+
+.title {
+  line-height: 84rpx;
+  font-size: 30rpx;
+  font-weight: bold;
+  margin-left: 8rpx;
+}
+</style>
diff --git a/pages/cusbar/home/template/tpl_top_one_bottom_two.vue b/pages/cusbar/home/template/tpl_top_one_bottom_two.vue
new file mode 100644
index 0000000..c77229f
--- /dev/null
+++ b/pages/cusbar/home/template/tpl_top_one_bottom_two.vue
@@ -0,0 +1,73 @@
+
+<template>
+  <div class="layout">
+    <div class="view-width-100" @click="modelNavigateTo(res.list[0])">
+      <u-image class="image-mode" width="100%" height="200rpx" :src="res.list[0].img">
+        <u-loading slot="loading"></u-loading>
+      </u-image>
+    </div>
+    <div class="view-width-100" @click="modelNavigateTo(res.list[1])">
+      <div class="view-height-85">
+        <u-image class="image-mode" width="100%" height="170rpx" :src="res.list[1].img">
+          <u-loading slot="loading"></u-loading>
+        </u-image>
+      </div>
+      <div class="view-height-85" @click="modelNavigateTo(res.list[2])">
+        <u-image class="image-mode" width="100%" height="170rpx" :src="res.list[2].img">
+          <u-loading slot="loading"></u-loading>
+        </u-image>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import '@/components/uview-components/uview-ui'
+import { modelNavigateTo } from "./tpl";
+export default {
+  title: "涓婁竴涓嬩簩",
+  props: ["res"],
+  data() {
+    return {
+      modelNavigateTo,
+    };
+  },
+  mounted() {},
+};
+</script>
+<style lang="scss" scoped>
+@import "./tpl.scss";
+.layout {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  background-size: cover;
+
+  flex-direction: column;
+}
+// img {
+//   width: 100% !important;
+//   height: 85px !important;
+// }
+.view-width-100 {
+  padding: 1px 0;
+  display: flex;
+  height: 200rpx;
+  width: 100%;
+  > img {
+    width: 100%;
+    height: 100%;
+  }
+}
+.view-height-85 {
+  padding: 0 1px;
+  width: 50%;
+  > img {
+    width: 100%;
+    height: 100%;
+  }
+}
+.image-mode{
+  width: 100%;
+}
+</style>
\ No newline at end of file
diff --git a/pages/cusbar/home/template/tpl_top_two_bottom_one.vue b/pages/cusbar/home/template/tpl_top_two_bottom_one.vue
new file mode 100644
index 0000000..c387755
--- /dev/null
+++ b/pages/cusbar/home/template/tpl_top_two_bottom_one.vue
@@ -0,0 +1,80 @@
+<template>
+  <div class="layout">
+    <div class="view-width-100">
+      <div class="view-height-85" @click="modelNavigateTo(res.list[0])">
+        <u-image
+          class="image-mode"
+          height="170rpx"
+          width="100%"
+          :src="res.list[0].img"
+          alt
+          ><u-loading slot="loading"></u-loading
+        ></u-image>
+      </div>
+      <div class="view-height-85" @click="modelNavigateTo(res.list[1])">
+        <u-image
+          class="image-mode"
+          height="170rpx"
+          width="100%"
+          :src="res.list[1].img"
+          alt
+          ><u-loading slot="loading"></u-loading
+        ></u-image>
+      </div>
+    </div>
+    <div class="view-width-100"  @click="modelNavigateTo(res.list[2])">
+      <u-image
+        class="image-mode"
+        height="200rpx"
+        width="100%"
+        :src="res.list[2].img"
+        ><u-loading slot="loading"></u-loading
+      ></u-image>
+    </div>
+  </div>
+</template>
+
+<script>
+import '@/components/uview-components/uview-ui'
+import {modelNavigateTo} from './tpl'
+export default {
+  title: "涓婁簩涓嬩竴",
+  props: ["res"],
+   data () {
+    return {
+      modelNavigateTo,
+    }
+  },
+  mounted() {
+ 
+  },
+};
+</script>
+<style lang="scss" scoped>
+@import "./tpl.scss";
+.layout {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  background-size: cover;
+  // height: 260rpx;
+  flex-direction: column;
+}
+// img {
+//   width: 100% !important;
+//   height: 85px !important;
+// }
+.view-width-100 {
+  padding: 1px 0;
+  display: flex;
+  height: 200rpx;
+  width: 100%;
+}
+.view-height-85 {
+  padding: 0 1px;
+  width: 50%;
+}
+.image-mode{
+  width: 100%;
+}
+</style>
diff --git a/pages/cusbar/home/title.vue b/pages/cusbar/home/title.vue
new file mode 100644
index 0000000..e36d240
--- /dev/null
+++ b/pages/cusbar/home/title.vue
@@ -0,0 +1,193 @@
+<template>
+	<view>
+		<view>
+			<u-tabs :list="list" :is-scroll="false" :current="current" @change="change"></u-tabs>
+			<view v-if="showLoading" style="width:500rpx;margin:0 auto;text-align: center;height:800rpx;line-height: 800rpx;">
+				<u-loading mode="flower" ></u-loading>
+				<text>姝e湪鍔犺浇涓�</text>
+			</view>
+			<u-cell-group v-if="current == 0">
+				<view v-for="(item,index) in lists" :key="index">
+					<u-cell-item :arrow="false" v-if="item.status =='UN_READY'" style="position: relative;"
+						@click="linkMsgDetail(item)">
+						<template slot="label">
+							<view style="display: inline-block;
+                width: 100%;
+                height: auto;
+                font-family: Gibson;
+                font-size: 25rpx;
+                word-break: break-all;
+                text-overflow: ellipsis;
+                word-wrap: break-word;
+                white-space: pre-wrap;">
+								<view style="color:black;font-size:30rpx;font-weight:500;">{{item.title}}</view>
+								<view>{{item.content}}</view>
+								<view style="width:400rpx;padding: 10rpx 0;">{{item.createTime}}</view>
+							</view>
+						</template>
+						<!-- <button  style="width:100rpx;height:60rpx;float:right;font-size:20rpx;line-height:60rpx;background:#000000;color:white;">鏈</button> -->
+					</u-cell-item>
+				</view>
+
+			</u-cell-group>
+			<u-cell-group v-if="current == 1">
+				<view v-for="(item,index) in lists" :key="index">
+					<u-cell-item :arrow="false" v-if="item.status == 'ALREADY_READY'" style="position: relative;"
+						@click="linkMsgDetail(item)">
+						<template slot="label">
+							<view style="display: inline-block;
+							  width: 100%;
+							  height: auto;
+							  font-family: Gibson;
+							  font-size: 25rpx;
+							  word-break: break-all;
+							  text-overflow: ellipsis;
+							  word-wrap: break-word;
+							  
+							  white-space: pre-wrap;">
+							  <view style="color:black;font-size:30rpx;font-weight:500;">{{item.title}}</view>
+							  <view>{{item.content}}</view>
+							  <view style="width:400rpx;padding: 10rpx 0;">{{item.createTime}}</view>
+							</view>
+						</template>
+						<!-- <button  style="width:100rpx;height:60rpx;float:right;font-size:20rpx;line-height:60rpx;background:#F3F3FA;color:black;">宸茶</button> -->
+					</u-cell-item>
+				</view>
+			</u-cell-group>
+		</view>
+
+	</view>
+</template>
+
+<script>
+	import '@/components/uview-components/uview-ui'
+	import {
+		messages,
+		editMessages
+	} from "@/api/message.js"
+	export default {
+		data() {
+			return {
+				showLoading:true,
+				params: {
+					pageSize: 20,
+					pageNumber: 1,
+					memberId: "",
+					messageId: "",
+					status:"UN_READY"
+				},
+				loadText: {
+					loadmore: '杞昏交涓婃媺',
+					loading: '鍔姏鍔犺浇涓�',
+					nomore: '瀹炲湪娌℃湁浜�'
+				},
+				list: [{
+					name: "鏈"
+				}, {
+					name: "宸茶"
+				}],
+				current: 0,
+				lists: [],
+				status: "loadmore"
+			}
+		},
+		onShow() {
+			this.getMessage()
+		},
+		onReachBottom() {
+			this.params.pageNumber++;
+			this.statuss = "loading";
+			this.getMessage()
+		},
+		methods: {
+			linkMsgDetail(v) {
+
+				if (v.status == 'UN_READY') {
+					let params = {}
+					params.messageId = v.memberId
+					editMessages(v.id, params).then(res => {
+						if (res.data.success) {
+                            console.log( this.lists)
+                            this.lists.forEach((item,index)=>{
+                                console.log(item)
+                                if(item.id == v.id){
+                                    this.lists.splice(index, 1)
+                                }
+                            })
+						}
+					})
+				}
+				
+				// uni.navigateTo({
+				// 	url:`/pages/tabbar/home/messageDetail?data=${encodeURIComponent(JSON.stringify(v))}`
+				// })
+				
+
+			},
+			/**
+			 * 杩斿洖
+			 */
+			back() {
+				if (getCurrentPages().length == 1) {
+					uni.switchTab({
+						url: "/pages/tabbar/home/index",
+					});
+				} else {
+					uni.navigateBack();
+				}
+			},
+			change(e) {
+				this.showLoading = true;
+				console.log(e)
+				this.current = e;
+				if (e == 0) {
+					this.params.status = "UN_READY"
+					this.params.pageNumber = 1;
+				} else if (e == 1) {
+					this.params.status = "ALREADY_READY"
+					this.params.pageNumber = 1;
+				}
+				this.lists = []
+				this.getMessage()
+			},
+			getMessage() {
+				this.params.memberId = this.$options.filters.isLogin().id;
+				
+				messages(this.params).then(res => {
+					console.log(res)
+					if (res.data.success) {
+						this.showLoading = false
+						if (res.data.result.records == '') {
+							console.log(11111)
+							this.status = "nomore"
+						}
+						res.data.result.records.forEach(item => {
+							this.lists.push(item)
+							let obj = {};
+							this.lists = this.lists.reduce(
+								(cur, next) => {
+									//瀵硅薄鍘婚噸
+									if (next.id != undefined) {
+										obj[next.id] ?
+											"" :
+											(obj[next.id] = true && cur.push(next));
+									}
+									console.log(cur);
+									return cur;
+								},
+								[]
+							)
+						})
+
+					}
+				})
+			}
+		},
+	}
+</script>
+<style>
+	.foot {
+		position: fixed;
+		bottom: 0;
+	}
+</style>
diff --git a/pages/cusbar/home/views.vue b/pages/cusbar/home/views.vue
new file mode 100644
index 0000000..f148be0
--- /dev/null
+++ b/pages/cusbar/home/views.vue
@@ -0,0 +1,250 @@
+<template>
+  <div class="wrapper">
+    <!-- uni 涓笉鑳戒娇鐢� vue component 鎵�浠ョ敤if鍒ゆ柇姣忎釜缁勪欢 -->
+    <div v-for="(item, index) in pageData.list" :key="index">
+      <!-- 鎼滅储鏍忥紝濡傛灉鍦ㄦゼ灞傝淇《閮ㄥ垯浼氳嚜鍔ㄦ诞鍔紝鍚﹀垯涓嶆诞鍔� -->
+      <u-navbar class="navbar" v-if="item.type == 'search'" :is-back="false" :is-fixed="index === 1 ? false : true">
+        <search style="width: 100%" :res="item.options" />
+        <!-- #ifndef H5 -->
+        <!-- 鎵爜鍔熻兘 涓嶅吋瀹筯5 璇︽儏鏂囨。: https://uniapp.dcloud.io/api/system/barcode?id=scancode -->
+        <div slot="right" class="navbar-right">
+          <u-icon name="scan" @click="scan()" color="#666" size="50"></u-icon>
+        </div>
+        <!-- #endif -->
+      </u-navbar>
+      <carousel v-if="item.type == 'carousel'" :res="item.options" />
+      <titleLayout v-if="item.type == 'title'" :res="item.options" />
+      <leftOneRightTwo v-if="item.type == 'leftOneRightTwo'" :res="item.options" />
+      <leftTwoRightOne v-if="item.type == 'leftTwoRightOne'" :res="item.options" />
+      <topOneBottomTwo v-if="item.type == 'topOneBottomTwo'" :res="item.options" />
+      <topTwoBottomOne v-if="item.type == 'topTwoBottomOne'" :res="item.options" />
+      <flexThree v-if="item.type == 'flexThree'" :res="item.options" />
+      <flexFive v-if="item.type == 'flexFive'" :res="item.options" />
+      <flexFour v-if="item.type == 'flexFour'" :res="item.options" />
+      <flexTwo v-if="item.type == 'flexTwo'" :res="item.options" />
+      <textPicture v-if="item.type == 'textPicture'" :res="item.options" />
+      <menuLayout v-if="item.type == 'menu'" :res="item.options" />
+      <flexOne v-if="item.type == 'flexOne'" :res="item.options" />
+      <goods :enableBottomLoad="enableLoad" v-if="item.type == 'goods'" :res="item.options" />
+      <group v-if="item.type == 'group'" :res="item.options" />
+      <notice v-if="item.type == 'notice'" :res="item.options" />
+      <promotions v-if="item.type == 'promotionDetail'" :res="item.options" />
+      <!-- <joinGroup v-if="item.type == 'joinGroup'" :res="item.options" /> -->
+      <!-- <integral v-if="item.type == 'integral'" :res="item.options" /> -->
+      <!-- <spike v-if="item.type == 'spike'" :res="item.options" /> -->
+    
+    </div>
+    <fetchCoupon ref='coupon' />
+    <u-no-network @retry="init" @isConnected="isConnected"></u-no-network>
+  </div>
+</template>
+
+<script>
+import '@/components/uview-components/uview-ui'
+// 寮曠敤缁勪欢
+import tpl_banner from "@/pages/tabbar/home/template/tpl_banner"; //瀵艰埅鏍忔ā鍧�
+import tpl_title from "@/pages/tabbar/home/template/tpl_title"; //鏍囬鏍忔ā鍧�
+import tpl_left_one_right_two from "@/pages/tabbar/home/template/tpl_left_one_right_two"; //宸︿竴鍙充簩妯″潡
+import tpl_left_two_right_one from "@/pages/tabbar/home/template/tpl_left_two_right_one"; //宸︿簩鍙充竴妯″潡
+import tpl_top_one_bottom_two from "@/pages/tabbar/home/template/tpl_top_one_bottom_two"; //涓婁竴涓嬩簩妯″潡
+import tpl_top_two_bottom_one from "@/pages/tabbar/home/template/tpl_top_two_bottom_one"; //涓婁簩涓嬩竴妯″潡
+import tpl_flex_one from "@/pages/tabbar/home/template/tpl_flex_one"; //鍗曡鍥剧墖妯″潡
+import tpl_flex_two from "@/pages/tabbar/home/template/tpl_flex_two"; //涓ゅ紶妯浘妯″潡
+import tpl_flex_three from "@/pages/tabbar/home/template/tpl_flex_three"; //涓夊垪鍗曡鍥剧墖妯″潡
+import tpl_flex_five from "@/pages/tabbar/home/template/tpl_flex_five"; //浜斿垪鍗曡鍥剧墖妯″潡
+import tpl_flex_four from "@/pages/tabbar/home/template/tpl_flex_four"; //鍥涘垪鍗曡鍥剧墖妯″潡
+import tpl_text_picture from "@/pages/tabbar/home/template/tpl_text_picture"; //鏂囧瓧鍥剧墖妯℃澘
+import tpl_menu from "@/pages/tabbar/home/template/tpl_menu"; //浜斿垪鑿滃崟妯″潡
+import tpl_search from "@/pages/tabbar/home/template/tpl_search"; //鎼滅储鏍�
+import tpl_group from "@/pages/tabbar/home/template/tpl_group"; //
+import tpl_goods from "@/pages/tabbar/home/template/tpl_goods"; //鍟嗗搧鍒嗙被浠ュ強鍒嗙被涓殑鍟嗗搧
+// 缁撴潫寮曠敤缁勪欢
+import { getFloorData } from "@/api/home"; //鑾峰彇妤煎眰瑁呬慨鎺ュ彛
+import permission from "@/js_sdk/wa-permission/permission.js"; //鏉冮檺宸ュ叿绫�
+import config from "@/config/config";
+
+import tpl_notice from "@/pages/tabbar/home/template/tpl_notice"; //鏍囬鏍忔ā鍧�
+import tpl_promotions from "@/pages/tabbar/home/template/tpl_promotions_detail"; //鏍囬鏍忔ā鍧�
+import storage from "@/utils/storage.js";
+import fetchCoupon from '@/pages/tabbar/home/template/fetch_coupon'
+// import {receiveCoupons} from "@/api/members"
+
+export default {
+  data () {
+    return {
+      config,
+      storage,
+      showCp:true,
+      pageData: "", //妤煎眰椤甸潰鏁版嵁
+      isIos: "",
+      enableLoad: false, //瑙﹀簳鍔犺浇 閽堝浜庡晢鍝佹ā鍧�
+    };
+  },
+  components: {
+    carousel: tpl_banner,
+    titleLayout: tpl_title,
+    leftOneRightTwo: tpl_left_one_right_two,
+    leftTwoRightOne: tpl_left_two_right_one,
+    topOneBottomTwo: tpl_top_one_bottom_two,
+    topTwoBottomOne: tpl_top_two_bottom_one,
+    flexThree: tpl_flex_three,
+    flexFive: tpl_flex_five,
+    flexFour: tpl_flex_four,
+    flexTwo: tpl_flex_two,
+    textPicture: tpl_text_picture,
+    menuLayout: tpl_menu,
+    search: tpl_search,
+    flexOne: tpl_flex_one,
+    goods: tpl_goods,
+    group: tpl_group,
+    notice: tpl_notice,
+    promotions: tpl_promotions,
+    fetchCoupon
+  },
+
+  mounted () {
+    this.init();
+    // #ifdef MP-WEIXIN
+    // 灏忕▼搴忛粯璁ゅ垎浜�
+    uni.showShareMenu({ withShareTicket: true });
+    // #endif
+   
+  },
+  methods: {
+    fetchCoupon(){
+       this.$refs.coupon.firstGetAuto();
+    },
+    /**
+     * 瀹炰緥鍖栭椤垫暟鎹ゼ灞�
+     */
+    init () {
+      this.pageData = "";
+      getFloorData().then((res) => {
+        if (res.data.success) {
+          const result = JSON.parse(res.data.result.pageData)
+          this.pageData = result;
+          if (result.list.length) {
+            // 濡傛灉鏈�鍚庝竴涓淇ā鍧楁槸鍟嗗搧妯″潡鐨勮瘽 榛樿鍚敤鑷姩鍔犺浇
+            result.list[result.list.length - 1] ? result.list[result.list.length - 1].model == 'goods' ? this.enableLoad = true : '' : ''
+          }
+        }
+      });
+    },
+    // 鏄惁鏈夌綉缁滈摼鎺�
+    isConnected (val) {
+      val ? this.init() : ''
+    },
+
+    /**
+     * TODO 鎵爜鍔熻兘鍚庣画杩樹細鍚庣画澧炲姞
+     * 搴旇瀹炵幇鐨勫姛鑳界洰鍓嶈鍒掓湁锛�
+     * 鎵弿鍟嗗搧璺宠浆鍟嗗搧椤甸潰
+     * 鎵弿娲诲姩璺宠浆娲诲姩椤甸潰
+     * 鎵弿浜岀淮鐮佺櫥褰�
+     * 鎵弿鍏朵粬绔欎俊鎭� 寮瑰嚭鎻愮ず锛岃繑鍥為椤点��
+     */
+    scanCode () {
+      uni.scanCode({
+        success: function (res) {
+          let path = encodeURIComponent(res.result);
+
+
+
+          if (path != undefined && path.indexOf("QR_CODE_LOGIN_SESSION") == 0) {
+            console.log(path)
+            //app鎵爜鐧诲綍
+            uni.navigateTo({
+              url: "/pages/passport/scannerCodeLoginConfirm?token=" + path
+            });
+            return;
+          }
+
+
+          // WX_CODE 涓哄皬绋嬪簭鐮�
+          if (res.scanType == "WX_CODE") {
+            console.log(res);
+            uni.navigateTo({
+              url: `/${res.path}`,
+            });
+          } else {
+            config.scanAuthNavigation.forEach((src) => {
+              if (res.result.indexOf(src) != -1) {
+                uni.navigateTo({
+                  url: `/${res.result.substring(src.length)}`,
+                });
+              } else {
+                setTimeout(() => {
+                  uni.navigateTo({
+                    url: "/pages/tabbar/home/web-view?src=" + path,
+                  });
+                }, 100);
+              }
+            });
+          }
+        },
+      });
+    },
+
+    /**
+     * 鎻愮ず鑾峰彇鏉冮檺
+     */
+    tipsGetSettings () {
+      uni.showModal({
+        title: "鎻愮ず",
+        content: "鎮ㄥ凡缁忓叧闂浉鏈烘潈闄�,鍘昏缃�",
+        success: function (res) {
+          if (res.confirm) {
+            if (this.isIos) {
+              plus.runtime.openURL("app-settings:");
+            } else {
+              permission.gotoAppPermissionSetting();
+            }
+          }
+        },
+      });
+    },
+
+    /**
+     * 鍞ら啋瀹㈡埛绔壂鐮�
+     * 娌℃潈闄愬幓鐢宠鏉冮檺锛屾湁鏉冮檺鑾峰彇鎵爜鍔熻兘
+     */
+    async scan () {
+      // #ifdef APP-PLUS
+      this.isIos = plus.os.name == "iOS";
+      // 鍒ゆ柇鏄惁鏄疘os
+      if (this.isIos) {
+        const iosFirstCamera = uni.getStorageSync("iosFirstCamera"); //鏄笉鏄涓�娆″紑鍚浉鏈�
+        if (iosFirstCamera !== "false") {
+          uni.setStorageSync("iosFirstCamera", "false"); //璁句负false灏变唬琛ㄤ笉鏄涓�娆″紑鍚浉鏈�
+          this.scanCode();
+        } else {
+          if (permission.judgeIosPermission("camera")) {
+            this.scanCode();
+          } else {
+            // 娌℃湁鏉冮檺鎻愰啋鏄惁鍘荤敵璇锋潈闄�
+            this.tipsGetSettings();
+          }
+        }
+      } else {
+        /**
+         * TODO 瀹夊崜 鏉冮檺宸茬粡鎺堟潈浜嗭紝璋冪敤api鎬绘槸鏄剧ず鐢ㄦ埛宸叉案涔呮嫆缁濈敵璇枫�備汉鍌讳簡
+         * TODO 濡傛灉xdm鏈夋洿濂界殑鍔炴硶璇峰湪 https://gitee.com/beijing_hongye_huicheng/lilishop/issues 鎻愪笅璋㈣阿
+         */
+        this.scanCode();
+      }
+
+      // #endif
+
+      // #ifdef MP-WEIXIN
+      this.scanCode();
+      // #endif
+    },
+  },
+};
+</script>
+
+<style scoped lang="scss">
+.navbar-right {
+  padding: 0 16rpx 0 0;
+}
+</style>
diff --git a/pages/cusbar/home/web-view.vue b/pages/cusbar/home/web-view.vue
new file mode 100644
index 0000000..892ffe2
--- /dev/null
+++ b/pages/cusbar/home/web-view.vue
@@ -0,0 +1,53 @@
+<template>
+  <view class="web-view">
+    <web-view :webview-styles="webviewStyles" :src="src"></web-view>
+  </view>
+</template>
+
+<script>
+import configs from "@/config/config";
+import storage from "@/utils/storage";
+export default {
+  data() {
+    return {
+      configs,
+      storage,
+      webviewStyles: {
+        progress: {
+          color: this.$lightColor,
+        },
+      },
+      src: "",
+    };
+  },
+  onLoad(params) {
+    // params.IM ? (this.src = `${configs.imWebSrc}?token=${storage.getAccessToken()}&id=${params.IM}`): (this.src = decodeURIComponent(params.src));
+	if(params.IM)
+	{
+		if(params.IM==0)
+		{
+			this.src = `${configs.imWebSrc}?token=${storage.getAccessToken()}`;
+		}
+		else
+		{
+			this.src = `${configs.imWebSrc}?token=${storage.getAccessToken()}&id=${params.IM}`;
+		}
+	}
+	else
+	{
+		this.src = decodeURIComponent(params.src);
+		console.log(this.src);
+	}
+    
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.web-view {
+  /deep/ .web-view {
+    padding: 0;
+    margin: 0;
+  }
+}
+</style>
diff --git a/pages/product/goods.vue b/pages/product/goods.vue
index c315288..cd99290 100644
--- a/pages/product/goods.vue
+++ b/pages/product/goods.vue
@@ -198,10 +198,10 @@
 
       <view class="page-bottom mp-iphonex-bottom" id="pageBottom">
         <view class="icon-btn">
-<!--          <view class="icon-btn-item" @click="navigateToStore(goodsDetail.storeId)">
+        <view class="icon-btn-item" @click="navigateToStore(goodsDetail.storeId)">
             <u-icon size="34" class="red" name="home-fill"></u-icon>
             <view class="red icon-btn-name">搴楅摵</view>
-          </view> -->
+          </view>
           <view class="icon-btn-item" @click="linkMsgDetail()">
             <u-icon size="34" name="kefu-ermai"></u-icon>
             <view class="icon-btn-name">瀹㈡湇</view>
@@ -213,10 +213,10 @@
           </view>
         </view>
         <!-- 涓嬫灦灞曠ず -->
-        <div class="detail-btn" v-if="takeDownFromSale">
+<!--        <div class="detail-btn" v-if="takeDownFromSale">
           <view class="to-store-car to-store-btn"  @click="reStartTakeDownSale">
             鏌ョ湅绫讳技鍟嗗搧</view>
-        </div>
+        </div> -->
         <!-- 姝e父缁撶畻椤甸潰 -->
         <view class="detail-btn" v-if="!isGroup && !takeDownFromSale">
           <view class="to-store-car to-store-btn" v-if="goodsDetail.goodsType != 'VIRTUAL_GOODS'" @click="shutMask(4)">
@@ -295,14 +295,14 @@
 import PromotionAssembleListLayout from "./product/promotion/-promotion-assemble-list"; //鎷煎洟鐢ㄦ埛鍒楄〃
 import PromotionCoupon from "./product/promotion/-promotion-coupon"; //浼樻儬鍒哥粍浠�
 import GoodsIntro from "./product/goods/-goods-intro"; //鍟嗗搧浠嬬粛缁勪欢
-// import GoodsRecommend from "./product/goods/-goods-recommend"; //瀹濊礉鎺ㄨ崘
+import GoodsRecommend from "./product/goods/-goods-recommend"; //瀹濊礉鎺ㄨ崘
 import storeLayout from "./product/shop/-shop"; //搴楅摵缁勪欢
 import Evaluation from "./product/evaluation/-evaluation"; //璇勪环缁勪欢
 import GoodsSwiper from "./product/goods/-goods-swiper"; //杞挱鍥剧粍浠�
 import popupGoods from "@/pages/product/m-buy/goods.vue"; //璐墿杞﹀晢鍝佺殑妯″潡
 import popupAddress from "./product/popup/address"; //鍦板潃閫夋嫨妯″潡
 import shares from "@/pages/product/m-share/index.vue"; //鍒嗕韩
-import popups from "@/pages/subComponents/popups/popups.vue"; //姘旀场妗�
+import popups from "@/pages/product/popups/popups.vue"; //姘旀场妗�
 import takeDownFormSaleGoods from "@/pages/product/m-take-down-sale-goods/index"; //涓嬫灦妗�
 import setup from "./product/popup/popup";
 	import {
@@ -318,6 +318,7 @@
     PromotionAssembleListLayout,
     PromotionCoupon,
     GoodsIntro,
+    GoodsRecommend,
     storeLayout,
     Evaluation,
     GoodsSwiper,
@@ -399,10 +400,10 @@
           text: "璇︽儏",
           id: "3",
         },
-        {
-          text: "鎺ㄨ崘",
-          id: "4",
-        },
+        // {
+        //   text: "鎺ㄨ崘",
+        //   id: "4",
+        // },
       ],
       tabScrollTop: null,
       scrollArr: [],
@@ -731,13 +732,14 @@
      * 鏌ョ湅璐墿杞�
      */
     reluchToCart () {
+		console.log('鐐瑰嚮浜嗚喘鐗╄溅-----------------------銆�')
       let obj = {
         from: "product",
         id: this.productId,
       };
       storage.setCartBackbtn(obj);
-      uni.switchTab({
-        url: "/pages/tabbar/cart/cartList",
+      uni.redirectTo({
+        url: "/pages/cusbar/cart/cartList",
       });
     },
 
diff --git a/pages/product/home/index.vue b/pages/product/home/index.vue
new file mode 100644
index 0000000..aa8b37a
--- /dev/null
+++ b/pages/product/home/index.vue
@@ -0,0 +1,43 @@
+<template>
+  <div class="wrapper">
+    <!-- 妤煎眰瑁呬慨缁勪欢 -->
+    <tpl ref="tpl" />
+  </div>
+</template>
+<script>
+import tpl from "@/pages/tabbar/home/views.vue";
+
+export default {
+  data() {
+    return {
+      background: {
+        backgroundColor: "#fff",
+      },
+    };
+  },
+  onShow(){
+    setTimeout(()=>{
+      this.$refs.tpl.fetchCoupon();
+    },1000)
+  },
+  methods: {
+
+  },
+  onReachBottom(){
+    // 缁欏瓙绾х洃鍚Е搴曞姞杞�
+    uni.$emit('onReachBottom',true)
+  },
+  
+  onPullDownRefresh() {
+    this.$refs.tpl.init();
+
+    uni.stopPullDownRefresh();
+  },
+  components: {
+    tpl,
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+</style>
diff --git a/pages/product/home/template/advertising.scss b/pages/product/home/template/advertising.scss
new file mode 100644
index 0000000..be5228c
--- /dev/null
+++ b/pages/product/home/template/advertising.scss
@@ -0,0 +1,57 @@
+.position-box{
+    position: absolute;
+    right: 0;
+    bottom: 0;
+}
+.join-box {
+    display: flex;
+  }
+  .item-price {
+    > span {
+      font-size: 15px;
+      font-weight: 500;
+      color: #e1212b;
+    }
+  }
+  .join-item {
+    flex: 1;
+  }
+  .item-img {
+    width: 75px;
+    height: 75px;
+    margin: 0 auto;
+    display: block;
+  }
+  .item-img-box {
+    position: relative;
+  }
+  .item-line-through {
+    > span {
+      font-size: 10px;
+      font-weight: 400;
+      text-decoration: line-through;
+      color: #999;
+    }
+  }
+  .item-position-tips {
+    position: absolute;
+    right: 0;
+    color: #fff;
+    font-size: 12px;
+    bottom: 0;
+  }
+  .join-title {
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    background: #fff;
+    height: 50px;
+    > div:nth-of-type(1) {
+      font-size: 16px;
+      font-weight: bold;
+    }
+    > div:nth-of-type(2) {
+      font-size: 12px;
+      color: #999;
+    }
+  }
\ No newline at end of file
diff --git a/pages/product/home/template/fetch_coupon.vue b/pages/product/home/template/fetch_coupon.vue
new file mode 100644
index 0000000..7058fd8
--- /dev/null
+++ b/pages/product/home/template/fetch_coupon.vue
@@ -0,0 +1,172 @@
+<template>
+  <div>
+    <u-popup v-model="enableShowCoupon" mode="center" width="550rpx" height="400px">
+      <view style="height: 130rpx">
+        <view
+          style="
+            width: 200rpx;
+            height: 120rpx;
+            float: left;
+            line-height: 120rpx;
+            font-size: 35rpx;
+            color: #28a4f2;
+            font-weight: 600;
+            margin-left: 20rpx;
+          "
+          >浼樻儬鍒告椿鍔�</view
+        >
+        <view style="width: 120rpx; height: 120rpx; float: right">
+          <image
+            @click="enableShowCoupon = false"
+            src="/static/cpauto1.png"
+            style="width: 100%; height: 100%"
+          ></image>
+        </view>
+      </view>
+      <scroll-view scroll-y="true" style="height: 620rpx">
+        <!-- {{coupList}} -->
+        <view v-for="(item, index) in coupList" :key="index">
+          <view class="grad1">
+            <view style="float: right">
+              <view v-if="item.couponType == 'DISCOUNT'"
+                >{{ item.discount }}鎶�</view
+              >
+              <view v-else
+                >浼樻儬閲戦锛�<span style="color: red; font-size: 32rpx">{{
+                  item.price | unitPrice
+                }}</span
+                >鍏�</view
+              >
+              <view
+                >婊�<span style="color: red; font-size: 32rpx"
+                  >{{ item.consumeThreshold | unitPrice }}鍏�</span
+                >鍙敤</view
+              >
+              <view v-if="item.scopeType == 'ALL' && item.storeId == '0'"
+                >鍏ㄥ钩鍙�</view
+              >
+              <view v-if="item.scopeType == 'PORTION_GOODS_CATEGORY'"
+                >浠呴檺鍝佺被</view
+              >
+              <view v-else
+                >{{
+                  item.storeName == "platform"
+                    ? "鍏ㄥ钩鍙�"
+                    : item.storeName + "搴楅摵"
+                }}浣跨敤
+              </view>
+              <view v-if="item.endTime"
+                >鏈夋晥鏈熻嚦锛歿{ item.endTime.split(" ")[0] }}</view
+              >
+            </view>
+            <view
+              style="
+                color: white;
+                font-size: 28rpx;
+                font-weight: 500;
+                float: left;
+                writing-mode: vertical-rl;
+                flex: auto;
+                height: 100%;
+                display: flex;
+                flex-direction: column;
+                justify-content: center;
+                align-items: center;
+              "
+              @click="enableShowCoupon = false"
+            >
+              绔嬪嵆浣跨敤
+            </view>
+          </view>
+        </view>
+      </scroll-view>
+    </u-popup>
+  </div>
+</template>
+
+<script>
+import '@/components/uview-components/uview-ui'
+import { getAutoCoup } from "@/api/login";
+import storage from "@/utils/storage.js";
+export default {
+  data() {
+    return {
+      storage,
+      enableShowCoupon: false,
+      coupList:[]
+    };
+  },
+  mounted() {
+    this.firstGetAuto();
+  },
+  methods: {
+    firstGetAuto() {
+      if(!this.$options.filters.isLogin('auth')) return false
+      let data = new Date();
+      let now = data.getDate();
+      let hours = data.getHours();
+      let flagCoup = storage.getAutoCp();
+      if (
+        storage.getAutoCp() &&
+        storage.getAutoCp() != "" &&
+        storage.getAutoCp() != undefined &&
+        storage.getAutoCp() != null
+      ) {
+        if (Number(now) > Number(flagCoup)) {
+          if (Number(hours) >= 6) {
+            storage.setAutoCp(now);
+            this.getAutoCp();
+          }
+        }
+      } else {
+        this.getAutoCp();
+      }
+    },
+    getAutoCp() {
+      let data = new Date();
+      let now = data.getDate();
+      getAutoCoup().then((res) => {
+        console.log(res);
+        if (res.data.success) {
+          this.coupList.push(...res.data.result);
+          if (this.coupList != "") {
+            this.enableShowCoupon = true;
+          } else {
+            this.enableShowCoupon = false;
+          }
+          storage.setAutoCp(now);
+          let objs = {};
+          this.coupList = this.coupList.reduce((cur, next) => {
+            //瀵硅薄鍘婚噸
+            if (next.id != undefined) {
+              objs[next.id] ? "" : (objs[next.id] = true && cur.push(next));
+            }
+            return cur;
+          }, []);
+        }
+      });
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.grad1 {
+  width: 500rpx;
+  height: 200rpx;
+  background: radial-gradient(circle at right top, transparent 20rpx, #ff6b35 0)
+      top left / 120rpx 51% no-repeat,
+    radial-gradient(circle at right bottom, transparent 20rpx, #ff6b35 0) bottom
+      left / 120rpx 51% no-repeat,
+    radial-gradient(circle at left top, transparent 20rpx, #ffffff 0) top right /
+      380rpx 51% no-repeat,
+    radial-gradient(circle at left bottom, transparent 20rpx, #ffffff 0) bottom
+      right / 380rpx 51% no-repeat;
+  filter: drop-shadow(6rpx 6rpx 6rpx rgba(0, 0, 0, 0.3));
+  margin: 30rpx auto;
+  padding-top: 2rpx;
+  padding-bottom: 10rpx;
+  padding-left: 38rpx;
+  padding-right: 30rpx;
+}
+</style>
diff --git a/pages/product/home/template/tpl.js b/pages/product/home/template/tpl.js
new file mode 100644
index 0000000..5701e89
--- /dev/null
+++ b/pages/product/home/template/tpl.js
@@ -0,0 +1,208 @@
+/** 閰嶇疆妤煎眰妯″潡鐨勮烦杞� */
+export function modelNavigateTo(item) {
+	let val = item.url || item;
+	//閾炬帴璺宠浆鍒颁笓棰�
+
+	if (val && val.id && val.pageType == "special") {
+		uni.navigateTo({
+			url: `/pages/tabbar/special/special?id=${val.id}`,
+		});
+	}
+	switch (val.___type || val.type) {
+		case "goods":
+			uni.navigateTo({
+				url: "/pages/product/goods?id=" + val.id + "&goodsId=" + val.goodsId,
+			});
+			break;
+		case "category":
+			if (val.id) {
+				uni.navigateTo({
+					url: `/pages/navigation/search/searchPage?category=${val.id}`,
+				});
+			} else {
+				uni.navigateTo({
+					url: `/pages/navigation/search/searchPage`,
+				});
+			}
+			break;
+		case "shops":
+			uni.navigateTo({
+				url: `/pages/product/shopPage?id=${val.id}`,
+			});
+			break;
+			// 娲诲姩
+		case "marketing":
+			uni.navigateTo({
+				url: "/pages/product/goods?id=" + val.skuId + "&goodsId=" + val.goodsId,
+			});
+			break;
+		case "pages":
+			uni.navigateTo({
+				url: val.___path + "?id=" + val.id + "&title=" + val.title,
+			});
+			break;
+		case "other":
+			switch (val.title || item.title) {
+				case "棣栭〉":
+					uni.switchTab({
+						url: `/pages/tabbar/home/index`,
+					});
+					break;
+				case "璐墿杞�":
+					uni.switchTab({
+						url: `/pages/tabbar/cart/cartList`,
+					});
+					return;
+				case "涓汉涓績":
+					uni.switchTab({
+						url: `/pages/tabbar/user/my`,
+					});
+					break;
+				case "鏀惰棌鍟嗗搧":
+					uni.navigateTo({
+						url: `/pages/mine/myCollect`,
+					});
+					break;
+				case "鎴戠殑璁㈠崟":
+					uni.navigateTo({
+						url: `/pages/order/myOrder?status=0`,
+					});
+					break;
+				case "棰嗗埜涓績":
+					uni.navigateTo({
+						url: `/pages/cart/coupon/couponCenter`,
+					});
+					break;
+				case "绛惧埌":
+					uni.navigateTo({
+						url: `/pages/mine/signIn`,
+					});
+					break;
+				case "绉掓潃棰戦亾":
+					uni.navigateTo({
+						url: `/pages/promotion/seckill`,
+					});
+					break;
+				case "鎷煎洟棰戦亾":
+					uni.navigateTo({
+						url: `/pages/promotion/joinGroup`,
+					});
+					break;
+				case "灏忕▼搴忕洿鎾�":
+					uni.navigateTo({
+						url: `/pages/promotion/lives`,
+					});
+					break;
+				case "鐮嶄环":
+					uni.navigateTo({
+						url: `/pages/promotion/bargain/list`,
+					});
+					break;
+				case "绉垎鍟嗗煄":
+					uni.navigateTo({
+						url: `/pages/promotion/point/pointList`,
+					});
+					break;
+				case "搴楅摵鍒楄〃":
+					uni.navigateTo({
+						url: `/pages/product/shopList`,
+					});
+					break;
+				default:
+					// #ifdef H5
+					window.location.href = val.url || item.link;
+					// #endif
+					// #ifdef APP-PLUS
+					plus.runtime.openURL(val.url || item.link) //涓嶉渶瑕佹嫾鎺
+					// #endif
+					break;
+			}
+
+			break;
+	}
+}
+
+
+	
+
+import config from "@/config/config";
+
+async function scan() {
+  // #ifdef APP-PLUS
+  let isIos = plus.os.name == "iOS";
+  // 鍒ゆ柇鏄惁鏄疘os
+  if (isIos) {
+    const iosFirstCamera = uni.getStorageSync("iosFirstCamera"); //鏄笉鏄涓�娆″紑鍚浉鏈�
+    if (iosFirstCamera !== "false") {
+      uni.setStorageSync("iosFirstCamera", "false"); //璁句负false灏变唬琛ㄤ笉鏄涓�娆″紑鍚浉鏈�
+      seacnCode();
+    } else {
+      if (permision.judgeIosPermission("camera")) {
+        seacnCode();
+      } else {
+        // 娌℃湁鏉冮檺鎻愰啋鏄惁鍘荤敵璇锋潈闄�
+        tipsGetSettings();
+      }
+    }
+  } else {
+    /**
+     * TODO 瀹夊崜 鏉冮檺宸茬粡鎺堟潈浜嗭紝璋冪敤api鎬绘槸鏄剧ず鐢ㄦ埛宸叉案涔呮嫆缁濈敵璇枫�備汉鍌讳簡
+     * TODO 濡傛灉xdm鏈夋洿濂界殑鍔炴硶璇峰湪 https://gitee.com/beijing_hongye_huicheng/lilishop/issues 鎻愪笅璋㈣阿
+     */
+    seacnCode();
+  }
+
+  // #endif
+
+  // #ifdef MP-WEIXIN
+  seacnCode();
+  // #endif
+}
+/**
+ * 鎻愮ず鑾峰彇鏉冮檺
+ */
+function tipsGetSettings() {
+  uni.showModal({
+    title: "鎻愮ず",
+    content: "鎮ㄥ凡缁忓叧闂浉鏈烘潈闄�,鍘昏缃�",
+    success: function (res) {
+      if (res.confirm) {
+        if (isIos) {
+          plus.runtime.openURL("app-settings:");
+        } else {
+          permision.gotoAppPermissionSetting();
+        }
+      }
+    },
+  });
+}
+
+function seacnCode() {
+  uni.scanCode({
+    success: function (res) {
+      let path = encodeURIComponent(res.result);
+
+      // WX_CODE 涓哄皬绋嬪簭鐮�
+      if (res.scanType == "WX_CODE") {
+        console.log(res);
+        uni.navigateTo({
+          url: `/${res.path}`,
+        });
+      } else {
+        config.scanAuthNavigation.forEach((src) => {
+          if (res.result.indexOf(src) != -1) {
+            uni.navigateTo({
+              url: `/${res.result.substring(src.length)}`,
+            });
+          } else {
+            setTimeout(() => {
+              uni.navigateTo({
+                url: "/pages/tabbar/home/web-view?src=" + path,
+              });
+            }, 100);
+          }
+        });
+      }
+    },
+  });
+	}
\ No newline at end of file
diff --git a/pages/product/home/template/tpl.scss b/pages/product/home/template/tpl.scss
new file mode 100644
index 0000000..a9702fb
--- /dev/null
+++ b/pages/product/home/template/tpl.scss
@@ -0,0 +1,32 @@
+.image-mode {
+   width: 100%;
+   height: 100%;
+    display: block;
+    padding: 2rpx;
+}
+.layout {
+    padding: 16rpx;
+    margin: 8rpx 0;
+    background: #fff;
+}
+.layout,
+.view-height-75,
+.view-height-150 {
+    overflow: hidden;
+}
+.view-width-100 {
+    width: 100%;
+}
+.view-height-75 {
+    // height: 150rpx;
+}
+.view-height-150 {
+    // height: 300rpx;
+    flex: 1;
+}
+
+.view-height-85 {
+    height: 170rpx;
+    flex: 1;
+}
+
diff --git a/pages/product/home/template/tpl_banner.vue b/pages/product/home/template/tpl_banner.vue
new file mode 100644
index 0000000..1442865
--- /dev/null
+++ b/pages/product/home/template/tpl_banner.vue
@@ -0,0 +1,38 @@
+<template>
+  <div class="layout">
+    <div class="box">
+      <u-swiper @click="clickSwiper" interval="5000" duration="500" height="350" v-if="res" name="img" :list="res.list">
+        <u-loading slot="loading"></u-loading>
+      </u-swiper>
+    </div>
+  </div>
+</template>
+
+<script>
+import '@/components/uview-components/uview-ui'
+import { modelNavigateTo } from "./tpl";
+export default {
+  title: "瀵艰埅鏍�",
+  props: ["res"],
+  watch: {
+    res: {
+      handler(newValue, oldValue) {
+        this.$set(this, "res", newValue);
+      },
+      deep: true,
+    },
+  },
+
+  mounted() {
+   
+  },
+  methods: {
+    clickSwiper(index) {
+      modelNavigateTo(this.res.list[index]);
+    },
+  },
+};
+</script>
+<style lang="scss" scoped>
+@import "./tpl.scss";
+</style>
diff --git a/pages/product/home/template/tpl_flex_five.vue b/pages/product/home/template/tpl_flex_five.vue
new file mode 100644
index 0000000..c7618ab
--- /dev/null
+++ b/pages/product/home/template/tpl_flex_five.vue
@@ -0,0 +1,32 @@
+
+<template>
+  <div class="layout">
+    <u-image width="140rpx" mode="aspectFit" height="140rpx" @click="modelNavigateTo(item)" class="image-mode" v-for="(item,index) in res.list" :key="index" :src="item.img" alt="">
+      <u-loading slot="loading"></u-loading>
+    </u-image>
+  </div>
+</template>
+
+<script>
+import '@/components/uview-components/uview-ui'
+import { modelNavigateTo } from "./tpl";
+export default {
+  title: "浜斿垪鍗曡鍥剧墖妯″潡",
+  props: ["res"],
+  data() {
+    return {
+      modelNavigateTo,
+    };
+  },
+  mounted() {},
+};
+</script>
+<style lang="scss" scoped>
+@import "./tpl.scss";
+.layout {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  background-size: cover;
+}
+</style>
\ No newline at end of file
diff --git a/pages/product/home/template/tpl_flex_four.vue b/pages/product/home/template/tpl_flex_four.vue
new file mode 100644
index 0000000..c802a92
--- /dev/null
+++ b/pages/product/home/template/tpl_flex_four.vue
@@ -0,0 +1,36 @@
+
+<template>
+  <div class="layout">
+    <u-image height="175rpx" mode="aspectFit" width="175rpx" @click="modelNavigateTo(item)" class="image-mode" :src="item.img" v-for="(item,index) in res.list" :key="index">
+      <u-loading slot="loading"></u-loading>
+    </u-image>
+  </div>
+</template>
+
+<script>
+import '@/components/uview-components/uview-ui'
+import { modelNavigateTo } from "./tpl";
+export default {
+  title: "鍥涘垪鍗曡鍥剧墖妯″潡",
+  props: ["res"],
+  data() {
+    return {
+      modelNavigateTo,
+    };
+  },
+  mounted() {},
+};
+</script>
+<style lang="scss" scoped>
+@import "./tpl.scss";
+.layout {
+ 
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  background-size: cover;
+}
+img {
+  width: 84px;
+}
+</style>
\ No newline at end of file
diff --git a/pages/product/home/template/tpl_flex_one.vue b/pages/product/home/template/tpl_flex_one.vue
new file mode 100644
index 0000000..5c7ebc6
--- /dev/null
+++ b/pages/product/home/template/tpl_flex_one.vue
@@ -0,0 +1,38 @@
+<template>
+  <div class="layout">
+    <div class="flex-one">
+      <u-image v-if="res.list[0].zoneInfo == ''" @click="modelNavigateTo(res.list[0])" width="100%" mode="aspectFit" height="280rpx" :src="res.list[0].img" alt=""></u-image>
+      <hotzone v-else :res="res"></hotzone>
+    </div>
+  </div>
+</template>
+<script>
+import '@/components/uview-components/uview-ui'
+import { modelNavigateTo } from "./tpl";
+import hotzone from "@/pages/tabbar/home/template/tpl_hot_zone.vue";
+
+export default {
+  title: "鍗曡鍥剧墖妯″潡",
+  components: {
+    hotzone,
+  },
+  data() {
+    return {
+      modelNavigateTo
+    };
+  },
+  props: ["res"],
+};
+</script>
+<style lang="scss" scoped>
+@import "./tpl.scss";
+.flex-one {
+  width: 100%;
+  display: block;
+  overflow: hidden;
+  > img {
+    width: 100%;
+    height: 100%;
+  }
+}
+</style>
\ No newline at end of file
diff --git a/pages/product/home/template/tpl_flex_three.vue b/pages/product/home/template/tpl_flex_three.vue
new file mode 100644
index 0000000..65831e1
--- /dev/null
+++ b/pages/product/home/template/tpl_flex_three.vue
@@ -0,0 +1,40 @@
+
+<template>
+  <div class="layout">
+    <u-image @click="modelNavigateTo(item)" height="240rpx" width="240rpx" class="image-mode" :src="item.img" v-for="(item, index) in res.list" :key="index">
+      <u-loading slot="loading"></u-loading>
+    </u-image>
+  </div>
+</template>
+
+<script>
+import '@/components/uview-components/uview-ui'
+import { modelNavigateTo } from "./tpl";
+
+export default {
+  title: "涓夊垪鍗曡鍥剧墖妯″潡",
+  props: ["res"],
+  mounted() {
+   
+  },
+  data() {
+    return {
+      modelNavigateTo,
+    };
+  },
+};
+</script>
+<style lang="scss" scoped>
+@import "./tpl.scss";
+.layout {
+  padding: 0;
+
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  background-size: cover;
+}
+img {
+  width: 111px;
+}
+</style>
\ No newline at end of file
diff --git a/pages/product/home/template/tpl_flex_two.vue b/pages/product/home/template/tpl_flex_two.vue
new file mode 100644
index 0000000..296dc35
--- /dev/null
+++ b/pages/product/home/template/tpl_flex_two.vue
@@ -0,0 +1,49 @@
+<template>
+  <div class="layout">
+    <div class="flex-two">
+      <div class="flex-item" @click="modelNavigateTo(res.list[0])">
+        <u-image height="250rpx" width="100%" mode="scaleToFill" :src="res.list[0].img" alt>
+          <u-loading slot="loading"></u-loading>
+        </u-image>
+      </div>
+      <div class="flex-item" @click="modelNavigateTo(res.list[1])">
+        <u-image height="250rpx" width="100%" mode="scaleToFill" :src="res.list[1].img" alt>
+          <u-loading slot="loading"></u-loading>
+        </u-image>
+      </div>
+    </div>
+  </div>
+</template>
+<script>
+import '@/components/uview-components/uview-ui'
+
+import { modelNavigateTo } from "./tpl";
+export default {
+  title: "涓ゅ紶妯浘",
+  props: ["res"],
+  mounted() {
+   
+  },
+  data() {
+    return {
+      modelNavigateTo,
+    };
+  },
+};
+</script>
+<style lang="scss" scoped>
+@import "./tpl.scss";
+.flex-two {
+  width: 100%;
+  display: flex;
+  overflow: hidden;
+}
+.flex-item {
+  width: 50%;
+  > img {
+    display: block;
+    max-width: 100%;
+    height: 100%;
+  }
+}
+</style>
\ No newline at end of file
diff --git a/pages/product/home/template/tpl_goods.vue b/pages/product/home/template/tpl_goods.vue
new file mode 100644
index 0000000..768e44a
--- /dev/null
+++ b/pages/product/home/template/tpl_goods.vue
@@ -0,0 +1,263 @@
+<template>
+  <div class="layout">
+    <u-sticky>
+      <div class="goods-cell-title">
+        <div
+          class="goods-item-title"
+          :class="{ 'selected-title': selected.index == index }"
+          @click="handleClickTitle(title, index)"
+          v-for="(title, index) in res.list[0].titleWay"
+          :key="index"
+        >
+          <h4 class="h4">{{ title.title }}</h4>
+          <div>{{ title.desc }}</div>
+        </div>
+      </div>
+    </u-sticky>
+    <div class="goods-list">
+      <div
+        v-if="
+          item.___index != undefined
+            ? selected.index == item.___index
+            : selected.val == item.type
+        "
+        @click="handleClick(item)"
+        class="goods-item"
+        v-for="(item, item_index) in res.list[0].listWay"
+        :key="item_index"
+      >
+        <div class="goods-img">
+          <u-image
+            :src="item.img"
+            height="350rpx"
+            mode="aspectFit"
+            width="100%"
+          >
+            <u-loading slot="loading"></u-loading>
+          </u-image>
+        </div>
+        <div class="goods-desc">
+          <div class="goods-title">
+            {{ item.title }}
+          </div>
+          <div class="goods-bottom">
+            <div class="goods-price">
+              楼<span
+                >{{ $options.filters.goodsFormatPrice(item.price)[0] }} </span
+              >.{{ $options.filters.goodsFormatPrice(item.price)[1] }}
+            </div>
+          </div>
+        </div>
+      </div>
+
+      <div
+        v-if="res.list[0].titleWay[selected.index].bindCategory && goodsData.length"
+        v-for="(item, index) in goodsData"
+        :key="index"
+        class="goods-item"
+        @click="handleClick(item)"
+      >
+        <div class="goods-img">
+          <u-image
+            :src="item.thumbnail"
+            height="350rpx"
+            mode="aspectFit"
+            width="100%"
+          >
+            <u-loading slot="loading"></u-loading>
+          </u-image>
+        </div>
+        <div class="goods-desc">
+          <div class="goods-title">
+            {{ item.goodsName }}
+          </div>
+          <div class="goods-bottom">
+            <div class="goods-price">
+              楼<span
+                >{{ $options.filters.goodsFormatPrice(item.price)[0] }} </span
+              >.{{ $options.filters.goodsFormatPrice(item.price)[1] }}
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+<script>
+import '@/components/uview-components/uview-ui'
+import { getGoodsList } from "@/api/goods.js";
+export default {
+  title: "鍟嗗搧鍒嗙被浠ュ強鍟嗗搧",
+  data() {
+    return {
+      selected: {
+        index: 0,
+        val: "",
+      },
+      params: {
+        pageNumber: 1,
+        pageSize: 100,
+        categoryId: "",
+      },
+      goodsData: [], //鍟嗗搧寰幆鍐呭
+      goodsResult:"", //es鎬昏繑鍥炲唴瀹�
+    };
+  },
+  props: ["res","enableBottomLoad"],
+  watch: {
+    res: {
+      handler(val) {
+        // 鐩戝惉鐖剁骇鐨勫�� 濡傛灉鏈夊�煎皢鍊艰祴缁檚elected
+        if (val) {
+          console.log(val)
+          // 濡傛灉绗竴涓爣绛鹃〉缁戝畾涓哄晢鍝�
+          this.selected.val = this.res.list[0].listWay[0] ? this.res.list[0].listWay[0].type: '';
+          // 濡傛灉绗竴涓爣绛句负缁戝畾涓哄垎绫�
+          this.res.list[0].titleWay[0].bindCategory ? this.initGoods(this.res.list[0].titleWay[0]) : ''
+        }
+      },
+      immediate: true,
+    },
+  },
+  mounted() {
+    uni.$on('onReachBottom',()=>{
+      if(this.enableBottomLoad && this.goodsResult.totalElements >= this.params.pageNumber * this.params.pageSize){
+        this.params.pageNumber++
+        this.initGoods(this.res.list[0].titleWay[this.selected.index])
+      }
+      
+    })
+  },
+  destroyed(){
+    uni.$off('onReachBottom')
+  },
+  methods: {
+    handleClick(item) {
+      uni.navigateTo({
+        url: `/pages/product/goods?id=${item.id}&goodsId=${item.goodsId}`,
+      });
+    },
+    closeGoods(val, index) {
+      this.res.list[0].listWay.splice(index, 1);
+    },
+    async initGoods(val) {
+      if(this.enableBottomLoad) this.params.pageSize = 20
+      val ? this.params.categoryId = val.bindCategory.id : '';
+      const res = await getGoodsList(this.params);
+      if (res.data.success) {
+        this.goodsResult = res.data.result
+        const result = res.data.result.records
+        this.goodsData.push(...result);
+        console.log(this.goodsData)
+      }
+    },
+    handleClickTitle(val, index) {
+      this.selected.index = index;
+      this.selected.val = val.title;
+      if (val.bindCategory) {
+        this.params.pageNumber = 1
+        this.goodsData = []
+        this.initGoods(val);
+      }
+    },
+  },
+};
+</script>
+<style lang="scss" scoped>
+$w_94: 94%;
+
+.layout {
+  padding: 8px 0;
+  background: #f9f9f9;
+}
+
+.selected-title {
+  > h4 {
+    font-size: 30rpx;
+    color: #000 !important;
+  }
+
+  > div {
+    font-weight: bold;
+    color: $main-color !important;
+  }
+}
+
+.goods-cell-title {
+  background: #f9f9f9;
+  padding: 10px;
+  transition: 0.35s;
+  display: flex;
+
+  > .goods-item-title {
+    flex: 1;
+    text-align: center;
+
+    > h4 {
+      font-size: 32rpx;
+    }
+
+    > div {
+      color: #999;
+      font-size: 24rpx;
+    }
+  }
+}
+
+.goods-list {
+  width: 100%;
+  display: flex;
+  flex-wrap: wrap;
+}
+
+.goods-item {
+  width: 50%;
+  margin-bottom: 10px;
+  border-radius: 0.4em;
+  overflow: hidden;
+}
+
+.goods-img {
+  position: relative;
+  margin: 0 auto;
+  // width: 158px;
+  width: $w_94;
+  border-top-left-radius: 20rpx;
+  border-top-right-radius: 20rpx;
+  overflow: hidden;
+  > img {
+    width: 100%;
+    height: 100%;
+  }
+}
+
+.goods-desc {
+  border-bottom-left-radius: 20rpx;
+  border-bottom-right-radius: 20rpx;
+  width: $w_94;
+  background: #fff;
+  padding: 8rpx 0 8rpx 8rpx;
+  margin: 0 auto;
+  > .goods-title {
+    font-size: 24rpx;
+    height: 67rpx;
+    display: -webkit-box;
+    font-weight: 500;
+    -webkit-box-orient: vertical;
+    -webkit-line-clamp: 2;
+    overflow: hidden;
+  }
+
+  > .goods-bottom {
+    display: flex;
+    font-weight: bold;
+    > .goods-price {
+      line-height: 2;
+      color: $main-color;
+      > span {
+        font-size: 42rpx;
+      }
+    }
+  }
+}
+</style>
diff --git a/pages/product/home/template/tpl_group.vue b/pages/product/home/template/tpl_group.vue
new file mode 100644
index 0000000..b234a80
--- /dev/null
+++ b/pages/product/home/template/tpl_group.vue
@@ -0,0 +1,40 @@
+<template>
+  <div class="layout">
+    <div class="join-list">
+      <div class="join-title">
+        <div>{{ res.list[0].title }}</div>
+        <div>鏇村</div>
+      </div>
+      <div class="join-box">
+        <div class="join-item" @click="modelNavigateTo(item)" v-for="item in 4" :key="item">
+          <div class="item-img-box">
+            <img class="item-img" src="https://picsum.photos/id/268/200/200" alt />
+          </div>
+          <div class="item-price">
+            <span>锟�120.00</span>
+          </div>
+          <div class="item-line-through">
+            <span>锟�190.00</span>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+<script>
+// TODO 鍚庣画鐗堟湰寮�鍙戞鍔熻兘 灏芥儏鏈熷緟
+import { modelNavigateTo } from "./tpl";
+export default {
+  props: ["res"],
+  title: "鎷煎洟",
+  data() {
+    return {
+      modelNavigateTo,
+    };
+  },
+};
+</script>
+<style lang="scss" scoped>
+@import "./tpl.scss";
+@import "./advertising.scss";
+</style>
\ No newline at end of file
diff --git a/pages/product/home/template/tpl_hot_zone.vue b/pages/product/home/template/tpl_hot_zone.vue
new file mode 100644
index 0000000..ba51470
--- /dev/null
+++ b/pages/product/home/template/tpl_hot_zone.vue
@@ -0,0 +1,57 @@
+<template>
+  <div class="layout">
+    <div class="flex-one hot-image">
+      <image mode="widthFix" :src="res.list[0].img" alt=""></image>
+
+      <image
+        v-for="(area, index) in res.list[0].zoneInfo"
+				:key="index"
+        @click="modelNavigateTo(area)"
+        mode="widthFix"
+        class="hot-area"
+        :style="{
+          left: area.leftPer * 100 + '%',
+          top: area.topPer * 100 + '%',
+          width: area.widthPer * 100 + '%',
+          height: area.heightPer * 100 + '%',
+        }"
+        :src="area.img"
+        alt=""
+      ></image>
+    </div>
+  </div>
+</template>
+<script>
+import { modelNavigateTo } from "./tpl";
+
+export default {
+  title: "鐑尯妯″潡",
+  data() {
+    return {
+      modelNavigateTo,
+    };
+  },
+  props: ["res"],
+};
+</script>
+<style lang="scss" scoped>
+@import "./tpl.scss";
+.hot-image {
+  position: relative;
+}
+.hot-area {
+  position: absolute;
+  z-index: 99;
+}
+.flex-one {
+  width: 100%;
+  display: block;
+  overflow: hidden;
+  image {
+    width: 100%;
+   
+    min-height: 200rpx;
+    // height: 100%;
+  }
+}
+</style>
diff --git a/pages/product/home/template/tpl_integral.vue b/pages/product/home/template/tpl_integral.vue
new file mode 100644
index 0000000..8f73a78
--- /dev/null
+++ b/pages/product/home/template/tpl_integral.vue
@@ -0,0 +1,85 @@
+<template>
+  <div class="layout">
+    <div class="join-list">
+      <div class="join-title">
+        <div>{{ res.list[0].title }}</div>
+        <div>鏇村</div>
+      </div>
+      <div class="join-box">
+        <div class="join-item" v-for="item in 4" :key="item">
+          <div class="item-img-box">
+            <img class="item-img" src="https://picsum.photos/id/268/200/200" alt />
+          </div>
+          <div class="item-price">
+            <span>20绉垎</span>
+          </div>
+          <div class="item-line-through">
+            <span>30绉垎</span>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+<script>
+// TODO 鍚庣画鐗堟湰寮�鍙戞鍔熻兘 灏芥儏鏈熷緟
+export default {
+  title:"绉垎鍟嗗搧",
+  props: ["res"],
+};
+</script>
+<style lang="scss" scoped>
+@import "./tpl.scss";
+.join-box {
+  display: flex;
+}
+.item-price {
+  > span {
+    font-size: 15px;
+    font-weight: 500;
+    color: #e1212b;
+  }
+}
+.join-item {
+  flex: 1;
+}
+.item-img {
+  width: 75px;
+  height: 75px;
+  margin: 0 auto;
+  display: block;
+}
+.item-img-box {
+  position: relative;
+}
+.item-line-through {
+  > span {
+    font-size: 10px;
+    font-weight: 400;
+    text-decoration: line-through;
+    color: #999;
+  }
+}
+.item-position-tips {
+  position: absolute;
+  right: 0;
+  color: #fff;
+  font-size: 12px;
+  bottom: 0;
+}
+.join-title {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  background: #fff;
+  height: 50px;
+  > div:nth-of-type(1) {
+    font-size: 16px;
+    font-weight: bold;
+  }
+  > div:nth-of-type(2) {
+    font-size: 12px;
+    color: #999;
+  }
+}
+</style>
\ No newline at end of file
diff --git a/pages/product/home/template/tpl_join_group.vue b/pages/product/home/template/tpl_join_group.vue
new file mode 100644
index 0000000..9309331
--- /dev/null
+++ b/pages/product/home/template/tpl_join_group.vue
@@ -0,0 +1,90 @@
+<template>
+  <div class="layout">
+    <div class="join-list">
+      <div class="join-title">
+        <div>{{ res.list[0].title }}</div>
+        <div>鏇村</div>
+      </div>
+      <div class="join-box">
+        <div class="join-item" v-for="item in 4" :key="item">
+          <div class="item-img-box">
+            <img
+              class="item-img"
+              src="https://picsum.photos/id/268/200/200"
+              alt
+            />
+            <div class="item-position-tips">2浜哄洟</div>
+          </div>
+          <div class="item-price">
+            <span>锟�120.00</span>
+          </div>
+          <div class="item-line-through">
+            <span>锟�120.00</span>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+<script>
+// TODO 鍚庣画鐗堟湰寮�鍙戞鍔熻兘 灏芥儏鏈熷緟
+export default {
+  props: ["res"],
+  title:"鍥㈣喘"
+};
+</script>
+<style lang="scss" scoped>
+@import "./tpl.scss";
+.join-box {
+  display: flex;
+}
+.item-price {
+  > span {
+    font-size: 15px;
+    font-weight: 500;
+    color: #e1212b;
+  }
+}
+.join-item {
+  flex: 1;
+}
+.item-img {
+  width: 75px;
+  height: 75px;
+  margin: 0 auto;
+  display: block;
+}
+.item-img-box {
+  position: relative;
+}
+.item-line-through {
+  > span {
+    font-size: 10px;
+    font-weight: 400;
+    text-decoration: line-through;
+    color: #999;
+  }
+}
+.item-position-tips {
+  position: absolute;
+  right: 0;
+  color: #fff;
+  font-size: 12px;
+  bottom: 0;
+}
+.join-title {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  background: #fff;
+  height: 50px;
+  > div:nth-of-type(1) {
+    font-size: 16px;
+    font-weight: bold;
+  }
+  > div:nth-of-type(2) {
+    font-size: 12px;
+    color: #999;
+  }
+}
+</style>
\ No newline at end of file
diff --git a/pages/product/home/template/tpl_left_one_right_two.vue b/pages/product/home/template/tpl_left_one_right_two.vue
new file mode 100644
index 0000000..5edeefd
--- /dev/null
+++ b/pages/product/home/template/tpl_left_one_right_two.vue
@@ -0,0 +1,46 @@
+
+<template>
+  <div class="layout">
+    <div class="view-height-150" @click="modelNavigateTo(res.list[0])">
+      <u-image width="100%" height="340rpx" class="image-mode" :src="res.list[0].img">
+        <u-loading slot="loading"></u-loading>
+      </u-image>
+    </div>
+    <div class="view-height-150">
+      <div class="view-height-75" @click="modelNavigateTo(res.list[1])">
+        <u-image width="100%" height="170rpx" class="image-mode" :src="res.list[1].img" alt>
+          <u-loading slot="loading"></u-loading>
+        </u-image>
+      </div>
+      <div class="view-height-75" @click="modelNavigateTo(res.list[2])">
+        <u-image width="100%" height="170rpx" class="image-mode" :src="res.list[2].img" alt>
+          <u-loading slot="loading"></u-loading>
+        </u-image>
+      </div>
+    </div>
+  </div>
+</template>
+<script>
+import '@/components/uview-components/uview-ui'
+import { modelNavigateTo } from "./tpl";
+export default {
+  title: "宸︿竴鍙充簩",
+  props: ["res"],
+  data() {
+    return {
+      modelNavigateTo,
+    };
+  },
+  mounted() {},
+};
+</script>
+<style lang="scss" scoped>
+@import "./tpl.scss";
+.layout {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+
+  background-size: cover;
+}
+</style>
\ No newline at end of file
diff --git a/pages/product/home/template/tpl_left_two_right_one.vue b/pages/product/home/template/tpl_left_two_right_one.vue
new file mode 100644
index 0000000..94a57d0
--- /dev/null
+++ b/pages/product/home/template/tpl_left_two_right_one.vue
@@ -0,0 +1,45 @@
+
+<template>
+  <div class="layout ">
+    <div class="view-height-150">
+      <div class="view-height-75"  @click="modelNavigateTo(res.list[0])">
+        <u-image class="image-mode"  width="100%" height="150rpx" :src="res.list[0].img" ></u-image>
+      </div>
+      <div class="view-height-75"  @click="modelNavigateTo(res.list[1])">
+        <u-image class="image-mode" width="100%" height="150rpx"  :src="res.list[1].img" ></u-image>
+      </div>
+    </div>
+    <div class="view-height-150"  @click="modelNavigateTo(res.list[2])">
+      <u-image class="image-mode"  width="100%" height="300rpx"  :src="res.list[2].img" ></u-image>
+    </div>
+  </div>
+</template>
+
+<script>
+import '@/components/uview-components/uview-ui'
+import {modelNavigateTo} from './tpl'
+export default {
+  title: "宸︿簩鍙充竴",
+  props: ["res"],
+   data () {
+    return {
+      modelNavigateTo,
+    }
+  },
+  mounted() {
+   
+  }
+};
+</script>
+<style lang="scss" scoped>
+@import "./tpl.scss";
+.layout {
+  height: 300rpx;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+
+  background-size: cover;
+}
+
+</style>
\ No newline at end of file
diff --git a/pages/product/home/template/tpl_menu.vue b/pages/product/home/template/tpl_menu.vue
new file mode 100644
index 0000000..79a500c
--- /dev/null
+++ b/pages/product/home/template/tpl_menu.vue
@@ -0,0 +1,62 @@
+<template>
+  <div class="layout">
+    <div class="menu-list">
+      <div
+        class="menu-item"
+        @click="modelNavigateTo(item)"
+        v-for="(item, index) in res.list"
+        :key="index"
+      >
+        <div>
+          <u-image
+            width="88rpx"
+            height="88rpx"
+            class="menu-img"
+            :src="item.img"
+          >
+            <u-loading slot="loading"></u-loading>
+          </u-image>
+        </div>
+        <div class="menu-title">{{ item.title }}</div>
+      </div>
+    </div>
+  </div>
+</template>
+<script>
+import '@/components/uview-components/uview-ui'
+import { modelNavigateTo } from "./tpl";
+export default {
+  title: "浜斿垪鑿滃崟",
+  props: ["res"],
+  data() {
+    return {
+      modelNavigateTo,
+    };
+  },
+};
+</script>
+<style lang="scss" scoped>
+@import "./tpl.scss";
+.menu-list {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  flex-wrap: wrap;
+
+  > .menu-item {
+    text-align: center;
+    width: 20%;
+    // flex: 1;
+    margin: 20rpx 0;
+  }
+}
+.menu-img {
+  display: flex;
+  margin: 0 auto;
+  width: 88rpx;
+  height: 88rpx;
+}
+.menu-title {
+  font-size: 24rpx;
+}
+</style>
\ No newline at end of file
diff --git a/pages/product/home/template/tpl_notice.vue b/pages/product/home/template/tpl_notice.vue
new file mode 100644
index 0000000..98d6466
--- /dev/null
+++ b/pages/product/home/template/tpl_notice.vue
@@ -0,0 +1,50 @@
+<template>
+  <div class="layout">
+    <div class="background">
+      <u-notice-bar mode="vertical" :bg-color="res.list[0].bk_color" :color="res.list[0].color" :list="list"></u-notice-bar>
+    </div>
+  </div>
+</template>
+
+<script>
+import '@/components/uview-components/uview-ui'
+  export default {
+    title: "鍏憡",
+    props: ["res"],
+    data() {
+      return {
+        list: []
+      }
+    },
+    mounted() {
+      this.list = this.res.list[0].title.map(i => i.context);
+    },
+  };
+</script>
+<style lang="scss" scoped>
+  @import "./tpl.scss";
+  .background {
+    position: absolute;
+    z-index: 2;
+    width: 100%;
+    height: 84rpx;
+    text-align: left;
+    font-size: 20rpx;
+    background-size: cover;
+  }
+  .layout {
+    text-align: center;
+    position: relative;
+    height: 84rpx;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+
+    background: #ffffff;
+  }
+  .title {
+    line-height: 84rpx;
+    font-size: 20px;
+    font-weight: bold;
+  }
+</style>
diff --git a/pages/product/home/template/tpl_promotions_detail.vue b/pages/product/home/template/tpl_promotions_detail.vue
new file mode 100644
index 0000000..cb2e925
--- /dev/null
+++ b/pages/product/home/template/tpl_promotions_detail.vue
@@ -0,0 +1,274 @@
+<template>
+  <div class="layout">
+    <div class="join-list">
+      <div
+        v-for="(item, index) in res.list"
+        :key="index"
+        class="join-list-item"
+        @click="goToDetail(item.type)"
+      >
+        <div>
+          <div class="join-title">
+            <div>{{ item.title }}</div>
+            <div
+              class="sub"
+              v-if="item.type !== 'SECKILL'"
+              :style="{
+                backgroundColor: item.bk_color,
+                color: item.color1,
+                borderColor: item.bk_color,
+              }"
+            >
+              {{ item.title1 }}
+            </div>
+            <div class="sub-seckill" v-else>
+              <div class="sub-seckill-block flex">
+                <div class="sub-seckill-block-text">
+                  {{ timeLine[0] ? timeLine[0].timeLine : "x" }}鐐瑰満
+                </div>
+                {{ times.hours == "00" ? "0" : times.hours }}:{{
+                  times.minutes
+                }}:{{ times.seconds }}
+              </div>
+            </div>
+          </div>
+          <div class="join-box">
+            <div
+              class="join-item"
+              v-for="(i, _index) in item.data"
+              :key="_index"
+            >
+              <div class="item-img-box">
+                <u-image
+                  class="item-img"
+                  width="156rpx"
+                  height="156rpx"
+                  :src="i.thumbnail ? i.thumbnail : i.goodsImage"
+                  alt
+                />
+              </div>
+              <div
+                class="ellipsis"
+                :class="{ 'max-width': res.list.length <= 1 }"
+              >
+                {{ i.goodsName ? i.goodsName : i.name }}
+              </div>
+              <div class="item-price">
+                <span>锟{ i.price ? i.price : i.originalPrice }}</span>
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+<script>
+import '@/components/uview-components/uview-ui'
+import * as API_Promotions from "@/api/promotions";
+import Foundation from "@/utils/Foundation.js";
+export default {
+  props: ["res"],
+  data() {
+    return {
+      timeLine: "", //鑾峰彇鍑犱釜鐐规椿鍔�
+      resTime: 0, //褰撳墠鏃堕棿
+      time: 0, //璺濈涓嬩竴涓椿鍔ㄧ殑鏃堕棿鍊�
+      times: {}, //鏃堕棿闆嗗悎
+      onlyOne: "", //鏄惁鏈�鍚庝竴涓晢鍝�
+    };
+  },
+  mounted() {
+    let params = {
+      pageNumber: 1,
+      pageSize: 2,
+      status: "START",
+      promotionStatus: "START",
+    };
+    this._setTimeInterval = setInterval(() => {
+      if (this.time <= 0) {
+        clearInterval(this._setTimeInterval);
+      } else {
+        this.times = Foundation.countTimeDown(this.time);
+        this.time--;
+      }
+    }, 1000);
+    this.res.list.forEach((ele) => {
+      switch (ele.type) {
+        case "PINTUAN":
+          API_Promotions.getAssembleList(params).then((response) => {
+            const data = response.data.result.records;
+            if (data) {
+              ele.data = data;
+            }
+          });
+          break;
+        case "SECKILL":
+          API_Promotions.getSeckillTimeLine().then((response) => {
+            if (response.data.success && response.data.result) {
+              ele.data = response.data.result[0].seckillGoodsList.slice(0, 2);
+              let timeLine = response.data.result.sort(
+                (x, y) => Number(x.timeLine) - Number(y.timeLine)
+              );
+              this.timeLine = timeLine.slice(0, 5);
+              this.resTime = parseInt(new Date().getTime() / 1000);
+              this.onlyOne = response.data.result.length === 1;
+              this.diffTime = parseInt(new Date().getTime() / 1000) - this.resTime;
+
+              this.time =
+                this.timeLine[0].distanceStartTime ||
+                (this.timeLine[1] && this.timeLine[1].distanceStartTime) ||
+                Foundation.theNextDayTime() - this.diffTime;
+              this.times = Foundation.countTimeDown(this.time);
+              console.log(this.timeLine);
+            }
+          });
+          break;
+        case "LIVE":
+          API_Promotions.getLiveList(params).then((response) => {
+            if (response.success && response.result.records) {
+              ele.data = response.result.records[0].commodityList.slice(0, 2);
+            }
+          });
+          break;
+        case "KANJIA":
+          API_Promotions.getBargainList(params).then((response) => {
+            if (response.success && response.result) {
+              ele.data = response.result.records(0, 2);
+            }
+          });
+          break;
+        default:
+          break;
+      }
+    });
+  },
+  methods: {
+    //璺宠浆璇︽儏
+    goToDetail(type) {
+      switch(type) {
+        case "SECKILL":
+          uni.navigateTo({
+            url: `/pages/promotion/seckill`,
+          });
+          break;
+        case "PINTUAN":
+          uni.navigateTo({
+            url: `/pages/promotion/joinGroup`,
+          });
+          break;
+        case "LIVE":
+          uni.navigateTo({
+            url: `/pages/promotion/lives`,
+          });
+          break;
+        case "KANJIA":
+          uni.navigateTo({
+            url: `/pages/promotion/bargain/list`,
+          });
+          break;
+      };
+    }
+  },
+};
+</script>
+<style lang="scss" scoped>
+@import "./tpl.scss";
+.join-box {
+  display: flex;
+}
+.join-list {
+  width: 100%;
+  display: flex;
+  overflow: hidden;
+}
+.join-list-item {
+  flex: 1;
+}
+.ellipsis {
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+  width: 108rpx; // 澶т簬1涓椿鍔�
+  font-size: 22rpx;
+}
+.max-width {
+  width: 316rpx !important;
+}
+.item-price {
+  > span {
+    font-size: 28rpx;
+    font-weight: 500;
+    color: #e1212b;
+  }
+}
+.join-item {
+  flex: 1;
+}
+.item-img {
+  width: 150rpx;
+  height: 150rpx;
+  margin: 0 auto;
+  display: block;
+}
+.item-img-box {
+  position: relative;
+}
+.item-line-through {
+  > span {
+    font-size: 20rpx;
+    font-weight: 400;
+    text-decoration: line-through;
+    color: #999;
+  }
+}
+.item-position-tips {
+  position: absolute;
+  right: 0;
+  color: #fff;
+  font-size: 24rpx;
+  bottom: 0;
+}
+.join-title {
+  display: flex;
+
+  align-items: center;
+  background: #fff;
+  height: 100rpx;
+  > div:nth-of-type(1) {
+    font-size: 30rpx;
+    font-weight: bold;
+  }
+  > div:nth-of-type(2) {
+    font-size: 20rpx;
+    line-height: 1.75;
+    border-radius: 16rpx;
+    text-align: center;
+    padding: 0 16rpx;
+    margin-left: 20rpx;
+  }
+  .sub {
+    background-color: #e1212b;
+    margin-right: 80rpx;
+  }
+  .sub-seckill {
+    white-space: nowrap;
+    padding: 0 !important;
+  }
+  .sub-seckill-block {
+    background: rgba($main-color, 0.3);
+    border-radius: 100px !important;
+    color: rgba($main-color, 0.7);
+    overflow: hidden;
+    padding-right: 8rpx;
+  }
+  .sub-seckill-block-text {
+    background-color: $main-color;
+    color: #fff;
+    border-top-right-radius: 100px;
+    border-bottom-right-radius: 100px;
+    padding: 0 12rpx !important;
+    margin-right: 12rpx;
+  }
+}
+</style>
diff --git a/pages/product/home/template/tpl_search.vue b/pages/product/home/template/tpl_search.vue
new file mode 100644
index 0000000..7da30eb
--- /dev/null
+++ b/pages/product/home/template/tpl_search.vue
@@ -0,0 +1,64 @@
+<template>
+  <div class="layout">
+    <div class="search" @click="handleSearch">
+      <u-icon name="search"></u-icon>
+      {{ res.list[0].title }}
+    </div>
+    <div slot="right" open-type="contact" class="navbar-right message" @click="linkMsgDetail" style="border-style:none;background:rgb(234,234,234);" >
+		  <image style="width:53rpx;height:53rpx;margin-top:6rpx;" src="@/pages/subComponents/static/img/title.png"></image>
+	  </div>
+  </div>
+</template>
+<script>
+import '@/components/uview-components/uview-ui'
+export default {
+  title:"鎼滅储鏍�",
+  props: ["res","storeId"],
+  methods: {
+    linkMsgDetail(){
+      uni.navigateTo({
+        url:`/pages/tabbar/home/title`
+      })
+    },
+ 
+    handleSearch() {
+      if(this.storeId){
+        uni.navigateTo({
+        url: `/pages/navigation/search/searchPage?storeId=${this.storeId}`,
+      });
+      }else{
+         uni.navigateTo({
+        url: `/pages/navigation/search/searchPage`,
+      });
+      }
+      
+    },
+  },
+};
+</script>
+<style lang="scss" scoped>
+@import "./tpl.scss";
+
+.search {
+  height: 64rpx;
+  border-radius: 10rpx;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  background: #ededed;
+}
+
+.layout {
+  background: #fff;
+  padding: 0 16rpx;
+  position: relative;
+}
+.navbar-right{
+	position: absolute;
+	top: 0;
+	// right: 0;
+}
+.message{
+	right:40rpx;
+}
+</style>
diff --git a/pages/product/home/template/tpl_spike.vue b/pages/product/home/template/tpl_spike.vue
new file mode 100644
index 0000000..c77a51b
--- /dev/null
+++ b/pages/product/home/template/tpl_spike.vue
@@ -0,0 +1,38 @@
+<template>
+  <div class="layout">
+    <div class="join-list">
+      <div class="join-title">
+        <div>{{ res.list[0].title }}</div>
+        <div>鏇村</div>
+      </div>
+      <div class="join-box">
+        <div class="join-item" v-for="item in 4" :key="item">
+          <div class="item-img-box">
+            <img
+              class="item-img"
+              src="https://picsum.photos/id/268/200/200"
+              alt
+            />
+          </div>
+          <div class="item-price">
+            <span>锟�120.00</span>
+          </div>
+          <div class="item-line-through">
+            <span>锟�190.00</span>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+<script>
+// TODO 鍚庣画鐗堟湰寮�鍙戞鍔熻兘 灏芥儏鏈熷緟
+export default {
+  props: ["res"],
+};
+</script>
+<style lang="scss" scoped>
+@import "./tpl.scss";
+@import './advertising.scss';
+
+</style>
\ No newline at end of file
diff --git a/pages/product/home/template/tpl_text_picture.vue b/pages/product/home/template/tpl_text_picture.vue
new file mode 100644
index 0000000..a071a0e
--- /dev/null
+++ b/pages/product/home/template/tpl_text_picture.vue
@@ -0,0 +1,101 @@
+
+<template>
+  <div class="layout">
+    <div class="view-list">
+      <div class="view-item" @click="modelNavigateTo(res.list[0])">
+        <div class="-item-tilte">{{res.list[0].title}}</div>
+        <div class="-item-image">
+          <u-image width="120rpx" mode="scaleToFill" height="120rpx" :src="res.list[0].img" alt ></u-image>
+        </div>
+      </div>
+      <div class="view-item" @click="modelNavigateTo(res.list[1])">
+        <div class="-item-tilte">{{res.list[1].title}}</div>
+        <div class="-item-image">
+          <u-image width="120rpx" mode="scaleToFill" height="120rpx"  :src="res.list[1].img" alt ></u-image>
+        </div>
+      </div>
+    </div>
+    <div class="view-list">
+      <div class="view-item" @click="modelNavigateTo(res.list[2])">
+        <div class="-item-tilte">{{res.list[2].title}}</div>
+        <div class="-item-image">
+          <u-image width="120rpx" mode="scaleToFill" height="120rpx"  :src="res.list[2].img" alt ></u-image>
+        </div>
+      </div>
+      <div class="view-item" @click="modelNavigateTo(res.list[3])">
+        <div class="-item-tilte">{{res.list[3].title}}</div>
+        <div class="-item-image">
+          <u-image width="120rpx" mode="scaleToFill" height="120rpx"  :src="res.list[3].img" alt ></u-image>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import '@/components/uview-components/uview-ui'
+import {modelNavigateTo} from './tpl'
+export default {
+  title: "鏂囧瓧鍥剧墖妯℃澘",
+  props: ["res"],
+   data () {
+    return {
+      modelNavigateTo,
+    }
+  },
+  mounted() {
+
+  }
+};
+</script>
+<style lang="scss" scoped>
+@import "./tpl.scss";
+.layout {
+  display: flex;
+  background: #e8e8e8;
+  align-items: center;
+  justify-content: center;
+  background-size: cover;
+  padding: 0;
+}
+.-item-image{
+     
+     padding: 10px ;
+     >img{
+        
+         width: 100%;
+     }
+}
+.-item-tilte {
+  background: $aider-light-color;
+  height: 60rpx;
+  color: #fff;
+  font-size: 14px;
+  text-align: center;
+  line-height: 30px;
+}
+
+.view-list {
+  width: 48%;
+  margin: 0 auto;
+  display: flex;
+  background: #fff;
+   border-top-left-radius: 0.8em;
+    border-top-right-radius: 0.8em;
+    border: 1px solid #ededed;
+    
+  > .view-item {
+    width: 50%;
+  }
+  > .view-item:nth-of-type(1) {
+    > .-item-tilte {
+      border-top-left-radius: 0.8em;
+    }
+  }
+  > .view-item:nth-of-type(2) {
+    > .-item-tilte {
+      border-top-right-radius: 0.8em;
+    }
+  }
+}
+</style>
\ No newline at end of file
diff --git a/pages/product/home/template/tpl_title.vue b/pages/product/home/template/tpl_title.vue
new file mode 100644
index 0000000..ded00d1
--- /dev/null
+++ b/pages/product/home/template/tpl_title.vue
@@ -0,0 +1,58 @@
+<template>
+  <div class="layout" :style="{textAlign: res.list[0].textAlign}"  @click="modelNavigateTo(res.list[0])" >
+    <div class="background" :style="{ backgroundColor: res.list[0].bk_color}">
+      <div class="title" :style="{ color: res.list[0].color }">
+        {{ res.list[0].title }}
+      </div>
+      <div style="position: absolute;right: 10px;top:2px;color: #fff;line-height: 42px;font-size: 10px">
+        <a  :style="{ color: res.list[0].color1 }" style="text-decoration: none">{{ res.list[0].title1 }}</a>
+      </div>
+    </div>
+  </div>
+</template>
+
+
+<script>
+import { modelNavigateTo } from "./tpl";
+export default {
+  title: "鏍囬鏍�",
+  props: ["res"],
+  data() {
+    return {
+      modelNavigateTo,
+    };
+  },
+  mounted() {},
+};
+</script>
+<style lang="scss" scoped>
+@import "./tpl.scss";
+.background {
+  // background: url("/pages/subComponents/static/title.png") no-repeat;
+  position: absolute;
+  z-index: 2;
+  width: 100%;
+  height: 84rpx;
+  background-position-x: center;
+  background-position-y: center;
+  background-size: cover;
+}
+
+.layout {
+  text-align: center;
+  position: relative;
+  height: 84rpx;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+
+  background: #ffffff;
+}
+
+.title {
+  line-height: 84rpx;
+  font-size: 30rpx;
+  font-weight: bold;
+  margin-left: 8rpx;
+}
+</style>
diff --git a/pages/product/home/template/tpl_top_one_bottom_two.vue b/pages/product/home/template/tpl_top_one_bottom_two.vue
new file mode 100644
index 0000000..c77229f
--- /dev/null
+++ b/pages/product/home/template/tpl_top_one_bottom_two.vue
@@ -0,0 +1,73 @@
+
+<template>
+  <div class="layout">
+    <div class="view-width-100" @click="modelNavigateTo(res.list[0])">
+      <u-image class="image-mode" width="100%" height="200rpx" :src="res.list[0].img">
+        <u-loading slot="loading"></u-loading>
+      </u-image>
+    </div>
+    <div class="view-width-100" @click="modelNavigateTo(res.list[1])">
+      <div class="view-height-85">
+        <u-image class="image-mode" width="100%" height="170rpx" :src="res.list[1].img">
+          <u-loading slot="loading"></u-loading>
+        </u-image>
+      </div>
+      <div class="view-height-85" @click="modelNavigateTo(res.list[2])">
+        <u-image class="image-mode" width="100%" height="170rpx" :src="res.list[2].img">
+          <u-loading slot="loading"></u-loading>
+        </u-image>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import '@/components/uview-components/uview-ui'
+import { modelNavigateTo } from "./tpl";
+export default {
+  title: "涓婁竴涓嬩簩",
+  props: ["res"],
+  data() {
+    return {
+      modelNavigateTo,
+    };
+  },
+  mounted() {},
+};
+</script>
+<style lang="scss" scoped>
+@import "./tpl.scss";
+.layout {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  background-size: cover;
+
+  flex-direction: column;
+}
+// img {
+//   width: 100% !important;
+//   height: 85px !important;
+// }
+.view-width-100 {
+  padding: 1px 0;
+  display: flex;
+  height: 200rpx;
+  width: 100%;
+  > img {
+    width: 100%;
+    height: 100%;
+  }
+}
+.view-height-85 {
+  padding: 0 1px;
+  width: 50%;
+  > img {
+    width: 100%;
+    height: 100%;
+  }
+}
+.image-mode{
+  width: 100%;
+}
+</style>
\ No newline at end of file
diff --git a/pages/product/home/template/tpl_top_two_bottom_one.vue b/pages/product/home/template/tpl_top_two_bottom_one.vue
new file mode 100644
index 0000000..c387755
--- /dev/null
+++ b/pages/product/home/template/tpl_top_two_bottom_one.vue
@@ -0,0 +1,80 @@
+<template>
+  <div class="layout">
+    <div class="view-width-100">
+      <div class="view-height-85" @click="modelNavigateTo(res.list[0])">
+        <u-image
+          class="image-mode"
+          height="170rpx"
+          width="100%"
+          :src="res.list[0].img"
+          alt
+          ><u-loading slot="loading"></u-loading
+        ></u-image>
+      </div>
+      <div class="view-height-85" @click="modelNavigateTo(res.list[1])">
+        <u-image
+          class="image-mode"
+          height="170rpx"
+          width="100%"
+          :src="res.list[1].img"
+          alt
+          ><u-loading slot="loading"></u-loading
+        ></u-image>
+      </div>
+    </div>
+    <div class="view-width-100"  @click="modelNavigateTo(res.list[2])">
+      <u-image
+        class="image-mode"
+        height="200rpx"
+        width="100%"
+        :src="res.list[2].img"
+        ><u-loading slot="loading"></u-loading
+      ></u-image>
+    </div>
+  </div>
+</template>
+
+<script>
+import '@/components/uview-components/uview-ui'
+import {modelNavigateTo} from './tpl'
+export default {
+  title: "涓婁簩涓嬩竴",
+  props: ["res"],
+   data () {
+    return {
+      modelNavigateTo,
+    }
+  },
+  mounted() {
+ 
+  },
+};
+</script>
+<style lang="scss" scoped>
+@import "./tpl.scss";
+.layout {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  background-size: cover;
+  // height: 260rpx;
+  flex-direction: column;
+}
+// img {
+//   width: 100% !important;
+//   height: 85px !important;
+// }
+.view-width-100 {
+  padding: 1px 0;
+  display: flex;
+  height: 200rpx;
+  width: 100%;
+}
+.view-height-85 {
+  padding: 0 1px;
+  width: 50%;
+}
+.image-mode{
+  width: 100%;
+}
+</style>
diff --git a/pages/product/home/title.vue b/pages/product/home/title.vue
new file mode 100644
index 0000000..e36d240
--- /dev/null
+++ b/pages/product/home/title.vue
@@ -0,0 +1,193 @@
+<template>
+	<view>
+		<view>
+			<u-tabs :list="list" :is-scroll="false" :current="current" @change="change"></u-tabs>
+			<view v-if="showLoading" style="width:500rpx;margin:0 auto;text-align: center;height:800rpx;line-height: 800rpx;">
+				<u-loading mode="flower" ></u-loading>
+				<text>姝e湪鍔犺浇涓�</text>
+			</view>
+			<u-cell-group v-if="current == 0">
+				<view v-for="(item,index) in lists" :key="index">
+					<u-cell-item :arrow="false" v-if="item.status =='UN_READY'" style="position: relative;"
+						@click="linkMsgDetail(item)">
+						<template slot="label">
+							<view style="display: inline-block;
+                width: 100%;
+                height: auto;
+                font-family: Gibson;
+                font-size: 25rpx;
+                word-break: break-all;
+                text-overflow: ellipsis;
+                word-wrap: break-word;
+                white-space: pre-wrap;">
+								<view style="color:black;font-size:30rpx;font-weight:500;">{{item.title}}</view>
+								<view>{{item.content}}</view>
+								<view style="width:400rpx;padding: 10rpx 0;">{{item.createTime}}</view>
+							</view>
+						</template>
+						<!-- <button  style="width:100rpx;height:60rpx;float:right;font-size:20rpx;line-height:60rpx;background:#000000;color:white;">鏈</button> -->
+					</u-cell-item>
+				</view>
+
+			</u-cell-group>
+			<u-cell-group v-if="current == 1">
+				<view v-for="(item,index) in lists" :key="index">
+					<u-cell-item :arrow="false" v-if="item.status == 'ALREADY_READY'" style="position: relative;"
+						@click="linkMsgDetail(item)">
+						<template slot="label">
+							<view style="display: inline-block;
+							  width: 100%;
+							  height: auto;
+							  font-family: Gibson;
+							  font-size: 25rpx;
+							  word-break: break-all;
+							  text-overflow: ellipsis;
+							  word-wrap: break-word;
+							  
+							  white-space: pre-wrap;">
+							  <view style="color:black;font-size:30rpx;font-weight:500;">{{item.title}}</view>
+							  <view>{{item.content}}</view>
+							  <view style="width:400rpx;padding: 10rpx 0;">{{item.createTime}}</view>
+							</view>
+						</template>
+						<!-- <button  style="width:100rpx;height:60rpx;float:right;font-size:20rpx;line-height:60rpx;background:#F3F3FA;color:black;">宸茶</button> -->
+					</u-cell-item>
+				</view>
+			</u-cell-group>
+		</view>
+
+	</view>
+</template>
+
+<script>
+	import '@/components/uview-components/uview-ui'
+	import {
+		messages,
+		editMessages
+	} from "@/api/message.js"
+	export default {
+		data() {
+			return {
+				showLoading:true,
+				params: {
+					pageSize: 20,
+					pageNumber: 1,
+					memberId: "",
+					messageId: "",
+					status:"UN_READY"
+				},
+				loadText: {
+					loadmore: '杞昏交涓婃媺',
+					loading: '鍔姏鍔犺浇涓�',
+					nomore: '瀹炲湪娌℃湁浜�'
+				},
+				list: [{
+					name: "鏈"
+				}, {
+					name: "宸茶"
+				}],
+				current: 0,
+				lists: [],
+				status: "loadmore"
+			}
+		},
+		onShow() {
+			this.getMessage()
+		},
+		onReachBottom() {
+			this.params.pageNumber++;
+			this.statuss = "loading";
+			this.getMessage()
+		},
+		methods: {
+			linkMsgDetail(v) {
+
+				if (v.status == 'UN_READY') {
+					let params = {}
+					params.messageId = v.memberId
+					editMessages(v.id, params).then(res => {
+						if (res.data.success) {
+                            console.log( this.lists)
+                            this.lists.forEach((item,index)=>{
+                                console.log(item)
+                                if(item.id == v.id){
+                                    this.lists.splice(index, 1)
+                                }
+                            })
+						}
+					})
+				}
+				
+				// uni.navigateTo({
+				// 	url:`/pages/tabbar/home/messageDetail?data=${encodeURIComponent(JSON.stringify(v))}`
+				// })
+				
+
+			},
+			/**
+			 * 杩斿洖
+			 */
+			back() {
+				if (getCurrentPages().length == 1) {
+					uni.switchTab({
+						url: "/pages/tabbar/home/index",
+					});
+				} else {
+					uni.navigateBack();
+				}
+			},
+			change(e) {
+				this.showLoading = true;
+				console.log(e)
+				this.current = e;
+				if (e == 0) {
+					this.params.status = "UN_READY"
+					this.params.pageNumber = 1;
+				} else if (e == 1) {
+					this.params.status = "ALREADY_READY"
+					this.params.pageNumber = 1;
+				}
+				this.lists = []
+				this.getMessage()
+			},
+			getMessage() {
+				this.params.memberId = this.$options.filters.isLogin().id;
+				
+				messages(this.params).then(res => {
+					console.log(res)
+					if (res.data.success) {
+						this.showLoading = false
+						if (res.data.result.records == '') {
+							console.log(11111)
+							this.status = "nomore"
+						}
+						res.data.result.records.forEach(item => {
+							this.lists.push(item)
+							let obj = {};
+							this.lists = this.lists.reduce(
+								(cur, next) => {
+									//瀵硅薄鍘婚噸
+									if (next.id != undefined) {
+										obj[next.id] ?
+											"" :
+											(obj[next.id] = true && cur.push(next));
+									}
+									console.log(cur);
+									return cur;
+								},
+								[]
+							)
+						})
+
+					}
+				})
+			}
+		},
+	}
+</script>
+<style>
+	.foot {
+		position: fixed;
+		bottom: 0;
+	}
+</style>
diff --git a/pages/product/home/views.vue b/pages/product/home/views.vue
new file mode 100644
index 0000000..f148be0
--- /dev/null
+++ b/pages/product/home/views.vue
@@ -0,0 +1,250 @@
+<template>
+  <div class="wrapper">
+    <!-- uni 涓笉鑳戒娇鐢� vue component 鎵�浠ョ敤if鍒ゆ柇姣忎釜缁勪欢 -->
+    <div v-for="(item, index) in pageData.list" :key="index">
+      <!-- 鎼滅储鏍忥紝濡傛灉鍦ㄦゼ灞傝淇《閮ㄥ垯浼氳嚜鍔ㄦ诞鍔紝鍚﹀垯涓嶆诞鍔� -->
+      <u-navbar class="navbar" v-if="item.type == 'search'" :is-back="false" :is-fixed="index === 1 ? false : true">
+        <search style="width: 100%" :res="item.options" />
+        <!-- #ifndef H5 -->
+        <!-- 鎵爜鍔熻兘 涓嶅吋瀹筯5 璇︽儏鏂囨。: https://uniapp.dcloud.io/api/system/barcode?id=scancode -->
+        <div slot="right" class="navbar-right">
+          <u-icon name="scan" @click="scan()" color="#666" size="50"></u-icon>
+        </div>
+        <!-- #endif -->
+      </u-navbar>
+      <carousel v-if="item.type == 'carousel'" :res="item.options" />
+      <titleLayout v-if="item.type == 'title'" :res="item.options" />
+      <leftOneRightTwo v-if="item.type == 'leftOneRightTwo'" :res="item.options" />
+      <leftTwoRightOne v-if="item.type == 'leftTwoRightOne'" :res="item.options" />
+      <topOneBottomTwo v-if="item.type == 'topOneBottomTwo'" :res="item.options" />
+      <topTwoBottomOne v-if="item.type == 'topTwoBottomOne'" :res="item.options" />
+      <flexThree v-if="item.type == 'flexThree'" :res="item.options" />
+      <flexFive v-if="item.type == 'flexFive'" :res="item.options" />
+      <flexFour v-if="item.type == 'flexFour'" :res="item.options" />
+      <flexTwo v-if="item.type == 'flexTwo'" :res="item.options" />
+      <textPicture v-if="item.type == 'textPicture'" :res="item.options" />
+      <menuLayout v-if="item.type == 'menu'" :res="item.options" />
+      <flexOne v-if="item.type == 'flexOne'" :res="item.options" />
+      <goods :enableBottomLoad="enableLoad" v-if="item.type == 'goods'" :res="item.options" />
+      <group v-if="item.type == 'group'" :res="item.options" />
+      <notice v-if="item.type == 'notice'" :res="item.options" />
+      <promotions v-if="item.type == 'promotionDetail'" :res="item.options" />
+      <!-- <joinGroup v-if="item.type == 'joinGroup'" :res="item.options" /> -->
+      <!-- <integral v-if="item.type == 'integral'" :res="item.options" /> -->
+      <!-- <spike v-if="item.type == 'spike'" :res="item.options" /> -->
+    
+    </div>
+    <fetchCoupon ref='coupon' />
+    <u-no-network @retry="init" @isConnected="isConnected"></u-no-network>
+  </div>
+</template>
+
+<script>
+import '@/components/uview-components/uview-ui'
+// 寮曠敤缁勪欢
+import tpl_banner from "@/pages/tabbar/home/template/tpl_banner"; //瀵艰埅鏍忔ā鍧�
+import tpl_title from "@/pages/tabbar/home/template/tpl_title"; //鏍囬鏍忔ā鍧�
+import tpl_left_one_right_two from "@/pages/tabbar/home/template/tpl_left_one_right_two"; //宸︿竴鍙充簩妯″潡
+import tpl_left_two_right_one from "@/pages/tabbar/home/template/tpl_left_two_right_one"; //宸︿簩鍙充竴妯″潡
+import tpl_top_one_bottom_two from "@/pages/tabbar/home/template/tpl_top_one_bottom_two"; //涓婁竴涓嬩簩妯″潡
+import tpl_top_two_bottom_one from "@/pages/tabbar/home/template/tpl_top_two_bottom_one"; //涓婁簩涓嬩竴妯″潡
+import tpl_flex_one from "@/pages/tabbar/home/template/tpl_flex_one"; //鍗曡鍥剧墖妯″潡
+import tpl_flex_two from "@/pages/tabbar/home/template/tpl_flex_two"; //涓ゅ紶妯浘妯″潡
+import tpl_flex_three from "@/pages/tabbar/home/template/tpl_flex_three"; //涓夊垪鍗曡鍥剧墖妯″潡
+import tpl_flex_five from "@/pages/tabbar/home/template/tpl_flex_five"; //浜斿垪鍗曡鍥剧墖妯″潡
+import tpl_flex_four from "@/pages/tabbar/home/template/tpl_flex_four"; //鍥涘垪鍗曡鍥剧墖妯″潡
+import tpl_text_picture from "@/pages/tabbar/home/template/tpl_text_picture"; //鏂囧瓧鍥剧墖妯℃澘
+import tpl_menu from "@/pages/tabbar/home/template/tpl_menu"; //浜斿垪鑿滃崟妯″潡
+import tpl_search from "@/pages/tabbar/home/template/tpl_search"; //鎼滅储鏍�
+import tpl_group from "@/pages/tabbar/home/template/tpl_group"; //
+import tpl_goods from "@/pages/tabbar/home/template/tpl_goods"; //鍟嗗搧鍒嗙被浠ュ強鍒嗙被涓殑鍟嗗搧
+// 缁撴潫寮曠敤缁勪欢
+import { getFloorData } from "@/api/home"; //鑾峰彇妤煎眰瑁呬慨鎺ュ彛
+import permission from "@/js_sdk/wa-permission/permission.js"; //鏉冮檺宸ュ叿绫�
+import config from "@/config/config";
+
+import tpl_notice from "@/pages/tabbar/home/template/tpl_notice"; //鏍囬鏍忔ā鍧�
+import tpl_promotions from "@/pages/tabbar/home/template/tpl_promotions_detail"; //鏍囬鏍忔ā鍧�
+import storage from "@/utils/storage.js";
+import fetchCoupon from '@/pages/tabbar/home/template/fetch_coupon'
+// import {receiveCoupons} from "@/api/members"
+
+export default {
+  data () {
+    return {
+      config,
+      storage,
+      showCp:true,
+      pageData: "", //妤煎眰椤甸潰鏁版嵁
+      isIos: "",
+      enableLoad: false, //瑙﹀簳鍔犺浇 閽堝浜庡晢鍝佹ā鍧�
+    };
+  },
+  components: {
+    carousel: tpl_banner,
+    titleLayout: tpl_title,
+    leftOneRightTwo: tpl_left_one_right_two,
+    leftTwoRightOne: tpl_left_two_right_one,
+    topOneBottomTwo: tpl_top_one_bottom_two,
+    topTwoBottomOne: tpl_top_two_bottom_one,
+    flexThree: tpl_flex_three,
+    flexFive: tpl_flex_five,
+    flexFour: tpl_flex_four,
+    flexTwo: tpl_flex_two,
+    textPicture: tpl_text_picture,
+    menuLayout: tpl_menu,
+    search: tpl_search,
+    flexOne: tpl_flex_one,
+    goods: tpl_goods,
+    group: tpl_group,
+    notice: tpl_notice,
+    promotions: tpl_promotions,
+    fetchCoupon
+  },
+
+  mounted () {
+    this.init();
+    // #ifdef MP-WEIXIN
+    // 灏忕▼搴忛粯璁ゅ垎浜�
+    uni.showShareMenu({ withShareTicket: true });
+    // #endif
+   
+  },
+  methods: {
+    fetchCoupon(){
+       this.$refs.coupon.firstGetAuto();
+    },
+    /**
+     * 瀹炰緥鍖栭椤垫暟鎹ゼ灞�
+     */
+    init () {
+      this.pageData = "";
+      getFloorData().then((res) => {
+        if (res.data.success) {
+          const result = JSON.parse(res.data.result.pageData)
+          this.pageData = result;
+          if (result.list.length) {
+            // 濡傛灉鏈�鍚庝竴涓淇ā鍧楁槸鍟嗗搧妯″潡鐨勮瘽 榛樿鍚敤鑷姩鍔犺浇
+            result.list[result.list.length - 1] ? result.list[result.list.length - 1].model == 'goods' ? this.enableLoad = true : '' : ''
+          }
+        }
+      });
+    },
+    // 鏄惁鏈夌綉缁滈摼鎺�
+    isConnected (val) {
+      val ? this.init() : ''
+    },
+
+    /**
+     * TODO 鎵爜鍔熻兘鍚庣画杩樹細鍚庣画澧炲姞
+     * 搴旇瀹炵幇鐨勫姛鑳界洰鍓嶈鍒掓湁锛�
+     * 鎵弿鍟嗗搧璺宠浆鍟嗗搧椤甸潰
+     * 鎵弿娲诲姩璺宠浆娲诲姩椤甸潰
+     * 鎵弿浜岀淮鐮佺櫥褰�
+     * 鎵弿鍏朵粬绔欎俊鎭� 寮瑰嚭鎻愮ず锛岃繑鍥為椤点��
+     */
+    scanCode () {
+      uni.scanCode({
+        success: function (res) {
+          let path = encodeURIComponent(res.result);
+
+
+
+          if (path != undefined && path.indexOf("QR_CODE_LOGIN_SESSION") == 0) {
+            console.log(path)
+            //app鎵爜鐧诲綍
+            uni.navigateTo({
+              url: "/pages/passport/scannerCodeLoginConfirm?token=" + path
+            });
+            return;
+          }
+
+
+          // WX_CODE 涓哄皬绋嬪簭鐮�
+          if (res.scanType == "WX_CODE") {
+            console.log(res);
+            uni.navigateTo({
+              url: `/${res.path}`,
+            });
+          } else {
+            config.scanAuthNavigation.forEach((src) => {
+              if (res.result.indexOf(src) != -1) {
+                uni.navigateTo({
+                  url: `/${res.result.substring(src.length)}`,
+                });
+              } else {
+                setTimeout(() => {
+                  uni.navigateTo({
+                    url: "/pages/tabbar/home/web-view?src=" + path,
+                  });
+                }, 100);
+              }
+            });
+          }
+        },
+      });
+    },
+
+    /**
+     * 鎻愮ず鑾峰彇鏉冮檺
+     */
+    tipsGetSettings () {
+      uni.showModal({
+        title: "鎻愮ず",
+        content: "鎮ㄥ凡缁忓叧闂浉鏈烘潈闄�,鍘昏缃�",
+        success: function (res) {
+          if (res.confirm) {
+            if (this.isIos) {
+              plus.runtime.openURL("app-settings:");
+            } else {
+              permission.gotoAppPermissionSetting();
+            }
+          }
+        },
+      });
+    },
+
+    /**
+     * 鍞ら啋瀹㈡埛绔壂鐮�
+     * 娌℃潈闄愬幓鐢宠鏉冮檺锛屾湁鏉冮檺鑾峰彇鎵爜鍔熻兘
+     */
+    async scan () {
+      // #ifdef APP-PLUS
+      this.isIos = plus.os.name == "iOS";
+      // 鍒ゆ柇鏄惁鏄疘os
+      if (this.isIos) {
+        const iosFirstCamera = uni.getStorageSync("iosFirstCamera"); //鏄笉鏄涓�娆″紑鍚浉鏈�
+        if (iosFirstCamera !== "false") {
+          uni.setStorageSync("iosFirstCamera", "false"); //璁句负false灏变唬琛ㄤ笉鏄涓�娆″紑鍚浉鏈�
+          this.scanCode();
+        } else {
+          if (permission.judgeIosPermission("camera")) {
+            this.scanCode();
+          } else {
+            // 娌℃湁鏉冮檺鎻愰啋鏄惁鍘荤敵璇锋潈闄�
+            this.tipsGetSettings();
+          }
+        }
+      } else {
+        /**
+         * TODO 瀹夊崜 鏉冮檺宸茬粡鎺堟潈浜嗭紝璋冪敤api鎬绘槸鏄剧ず鐢ㄦ埛宸叉案涔呮嫆缁濈敵璇枫�備汉鍌讳簡
+         * TODO 濡傛灉xdm鏈夋洿濂界殑鍔炴硶璇峰湪 https://gitee.com/beijing_hongye_huicheng/lilishop/issues 鎻愪笅璋㈣阿
+         */
+        this.scanCode();
+      }
+
+      // #endif
+
+      // #ifdef MP-WEIXIN
+      this.scanCode();
+      // #endif
+    },
+  },
+};
+</script>
+
+<style scoped lang="scss">
+.navbar-right {
+  padding: 0 16rpx 0 0;
+}
+</style>
diff --git a/pages/product/home/web-view.vue b/pages/product/home/web-view.vue
new file mode 100644
index 0000000..892ffe2
--- /dev/null
+++ b/pages/product/home/web-view.vue
@@ -0,0 +1,53 @@
+<template>
+  <view class="web-view">
+    <web-view :webview-styles="webviewStyles" :src="src"></web-view>
+  </view>
+</template>
+
+<script>
+import configs from "@/config/config";
+import storage from "@/utils/storage";
+export default {
+  data() {
+    return {
+      configs,
+      storage,
+      webviewStyles: {
+        progress: {
+          color: this.$lightColor,
+        },
+      },
+      src: "",
+    };
+  },
+  onLoad(params) {
+    // params.IM ? (this.src = `${configs.imWebSrc}?token=${storage.getAccessToken()}&id=${params.IM}`): (this.src = decodeURIComponent(params.src));
+	if(params.IM)
+	{
+		if(params.IM==0)
+		{
+			this.src = `${configs.imWebSrc}?token=${storage.getAccessToken()}`;
+		}
+		else
+		{
+			this.src = `${configs.imWebSrc}?token=${storage.getAccessToken()}&id=${params.IM}`;
+		}
+	}
+	else
+	{
+		this.src = decodeURIComponent(params.src);
+		console.log(this.src);
+	}
+    
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.web-view {
+  /deep/ .web-view {
+    padding: 0;
+    margin: 0;
+  }
+}
+</style>
diff --git a/pages/product/m-goods-recommend/index.vue b/pages/product/m-goods-recommend/index.vue
index 245bbc0..fe4b27a 100644
--- a/pages/product/m-goods-recommend/index.vue
+++ b/pages/product/m-goods-recommend/index.vue
@@ -5,7 +5,7 @@
   </div>
 </template>
 <script>
-	import goodsTemplate from '@/pages/promotion/m-goods-list/list.vue'
+	import goodsTemplate from '@/pages/product/m-goods-list/list.vue'
 import { getGoodsList } from "@/api/goods.js";
 export default {
   data() {
diff --git a/pages/product/shopPage.vue b/pages/product/shopPage.vue
index b0062c2..b9b48d8 100644
--- a/pages/product/shopPage.vue
+++ b/pages/product/shopPage.vue
@@ -161,22 +161,22 @@
 <script>
 import '@/components/uview-components/uview-ui'
 // 寮曠敤缁勪欢
-import tpl_banner from "@/pages/tabbar/home/template/tpl_banner"; //瀵艰埅鏍忔ā鍧�
-import tpl_title from "@/pages/tabbar/home/template/tpl_title"; //鏍囬鏍忔ā鍧�
-import tpl_left_one_right_two from "@/pages/tabbar/home/template/tpl_left_one_right_two"; //宸︿竴鍙充簩妯″潡
-import tpl_left_two_right_one from "@/pages/tabbar/home/template/tpl_left_two_right_one"; //宸︿簩鍙充竴妯″潡
-import tpl_top_one_bottom_two from "@/pages/tabbar/home/template/tpl_top_one_bottom_two"; //涓婁竴涓嬩簩妯″潡
-import tpl_top_two_bottom_one from "@/pages/tabbar/home/template/tpl_top_two_bottom_one"; //涓婁簩涓嬩竴妯″潡
-import tpl_flex_one from "@/pages/tabbar/home/template/tpl_flex_one"; //鍗曡鍥剧墖妯″潡
-import tpl_flex_two from "@/pages/tabbar/home/template/tpl_flex_two"; //涓ゅ紶妯浘妯″潡
-import tpl_flex_three from "@/pages/tabbar/home/template/tpl_flex_three"; //涓夊垪鍗曡鍥剧墖妯″潡
-import tpl_flex_five from "@/pages/tabbar/home/template/tpl_flex_five"; //浜斿垪鍗曡鍥剧墖妯″潡
-import tpl_flex_four from "@/pages/tabbar/home/template/tpl_flex_four"; //鍥涘垪鍗曡鍥剧墖妯″潡
-import tpl_text_picture from "@/pages/tabbar/home/template/tpl_text_picture"; //鏂囧瓧鍥剧墖妯℃澘
-import tpl_menu from "@/pages/tabbar/home/template/tpl_menu"; //浜斿垪鑿滃崟妯″潡
-import tpl_search from "@/pages/tabbar/home/template/tpl_search"; //鎼滅储鏍�
-import tpl_group from "@/pages/tabbar/home/template/tpl_group"; //
-import tpl_goods from "@/pages/tabbar/home/template/tpl_goods"; //鍟嗗搧鍒嗙被浠ュ強鍒嗙被涓殑鍟嗗搧
+import tpl_banner from "./home/template/tpl_banner.vue"; //瀵艰埅鏍忔ā鍧�
+import tpl_title from "./home/template/tpl_title.vue"; //鏍囬鏍忔ā鍧�
+import tpl_left_one_right_two from "./home/template/tpl_left_one_right_two.vue"; //宸︿竴鍙充簩妯″潡
+import tpl_left_two_right_one from "./home/template/tpl_left_two_right_one.vue"; //宸︿簩鍙充竴妯″潡
+import tpl_top_one_bottom_two from "./home/template/tpl_top_one_bottom_two.vue"; //涓婁竴涓嬩簩妯″潡
+import tpl_top_two_bottom_one from "./home/template/tpl_top_two_bottom_one.vue"; //涓婁簩涓嬩竴妯″潡
+import tpl_flex_one from "./home/template/tpl_flex_one.vue"; //鍗曡鍥剧墖妯″潡
+import tpl_flex_two from "./home/template/tpl_flex_two.vue"; //涓ゅ紶妯浘妯″潡
+import tpl_flex_three from "./home/template/tpl_flex_three.vue"; //涓夊垪鍗曡鍥剧墖妯″潡
+import tpl_flex_five from "./home/template/tpl_flex_five.vue"; //浜斿垪鍗曡鍥剧墖妯″潡
+import tpl_flex_four from "./home/template/tpl_flex_four.vue"; //鍥涘垪鍗曡鍥剧墖妯″潡
+import tpl_text_picture from "./home/template/tpl_text_picture.vue"; //鏂囧瓧鍥剧墖妯℃澘
+import tpl_menu from "./home/template/tpl_menu.vue"; //浜斿垪鑿滃崟妯″潡
+import tpl_search from "./home/template/tpl_search.vue"; //鎼滅储鏍�
+import tpl_group from "./home/template/tpl_group.vue"; //
+import tpl_goods from "./home/template/tpl_goods.vue"; //鍟嗗搧鍒嗙被浠ュ強鍒嗙被涓殑鍟嗗搧
 import goodsTemplate from '@/pages/product/m-goods-list/list.vue'
 import { getStoreBaseInfo, getStoreCategory } from "@/api/store.js";
 import {
diff --git a/pages/promotion/m-goods-recommend/README.md b/pages/promotion/m-goods-recommend/README.md
new file mode 100644
index 0000000..b33849a
--- /dev/null
+++ b/pages/promotion/m-goods-recommend/README.md
@@ -0,0 +1,10 @@
+## 鍟嗗搧鎺ㄨ崘 
+
+
+### OBJECT 鍙傛暟璇存槑
+灞炴�璇存槑|绫诲瀷|蹇呭~
+---|---|---|---
+`title`|鏍囬锛岀敤浜庨《閮ㄦ樉绀虹殑鍐呭|String|鍚�
+`pageSize`|鏄剧ず澶氬皯鏉℃暟鎹紝寤鸿鏄�2鐨勫�嶆暟,榛樿涓�12鏉*|鍚�
+`categoryId`|鍒嗙被id|Function|鍚�
+`storeId`|鍗栧id锛屾悳绱㈠簵閾哄晢鍝佺殑鏃跺�欎娇鐢▅String|鍚�
\ No newline at end of file
diff --git a/pages/promotion/m-goods-recommend/index.vue b/pages/promotion/m-goods-recommend/index.vue
new file mode 100644
index 0000000..245bbc0
--- /dev/null
+++ b/pages/promotion/m-goods-recommend/index.vue
@@ -0,0 +1,137 @@
+<template>
+  <div>
+    <div class="goods-recommend">{{title ? `--${title}-- `:''}}</div>
+		 <goodsTemplate :res='goodsList' />
+  </div>
+</template>
+<script>
+	import goodsTemplate from '@/pages/promotion/m-goods-list/list.vue'
+import { getGoodsList } from "@/api/goods.js";
+export default {
+  data() {
+    return {
+      goodsList: [],
+      params: {
+        pageNumber: 1,
+      },
+    };
+  },
+  props: {
+    title: {
+      type: String,
+      default: "",
+    },
+    pageSize: {
+      type: null,
+      default: 12,
+    },
+    categoryId: {
+      type: null,
+      default: "",
+    },
+    storeId: {
+      type: null,
+      default: "",
+    },
+  },
+	components:{goodsTemplate},
+  mounted() {
+    this.initGoods();
+  },
+  methods: {
+    /**
+     * 鍒濆鍖栧晢鍝�
+     */
+    async initGoods() {
+      let submit = JSON.parse(
+        JSON.stringify(
+          Object.assign(this.params, {
+            pageSize: this.pageSize,
+            categoryId: this.categoryId,
+            storeId: this.storeId,
+          })
+        )
+      );
+
+      Object.keys(submit).map((key) => {
+        if (!submit[key] || submit[key].length == 0) {
+          delete submit[key];
+        }
+      });
+      let goodsList = await getGoodsList(submit);
+      this.goodsList.push(...goodsList.data.result.records);
+    },
+    handleClick(item) {
+      uni.navigateTo({
+        url: `/pages/product/goods?id=${item.id}&goodsId=${item.goodsId}`,
+      });
+    },
+  },
+};
+</script>
+
+<style scoped lang="scss">
+/**鍟嗗搧浠g爜 */
+$w_94: 94%;
+.goods-recommend {
+  background: #f7f7f7;
+  height: 100rpx;
+  line-height: 100rpx;
+  text-align: center;
+  font-size: 30rpx;
+  font-weight: bold;
+}
+.goods-list {
+  display: flex;
+  flex-wrap: wrap;
+  background: #f7f7f7;
+}
+.goods-item {
+  width: 50%;
+  margin-bottom: 10px;
+  border-radius: 0.4em;
+  overflow: hidden;
+}
+.goods-img {
+  position: relative;
+  margin: 0 auto;
+  width: $w_94;
+  height: 350rpx;
+  border-top-left-radius: 20rpx;
+  border-top-right-radius: 20rpx;
+  overflow: hidden;
+  > img {
+    width: 100%;
+    height: 100%;
+  }
+}
+.goods-desc {
+  border-bottom-left-radius: 20rpx;
+  border-bottom-right-radius: 20rpx;
+  width: $w_94;
+  background: #fff;
+  padding: 8rpx 0 8rpx 8rpx;
+  margin: 0 auto;
+  > .goods-title {
+    font-size: 12px;
+    height: 70rpx;
+    display: -webkit-box;
+    font-weight: 500;
+    -webkit-box-orient: vertical;
+
+    -webkit-line-clamp: 2;
+
+    overflow: hidden;
+  }
+
+  > .goods-bottom {
+    display: flex;
+    font-weight: bold;
+
+    > .goods-price {
+      line-height: 2;
+      color: $main-color;
+    }
+  }
+}
+</style>
\ No newline at end of file
diff --git a/pages/subComponents/comment.vue b/pages/subComponents/comment.vue
new file mode 100644
index 0000000..58ebd48
--- /dev/null
+++ b/pages/subComponents/comment.vue
@@ -0,0 +1,379 @@
+<template>
+  <view class="comment">
+    <view class="top-tab">
+      <view class="tab-btn" :v-if="commentDetail">
+        <view @click="select(0)" :class="{ cur: selectIndex == 0 }">鍏ㄩ儴</view>
+        <view @click="select(1)" :class="{ cur: selectIndex == 1 }">濂借瘎{{ commentDetail.good }}</view>
+        <view @click="select(2)" :class="{ cur: selectIndex == 2 }">涓瘎{{ commentDetail.moderate }}</view>
+        <view @click="select(3)" :class="{ cur: selectIndex == 3 }">宸瘎{{ commentDetail.worse }}</view>
+        <view @click="select(4)" :class="{ cur: selectIndex == 4 }">鏈夊浘{{ commentDetail.haveImage }}</view>
+      </view>
+    </view>
+    <!-- 璇勪环 -->
+    <div class="goodsBoxOver">
+      <div class="scoll-page">
+        <view class="eva-section">
+          <div class="empty" v-if="commDetail.length < 1">
+            <view>
+              <u-empty mode="message" text="璧炴棤璇勮"></u-empty>
+            </view>
+          </div>
+          <view class="eva-box" v-for="(item, index) in commDetail" :key="index">
+            <view class="section-info">
+              <image class="portrait" :src="item.memberProfile || userImage" mode="aspectFit"></image>
+              <view class="star-content">
+                <text class="name">{{ item.memberName | noPassByName }}</text>
+                <text class="time">{{ item.createTime }}</text>
+              </view>
+              <view class="stars">
+                <text :class="{ star: item.deliveryScore > 0 }"></text>
+                <text :class="{ star: item.deliveryScore > 1 }"></text>
+                <text :class="{ star: item.deliveryScore > 2 }"></text>
+                <text :class="{ star: item.deliveryScore > 3 }"></text>
+                <text :class="{ star: item.deliveryScore > 4 }"></text>
+              </view>
+            </view>
+            <view class="section-contant">
+              <div class="content">{{ item.content }}</div>
+              <view class="img">
+                <!-- 寰幆鍑虹敤鎴疯瘎浠风殑鍥剧墖 -->
+                <u-image width="140rpx" height="140rpx" v-if="item.images" v-for="(img, i) in splitImg(item.images)" :src="img" :key="i" @click="preview(splitImg(item.images), i)">
+                </u-image>
+              </view>
+              <view class="bot">
+                <text class="attr">{{ item.goodsName }} - {{ gradeList[item.grade] }}</text>
+              </view>
+            </view>
+            <view class="commentStyle" v-if="item.reply">
+              鍟嗗鍥炲锛�
+              <span class="addCommentSpan">{{ item.reply }}</span>
+              <view class="img">
+                <!-- 寰幆鍑哄晢瀹跺洖澶嶈瘎浠风殑鍥剧墖 -->
+                <u-image width="140rpx" height="140rpx" v-if="item.replyImage" v-for="(replyImg, replyIndex) in splitImg(item.replyImage)" :src="replyImg" :key="replyIndex"
+                  @click="preview(splitImg( item.replyImage), index)">
+                </u-image>
+              </view>
+            </view>
+          </view>
+          <u-loadmore bg-color="transparent" style="margin:40rpx 0" :status="status" @loadmore="loadmore()" icon-type="iconType" />
+        </view>
+      </div>
+    </div>
+  </view>
+</template>
+
+<script>
+import '@/components/uview-components/uview-ui'
+// import { getGoodsDetail } from '@/api/goods.js';
+import * as membersApi from "@/api/members.js";
+import configs from '@/config/config'
+export default {
+  data() {
+    return {
+      configs,
+      status: "loadmore", //搴曢儴鍒锋柊鐘舵��
+      userImage:configs.defaultUserPhoto,
+      commentDetail: "", //璇勪环璇︽儏
+      selectIndex: "0", //妫�绱㈡潯浠�
+      params: {  // 璇勮鍒嗛〉鎻愪氦鏁版嵁
+        pageNumber: 1,
+        pageSize: 10,
+        grade: "",
+      },
+      gradeList: {
+        GOOD: "濂借瘎",
+        MODERATE: "涓瘎",
+        WORSE: "宸瘎",
+        HAVEIMAGE: "鏈夊浘",
+      },
+      // 璇勮璇︽儏
+      commDetail: [],
+      dataTotal: 0, //璇勮鐨勬�籺otal鏁伴噺
+      opid: "", //涓婄骇浼犲弬id
+    };
+  },
+  async onLoad(options) {
+    this.getGoodsCommentsFun(options.id);
+    this.getGoodsCommentsNum(options.id);
+    this.opid = options.id;
+  },
+  
+  /**
+   * 瑙﹀簳鍔犺浇
+   */
+  onReachBottom() {
+    this.params.pageNumber++;
+    this.getGoodsCommentsFun(this.opid);
+  },
+
+  methods: {
+    /**
+     * 鍒囧壊鍥惧儚
+     */
+    splitImg(val) {
+      if (val && val.split(",")) {
+        return val.split(",");
+      } else if (val) {
+        return val;
+      } else {
+        return false;
+      }
+    },
+
+    /**
+     * 鑾峰彇鍟嗗搧璇勮
+     */
+    getGoodsCommentsFun(id) {
+      this.status = "loading";
+      // getGoodsComments
+      membersApi.getGoodsComments(id, this.params).then((res) => {
+        if (
+          res.data.result.records == [] ||
+          res.data.result.records == "" ||
+          res.data.result.records == null
+        ) {
+          this.status = "noMore";
+          return false;
+        }
+        this.commDetail = this.commDetail.concat(res.data.result.records);
+        this.dataTotal = res.data.result.total;
+        this.status = "loadmore";
+      });
+    },
+
+    /**
+     * 鑾峰彇鍟嗗搧璇勮鏁�
+     */
+    getGoodsCommentsNum(id) {
+      membersApi.getGoodsCommentsCount(id).then((res) => {
+        if (res.statusCode === 200) {
+          this.commentDetail = res.data.result;
+        }
+      });
+    },
+
+    /**
+     * 椤堕儴绛涢�夋潯浠�
+     */
+    select(index) {
+      this.params = {
+        pageNumber: 1,
+        pageSize: 10,
+      };
+      this.selectIndex = index;
+      this.params.grade = ["", "GOOD", "MODERATE", "WORSE", ""][
+        this.selectIndex
+      ];
+      this.selectIndex === 4 ? (this.params.haveImage = 1) : true;
+      this.commDetail = [];
+      if (this.selectIndex === 0) {
+        this.params = {
+          pageNumber: 1,
+          pageSize: 10,
+          grade: "",
+        };
+      }
+      // 閲嶆柊鍔犺浇璇勮
+      this.getGoodsCommentsFun(this.opid);
+    },
+
+    /**
+     * 鐐瑰嚮鍥剧墖鏀惧ぇ鎴栦繚瀛�
+     */
+    preview(urls, index) {
+      uni.previewImage({
+        current: index,
+        urls: urls,
+        longPressActions: {
+          itemList: ["淇濆瓨鍥剧墖"],
+          success: function (data) {
+            uni.showToast({
+              title: "淇濆瓨鎴愬姛",
+              duration: 2000,
+              icon: "none",
+            });
+          },
+          fail: function (err) {
+            uni.showToast({
+              title: "淇濆瓨澶辫触",
+              duration: 2000,
+              icon: "none",
+            });
+          },
+        },
+      });
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.commentStyle {
+  margin-top: 16rpx;
+  padding: 14rpx 26rpx;
+  background: #f5f5f5;
+  border-radius: 6px;
+  font-size: 22rpx;
+  font-weight: 700;
+  text-align: left;
+  line-height: 40rpx;
+}
+
+.addCommentSpan {
+  color: $u-tips-color !important;
+  padding-left: 20rpx;
+}
+.img {
+  display: flex;
+  flex-wrap: wrap;
+  /* height: 140rpx; */
+  overflow: hidden;
+
+  image {
+    width: 166rpx;
+    height: 166rpx;
+    margin: 0 15rpx 15rpx 0;
+
+    &:nth-of-type(3n + 0) {
+      margin: 0 0 15rpx 0;
+    }
+  }
+}
+
+.goodsBoxOver {
+  overflow-y: scroll;
+}
+
+page {
+  background: #f7f7f7;
+}
+.comment {
+  color: #333;
+  background: #f7f7f7;
+
+  overflow: hidden;
+
+  .top-tab {
+    background: #fff;
+    margin-bottom: 10rpx;
+    border-radius: 20rpx;
+    display: flex;
+    flex-direction: column;
+    padding: 0 30rpx 0 30rpx;
+    font-size: 24rpx;
+
+    .tab-btn {
+      margin-top: 20rpx;
+      display: flex;
+      flex-wrap: wrap;
+
+      view {
+        min-width: 118rpx;
+        text-align: center;
+        height: 50rpx;
+        line-height: 50rpx;
+        padding: 0 10rpx;
+        background: #f8f8fe;
+        border-radius: 25rpx;
+        margin: 0 20rpx 30rpx 0;
+
+        &.cur {
+          background: $aider-light-color;
+          color: #fff;
+        }
+      }
+    }
+  }
+
+  .eva-section {
+    padding: 20rpx 0;
+
+    .eva-box {
+      padding: 40rpx;
+      margin-bottom: 10rpx;
+      background: #fff;
+      border-radius: 20rpx;
+      /* star */
+      .star-content {
+        display: flex;
+        flex-direction: column;
+
+        view {
+          flex: 1;
+          display: flex;
+          align-items: center;
+        }
+
+        .time {
+          font-size: 24rpx;
+          color: #999;
+        }
+      }
+
+      .section-info {
+        display: flex;
+
+        .stars {
+          flex: 1;
+          display: flex;
+          justify-content: flex-end;
+          align-items: center;
+
+          .star {
+            width: 30rpx;
+            height: 30rpx;
+            background: url("/pages/subComponents/static/star.png");
+            background-size: 100%;
+          }
+        }
+        .portrait {
+          flex-shrink: 0;
+          width: 80rpx;
+          height: 80rpx;
+          border-radius: 100px;
+          margin-right: 20rpx;
+        }
+      }
+      .section-contant {
+        display: flex;
+        flex-direction: column;
+
+        .content {
+          font-size: 24rpx;
+          line-height: 46rpx;
+          font-weight: 400;
+          color: $font-color-dark;
+          color: #333;
+          padding: 26rpx 0;
+        }
+
+        .img {
+          display: flex;
+          flex-wrap: wrap;
+          /* height: 140rpx; */
+          overflow: hidden;
+          > * {
+            margin-right: 16rpx;
+          }
+        }
+
+        .bot {
+          display: flex;
+          justify-content: space-between;
+          font-size: $font-sm;
+          color: $font-color-light;
+          margin-top: 20rpx;
+
+       
+        }
+      }
+    }
+  }
+}
+
+.empty {
+  padding-top: 300rpx;
+  color: #999999;
+  text-align: center;
+}
+</style>

--
Gitblit v1.8.0