From 830efd203ee25e4bee725336e2c3aa39b06e24c7 Mon Sep 17 00:00:00 2001
From: peng <peng.com>
Date: 星期三, 16 七月 2025 21:04:16 +0800
Subject: [PATCH] 解决主包过大问题

---
 pages/cusbar/special/special.vue                  |  248 ++
 pages/subComponents/m-goods-list/common.vue       |   69 
 pages/subComponents/m-goods-list/base-list.vue    |  277 ++
 pages/subComponents/verification/animation.css    |  184 +
 pages/cusbar/category/category.vue                |  224 +
 pages/subComponents/verification/icon.css         | 1226 ++++++++++
 pages/cusbar/video/video.vue                      |  940 +++++++
 pages/cusbar/cart/mp-carui.scss                   |    8 
 pages/subComponents/m-goods-recommend/README.md   |   10 
 pages/subComponents/verification/verification.vue |  532 ++++
 pages/subComponents/m-buy/goods.vue               |  576 ++++
 pages/floor/default-page/default-page.vue         |   86 
 pages/cusbar/screen/fullScreen.vue                |   96 
 pages/mine/m-canvas/index.vue                     |  212 +
 pages/subComponents/m-buy/popup.js                |    8 
 pages/product/m-take-down-sale-goods/index.vue    |   36 
 pages/cusbar/cart/cartList.vue                    |  897 +++++++
 pages/subComponents/m-goods-list/list.vue         |  343 ++
 pages/product/popups/popups.vue                   |  346 ++
 pages/subComponents/m-buy/popup.scss              |   37 
 pages/passport/verify-code/verify-code.vue        |  278 ++
 pages/subComponents/m-buy/README.md               |    3 
 pages/video/dropdown-menu.vue                     |  208 +
 pages/subComponents/m-goods-recommend/index.vue   |  137 +
 pages/cusbar/cart/cart.scss                       |    0 
 pages/subComponents/m-goods-list/promotion.vue    |  171 +
 pages/subComponents/m-goods-list/README.md        |   11 
 pages/mine/m-canvas/README.md                     |    1 
 pages/subComponents/empty/empty.vue               |   22 
 29 files changed, 7,186 insertions(+), 0 deletions(-)

diff --git a/pages/cusbar/cart/cart.scss b/pages/cusbar/cart/cart.scss
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/pages/cusbar/cart/cart.scss
diff --git a/pages/cusbar/cart/cartList.vue b/pages/cusbar/cart/cartList.vue
new file mode 100644
index 0000000..f1dfa7f
--- /dev/null
+++ b/pages/cusbar/cart/cartList.vue
@@ -0,0 +1,897 @@
+<template>
+  <view class="wrapper">
+    <u-navbar :is-back="false" title="璐墿杞�">
+      <div slot="right">
+        <div class="light-color edit" @click="isEdit = !isEdit">{{ !isEdit ? '缂栬緫' : '瀹屾垚'}}</div>
+      </div>
+    </u-navbar> 
+    <!-- 绌虹櫧椤�-->
+    <view v-if="!loading && (cartDetail.cartList == '' || cartDetail.cartList == [] || !cartDetail)" class="empty"  :style="{height: windowHeight - marginBottom - 50 + 'px'}">
+      <image src="/static/emptyCart.png" mode="aspectFit"></image>
+      <view class="empty-tips">
+        绌虹┖濡備篃
+        <navigator class="navigator" url="/pages/tabbar/home/index" open-type="switchTab">闅忎究閫涢��></navigator>
+      </view>
+    </view>
+    <!-- 搴楅摵鍟嗗搧淇℃伅 -->
+    <div class="content" :style="{height: windowHeight - marginBottom - 50 + 'px'}">
+      <div class="box box2" :class="{ invalid: isInvalid(item) }" v-for="(item, index) in cartDetail.cartList"
+        :key="index">
+        <view class="tab">
+          <view class="store-line">
+            <u-checkbox-group class="store-line-check">
+              <!-- #ifndef MP-WEIXIN -->
+              <u-checkbox shape="circle" :active-color="lightColor" v-model="item.checked"
+                @change="checkboxChangeDP(item)"></u-checkbox>
+              <!-- #endif -->
+              <!-- 寰俊灏忕▼搴忚繖閲� v-model鍑虹幇闂锛屾敼鐢�:value -->
+              <!-- #ifdef MP-WEIXIN -->
+              <u-checkbox shape="circle" :active-color="lightColor" :value="item.checked"
+                @change="checkboxChangeDP(item)"></u-checkbox>
+              <!-- #endif -->
+            </u-checkbox-group>
+            <span class="store-name wes store-line-desc" @click.stop="navigateToStore(item)">{{
+              item.storeName
+            }}</span>
+            <u-icon @click="navigateToStore(item)"  size="24" style="margin-left:10rpx;"  name="arrow-right"></u-icon>
+          </view>
+          <view class="right-col" v-if="item.canReceiveCoupon" @click="navigateToCoupon(item)">
+            <div class="right-line"></div>
+            <span>棰嗗姷</span>
+          </view>
+        </view>
+        <u-swipe-action :show="skuItem.selected" @open="openAction(skuItem)" :options="options" bg-color="#fff"
+          ref="swiperAction" class="cart-item" v-for="(skuItem, i) in item.skuList" :index="i" :key="skuItem.goodsSku.id"
+          @click="changeActionTab(skuItem)" @longpress="changeActionTab(skuItem)">
+          <!-- 婊″噺娲诲姩 -->
+          <div v-if="Object.keys(skuItem.promotionMap).length != 0">
+            <div v-if="getPromotion(skuItem).includes('FULL_DISCOUNT')">
+              <div class="promotion-notice" v-if="item.promotionNotice">
+                <span class="tips">婊″噺</span>
+                <span style="flex:10;">{{item.promotionNotice}}</span>
+              </div>
+            </div>
+          </div>
+          <view class="goods-row" :class="{ invalid: isInvalid(skuItem) }">
+            <view class="goods-config">
+              <view>
+                <u-checkbox-group v-if="skuItem.invalid == 0 && !skuItem.errorMessage">
+                  <!-- #ifndef MP-WEIXIN -->
+                  <u-checkbox shape="circle" :active-color="lightColor" class="c-left" v-model="skuItem.checked"
+                    @change="checkboxChange(skuItem)"></u-checkbox>
+                  <!-- #endif -->
+                  <!-- 寰俊灏忕▼搴忚繖閲� v-model鍑虹幇闂锛屾敼鐢�:value -->
+                  <!-- #ifdef MP-WEIXIN -->
+                  <u-checkbox shape="circle" :active-color="lightColor" class="c-left" :value="skuItem.checked"
+                    @change="checkboxChange(skuItem)"></u-checkbox>
+                  <!-- #endif -->
+                </u-checkbox-group>
+                <span class="invalid" v-else style="font-size: 24rpx">澶辨晥</span>
+              </view>
+<!-- 			  <video border-radius="10" :fade="true" @click="navigateToGoods(skuItem)" 
+			  v-if="skuItem.goodsSku.goodsVideo" :src="skuItem.goodsSku.goodsVideo"
+			   style="width: 160rpx;height: 160rpx;"
+			  :initial-time="0"
+			  	:controls="false" object-fit="contain" :show-play-btn="false" :show-center-play-btn="false"/> -->
+              <u-image  border-radius="10" :fade="true" @click="navigateToGoods(skuItem)" width="160rpx" height="160rpx"
+                :src="skuItem.goodsSku.thumbnail" />
+            </view>
+            <view class="goods-content">
+              <!-- 鍟嗗搧鍚嶇О -->
+              <p class="sp-name" @click="navigateToGoods(skuItem)">
+                {{ skuItem.goodsSku.goodsName }}
+              </p>
+              <!-- 瑙勬牸 -->
+              <p class="sp-type" style="width:300rpx">{{skuItem.goodsSku.simpleSpecs}}</p>
+              <p class="sp-type" v-if="skuItem.goodsSku.salesModel == 'WHOLESALE'">鎵瑰彂鍟嗗搧</p>
+              <p class="sp-number">
+                <view class="sp-price">
+                  <!-- <div class="default-color" :class="{'main-color':Object.keys(skuItem.promotionMap).length ==0  }"> -->
+                  <div class="main-color">
+                    锟�<span>{{ $options.filters.goodsFormatPrice(skuItem.goodsSku.price)[0] }}</span>
+                    <span>.{{ $options.filters.goodsFormatPrice(skuItem.goodsSku.price)[1] }}</span>
+                  </div>
+                </view>
+                <view>
+                  <uni-number-box class="uNumber" :min="1" :max="999"  @change="numChange(skuItem)"	 v-model="skuItem.num"></uni-number-box>
+                </view>
+                <!-- 濡傛灉褰撴湁淇冮攢骞朵笖淇冮攢鏄� 闄愭椂鎶㈣喘 -->
+                <!-- promotions -->
+                <div class="promotions-list" v-if="Object.keys(skuItem.promotionMap).length != 0"
+                >
+                  <div class="promotions-item-seckill" v-if="getPromotion(skuItem).includes('SECKILL')">
+                    璺濈鏉�缁撴潫: <u-count-down show-border :hide-zero-day="true" :color="$mainColor" border-color="#ededed"
+                      font-size="24" :timestamp="getCountDownTime(skuItem)">
+                    </u-count-down>
+                  </div>
+                </div>
+
+                <!-- 姝ゅ鍏堥殣钘� 瀵逛簬棰勪及鍒版墜浠锋潵璇� 鍓嶇鏃犳硶鐪熸鐨勮绠楀嚭鏉ワ紝鍏夐潬淇冮攢妯″紡杩涜灞曠ず鍙兘鏈変簺涓嶅Ε銆傛墍浠ユ殏涓旈殣钘� -->
+                <!-- 濡傛灉鏈夋椿鍔� 骞朵笖鏄�変腑鐨勭姸鎬�,鏄剧ず棰勪及鍒版墜浠锋牸 -->
+                <!-- <div class="priceDetail-flowPrice" :class="{'main-color':skuItem.priceDetailDTO}"
+                  v-if="skuItem.priceDetailDTO && skuItem.invalid == 0  && Object.keys(skuItem.promotionMap).length != 0 && skuItem.checked && skuItem.checked">
+                  棰勪及鍒版墜浠� 锟�<span>{{ $options.filters.goodsFormatPrice(skuItem.priceDetailDTO.flowPrice)[0]}}</span>
+                  <span>.{{ $options.filters.goodsFormatPrice(skuItem.priceDetailDTO.flowPrice)[1] }} </span>
+                </div> -->
+                <div style='margin-left: 20rpx;' v-if="!skuItem.checked && skuItem.errorMessage">
+                  {{skuItem.errorMessage}}
+                </div>
+              </p>
+              
+            </view>
+          </view>
+        </u-swipe-action>
+      </div>
+    </div>
+    <u-modal v-model="deleteShow" :confirm-style="{'color':lightColor}" @confirm="deleteConfirm" show-cancel-button
+      :content="deleteContent" :async-close="true"></u-modal>
+    <!-- 缁撹处 -->
+    <div class="box box6" :style="{bottom: marginBottom + 50 + 'px'}">
+      <view class="navL">
+        <u-checkbox shape="circle" :active-color="lightColor" v-model="checkout" @change="checkOut()" label-size="24">鍏ㄩ��
+        </u-checkbox>
+        <span class="price">
+          <div class="prices">
+            <div class="fullPrice">
+              <span class="number" v-if="cartDetail && cartDetail.priceDetailDTO">
+                鎬昏:
+                <span>楼{{ $options.filters.goodsFormatPrice(cartDetail.priceDetailDTO.flowPrice)[0] }}</span>.<span>{{ $options.filters.goodsFormatPrice(cartDetail.priceDetailDTO.flowPrice)[1] }}</span>
+              </span>
+              <span class="number" v-else>鎬昏:0.00</span>
+            </div>
+            <div
+              v-if="cartDetail.cartList && cartDetail.cartList.length!=0 && cartDetail.priceDetailDTO && cartDetail.priceDetailDTO.discountPrice!=0 "
+              class="discountPrice">
+              <span>浼樻儬鍑�:锟{(cartDetail.priceDetailDTO.goodsPrice - cartDetail.priceDetailDTO.flowPrice) | unitPrice}}
+              </span>
+              <span class="discount-details" @click="discountDetails">浼樻儬鏄庣粏</span>
+            </div>
+          </div>
+        </span>
+      </view>
+      <!-- 浼樻儬璇︽儏 -->
+      <u-popup z-index="3" close mode="bottom" height="50%" closeable v-model="discountDetailsFlag" border-radius="20">
+        <div class="discount-list">
+          <view class="discount-title">浼樻儬鏄庣粏</view>
+          <div class="discount-way">
+            <div class="discount-item" v-if="cartDetail.priceDetailDTO">
+              <span>鍟嗗搧鎬婚</span>
+              <span>锟{cartDetail.priceDetailDTO.goodsPrice | unitPrice}}</span>
+
+            </div>
+            <div class="discount-item" v-if="cartDetail.priceDetailDTO">
+              <span>浼樻儬鍒�</span>
+              <span>-锟{cartDetail.priceDetailDTO.couponPrice | unitPrice}}</span>
+            </div>
+            <div class="discount-item" v-if="cartDetail.priceDetailDTO">
+              <span>鍏朵粬浼樻儬</span>
+              <span>-锟{cartDetail.priceDetailDTO.discountPrice | unitPrice}}</span>
+            </div>
+          </div>
+        </div>
+      </u-popup>
+
+      <view v-if="isEdit" @click="deleteGoods()">
+        <div class="settlement">鍒犻櫎</div>
+      </view>
+
+      <view v-else @click="submitOrder()">
+        <div class="settlement">鍘荤粨绠�</div>
+      </view>
+    </div>
+    <u-toast ref="uToast" />
+	<custom-tabbar bgColor="#ffffff" selected="buyCar"></custom-tabbar>
+  </view>
+</template>
+<script>
+
+import '@/components/uview-components/uview-ui';
+import * as API_Trade from "@/api/trade";
+import { debounce } from "@/utils/tools.js";
+// import uniNumberBox from '@/components/uni-number-box'
+export default {
+  data() {
+    return {
+      loading:false,
+      lightColor: this.$lightColor,
+      discountDetailsFlag: false, //浼樻儬鏄庣粏寮�鍏�
+      // 鍟嗗搧鏍忓彸渚ф粦鍔ㄦ寜閽�
+      options: [
+        {
+          text: "鍒犻櫎",
+          style: {
+            backgroundColor: this.$lightColor, //楂樹寒棰滆壊
+          },
+        },
+      ],
+      isInvalid(val) {
+        //鏄惁鏃犳晥鍟嗗搧/娌″簱瀛樺晢鍝�
+        if (val.invalid == 1 || (!val.checked && val.errorMessage)) {
+          return true;
+        } else {
+          return false;
+        }
+      },
+      deleteShow: false, //鍙虫粦鍒犻櫎
+      deleteContent: "鍒犻櫎璇ュ晢鍝侊紵", //鍒犻櫎鏄剧ず鐨勪俊鎭�
+      cartDetail: "", //璐墿杞﹁鎯�
+      goodsVal: "", //鍗曚釜鍟嗗搧璇︽儏
+      isEdit: false, // 鏄惁鏄紪杈�
+      checkout: false, //鍏ㄩ�夋寜閽�
+      WEIXIN_num: "", //璐墿杞﹀吋瀹瑰井淇℃杩涘櫒
+	  marginBottom: 0 ,// 搴曢儴瀹夊叏鍖哄煙
+	  windowHeight: 0 // 鍙娇鐢ㄥ睆骞曢珮搴�
+    };
+  },
+
+  mounted() {
+	  this.marginBottom = uni.getSystemInfoSync().safeAreaInsets.bottom
+	  this.windowHeight = uni.getSystemInfoSync().windowHeight
+    // #ifdef MP-WEIXIN
+    // 灏忕▼搴忛粯璁ゅ垎浜�
+    uni.showShareMenu({ withShareTicket: true });
+    // #endif
+  },
+  onPullDownRefresh(){
+    this.getCardData();
+  },
+  /**
+   * 鍒濆鍖栦俊鎭�
+   */
+  onShow() {
+    this.deleteShow ? (this.deleteShow = false) : true;
+    if (this.$refs.swiperAction) {
+      this.$refs.swiperAction.forEach((item, index) => {
+        item.show = false;
+      });
+
+      this.getCardData();
+    } else {
+      this.getCardData();
+    }
+  },
+  methods: {
+    /**
+			 * 鍊掓暟璁℃椂
+			 */
+    getCountDownTime(val) {
+      if (val.promotionMap) {
+        let key = Object.keys(val.promotionMap).find((child, index) => {
+          return child.split("-")[0] == 'SECKILL'
+        });
+        return val.promotionMap[key].endTime / 1000 - (new Date().getTime() / 1000)
+      }
+    },
+
+    /**
+     * 浼樻儬鏄庣粏寮�鍏�
+     */
+    discountDetails() {
+      this.discountDetailsFlag = true;
+    },
+    /**
+     * 宸︽粦鎵撳紑鍒犻櫎
+     */
+    openAction(skuItem) {
+      /**寰幆鐖剁骇鏈夊灏戜釜搴楅摵 */
+      this.cartDetail.cartList.forEach((cartItem) => {
+        if (cartItem.skuList) {
+          cartItem.skuList.forEach((sku) => {
+            this.$set(sku, "selected", false);
+          });
+        }
+      });
+      this.$set(skuItem, "selected", true);
+    },
+
+    /**
+     * 婊戝姩鍒犻櫎
+     */
+    changeActionTab(val) {
+      this.deleteShow = true;
+      this.goodsVal = val;
+    },
+
+    /**
+     * 鐐瑰嚮鍒犻櫎
+     */
+    deleteConfirm() {
+      API_Trade.deleteSkuItem(this.goodsVal.goodsSku.id).then((res) => {
+        if (res.statusCode == 200) {
+          uni.showToast({
+            title: "姝ゅ晢鍝佸垹闄ゆ垚鍔�",
+            duration: 2000,
+          });
+          this.deleteShow = false;
+          this.getCardData();
+        }
+      });
+    },
+
+    /**
+     * 鍒犻櫎鍟嗗搧
+     */
+    deleteGoods() {
+      if (this.whetherChecked()) {
+        var delGoodsData = [];
+        this.cartDetail.cartList.forEach((item) => {
+          item.skuList.forEach((goodsItem) => {
+            if (goodsItem.checked) {
+              delGoodsData.push(goodsItem.goodsSku.id);
+            }
+          });
+        });
+        if (delGoodsData && delGoodsData.length > 0) {
+          // 鎵ц鍒犻櫎
+          API_Trade.deleteSkuItem(delGoodsData).then((res) => {
+            if (res.data.success) {
+              uni.showToast({
+                title: "鍒犻櫎鎴愬姛!",
+                icon: "none",
+              });
+              this.getCardData();
+            }
+          });
+        } else {
+          uni.showToast({
+            title: "璇烽�夋嫨鍒犻櫎鍟嗗搧锛屽鏋滃晢鍝佸け鏁堬紝璇峰乏婊戞棤鏁堝晢鍝佸垹闄�",
+            icon: "none",
+          });
+        }
+      }
+    },
+
+    /**
+     * 璺宠浆鍒板簵閾�
+     */
+    navigateToStore(val) {
+      uni.navigateTo({
+        url: "/pages/product/shopPage?id=" + val.storeId,
+      });
+    },
+
+    /**
+     * 璺宠浆鍒颁紭鎯犲埜
+     */
+    navigateToCoupon(val) {
+      uni.navigateTo({
+        url: "/pages/cart/coupon/couponCenter?storeId=" + val.storeId,
+      });
+    },
+
+    /**
+     * 璺宠浆鍒板晢鍝�
+     */
+    navigateToGoods(val) {
+      uni.navigateTo({
+        url:
+          "/pages/product/goods?id=" +
+          val.goodsSku.id +
+          "&goodsId=" +
+          val.goodsSku.goodsId,
+      });
+    },
+
+    /**
+     * 鐐瑰嚮姝ヨ繘鍣ㄥ洖璋�
+     */
+     numChange: debounce(function (val) {
+      this.updateSkuNumFun(val.goodsSku.id, val.num);
+    }, 1000),
+    /**
+     * 鍘荤粨绠�
+     */
+    submitOrder() {
+      if (this.whetherChecked()) {
+        this.navigateTo("/pages/order/fillorder?way=CART");
+      }
+    },
+
+    /**
+     * 楠岃瘉鏄惁閫変腑鍟嗗搧
+     */
+    whetherChecked() {
+    this.$options.filters.forceLogin()
+
+      let canBuy = false;
+      this.cartDetail.cartList.forEach((item) => {
+        if (item.checked) {
+          canBuy = true;
+        } else {
+          item.skuList.forEach((skuItem) => {
+            if (skuItem.checked) {
+              canBuy = true;
+            }
+          });
+        }
+      });
+      if (!canBuy) {
+        uni.showToast({
+          title: "鎮ㄨ繕娌℃湁閫夋嫨鍟嗗搧",
+          duration: 2000,
+          icon: "none",
+        });
+        return false;
+      } else {
+        return true;
+      }
+    },
+
+    /**
+     * 璺宠浆
+     */
+    navigateTo(url) {
+      uni.navigateTo({
+        url,
+      });
+    },
+
+    /**
+     * 鍏ㄩ��
+     */
+    checkOut() {
+      API_Trade.checkAll(this.checkout).then((result) => {
+        if (result.data.success) {
+          this.getCardData();
+          return true;
+        }
+      });
+    },
+
+    /**
+     * 鑾峰彇搴楅摵閫変腑淇℃伅
+     */
+    checkStoreFun(skuId, num) {
+      API_Trade.checkStore(skuId, num).then((result) => {
+        if (result.data.success) {
+          this.getCardData();
+        }
+      });
+    },
+
+    /**
+     * 搴楅摵鐐瑰嚮
+     */
+    checkboxChangeDP(e) {
+      // #ifdef MP-WEIXIN
+      e.checked = !e.checked;
+      // #endif
+      this.checkStoreFun(e.storeId, e.checked);
+    },
+
+    /**
+     * 鑾峰彇璐墿杞﹂�変腑淇℃伅
+     */
+    updateSkuCheckedFun(skuId, num) {
+      API_Trade.updateSkuChecked(skuId, num).then((result) => {
+        if (result.data.success) {
+          this.getCardData();
+        }
+      });
+    },
+
+    /**
+     * 鏇存柊鍟嗗搧璐墿杞︽暟閲�
+     */
+    updateSkuNumFun(skuId, num) {
+      API_Trade.updateSkuNum(skuId, num).then((result) => {
+        if (result.statusCode == 200) {
+          this.getCardData();
+        } else {
+          let _this = this;
+          setTimeout(() => {
+            _this.getCardData();
+          }, 1000);
+        }
+      });
+    },
+
+    // 鏁版嵁鍘婚噸涓�涓�
+    getPromotion(item) {
+        return Object.keys(item.promotionMap).map((child) => {
+          return child.split("-")[0]
+        });
+    },
+
+    /**
+     * 鑾峰彇璐墿杞︽暟鎹�
+     */
+    getCardData() {
+      if (this.$options.filters.isLogin("auth")) {
+        uni.showLoading({
+          title: "鍔犺浇涓�",
+        });
+        API_Trade.getCarts()
+          .then((result) => {
+            this.loading = false;
+            uni.stopPullDownRefresh();
+            if (result.data.success) {
+              this.cartDetail = result.data.result;
+              let checkOuted = true;
+              for (let i = 0; i < this.cartDetail.cartList.length; i++) {
+                let item = this.cartDetail.cartList[i];
+                console.log(item);
+                // 寰幆鍑哄綋鍓嶅晢鍝佹槸鍚﹀叏閫�
+                if (item.checked == 0) {
+                  checkOuted = false;
+                }
+                // 濡傛灉鏈夋嫾鍥㈡椿鍔ㄩ『渚垮垹闄�
+                item.skuList &&
+                  item.skuList.forEach((sku) => {
+                    if (sku.checked == 0) {
+                      checkOuted = false;
+                    }
+                    if(Object.keys(sku.promotionMap).length != 0)
+                    {
+                      Object.keys(sku.promotionMap).forEach((pro, proIndex) => {
+                        pro = pro.split('-')[0]
+                        if (pro == "PINTUAN" ) {
+                           Object.keys(sku.promotionMap).splice(proIndex, 1);
+                        }
+                      });
+                    }
+
+                  });
+              }
+              this.checkout = checkOuted;
+              uni.stopPullDownRefresh();
+            }
+          })
+          .catch((err) => {this.loading = false;});
+         if (this.$store.state.isShowToast){ uni.hideLoading() };
+      } else {
+         if (this.$store.state.isShowToast){ uni.hideLoading() };
+      }
+    },
+
+    /**
+     *  閫変腑鏌愪釜澶嶉�夋鏃讹紝鐢眂heckbox鏃惰Е鍙�
+     */
+    checkboxChange(e) {
+      // #ifdef MP-WEIXIN
+      e.checked = !e.checked;
+      // #endif
+      this.updateSkuCheckedFun(e.goodsSku.id, e.checked);
+    },
+  },
+};
+</script>
+
+<style lang="scss">
+page {
+  background: #f2f2f2;
+}
+</style>
+<style scoped lang="scss">
+// #ifdef MP-WEIXIN
+@import "./mp-carui.scss";
+// #endif
+.u-image {
+  box-shadow: 0 4rpx 12rpx 0 rgba(0, 0, 0, 0.05);
+}
+.edit{
+  padding-right: 32rpx;
+  font-size: 28rpx;
+}
+.promotion-notice {
+  margin-top: 10px;
+  margin-left: 68rpx;
+  font-size: 24rpx;
+  color: #333;
+  font-weight: bold;
+  display: flex;
+  align-items: center;
+  /deep/ .tips {
+    margin: 0 8rpx 0 0;
+    background: $main-color;
+    border-radius: 100px;
+    display: block;
+    flex: 1;
+    padding: 2rpx 12rpx;
+    color: #fff;
+  }
+}
+.default-color {
+  color: #333;
+}
+.goods-row {
+  padding: 30rpx 0;
+
+  display: flex;
+  align-items: center;
+}
+
+.store-name {
+  font-weight: bold;
+  font-size: 28rpx;
+}
+.invalid {
+  filter: grayscale(1);
+}
+
+.cart-item {
+  border-radius: 0.4em;
+  transition: 0.35s;
+}
+
+/* 绌虹櫧椤� */
+/deep/ .u-number-input {
+  background: #fff !important;
+  border: 1px solid #ededed;
+  margin: 0 !important;
+}
+
+/deep/ .u-icon-minus,
+/deep/ .u-icon-plus {
+  background: #ffffff !important;
+  border: 1px solid #ededed;
+  color: #333 !important;
+  width: 40rpx;
+}
+
+.empty {
+  position: fixed;
+  left: 0;
+  top: 0;
+  width: 100%;
+  height: calc(100vh - 50px);
+  z-index: 99;
+  padding-bottom: var(--window-bottom);
+  display: flex;
+  justify-content: center;
+  flex-direction: column;
+  align-items: center;
+  background: #fff;
+
+  image {
+    width: 240rpx;
+    height: 160rpx;
+    margin-bottom: 30rpx;
+  }
+
+  .empty-tips {
+    display: flex;
+    font-size: $font-sm + 2rpx;
+    color: $font-color-disabled;
+
+    .navigator {
+      color: $uni-color-primary;
+      margin-left: 16rpx;
+    }
+  }
+}
+
+.settlement {
+  width: 180rpx;
+  height: 70rpx;
+  line-height: 70rpx;
+  background: linear-gradient(91deg, $light-color 1%, $aider-light-color 99%);
+  border-radius: 900rpx;
+  text-align: center;
+  color: #fff;
+  margin-right: 10rpx;
+}
+
+.price {
+  display: flex;
+  align-items: center;
+
+  /deep/ .number {
+    line-height: 1;
+    font-size: 30rpx;
+    > span {
+      font-weight: bold;
+    }
+  }
+}
+
+.box2 {
+  border-radius: 20rpx;
+  padding: 0 16rpx 0;
+  margin: 0 16rpx 20rpx;
+  .u-checkbox {
+    display: flex;
+    align-items: center;
+    text-align: center;
+  }
+  background: #fff;
+
+}
+
+.wrapper {
+  height: calc(100% - 50px);;
+}
+
+/deep/ .u-col {
+  padding: 24rpx 0 !important;
+}
+
+.goods-content {
+  width: 100%;
+  height: 100%;
+  overflow: hidden;
+  > p {
+    padding-left: 20rpx;
+  }
+}
+
+.content {
+  padding: 20rpx 0 20rpx 0;
+  margin-bottom: 80rpx;
+}
+
+.line {
+  float: left;
+  width: 1px;
+  height: 100%;
+  border-right: 1px solid $light-color;
+}
+
+.store-line-check,
+.store-line-img,
+.store-line-desc {
+  // #ifdef MP-WEIXIN
+  float: left;
+  // #endif
+}
+
+.store-line {
+  // #ifndef MP-WEIXIN
+  display: flex;
+  // #endif
+  overflow: hidden;
+  flex:10;
+}
+
+.goods-config {
+  display: flex;
+  align-items: center;
+  /deep/ .invalid {
+    display: block;
+    width: 80rpx !important;
+  }
+}
+.tab {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  padding: 30rpx 0 0 0;
+}
+
+.right-col {
+  flex:2;
+  text-align: center;
+  width: 100rpx;
+  color: $light-color;
+  font-size: 26rpx;
+
+  > span {
+    margin-left: 20rpx;
+  }
+}
+
+.right-line {
+  width: 3px;
+  float: left;
+  height: 40rpx;
+  border-left: 1px solid #eeeeee;
+
+  /deep/ span {
+    margin-left: 20rpx;
+  }
+}
+
+.box6 {
+  justify-content: space-between;
+  position: fixed;
+  // #ifdef APP-PLUS || MP-WEIXIN
+  bottom: 50px;
+  // #endif
+  // #ifdef H5
+  bottom: var(--window-bottom);
+  // #endif
+  left: 0;
+  border-top: 1px solid #ededed;
+  display: flex;
+  height: 100rpx;
+  overflow: hidden;
+  align-items: center;
+  width: 100%;
+  background: rgba(255, 255, 255, 1);
+  color: #333;
+  z-index: 99;
+  > .navL {
+    padding: 0 32rpx;
+    display: flex;
+    align-items: center;
+  }
+}
+
+.sp-type {
+  color: $u-light-color;
+  padding: 10rpx 0;
+  font-size: 24rpx;
+  overflow: hidden;
+
+  text-overflow: ellipsis;
+
+  white-space: nowrap;
+}
+
+
+.sp-number {
+  font-weight: bold;
+
+  display: flex;
+  justify-content: space-between;
+  > .sp-price {
+    /deep/ span:nth-of-type(1) {
+      font-size: 38rpx;
+    }
+    /deep/ span:nth-of-type(2) {
+      font-size: 24rpx;
+    }
+  }
+}
+.priceDetail-flowPrice {
+  font-weight: bold;
+  padding-left: 20rpx;
+  > span:nth-of-type(1) {
+    font-size: 38rpx;
+  }
+}
+
+.prices {
+  display: flex;
+  flex-direction: column;
+
+  > .discountPrice {
+    align-items: center;
+    display: flex;
+    font-size: 24rpx;
+    color: rgb(201, 199, 199);
+  }
+}
+.discount-details {
+  margin-left: 10px;
+  color: #666;
+  padding: 4rpx 10rpx;
+  border-radius: 100px;
+  background: rgba(201, 199, 199, 0.3);
+}
+.discount-item {
+  display: flex;
+  margin: 40rpx 0;
+  justify-content: space-between;
+  > span:nth-of-type(1) {
+    color: #666;
+  }
+  > span:nth-of-type(2) {
+    color: #333;
+    font-weight: bold;
+  }
+}
+.discount-title {
+  font-size: 36rpx;
+  margin-top: 20rpx;
+  text-align: center;
+}
+.discount-way {
+  width: 94%;
+  margin: 0 3%;
+}
+.discount-list {
+  width: 100%;
+}
+.promotions-list {
+  margin-left: 20rpx;
+  > .promotions-item-seckill {
+    background: rgba($color: $main-color, $alpha: 0.1);
+    font-size: 24rpx;
+    color: $main-color;
+    display: inline;
+    padding: 0rpx 10rpx;
+    border-radius: 100px;
+  }
+}
+</style>
diff --git a/pages/cusbar/cart/mp-carui.scss b/pages/cusbar/cart/mp-carui.scss
new file mode 100644
index 0000000..c33d12a
--- /dev/null
+++ b/pages/cusbar/cart/mp-carui.scss
@@ -0,0 +1,8 @@
+.box2 {
+    padding: 0 16rpx 0;
+  margin: 0 16rpx 20rpx;
+  
+}
+.uNumber{
+    display: flex;
+}
\ No newline at end of file
diff --git a/pages/cusbar/category/category.vue b/pages/cusbar/category/category.vue
new file mode 100644
index 0000000..36bb59d
--- /dev/null
+++ b/pages/cusbar/category/category.vue
@@ -0,0 +1,224 @@
+<template>
+  <view class="category-wrap">
+    <u-navbar class="navbar" :is-back="false">
+      <div class="title">鍟嗗搧鍒嗙被</div>
+      <!-- #ifdef H5 -->
+      <u-search class="nav-search"  @click.native="search" placeholder="鎼滅储鍟嗗搧" :show-action="false"></u-search>
+      <!-- #endif -->
+      <!-- #ifndef H5 -->
+      <u-search class="nav-search" disabled @click.native="search" placeholder="鎼滅储鍟嗗搧" :show-action="false"></u-search>
+      <!-- #endif -->
+    </u-navbar>
+    <view class="content">
+      <scroll-view scroll-y scroll-with-animation class="left-aside">
+        <view v-for="(item, index) in tabList" :key="item.id" class="f-item b-b" :class="{ active: item.id === currentId }" @click="tabtap(item, index)">
+          {{ item.name }}
+        </view>
+      </scroll-view>
+      <scroll-view scroll-with-animation scroll-y class="right-aside" :upper-threshold="-100" :lower-threshold="-100">
+        <!-- 澶撮儴鍥剧墖 -->
+        <view class="top-img" id="main-top">
+          <u-image width="500rpx" height="230rpx" @click="navigateToList(topImg.id,topImg.id)" :src="topImg.image" mode="">
+          </u-image>
+        </view>
+        <view v-for="item in categoryList" :key="item.id" class="s-list" :id="'main-' + item.id">
+          <!-- 鍒嗙被鏍囬 -->
+          <text class="s-item">{{ item.name }}</text>
+          <!-- 鍒嗙被璇︽儏 -->
+          <view class="t-list">
+            <view @click="navigateToList(item.id, children.id)" v-if="children.parentId === item.id" class="t-item" v-for="(children, cIndex) in item.children" :key="children.id"
+              :class="{ 'margin-right': (cIndex + 1) % 3 == 0 }">
+              <u-image width="70px" height="70px" :src="children.image" :lazy-load="true">
+              </u-image>
+              <text>{{ children.name }}</text>
+            </view>
+          </view>
+        </view>
+      </scroll-view>
+    </view>
+	<custom-tabbar bgColor="#ffffff" selected="shop"></custom-tabbar>
+  </view>
+</template>
+
+<script>
+import '@/components/uview-components/uview-ui';
+import { getCategoryList } from "@/api/goods.js";
+export default {
+  data() {
+    return {
+      currentId: 0,
+      tabList: [], //宸︿晶鏍囬鍒楄〃
+      categoryList: [], //鍙充晶鍒嗙被鏁版嵁鍒楄〃
+      topImg: "", //椤堕儴鍥剧墖
+    };
+  },
+  onLoad() {
+    this.loadData();
+    // #ifdef MP-WEIXIN
+    // 灏忕▼搴忛粯璁ゅ垎浜�
+    uni.showShareMenu({ withShareTicket: true });
+    // #endif
+  },
+  methods: {
+    /**
+     * 鏌ヨ
+     */
+    search() {
+      uni.navigateTo({
+        url: "/pages/navigation/search/searchPage",
+      });
+    },
+
+    /**
+     * 鍔犺浇鍥剧墖
+     */
+    async loadData() {
+      let list = await getCategoryList(0);
+      this.tabList = list.data.result;
+      this.currentId = list.data.result[0].id;
+      this.loadListContent(0);
+    },
+
+    /**
+     * 鍔犺浇鍒楄〃鍐呭
+     */
+    loadListContent(index) {
+      this.topImg = this.tabList[index];
+      this.categoryList = this.tabList[index].children;
+    },
+    /**
+     * 涓�绾у垎绫荤偣鍑�
+     */
+    tabtap(item, i) {
+      if (item.id != this.currentId) {
+        this.currentId = item.id;
+        this.loadListContent(i);
+      }
+    },
+
+    navigateToList(sid, tid) {
+      uni.navigateTo({
+        url: `/pages/navigation/search/searchPage?category=${tid}`,
+      });
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+page {
+  height: 100%;
+  background-color: #fdfaff;
+}
+/* 瑙e喅灏忕▼搴忓拰app婊氬姩鏉$殑闂 */
+/* #ifdef MP-WEIXIN || APP-PLUS */
+::-webkit-scrollbar {
+  display: none;
+}
+/* #endif */
+/* 瑙e喅H5 鐨勯棶棰� */
+/* #ifdef H5 */
+uni-scroll-view .uni-scroll-view::-webkit-scrollbar {
+  /* 闅愯棌婊氬姩鏉★紝浣嗕緷鏃у叿澶囧彲浠ユ粴鍔ㄧ殑鍔熻兘 */
+  display: none;
+}
+/* #endif */
+.s-list {
+  box-shadow: 0 4rpx 12rpx 0 rgba(0, 0, 0, 0.05);
+}
+.nav-search {
+  padding-left: 30rpx !important;
+  padding-right: 20rpx !important;
+}
+.title {
+  display: block;
+  width: 259rpx;
+  text-align: center;
+   font-size: 28rpx;
+
+ 
+}
+.category-wrap {
+  height: 100%;
+  .content {
+    height: calc(100vh - 94px);
+    display: flex;
+    color: #333;
+    font-size: 28rpx;
+    background: #fff;
+  }
+  .left-aside {
+    flex-shrink: 0;
+    width: 200rpx;
+    height: 100%;
+    background-color: #f7f7f7;
+  }
+  .f-item {
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    width: 100%;
+    height: 97rpx;
+    position: relative;
+    &.active {
+      font-weight: bold;
+      color: $light-color;
+      background: #fff;
+    }
+  }
+  .right-aside {
+    flex: 1;
+    overflow: hidden;
+    padding: 40rpx 0 0 30rpx;
+  }
+
+  .top-img {
+    width: 500rpx;
+    height: 230rpx;
+    border-radius: 8px;
+    overflow: hidden;
+    image {
+      width: 100%;
+      height: 100%;
+    }
+  }
+  .s-item {
+    display: flex;
+    align-items: center;
+    height: 70rpx;
+    padding-top: 16rpx;
+    font-weight: 500;
+  }
+  .t-list {
+    display: flex;
+    flex-wrap: wrap;
+    width: 100%;
+    padding-top: 12rpx;
+  }
+  .margin-right {
+    margin-right: 0 !important;
+  }
+  .t-item {
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    flex-direction: column;
+    width: 150rpx;
+    margin-right: 25rpx;
+    font-size: 24rpx;
+    padding-bottom: 20rpx;
+    image {
+      width: 140rpx;
+      height: 140rpx;
+      border-radius: 8px;
+      margin-bottom: 20rpx;
+    }
+    /deep/ .u-image {
+      width: 140rpx !important;
+      height: 140rpx !important;
+      border-radius: 8px !important;
+      margin-bottom: 20rpx !important;
+    }
+  }
+}
+</style>
diff --git a/pages/cusbar/screen/fullScreen.vue b/pages/cusbar/screen/fullScreen.vue
new file mode 100644
index 0000000..c93b1cd
--- /dev/null
+++ b/pages/cusbar/screen/fullScreen.vue
@@ -0,0 +1,96 @@
+<template>
+   <u-modal v-model="show" cancelText="涓嶅悓鎰�" confirmText="鍚屾剰" showCancelButton title="鏈嶅姟鍗忚鍜岄殣绉佹斂绛�" @confirm="confirm" @cancel="cancel">
+    <view class="u-update-content">
+      璇锋偍鍔″繀瀹℃厧闃呰,鍏呭垎鐞嗚В鈥滄湇鍔″崗璁�濆拰鈥滈殣绉佹斂绛栤�濆悇鏉℃锛�
+      鍖呮嫭浣嗕笉闄愪簬锛氫负浜嗘洿濂界殑鍚戜綘鎻愪緵鏈嶅姟锛屾垜浠渶瑕佹敹闆嗕綘鐨勮澶囨爣璇�,
+      鎿嶄綔鏃ュ織绛変俊鎭敤浜庡垎鏋愶紝浼樺寲搴旂敤鎬ц兘銆� 鎮ㄥ彲闃呰浣犲彲闃呰
+      <a @click="gotoLink">銆婃湇鍔″崗璁��</a>
+      鍜�
+      <a @click="gotoB"> 銆婇殣绉佹斂绛栥��</a>浜嗚В璇︾粏淇℃伅銆�
+      濡傛灉鎮ㄥ悓鎰忥紝璇风偣鍑讳笅闈㈡寜閽紑濮嬫帴鍙楁垜浠殑鏈嶅姟銆�
+    </view>
+  </u-modal>
+</template>
+
+<script>
+import storage from "@/utils/storage";
+export default {
+  created() {
+    //鍏堣繘鍏� created
+    // if (storage.getShow()) {
+    //   //灞曠ず鐨勮瘽杩涘叆  true
+    //   console.log(this.show); //濡傛灉涓婇潰娌¤缂撳瓨  姝ゆ椂 this.show 涓簍rue
+    //   if (!this.show) {
+    //     //濡傛灉绛変簬 false 浜� 灏辫烦鍒颁富椤�
+    //     this.show = storage.getShow(); //杩欓噷灏变负false
+    //     setTimeout(() => {
+    //       //鐒跺悗杩欓噷灏辫烦杞埌  棣栭〉
+    //       uni.reLaunch({
+    //         //璺宠浆鍒� 棣栭〉
+    //         url: "/pages/tabbar/home/index",
+    //       });
+    //     }, 500);
+    //   }
+    // }
+  },
+  data() {
+    return {
+      show: true, //灞曠ず
+      btnShow:true,
+      a: "",
+    };
+  },
+  //   onReady() {
+  //     this.show = true;
+  //   },
+  methods: {
+    gotoLink() {
+      uni.navigateTo({
+        //鐐瑰嚮璺宠浆鍒版祻瑙堝櫒
+        url:
+          "/pages/tabbar/home/web-view?src=https://pc-b2b2c.pickmall.cn/article/detail?id=1371992704333905920",
+      });
+    },
+    gotoB() {
+      uni.navigateTo({
+        url:
+          "/pages/tabbar/home/web-view?src=https://pc-b2b2c.pickmall.cn/article/detail?id=1371779927900160000",
+      });
+    },
+     //鍙栨秷
+    cancel(){
+      // #ifdef APP-PLUS
+        //  const threadClass = plus.ios.importClass("NSThread");
+        //  const mainThread = plus.ios.invoke(threadClass, "mainThread");
+        //  plus.ios.invoke(mainThread, "exit")
+       plus.ios.import("UIApplication").sharedApplication().performSelector("exit")
+		 // #endif
+    },
+    confirm() {
+      //鐐瑰嚮
+      this.show = false; // 璁╄繖涓涓篺alse
+      storage.setShow(this.show); //瀛樺叆缂撳瓨
+      if (!this.show) {
+        // 浠栧鏋� 涓嶅睍绀�  灏辫烦杞埌涓婚〉
+        setTimeout(() => {
+          uni.reLaunch({
+            //璺宠浆鍒� 棣栭〉
+            url: "/pages/tabbar/home/index",
+          });
+        }, 500);
+      }
+    },
+  },
+};
+</script>
+
+<style scoped>
+.u-update-content {
+  font-size: 26rpx;
+  padding: 30rpx;
+}
+a {
+  text-decoration: blue;
+  color: blue;
+}
+</style>
diff --git a/pages/cusbar/special/special.vue b/pages/cusbar/special/special.vue
new file mode 100644
index 0000000..f5a4442
--- /dev/null
+++ b/pages/cusbar/special/special.vue
@@ -0,0 +1,248 @@
+<template>
+  <div class="wrapper">
+    <!-- uni 涓笉鑳戒娇鐢� vue component 鎵�浠ョ敤if鍒ゆ柇姣忎釜缁勪欢 -->
+    <div v-for="(item, index) in pageData.list" :key="index">
+      <!-- 鎼滅储鏍忥紝濡傛灉鍦ㄦゼ灞傝淇《閮ㄥ垯浼氳嚜鍔ㄦ诞鍔紝鍚﹀垯涓嶆诞鍔� -->
+      <div class="navbar" v-if="item.type == 'search'">
+        <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 -->
+      </div>
+      <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 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>
+    <u-no-network></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 { toSpecial, getSpecial } from "@/api/home"; //鑾峰彇妤煎眰瑁呬慨鎺ュ彛
+import permision 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"; //鏍囬鏍忔ā鍧�
+
+export default {
+  data() {
+    return {
+      id: "",
+      config,
+      pageData: "", //妤煎眰椤甸潰鏁版嵁
+      bodyParam: "",
+      isIos: ""
+    };
+  },
+  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
+  },
+
+  mounted() {
+    this.init();
+    // #ifdef MP-WEIXIN
+    // 灏忕▼搴忛粯璁ゅ垎浜�
+    uni.showShareMenu({ withShareTicket: true });
+    // #endif
+  },
+  onLoad(val) {
+    this.id = val.id;
+    this.bodyParam = val.body;
+  },
+
+  methods: {
+    /**
+     * 瀹炰緥鍖栭椤垫暟鎹ゼ灞�
+     */
+    init() {
+      this.pageData = "";
+	  console.log(this.bodyParam);
+      if (this.bodyParam) {
+        toSpecial({body: this.bodyParam}).then(res => {
+          if (res.data.success) {
+            this.pageData = JSON.parse(res.data.result.pageData);
+          }
+        });
+      } else {
+        getSpecial(this.id).then(res => {
+        if (res.data.success) {
+          this.pageData = JSON.parse(res.data.result.pageData);
+        }
+      });
+      }
+    },
+
+    /**
+     * TODO 鎵爜鍔熻兘鍚庣画杩樹細鍚庣画澧炲姞
+     * 搴旇瀹炵幇鐨勫姛鑳界洰鍓嶈鍒掓湁锛�
+     * 鎵弿鍟嗗搧璺宠浆鍟嗗搧椤甸潰
+     * 鎵弿娲诲姩璺宠浆娲诲姩椤甸潰
+     * 鎵弿浜岀淮鐮佺櫥褰�
+     * 鎵弿鍏朵粬绔欎俊鎭� 寮瑰嚭鎻愮ず锛岃繑鍥為椤点��
+     */
+    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);
+              }
+            });
+          }
+        }
+      });
+    },
+
+    /**
+     * 鎻愮ず鑾峰彇鏉冮檺
+     */
+    tipsGetSettings() {
+      uni.showModal({
+        title: "鎻愮ず",
+        content: "鎮ㄥ凡缁忓叧闂浉鏈烘潈闄�,鍘昏缃�",
+        success: function(res) {
+          if (res.confirm) {
+            if (this.isIos) {
+              plus.runtime.openURL("app-settings:");
+            } else {
+              permision.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.seacnCode();
+        } else {
+          if (permision.judgeIosPermission("camera")) {
+            this.seacnCode();
+          } else {
+            // 娌℃湁鏉冮檺鎻愰啋鏄惁鍘荤敵璇锋潈闄�
+            this.tipsGetSettings();
+          }
+        }
+      } else {
+        /**
+         * TODO 瀹夊崜 鏉冮檺宸茬粡鎺堟潈浜嗭紝璋冪敤api鎬绘槸鏄剧ず鐢ㄦ埛宸叉案涔呮嫆缁濈敵璇枫�備汉鍌讳簡
+         * TODO 濡傛灉xdm鏈夋洿濂界殑鍔炴硶璇峰湪 https://gitee.com/beijing_hongye_huicheng/lilishop/issues 鎻愪笅璋㈣阿
+         */
+        this.seacnCode();
+      }
+
+      // #endif
+
+      // #ifdef MP-WEIXIN
+      this.seacnCode();
+      // #endif
+    }
+  }
+};
+</script>
+
+<style scoped lang="scss">
+.navbar-right {
+  padding: 0 16rpx 0 0;
+}
+
+.navbar {
+  display: flex;
+  align-items: center;
+}
+</style>
\ No newline at end of file
diff --git a/pages/cusbar/video/video.vue b/pages/cusbar/video/video.vue
new file mode 100644
index 0000000..c601704
--- /dev/null
+++ b/pages/cusbar/video/video.vue
@@ -0,0 +1,940 @@
+<template>
+  <view class="publish-container" :style="{height: windowHeight - marginBottom - 50 + 'px'}">
+	<u-popup v-model="fileTypeShow" mode="bottom"  round="20" height="35%">
+		<view style="width: 100%;height:100%;display: flex;flex-direction: column;justify-content: center;align-items: center;">
+			<view>璇烽�夋嫨瑕佸彂甯冪殑绫诲瀷</view>
+			<u-button style="width: 50%;margin-bottom: 30rpx;margin-top: 20rpx;" type="success" @click="chooseVideo">瑙嗛</u-button>
+			<u-button style="width: 50%;" type="success" @click="chooseImgs">鍥剧墖</u-button>
+		</view>
+	</u-popup>
+    <!-- 瑙嗛涓婁紶鍖哄煙 -->
+    <view class="upload-section">
+      <view class="upload-btn" @click="this.fileTypeShow = true" v-if="!formData.videoFileKey && formData.videoImgs.length < 1">
+        <u-icon name="plus" size="40" color="#999"></u-icon>
+        <text class="upload-text">鐐瑰嚮涓婁紶</text>
+      </view>
+
+      <view class="video-preview" v-else-if="formData.videoContentType === 'video'">
+        <video
+          :src="videoInfo.url"
+          :object-fit="formData.videoFit"
+          class="video-player"
+          :poster="videoInfo.cover || ''"
+        ></video>
+		<view class="progress-box">
+			<progress style="width: 100%;" :percent="videoUploadProgress" active-mode="forwards" show-info stroke-width="6" :active="true" active-color="#ff573e" />
+		</view>
+        <view class="video-actions">
+          <u-button type="error" size="mini" @click="reUpload">閲嶆柊涓婁紶</u-button>
+          <u-button type="primary" size="mini" @click="chooseCover" v-if="formData.videoFileKey">{{formData.cover ? '鏇存崲灏侀潰' : '璇烽�夋嫨灏侀潰'}}</u-button>
+        </view>
+      </view>
+
+	  <view class="image-list" v-else-if="formData.videoContentType === 'img'">
+		<view
+		  v-for="item in videoPreviewImgs"
+		  :key="item"
+		  class="image-item"
+		  :style="{width: itemWidth + 'px', height: itemWidth + 'px'}"
+		>
+		  <image
+			:src="item"
+			mode="aspectFill"
+			class="image"
+		  />
+		</view>
+		<view class="video-actions">
+		  <u-button type="error" size="mini" @click="reUpload">閲嶆柊涓婁紶</u-button>
+		</view>
+	  </view>
+    </view>
+
+    <!-- 瑙嗛淇℃伅琛ㄥ崟 -->
+    <view class="form-section">
+      <u-form :model="formData" ref="formRef" labelWidth="80">
+        <!-- 鏍囬杈撳叆 -->
+        <u-form-item label="鏍囬" prop="title" borderBottom>
+          <u-input
+            v-model="formData.title"
+            placeholder="璇疯緭鍏ヨ棰戞爣棰�,20瀛椾互鍐�"
+            maxlength="20"
+			show-word-limit
+            clearable
+          />
+        </u-form-item>
+
+        <!-- 璇濋杈撳叆 -->
+        <u-form-item label="璇濋" prop="tags" borderBottom>
+          <view class="tags-input-container">
+            <u-input
+              v-model="tagInput"
+              placeholder="杈撳叆璇濋锛屽洖杞︾‘璁�"
+              clearable
+              @confirm="addTag"
+              @blur="addTag"
+              @input="searchTags"
+            ></u-input>
+            <!-- 宸查�夎瘽棰樺睍绀� -->
+            <view class="tags-display" v-show="formData.tags.length > 0">
+              <my-tag
+                v-for="(tag, index) in formData.tags"
+                :key="index"
+                :text="tag.tagName"
+				:index="index"
+				type="success"
+                @close="removeTag(index)"
+              />
+            </view>
+            <text class="tags-count" v-show="formData.tags.length > 0">
+              宸查�� {{ formData.tags.length }}/5
+            </text>
+          </view>
+		  <!-- 璇濋鎺ㄨ崘 -->
+		  <view class="hot-topics" v-show="showTopicRecommendations">
+		    <text class="section-title">{{ tagInput ? '鎺ㄨ崘璇濋' : '鐑棬璇濋' }}</text>
+		    <view class="topic-list">
+		      <my-tag
+		        v-for="(tag, index) in recommendedTags"
+		        :key="index"
+		        :text="tag.tagName"
+		  	    :index="index"
+		        type="success"
+		  	  :closeable="false"
+		        @click="selectTopic(index)"
+		      />
+		    </view>
+		  </view>
+        </u-form-item>
+
+
+        <!-- 鍟嗗搧閾炬帴 -->
+        <u-form-item label="鍟嗗搧" prop="goodsId" borderBottom>
+          <view class="goods-link-container">
+            <u-input
+              placeholder="鍙�夋嫨鎺ㄨ崘鍟嗗搧"
+              clearable
+              v-if="!selectedGoods"
+              @click="chooseGoods"
+              disabled
+            >
+              <u-icon
+                slot="right"
+                name="search"
+                size="24"
+                @click="chooseGoods"
+              ></u-icon>
+            </u-input>
+            <view class="goods-preview" @click="chooseGoods" v-for="goods in selectedGoodsList" :key="goods.id">
+              <image :src="endpoint + '/' + goods.thumbnail" class="goods-image"></image>
+              <view class="goods-info">
+                <text class="goods-name">{{ goods.goodsName }}</text>
+				<view style="display: flex;">
+					<view class="goods-price" style="flex: 1;">楼{{ goods.price }}</view>
+					<view @click.stop="() => {}" style="flex: 1;display: flex;justify-content: center;align-items: center;">
+						<view style="width: 90rpx">鏁伴噺锛�</view>
+						<uni-number-box v-model="goods.goodsNum" :min="1"/>
+					</view>
+				</view>
+              </view>
+              <u-icon
+				style="position: absolute;right: 8rpx;top: 8rpx"
+                name="close"
+                size="24"
+                @click.stop="clearGoods(goods)"
+              ></u-icon>
+            </view>
+          </view>
+        </u-form-item>
+      </u-form>
+    </view>
+
+    <!-- 鍙戝竷鎸夐挳 -->
+    <view class="publish-btn">
+      <u-button
+        type="success"
+        shape="circle"
+        :loading="loading"
+        @click="handlePublish"
+        :disabled="!canPublish"
+      >
+        {{ loading ? '鍙戝竷涓�...' : '绔嬪嵆鍙戝竷' }}
+      </u-button>
+    </view>
+
+    <!-- 鍟嗗搧閫夋嫨寮圭獥 -->
+    <u-popup v-model="showGoodsPicker" mode="bottom" round="20" height="70%">
+      <view class="goods-picker">
+        <view class="picker-header">
+          <text class="picker-title">閫夋嫨鍟嗗搧</text>
+          <u-icon name="close" size="24" @click="showGoodsPicker = false"></u-icon>
+        </view>
+        <view class="search-bar">
+          <u-search
+            v-model="goodsQuery.keyword"
+            placeholder="鎼滅储鍟嗗搧"
+            :showAction="false"
+			@change="handlerGoodsSearch"
+          ></u-search>
+        </view>
+        <scroll-view class="goods-list" @scrolltolower="loadMoreGoods" scroll-y :show-scrollbar="false">
+          <view
+            class="goods-item"
+            v-for="(goods, index) in goodsList"
+            :key="goods.id"
+            @click="selectGoods(goods, index)"
+          >
+            <image :src="endpoint + '/' + goods.thumbnail" class="goods-image"></image>
+            <view class="goods-info">
+              <text class="goods-name">{{ goods.goodsName }}</text>
+              <text class="goods-price">楼{{ goods.price }}</text>
+<!--              <view>{{ goods.sellingPoint }}</view> -->
+            </view>
+            <u-icon
+			  v-if="goods.selected"
+              name="checkmark"
+              size="36"
+              :color="'#2979ff'"
+            ></u-icon>
+          </view>
+        </scroll-view>
+      </view>
+    </u-popup>
+
+    <custom-tabbar bgColor="#ffffff" selected="video"></custom-tabbar>
+  </view>
+</template>
+
+<script>
+import '@/components/uview-components/uview-ui';
+import MyTag from '@/components/my-tag.vue'
+
+import { getSTSToken } from "@/api/common.js";
+import { publish } from "@/api/video.js";
+import { getRecommendTag3 } from "@/api/video-tag.js";
+import { getFileKey } from "@/utils/file.js";
+import { getVideoGoodsList } from "@/api/goods.js";
+
+export default {
+  components: {MyTag},
+  data() {
+    return {
+	  fileTypeShow: false,
+	  cosClient: null,
+	  bucket: '',
+	  region: '',
+	  endpoint: '',
+	  videoUploadProgress: 0,
+      loading: false,
+      showGoodsPicker: false,
+      tagInput: '',
+	  videoPreviewImgs: [], // 棰勮鍥剧墖鍦板潃
+      videoInfo: {
+		  url: '',
+		  fileKey: '',
+		  fileType: '',
+		  fileSize: 0,
+		  originalFileName: '',
+		  cover: ''
+	  },
+	  goodsQuery: {
+		keyword: '',
+		searchFromSelfStore: false, // 鏄惁鏄煡璇㈣嚜瀹跺簵閾哄晢鍝�
+		pageNumber: 0,
+		pageSize: 5
+	  },
+      formData: {
+		id: '',
+        title: '',
+		cover: '',
+		videoFileKey: '',
+		videoDuration: 0,
+		videoFit: 'cover',
+        videoContentType: 'video',
+        videoImgs: [],
+        tags: [],
+		fileInfo: {}
+      },
+      selectedGoodsList: [],
+      goodsList: [],
+	  noMoreGoods: false, // 娌℃湁鏇村鍟嗗搧浜�
+      recommendedTags: [],
+      rules: {
+        title: [
+          { required: true, message: '璇疯緭鍏ヨ棰戞爣棰�', trigger: 'blur' },
+          { min: 1, max: 20, message: '鏍囬闀垮害鍦�1鍒�20涓瓧绗�', trigger: 'blur' }
+        ]
+      },
+	  screenWidth: 375,
+	  gap: 10, // 鍥剧墖闂磋窛
+	  windowHeight: 0,
+	  marginBottom: 0
+    };
+  },
+  computed: {
+    canPublish() {
+		if(this.formData.videoContentType === 'video') {
+			return this.formData.videoFileKey && this.formData.title && this.formData.cover;
+		} else if(this.formData.videoContentType === 'img') {
+			return this.formData.videoImgs.length > 0 && this.formData.title;
+		}
+    },
+    showTopicRecommendations() {
+      return (this.tagInput === '' || this.recommendedTags.length > 0) && this.formData.tags.length < 5;
+    },
+	// 璁$畻姣忎釜鍥剧墖椤圭殑瀹藉害锛堣�冭檻闂磋窛锛�
+	itemWidth() {
+	  return (this.screenWidth - (this.gap * 4) - 20) / 3
+	}
+  },
+  onLoad() {
+    // 鑾峰彇灞忓箷瀹藉害
+	const systemInfo = uni.getSystemInfoSync()
+	this.screenWidth = systemInfo.windowWidth
+	this.windowHeight = systemInfo.windowHeight
+	this.marginBottom = uni.getSystemInfoSync().safeAreaInsets.bottom
+	this.goodsQuery.pageNumber = 0
+	this.goodsQuery.pageSize = 10
+	this.getVideoGoodsByEs()
+  },
+  onShow() {
+  	this.initCOS()
+	// 鍒濆鍖栨帹鑽愭爣绛�
+	this.getRecommendTags()
+  },
+  methods: {
+	  // 鍔犺浇鏇村鍟嗗搧
+	  loadMoreGoods() {
+		if(this.noMoreGoods) {
+			return
+		}
+		this.goodsQuery.pageNumber += 1;
+		this.goodsQuery.pageSize = 5;
+		this.getVideoGoodsByEs()
+	  },
+	  // 澶勭悊鍟嗗搧鎼滅储鍊�
+	  handlerGoodsSearch() {
+		  this.goodsQuery.pageNumber = 0
+		  this.goodsQuery.pageSize = 10
+		  this.getVideoGoodsByEs()
+	  },
+	  // 鑾峰彇鍟嗗搧鍒嗛〉
+	  async getVideoGoodsByEs() {
+		getVideoGoodsList(this.goodsQuery).then(res => {
+			
+			if(this.goodsQuery.pageNumber === 0) {
+				this.goodsList = res.data.data
+			} else {
+				this.goodsList = [
+				  ...this.goodsList,
+				  ...res.data.data.filter(
+				    (newItem) => !this.goodsList.some((oldItem) => oldItem.id === newItem.id)
+				  ),
+				];
+			}
+			if(res.data.data.length < this.goodsQuery.pageSize) {
+				this.noMoreGoods = true;
+			}
+		})
+	  },
+	  // 鑾峰彇鎺ㄨ崘鏍囩
+	  async getRecommendTags(type) {
+		  const params = {
+			  tagName: this.tagInput.trim(),
+			  searchType: type
+		  }
+		  getRecommendTag3(params).then(res => {
+			  this.recommendedTags = res.data.data
+		  })
+	  },
+	  // 鍒濆鍖栬吘璁簯cos瀹㈡埛绔�
+	  initCOS() {
+		  // 璋冪敤鍚庣鑾峰彇sts涓存椂璁块棶鍑瘉
+		  getSTSToken().then(res => {
+			  const COS = require('@/lib/cos-wx-sdk-v5.js'); // 寮�鍙戞椂浣跨敤
+			  // const COS = require('./lib/cos-wx-sdk-v5.min.js'); // 涓婄嚎鏃朵娇鐢ㄥ帇缂╁寘
+
+			  // console.log(COS.version);  sdk 鐗堟湰闇�瑕佷笉浣庝簬 1.7.2
+			  this.cosClient = new COS({
+			      SecretId: res.data.data.tmpSecretId, // sts 鏈嶅姟涓嬪彂鐨勪复鏃� secretId
+			      SecretKey: res.data.data.tmpSecretKey, // sts 鏈嶅姟涓嬪彂鐨勪复鏃� secretKey
+			      SecurityToken: res.data.data.sessionToken, // sts 鏈嶅姟涓嬪彂鐨勪复鏃� SessionToken
+			      StartTime: res.data.data.stsStartTime, // 寤鸿浼犲叆鏈嶅姟绔椂闂达紝鍙伩鍏嶅鎴风鏃堕棿涓嶅噯瀵艰嚧鐨勭鍚嶉敊璇�
+			      ExpiredTime: res.data.data.stsEndTime, // 涓存椂瀵嗛挜杩囨湡鏃堕棿
+			      SimpleUploadMethod: 'putObject', // 寮虹儓寤鸿锛岄珮绾т笂浼犮�佹壒閲忎笂浼犲唴閮ㄥ灏忔枃浠跺仛绠�鍗曚笂浼犳椂浣跨敤 putObject,sdk 鐗堟湰鑷冲皯闇�瑕乿1.3.0
+			   });
+			   this.bucket = res.data.data.bucket
+			   this.region = res.data.data.region
+			   this.endpoint = res.data.data.endpoint
+		  })
+
+	  },
+    // 閫夋嫨瑙嗛
+    chooseVideo() {
+	  this.fileTypeShow = false;
+	  // 娓呯┖閫夋嫨鐨勫浘鐗�
+	  this.videoPreviewImgs = [];
+	  this.formData.videoImgs = [];
+	  this.formData.videoContentType = 'video'
+      uni.chooseVideo({
+        sourceType: ['album', 'camera'],
+        maxDuration: 60,
+        camera: 'back',
+        success: (res) => {
+			this.videoUploadProgress = 0
+			// 鑾峰彇鏂囦欢鍚�
+			const tempPath = res.tempFilePath;
+			let fileName = tempPath.substring(tempPath.lastIndexOf('/') + 1);
+
+			// 澶勭悊瀹夊崜鍙兘鐨刄RI缂栫爜
+			if(fileName.indexOf('%') > -1) {
+				fileName = decodeURIComponent(fileName);
+			}
+			const fileKey = getFileKey(fileName);
+		   this.videoInfo = {
+			 url: res.tempFilePath,
+			 fileKey: fileKey,
+			 fileType: fileKey.split('/')[0],
+			 fileSize: res.size,
+			 originalFileName: fileName,
+			 cover: ''
+		   };
+		   this.formData.videoFileKey = fileKey;
+		   this.formData.videoDuration = res.duration;
+		   // 鍒ゆ柇瑙嗛鐨勫~鍏呮ā寮�
+		   this.formData.videoFit = this.calculateVideoFit(res.width, res.height)
+
+		   this.cosClient.uploadFile({
+		        Bucket: this.bucket,
+		        Region: this.region,
+		        Key: fileKey,
+		        FilePath: res.tempFilePath,
+		        SliceSize: 1024 * 1024 * 5,     /* 瑙﹀彂鍒嗗潡涓婁紶鐨勯槇鍊�,5M */
+		        onProgress: (progressData) => {
+					console.log(progressData.percent);
+					this.videoUploadProgress = progressData.percent * 100
+		        }
+		    }, (err, data) => {
+		        if (err) {
+		          console.log('涓婁紶澶辫触', err);
+				  this.videoInfo = {
+					  url: '',
+					  fileKey: '',
+					  fileType: '',
+					  fileSize: 0,
+					  originalFileName: '',
+					  cover: ''
+				  }
+		        } else {
+				  console.log(this.videoInfo);
+		        }
+		    });
+        },
+        fail: (err) => {
+          uni.showToast({
+            title: '鏈�夋嫨瑙嗛',
+            icon: 'none'
+          });
+          console.error(err);
+        }
+      });
+    },
+    // 鏍规嵁瀹介珮姣旈�夋嫨瑙嗛濉厖妯″紡
+    calculateVideoFit(width, height) {
+        const viewportRatio = uni.getSystemInfoSync().windowWidth / uni.getSystemInfoSync().windowHeight;
+        const videoRatio = width / height;
+
+        // 瑙勫垯1锛氳秴瀹借棰戯紙濡傜數褰�21:9锛�
+        if (videoRatio > 2) return 'contain';
+
+        // 瑙勫垯2锛氱珫灞忚棰戯紙濡�9:16锛�
+        if (videoRatio < 0.8) return 'cover';
+
+        // 瑙勫垯3锛氭帴杩戝睆骞曟瘮渚嬬殑妯睆瑙嗛
+        return Math.abs(videoRatio - viewportRatio) > 0.3 ? 'contain' : 'cover';
+    },
+    // 閲嶆柊涓婁紶
+    reUpload() {
+      this.videoInfo = {
+      	  url: '',
+      	  fileKey: '',
+      	  fileType: '',
+      	  fileSize: 0,
+      	  originalFileName: '',
+      	  cover: ''
+      };
+      this.formData.videoFileKey = ''
+      this.formData.cover = ''
+      this.formData.videoFit = 'cover'
+      this.formData.videoDuration = 0
+      this.formData.videoImgs = []
+      this.formData.fileInfo = {}
+      this.formData.videoContentType = 'video'
+      this.videoPreviewImgs = []
+	  this.fileTypeShow = true
+    },
+    // 閫夋嫨瑙嗛鍥鹃泦
+    chooseImgs() {
+	  this.fileTypeShow = false
+	  // 娓呯┖閫夋嫨鐨勮棰�
+	  this.formData.videoFileKey = '';
+	  this.formData.cover = '';
+	  this.formData.videoContentType = 'img'
+      uni.chooseImage({
+        count: 9,
+        sizeType: ['compressed'],
+        sourceType: ['album'],
+        success: (res) => {
+		  res.tempFilePaths.forEach(tmpImg => {
+			  let fileName = tmpImg.substring(tmpImg.lastIndexOf('/') + 1);
+			  // 澶勭悊瀹夊崜鍙兘鐨刄RI缂栫爜
+			  if(fileName.indexOf('%') > -1) {
+				fileName = decodeURIComponent(fileName);
+			  }
+			  const fileKey = getFileKey(fileName);
+			  this.cosClient.uploadFile({
+			       Bucket: this.bucket,
+			       Region: this.region,
+			       Key: fileKey,
+			       FilePath: tmpImg,
+			       SliceSize: 1024 * 1024 * 5     /* 瑙﹀彂鍒嗗潡涓婁紶鐨勯槇鍊�,5M */
+			   }, (err, data) => {
+			       if (err) {
+			         console.log('涓婁紶澶辫触', err);
+			       } else {
+			  		 // 鑾峰彇灏侀潰鐨勮闂湴鍧�
+					 this.videoPreviewImgs.push(this.endpoint + '/' + fileKey);
+					 this.formData.videoImgs.push(fileKey);
+			       }
+			   });
+		  })
+
+        }
+      });
+    },
+    // 閫夋嫨灏侀潰
+    chooseCover() {
+      uni.chooseImage({
+        count: 1,
+        sizeType: ['compressed'],
+        sourceType: ['album'],
+        success: (res) => {
+		  let fileName = res.tempFilePaths[0].substring(res.tempFilePaths[0].lastIndexOf('/') + 1);
+		  // 澶勭悊瀹夊崜鍙兘鐨刄RI缂栫爜
+		  if(fileName.indexOf('%') > -1) {
+				fileName = decodeURIComponent(fileName);
+		  }
+		  const fileKey = getFileKey(fileName);
+          this.videoInfo.cover = res.tempFilePaths[0];
+		  this.cosClient.uploadFile({
+		       Bucket: this.bucket,
+		       Region: this.region,
+		       Key: fileKey,
+		       FilePath: res.tempFilePaths[0],
+		       SliceSize: 1024 * 1024 * 5     /* 瑙﹀彂鍒嗗潡涓婁紶鐨勯槇鍊�,5M */
+		   }, (err, data) => {
+		       if (err) {
+		         console.log('涓婁紶澶辫触', err);
+		       } else {
+		  		 this.videoInfo.cover = this.endpoint + '/' + fileKey
+		  		 this.formData.cover = fileKey
+		       }
+		   });
+        }
+      });
+    },
+
+    // 閫夋嫨鍟嗗搧
+    chooseGoods() {
+	  if(this.selectedGoodsList.length > 0) {
+	  		  const selectedGoodsSkuIds = new Set(this.selectedGoodsList.map(i => i.id));
+	  		  this.goodsList?.forEach(goods => {
+	  		      this.$set(goods, 'selected', selectedGoodsSkuIds.has(goods.id));
+	  		    });
+	  }
+      this.showGoodsPicker = true;
+    },
+
+    // 閫夋嫨鍏蜂綋鍟嗗搧
+    selectGoods(goods, index) {
+	  if(! this.selectedGoodsList.some(item => item.id === goods.id)) {
+		goods["goodsNum"] = 1
+		this.selectedGoodsList.push(goods)
+		this.goodsList[index].selected = true
+	  } else {
+		this.goodsList[index].selected = false
+		this.selectedGoodsList = this.selectedGoodsList.filter(item => item.id !== goods.id);
+	  }
+    },
+
+    // 娓呴櫎鍟嗗搧
+    clearGoods(goods) {
+      this.selectedGoodsList = this.selectedGoodsList.filter(item => item.id !== goods.id);
+	  this.goodsList.forEach(item => {
+		  if(item.id === goods.id) {
+			  item.selected = false
+		  }
+	  })
+    },
+
+    // 鎼滅储鐑棬璇濋
+    searchTags() {
+      if (this.tagInput.trim() !== '') {
+        this.getRecommendTags("SEARCH")
+      }
+    },
+    // 娣诲姞鏍囩
+    addTag() {
+	  if(!this.tagInput.trim()) {
+		  return
+	  }
+      const newTag = {'id': '', 'tagName': this.tagInput.trim()};
+      if (newTag && this.formData.tags.length < 5) {
+        if (this.formData.tags.filter(item => item.tagName === newTag.tagName).length < 1) {
+          this.formData.tags.push(newTag);
+          this.tagInput = '';
+          this.getRecommendTags() // 閲嶇疆鎺ㄨ崘
+        } else {
+          uni.showToast({
+            title: '璇ヨ瘽棰樺凡娣诲姞杩囦簡~',
+            icon: 'none'
+          });
+        }
+      } else if (this.formData.tags.length >= 5) {
+        uni.showToast({
+          title: '鏈�澶氭坊鍔�5涓瘽棰榽',
+          icon: 'none'
+        });
+      }
+    },
+
+    // 閫夋嫨鎺ㄨ崘璇濋
+    selectTopic(index) {
+	  const tag = this.recommendedTags[index]
+      if (this.formData.tags.length >= 5) {
+        uni.showToast({
+          title: '鏈�澶氭坊鍔�5涓瘽棰榽',
+          icon: 'none'
+        });
+        return;
+      }
+
+      if (this.formData.tags.filter(item => item.tagName === tag.tagName).length < 1) {
+        this.formData.tags.push(tag);
+        this.tagInput = '';
+      } else {
+        uni.showToast({
+          title: '璇ヨ瘽棰樺凡娣诲姞杩囦簡~',
+          icon: 'none'
+        });
+      }
+    },
+
+    // 绉婚櫎鏍囩
+    removeTag(index) {
+      this.formData.tags.splice(index, 1);
+    },
+
+    // 澶勭悊鍙戝竷
+    handlePublish() {
+      this.$refs.formRef.validate(valid => {
+        if (valid && this.canPublish) {
+          this.loading = true;
+          this.formData.fileInfo = this.videoInfo;
+		  this.formData["goodsList"] = this.selectedGoodsList.map(item => {return {goodsId: item.goodsId, goodsSkuId: item.id, goodsNum: item.goodsNum}});
+          publish(this.formData).then(res => {
+			  uni.showToast({
+			    title: '瑙嗛宸叉彁浜ゅ鏍竳',
+			    icon: 'success'
+			  });
+			  this.loading = false
+			  // 閲嶇疆琛ㄥ崟
+			  this.resetData();
+			  this.selectedGoods = null;
+			  this.tagInput = '';
+			  this.recommendedTags = [];
+
+			  // TODO 鍏堣烦棣栭〉,鍚庨潰璺虫垜鐨勮棰戦〉闈�
+			  setTimeout(() => {
+			    uni.switchTab({
+			    	url: '/pages/tabbar/index/home'
+			    });
+			  }, 1500);
+		  })
+        } else {
+          uni.showToast({
+            title: '璇峰畬鍠勮棰戜俊鎭瘇',
+            icon: 'none'
+          });
+        }
+      });
+    },
+	resetData() {
+		// 閲嶇疆琛ㄥ崟
+		this.videoInfo = {
+			  url: '',
+			  fileKey: '',
+			  fileType: '',
+			  fileSize: 0,
+			  originalFileName: '',
+			  cover: ''
+		};
+		this.formData = {
+		  id: '',
+		  title: '',
+		  videoFileKey: '',
+		  cover: '',
+		  videoFit: 'cover',
+		  videoDuration: 0,
+		  videoContentType: 'video',
+		  videoImgs: [],
+		  tags: [],
+		  fileInfo: {}
+		};
+		this.videoPreviewImgs = []
+		this.selectedGoodsList = []
+	}
+  }
+};
+</script>
+
+<style scoped>
+.publish-container {
+  padding: 10px;
+  overflow-y: scroll;
+}
+
+.upload-section {
+  background-color: #f8f8f8;
+  border-radius: 16rpx;
+  margin-bottom: 30rpx;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  min-height: 400rpx;
+}
+
+.upload-btn {
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  color: #999;
+}
+
+.upload-text {
+  font-size: 32rpx;
+  margin: 20rpx 0 10rpx;
+}
+
+.upload-tips {
+  font-size: 24rpx;
+  color: #ccc;
+}
+
+.video-preview {
+  width: 100%;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+}
+
+.video-player {
+  width: 100%;
+  height: 400rpx;
+  border-radius: 12rpx;
+  background-color: #000;
+}
+
+.video-actions {
+  width: 100%;
+  margin-top: 20rpx;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  gap: 20rpx;
+}
+
+.form-section {
+  background-color: #fff;
+  border-radius: 16rpx;
+  padding: 0 20rpx;
+}
+
+.goods-link-container {
+  width: 100%;
+}
+
+.goods-preview {
+  display: flex;
+  align-items: center;
+  padding: 15rpx;
+  background-color: #f9f9f9;
+  border-radius: 8rpx;
+  margin-top: 15rpx;
+  position: relative;
+}
+
+.goods-preview .goods-image {
+  width: 80rpx;
+  height: 80rpx;
+  border-radius: 8rpx;
+  margin-right: 15rpx;
+}
+
+.goods-preview .goods-info {
+  flex: 1;
+  display: flex;
+  flex-direction: column;
+}
+
+.goods-preview .goods-info .goods-name {
+  font-size: 26rpx;
+  color: #333;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+
+.goods-preview .goods-info .goods-price {
+  font-size: 28rpx;
+  color: #f44;
+  font-weight: bold;
+}
+
+.topic-list {
+  display: flex;
+  flex-direction: row;
+  flex-wrap: wrap;
+  line-height: 22px;
+}
+
+.tags-input-container {
+  width: 100%;
+}
+
+.tags-display {
+  display: flex;
+  flex-wrap: wrap;
+  margin-top: 15rpx;
+  line-height: 22px;
+  height: 80rpx;
+}
+
+.hot-topics {
+	display: flex;
+	flex-direction: column;
+	margin-top: 15rpx;
+	margin-bottom: 15rpx;
+	height: 46rpx;
+}
+
+.section-title {
+  font-size: 12px;
+  color: #999;
+  line-height: 12px;
+  margin-bottom: 6rpx;
+}
+
+.tags-count {
+  display: block;
+  font-size: 12px;
+  line-height: 12px;
+  color: #999;
+  margin-top: 10rpx;
+  text-align: right;
+}
+
+.publish-btn {
+  /* position: fixed;
+  bottom: 100rpx;
+  left: 20rpx;
+  right: 20rpx; */
+  margin-top: 40rpx;
+}
+
+.goods-picker {
+  padding: 30rpx;
+  height: 100%;
+  display: flex;
+  flex-direction: column;
+}
+
+.goods-picker .picker-header {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  margin-bottom: 30rpx;
+}
+
+.goods-picker .picker-header .picker-title {
+  font-size: 36rpx;
+  font-weight: bold;
+}
+
+.goods-picker .search-bar {
+  margin-bottom: 20rpx;
+}
+
+.goods-picker .goods-list {
+  flex: 1;
+  overflow: hidden;
+}
+
+.goods-picker .goods-list .goods-item {
+  display: flex;
+  align-items: center;
+  padding: 20rpx 0;
+  border-bottom: 1rpx solid #f5f5f5;
+}
+
+.goods-picker .goods-list .goods-item .goods-image {
+  width: 100rpx;
+  height: 100rpx;
+  border-radius: 8rpx;
+  margin-right: 20rpx;
+}
+
+.goods-picker .goods-list .goods-item .goods-info {
+  flex: 1;
+}
+
+.goods-picker .goods-list .goods-item .goods-info .goods-name {
+  font-size: 28rpx;
+  color: #333;
+  margin-bottom: 10rpx;
+  display: -webkit-box;
+  -webkit-line-clamp: 2;
+  -webkit-box-orient: vertical;
+  overflow: hidden;
+}
+
+.goods-picker .goods-list .goods-item .goods-info .goods-price {
+  font-size: 28rpx;
+  color: #f44;
+  font-weight: bold;
+}
+
+.progress-box {
+	width: 100%;
+    display: flex;
+    height: 25px;
+    margin-top: 10px;
+}
+
+.image-list {
+  display: flex;
+  flex-wrap: wrap;
+  justify-content: flex-start;
+}
+
+.image-item {
+  margin: 5px;
+  overflow: hidden;
+  border-radius: 8px;
+  box-shadow: 0 2px 6px rgba(0, 0, 0, 0.1);
+}
+
+.image {
+  width: 100%;
+  height: 100%;
+}
+</style>
diff --git a/pages/floor/default-page/default-page.vue b/pages/floor/default-page/default-page.vue
new file mode 100644
index 0000000..a1d6d7d
--- /dev/null
+++ b/pages/floor/default-page/default-page.vue
@@ -0,0 +1,86 @@
+<template>
+	<view class="default-page">
+		<view class="default-wrap">
+			
+			<text>{{title}}</text>
+			<view v-if="isBtn" class="btn" @click="toHome">
+				鍘婚�涢��
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+export default {
+	props: {
+		// 璐墿杞� cart 娑堟伅 msg  璁㈠崟 order 鏌ヨ search
+		type: {
+			type: String,
+			default: 'search'
+		},
+		isBtn:{
+			type: Boolean,
+			default: false
+		},
+		title:{
+			type: String,
+			default: '娌℃湁鐩稿叧鍐呭'
+		}
+	},
+	
+	data() {
+		return {
+			src:''
+		};
+	},
+	mounted() {
+		this.src ='/static/default/default_'+ this.type + '.png';
+	},
+	methods: {
+		toHome() {
+			uni.switchTab({
+			    url: '/pages/home/home'
+			});
+		}
+	}
+};
+</script>
+
+<style lang="scss" scoped>
+	.default-page{
+		background: #FFFFFF;
+		width: 100%;
+		height: 100vh;
+		.default-wrap{
+			position: absolute;
+			top: calc(50vh - 320rpx);
+			left: calc(50% - 120rpx);
+			display: flex;
+			flex-direction: column;
+			align-items: center;
+			
+			>image{
+				width: 260rpx;
+				height: 240rpx;
+				
+				margin-bottom: 24rpx;
+			}
+			text{
+				font-size: 32rpx;
+				color: #828385;
+			}
+			.btn{
+				width: 160rpx;
+				height: 56rpx;
+				border: 2rpx solid #3180F6;
+				border-radius: 6rpx;
+				text-align: center;
+				line-height: 56rpx;
+				margin-top: 32rpx;
+				font-size: 24rpx;
+				color: #3180F6;
+			}
+		}
+		
+	}
+</style>
diff --git a/pages/mine/m-canvas/README.md b/pages/mine/m-canvas/README.md
new file mode 100644
index 0000000..53ba0e4
--- /dev/null
+++ b/pages/mine/m-canvas/README.md
@@ -0,0 +1 @@
+### 璇存槑 https://ext.dcloud.net.cn/plugin?id=3237
diff --git a/pages/mine/m-canvas/index.vue b/pages/mine/m-canvas/index.vue
new file mode 100644
index 0000000..a712294
--- /dev/null
+++ b/pages/mine/m-canvas/index.vue
@@ -0,0 +1,212 @@
+<template>
+
+  <div class="index">
+    <u-modal v-model="show" :show-title="false" :show-confirm-button="false" mask-close-able>
+      <view class="slot-content">
+        <image @click="downLoad()" class="img" :src="imgUrl" />
+        <div class="canvas-hide">
+          <!-- #ifdef MP-WEIXIN -->
+          <canvas id="canvas" type="2d" style="width: 600px; height: 960px" />
+          <!-- #endif -->
+          <!-- #ifndef MP-WEIXIN -->
+          <canvas canvas-id="canvas" id="canvas" style="width: 600px; height: 960px" />
+          <!-- #endif -->
+        </div>
+      </view>
+    </u-modal>
+
+  </div>
+</template>
+<script>
+import '@/components/uview-components/uview-ui'
+// 寮曞叆缁樺埗鎻掍欢
+import DrawPoster from "@/js_sdk/u-draw-poster";
+
+export default {
+  data: () => ({
+    imgUrl: "", //缁樺埗鍑烘潵鐨勫浘鐗囪矾寰�
+    show: false, //鏄惁灞曠ず妯℃�佹
+    dp: {}, //缁樺埗鐨刣p瀵硅薄锛岀敤浜庡瓨鍌ㄧ粯鍒剁瓑涓�浜涙柟娉曘��
+    logo: require("@/pages/passport/static/logo-title.png"), //鏈湴logo鍦板潃
+  }),
+
+  props: {
+    /**
+     * 鐖剁骇浼犲弬鐨勬暟鎹�
+     */
+    res: {
+      type: null,
+      default: "",
+    },
+  },
+  onUnload() {},
+
+  methods: {
+    /**
+     * 瑙e喅寰俊灏忕▼搴忎腑鍥剧墖妯$硦闂
+     */
+    // #ifdef MP-WEIXIN
+    st2: (size) => size * 2,
+    // #endif
+
+    // #ifndef MP-WEIXIN
+    st2: (size) => size,
+    // #endif
+
+    /**
+     * 淇濆瓨鍥剧墖
+     */
+    downLoad() {
+      uni.saveImageToPhotosAlbum({
+        filePath: this.imgUrl,
+        success: function () {
+          uni.showToast({
+            title: "淇濆瓨鎴愬姛锛�",
+            icon: "none",
+          });
+        },
+        fail: function () {
+          uni.showToast({
+            title: "淇濆瓨澶辫触锛岃绋嶅悗閲嶈瘯锛�",
+            icon: "none",
+          });
+        },
+      });
+    },
+
+    /**
+     * 鍒涘缓canvas
+     */
+    async init() {
+      this.show = true;
+      this.dp = await DrawPoster.build({
+        selector: "canvas",
+        componentThis: this,
+        loading: true,
+        debugging: true,
+      });
+      let dp = this.dp;
+      // #ifdef MP-WEIXIN
+      // 鐢ㄤ簬寰俊灏忕▼搴忎腑鐢诲竷閿欎贡闂
+      dp.canvas.width = this.st2(600);
+      dp.canvas.height = this.st2(960);
+      // #endif
+      this.draw(dp);
+    },
+
+    async draw(dp) {
+      const { width, height, background, title } = this.res.container;
+      const { code, img, price } = this.res.bottom;
+
+      // /** 缁樺埗鑳屾櫙 */
+      await dp.draw((ctx) => {
+        ctx.fillStyle = background;
+        ctx.fillRoundRect(
+          this.st2(0),
+          this.st2(0),
+          this.st2(width),
+          this.st2(height),
+          this.st2(12)
+        );
+        ctx.clip();
+      });
+      /** 缁樺埗鍥剧墖 */
+      dp.draw(async (ctx) => {
+        await Promise.all([
+          // 缁樺埗Logo
+          ctx.drawImage(
+            this.logo,
+            this.st2(175),
+            this.st2(0),
+            this.st2(256),
+            this.st2(144)
+          ),
+          // 涓棿鍥剧墖
+          ctx.drawImage(
+            img,
+            this.st2(100),
+            this.st2(150),
+            this.st2(400),
+            this.st2(400)
+          ),
+          // 浜岀淮鐮�
+          ctx.drawImage(
+            code,
+            this.st2(39),
+            this.st2(750),
+            this.st2(150),
+            this.st2(150)
+          ),
+        ]);
+      });
+
+      /** 缁樺埗涓棿鏂囧瓧*/
+      await dp.draw((ctx) => {
+        ctx.fillStyle = "#333";
+        ctx.font = `bold ${this.st2(24)}px PingFang SC`;
+        ctx.textAlign = "center";
+        ctx.fillWarpText({
+          text: title,
+          maxWidth: this.st2(500),
+          x: this.st2(300),
+          y: this.st2(600),
+          layer: 1,
+        });
+
+        ctx.fillStyle = "#ff3c2a";
+        ctx.font = `${this.st2(38)}px PingFang SC`;
+        ctx.textAlign = "center";
+        ctx.fillText(price, this.st2(300), this.st2(680));
+      });
+
+      // /** 缁樺埗搴曢儴鏂囧瓧 */
+      await dp.draw((ctx) => {
+        ctx.fillStyle = "#666";
+        ctx.font = `${this.st2(24)}px PingFang SC`;
+        ctx.fillText("闀挎寜鍥剧墖锛岃瘑鍒簩缁寸爜", this.st2(200), this.st2(866));
+        ctx.fillStyle = "#666";
+        ctx.font = `${this.st2(24)}px PingFang SC`;
+        ctx.fillText("鏌ョ湅鍟嗗搧璇︽儏", this.st2(200), this.st2(900));
+      });
+
+      this.imgUrl = await dp.createImagePath();
+
+      // console.log(posterImgUrl)
+    },
+  },
+
+  async mounted() {
+    this.init();
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+page,
+.index {
+  height: 100%;
+}
+.canvas-hide {
+  /* 1 */
+  position: fixed;
+  right: 100vw;
+  bottom: 100vh;
+  /* 2 */
+  z-index: -9999;
+  /* 3 */
+  opacity: 0;
+}
+.index {
+  position: relative;
+  text-align: center;
+  background: rgba($color: grey, $alpha: 0.2);
+}
+
+image {
+  display: block;
+}
+.img {
+  width: 600rpx;
+  height: 960rpx;
+}
+</style>
diff --git a/pages/passport/verify-code/verify-code.vue b/pages/passport/verify-code/verify-code.vue
new file mode 100644
index 0000000..09985fd
--- /dev/null
+++ b/pages/passport/verify-code/verify-code.vue
@@ -0,0 +1,278 @@
+<template>
+	<view class="xt__verify-code">
+		<!-- 杈撳叆妗� -->
+		<input
+			id="xt__input"
+			:value="code"
+			class="xt__input"
+			:focus="isFocus"
+			:password="isPassword"
+			:type="inputType"
+			:maxlength="size"
+			@input="input"
+			@focus="inputFocus"
+			@blur="inputBlur"
+		/>
+
+		<!-- 鍏夋爣 -->
+		<view
+			id="xt__cursor"
+			v-if="cursorVisible && type !== 'middle'"
+			class="xt__cursor"
+			:style="{ left: codeCursorLeft[code.length] + 'px', height: cursorHeight + 'px', backgroundColor: cursorColor }"
+		></view>
+
+		<!-- 杈撳叆妗� - 缁� -->
+		<view id="xt__input-ground" class="xt__input-ground">
+			<template v-for="(item, index) in size">
+				<view
+					:key="index"
+					:style="{ borderColor: code.length === index && cursorVisible ? boxActiveColor : boxNormalColor }"
+					:class="['xt__box', `xt__box-${type + ''}`, `xt__box::after`]"
+				>
+					<view :style="{ borderColor: boxActiveColor }" class="xt__middle-line" v-if="type === 'middle' && !code[index]"></view>
+					<text class="xt__code-text">{{ code[index] | codeFormat(isPassword) }}</text>
+				</view>
+			</template>
+		</view>
+	</view>
+</template>
+<script>
+/**
+ * @description 杈撳叆楠岃瘉鐮佺粍浠�
+ * @property {string} type = [box|middle|bottom] - 鏄剧ず绫诲瀷 榛樿锛歜ox -eg:bottom
+ * @property {string} inputType = [text|number] - 杈撳叆妗嗙被鍨� 榛樿锛歯umber -eg:number
+ * @property {number} size = [4|6] - 鏀寔鐨勯獙璇佺爜鏁伴噺 榛樿锛�6 -eg:6
+ * @property {boolean} isFocus - 鏄惁绔嬪嵆鑱氱劍 榛樿锛歵rue
+ * @property {boolean} isPassword - 鏄惁浠ュ瘑鐮佸舰寮忔樉绀� 榛樿false -eg:false
+ * @property {string} cursorColor - 鍏夋爣棰滆壊 榛樿锛�#cccccc
+ * @property {string} boxNormalColor - 鍏夋爣鏈仛鐒﹀埌鐨勬鐨勯鑹� 榛樿锛�#cccccc
+ * @property {string} boxActiveColor - 鍏夋爣鑱氱劍鍒扮殑妗嗙殑棰滆壊 榛樿锛�#000000
+ * @event {Function(data)} confirm - 杈撳叆瀹屾垚
+ */
+export default {
+	name: 'xt-verify-code',
+	props: {
+		value: {
+			type: String,
+			default: () => ''
+		},
+		type: {
+			type: String,
+			default: () => 'box'
+		},
+		inputType: {
+			type: String,
+			default: () => 'number'
+		},
+		size: {
+			type: Number,
+			default: () => 6
+		},
+		isFocus: {
+			type: Boolean,
+			default: () => true
+		},
+		isPassword: {
+			type: Boolean,
+			default: () => false
+		},
+		cursorColor: {
+			type: String,
+			default: () => '#cccccc'
+		},
+		boxNormalColor: {
+			type: String,
+			default: () => '#cccccc'
+		},
+		boxActiveColor: {
+			type: String,
+			default: () => '#000000'
+		}
+	},
+	model: {
+		prop: 'value',
+		event: 'input'
+	},
+	data() {
+		return {
+			cursorVisible: false,
+			cursorHeight: 35,
+			code: '', // 杈撳叆鐨勯獙璇佺爜
+			codeCursorLeft: [] // 鍚戝乏绉诲姩鐨勮窛绂绘暟缁�
+		};
+	},
+	created() {
+		this.cursorVisible = this.isFocus;
+	},
+	mounted() {
+		this.init();
+	},
+	methods: {
+		/**
+		 * @description 鍒濆鍖�
+		 */
+		init() {
+			this.getCodeCursorLeft();
+			this.setCursorHeight();
+		},
+		/**
+		 * @description 鑾峰彇鍏冪礌鑺傜偣
+		 * @param {string} elm - 鑺傜偣鐨刬d銆乧lass 鐩稿綋浜� document.querySelect鐨勫弬鏁� -eg: #id
+		 * @param {string} type = [single|array] - 鍗曚釜鍏冪礌鑾峰彇澶氫釜鍏冪礌 榛樿鏄崟涓厓绱�
+		 * @param {Function} callback - 鍥炶皟鍑芥暟
+		 */
+		getElement(elm, type = 'single', callback) {
+			uni
+				.createSelectorQuery()
+				.in(this)
+				[type === 'array' ? 'selectAll' : 'select'](elm)
+				.boundingClientRect()
+				.exec(data => {
+					callback(data[0]);
+				});
+		},
+		/**
+		 * @description 璁$畻鍏夋爣鐨勯珮搴�
+		 */
+		setCursorHeight() {
+			this.getElement('.xt__box', 'single', boxElm => {
+				this.cursorHeight = boxElm.height * 0.6;
+			});
+		},
+		/**
+		 * @description 鑾峰彇鍏夋爣鍦ㄦ瘡涓�涓猙ox鐨刲eft浣嶇疆
+		 */
+		getCodeCursorLeft() {
+			// 鑾峰彇鐖剁骇妗嗙殑浣嶇疆淇℃伅
+			this.getElement('#xt__input-ground', 'single', parentElm => {
+				const parentLeft = parentElm.left;
+				// 鑾峰彇鍚勪釜box淇℃伅
+				this.getElement('.xt__box', 'array', elms => {
+					this.codeCursorLeft = [];
+					elms.forEach(elm => {
+						this.codeCursorLeft.push(elm.left - parentLeft + elm.width / 2);
+					});
+				});
+			});
+		},
+
+		// 杈撳叆妗嗚緭鍏ュ彉鍖栫殑鍥炶皟
+		input(e) {
+			const value = e.detail.value;
+			this.cursorVisible = value.length !== this.size;
+			this.$emit('input', value);
+			this.inputSuccess(value);
+		},
+
+		// 杈撳叆瀹屾垚鍥炶皟
+		inputSuccess(value) {
+			if (value.length === this.size) {
+				this.$emit('confirm', value);
+			}
+		},
+		// 杈撳叆鑱氱劍
+		inputFocus() {
+			this.cursorVisible = this.code.length !== this.size;
+		},
+		// 杈撳叆澶卞幓鐒︾偣
+		inputBlur() {
+			this.cursorVisible = false;
+		}
+	},
+	watch: {
+		value(val) {
+			this.code = val;
+		}
+	},
+	filters: {
+		codeFormat(val, isPassword) {
+			let value = '';
+			if (val) {
+				value = isPassword ? '*' : val;
+			}
+			return value;
+		}
+	}
+};
+</script>
+<style lang="scss" scoped>
+.xt__verify-code {
+	position: relative;
+	width: 100%;
+	box-sizing: border-box;
+
+	.xt__input {
+		height: 100%;
+		width: 200%;
+		position: absolute;
+		left: -100%;
+		z-index: 1;
+	}
+	.xt__cursor {
+		position: absolute;
+		top: 50%;
+		transform: translateY(-50%);
+		display: inline-block;
+		width: 2px;
+		animation-name: cursor;
+		animation-duration: 0.8s;
+		animation-iteration-count: infinite;
+	}
+
+	.xt__input-ground {
+		display: flex;
+		justify-content: space-between;
+		align-items: center;
+		width: 100%;
+		box-sizing: border-box;
+		.xt__box {
+			position: relative;
+			display: inline-block;
+			width: 76rpx;
+			height: 112rpx;
+			&-bottom {
+				border-bottom-width: 2px;
+				border-bottom-style: solid;
+			}
+
+			&-box {
+				border-width: 2px;
+				border-style: solid;
+			}
+
+			&-middle {
+				border: none;
+			}
+
+			.xt__middle-line {
+				position: absolute;
+				top: 50%;
+				left: 50%;
+				width: 50%;
+				transform: translate(-50%, -50%);
+				border-bottom-width: 2px;
+				border-bottom-style: solid;
+			}
+
+			.xt__code-text {
+				position: absolute;
+				top: 50%;
+				left: 50%;
+				font-size:52rpx;
+				transform: translate(-50%, -50%);
+			}
+		}
+	}
+}
+
+@keyframes cursor {
+	0% {
+		opacity: 1;
+	}
+
+	100% {
+		opacity: 0;
+	}
+}
+</style>
diff --git a/pages/product/m-take-down-sale-goods/index.vue b/pages/product/m-take-down-sale-goods/index.vue
new file mode 100644
index 0000000..64da83c
--- /dev/null
+++ b/pages/product/m-take-down-sale-goods/index.vue
@@ -0,0 +1,36 @@
+<template>
+  <div>
+    <u-popup v-model="show" mode="bottom" height="800rpx" border-radius="14">
+      <div class="wrapper">
+        <view class="down-goods-tips">璇ュ晢鍝佸凡涓嬫灦</view>
+        <scroll-view scroll-y="true" style="height: 670rpx">
+          <goodsRecommend title="鍏朵粬鍟嗗搧" />
+        </scroll-view>
+      </div>
+    </u-popup>
+  </div>
+</template>
+
+<script>
+import '@/components/uview-components/uview-ui';
+
+import goodsRecommend from "@/pages/subComponents/m-goods-recommend/index.vue";
+
+export default {
+  components: { goodsRecommend },
+  data() {
+    return {
+      show: true, // 鏄惁鏄剧ず
+    };
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.down-goods-tips {
+  font-size: 36rpx;
+  text-align: center;
+  font-weight: bold;
+  padding: 40rpx 0;
+}
+</style>
diff --git a/pages/product/popups/popups.vue b/pages/product/popups/popups.vue
new file mode 100644
index 0000000..ce373f9
--- /dev/null
+++ b/pages/product/popups/popups.vue
@@ -0,0 +1,346 @@
+<template>
+  <view class="shadow" :class="!show?'':'shadow-show'" :style="{backgroundColor:show?maskBg:'rgba(0,0,0,0)'}" @tap="tapMask">
+    <view class="popups" :class="[theme]" :style="{top: popupsTop ,left: popupsLeft,flexDirection:direction}">
+      <text :class="dynPlace" :style="{width:'0px',height:'0px'}" v-if="triangle"></text>
+      <view v-for="(item,index) in popData" :key="index" @tap.stop="tapItem(item)" class="itemChild view" :class="[direction=='row'?'solid-right':'solid-bottom',item.disabled?'disabledColor':'']">
+        <u-icon size="35" :name="item.icon" v-if="item.icon"></u-icon><span class="title">{{item.title}}</span>
+      </view>
+      <slot></slot>
+    </view>
+  </view>
+</template>
+
+<script>
+import '@/components/uview-components/uview-ui';
+
+export default {
+
+  props: {
+    maskBg: {
+      type: String,
+      default: "rgba(0,0,0,0)",
+    },
+    placement: {
+      type: String,
+      default: "default", //default top-start top-end bottom-start bottom-end
+    },
+    direction: {
+      type: String,
+      default: "column", //column row
+    },
+    x: {
+      type: Number,
+      default: 0,
+    },
+    y: {
+      type: Number,
+      default: 0,
+    },
+    value: {
+      type: Boolean,
+      default: false,
+    },
+    popData: {
+      type: Array,
+      default: () => [],
+    },
+    theme: {
+      type: String,
+      default: "light", //light dark
+    },
+    dynamic: {
+      type: Boolean,
+      default: false,
+    },
+    gap: {
+      type: Number,
+      default: 20,
+    },
+    triangle: {
+      type: Boolean,
+      default: true,
+    },
+  },
+  data() {
+    return {
+      popupsTop: "0rpx",
+      popupsLeft: "0rpx",
+      show: false,
+      dynPlace: "",
+    };
+  },
+  mounted() {
+    this.popupsPosition();
+  },
+  methods: {
+    tapMask() {
+      this.$emit("input", !this.value);
+    },
+    tapItem(item) {
+      if (item.disabled) return;
+      this.$emit("tapPopup", item);
+      this.$emit("input", !this.value);
+    },
+    getStatusBar() {
+      let promise = new Promise((resolve, reject) => {
+        uni.getSystemInfo({
+          success: function (e) {
+            let customBar;
+            // #ifdef H5
+
+            customBar = e.statusBarHeight + e.windowTop;
+
+            // #endif
+            resolve(customBar);
+          },
+        });
+      });
+      return promise;
+    },
+    async popupsPosition() {
+      let statusBar = await this.getStatusBar();
+      let promise = new Promise((resolve, reject) => {
+        let popupsDom = uni.createSelectorQuery().in(this).select(".popups");
+        popupsDom
+          .fields(
+            {
+              size: true,
+            },
+            (data) => {
+              let width = data.width;
+              let height = data.height;
+
+             
+
+              let y = this.dynamic
+                ? this.dynamicGetY(this.y, this.gap)
+                : this.transformRpx(this.y);
+
+              let x = this.dynamic
+                ? this.dynamicGetX(this.x, this.gap)
+                : this.transformRpx(this.x);
+
+              // #ifdef H5
+              y = this.dynamic
+                ? this.y + statusBar
+                : this.transformRpx(this.y + statusBar);
+              // #endif
+
+              this.dynPlace =
+                this.placement == "default"
+                  ? this.getPlacement(x, y)
+                  : this.placement;
+
+              switch (this.dynPlace) {
+                case "top-start":
+                  this.popupsTop = `${y + 9}rpx`;
+                  this.popupsLeft = `${x - 15}rpx`;
+                  break;
+                case "top-end":
+                  this.popupsTop = `${y + 9}rpx`;
+                  this.popupsLeft = `${x + 15 - width}rpx`;
+                  break;
+                case "bottom-start":
+                  this.popupsTop = `${y - 18 - height}rpx`;
+                  this.popupsLeft = `${x - 15}rpx`;
+                  break;
+                case "bottom-end":
+                  this.popupsTop = `${y - 9 - height}rpx`;
+                  this.popupsLeft = `${x + 15 - width}rpx`;
+                  break;
+              }
+              resolve();
+            }
+          )
+          .exec();
+      });
+      return promise;
+    },
+    getPlacement(x, y) {
+      let width = uni.getSystemInfoSync().windowWidth;
+      let height = uni.getSystemInfoSync().windowHeight;
+      if (x > width / 2 && y > height / 2) {
+        return "bottom-end";
+      } else if (x < width / 2 && y < height / 2) {
+        return "top-start";
+      } else if (x > width / 2 && y < height / 2) {
+        return "top-end";
+      } else if (x < width / 2 && y > height / 2) {
+        return "bottom-start";
+      } else if (x > width / 2) {
+        return "top-end";
+      } else {
+        return "top-start";
+      }
+    },
+    dynamicGetY(y, gap) {
+      let height = uni.getSystemInfoSync().windowHeight;
+      y = y < gap ? gap : y;
+      y = height - y < gap ? height - gap : y;
+
+      return y;
+    },
+    dynamicGetX(x, gap) {
+      let width = uni.getSystemInfoSync().windowWidth;
+      x = x < gap ? gap : x;
+      x = width - x < gap ? width - gap : x;
+      return x;
+    },
+    transformRpx(params) {
+      return (params * uni.getSystemInfoSync().screenWidth) / 375;
+    },
+  },
+  watch: {
+    value: {
+      immediate: true,
+      handler: async function (newVal, oldVal) {
+        if (newVal) await this.popupsPosition();
+        this.show = newVal;
+      },
+    },
+    placement: {
+      immediate: true,
+      handler(newVal, oldVal) {
+        this.dynPlace = newVal;
+      },
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.title {
+  margin-left: 20rpx;
+}
+.shadow {
+  position: fixed;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  height: 100%;
+  z-index: 9999;
+  transition: background 0.3s ease-in-out;
+  visibility: hidden;
+
+  &.shadow-show {
+    visibility: visible;
+  }
+}
+
+.popups {
+  position: absolute;
+  padding: 20rpx;
+  border-radius: 5px;
+  display: flex;
+  .view {
+    display: flex;
+    align-items: center;
+    padding: 15rpx 10rpx;
+    font-size: 25rpx;
+  }
+  .image {
+    display: inline-block;
+    vertical-align: middle;
+    width: 40rpx;
+    height: 40rpx;
+    margin-right: 20rpx;
+  }
+}
+.dark {
+  background-color: #4c4c4c;
+  color: #fff;
+  .top-start:after {
+    content: "";
+    position: absolute;
+    top: -18rpx;
+    left: 10rpx;
+    border-width: 0 20rpx 20rpx;
+    border-style: solid;
+    border-color: transparent transparent #4c4c4c;
+  }
+  .top-end:after {
+    content: "";
+    position: absolute;
+    top: -18rpx;
+    right: 10rpx;
+    border-width: 0 20rpx 20rpx;
+    border-style: solid;
+    border-color: transparent transparent #4c4c4c;
+  }
+  .bottom-start:after {
+    content: "";
+    position: absolute;
+    bottom: -18rpx;
+    left: 10rpx;
+    border-width: 20rpx 20rpx 0;
+    border-style: solid;
+    border-color: #4c4c4c transparent transparent;
+  }
+  .bottom-end:after {
+    content: "";
+    position: absolute;
+    bottom: -18rpx;
+    right: 10rpx;
+    border-width: 20rpx 20rpx 0;
+    border-style: solid;
+    border-color: #4c4c4c transparent transparent;
+  }
+  .disabledColor {
+    color: #c5c8ce;
+  }
+}
+.light {
+  color: #515a6e;
+  box-shadow: 0upx 0upx 30upx rgba(0, 0, 0, 0.2);
+  background: #fff;
+  .top-start:after {
+    content: "";
+    position: absolute;
+    top: -18rpx;
+    left: 10rpx;
+    border-width: 0 20rpx 20rpx;
+    border-style: solid;
+    border-color: transparent transparent #fff;
+  }
+  .top-end:after {
+    content: "";
+    position: absolute;
+    top: -18rpx;
+    right: 10rpx;
+    border-width: 0 20rpx 20rpx;
+    border-style: solid;
+    border-color: transparent transparent #fff;
+  }
+  .bottom-start:after {
+    content: "";
+    position: absolute;
+    bottom: -18rpx;
+    left: 10rpx;
+    border-width: 20rpx 20rpx 0;
+    border-style: solid;
+    border-color: #fff transparent transparent;
+  }
+  .bottom-end:after {
+    content: "";
+    position: absolute;
+    bottom: -18rpx;
+    right: 10rpx;
+    border-width: 20rpx 20rpx 0;
+    border-style: solid;
+    border-color: #fff transparent transparent;
+  }
+  .disabledColor {
+    color: #c5c8ce;
+  }
+}
+.solid-bottom {
+  border-bottom: 1px solid #f3f5f7;
+}
+.solid-right {
+  border-right: 1px solid #ccc;
+}
+.popups .itemChild:last-child {
+  border: none;
+}
+</style>
diff --git a/pages/subComponents/empty/empty.vue b/pages/subComponents/empty/empty.vue
new file mode 100644
index 0000000..8183fd0
--- /dev/null
+++ b/pages/subComponents/empty/empty.vue
@@ -0,0 +1,22 @@
+<template>
+	<view>
+		
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				
+			}
+		},
+		methods: {
+			
+		}
+	}
+</script>
+
+<style>
+
+</style>
diff --git a/pages/subComponents/m-buy/README.md b/pages/subComponents/m-buy/README.md
new file mode 100644
index 0000000..c004c1f
--- /dev/null
+++ b/pages/subComponents/m-buy/README.md
@@ -0,0 +1,3 @@
+## 璐拱缁勪欢
+1.鏈粍浠舵槸鐮嶄环锛岀Н鍒嗚喘涔帮紝鍙傚洟绛夊鐢ㄧ粍
+2.鍚庣画浼氬皢姝ょ粍浠跺拰鍟嗗搧璐拱缁勪欢鍚堝苟锛屾枃妗e悗缁啀鍑�
diff --git a/pages/subComponents/m-buy/goods.vue b/pages/subComponents/m-buy/goods.vue
new file mode 100644
index 0000000..e3d7c8d
--- /dev/null
+++ b/pages/subComponents/m-buy/goods.vue
@@ -0,0 +1,576 @@
+<template>
+	<div class="wrapper">
+		<u-popup class="popup" v-model="buyMask" :height="setup.height" closeable :mode="setup.mode" :border-radius="setup.radius" @close="closeMask()">
+			<!-- 鍟嗗搧 -->
+			<view class="goods-box bottom">
+				<view class="goods-header">
+					<view class="goods-img">
+						<!-- <u-image width="200rpx" border-radius="20" class="uimage" height="200rpx" :src="selectedSpecImg ? selectedSpecImg : goodsDetail.thumbnail"></u-image> -->
+					</view>
+					<view class="goods-skus">
+						<!-- 鏈夋椿鍔ㄥ晢鍝佷环鏍� -->
+						<view class="goods-price" v-if="goodsDetail.promotionPrice && ((isGroup && buyType === 'PINTUAN') || !isGroup)">
+							<span v-if="goodsDetail.promotionPrice && !pointDetail">
+								锟�
+								<span class="goods-price-promotionShow goods-price-bigshow">{{ $options.filters.goodsFormatPrice(goodsDetail.promotionPrice)[0] }}</span>
+								.{{ $options.filters.goodsFormatPrice(goodsDetail.promotionPrice)[1] }}
+							</span>
+							<span v-if="pointDetail.points">
+								<span class="goods-price-promotionShow goods-price-bigshow">{{ pointDetail.points }}</span>
+								绉垎
+							</span>
+							<div class="promotion-box">
+								锟�
+								<span class="goods-price-bigshow">{{ $options.filters.goodsFormatPrice(goodsDetail.price)[0] }}</span>
+								.{{ $options.filters.goodsFormatPrice(goodsDetail.price)[1] }}
+							</div>
+						</view>
+						<!-- 姝e父鍟嗗搧鐨勪环鏍� -->
+						<view v-else>
+							<!-- 鎵瑰彂浠锋牸 -->
+							<div class="price-row flex" v-if="goodsDetail.salesModel === 'WHOLESALE'">
+								<div class="goods-price" v-for="(item, index) in wholesaleList" :key="index">
+									<span>
+										锟�
+										<span class="goods-price-bigshow">{{ $options.filters.goodsFormatPrice(item.price)[0] }}</span>
+										.{{ $options.filters.goodsFormatPrice(item.price)[1] }}
+									</span>
+									<span class="wholesale-item">{{ item.num }}{{ goodsDetail.goodsUnit }}</span>
+								</div>
+							</div>
+							<div class="goods-price" v-else>
+								<span>
+									锟�
+									<span class="goods-price-bigshow">{{ $options.filters.goodsFormatPrice(goodsDetail.price)[0] }}</span>
+									.{{ $options.filters.goodsFormatPrice(goodsDetail.price)[1] }}
+								</span>
+							</div>
+						</view>
+						<view class="goods-check-skus">
+							宸查��
+							<span class="goods-check-skus-name">
+								{{ selectName }}
+								<span>锛寋{ num }}涓�</span>
+							</span>
+						</view>
+						<view class="goods-check-skus">
+							搴撳瓨
+							<span class="goods-check-skus-name">
+								<span>{{ goodsDetail.quantity }}</span>
+							</span>
+						</view>
+					</view>
+				</view>
+				<!-- 鍟嗗搧淇℃伅 -->
+				<scroll-view class="goods-skus-box" :scroll-y="true">
+					<!-- 瑙勬牸 -->
+					<view class="goods-skus-view" :key="specIndex" v-for="(spec, specIndex) in formatList">
+						<view class="skus-view-list">
+							<view class="view-class-title">{{ spec.name }}</view>
+
+							<!-- 姝e父閫昏緫 寰幆鍑簊ku -->
+							<view
+								v-if="!parentOrder"
+								:class="{ active: spec_val.value == currentSelected[specIndex] }"
+								class="skus-view-item"
+								v-for="(spec_val, spec_index) in spec.values"
+								:key="spec_index"
+								@click="handleClickSpec(spec, specIndex, spec_val)"
+							>
+								{{ spec_val.value }}
+							</view>
+
+							<!-- 鎷煎洟璐拱锛屼粎绛涢�夊嚭褰撳墠鎷煎洟绫诲瀷鍟嗗搧 -->
+							<view
+								v-if="parentOrder && spec_val.skuId == goodsDetail.id"
+								:class="{ active: spec_val.value == currentSelected[specIndex] }"
+								class="skus-view-item"
+								v-for="(spec_val, spec_index) in spec.values"
+								:key="spec_index"
+								@click="handleClickSpec(spec, specIndex, spec_val)"
+							>
+								{{ spec_val.value }}
+							</view>
+						</view>
+					</view>
+					<div class="soldout" v-if="goodsDetail.quantity === 0">
+						<u-alert-tips type="warning" title="鍟嗗搧宸插敭缃�" description="褰撳墠鍟嗗搧搴撳瓨涓�0"></u-alert-tips>
+					</div>
+					<!-- 鏁伴噺 -->
+					<view v-if="goodsDetail.quantity !== 0" class="goods-skus-number flex flex-a-c flex-j-sb">
+						<view class="view-class-title">鏁伴噺</view>
+						<uni-number-box class="uNumber" :min="1" :max="999" :disabled="goodsDetail.quantity === 0"  v-model="num"></uni-number-box>
+					</view>
+				</scroll-view>
+				<!-- 鎸夐挳 -->
+				<view class="btns" v-if="goodsDetail.quantity !== 0">
+					<view class="box-btn card" v-if="buyType != 'PINTUAN' && goodsDetail.goodsType != 'VIRTUAL_GOODS'" @click="addToCartOrBuy('cart')">鍔犲叆璐墿杞�</view>
+					<view class="box-btn buy" @click="addToCartOrBuy('buy')">绔嬪嵆璐拱</view>
+				</view>
+			</view>
+		</u-popup>
+	</div>
+</template>
+<script>
+import '@/components/uview-components/uview-ui';
+
+import * as API_trade from '@/api/trade.js';
+import setup from './popup';
+// import uniNumberBox from '@/components/uni-number-box'
+export default {
+	components: {
+		// uniNumberBox
+	},
+	data() {
+		return {
+			setup,
+			num: this.wholesaleList && this.wholesaleList.length > 0 ? this.wholesaleList[0].num : 1,
+
+			selectName: '', //閫変腑鍟嗗搧鐨勬樀绉�
+			selectSkuList: '', //閫変腑鍟嗛摵sku,
+			selectedSpecImg: '', //閫変腑鐨勫浘鐗囪矾寰�
+			buyType: '', //鐢ㄤ簬瀛樺偍淇冮攢锛屾嫾鍥㈢瓑娲诲姩绫诲瀷
+			parentOrder: '', //鐖剁骇鎷煎洟娲诲姩鐨勬暟鎹� - 濡傛灉鏄洟鍛樺垯鏈夋暟鎹�
+			formatList: [],
+			currentSelected: [],
+			skuList: '',
+			isClose: false //鏄惁鍙互鐐瑰嚮閬僵鍏抽棴
+		};
+	},
+	props: {
+		wholesaleList: {
+			type: null,
+			default: false
+		},
+		buyMask: {
+			type: Boolean,
+			default: false
+		},
+		isGroup: {
+			type: Boolean,
+			default: false
+		},
+		goodsDetail: {
+			default: '',
+			type: null
+		},
+		selectedSku: {
+			default: '',
+			type: null
+		},
+		goodsSpec: {
+			default: '',
+			type: null
+		},
+		addr: {
+			default: '',
+			type: null
+		},
+		pointDetail: {
+			default: '',
+			type: null
+		}
+	},
+	computed: {
+		wholesalePrice(key) {
+			return this.wholesaleList.length
+				? this.wholesaleList.map(item => {
+						return item.price;
+				  })
+				: [];
+		},
+		wholesaleNum(key) {
+			return this.wholesaleList.length
+				? this.wholesaleList.map(item => {
+						return item.num;
+				  })
+				: [];
+		}
+	},
+	watch: {
+		num(val) {
+			
+			val == 0 ? this.num = 1 : ''
+			if (val) {
+				
+				//瓒呰繃搴撳瓨鍚庝慨鏀瑰洖搴撳瓨
+				if (val > this.goodsDetail.quantity) {
+					this.$nextTick(function() {
+						this.num = this.goodsDetail.quantity;
+					});
+				}
+			}
+		},
+		buyType: {
+			handler(val) {
+				if (val) {
+					this.buyType = val;
+				}
+			},
+			immediate: true
+		},
+		selectSkuList: {
+			handler(val, oldval) {
+				this.$emit('changed', val);
+			},
+			deep: true
+		},
+		'goodsDetail.quantity': {
+			handler(val) {
+				if (val == 0) {
+					uni.showToast({
+						title: '鍟嗗搧宸插敭缃�',
+						duration: 2000,
+						icon: 'none'
+					})
+					this.num = 1;
+				}
+			}
+		}
+	},
+
+	methods: {
+		numCheck(val) {
+			if (this.wholesaleList && this.wholesaleList.length > 0) {
+				if (this.num <= this.wholesaleList[0].num) {
+					uni.showToast({
+						title: '鎵瑰彂鍟嗗搧璐拱鏁伴噺涓嶈兘灏忎簬璧锋壒鏁伴噺!',
+						duration: 2000,
+						icon: 'none'
+					});
+					this.num = this.wholesaleList[0].num;
+				}
+			}
+		},
+		closeMask() {
+			this.$emit('closeBuy', false);
+		},
+		
+		/**鐐瑰嚮瑙勬牸 */
+		handleClickSpec(val, index, specValue) {
+			this.currentSelected[index] = specValue.value;
+			let selectedSkuId = this.goodsSpec.find(i => {
+				let matched = true;
+				let specValues = i.specValues.filter(j => j.specName !== 'images');
+				for (let n = 0; n < specValues.length; n++) {
+					if (specValues[n].specValue !== this.currentSelected[n]) {
+						matched = false;
+						return;
+					}
+				}
+				if (matched) {
+					return i;
+				}
+			});
+			if (selectedSkuId?.skuId) {
+				this.$set(this.currentSelected, index, specValue.value);
+				this.selectSkuList = {
+					spec: {
+						specName: val.name,
+						specValue: specValue.value
+					},
+					data: this.goodsDetail
+				};
+				this.selectName = specValue.value;
+
+				this.$emit('handleClickSku', {
+					skuId: selectedSkuId.skuId,
+					goodsId: this.goodsDetail.goodsId
+				});
+			} else {
+				uni.showToast({
+					title: '鏆傛棤璇ュ晢鍝�!',
+					duration: 2000,
+					icon: 'none'
+				});
+			}
+		},
+
+		/**
+		 * 鐩存帴璐拱
+		 */
+		buy(data) {
+			API_trade.addToCart(data).then(res => {
+				if (res.data.success) {
+					uni.navigateTo({
+						url: `/pages/order/fillorder?way=${data.cartType}&addr=${''}&parentOrder=${encodeURIComponent(JSON.stringify(this.parentOrder))}`
+					});
+				}
+			});
+		},
+
+		/**
+		 * 娣诲姞鍒拌喘鐗╄溅鎴栬喘涔�
+		 */
+		addToCartOrBuy(val) {
+			if (!this.selectSkuList) {
+				uni.showToast({
+					title: '璇烽�夋嫨瑙勬牸鍟嗗搧',
+					icon: 'none'
+				});
+				return;
+			}
+			let data = {
+				skuId: this.goodsDetail.id,
+				num: this.num
+			};
+
+			if (val == 'cart') {
+				API_trade.addToCart(data).then(res => {
+					if (res.data.code == 200) {
+						uni.showToast({
+							title: '鍟嗗搧宸叉坊鍔犲埌璐墿杞�',
+							icon: 'none'
+						});
+
+						this.$emit('queryCart');
+						this.closeMask();
+					}
+				});
+			} else {
+				// 鍒ゆ柇鏄惁鎷煎洟鍟嗗搧
+				if (this.buyType) {
+					data.cartType = 'PINTUAN';
+				} else if (this.goodsDetail.goodsType == 'VIRTUAL_GOODS') {
+					data.cartType = 'VIRTUAL';
+				} else {
+					data.cartType = 'BUY_NOW';
+				}
+
+				API_trade.addToCart(data).then(res => {
+					if (res.data.code == 200) {
+						uni.navigateTo({
+							url: `/pages/order/fillorder?way=${data.cartType}&addr=${this.addr.id || ''}&parentOrder=${encodeURIComponent(JSON.stringify(this.parentOrder))}`
+						});
+					}
+				});
+			}
+		},
+		formatSku(list) {
+			// 鏍煎紡鍖栨暟鎹�
+			let arr = [{}];
+
+			if (!Array.isArray(list)) {
+				return false;
+			}
+			list.forEach((item, index) => {
+				item.specValues.forEach((spec, specIndex) => {
+					let name = spec.specName;
+					let values = {
+						value: spec.specValue,
+						quantity: item.quantity,
+						skuId: item.skuId
+					};
+					if (name === 'images') {
+						return;
+					}
+
+					arr.forEach((arrItem, arrIndex) => {
+						if (
+							arrItem.name == name &&
+							arrItem.values &&
+							!arrItem.values.find(i => {
+								return i.value === values.value;
+							})
+						) {
+							arrItem.values.push(values);
+						}
+
+						let keys = arr.map(key => {
+							return key.name;
+						});
+						if (!keys.includes(name)) {
+							arr.push({
+								name: name,
+								values: [values]
+							});
+						}
+					});
+				});
+			});
+
+			arr.shift();
+			this.formatList = arr;
+
+			list.forEach(item => {
+				// 榛樿閫変腑
+				if (item.skuId === this.goodsDetail.id) {
+					item.specValues
+						.filter(i => i.specName !== 'images')
+						.forEach((value, _index) => {
+							this.currentSelected[_index] = value.specValue;
+
+							this.selectName = value.specValue;
+
+							this.selectSkuList = {
+								spec: value,
+								data: this.goodsDetail
+							};
+						});
+				}
+			});
+
+			this.skuList = list;
+			// console.log(" this.skuList", this.skuList)
+		}
+	},
+
+	mounted() {
+		this.formatSku(this.goodsSpec);
+
+		console.log("goodsDetail",this.goodsDetail)
+	}
+};
+</script>
+<style lang="scss" scoped>
+@import './popup.scss';
+
+.price-row {
+	text-align: center;
+}
+
+.buy {
+	background-image: linear-gradient(135deg, #ffba0d, #ffc30d 69%, #ffcf0d);
+	box-shadow: 0 2px 6px 0 rgba(255, 65, 66, 0.2);
+}
+
+.card {
+	background-image: linear-gradient(135deg, #f2140c, #f2270c 70%, #f24d0c);
+	box-shadow: 0 2px 6px 0 rgba(255, 65, 66, 0.2);
+}
+
+/deep/.u-icon-plus,
+.u-icon-minus,
+.u-icon-disabled {
+	height: 30rpx !important;
+	background: #fff !important;
+}
+
+.goods-skus-number {
+	justify-content: space-between;
+	display: flex;
+
+	> .view-class-title {
+		flex: 8;
+	}
+
+	> .view-class-input {
+		flex: 1;
+	}
+}
+
+/deep/ .uni-scroll-view {
+	overflow: hidden !important;
+}
+
+.active {
+	background: $price-light-color !important;
+	border: 2rpx solid $price-color;
+	font-weight: bold;
+	color: $price-color !important;
+	box-sizing: border-box;
+}
+
+.goods-skus-box {
+	overflow-y: auto;
+	height: 610rpx;
+	// #ifdef MP-WEIXIN
+	height: 570rpx;
+	// #endif
+	margin-bottom: 10rpx;
+}
+.soldout{
+	margin: 20rpx 0;
+}
+
+.goods-skus-view {
+	overflow: hidden;
+
+	.skus-view-list {
+		> .skus-view-item {
+			flex: 1;
+			padding: 0 36rpx;
+
+			overflow: hidden;
+			height: 60rpx;
+			line-height: 60rpx;
+			float: left;
+			text-align: center;
+			margin-left: 24rpx;
+			margin-bottom: 20rpx;
+			font-size: 22rpx;
+			color: #262626;
+			background: #f2f2f2;
+			border-radius: 30rpx;
+		}
+	}
+}
+
+.wholesale-item {
+	color: #999 !important;
+	font-size: 24rpx;
+	margin: 0 20rpx;
+	display: flex;
+	justify-content: center;
+}
+
+.goods-header {
+	height: 200rpx;
+	display: flex;
+	align-items: center;
+	margin-bottom: 36rpx;
+}
+
+.goods-box {
+	padding: 50rpx 36rpx 0 36rpx;
+}
+
+.goods-skus {
+	padding: 0 20rpx;
+}
+
+.goods-price {
+	color: $price-color;
+	line-height: 80rpx;
+	margin-right: 20rpx;
+
+	> * {
+		color: $price-color;
+		line-height: 80rpx;
+	}
+}
+
+.promotion-box {
+	line-height: 1;
+	display: flex;
+	align-items: center;
+	text-decoration: line-through;
+	color: #999;
+	margin-left: 10rpx;
+
+	/deep/ span {
+		font-size: 30rpx;
+	}
+}
+
+.promotion {
+	font-size: 30rpx;
+}
+
+.goods-price-promotionShow {
+	font-size: 48rpx;
+}
+
+.goods-check-skus {
+	font-size: 24rpx;
+	color: #999;
+
+	> .goods-check-skus-name {
+		margin-left: 4rpx;
+	}
+
+	> span {
+		color: #333;
+	}
+}
+</style>
diff --git a/pages/subComponents/m-buy/popup.js b/pages/subComponents/m-buy/popup.js
new file mode 100644
index 0000000..2833633
--- /dev/null
+++ b/pages/subComponents/m-buy/popup.js
@@ -0,0 +1,8 @@
+
+
+export default {
+    height:"1000rpx", //寮瑰嚭灞傞珮搴�
+    mode:"bottom", //寮瑰嚭灞備綅缃�
+    radius:"32", //鍦嗚 rpx,
+    close:false //鑳藉惁鐐瑰嚮閬僵閫�鍑�
+}
\ No newline at end of file
diff --git a/pages/subComponents/m-buy/popup.scss b/pages/subComponents/m-buy/popup.scss
new file mode 100644
index 0000000..d571c30
--- /dev/null
+++ b/pages/subComponents/m-buy/popup.scss
@@ -0,0 +1,37 @@
+.view-class-title {
+    font-size: 26rpx;
+    color: #262626;
+
+    font-weight: 700;
+    height: 80rpx;
+    line-height: 80rpx;
+}
+.confirmBtn {
+    width: 90%;
+}
+.confirmBtn,
+.box-btn {
+    line-height: 80rpx;
+    height: 80rpx;
+    
+    background: $price-color;
+    color: #fff;
+    border-radius: 200px;
+    text-align: center;
+    margin: 5rpx auto;
+}
+
+.btns {
+    display: flex;
+    width: 100%;
+
+    margin: 0 auto;
+}
+.goods-price-bigshow {
+    font-size: 48rpx;
+    font-weight: bold;
+}
+.box-btn {
+    flex: 1;
+    margin: 0 10rpx;
+}
diff --git a/pages/subComponents/m-goods-list/README.md b/pages/subComponents/m-goods-list/README.md
new file mode 100644
index 0000000..bade838
--- /dev/null
+++ b/pages/subComponents/m-goods-list/README.md
@@ -0,0 +1,11 @@
+## 鍟嗗搧鍒楄〃灞曠ず
+
+### OBJECT 鍙傛暟璇存槑
+
+| 灞炴��        | 璇存槑                                                       | 绫诲瀷    | 蹇呭~ |
+| ----------- | ---------------------------------------------------------- | ------- | ---- |
+| `res`       | 鏄剧ず鏁版嵁                                                   | Array   | 鏄�   |
+| `type`      | 鍟嗗搧灞曠ず绫诲瀷 oneColumns twoColumns  锛岄粯璁ゅ睍绀轰竴琛屼袱鍒楀晢鍝� | String  | 鍚�   |
+| `storeName` | 鏄惁灞曠ず搴楅摵鍚嶇О锛岄粯璁ゅ睍绀�                                 | Boolean | 鍚�   |
+| `keywords` | 楂樹寒灞曠ず鎼滅储鍐呭                                 | String | 鍚�   |
+
diff --git a/pages/subComponents/m-goods-list/base-list.vue b/pages/subComponents/m-goods-list/base-list.vue
new file mode 100644
index 0000000..2098442
--- /dev/null
+++ b/pages/subComponents/m-goods-list/base-list.vue
@@ -0,0 +1,277 @@
+<template>
+  <div>
+    <!-- 涓�琛屼袱鍒楀晢鍝佸睍绀� -->
+    <view class="goods-list" v-if="type == 'twoColumns'">
+      <view v-for="(item, index) in res" :key="index" class="goods-item">
+        <view class="image-wrapper" @click="navigateToDetailPage(item)">
+          <u-image
+            :src="item.thumbnail"
+            width="100%"
+            height="330rpx"
+           mode="aspectFit"
+          >
+            <u-loading slot="loading"></u-loading>
+          </u-image>
+        </view>
+        <view class="goods-detail">
+          <div
+            class="title clamp"
+            v-html="lightSearchStr(keyword, item.goodsName)"
+            @click="navigateToDetailPage(item)"
+          ></div>
+          <view class="price-box" @click="navigateToDetailPage(item)">
+            <div class="price" v-if="item.price != undefined">
+              楼<span
+                >{{
+                  $options.filters.goodsFormatPrice(item.price)[0]
+                }} </span
+              >.{{ $options.filters.goodsFormatPrice(item.price)[1] }}
+            </div>
+          </view>
+          <div class="count-config" @click="navigateToDetailPage(item)">
+            <span>宸插敭 {{ item.buyCount || "0" }}</span>
+            <span>{{ item.commentNum || "0" }}鏉¤瘎璁�</span>
+          </div>
+          <div
+            class="store-seller-name"
+            v-if="storeName"
+            @click="navigateToStoreDetailPage(item)"
+          >
+            <div class="text-hidden">
+              <u-tag
+                style="margin-right: 10rpx"
+                size="mini"
+                mode="dark"
+                v-if="item.selfOperated"
+                text="鑷惀"
+                type="error"
+              />
+              <span>{{ item.storeName || "鏆傛棤" }}</span>
+            </div>
+            <span>
+              <u-icon name="arrow-right"></u-icon>
+            </span>
+          </div>
+        </view>
+      </view>
+    </view>
+	 <!-- 涓�琛屼竴鍒楀晢鍝佸睍绀� -->
+    <div v-if="type == 'oneColumns'">
+      <div  v-for="(item, index) in res" :key="index" class="goods-row">
+        <div class="flex goods-col">
+          <div class="goods-img" @click="navigateToDetailPage(item)">
+            <u-image
+              width="230rpx"
+              border-radius="16"
+              height="230rpx"
+							mode="aspectFit"
+              :src="item.goodsImage || item.thumbnail"
+            >
+              <u-loading slot="loading"></u-loading>
+            </u-image>
+          </div>
+          <div class="goods-detail">
+            <div class="title clamp3" @click="navigateToDetailPage(item)">
+              {{ item.goodsName }}
+            </div>
+            <view class="price-box" @click="navigateToDetailPage(item)">
+              <div class="price" v-if="item.price != undefined">
+                楼<span
+                  >{{ $options.filters.goodsFormatPrice(item.price)[0] }} </span
+                >.{{ $options.filters.goodsFormatPrice(item.price)[1] }}
+              </div>
+            </view>
+            <div class="promotion" @click="navigateToDetailPage(item)">
+              <div v-if="item.salesModel == 'WHOLESALE'">
+                <span>鎵�</span>
+              </div>
+              <div
+                v-for="(promotionItem, promotionIndex) in getPromotion(item)"
+                :key="promotionIndex"
+              >
+                <span v-if="promotionItem.indexOf('COUPON') != -1">鍔�</span>
+                <span v-if="promotionItem.indexOf('FULL_DISCOUNT') != -1"
+                  >婊″噺</span
+                >
+                <span v-if="promotionItem.indexOf('SECKILL') != -1">绉掓潃</span>
+              </div>
+            </div>
+            <div
+              style="overflow: hidden"
+              @click="navigateToDetailPage(item)"
+              class="count-config"
+            >
+              <span style="float: left; font-size: 22rpx"
+                >宸插敭 {{ item.buyCount || "0" }}</span
+              >
+              <span style="float: right; font-size: 22rpx"
+                >{{ item.commentNum || "0" }}鏉¤瘎璁�</span
+              >
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import commonTpl from "@/pages/subComponents/m-goods-list/common.vue";
+export default {
+  data() {
+    return {
+      lightColor: this.$mainColor,
+    };
+  },
+  mixins: [commonTpl],
+  props: {
+	// 灞曠ず鐨勭被鍨�
+	type:{
+		type:String,
+		default:"oneColumns"
+	},
+    // 閬嶅巻鐨勬暟鎹�
+    res: {
+      type: Array,
+      default: () => {
+        return [];
+      },
+    },
+  },
+  methods: {
+    // 璺宠浆鍒板晢鍝佽鎯�
+    navigateToDetailPage(item) {
+      uni.navigateTo({
+        url: `/pages/product/goods?id=${item.id}&goodsId=${item.goodsId}`,
+      });
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.goods-list {
+  display: flex;
+  flex-wrap: wrap;
+  margin: 10rpx 20rpx 284rpx;
+  width: 100%;
+
+  > .goods-item {
+    background-color: #ffffff;
+    display: flex;
+    border-radius: 16rpx;
+    flex-direction: column;
+    width: calc(50% - 30rpx);
+    margin-bottom: 20rpx;
+    padding-bottom: 20rpx;
+
+    &:nth-child(2n + 1) {
+      margin-right: 20rpx;
+    }
+
+    .image-wrapper {
+      width: 100%;
+      height: 330rpx;
+      border-radius: 16rpx 16rpx 0 0;
+      overflow: hidden;
+      padding: 0;
+    }
+  }
+
+  .count-config,
+  .store-seller-name {
+    font-size: $font-sm;
+  }
+
+  .text-hidden {
+    overflow: hidden;
+    text-overflow: ellipsis;
+    white-space: nowrap;
+  }
+}
+
+.goods-row {
+  background: #fff;
+  padding: 16rpx;
+
+  > .goods-col {
+    display: flex;
+
+    > .goods-img {
+      overflow: hidden;
+      flex: 4;
+    }
+
+    > .goods-detail {
+      flex: 7;
+    }
+  }
+}
+
+.goods-detail {
+  margin: 0 20rpx;
+
+  > .title {
+    font-size: $font-base;
+    color: $font-color-dark;
+    line-height: 1.5;
+    height: 86rpx;
+    padding: 10rpx 0 0;
+    display: -webkit-box;
+    -webkit-box-orient: vertical;
+    -webkit-line-clamp: 2;
+    overflow: hidden;
+  }
+
+  .promotion {
+    margin-top: 4rpx;
+    display: flex;
+
+    div {
+      span {
+        font-size: 24rpx;
+        color: $light-color;
+        margin-right: 10rpx;
+        padding: 0 4rpx;
+        border-radius: 2rpx;
+      }
+    }
+  }
+
+  .store-seller-name {
+    color: #666;
+    overflow: hidden;
+    display: flex;
+    justify-content: space-between;
+  }
+
+  .count-config {
+    padding: 5rpx 0;
+    color: #666;
+    display: flex;
+    font-size: 24rpx;
+    justify-content: space-between;
+  }
+
+  > .price-box {
+    margin-top: 10rpx;
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    padding-right: 10rpx;
+    font-size: 24rpx;
+    color: $font-color-light;
+
+    > .price {
+      font-size: 26rpx;
+      line-height: 1;
+      color: $main-color;
+      font-weight: bold;
+
+      /deep/ span:nth-of-type(1) {
+        font-size: 38rpx;
+      }
+    }
+  }
+}
+</style>
diff --git a/pages/subComponents/m-goods-list/common.vue b/pages/subComponents/m-goods-list/common.vue
new file mode 100644
index 0000000..c4cdc56
--- /dev/null
+++ b/pages/subComponents/m-goods-list/common.vue
@@ -0,0 +1,69 @@
+<template>
+</template>
+
+<script>
+	export default {
+		methods: {
+			// 楂樹寒鏄剧ず鎼滅储鍐呭	
+			lightSearchStr(keyword, str) {
+				if (!keyword) {
+					return str
+				} else {
+					let unicodes = '';
+					for (let i of Array.from(keyword)) {
+						unicodes += this.unicode(i) + "|"
+					}
+					const rule = '(' + unicodes + ')'
+					const reg = new RegExp(rule, 'gi');
+					return str ? str.replace(reg, matchValue =>
+						`<span style="color:${this.lightColor}">${matchValue}</span>`
+					) : ''
+				}
+			},
+			//  杞崲涓簎nicode
+			unicode(str) {
+				var value = '';
+				for (var i = 0; i < str.length; i++) {
+					value += '\\u' + this.left_zero_4(parseInt(str.charCodeAt(i)).toString(16));
+				}
+				return value;
+			},
+			left_zero_4(str) {
+				if (str != null && str != '' && str != 'undefined') {
+					if (str.length == 2) {
+						return '00' + str;
+					}
+				}
+				return str;
+			},
+			// 鏁版嵁鍘婚噸涓�涓� 鍙樉绀轰竴娆� 鍑忓厤 鍔� 浠�涔堢殑
+			getPromotion(item) {
+				if (item.promotionMap) {
+					let array = [];
+					Object.keys(item.promotionMap).forEach((child) => {
+						if (!array.includes(child.split("-")[0])) {
+							array.push(child.split("-")[0]);
+						}
+					});
+					return array;
+				}
+			},
+			// 璺宠浆鍒板晢鍝佽鎯�
+			navigateToDetailPage(item) {
+				uni.navigateTo({
+					url: `/pages/product/goods?id=${item.id}&goodsId=${item.goodsId}`,
+				});
+			},
+			// 璺宠浆鍦板潃
+			navigateToStoreDetailPage(item) {
+				uni.navigateTo({
+					url: `/pages/product/shopPage?id=${item.storeId}`,
+				});
+			},
+		},
+	}
+</script>
+
+<style lang='scss' scoped>
+	
+</style>
diff --git a/pages/subComponents/m-goods-list/list.vue b/pages/subComponents/m-goods-list/list.vue
new file mode 100644
index 0000000..37ad901
--- /dev/null
+++ b/pages/subComponents/m-goods-list/list.vue
@@ -0,0 +1,343 @@
+<template>
+	<view>
+		<!-- 涓�琛屼袱鍒楀晢鍝佸睍绀� -->
+		<view class="goods-list" v-if="type == 'twoColumns'">
+			<view v-for="(item, index) in res" :key="index" class="goods-item">
+				<view class="image-wrapper" @click="navigateToDetailPage(item)">
+					<u-image :src="item.thumbnail" width="100%" height='330rpx' mode="aspectFit">
+						<u-loading slot="loading"></u-loading>
+					</u-image>
+				</view>
+				<view class="goods-detail">
+					<div class="title clamp" v-html="lightSearchStr(keyword,item.goodsName)"
+						@click="navigateToDetailPage(item)">
+
+					</div>
+					<view class="price-box" @click="navigateToDetailPage(item)">
+						<div class="price" v-if="item.price!=undefined">
+							楼<span>{{ $options.filters.goodsFormatPrice(item.price )[0] }} </span>.{{
+	            $options.filters.goodsFormatPrice(item.price )[1]
+	          }}
+						</div>
+					</view>
+					<div class="promotion" @click="navigateToDetailPage(item)">
+						<div v-if="item.salesModel == 'WHOLESALE'">
+							<span>鎵�</span>
+						</div>
+						<div v-for="(promotionItem,promotionIndex) in  getPromotion(item)" :key="promotionIndex">
+							<span v-if="promotionItem.indexOf('COUPON') != -1">鍔�</span>
+							<span v-if="promotionItem.indexOf('FULL_DISCOUNT') != -1">婊″噺</span>
+							<span v-if="promotionItem.indexOf('SECKILL') != -1">绉掓潃</span>
+						</div>
+					</div>
+					<div class="count-config" @click="navigateToDetailPage(item)">
+						<span>宸插敭 {{ item.buyCount || "0" }}</span>
+						<span>{{ item.commentNum || "0" }}鏉¤瘎璁�</span>
+					</div>
+					<div class="store-seller-name" v-if="storeName" @click="navigateToStoreDetailPage(item)">
+						<div class="text-hidden">
+							<u-tag style="margin-right: 10rpx" size="mini" mode="dark" v-if="item.selfOperated"
+								text="鑷惀" type="error" />
+							<span>{{ item.storeName || "鏆傛棤" }}</span>
+						</div>
+						<span>
+							<u-icon name="arrow-right"></u-icon>
+						</span>
+					</div>
+				</view>
+			</view>
+		</view>
+		<!-- 涓�琛屼竴鍒楀晢鍝佸睍绀� -->
+		<div v-if="type == 'oneColumns'"  class="goods-one-row">
+			<div v-for="(item, index) in res" :key="index" class="goods-row">
+				<div class="flex goods-col">
+					<div class="goods-img" @click="navigateToDetailPage(item)">
+						<u-image width="230rpx" mode="aspectFit" border-radius='16' height="230rpx" :src="item.thumbnail">
+							<u-loading slot="loading"></u-loading>
+						</u-image>
+					</div>
+					<div class="goods-detail">
+						<div class="title clamp3" @click="navigateToDetailPage(item)">{{ item.goodsName }}</div>
+						<view class="price-box" @click="navigateToDetailPage(item)">
+							<div class="price" v-if="item.price!=undefined">
+								楼<span>{{ $options.filters.goodsFormatPrice(item.price )[0] }} </span>.{{
+			            $options.filters.goodsFormatPrice(item.price )[1]
+			          }}
+							</div>
+						</view>
+						<div class="promotion" @click="navigateToDetailPage(item)">
+							<div v-if="item.salesModel == 'WHOLESALE'">
+								<span>鎵�</span>
+							</div>
+							<div v-for="(promotionItem,promotionIndex) in  getPromotion(item)" :key="promotionIndex">
+								<span v-if="promotionItem.indexOf('COUPON') != -1">鍔�</span>
+								<span v-if="promotionItem.indexOf('FULL_DISCOUNT') != -1">婊″噺</span>
+								<span v-if="promotionItem.indexOf('SECKILL') != -1">绉掓潃</span>
+							</div>
+						</div>
+						<div style="overflow: hidden" @click="navigateToDetailPage(item)" class="count-config">
+							<span style="float: left; font-size: 22rpx">宸插敭 {{ item.buyCount || '0' }}</span>
+							<span style="float: right; font-size: 22rpx">{{ item.commentNum || '0' }}鏉¤瘎璁�</span>
+						</div>
+						<div style="overflow: hidden" @click="navigateToStoreDetailPage(item)" class="count-config">
+							<div class="text-hidden" v-if="storeName">
+								<u-tag style="margin-right: 10rpx" size="mini" mode="dark" v-if="item.selfOperated"
+									text="鑷惀" type="error" />
+								<span class="line1-store-name">{{ item.storeName }}</span>
+								<span class="to-store">杩涘簵<u-icon size="24" name="arrow-right" color="#666"></u-icon>
+								</span>
+							</div>
+							<span>
+								<u-icon name="arrow-right" color="#c5c5c5"></u-icon>
+							</span>
+						</div>
+					</div>
+				</div>
+
+			</div>
+		</div>
+
+	</view>
+</template>
+
+<script>
+	import '@/components/uview-components/uview-ui';
+	
+	import commonTpl from '@/pages/subComponents/m-goods-list/common.vue'
+	export default {
+		data() {
+			return {
+				lightColor: this.$mainColor
+			}
+		},
+		mixins: [commonTpl],
+		
+		props: {
+			// 閬嶅巻鐨勬暟鎹�
+			res: {
+				type: Array,
+				default: () => {
+					return []
+				}
+			},
+			// 涓�琛屼袱鍒楄繕鏄竴琛屼竴鍒楁樉绀�
+			type: {
+				type: String,
+				default: 'twoColumns',
+				validator() {
+					return ['twoColumns', 'oneColumns']
+				}
+			},
+			storeName: {
+				type: Boolean,
+				default: true
+			},
+			keyword: {
+				type: null,
+				default: ''
+			}
+
+		},
+		watch: {
+			keyword(val) {
+				if (val) {
+					this.lightSearchStr(val)
+				}
+			}
+		},
+		methods: {
+
+			// 楂樹寒鏄剧ず鎼滅储鍐呭	
+			lightSearchStr(keyword, str) {
+				if (!keyword) {
+					return str
+				} else {
+					let unicodes = '';
+					for (let i of Array.from(keyword)) {
+						unicodes += this.unicode(i) + "|"
+					}
+					const rule = '(' + unicodes + ')'
+					const reg = new RegExp(rule, 'gi');
+					return str ? str.replace(reg, matchValue =>
+						`<span style="color:${this.lightColor}">${matchValue}</span>`
+					) : ''
+				}
+			},
+			//  杞崲涓簎nicode
+			unicode(str) {
+				var value = '';
+				for (var i = 0; i < str.length; i++) {
+					value += '\\u' + this.left_zero_4(parseInt(str.charCodeAt(i)).toString(16));
+				}
+				return value;
+			},
+			left_zero_4(str) {
+				if (str != null && str != '' && str != 'undefined') {
+					if (str.length == 2) {
+						return '00' + str;
+					}
+				}
+				return str;
+			},
+			// 鏁版嵁鍘婚噸涓�涓� 鍙樉绀轰竴娆� 鍑忓厤 鍔� 浠�涔堢殑
+			getPromotion(item) {
+				if (item ? item.promotionMap : item.promotionMap) {
+					const fieldList = item ? item.promotionMap : item.promotionMap
+					let array = [];
+					Object.keys(fieldList).forEach((child) => {
+						if (!array.includes(child.split("-")[0])) {
+							array.push(child.split("-")[0]);
+						}
+					});
+					return array;
+				}
+			},
+			// 璺宠浆鍒板晢鍝佽鎯�
+			navigateToDetailPage(item) {
+				uni.navigateTo({
+					url: `/pages/product/goods?id=${item.id}&goodsId=${item.goodsId}`,
+				});
+			},
+			// 璺宠浆鍦板潃
+			navigateToStoreDetailPage(item) {
+				uni.navigateTo({
+					url: `/pages/product/shopPage?id=${item.storeId}`,
+				});
+			},
+		}
+	}
+</script>
+
+<style lang='scss' scoped>
+		.goods-one-row{
+			padding-bottom: 250rpx;
+		}
+		/* 鍟嗗搧鍒楄〃 */
+		.goods-list {
+			display: flex;
+			flex-wrap: wrap;
+			margin: 10rpx 20rpx 284rpx;
+			width: 100%;
+	
+			>.goods-item {
+				background-color: #ffffff;
+				display: flex;
+				border-radius: 16rpx;
+				flex-direction: column;
+				width: calc(50% - 30rpx);
+				margin-bottom: 20rpx;
+				padding-bottom: 20rpx;
+	
+				&:nth-child(2n + 1) {
+					margin-right: 20rpx;
+				}
+	
+	
+				.image-wrapper {
+					width: 100%;
+					height: 330rpx;
+					border-radius: 16rpx 16rpx 0 0;
+					overflow: hidden;
+					padding: 0;
+				}
+			}
+	
+			.count-config,
+			.store-seller-name {
+				font-size: $font-sm;
+			}
+	
+			.text-hidden {
+				overflow: hidden;
+				text-overflow: ellipsis;
+				white-space: nowrap;
+			}
+		}
+	
+	
+		.goods-row {
+			background: #fff;
+			padding: 16rpx;
+	
+			>.goods-col {
+				display: flex;
+	
+				>.goods-img {
+					overflow: hidden;
+					flex: 4;
+				}
+	
+				>.goods-detail {
+					flex: 7;
+				}
+			}
+		}
+	
+		.goods-detail {
+			margin: 0 20rpx;
+	
+			>.title {
+				font-size: $font-base;
+				color: $font-color-dark;
+				line-height: 1.5;
+				height: 86rpx;
+				padding: 10rpx 0 0;
+				display: -webkit-box;
+				-webkit-box-orient: vertical;
+				-webkit-line-clamp: 2;
+				overflow: hidden;
+			}
+	
+			.promotion {
+				margin-top: 4rpx;
+				display: flex;
+	
+				div {
+					span {
+						font-size: 24rpx;
+						color: $light-color;
+						margin-right: 10rpx;
+						padding: 0 4rpx;
+						border-radius: 2rpx;
+					}
+				}
+			}
+	
+			.store-seller-name {
+				color: #666;
+				overflow: hidden;
+				display: flex;
+				justify-content: space-between;
+			}
+	
+			.count-config {
+				padding: 5rpx 0;
+				color: #666;
+				display: flex;
+				font-size: 24rpx;
+				justify-content: space-between;
+			}
+	
+			>.price-box {
+				margin-top: 10rpx;
+				display: flex;
+				align-items: center;
+				justify-content: space-between;
+				padding-right: 10rpx;
+				font-size: 24rpx;
+				color: $font-color-light;
+	
+				>.price {
+					font-size: 26rpx;
+					line-height: 1;
+					color: $main-color;
+					font-weight: bold;
+	
+					/deep/ span:nth-of-type(1) {
+						font-size: 38rpx;
+					}
+				}
+			}
+	
+		}
+</style>
diff --git a/pages/subComponents/m-goods-list/promotion.vue b/pages/subComponents/m-goods-list/promotion.vue
new file mode 100644
index 0000000..4c1a22c
--- /dev/null
+++ b/pages/subComponents/m-goods-list/promotion.vue
@@ -0,0 +1,171 @@
+<template>
+	<div>
+		<div v-for="(item, index) in res" :key="index" class="goods-row" @click="navigateToDetailPage(item)">
+			<div class="flex goods-col">
+				<div class="goods-img">
+					<u-image width="230rpx" mode="aspectFit" border-radius='16' height="230rpx" :src="item.goodsImage || item.thumbnail">
+						<u-loading slot="loading"></u-loading>
+					</u-image>
+				</div>
+				<div class="goods-detail">
+					<div class="title clamp3">{{ item.goodsName }}</div>
+					<div class='flex flex-a-c flex-j-sb'>
+						<view class="price-box">
+							<!-- 绉掓潃 / 鎷煎洟 -->
+							<div class="price" v-if="!type && item.price!=undefined">
+								楼<span>{{ $options.filters.goodsFormatPrice(item.price )[0] }} </span>.{{
+										$options.filters.goodsFormatPrice(item.price )[1]
+									}}
+							</div>
+							<!-- 鐮嶄环 -->
+							<div class="price" v-if="type && item.purchasePrice!=undefined">
+								鏈�浣庯細
+								楼<span>{{ $options.filters.goodsFormatPrice(item.purchasePrice )[0] }} </span>.{{
+										$options.filters.goodsFormatPrice(item.purchasePrice )[1]
+									}}
+							</div>
+							<!-- 鍏滃簳绛栫暐濡傛灉閲戦鏄�0 -->
+							<div class="price" v-if="!item.price && !type">
+								楼<span>0 </span>.00
+							</div>
+						</view>
+						<div>
+							<image class='buy' :src="buy"></image>
+						</div>
+					</div>
+					<div class='count-config' v-if="!type">
+						<span>鍗冲皢鎭㈠{{ item.originalPrice}}鍏�</span>
+					</div>
+				</div>
+			</div>
+
+		</div>
+	</div>
+</template>
+
+<script>
+	import '@/components/uview-components/uview-ui'
+	import commonTpl from '@/pages/subComponents/m-goods-list/common.vue'
+	export default {
+		data() {
+			return {
+				lightColor: this.$mainColor,
+				buy: require('@/static/buy.png')
+			}
+		},
+		mixins: [commonTpl],
+		props: {
+			// 閬嶅巻鐨勬暟鎹�
+			res: {
+				type: Array,
+				default: () => {
+					return []
+				}
+			},
+			type:{
+				type:null,
+				default:""
+			}
+		},
+		methods: {
+			// 璺宠浆鍒板晢鍝佽鎯�
+			navigateToDetailPage(item) {
+				if(this.type == 'kanJia'){
+					 uni.navigateTo({
+						url: `/pages/promotion/bargain/detail?id=${item.id}`,
+					});
+					return
+				}
+				uni.navigateTo({
+					url: `/pages/product/goods?id=${item.skuId}&goodsId=${item.goodsId}`,
+				});
+			},
+		}
+	}
+</script>
+
+<style lang='scss' scoped>
+	.buy {
+		width: 152rpx;
+		height: 108rpx;
+	}
+	.flex-j-sb {
+		width: 100%;
+	}
+	.goods-row {
+		background: #fff;
+		padding: 16rpx;
+		>.goods-col {
+			display: flex;
+			>.goods-img {
+				overflow: hidden;
+				flex: 4;
+			}
+			>.goods-detail {
+				flex: 7;
+			}
+		}
+	}
+	.goods-detail {
+		margin: 0 20rpx;
+		>.title {
+			font-size: $font-base;
+			color: $font-color-dark;
+			line-height: 1.5;
+			height: 86rpx;
+			padding: 10rpx 0 0;
+			display: -webkit-box;
+			-webkit-box-orient: vertical;
+			-webkit-line-clamp: 2;
+			overflow: hidden;
+		}
+
+		.promotion {
+			margin-top: 4rpx;
+			display: flex;
+
+			div {
+				span {
+					font-size: 24rpx;
+					color: $light-color;
+					margin-right: 10rpx;
+					padding: 0 4rpx;
+					border-radius: 2rpx;
+				}
+			}
+		}
+
+		.count-config {
+			padding: 5rpx 0;
+			color: #666;
+			display: flex;
+			font-size: 24rpx;
+			letter-spacing:2rpx;
+			padding-left: 10rpx;
+		}
+
+
+
+	}
+
+	.price-box {
+		margin-top: 10rpx;
+		display: flex;
+		align-items: center;
+		justify-content: space-between;
+		padding-right: 10rpx;
+		font-size: 24rpx;
+		color: $font-color-light;
+
+		>.price {
+			font-size: 26rpx;
+			line-height: 1;
+			color: $main-color;
+			font-weight: bold;
+
+			/deep/ span:nth-of-type(1) {
+				font-size: 48rpx;
+			}
+		}
+	}
+</style>
diff --git a/pages/subComponents/m-goods-recommend/README.md b/pages/subComponents/m-goods-recommend/README.md
new file mode 100644
index 0000000..b33849a
--- /dev/null
+++ b/pages/subComponents/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/subComponents/m-goods-recommend/index.vue b/pages/subComponents/m-goods-recommend/index.vue
new file mode 100644
index 0000000..cda8578
--- /dev/null
+++ b/pages/subComponents/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/subComponents/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/verification/animation.css b/pages/subComponents/verification/animation.css
new file mode 100644
index 0000000..931bb51
--- /dev/null
+++ b/pages/subComponents/verification/animation.css
@@ -0,0 +1,184 @@
+/* 
+  Animation 寰姩鐢�  
+  鍩轰簬ColorUI缁勫缓搴撶殑鍔ㄧ敾妯″潡 by 鏂囨檽娓� 2019骞�3鏈�26鏃�19:52:28
+ */
+
+/* css 婊ら暅 鎺у埗榛戠櫧搴曡壊gif鐨� */
+.gif-black{  
+  mix-blend-mode: screen;  
+}
+.gif-white{  
+  mix-blend-mode: multiply; 
+}
+
+
+/* Animation css */
+[class*=animation-] {
+    animation-duration: .5s;
+    animation-timing-function: ease-out;
+    animation-fill-mode: both
+}
+
+.animation-fade {
+    animation-name: fade;
+    animation-duration: .8s;
+    animation-timing-function: linear
+}
+
+.animation-scale-up {
+    animation-name: scale-up
+}
+
+.animation-scale-down {
+    animation-name: scale-down
+}
+
+.animation-slide-top {
+    animation-name: slide-top
+}
+
+.animation-slide-bottom {
+    animation-name: slide-bottom
+}
+
+.animation-slide-left {
+    animation-name: slide-left
+}
+
+.animation-slide-right {
+    animation-name: slide-right
+}
+
+.animation-shake {
+    animation-name: shake
+}
+
+.animation-reverse {
+    animation-direction: reverse
+}
+
+@keyframes fade {
+    0% {
+        opacity: 0
+    }
+
+    100% {
+        opacity: 1
+    }
+}
+
+@keyframes scale-up {
+    0% {
+        opacity: 0;
+        transform: scale(.2)
+    }
+
+    100% {
+        opacity: 1;
+        transform: scale(1)
+    }
+}
+
+@keyframes scale-down {
+    0% {
+        opacity: 0;
+        transform: scale(1.8)
+    }
+
+    100% {
+        opacity: 1;
+        transform: scale(1)
+    }
+}
+
+@keyframes slide-top {
+    0% {
+        opacity: 0;
+        transform: translateY(-100%)
+    }
+
+    100% {
+        opacity: 1;
+        transform: translateY(0)
+    }
+}
+
+@keyframes slide-bottom {
+    0% {
+        opacity: 0;
+        transform: translateY(100%)
+    }
+
+    100% {
+        opacity: 1;
+        transform: translateY(0)
+    }
+}
+
+@keyframes shake {
+
+    0%,
+    100% {
+        transform: translateX(0)
+    }
+
+    10% {
+        transform: translateX(-9px)
+    }
+
+    20% {
+        transform: translateX(8px)
+    }
+
+    30% {
+        transform: translateX(-7px)
+    }
+
+    40% {
+        transform: translateX(6px)
+    }
+
+    50% {
+        transform: translateX(-5px)
+    }
+
+    60% {
+        transform: translateX(4px)
+    }
+
+    70% {
+        transform: translateX(-3px)
+    }
+
+    80% {
+        transform: translateX(2px)
+    }
+
+    90% {
+        transform: translateX(-1px)
+    }
+}
+
+@keyframes slide-left {
+    0% {
+        opacity: 0;
+        transform: translateX(-100%)
+    }
+
+    100% {
+        opacity: 1;
+        transform: translateX(0)
+    }
+}
+
+@keyframes slide-right {
+    0% {
+        opacity: 0;
+        transform: translateX(100%)
+    }
+
+    100% {
+        opacity: 1;
+        transform: translateX(0)
+    }
+}
\ No newline at end of file
diff --git a/pages/subComponents/verification/icon.css b/pages/subComponents/verification/icon.css
new file mode 100644
index 0000000..a2eedf5
--- /dev/null
+++ b/pages/subComponents/verification/icon.css
@@ -0,0 +1,1226 @@
+@keyframes cuIcon-spin {
+	0% {
+		-webkit-transform: rotate(0);
+		transform: rotate(0);
+	}
+
+	100% {
+		-webkit-transform: rotate(359deg);
+		transform: rotate(359deg);
+	}
+}
+
+.cuIconfont-spin {
+	-webkit-animation: cuIcon-spin 2s infinite linear;
+	animation: cuIcon-spin 2s infinite linear;
+	display: inline-block;
+}
+
+.cuIconfont-pulse {
+	-webkit-animation: cuIcon-spin 1s infinite steps(8);
+	animation: cuIcon-spin 1s infinite steps(8);
+	display: inline-block;
+}
+
+[class*="cuIcon-"] {
+	font-family: "cuIcon";
+	font-size: inherit;
+	font-style: normal;
+}
+
+@font-face {
+	font-family: "cuIcon";
+	src: url('//at.alicdn.com/t/font_533566_yfq2d9wdij.eot?t=1545239985831');
+	/* IE9*/
+	src: url('//at.alicdn.com/t/font_533566_yfq2d9wdij.eot?t=1545239985831#iefix') format('embedded-opentype'),
+		/* IE6-IE8 */
+		url('data:application/x-font-woff;charset=utf-8;base64,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') format('woff'),
+		url('//at.alicdn.com/t/font_533566_yfq2d9wdij.ttf?t=1545239985831') format('truetype'),
+		/* chrome, firefox, opera, Safari, Android, iOS 4.2+*/
+		url('//at.alicdn.com/t/font_533566_yfq2d9wdij.svg?t=1545239985831#cuIconfont') format('svg');
+	/* iOS 4.1- */
+}
+
+.cuIcon-appreciate:before {
+	content: "\e644";
+}
+
+.cuIcon-check:before {
+	content: "\e645";
+}
+
+.cuIcon-close:before {
+	content: "\e646";
+}
+
+.cuIcon-edit:before {
+	content: "\e649";
+}
+
+.cuIcon-emoji:before {
+	content: "\e64a";
+}
+
+.cuIcon-favorfill:before {
+	content: "\e64b";
+}
+
+.cuIcon-favor:before {
+	content: "\e64c";
+}
+
+.cuIcon-loading:before {
+	content: "\e64f";
+}
+
+.cuIcon-locationfill:before {
+	content: "\e650";
+}
+
+.cuIcon-location:before {
+	content: "\e651";
+}
+
+.cuIcon-phone:before {
+	content: "\e652";
+}
+
+.cuIcon-roundcheckfill:before {
+	content: "\e656";
+}
+
+.cuIcon-roundcheck:before {
+	content: "\e657";
+}
+
+.cuIcon-roundclosefill:before {
+	content: "\e658";
+}
+
+.cuIcon-roundclose:before {
+	content: "\e659";
+}
+
+.cuIcon-roundrightfill:before {
+	content: "\e65a";
+}
+
+.cuIcon-roundright:before {
+	content: "\e65b";
+}
+
+.cuIcon-search:before {
+	content: "\e65c";
+}
+
+.cuIcon-taxi:before {
+	content: "\e65d";
+}
+
+.cuIcon-timefill:before {
+	content: "\e65e";
+}
+
+.cuIcon-time:before {
+	content: "\e65f";
+}
+
+.cuIcon-unfold:before {
+	content: "\e661";
+}
+
+.cuIcon-warnfill:before {
+	content: "\e662";
+}
+
+.cuIcon-warn:before {
+	content: "\e663";
+}
+
+.cuIcon-camerafill:before {
+	content: "\e664";
+}
+
+.cuIcon-camera:before {
+	content: "\e665";
+}
+
+.cuIcon-commentfill:before {
+	content: "\e666";
+}
+
+.cuIcon-comment:before {
+	content: "\e667";
+}
+
+.cuIcon-likefill:before {
+	content: "\e668";
+}
+
+.cuIcon-like:before {
+	content: "\e669";
+}
+
+.cuIcon-notificationfill:before {
+	content: "\e66a";
+}
+
+.cuIcon-notification:before {
+	content: "\e66b";
+}
+
+.cuIcon-order:before {
+	content: "\e66c";
+}
+
+.cuIcon-samefill:before {
+	content: "\e66d";
+}
+
+.cuIcon-same:before {
+	content: "\e66e";
+}
+
+.cuIcon-deliver:before {
+	content: "\e671";
+}
+
+.cuIcon-evaluate:before {
+	content: "\e672";
+}
+
+.cuIcon-pay:before {
+	content: "\e673";
+}
+
+.cuIcon-send:before {
+	content: "\e675";
+}
+
+.cuIcon-store:before {
+	content: "\e676";
+}
+
+.cuIcon-ticket:before {
+	content: "\e677";
+}
+
+.cuIcon-back:before {
+	content: "\e679";
+}
+
+.cuIcon-cascades:before {
+	content: "\e67c";
+}
+
+.cuIcon-discover:before {
+	content: "\e67e";
+}
+
+.cuIcon-list:before {
+	content: "\e682";
+}
+
+.cuIcon-more:before {
+	content: "\e684";
+}
+
+.cuIcon-scan:before {
+	content: "\e689";
+}
+
+.cuIcon-settings:before {
+	content: "\e68a";
+}
+
+.cuIcon-questionfill:before {
+	content: "\e690";
+}
+
+.cuIcon-question:before {
+	content: "\e691";
+}
+
+.cuIcon-storefill:before {
+	content: "\e697";
+}
+
+.cuIcon-form:before {
+	content: "\e699";
+}
+
+.cuIcon-pic:before {
+	content: "\e69b";
+}
+
+.cuIcon-filter:before {
+	content: "\e69c";
+}
+
+.cuIcon-footprint:before {
+	content: "\e69d";
+}
+
+.cuIcon-top:before {
+	content: "\e69e";
+}
+
+.cuIcon-pulldown:before {
+	content: "\e69f";
+}
+
+.cuIcon-pullup:before {
+	content: "\e6a0";
+}
+
+.cuIcon-right:before {
+	content: "\e6a3";
+}
+
+.cuIcon-refresh:before {
+	content: "\e6a4";
+}
+
+.cuIcon-moreandroid:before {
+	content: "\e6a5";
+}
+
+.cuIcon-deletefill:before {
+	content: "\e6a6";
+}
+
+.cuIcon-refund:before {
+	content: "\e6ac";
+}
+
+.cuIcon-cart:before {
+	content: "\e6af";
+}
+
+.cuIcon-qrcode:before {
+	content: "\e6b0";
+}
+
+.cuIcon-remind:before {
+	content: "\e6b2";
+}
+
+.cuIcon-delete:before {
+	content: "\e6b4";
+}
+
+.cuIcon-profile:before {
+	content: "\e6b7";
+}
+
+.cuIcon-home:before {
+	content: "\e6b8";
+}
+
+.cuIcon-cartfill:before {
+	content: "\e6b9";
+}
+
+.cuIcon-discoverfill:before {
+	content: "\e6ba";
+}
+
+.cuIcon-homefill:before {
+	content: "\e6bb";
+}
+
+.cuIcon-message:before {
+	content: "\e6bc";
+}
+
+.cuIcon-addressbook:before {
+	content: "\e6bd";
+}
+
+.cuIcon-link:before {
+	content: "\e6bf";
+}
+
+.cuIcon-lock:before {
+	content: "\e6c0";
+}
+
+.cuIcon-unlock:before {
+	content: "\e6c2";
+}
+
+.cuIcon-vip:before {
+	content: "\e6c3";
+}
+
+.cuIcon-weibo:before {
+	content: "\e6c4";
+}
+
+.cuIcon-activity:before {
+	content: "\e6c5";
+}
+
+.cuIcon-friendaddfill:before {
+	content: "\e6c9";
+}
+
+.cuIcon-friendadd:before {
+	content: "\e6ca";
+}
+
+.cuIcon-friendfamous:before {
+	content: "\e6cb";
+}
+
+.cuIcon-friend:before {
+	content: "\e6cc";
+}
+
+.cuIcon-goods:before {
+	content: "\e6cd";
+}
+
+.cuIcon-selection:before {
+	content: "\e6ce";
+}
+
+.cuIcon-explore:before {
+	content: "\e6d2";
+}
+
+.cuIcon-present:before {
+	content: "\e6d3";
+}
+
+.cuIcon-squarecheckfill:before {
+	content: "\e6d4";
+}
+
+.cuIcon-square:before {
+	content: "\e6d5";
+}
+
+.cuIcon-squarecheck:before {
+	content: "\e6d6";
+}
+
+.cuIcon-round:before {
+	content: "\e6d7";
+}
+
+.cuIcon-roundaddfill:before {
+	content: "\e6d8";
+}
+
+.cuIcon-roundadd:before {
+	content: "\e6d9";
+}
+
+.cuIcon-add:before {
+	content: "\e6da";
+}
+
+.cuIcon-notificationforbidfill:before {
+	content: "\e6db";
+}
+
+.cuIcon-explorefill:before {
+	content: "\e6dd";
+}
+
+.cuIcon-fold:before {
+	content: "\e6de";
+}
+
+.cuIcon-game:before {
+	content: "\e6df";
+}
+
+.cuIcon-redpacket:before {
+	content: "\e6e0";
+}
+
+.cuIcon-selectionfill:before {
+	content: "\e6e1";
+}
+
+.cuIcon-similar:before {
+	content: "\e6e2";
+}
+
+.cuIcon-appreciatefill:before {
+	content: "\e6e3";
+}
+
+.cuIcon-infofill:before {
+	content: "\e6e4";
+}
+
+.cuIcon-info:before {
+	content: "\e6e5";
+}
+
+.cuIcon-forwardfill:before {
+	content: "\e6ea";
+}
+
+.cuIcon-forward:before {
+	content: "\e6eb";
+}
+
+.cuIcon-rechargefill:before {
+	content: "\e6ec";
+}
+
+.cuIcon-recharge:before {
+	content: "\e6ed";
+}
+
+.cuIcon-vipcard:before {
+	content: "\e6ee";
+}
+
+.cuIcon-voice:before {
+	content: "\e6ef";
+}
+
+.cuIcon-voicefill:before {
+	content: "\e6f0";
+}
+
+.cuIcon-friendfavor:before {
+	content: "\e6f1";
+}
+
+.cuIcon-wifi:before {
+	content: "\e6f2";
+}
+
+.cuIcon-share:before {
+	content: "\e6f3";
+}
+
+.cuIcon-wefill:before {
+	content: "\e6f4";
+}
+
+.cuIcon-we:before {
+	content: "\e6f5";
+}
+
+.cuIcon-lightauto:before {
+	content: "\e6f6";
+}
+
+.cuIcon-lightforbid:before {
+	content: "\e6f7";
+}
+
+.cuIcon-lightfill:before {
+	content: "\e6f8";
+}
+
+.cuIcon-camerarotate:before {
+	content: "\e6f9";
+}
+
+.cuIcon-light:before {
+	content: "\e6fa";
+}
+
+.cuIcon-barcode:before {
+	content: "\e6fb";
+}
+
+.cuIcon-flashlightclose:before {
+	content: "\e6fc";
+}
+
+.cuIcon-flashlightopen:before {
+	content: "\e6fd";
+}
+
+.cuIcon-searchlist:before {
+	content: "\e6fe";
+}
+
+.cuIcon-service:before {
+	content: "\e6ff";
+}
+
+.cuIcon-sort:before {
+	content: "\e700";
+}
+
+.cuIcon-down:before {
+	content: "\e703";
+}
+
+.cuIcon-mobile:before {
+	content: "\e704";
+}
+
+.cuIcon-mobilefill:before {
+	content: "\e705";
+}
+
+.cuIcon-copy:before {
+	content: "\e706";
+}
+
+.cuIcon-countdownfill:before {
+	content: "\e707";
+}
+
+.cuIcon-countdown:before {
+	content: "\e708";
+}
+
+.cuIcon-noticefill:before {
+	content: "\e709";
+}
+
+.cuIcon-notice:before {
+	content: "\e70a";
+}
+
+.cuIcon-upstagefill:before {
+	content: "\e70e";
+}
+
+.cuIcon-upstage:before {
+	content: "\e70f";
+}
+
+.cuIcon-babyfill:before {
+	content: "\e710";
+}
+
+.cuIcon-baby:before {
+	content: "\e711";
+}
+
+.cuIcon-brandfill:before {
+	content: "\e712";
+}
+
+.cuIcon-brand:before {
+	content: "\e713";
+}
+
+.cuIcon-choicenessfill:before {
+	content: "\e714";
+}
+
+.cuIcon-choiceness:before {
+	content: "\e715";
+}
+
+.cuIcon-clothesfill:before {
+	content: "\e716";
+}
+
+.cuIcon-clothes:before {
+	content: "\e717";
+}
+
+.cuIcon-creativefill:before {
+	content: "\e718";
+}
+
+.cuIcon-creative:before {
+	content: "\e719";
+}
+
+.cuIcon-female:before {
+	content: "\e71a";
+}
+
+.cuIcon-keyboard:before {
+	content: "\e71b";
+}
+
+.cuIcon-male:before {
+	content: "\e71c";
+}
+
+.cuIcon-newfill:before {
+	content: "\e71d";
+}
+
+.cuIcon-new:before {
+	content: "\e71e";
+}
+
+.cuIcon-pullleft:before {
+	content: "\e71f";
+}
+
+.cuIcon-pullright:before {
+	content: "\e720";
+}
+
+.cuIcon-rankfill:before {
+	content: "\e721";
+}
+
+.cuIcon-rank:before {
+	content: "\e722";
+}
+
+.cuIcon-bad:before {
+	content: "\e723";
+}
+
+.cuIcon-cameraadd:before {
+	content: "\e724";
+}
+
+.cuIcon-focus:before {
+	content: "\e725";
+}
+
+.cuIcon-friendfill:before {
+	content: "\e726";
+}
+
+.cuIcon-cameraaddfill:before {
+	content: "\e727";
+}
+
+.cuIcon-apps:before {
+	content: "\e729";
+}
+
+.cuIcon-paintfill:before {
+	content: "\e72a";
+}
+
+.cuIcon-paint:before {
+	content: "\e72b";
+}
+
+.cuIcon-picfill:before {
+	content: "\e72c";
+}
+
+.cuIcon-refresharrow:before {
+	content: "\e72d";
+}
+
+.cuIcon-colorlens:before {
+	content: "\e6e6";
+}
+
+.cuIcon-markfill:before {
+	content: "\e730";
+}
+
+.cuIcon-mark:before {
+	content: "\e731";
+}
+
+.cuIcon-presentfill:before {
+	content: "\e732";
+}
+
+.cuIcon-repeal:before {
+	content: "\e733";
+}
+
+.cuIcon-album:before {
+	content: "\e734";
+}
+
+.cuIcon-peoplefill:before {
+	content: "\e735";
+}
+
+.cuIcon-people:before {
+	content: "\e736";
+}
+
+.cuIcon-servicefill:before {
+	content: "\e737";
+}
+
+.cuIcon-repair:before {
+	content: "\e738";
+}
+
+.cuIcon-file:before {
+	content: "\e739";
+}
+
+.cuIcon-repairfill:before {
+	content: "\e73a";
+}
+
+.cuIcon-taoxiaopu:before {
+	content: "\e73b";
+}
+
+.cuIcon-weixin:before {
+	content: "\e612";
+}
+
+.cuIcon-attentionfill:before {
+	content: "\e73c";
+}
+
+.cuIcon-attention:before {
+	content: "\e73d";
+}
+
+.cuIcon-commandfill:before {
+	content: "\e73e";
+}
+
+.cuIcon-command:before {
+	content: "\e73f";
+}
+
+.cuIcon-communityfill:before {
+	content: "\e740";
+}
+
+.cuIcon-community:before {
+	content: "\e741";
+}
+
+.cuIcon-read:before {
+	content: "\e742";
+}
+
+.cuIcon-calendar:before {
+	content: "\e74a";
+}
+
+.cuIcon-cut:before {
+	content: "\e74b";
+}
+
+.cuIcon-magic:before {
+	content: "\e74c";
+}
+
+.cuIcon-backwardfill:before {
+	content: "\e74d";
+}
+
+.cuIcon-playfill:before {
+	content: "\e74f";
+}
+
+.cuIcon-stop:before {
+	content: "\e750";
+}
+
+.cuIcon-tagfill:before {
+	content: "\e751";
+}
+
+.cuIcon-tag:before {
+	content: "\e752";
+}
+
+.cuIcon-group:before {
+	content: "\e753";
+}
+
+.cuIcon-all:before {
+	content: "\e755";
+}
+
+.cuIcon-backdelete:before {
+	content: "\e756";
+}
+
+.cuIcon-hotfill:before {
+	content: "\e757";
+}
+
+.cuIcon-hot:before {
+	content: "\e758";
+}
+
+.cuIcon-post:before {
+	content: "\e759";
+}
+
+.cuIcon-radiobox:before {
+	content: "\e75b";
+}
+
+.cuIcon-rounddown:before {
+	content: "\e75c";
+}
+
+.cuIcon-upload:before {
+	content: "\e75d";
+}
+
+.cuIcon-writefill:before {
+	content: "\e760";
+}
+
+.cuIcon-write:before {
+	content: "\e761";
+}
+
+.cuIcon-radioboxfill:before {
+	content: "\e763";
+}
+
+.cuIcon-punch:before {
+	content: "\e764";
+}
+
+.cuIcon-shake:before {
+	content: "\e765";
+}
+
+.cuIcon-move:before {
+	content: "\e768";
+}
+
+.cuIcon-safe:before {
+	content: "\e769";
+}
+
+.cuIcon-activityfill:before {
+	content: "\e775";
+}
+
+.cuIcon-crownfill:before {
+	content: "\e776";
+}
+
+.cuIcon-crown:before {
+	content: "\e777";
+}
+
+.cuIcon-goodsfill:before {
+	content: "\e778";
+}
+
+.cuIcon-messagefill:before {
+	content: "\e779";
+}
+
+.cuIcon-profilefill:before {
+	content: "\e77a";
+}
+
+.cuIcon-sound:before {
+	content: "\e77b";
+}
+
+.cuIcon-sponsorfill:before {
+	content: "\e77c";
+}
+
+.cuIcon-sponsor:before {
+	content: "\e77d";
+}
+
+.cuIcon-upblock:before {
+	content: "\e77e";
+}
+
+.cuIcon-weblock:before {
+	content: "\e77f";
+}
+
+.cuIcon-weunblock:before {
+	content: "\e780";
+}
+
+.cuIcon-my:before {
+	content: "\e78b";
+}
+
+.cuIcon-myfill:before {
+	content: "\e78c";
+}
+
+.cuIcon-emojifill:before {
+	content: "\e78d";
+}
+
+.cuIcon-emojiflashfill:before {
+	content: "\e78e";
+}
+
+.cuIcon-flashbuyfill:before {
+	content: "\e78f";
+}
+
+.cuIcon-text:before {
+	content: "\e791";
+}
+
+.cuIcon-goodsfavor:before {
+	content: "\e794";
+}
+
+.cuIcon-musicfill:before {
+	content: "\e795";
+}
+
+.cuIcon-musicforbidfill:before {
+	content: "\e796";
+}
+
+.cuIcon-card:before {
+	content: "\e624";
+}
+
+.cuIcon-triangledownfill:before {
+	content: "\e79b";
+}
+
+.cuIcon-triangleupfill:before {
+	content: "\e79c";
+}
+
+.cuIcon-roundleftfill-copy:before {
+	content: "\e79e";
+}
+
+.cuIcon-font:before {
+	content: "\e76a";
+}
+
+.cuIcon-title:before {
+	content: "\e82f";
+}
+
+.cuIcon-recordfill:before {
+	content: "\e7a4";
+}
+
+.cuIcon-record:before {
+	content: "\e7a6";
+}
+
+.cuIcon-cardboardfill:before {
+	content: "\e7a9";
+}
+
+.cuIcon-cardboard:before {
+	content: "\e7aa";
+}
+
+.cuIcon-formfill:before {
+	content: "\e7ab";
+}
+
+.cuIcon-coin:before {
+	content: "\e7ac";
+}
+
+.cuIcon-cardboardforbid:before {
+	content: "\e7af";
+}
+
+.cuIcon-circlefill:before {
+	content: "\e7b0";
+}
+
+.cuIcon-circle:before {
+	content: "\e7b1";
+}
+
+.cuIcon-attentionforbid:before {
+	content: "\e7b2";
+}
+
+.cuIcon-attentionforbidfill:before {
+	content: "\e7b3";
+}
+
+.cuIcon-attentionfavorfill:before {
+	content: "\e7b4";
+}
+
+.cuIcon-attentionfavor:before {
+	content: "\e7b5";
+}
+
+.cuIcon-titles:before {
+	content: "\e701";
+}
+
+.cuIcon-icloading:before {
+	content: "\e67a";
+}
+
+.cuIcon-full:before {
+	content: "\e7bc";
+}
+
+.cuIcon-mail:before {
+	content: "\e7bd";
+}
+
+.cuIcon-peoplelist:before {
+	content: "\e7be";
+}
+
+.cuIcon-goodsnewfill:before {
+	content: "\e7bf";
+}
+
+.cuIcon-goodsnew:before {
+	content: "\e7c0";
+}
+
+.cuIcon-medalfill:before {
+	content: "\e7c1";
+}
+
+.cuIcon-medal:before {
+	content: "\e7c2";
+}
+
+.cuIcon-newsfill:before {
+	content: "\e7c3";
+}
+
+.cuIcon-newshotfill:before {
+	content: "\e7c4";
+}
+
+.cuIcon-newshot:before {
+	content: "\e7c5";
+}
+
+.cuIcon-news:before {
+	content: "\e7c6";
+}
+
+.cuIcon-videofill:before {
+	content: "\e7c7";
+}
+
+.cuIcon-video:before {
+	content: "\e7c8";
+}
+
+.cuIcon-exit:before {
+	content: "\e7cb";
+}
+
+.cuIcon-skinfill:before {
+	content: "\e7cc";
+}
+
+.cuIcon-skin:before {
+	content: "\e7cd";
+}
+
+.cuIcon-moneybagfill:before {
+	content: "\e7ce";
+}
+
+.cuIcon-usefullfill:before {
+	content: "\e7cf";
+}
+
+.cuIcon-usefull:before {
+	content: "\e7d0";
+}
+
+.cuIcon-moneybag:before {
+	content: "\e7d1";
+}
+
+.cuIcon-redpacket_fill:before {
+	content: "\e7d3";
+}
+
+.cuIcon-subscription:before {
+	content: "\e7d4";
+}
+
+.cuIcon-loading1:before {
+	content: "\e633";
+}
+
+.cuIcon-github:before {
+	content: "\e692";
+}
+
+.cuIcon-global:before {
+	content: "\e7eb";
+}
+
+.cuIcon-settingsfill:before {
+	content: "\e6ab";
+}
+
+.cuIcon-back_android:before {
+	content: "\e7ed";
+}
+
+.cuIcon-expressman:before {
+	content: "\e7ef";
+}
+
+.cuIcon-evaluate_fill:before {
+	content: "\e7f0";
+}
+
+.cuIcon-group_fill:before {
+	content: "\e7f5";
+}
+
+.cuIcon-play_forward_fill:before {
+	content: "\e7f6";
+}
+
+.cuIcon-deliver_fill:before {
+	content: "\e7f7";
+}
+
+.cuIcon-notice_forbid_fill:before {
+	content: "\e7f8";
+}
+
+.cuIcon-fork:before {
+	content: "\e60c";
+}
+
+.cuIcon-pick:before {
+	content: "\e7fa";
+}
+
+.cuIcon-wenzi:before {
+	content: "\e6a7";
+}
+
+.cuIcon-ellipse:before {
+	content: "\e600";
+}
+
+.cuIcon-qr_code:before {
+	content: "\e61b";
+}
+
+.cuIcon-dianhua:before {
+	content: "\e64d";
+}
+
+.cuIcon-cuIcon:before {
+	content: "\e602";
+}
+
+.cuIcon-loading2:before {
+	content: "\e7f1";
+}
+
+.cuIcon-btn:before {
+	content: "\e601";
+}
diff --git a/pages/subComponents/verification/verification.vue b/pages/subComponents/verification/verification.vue
new file mode 100644
index 0000000..59581f1
--- /dev/null
+++ b/pages/subComponents/verification/verification.vue
@@ -0,0 +1,532 @@
+<template>
+  <view>
+    <view
+      v-if="!hid"
+      class="flex-row-center"
+      :style="{ top: scHight }"
+      style="width: 750rpx; position: fixed; z-index: 100; left: 0"
+    >
+      <view
+        class="flex-column-center"
+        style="background-color: #fcfcfc; padding: 30rpx; border-radius: 10rpx"
+      >
+        <movable-area
+          class="flex"
+          style="width: 100%"
+          animation="false"
+          :style="{ height: originalHeight }"
+        >
+          <movable-view
+            scale-value="1"
+            animation="false"
+            damping="5000"
+            :x="moveX"
+            :style="{
+              height: sliderHeight,
+              width: sliderWidth,
+              'z-index': 101,
+            }"
+            direction="horizontal"
+          >
+            <image
+              :src="imgbk"
+              class="image"
+              mode="aspectFit"
+              :style="{
+                height: sliderHeight,
+                width: sliderWidth,
+                'margin-top': imgbKH,
+              }"
+            ></image>
+          </movable-view>
+          <image
+            :src="img"
+            mode="aspectFit"
+            :style="{ height: originalHeight, width: originalWidth }"
+            style="border-radius: 10rpx"
+          ></image>
+        </movable-area>
+
+        <movable-area
+          class="flex-row-start"
+          style="
+            width: 100%;
+            background-color: #efefef;
+            height: 80rpx;
+            border-radius: 40rpx;
+            margin-top: 30rpx;
+          "
+        >
+          <movable-view
+            scale-value="1"
+            animation="false"
+            damping="50"
+            :x="movePv"
+            class="flex-row-center"
+            style="
+              border-radius: 50%;
+              height: 100rpx;
+              width: 100rpx;
+              background-color: #ffffff;
+              border: 2rpx solid #e3e3e3;
+              margin-top: -13rpx;
+            "
+            direction="horizontal"
+            @change="moveChange"
+            @touchend="end"
+          >
+            <u-icon
+              :color="mainColor"
+              size="40"
+              v-if="endLoad"
+              name="arrow-right"
+            ></u-icon>
+            <u-icon :color="mainColor" size="40" v-else name="reload"></u-icon>
+          </movable-view>
+
+          <text style="padding-left: 140rpx" :style="{ color: col }">{{
+            hasImg
+          }}</text>
+        </movable-area>
+        <view class="flex-row-around padding-top" style="width: 100%">
+          <u-icon
+            @click="hide"
+            :color="mainColor"
+            size="40"
+            name="close"
+          ></u-icon>
+
+          <text class="cu-tag round" @click="getCode">鍒锋柊鎷煎浘</text>
+          <text class="my-neirong-sm cuIcon-safe" style="color: #c1c1c1"
+            >Lili-FRAMEWORK</text
+          >
+        </view>
+      </view>
+    </view>
+  </view>
+</template>
+
+<script>
+import '@/components/uview-components/uview-ui'
+import api from "@/config/api.js";
+import storage from "@/utils/storage.js";
+import uuid from "@/utils/uuid.modified.js";
+const phone = uni.getSystemInfoSync();
+const l = phone.screenWidth / 750;
+export default {
+  name: "verification",
+  created() {
+    // 鍙嚜琛岃皟鏁�
+    this.scHight = phone.screenHeight / 2 - 200 + "px";
+    this.getCode();
+  },
+  props: {
+    height: {
+      type: String,
+      default: "80rpx",
+    },
+    width: {
+      type: String,
+      default: "350rpx",
+    },
+    left: {
+      type: String,
+      default: "180rpx",
+    },
+    top: {
+      type: String,
+      default: "30rpx",
+    },
+    business: {
+      type: String,
+      default: "LOGIN",
+    },
+  },
+  data() {
+    return {
+      mainColor: this.$mainColor,
+      flage: false,
+      key: "", //key
+      vsrtx: "鐐瑰嚮杩涜楠岃瘉", //鎸夐挳鎻愮ず璇�
+      vsr: false, //
+      hid: true,
+      col: "#838383",
+      movePv: 0,
+      hasImg: "鎷栧姩婊戝潡宸插畬鎴愭嫾鍥�",
+      spcode: "",
+      tl: 0,
+      moveCode: 0,
+      //X杞寸Щ鍔ㄨ窛绂�
+      moveX: 0,
+      //妯$増楂樺害
+      originalHeight: "",
+      //妯$増瀹藉害
+      originalWidth: "",
+      //鎷煎浘楂樺害
+      sliderHeight: "",
+      //骞虫秱瀹藉害
+      sliderWidth: "",
+      scHight: 0,
+      //鍘熷浘
+      img: "",
+      //鎷煎浘
+      imgbk: "",
+      endLoad: true,
+      imgbKH: "",
+    };
+  },
+  methods: {
+    show() {
+      this.hid = false;
+    },
+    hide() {
+      if (!this.vsr) {
+        // vsr鍒ゆ柇鏄惁楠岃瘉鎴愬姛锛屾垚鍔熼殣钘忛獙璇佹
+        this.hid = !this.hid;
+      }
+    },
+    error() {
+      this.vsr = false;
+      this.hid = false;
+      this.moveX = 0;
+      this.moveCode = 0;
+    },
+    // 鑾峰彇楠岃瘉鍥剧墖
+    getCode() {
+      this.col = "#b3afae";
+      this.hasImg = "鍥剧墖鍔犺浇涓�...";
+      if (!storage.getUuid()) {
+        storage.setUuid(uuid.v1());
+      }
+      uni.request({
+        url: api.common + "/common/slider/" + this.business,
+        header: {
+          uuid: storage.getUuid(),
+        },
+        success: (res) => {
+          this.col = "#838383";
+          this.hasImg = "鎷栧姩婊戝潡浠ュ畬鎴愭嫾鍥�";
+          var data = res.data.result;
+
+          // base64鐨勫浘鐗�
+          this.img = data.backImage;
+          this.imgbk = data.slidingImage;
+          // 鏍规嵁鍙傛暟鍔ㄦ�侀�傚簲楠岃瘉鍥剧墖鐨勯珮瀹�
+          this.imgbKH = data.randomY * 1.8 + "rpx";
+          this.originalHeight = data.originalHeight * 1.8 + "rpx";
+          this.originalWidth = data.originalWidth * 1.8 + "rpx";
+          this.sliderHeight = data.sliderHeight * 1.8 + "rpx";
+          this.sliderWidth = data.sliderWidth * 1.8 + "rpx";
+          // 閫傚簲姣旂巼锛岀敤鏉ラ�傚簲婊戝姩璺濈
+          this.tl = 1 / (1.8 * l);
+          // 鏃犵敤淇℃伅
+          this.spcode = data.capcode;
+          // 楠岃瘉浠ょ墝
+          this.key = data.key;
+          this.$store.state.verificationKey = data.key;
+        },
+      });
+    },
+    end(e) {
+      this.endLoad = false;
+      // 楠岃瘉鎷煎浘浣嶇疆鏄惁姝g‘
+      uni.request({
+        method: "POST",
+        url:
+          api.common +
+          "/common/slider/" +
+          this.business +
+          "?xPos=" +
+          parseInt(this.moveCode * this.tl),
+        header: {
+          uuid: storage.getUuid(),
+        },
+        success: (res) => {
+          this.endLoad = true;
+          res.data.result == false
+            ? (res.data.result = false)
+            : (res.data.result = true);
+
+          if (res.data && res.data.result) {
+            //楠岃瘉鎴愬姛鍚庢妸key鍙戦�佸嚭鍘�,鍚庣浼氭妸楠岃瘉淇℃伅瀛樺湪缂撳瓨閲�
+            this.$emit("send", this.key);
+            this.hide();
+            this.vsr = true;
+            this.vsrtx = "宸查�氳繃楠岃瘉";
+          } else {
+            this.getCode(); // 璁╂粦鍧楀洖鍒拌捣濮嬩綅缃�
+            if (this.movePv == 1) {
+              this.movePv = 0;
+            } else {
+              this.movePv = 1;
+            }
+          }
+        },
+        fail: (res) => {
+          this.$msg("杩炴帴鏈嶅姟鍣ㄥけ璐�");
+        },
+      });
+    },
+    // 缁戝畾鎷煎浘浣嶇疆
+    moveChange(e) {
+      this.moveX = e.detail.x;
+      this.moveCode = e.detail.x;
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+@import "./animation.css";
+@import "./icon.css";
+// @import './main.css';
+.dh-wt {
+  animation: at 1.1s ease;
+  animation-iteration-count: infinite;
+  animation-direction: alternate;
+  background-color: $main-color;
+  border-radius: 50%;
+}
+
+@keyframes at {
+  from {
+    width: 27rpx;
+    height: 27rpx;
+  }
+
+  to {
+    width: 45rpx;
+    height: 45rpx;
+  }
+}
+
+.ttcl {
+  color: $main-color;
+}
+
+.border-index {
+  border: 1rpx solid $main-color;
+}
+
+.status_bar {
+  height: var(--status-bar-height);
+  background-color: #f1f1f1;
+  width: 100%;
+}
+
+.status_bar-nobg {
+  height: var(--status-bar-height);
+  width: 100%;
+}
+
+/* 杞湀鍔ㄧ敾 */
+.turn-load {
+  animation: turnmy 1s linear infinite;
+}
+
+@keyframes turnmy {
+  0% {
+    -webkit-transform: rotate(0deg);
+  }
+
+  25% {
+    -webkit-transform: rotate(90deg);
+  }
+
+  50% {
+    -webkit-transform: rotate(180deg);
+  }
+
+  75% {
+    -webkit-transform: rotate(270deg);
+  }
+
+  100% {
+    -webkit-transform: rotate(360deg);
+  }
+}
+
+.status_bar-fixed {
+  height: var(--status-bar-height);
+  width: 100%;
+  position: fixed;
+  background-color: #f1f1f1;
+  z-index: 20;
+}
+
+.head-dh-my {
+  display: flex;
+  position: fixed;
+  justify-content: space-around;
+  align-items: flex-end;
+  padding-bottom: 10rpx;
+  z-index: 15;
+  background-color: #e3e3e3;
+  width: 750rpx;
+}
+
+.padding-left {
+  padding-left: 20rpx;
+}
+
+.padding-left-top {
+  padding-left: 20rpx;
+  padding-top: 20rpx;
+}
+
+.padding-right {
+  padding-right: 20rpx;
+}
+
+.input-my {
+  padding-left: 20rpx;
+  border-radius: 40rpx;
+  height: 50rpx;
+  margin: 10rpx;
+}
+
+.tb-tag-absolute {
+  position: absolute;
+  z-index: 5;
+  border-radius: 25rpx;
+  font-size: 16rpx;
+  margin-left: 25rpx;
+  margin-top: -35rpx;
+}
+
+.flex-column-center {
+  display: flex;
+  flex-direction: column;
+  justify-content: center;
+  align-items: center;
+}
+
+.flex-column-between {
+  display: flex;
+  flex-direction: column;
+  justify-content: space-between;
+  align-items: center;
+}
+
+.flex-column-start {
+  display: flex;
+  flex-direction: column;
+  justify-content: center;
+}
+
+.flex-column-around {
+  display: flex;
+  flex-direction: column;
+  justify-content: space-around;
+  align-items: center;
+}
+
+.flex-row-start {
+  display: flex;
+  flex-direction: row;
+  align-items: center;
+}
+
+.flex-row-around {
+  display: flex;
+  flex-direction: row;
+  justify-content: space-around;
+  align-items: center;
+}
+
+.flex-row-center {
+  display: flex;
+  flex-direction: row;
+  justify-content: center;
+  align-items: center;
+}
+
+.flex-row-between {
+  display: flex;
+  flex-direction: row;
+  justify-content: space-between;
+  align-items: center;
+}
+
+.my-title {
+  font-size: 35rpx;
+  font-weight: bold;
+}
+
+.my-neirong {
+  font-size: 26rpx;
+  color: #6d6d6d;
+}
+
+.my-neirong-sm {
+  font-size: 23rpx;
+  color: #616161;
+}
+
+.my-tag-text {
+  font-size: 22rpx;
+  padding-top: 20rpx;
+  color: #bababa;
+}
+
+.padding-top {
+  padding-top: 35rpx;
+}
+
+.padding-top-sm {
+  padding-top: 20rpx;
+}
+
+.bottom-dh {
+  background-color: #f1f1f1;
+  position: fixed;
+  z-index: 10;
+  bottom: 0;
+  width: 750rpx;
+  height: 110rpx;
+}
+
+.tb-text {
+  display: flex;
+  flex-direction: column;
+  justify-content: center;
+  align-items: center;
+}
+
+.bottom-text {
+  width: 750rpx;
+  position: fixed;
+  text-align: center;
+  font-size: 26rpx;
+  color: #9d9d9d;
+  bottom: 70rpx;
+}
+
+.moneycolor {
+  color: #ea5002;
+}
+
+.margin-top {
+  margin-top: 20rpx;
+}
+
+.margin-top-sm {
+  margin-top: 12rpx;
+}
+
+.margin {
+  margin: 20rpx;
+}
+
+.margin-left {
+  margin-left: 20rpx;
+}
+
+.margin-right {
+  margin-right: 20rpx;
+}
+
+.main-color {
+  color: #07d188;
+}
+</style>
diff --git a/pages/video/dropdown-menu.vue b/pages/video/dropdown-menu.vue
new file mode 100644
index 0000000..cf305ba
--- /dev/null
+++ b/pages/video/dropdown-menu.vue
@@ -0,0 +1,208 @@
+<template>
+  <view class="dropdown-container" :style="{ '--theme-color': themeColor }">
+    <!-- 瑙﹀彂鎸夐挳 -->
+    <view class="dropdown-trigger" @click="toggleDropdown">
+      <uni-icons type="more-filled" size="20" color="#fff"></uni-icons>
+      <view class="dropdown-icon" :class="{ 'rotate': isOpen }">
+        <uni-icons type="arrowdown" size="16" color="#fff"></uni-icons>
+      </view>
+    </view>
+    
+    <!-- 涓嬫媺鑿滃崟 -->
+    <view 
+      class="dropdown-menu" 
+      :class="[placementClass]"
+      v-if="isOpen" 
+      @click.stop
+    >
+      <scroll-view scroll-y class="dropdown-scroll" :style="{ maxHeight: maxHeight + 'px' }">
+        <view 
+          v-for="(item, index) in options" 
+          :key="index" 
+          class="dropdown-item"
+          @click="selectItem(item)"
+        >
+          <text>{{ item[labelKey] }}</text>
+        </view>
+      </scroll-view>
+    </view>
+    
+    <!-- 閬僵灞� -->
+    <view 
+      class="dropdown-mask" 
+      v-if="isOpen" 
+      @click="closeDropdown"
+    ></view>
+  </view>
+</template>
+
+<script>
+export default {
+  name: 'DropdownMenu',
+  props: {
+	// 涓氬姟鏁版嵁锛岄�変腑鑿滃崟鍚庝竴鍚岃繑鍥�
+	data: {
+		type: Object
+	},
+    // 閫夐」鍒楄〃
+    options: {
+      type: Array,
+      default: () => []
+    },
+    // 閫夐」瀵硅薄涓樉绀烘枃鏈殑key
+    labelKey: {
+      type: String,
+      default: 'label'
+    },
+    // 閫夐」瀵硅薄涓�肩殑key
+    valueKey: {
+      type: String,
+      default: 'command'
+    },
+    // 涓婚棰滆壊
+    themeColor: {
+      type: String,
+      default: '#409EFF'
+    },
+    // 涓嬫媺鑿滃崟鏈�澶ч珮搴�
+    maxHeight: {
+      type: Number,
+      default: 300
+    },
+    // 鑿滃崟寮瑰嚭浣嶇疆锛坱op/bottom锛�
+    placement: {
+      type: String,
+      default: 'bottom',
+      validator: (value) => ['top', 'bottom'].includes(value)
+    }
+  },
+  data() {
+    return {
+      isOpen: false,
+      selectedItem: null
+    }
+  },
+  computed: {
+    placementClass() {
+      return `placement-${this.placement}`;
+    }
+  },
+  methods: {
+    toggleDropdown() {
+      this.isOpen = !this.isOpen
+      if (this.isOpen) {
+        this.$emit('open')
+      } else {
+        this.$emit('close')
+      }
+    },
+    closeDropdown() {
+      this.isOpen = false
+      this.$emit('close')
+    },
+    selectItem(item) {
+      this.selectedItem = item
+      this.closeDropdown()
+      
+      // 鏍规嵁閰嶇疆杩斿洖鏁翠釜瀵硅薄鎴杤alue鍊�
+      const emitValue = typeof item === 'object' ? item[this.valueKey] : item
+      this.$emit('input', emitValue)
+      this.$emit('change', emitValue, this.data)
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.dropdown-container {
+  position: relative;
+  display: inline-block;
+  z-index: 10;
+}
+
+.dropdown-trigger {
+  height: 70rpx;
+  line-height: 70rpx;
+  border-radius: 8rpx;
+  // background-color: #fff;
+  box-sizing: border-box;
+  cursor: pointer;
+  
+  &:active {
+    opacity: 0.8;
+  }
+}
+
+.dropdown-text {
+  flex: 1;
+  font-size: 28rpx;
+  color: #333;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+
+.dropdown-icon {
+  transition: transform 0.3s;
+  margin-left: 10rpx;
+  
+  &.rotate {
+    transform: rotate(180deg);
+  }
+}
+
+.dropdown-menu {
+  position: absolute;
+  left: -50rpx;
+  display: inline-block;
+  white-space: nowrap;
+  background-color: #fff;
+  border: 1rpx solid #EBEEF5;
+  border-radius: 8rpx;
+  // box-shadow: 0 2rpx 12rpx 0 rgba(0, 0, 0, 0.1);
+  z-index: 100;
+  overflow: hidden;
+  
+  &.placement-bottom {
+    top: 80rpx;
+  }
+  
+  &.placement-top {
+    bottom: 80rpx;
+  }
+}
+
+.dropdown-scroll {
+  width: 100%;
+}
+
+.dropdown-item {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  padding: 0 20rpx;
+  height: 80rpx;
+  line-height: 80rpx;
+  font-size: 28rpx;
+  color: #606266;
+  
+  &:active {
+    background-color: #f5f7fa;
+  }
+  
+  &.active {
+    color: var(--theme-color);
+    font-weight: bold;
+  }
+}
+
+.dropdown-mask {
+  position: fixed;
+  top: 0;
+  left: 0;
+  right: 0;
+  bottom: 0;
+  background-color: transparent;
+  z-index: 99;
+}
+</style>
\ No newline at end of file

--
Gitblit v1.8.0