瀏覽代碼

update to v1.2.8

x 5 年之前
父節點
當前提交
9f9d2e8013

+ 14 - 1
src/App.vue

@@ -9,6 +9,7 @@
     </div>
     <Footer v-if="footer === true"></Footer>
     <Home v-if="home === true"></Home>
+    <div v-if="footer === true" class="bottom_footer"></div>
   </div>
 </template>
 <script>
@@ -43,7 +44,6 @@ export default {
   },
   watch: {
     $route(to, from) {
-      console.log(to.name, from.name);
       const lastPath = this.history[this.history.length - 1] || {},
         { isReplace, isBack } = this.$router;
       if (to.meta.idx && from.meta.idx) {
@@ -188,4 +188,17 @@ export default {
     transform: translate3d(100%, 0, 0);
   }
 }
+
+.bottom_footer {
+  position: fixed;
+  bottom: 0;
+  width: 100%;
+  background-color: #fff;
+  height: 0;
+  z-index: 20;
+  /* Status bar height on iOS 11.0 */
+  height: constant(safe-area-inset-bottom);
+  /*!* Status bar height on iOS 11+ *!*/
+  height: env(safe-area-inset-bottom);
+}
 </style>

+ 43 - 15
src/assets/css/style.css

@@ -1,4 +1,9 @@
-body{font-size:0.28rem;background-color:#f5f5f5;transition: background-color .3s ease;-webkit-transition: background-color .3s ease;}
+
+body{font-size:0.28rem;background-color:#f5f5f5;transition: background-color .3s ease;
+    -webkit-transition: background-color .3s ease;
+}
+
+* { touch-action: pan-y; }
 
 /*vant-tab标签页样式修改*/
 .time-tabs .van-tab{padding: 0;flex-basis: 23%!important;-webkit-flex-basis:23%!important;line-height:unset;}
@@ -11,7 +16,15 @@ body{font-size:0.28rem;background-color:#f5f5f5;transition: background-color .3s
 .newsList .newsSwitch .van-hairline--top-bottom::after{border:0;}
 .newsList .newsSwitch .van-tab{font-size:0.32rem;padding:0;flex-basis:unset!important;-webkit-flex-basis:unset!important;margin-right:0.46rem;}
 .newsList .newsSwitch .van-tabs__wrap{padding: 0 0.3rem;}
-#footer{position:fixed;width:100%;height:1rem;bottom:0;left:0;background-color:#fff;border-top:1px solid #eee;z-index:22;}
+#footer{position:fixed;width:100%;height:1rem;left:0;background-color:#fff;border-top:1px solid #eee;z-index:22;}
+.footer_on{ bottom: 0;}
+.footer_off{
+    bottom: 0;
+    /* Status bar height on iOS 11.0 */
+    bottom: constant(safe-area-inset-bottom);
+    /*!* Status bar height on iOS 11+ *!*/
+    bottom: env(safe-area-inset-bottom);
+}
 #footer .item{flex:1;-webkit-flex:1;-o-flex:1;-ms-flex:1;text-align:center;font-size:0.2rem;color:#282828;}
 #footer .item.on{color:#ff3366;
     /*background:linear-gradient(left,#ff4a9b 0%,#ff4c2b 100%);*/
@@ -114,7 +127,9 @@ body{font-size:0.28rem;background-color:#f5f5f5;transition: background-color .3s
 /*详情首页弹窗*/
 .product-window{position:fixed;bottom:0;width:100%;left:0;background-color:#fff;z-index:88;border-radius:0.16rem 0.16rem 0 0;
     padding-bottom:1.4rem;transform:translate3d(0,100%,0);-webkit-transform:translate3d(0,100%,0);-ms-transform:translate3d(0,100%,0);-moz-transform:translate3d(0,100%,0);
-    -o-transform:translate3d(0,100%,0);transition:all .3s cubic-bezier(.25,.5,.5,.9);-webkit-transition:all .3s cubic-bezier(.25,.5,.5,.9);-moz-transition:all .3s cubic-bezier(.25,.5,.5,.9);-o-transition:all .3s cubic-bezier(.25,.5,.5,.9);}
+    -o-transform:translate3d(0,100%,0);transition:all .3s cubic-bezier(.25,.5,.5,.9);-webkit-transition:all .3s cubic-bezier(.25,.5,.5,.9);-moz-transition:all .3s cubic-bezier(.25,.5,.5,.9);-o-transition:all .3s cubic-bezier(.25,.5,.5,.9);
+    bottom: constant(safe-area-inset-bottom); bottom: env(safe-area-inset-bottom);
+}
 .product-window.on{transform:translate3d(0,0,0);-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);-o-transform:translate3d(0,0,0);}
 .product-window .textpic{padding:0 1.3rem 0 0.3rem;margin-top:0.29rem;position:relative;}
 .product-window .textpic .pictrue{width:1.5rem;height:1.5rem;}
@@ -321,7 +336,9 @@ body{font-size:0.28rem;background-color:#f5f5f5;transition: background-color .3s
 .index .wrapper .newProducts .swiper-slide .money{padding:0 0.1rem 0.18rem 0.1rem;text-align:center;font-size:0.26rem;font-weight:bold;}
 
 /*商品列表*/
-.productList .search{width:100%;height:0.86rem;padding-left:0.23rem;position:fixed;left:0;top:0;z-index:5;}
+.productList .search{width:100%;height:0.86rem;padding-left:0.23rem;position:fixed;left:0;top:0;z-index:5;
+    margin-top: constant(safe-area-inset-top); margin-top: env(safe-area-inset-top);}
+.productList .search_top{ position: fixed; top: 0; width: 100%; height: constant(safe-area-inset-top); height: env(safe-area-inset-top); z-index: 2; }
 .productList .search .input{width:5.7rem;height:0.6rem;background-color:#fff;border-radius:0.5rem;padding:0 0.2rem;}
 .productList .search .input input{width:4.78rem;height:100%;font-size:0.26rem;}
 .productList .search .input input::placeholder{color:#999;}
@@ -329,11 +346,11 @@ body{font-size:0.28rem;background-color:#f5f5f5;transition: background-color .3s
 .productList .search .icon-pailie,.productList .search .icon-tupianpailie{margin: 0 auto;color:#fff;width:0.4rem;font-size:0.4rem;
     height:0.86rem;line-height:0.86rem;}
 .productList .nav{height:0.86rem;color:#454545;position:fixed;left:0;width:100%;font-size:0.28rem;background-color:#fff;
-    top: 0.86rem;z-index:5;}
+    top: 0.86rem;z-index:5; top:calc(constant(safe-area-inset-top) + 0.86rem); top:calc(env(safe-area-inset-top) + 0.86rem);}
 .productList .nav .item{width:25%;text-align:center;}
 .productList .nav .item.font-color{font-weight:bold;}
 .productList .nav .item img{width:0.15rem;height:0.19rem;margin-left:0.1rem;}
-.productList .list{padding:0 0.2rem;margin-top:1.72rem;}
+.productList .list{padding:0 0.2rem;margin-top:1.6rem; margin-top:calc(constant(safe-area-inset-top) + 1.6rem); margin-top:calc(env(safe-area-inset-top) + 1.6rem);}
 .productList .list.on{background-color:#fff;border-top:1px solid #f6f6f6;}
 .productList .list .item{width:3.45rem;margin-top:0.2rem;background-color:#fff;border-radius:0.1rem;}
 .productList .list .item.on{width:100%;display:flex;display:-webkit-flex;display:-webkit-box;border-bottom:1px solid #f6f6f6;padding:0.3rem 0;
@@ -352,17 +369,22 @@ body{font-size:0.28rem;background-color:#f5f5f5;transition: background-color .3s
 .productList .list .item .text .vip .vip-money{font-size:0.24rem;color:#282828;font-weight:bold;}
 .productList .list .item .text .vip .vip-money img{width:0.46rem;height:0.21rem;margin-left:0.04rem;}
 /*购物车*/
+.shoppingCart .top_fixed{
+    position: fixed; width: 100%; background-color: #fff; top: 0; z-index: 4;
+    height: constant(safe-area-inset-top); height: env(safe-area-inset-top);
+}
 .shoppingCart .labelNav{height:0.76rem;padding:0 0.3rem;font-size:0.22rem;color:#8c8c8c;position:fixed;left:0;width:100%;
-background-color:#f5f5f5;z-index:5;top: 0;}
+background-color:#f5f5f5;z-index:5;top: 0;top: constant(safe-area-inset-top); top: env(safe-area-inset-top);}
 .shoppingCart .labelNav .item .iconfont{font-size:0.25rem;margin-right:0.1rem;}
 .shoppingCart .nav{width:100%;height:0.8rem;background-color:#fff;padding:0 0.3rem;font-size:0.28rem;color:#282828;
-    position:fixed;left:0;z-index:5;top:0.76rem;border-bottom: 1px solid #f5f5f5;}
+    position:fixed;left:0;z-index:5;top:0.76rem;border-bottom: 1px solid #f5f5f5;
+    top: calc(constant(safe-area-inset-top) + 0.76rem); top: calc(env(safe-area-inset-top) + 0.76rem);}
 .shoppingCart .nav .administrate{font-size:0.26rem;color:#282828;width:1.1rem;height:0.46rem;border-radius:0.06rem;
     border:1px solid #868686;}
 .shoppingCart .noCart{margin-top:1.71rem;background-color:#fff;padding: 0.78rem 0 0.56rem 0;}
 .shoppingCart .noCart .pictrue{width:4.14rem;height:3.36rem;margin:0 auto;}
 .shoppingCart .noCart .pictrue img{width:100%;height:100%;}
-.shoppingCart .list{margin-top:1.71rem;}
+.shoppingCart .list{margin-top:1.71rem; margin-top:calc(constant(safe-area-inset-top) + 1.71rem);margin-top:calc(env(safe-area-inset-top) + 1.71rem);}
 .shoppingCart .list .item{padding:0.25rem 0.3rem;background-color:#fff;margin-bottom:0.15rem;}
 .shoppingCart .list .item .picTxt{width:6.27rem;position:relative;}
 .shoppingCart .list .item .picTxt .pictrue{width:1.6rem;height:1.6rem;}
@@ -390,7 +412,8 @@ background-color:#f5f5f5;z-index:5;top: 0;}
 .shoppingCart .invalidGoods .goodsList .item .text{width:4.33rem;font-size:0.28rem;color:#999;height:1.4rem;text-align:left;}
 .shoppingCart .invalidGoods .goodsList .item .text .infor{font-size:0.24rem;}
 .shoppingCart .invalidGoods .goodsList .item .text .end{font-size:0.26rem;color:#bbb;}
-.shoppingCart .footer{width:100%;height:0.96rem;background-color:#fafafa;position:fixed;bottom:1rem;padding:0 0.3rem;border-top:1px solid #eee;}
+.shoppingCart .footer{width:100%;height:0.96rem;background-color:#fafafa;position:fixed;bottom:1rem;padding:0 0.3rem;
+    border-top:1px solid #eee; bottom: calc(constant(safe-area-inset-bottom) + 1rem); bottom: calc(env(safe-area-inset-bottom) + 1rem);}
 .shoppingCart .footer .checkAll{font-size:0.28rem;color:#282828;margin-left:0.6rem;}
 .shoppingCart .footer .money{font-size:0.3rem;}
 .shoppingCart .footer .placeOrder{color:#fff;font-size:0.3rem;width:2.26rem;height:0.7rem;border-radius:0.5rem;
@@ -493,8 +516,13 @@ top:50%;margin-top:-0.35rem;}
 .product-con .product-intro .conter{width:100%;overflow:hidden;}
 .product-con .product-intro .conter img{width:7.5rem!important;display:block!important;}
 /*产品详情*/
-.product-con .footer{padding:0 0.2rem 0 0.3rem;position:fixed;bottom:0;width:100%;height:1rem;background-color:#fff;
-    z-index:99;border-top:1px solid #f0f0f0;}
+.product-con .footer{padding:0 0.2rem 0 0.3rem;position:fixed;width:100%;height:1rem;background-color:#fff;
+    z-index:99;border-top:1px solid #f0f0f0;
+    bottom:0; bottom: constant(safe-area-inset-bottom);bottom: env(safe-area-inset-bottom);}
+.product-con .footer-bottom {
+    z-index: 98;position:fixed;width:100%;bottom: 0;height: 0; background-color: #fff;
+    height: constant(safe-area-inset-bottom);height: env(safe-area-inset-bottom);
+}
 .product-con .footer .item{font-size:0.18rem;color:#666;margin-top: 0.07rem;}
 .product-con .footer .item .iconfont{text-align:center;font-size:0.4rem;height: 0.4rem;line-height: 0.4rem;}
 .product-con .footer .item .iconfont.icon-gouwuche1{position:relative;}
@@ -643,7 +671,7 @@ border-radius:2rem;top:-0.1rem;right:0;height:0.3rem;line-height:0.3rem;padding:
 .order-details .wrapper .actualPay{border-top:0.01rem solid #eee;margin-top:0.3rem;padding-top:0.3rem;}
 .order-details .wrapper .actualPay .money{font-weight:bold;font-size:0.3rem;}
 .order-details .footer{width:100%;height:1rem;position:fixed;bottom:0;left:0;background-color:#fff;padding:0 0.3rem;border-top:1px solid #eee;}
-.order-details .footer .bnt{width:1.76rem;height:0.6rem;text-align:center;line-height:0.6rem;border-radius:0.5rem;
+.order-details .footer .bnt{width:1.46rem;height:0.6rem;text-align:center;line-height:0.6rem;border-radius:0.5rem;
     color:#fff;font-size:0.27rem;}
 .order-details .footer .bnt.cancel{color:#aaa;border:1px solid #ddd;}
 .order-details .footer .bnt.default{color: #444;border: 1px solid #444;}
@@ -1167,7 +1195,7 @@ position:relative;}
 .collectionGoods .item .text .delete{font-size:0.26rem;color:#282828;width:1.14rem;height:0.46rem;border:1px solid #bbb;border-radius:0.04rem;text-align:center;line-height:0.46rem;}
 /*搜索商品*/
 .searchGood .search{padding-left:0.3rem;}
-.searchGood .search{margin-top:0.2rem;}
+.searchGood .search{margin-top:0.2rem;margin-top: calc(constant(safe-area-inset-top) + 0.2rem);margin-top: calc(env(safe-area-inset-top) + 0.2rem);}
 .searchGood .search .input{width:5.28rem;background-color:#f7f7f7;border-radius:0.33rem;padding:0 0.35rem;height:0.66rem;}
 .searchGood .search .input input{width:4.02rem;font-size:0.28rem;}
 .searchGood .search .input input::placeholder{color:#bbb;}
@@ -1198,7 +1226,7 @@ position:relative;}
 .cash-withdrawal .wrapper .list .value input{font-size:0.8rem;color:#282828;height:1.35rem;text-align:center;width: 100%;}
 .cash-withdrawal .wrapper .list .value input::placeholder{color:#bbb;}
 /*提现审核*/
-.cash-audit{width:7.1rem;background-color:#fff;border-radius:0.06rem;margin:0.25rem auto 0 auto;padding:0.53rem 0 0.58rem 0;left: 50%;margin-left: -3.55rem;}
+.cash-audit{width:100%;background-color:#fff;border-radius:0.06rem;margin:0.25rem auto 0 auto;padding:0.53rem 0 0.58rem 0;}
 .cash-audit .pictrue{width:2.14rem;height:1.79rem;margin:0 auto;}
 .cash-audit .pictrue img{width:100%;height:100%;}
 .cash-audit .tip{font-size:0.32rem;color:#282828;margin-top:0.4rem;text-align:center;padding:0 0.4rem;}

+ 1 - 0
src/components/AddressWindow.vue

@@ -75,6 +75,7 @@ export default {
       });
     },
     closeAddress() {
+      window.back = undefined;
       this.$emit("input", false);
     },
     goAddressPages: function() {

+ 3 - 2
src/components/Footer.vue

@@ -1,5 +1,5 @@
 <template>
-  <div id="footer" class="acea-row row-middle">
+  <div id="footer" class="acea-row row-middle footer_off">
     <router-link
       :to="item.url"
       class="item"
@@ -43,7 +43,8 @@ export default {
           icon2: "iconfont icon-geren",
           url: "/user"
         }
-      ]
+      ],
+      show: false
     };
   },
   methods: {}

+ 16 - 6
src/components/NavBar.vue

@@ -1,8 +1,11 @@
 <template>
   <div>
+    <div class="bg-color-red" style="height: 0; position:fixed; top: 0; width: 100%; z-index: 30;
+        height: constant(safe-area-inset-top); height: env(safe-area-inset-top);"></div>
     <div
       class="bg-color-red"
-      style="height: 0.7rem; position:fixed; z-index:999; top:0; width: 100%;"
+      style="height: 0.7rem; position:fixed; z-index:999; top:0; width: 100%;
+        top: constant(safe-area-inset-top); top: env(safe-area-inset-top);"
     >
       <div
         class=""
@@ -11,7 +14,7 @@
         <div
           class="iconfont icon-xiangzuo"
           style="color: #FFFFFF; font-size: 0.35rem; padding-left: 10px;"
-          @click="$router.back()"
+          @click="returns"
         ></div>
         <div
           style="color: #FFFFFF; font-weight: 400; flex: auto; text-align: center; padding-right: 30px;"
@@ -20,7 +23,9 @@
         </div>
       </div>
     </div>
-    <div style="height: 0.7rem;"></div>
+    <div style="height: 0.7rem"></div>
+    <div style="padding-top: 0;
+        padding-top: constant(safe-area-inset-top); padding-top: env(safe-area-inset-top);"></div>
   </div>
 </template>
 
@@ -28,7 +33,8 @@
 export default {
   name: "NavBar",
   props: {
-    title: String
+    title: String,
+    path: String
   },
   data: function() {
     return {
@@ -36,7 +42,7 @@ export default {
     };
   },
   created: function() {
-    if (this.title == undefined) {
+    if (this.title === undefined) {
       this.titles = this.$route.meta.title;
     } else {
       this.titles = this.title;
@@ -45,7 +51,11 @@ export default {
 
   methods: {
     returns: function() {
-      this.$router.back();
+      if (this.path === undefined) {
+        this.$router.back();
+      } else {
+        this.$router.push({ path: this.path });
+      }
     }
   }
 };

+ 1 - 1
src/components/Payment.vue

@@ -87,7 +87,7 @@ export default {
     return {};
   },
   mounted: function() {
-    console.log(this.types);
+    // console.log(this.types);
   },
   methods: {
     checked: function(type) {

+ 24 - 17
src/components/ProductConSwiper.vue

@@ -28,23 +28,30 @@
       </swiperSlide>
     </swiper>
     <div class="videoBox" v-show="isOnPlay">
-      <video
-        ref="videoIds"
-        :poster="imgUrls[0]"
-        class="video-source"
-        loop=""
-        controls
-        style="width:100%;object-fit:fill"
-        preload="auto"
-        x-webkit-airplay="true"
-        x5-video-player-fullscreen="true"
-        x5-video-orientation="portraint"
-        x5-video-player-type=""
-        :src="videolines"
-        @pause="endVideo"
-      >
-        您的浏览器可能不支持视频播放
-      </video>
+<!--      <video-->
+<!--        ref="videoIds"-->
+<!--        :poster="imgUrls[0]"-->
+<!--        class="video-source"-->
+<!--        loop=""-->
+<!--        controls-->
+<!--        style="width:100%;object-fit:fill"-->
+<!--        preload="auto"-->
+<!--        x-webkit-airplay="true"-->
+<!--        x5-video-player-fullscreen="false"-->
+<!--        x5-video-orientation="landspace"-->
+<!--        x5-video-player-type=""-->
+<!--        :src="videolines"-->
+<!--        @pause="endVideo"-->
+<!--        webkit-playsinline="true"-->
+<!--        playsinline="true"-->
+<!--      >-->
+<!--        您的浏览器可能不支持视频播放-->
+<!--      </video>-->
+<pre>
+<video playsinline controls="controls" ref="videoIds" style="width:100%;object-fit:fill" :src="videolines" @pause="endVideo">
+<source :src="imgUrls[0]" type="video/mp4">
+</video>
+</pre>
     </div>
     <div class="pages">{{ currents || 1 }}/{{ imgUrls.length || 1 }}</div>
   </div>

+ 1 - 1
src/libs/chat.js

@@ -19,7 +19,7 @@ Socket.prototype = {
   },
   close() {
     clearInterval(this.timer);
-    this.ws.close();
+    if (this.ws) this.ws.close();
   },
 
   onLogin(success, data) {

+ 90 - 0
src/libs/update.js

@@ -0,0 +1,90 @@
+import axios from "axios";
+
+const dataPath = "/data/data/com.shotshock.twong/files/";
+
+export function downloadApk(url, downloadOver) {
+  window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, function() {
+    let transfer = new FileTransfer();
+    console.log("begin download from url: " + url);
+    transfer.download(
+      url,
+      dataPath + "twong-latest.apk",
+      function(entry) {
+        console.log("download success !" + entry.toURL());
+        downloadOver(entry.toURL());
+      },
+      error => {
+        console.log("download failed !" + error.toString());
+      },
+      true,
+      {}
+    );
+  });
+}
+
+export function openFile(
+  file,
+  type = "application/vnd.android.package-archive"
+) {
+  cordova.plugins.fileOpener2.open(file, type);
+}
+
+export function checkUpdate(showTips = false) {
+  if (typeof cordova == "undefined") {
+    console.log("current platform is not mobile.");
+    return;
+  }
+
+  let updateUrl = process.env.VUE_APP_UPDATE_URL;
+  axios
+    .get(updateUrl + "?ts=" + Date.parse(new Date()))
+    .then(res => {
+      let ver = res.data.version;
+      console.log(JSON.stringify(res.data));
+      cordova.getAppVersion.getVersionNumber().then(version => {
+        console.log("current version: " + version);
+        console.log("remote  version: " + ver);
+        if (ver > version) {
+          console.log("current need update !");
+          if (navigator.platform === "iPhone") {
+            window.$dialog
+              .confirm({
+                mes: "检查到有新版本,点击下载去安装!",
+                title: "更新提示",
+                opts: () => {
+                  cordova.InAppBrowser.open(res.data.iosStore, "_system");
+                }
+              })
+              .then(res => {
+                console.log(res);
+              })
+              .catch(err => {
+                console.log(err);
+              });
+          } else {
+            if (showTips) {
+              window.$dialog.toast({ mes: "检测到有新版本,正在后台下载!" });
+            }
+            downloadApk(res.data.download, function(file) {
+              window.$dialog.confirm({
+                mes: "新版本下载完成,点击确定安装!",
+                title: "更新提示",
+                opts: () => {
+                  openFile(file);
+                }
+              });
+            });
+          }
+        } else {
+          console.log("current alreay is latest !");
+          if (showTips) {
+            window.$dialog.toast({mes: "已经是最新版本了!"});
+          }
+        }
+      });
+    })
+    .catch(err => {
+      console.log(err);
+      // that.$dialog.error("检查更新失败!")
+    });
+}

+ 7 - 1
src/main.js

@@ -60,6 +60,7 @@ Vue.prototype.$validator = function(rule) {
 };
 Vue.prototype.$scroll = $scroll;
 Vue.prototype.$dialog = dialog;
+window.$dialog = dialog;
 
 const CACHE_KEY = "clear_0.0.1";
 
@@ -162,6 +163,11 @@ function onBackKeyDown(e) {
       navigator.app.exitApp();
     }
   } else {
-    router.back();
+    if (window.back) {
+     window.back();
+     window.back = undefined;
+    } else {
+      router.back();
+    }
   }
 }

+ 5 - 1
src/router/index.js

@@ -13,6 +13,11 @@ import Loading from "@views/Loading";
 
 Vue.use(Router);
 
+const originalPush = Router.prototype.push;
+Router.prototype.push = function push(location) {
+  return originalPush.call(this, location).catch(err => err);
+}
+
 const router = new Router({
   // mode: "history",
   routes: [
@@ -261,7 +266,6 @@ router.beforeEach((to, form, next) => {
   document.title = title || process.env.VUE_APP_NAME || "美天旺";
   //判断是否显示底部导航
   footer === true ? $store.commit("SHOW_FOOTER") : $store.commit("HIDE_FOOTER");
-
   //控制悬浮按钮是否显示
   // home === false ? $store.commit("HIDE_HOME") : $store.commit("SHOW_HOME");
   $store.commit("HIDE_HOME");

+ 2 - 19
src/utils/index.js

@@ -38,29 +38,12 @@ export function parseQuery() {
   return res;
 }
 
-export function getQueryVariable(variable) {
-  var query = window.location.search.substring(1);
-  var vars = query.split("&");
-  for (var i = 0; i < vars.length; i++) {
-    var pair = vars[i].split("=");
-    if (pair[0] == variable) {
-      return pair[1];
-    }
-  }
-  return false;
-}
-
 export function formatRMB(money) {
   money = parseFloat(money);
   return money.toFixed(2);
 }
 
-// https://twongd.shotshock.shop/api
-const debug = false;
-const VUE_APP_API_URL = debug
-  ? "http://twong.h/api"
-  : "https://twongd.shotshock.shop/api"; // process.env.VUE_APP_API_URL || `${location.origin}/api`;
-const VUE_APP_WS_URL = "wss:twongd.shotshock.shop:20003";
-// process.env.VUE_APP_WS_URL || `ws:twong.h:20003`;
+const VUE_APP_API_URL = process.env.VUE_APP_API_URL || `${location.origin}/api`;
+const VUE_APP_WS_URL = process.env.VUE_APP_WS_URL;
 
 export { VUE_APP_API_URL, VUE_APP_WS_URL };

+ 1 - 1
src/utils/request.js

@@ -5,7 +5,7 @@ import { VUE_APP_API_URL } from "@utils/index";
 
 const instance = axios.create({
   baseURL: VUE_APP_API_URL,
-  timeout: 5000
+  timeout: 10000
 });
 
 const defaultOpt = { login: false };

+ 64 - 165
src/views/home/Index.vue

@@ -15,6 +15,7 @@
         <div class="pictrue"><img :src="followUrl" /></div>
         <div class="mask" @click="closeFollowCode"></div>
       </div> -->
+      <div class="header_top"></div>
       <div class="header acea-row row-center-wrapper" ref="header">
         <div class="logo"><img :src="logoUrl" v-if="logoUrl" /></div>
         <router-link :to="'/search'" class="search acea-row row-middle">
@@ -64,7 +65,7 @@
 
               <router-link
                 v-if="isVip"
-                :to='"/goods_list?id="  + vip_cate'
+                :to="'/goods_list?id=' + vip_cate"
                 class="item"
                 :key="index"
               >
@@ -135,40 +136,6 @@
                 >
               </swiper>
             </div>
-            <!-- <div class="activity" v-if="activity.length">
-              <div class="title"><img src="@assets/images/title.png" /></div>
-              <div class="activityCon acea-row row-between-wrapper">
-                <router-link
-                  :to="activityOne[0].wap_link ? activityOne[0].wap_link : ''"
-                  class="left"
-                  :style="'background-image: url(' + activityOne[0].pic + ');'"
-                >
-                  <div class="name">{{ activityOne[0].title }}</div>
-                  <div class="info">{{ activityOne[0].info }}</div>
-                  <CountDown
-                    :is-day="false"
-                    :tip-text="''"
-                    :day-text="''"
-                    :hour-text="' : '"
-                    :minute-text="' : '"
-                    :second-text="''"
-                    :datatime="killIndexTime"
-                  ></CountDown>
-                </router-link>
-                <div class="right acea-row row-column-between">
-                  <router-link
-                    :to="item.wap_link ? item.wap_link : ''"
-                    class="item"
-                    :style="'background-image: url(' + item.pic + ');'"
-                    v-for="(item, index) in activity"
-                    :key="index"
-                  >
-                    <div class="name">{{ item.title }}</div>
-                    <div class="info">{{ item.info }}</div>
-                  </router-link>
-                </div>
-              </div>
-            </div> -->
             <div class="flashSale" v-if="seckillCont">
               <div class="title acea-row row-between row-bottom">
                 <div class="left acea-row row-middle">
@@ -304,7 +271,7 @@
               :to="lovely[0].wap_link ? lovely[0].wap_link : ''"
               class="advert"
               v-if="lovely.length"
-              ><img :src="lovely[0].img"
+              ><img :src="lovely[0].img" style="object-fit: cover"
             /></router-link>
             <div class="newProducts" v-if="info.firstList.length > 0">
               <div class="publicTitle acea-row row-center-wrapper">
@@ -464,50 +431,6 @@
                 </router-link>
               </div>
             </div>
-            <!-- <div class="promotion" v-if="benefit.length">
-              <div class="publicTitle acea-row row-center-wrapper">
-                <img src="@assets/images/promotionTitle.png" />
-                <router-link :to="'/promotion'" class="more"
-                  >更多 ></router-link
-                >
-              </div>
-              <div class="publicList acea-row row-between-wrapper">
-                <div
-                  @click="goDetails(item)"
-                  class="item"
-                  v-for="(item, index) in benefit"
-                  :key="index"
-                >
-                  <div class="pictrue">
-                    <img :src="item.image" />
-                    <span
-                      class="pictrue_log_big pictrue_log_class"
-                      v-if="item.activity && item.activity.type === '1'"
-                      >秒杀</span
-                    >
-                    <span
-                      class="pictrue_log_big pictrue_log_class"
-                      v-if="item.activity && item.activity.type === '2'"
-                      >砍价</span
-                    >
-                    <span
-                      class="pictrue_log_big pictrue_log_class"
-                      v-if="item.activity && item.activity.type === '3'"
-                      >拼团</span
-                    >
-                  </div>
-                  <div class="text">
-                    <div class="name line1">{{ item.store_name }}</div>
-                    <div class="acea-row row-between-wrapper">
-                      <GoodItem :item = item :isVip = isVip></GoodItem>
-                      <div class="cart acea-row row-center-wrapper">
-                        <span class="iconfont icon-mzshopping"></span>
-                      </div>
-                    </div>
-                  </div>
-                </div>
-              </div>
-            </div> -->
             <div class="recommend" v-if="hostProduct.length">
               <div class="title">
                 <img src="@assets/images/becommendTitle.png" />
@@ -558,25 +481,6 @@
           :key="index"
         >
           <div class="wrapper">
-            <div class="scroll-classify acea-row row-middle" v-if="item.length">
-              <!--<swiper :options="classifyScroll">
-                <swiper-slide
-                  v-for="(itemn, indexn) in item.children"
-                  :key="indexn"
-                >
-                  <div
-                    class="item"
-                    :class="categoryActive === indexn ? 'on' : ''"
-                    @click="productTap(indexn)"
-                  >
-                    <div class="pictrue">
-                      <img :src="itemn.pic" />
-                    </div>
-                    <div class="name line1">{{ itemn.cate_name }}</div>
-                  </div>
-                </swiper-slide>
-              </swiper> -->
-            </div>
             <div class="classifyList acea-row row-between-wrapper">
               <div
                 class="item"
@@ -641,13 +545,13 @@
         @checked="couponClose"
         @close="couponClose"
       ></Coupon-window>
-      <div style="height:1rem;"></div>
+      <div class="footer_spacer"></div>
     </div>
     <loadLogo v-else></loadLogo>
   </div>
 </template>
 <script>
-import axios from "axios";
+// import axios from "axios";
 import { getUserInfo } from "@api/user";
 import { swiper, swiperSlide } from "vue-awesome-swiper";
 import "@assets/css/swiper.min.css";
@@ -663,12 +567,11 @@ import { getCoupon, getCouponReceive } from "@api/user";
 import { getSeckillConfig, getSeckillList } from "@api/activity";
 import Loading from "@components/Loading";
 import debounce from "lodash.debounce";
-import { goShopDetail } from "@libs/order";
+// import { goShopDetail } from "@libs/order";
 import JPush from "@libs/jpush";
 import { WeChat } from "@libs/pay";
 import GoodItem from "@components/GoodItem";
-// import { getQueryVariable } from "../../utils";
-// import router from "@/router";
+import {checkUpdate} from "@libs/update";
 const HAS_COUPON_WINDOW = "has_coupon_window";
 const LONGITUDE = "user_longitude";
 const LATITUDE = "user_latitude";
@@ -739,7 +642,7 @@ export default {
       productList: [],
       loadings: false,
       loadends: false,
-      seckillCont: true,
+      seckillCont: false,
       swiperOption: {
         pagination: {
           el: ".paginationBanner",
@@ -834,11 +737,7 @@ export default {
       return this.$refs.mySwiper.swiper;
     },
     newSwiper() {
-      if (this.$refs.newSwiper !== undefined) {
-        return this.$refs.newSwiper.swiper;
-      } else {
-        return null;
-      }
+      return this.$refs.newSwiper.swiper;
     },
     recommendSwiper() {
       return this.$refs.recommendSwiper.swiper;
@@ -846,14 +745,15 @@ export default {
   },
   watch: {
     tapActive(to) {
+      console.log(to);
       if (to === 0) {
         this.tapActive = 0;
         this.swiper.autoplay.start();
-        if (this.mySwiper != null) this.newSwiper.autoplay.start();
+        this.newSwiper.autoplay.start();
         this.recommendSwiper.autoplay.start();
       } else {
         this.swiper.autoplay.stop();
-        if (this.mySwiper != null) this.newSwiper.autoplay.stop();
+        this.newSwiper.autoplay.stop();
         this.recommendSwiper.autoplay.stop();
       }
     },
@@ -864,11 +764,11 @@ export default {
         this.getHomeData();
         this.hostProducts();
         this.swiper.autoplay.start();
-        if (this.mySwiper != null) this.newSwiper.autoplay.start();
+        this.newSwiper.autoplay.start();
         this.recommendSwiper.autoplay.start();
       } else {
         this.swiper.autoplay.stop();
-        if (this.mySwiper != null) this.newSwiper.autoplay.stop();
+        this.newSwiper.autoplay.stop();
         this.recommendSwiper.autoplay.stop();
       }
     }
@@ -882,13 +782,13 @@ export default {
 
     JPush.init(processUri);
     WeChat.init();
-    this.checkUpdate();
+    checkUpdate();
 
     this.updateVIP();
     // this.getFollow();
     this.getHomeData();
     // this.getCoupon();
-    this.getSeckillTime();
+    // this.getSeckillTime();
     this.hostProducts();
     this.getCategoryData();
     this.$scroll(this.$refs.container, () => {
@@ -897,47 +797,6 @@ export default {
     cookie.get("expires");
   },
   methods: {
-    checkUpdate() {
-      const that = this;
-      if (typeof cordova == "undefined") {
-        console.log("current platform is not mobile.");
-        return;
-      }
-
-      axios.get("https://qndownload.shotshock.shop/version?ts=" +
-          Date.parse(new Date())).then(res => {
-          let ver = res.data.version;
-          let url = res.data.download;
-          let iosStore = res.data.iosStore;
-          console.log(JSON.stringify(res.data));
-          console.log(navigator.platform);
-          cordova.getAppVersion.getVersionNumber().then(version => {
-            console.log("current version: " + version);
-            console.log("remote  version: " + ver);
-            if (ver > version) {
-              console.log("current need update !");
-              that.$dialog.confirm({
-                mes: "检查到有新版本,点击确定去下载!",
-                title: "更新提示",
-                opts: () => {
-                  if(navigator.platform === "iPhone") {
-                    cordova.InAppBrowser.open(iosStore, "_system");
-                  }  else {
-                    cordova.InAppBrowser.open(url, "_system");
-                  }
-                }
-              });
-            } else {
-              console.log("current alreay is latest !");
-            }
-          });
-        })
-        .catch(err => {
-          console.log(err);
-          // that.$dialog.error("检查更新失败!")
-        });
-    },
-
     updateVIP() {
       if (this.$store.state.app.token !== null) {
         getUserInfo().then(res => {
@@ -984,7 +843,7 @@ export default {
     goDetails(item) {
       // console.log(item);
       // goShopDetail(item).then(() => {
-        this.$router.push({ path: "/detail/" + item.id });
+      this.$router.push({ path: "/detail/" + item.id });
       // });
     },
     getHomeData: function() {
@@ -995,13 +854,13 @@ export default {
         // that.mapKey = res.data.tengxun_map_key;
         that.logoUrl = res.data.logoUrl;
         that.subscribe = res.data.subscribe;
-        if (!that.subscribe && that.followUrl) {
-          setTimeout(function() {
-            that.followHid = true;
-          }, 200);
-        } else {
-          that.followHid = false;
-        }
+        // if (!that.subscribe && that.followUrl) {
+        //   setTimeout(function() {
+        //     that.followHid = true;
+        //   }, 200);
+        // } else {
+        //   that.followHid = false;
+        // }
         that.$set(that, "banner", res.data.banner);
         that.$set(that, "menus", res.data.menus);
         that.$set(that, "activity", res.data.activity);
@@ -1020,6 +879,12 @@ export default {
           res.data.couponList.some(coupon => coupon.is_use);
         // if (!cookie.get(LATITUDE) && !cookie.get(LONGITUDE))
         //   this.getWXLocation();
+
+        setTimeout(function() {
+          that.fixedHeader();
+        }, 500);
+      }).catch(err => {
+        console.log("catch index err:" + err.toString());
       });
     },
     getWXLocation() {
@@ -1188,6 +1053,15 @@ export default {
           openShareAll(configAppMessage);
         });
       }
+    },
+    fixedHeader() {
+      let nodes = document.getElementsByClassName("van-sticky");
+      if (nodes.length < 1){
+        console.log("failed  -----------");
+        return;
+      };
+      nodes[0].style.top = "env(safe-area-inset-top)";
+      console.log("success -----------");
     }
   }
 };
@@ -1220,12 +1094,31 @@ export default {
   color: #666;
   right: 0.2rem;
 }
+.indexs .header_top {
+  height: 0;
+  z-index: 2;
+  position: fixed;
+  width: 100%;
+  top: 0;
+  height: constant(safe-area-inset-top);
+  height: env(safe-area-inset-top);
+  background: linear-gradient(to left, #ff3366 0%, #ff6533 100%);
+  background: -webkit-linear-gradient(to left, #ff3366 0%, #ff6533 100%);
+  background: -moz-linear-gradient(to left, #ff3366 0%, #ff6533 100%);
+}
 .indexs .header {
   height: 0.98rem;
   width: 100%;
   background: linear-gradient(to left, #ff3366 0%, #ff6533 100%);
   background: -webkit-linear-gradient(to left, #ff3366 0%, #ff6533 100%);
   background: -moz-linear-gradient(to left, #ff3366 0%, #ff6533 100%);
+
+  z-index: 3;
+  margin-top: 0;
+  /* Status bar height on iOS 11.0 */
+  margin-top-top: constant(safe-area-inset-top);
+  /*!* Status bar height on iOS 11+ *!*/
+  margin-top: env(safe-area-inset-top);
 }
 .indexs .header .logo {
   width: 1.27rem;
@@ -1825,4 +1718,10 @@ export default {
   font-size: 0.22rem;
   color: #aaa;
 }
+
+.footer_spacer {
+  height: 1rem;
+  height: calc(constant(safe-area-inset-bottom) + 1rem);
+  height:calc(env(safe-area-inset-bottom) + 1rem);
+}
 </style>

+ 5 - 2
src/views/order/OrderSubmission.vue

@@ -420,7 +420,7 @@ export default {
       deduction: true,
       isWeixin: _isWeixin,
       pinkId: 0,
-      active: _isWeixin ? "weixin" : "yue",
+      active: _isWeixin ? "weixin" : "alipay",
       showCoupon: false,
       showAddress: false,
       addressInfo: {},
@@ -467,7 +467,7 @@ export default {
     let that = this;
     that.getUserInfo();
     that.getCartInfo();
-    that.getList();
+    // that.getList();
     if (this.$route.query.pinkid !== undefined)
       this.pinkId = this.$route.query.pinkid;
     if (that.$route.params.id !== undefined)
@@ -553,6 +553,9 @@ export default {
         this.addressLoaded = true;
         this.$refs.mychild.getAddressList();
       }
+      window.back = function() {
+        this.showAddress = false;
+      }.bind(this);
     },
     addressRedirect() {
       this.addressLoaded = false;

+ 48 - 26
src/views/shop/GoodsCon.vue

@@ -3,17 +3,23 @@
     :class="[posterImageStatus ? 'noscroll product-con' : 'product-con']"
     @scroll.native="onScroll"
   >
+    <div style="position: fixed; z-index: 2; width:100%; top: 0; background-color: white; height: 0;
+      height: constant(safe-area-inset-top); height: env(safe-area-inset-top);"
+         :style="'opacity:' + opacity"></div>
     <div
         @click="$router.back()"
         class="iconfont icon-xiangzuo"
         style="z-index: 999; position: fixed; top: 0.15rem; left: 0.3rem; text-align: center;
           color: white; width: 0.7rem; height: 0.7rem; border-radius: 0.5rem; background-color: rgba(68,68,68,0.7);
-          line-height: 0.7rem; font-weight: bold"
+          line-height: 0.7rem; font-weight: bold; padding-top: 0;
+          margin-top: constant(safe-area-inset-top);margin-top: env(safe-area-inset-top);"
         :style="'background-color:rgba(68,68,68,' + ((1 - opacity) * 0.5) + ');' +
          'color:rgba(' + 255 * (1 -opacity) + ',' + 255 * (1 -opacity) + ',' + 255 * (1 -opacity) + ', 1)'"
     ></div>
     <div
       class="header acea-row row-center-wrapper"
+      style=" padding-top: 0;
+          margin-top: constant(safe-area-inset-top);margin-top: env(safe-area-inset-top);"
       :style="'opacity:' + opacity"
       ref="header"
     >
@@ -230,7 +236,7 @@
                     >
                   </div>
                   <div class="name line1">{{ val.store_name }}}</div>
-                  <div class="money font-color-red">¥{{ val.price }}</div>
+                  <div class="money font-color-red">¥{{ isVip ? val.vip_price : val.price }}</div>
                 </div>
               </div>
             </swiper-slide>
@@ -239,7 +245,8 @@
         </div>
       </template>
     </div>
-    <div style="height:1.2rem;"></div>
+    <div class="footer_spacer"></div>
+    <div class="footer-bottom"></div>
     <div class="footer acea-row row-between-wrapper">
       <div class="item" @click="$router.push({ path: '/customer/list/' + id })">
         <div class="iconfont icon-kefu"></div>
@@ -286,6 +293,7 @@
     ></Share-red-packets>
     <CouponPop v-on:changeFun="changeFun" :coupon="coupon"></CouponPop>
     <Product-window
+        ref="product_window"
       v-on:changeFun="changeFun"
       :attr="attr"
       :iSplus="iSplus"
@@ -717,6 +725,7 @@ export default {
   computed: mapGetters(["isLogin"]),
   watch: {
     $route(n) {
+      console.log(n.name, NAME);
       if (n.name === NAME) {
         this.id = n.params.id;
         this.storeInfo.slider_image = [];
@@ -725,17 +734,14 @@ export default {
       }
     }
   },
-  updated() {
-    // window.scroll(0, 0);
-  },
   mounted: function() {
     document.addEventListener("scroll", this.onScroll, false);
     this.id = this.$route.params.id;
     this.storeInfo.slider_image = [];
     this.productCon();
-    this.coupons();
+    // this.coupons();
     window.addEventListener("scroll", this.handleScroll);
-    this.getList();
+    // this.getList();
     this.updateVIP();
     this.processKeyboard();
   },
@@ -761,7 +767,6 @@ export default {
       let nodes = document.getElementsByClassName("product-window on");
       if (nodes.length > 0) {
         let node = nodes[0];
-        console.log(node);
         node.style.paddingBottom = this.savePos;
       }
     },
@@ -773,7 +778,7 @@ export default {
       if (this.$store.state.app.token) {
         getUserInfo().then(res => {
           this.userInfo = res.data;
-          this.isVip = this.userInfo.vip_level > 1;
+          this.isVip = this.userInfo.vip_level > 0;
           console.log("Current VIP:", this.userInfo.vip_level);
         });
         return;
@@ -824,9 +829,10 @@ export default {
       this.$nextTick(() => {
         let index = a;
         this.navActive = index;
-        if (!this.goodList.length && index === 2) {
-          index = 3;
-        }
+        // if (!this.goodList.length && index === 2) {
+        //   index = 3;
+        // }
+        console.log(index);
         let element = document.querySelector("#title" + index);
         const top =
           element.offsetTop - this.$refs.header.offsetHeight - window.scrollY;
@@ -839,6 +845,7 @@ export default {
         this.lock = false;
         return;
       }
+      if (this.$refs.header === undefined) return;
       const headerHeight = this.$refs.header.offsetHeight,
         { scrollY } = window,
         titles = [];
@@ -857,6 +864,7 @@ export default {
           return;
         }
         if (initial) return initial;
+        if (title === null) return;
         if (scrollY + headerHeight < title.offsetTop + title.offsetHeight) {
           initial = true;
           this.navActive = index;
@@ -957,16 +965,15 @@ export default {
         this.posters = false;
       } else {
         this.posters = false;
-        console.log("todo wechat friend");
-        // todo wechat send to friend
-        var data = this.storeInfo;
-        var shareUrl =
-          "https://twongd.shotshock.shop/mobilex/share?uri=/detail/" + data.id;
+
+        let data = this.storeInfo;
+        let shareUrl =
+          process.env.VUE_APP_SHARE_URL + "?uri=/detail/" + data.id.toString();
         if (this.userInfo != null) {
           shareUrl += "&sp=" + this.userInfo.uid;
         }
 
-        var message = {
+        let message = {
           title: data.store_name,
           description: data.store_info,
           thumb: data.image,
@@ -983,7 +990,7 @@ export default {
       }
     },
     shareCode: function(value) {
-      var that = this;
+      const that = this;
       getProductCode(that.id).then(res => {
         if (res.data.code) that.posterData.code = res.data.code;
         value === false && that.listenerActionSheet();
@@ -995,14 +1002,14 @@ export default {
       // this.posterImageStatus = !this.posterImageStatus;
       this.posters = false;
       console.log("todo wechat friends");
-      var data = this.storeInfo;
-      var shareUrl =
-        "https://twongd.shotshock.shop/mobilex/share?uri=/detail/" + data.id;
+      let data = this.storeInfo;
+      let shareUrl =
+        process.env.VUE_APP_SHARE_URL + "?uri=/detail/" + data.id.toString();
       if (this.userInfo != null) {
         shareUrl += "&sp=" + this.userInfo.uid;
       }
 
-      var message = {
+      let message = {
         title: data.store_name,
         description: data.store_info,
         thumb: data.image,
@@ -1064,8 +1071,8 @@ export default {
           that.updateTitle();
           that.DefaultSelect();
           that.getCartCount();
-          that.getImageBase64();
-          that.setOpenShare();
+          // that.getImageBase64();
+          // that.setOpenShare();
         })
         .catch(res => {
           that.$dialog.error(res.msg);
@@ -1219,8 +1226,11 @@ export default {
       this.isOpen = true;
     },
     changeattr: function(msg) {
+      console.log(msg);
       this.attr.cartAttr = msg;
       this.isOpen = false;
+      // 取消返回按钮拦截
+      window.back = undefined;
     },
     //选择属性;
     ChangeAttr: function(res) {
@@ -1279,6 +1289,11 @@ export default {
     },
     // 加入购物车;
     goCat: function(news) {
+      // 绑定返回按钮为关闭弹窗
+      window.back = function() {
+        this.changeattr(false);
+      }.bind(this);
+
       setTimeout(this.resetProductWindow, 100);
       let that = this,
         productSelect = that.productValue[this.attrValue];
@@ -1372,3 +1387,10 @@ export default {
   }
 };
 </script>
+<style scoped>
+.footer_spacer {
+  height: 1.2rem;
+  height: calc(constant(safe-area-inset-bottom) + 1.2rem);
+  height: calc(env(safe-area-inset-bottom) + 1.2rem);
+}
+</style>

+ 1 - 0
src/views/shop/GoodsList.vue

@@ -1,6 +1,7 @@
 <template>
   <div class="productList" ref="container">
     <form @submit.prevent="submitForm">
+      <div class="search_top bg-color-red"></div>
       <div class="search bg-color-red acea-row row-between-wrapper">
         <div
           class="iconfont icon-xiangzuo"

+ 5 - 1
src/views/shop/ShoppingCart.vue

@@ -1,5 +1,6 @@
 <template>
-  <div class="shoppingCart">
+  <div class="shoppingCart" :style="getFooter()">
+    <div class="top_fixed"></div>
     <div class="labelNav acea-row row-around row-middle">
       <div class="item">
         <span class="iconfont icon-xuanzhong"></span>100%正品保证
@@ -476,6 +477,9 @@ export default {
         }
       }
       that.countmoney = carmoney;
+    },
+    getFooter: function() {
+      return { "height": window.screen.availHeight.toString() + "px" };
     }
   }
 };

+ 45 - 14
src/views/user/CustomerService.vue

@@ -13,10 +13,8 @@
           ></div>
           <div class="acea-row row-between">
             <div class="broadcast_details_pic">
-              ¥{{ productInfo.price
-              }}<span class="broadcast_details_pic_num"
-                >¥{{ productInfo.ot_price }}</span
-              >
+              ¥{{ userInfo.vip_level > 0 ? productInfo.vip_price : productInfo.price
+              }}
             </div>
             <div class="broadcast_details_btn" @click="sendProduct">
               发送客服
@@ -42,10 +40,8 @@
             </div>
             <div class="acea-row row-between">
               <div class="broadcast_details_pic">
-                ¥{{ cartInfo.productInfo.price
-                }}<span class="broadcast_details_pic_num"
-                  >¥{{ cartInfo.productInfo.ot_price }}</span
-                >
+                ¥{{ userInfo.vip_level > 0 ? cartInfo.productInfo.vip_price : cartInfo.productInfo.price
+                }}
               </div>
               <div class="broadcast_details_btn" @click="sendOrder">
                 发送客服
@@ -55,7 +51,9 @@
         </div>
       </div>
     </div>
-    <div class="chat" ref="chat">
+    <div v-show="productId && productInfo.id || orderId && orderInfo.id"
+         :class="productId && productInfo.id ? 'topSpacer' : 'topSpacerOrder'">&nbsp;</div>
+    <div class="chat" ref="chat" @click="inputOver" :style="getChatStyle()">
       <template v-for="item in history">
         <div v-if="item.msn_type > 0">
           <div
@@ -82,6 +80,7 @@
                     >
                       <router-link
                         class="broadcast-details_box noPad"
+                        style="position: relative"
                         :to="{ path: '/detail/' + val.product_id }"
                         v-if="inx == 0"
                       >
@@ -101,7 +100,7 @@
                             v-text="val.productInfo.store_name"
                           ></div>
                           <div class="broadcast_details_pic">
-                            ¥{{ val.productInfo.price }}
+                            ¥{{ userInfo.vip_level > 0 ? val.productInfo.vip_price : val.productInfo.price }}
                           </div>
                         </div>
                       </router-link>
@@ -124,7 +123,7 @@
                       </div>
                       <div class="broadcast_details_picBox_no noPad">
                         <div class="broadcast_details_pic">
-                          ¥{{ item.productInfo.price }}
+                          ¥{{ userInfo.vip_level ? item.productInfo.vip_price : item.productInfo.price }}
                         </div>
                         <div
                           class="broadcast_details_tit_no"
@@ -188,7 +187,7 @@
                     v-for="(val, inx) in item.orderInfo.cartInfo"
                     :key="val.id"
                   >
-                    <div class="broadcast-details_box noPad" v-if="inx == 0">
+                    <div class="broadcast-details_box noPad" style="position: relative" v-if="inx == 0">
                       <div class="broadcast_details_img">
                         <img :src="val.productInfo.image" />
                         <div class="broadcast_details_model">
@@ -205,7 +204,7 @@
                           v-text="val.productInfo.store_name"
                         ></div>
                         <div class="broadcast_details_pic">
-                          ¥{{ val.productInfo.price }}
+                          ¥{{ userInfo.vip_level > 0 ? val.productInfo.vip_price : val.productInfo.price }}
                         </div>
                       </div>
                     </div>
@@ -229,7 +228,7 @@
                     </div>
                     <div class="broadcast_details_picBox_no noPad">
                       <div class="broadcast_details_pic">
-                        ¥{{ item.productInfo.price }}
+                        ¥{{ userInfo.vip_level > 0 ? item.productInfo.vip_price : item.productInfo.price }}
                       </div>
                       <div
                         class="broadcast_details_tit_no"
@@ -397,6 +396,7 @@ import { orderDetail } from "@api/order";
 import VueCoreImageUpload from "vue-core-image-upload";
 import { VUE_APP_API_URL } from "@utils";
 import NavBar from "@components/NavBar";
+import {mapGetters} from "vuex";
 
 const chunk = function(arr, num) {
   num = num * 1 || 1;
@@ -426,6 +426,7 @@ export default {
       default: () => []
     }
   },
+  computed: mapGetters(["userInfo"]),
   data: function() {
     return {
       url: `${VUE_APP_API_URL}/upload/image`,
@@ -696,6 +697,18 @@ export default {
         window.scrollTo(0, document.documentElement.scrollHeight + 9999);
       });
       this.height();
+    },
+    inputOver: function() {
+      console.log(this.$refs.input);
+    },
+    getChatStyle: function() {
+      if (this.productId && this.productInfo.id) {
+        return { margin: "2rem 0 .3rem 0" };
+      } else if (this.orderId && this.orderInfo.id) {
+        return { margin: "3rem 0 .3rem 0" };
+      } else {
+        return { margin: "0 0 .3rem 0" };
+      }
     }
   }
 };
@@ -726,6 +739,7 @@ export default {
   padding: 0.15rem;
   position: fixed;
   z-index: 99;
+  width: 100%;
 }
 .broadcast-details_box {
   padding: 0.24rem;
@@ -733,6 +747,7 @@ export default {
   background: #fff;
   border-radius: 6px;
   margin-bottom: 0.24rem;
+  position: relative;
 }
 .broadcast_details_model {
   width: 100%;
@@ -1012,4 +1027,20 @@ export default {
   margin-top: 0.5rem;
   margin-bottom: 0.5rem;
 }
+
+.topSpacer {
+  width: 100%;
+  position: fixed;
+  z-index: 1;
+  height: 2rem;
+  background-color: #f5f5f5;
+}
+
+.topSpacerOrder {
+  width: 100%;
+  position: fixed;
+  z-index: 1;
+  height: 3rem;
+  background-color: #f5f5f5;
+}
 </style>

+ 2 - 1
src/views/user/Login.vue

@@ -1,6 +1,6 @@
 <template>
   <div class="register absolute">
-    <div style="text-align: right; padding-right: 10px; padding-top: 8px;">
+    <div style="text-align: right; padding-right: 10px; padding-top: 0.66rem">
       <router-link to="/" style="font-size: 18px; color: white;"
         >跳过,看好货 ></router-link
       >
@@ -306,6 +306,7 @@ export default {
             expires_time: expires_time
           };
           this.$store.commit("LOGIN", datas);
+          this.$store.dispatch("USERINFO", true);
           const backUrl = cookie.get(BACK_URL) || "/";
           cookie.remove(BACK_URL);
           that.$router.replace({ path: backUrl });

+ 4 - 40
src/views/user/PersonalData.vue

@@ -111,7 +111,7 @@
         </router-link>
       </div>
       <div>
-        <div class="item acea-row row-between-wrapper" @click="checkUpdate">
+        <div class="item acea-row row-between-wrapper" @click="checkUpdates">
           <div>检查更新</div>
           <div style="color: grey">v{{ version }}</div>
         </div>
@@ -137,6 +137,7 @@ import cookie from "@utils/store/cookie";
 import store from "@/store";
 import NavBar from "@components/NavBar";
 import axios from "axios";
+import {checkUpdate} from "@libs/update";
 
 export default {
   name: "PersonalData",
@@ -185,45 +186,8 @@ export default {
         that.version = version;
       });
     },
-    checkUpdate: function() {
-      const that = this;
-      if (typeof cordova == "undefined") {
-        console.log("current platform is not mobile.");
-        return;
-      }
-
-      axios.get("https://qndownload.shotshock.shop/version?ts=" +
-          Date.parse(new Date())).then(res => {
-        let ver = res.data.version;
-        let url = res.data.download;
-        let iosStore = res.data.iosStore;
-        console.log(JSON.stringify(res.data));
-        console.log(navigator.platform);
-
-        console.log("current version: " + that.version);
-        console.log("remote  version: " + ver);
-        if (ver > that.version) {
-          console.log("current need update !");
-          that.$dialog.confirm({
-            mes: "检查到有新版本,点击确定去下载!",
-            title: "更新提示",
-            opts: () => {
-              if (navigator.platform === "iPhone") {
-                cordova.InAppBrowser.open(iosStore, "_system");
-              } else {
-                cordova.InAppBrowser.open(url, "_system");
-              }
-            }
-          });
-        } else {
-          that.$dialog.toast({mes: "已经是最新版本了!"});
-          console.log("current alreay is latest !");
-        }
-      })
-          .catch(err => {
-            console.log(err);
-            // that.$dialog.error("检查更新失败!")
-          });
+    checkUpdates: function() {
+      checkUpdate(true);
     },
     switchAccounts: function(index) {
       let that = this;

+ 5 - 1
src/views/user/Recharge.vue

@@ -78,7 +78,7 @@
       v-model="pay"
       :types="payType"
       @checked="toPay"
-      :balance="userInfo.now_money"
+      :balance="now_money"
     ></Payment>
   </div>
 </template>
@@ -129,6 +129,7 @@ export default {
      */
     getRecharge() {
       getRechargeApi().then(res => {
+        this.now_money = res.data.balance;
         this.picList = res.data.recharge_quota;
         if (this.picList[0]) {
           this.rechar_id = this.picList[0].id;
@@ -180,6 +181,7 @@ export default {
                 rechargeWechat({ price: price, from: "app", payType: "yongjin" })
                   .then(res => {
                     that.now_money = add(price, parseFloat(that.now_money));
+                    that.now_money = parseFloat(that.now_money).toFixed(2);
                     that.userInfo.commissionCount = sub(
                       that.userInfo.commissionCount,
                       price
@@ -228,6 +230,7 @@ export default {
               if (success) {
                 console.log(ret);
                 that.now_money = add(price, parseInt(that.userInfo.now_money));
+                that.now_money = parseFloat(that.now_money).toFixed(2);
                 that.$dialog.toast({mes: "支付成功"});
               } else {
                 console.log("pay failed !", ret);
@@ -239,6 +242,7 @@ export default {
               if (success) {
                 console.log(ret);
                 that.now_money = add(price, parseInt(that.userInfo.now_money));
+                that.now_money = parseFloat(that.now_money).toFixed(2);
                 that.$dialog.toast({mes: "支付成功"});
               } else {
                 console.log("pay failed !", ret);

+ 5 - 1
src/views/user/User.vue

@@ -1,5 +1,5 @@
 <template>
-  <div class="user">
+  <div class="user" :style="getFooter()">
     <div class="header">
       <div class="figure">
         <div class="top acea-row row-between-wrapper">
@@ -260,6 +260,7 @@ export default {
       getUser().then(res => {
         that.userInfo = res.data;
         that.orderStatusNum = res.data.orderStatusNum;
+        that.$store.dispatch("USERINFO", true);
         // this.generalContent = {
         //   promoterNum: `您在商城累计消费金额仅差 <span style="color: #ff3366;">${res
         //     .data.promoter_price || 0}元</span>即可开通推广权限`,
@@ -301,6 +302,9 @@ export default {
     },
     closeGeneralWindow(msg) {
       this.generalActive = msg;
+    },
+    getFooter: function() {
+      return { "height": window.screen.availHeight.toString() + "px" };
     }
   }
 };

+ 10 - 1
src/views/user/UserAccount.vue

@@ -1,5 +1,6 @@
 <template>
   <div class="my-account">
+    <div style="height:0; height: constant(safe-area-inset-top); height: env(safe-area-inset-top);"></div>
     <div class="wrapper">
       <div class="header">
         <div class="headerCon">
@@ -116,6 +117,7 @@
       </div> -->
     </div>
     <Recommend></Recommend>
+    <div class="footer_spacer"></div>
   </div>
 </template>
 <script>
@@ -141,7 +143,7 @@ export default {
   },
   mounted: function() {
     this.getIndex();
-    this.getActivity();
+    // this.getActivity();
   },
   watch: {
     $route(n) {
@@ -178,3 +180,10 @@ export default {
   }
 };
 </script>
+<style scoped>
+.footer_spacer {
+  height: 1rem;
+  height: calc(constant(safe-area-inset-bottom) + 1rem);
+  height: calc(env(safe-area-inset-bottom) + 1rem);
+}
+</style>

+ 1 - 1
src/views/user/UserVip.vue

@@ -68,7 +68,7 @@
             </div>
           </div>
         </div>
-        <div class="item">
+        <div class="item" v-if="userInfo.vip_level < 7">
           <div class="top acea-row row-between-wrapper">
             <div class="name">{{ colorNames[userInfo.vip_level] }}可领取</div>
             <!-- <div>升级后即可领取</div> -->

+ 3 - 1
src/views/user/promotion/CashAudit.vue

@@ -1,5 +1,6 @@
 <template>
   <div class="cash-audit">
+    <NavBar></NavBar>
     <div class="pictrue"><img src="@assets/images/examine.png" /></div>
     <div class="tip">提现申请已提交,等待人工审核</div>
     <div class="time">{{ time }}</div>
@@ -12,9 +13,10 @@
   </div>
 </template>
 <script>
+import NavBar from "@components/NavBar";
 export default {
   name: "CashAudit",
-  components: {},
+  components: {NavBar},
   props: {},
   data: function() {
     return {

+ 1 - 1
src/views/user/promotion/CommissionDetails.vue

@@ -4,7 +4,7 @@
     <div class="promoterHeader bg-color-red">
       <div class="headerCon acea-row row-between-wrapper">
         <div>
-          <div class="name">佣金记录</div>
+          <div class="name">佣金汇总</div>
           <div class="money">
             ¥<span class="num">{{ commission }}</span>
           </div>

+ 1 - 1
src/views/user/promotion/PromoterOrder.vue

@@ -40,7 +40,7 @@
               </div>
             </div>
             <div class="bottom">
-              <div><span class="name">订单号:</span>{{ val.order_id }}</div>
+<!--              <div><span class="name">订单号:</span>{{ val.order_id }}</div>-->
               <div v-if="val.type === 'pay_money'">
                 <span class="name">下单时间:</span>{{ val.time }}
               </div>

+ 1 - 1
src/views/user/promotion/UserCash.vue

@@ -129,7 +129,7 @@ export default {
         { name: "支付宝", type: "alipay", icon: "icon-icon34" }
       ],
       post: {
-        extract_type: "bank",
+        extract_type: "weixin",
         alipay_code: "",
         money: "",
         name: "",

+ 3 - 17
src/views/user/promotion/UserPromotion.vue

@@ -1,6 +1,6 @@
 <template>
   <div class="my-promotion">
-    <NavBar title="推广中心"></NavBar>
+    <NavBar title="推广中心" path="/user"></NavBar>
     <div class="header">
       <div class="name acea-row row-center-wrapper">
         <div>当前佣金</div>
@@ -87,33 +87,19 @@
 <script>
 import { getUser } from "../../../api/user";
 import NavBar from "@components/NavBar";
+import { mapGetters } from "vuex";
 
 export default {
   name: "UserPromotion",
   components: {
     NavBar
   },
-  props: {},
+  computed: mapGetters(["userInfo"]),
   data: function() {
     return {
-      userInfo: {}
     };
   },
-  mounted: function() {
-    this.getInfo();
-  },
   methods: {
-    getInfo: function() {
-      let that = this;
-      getUser().then(
-        res => {
-          that.userInfo = res.data;
-        },
-        function(err) {
-          that.$dialog.message(err.msg);
-        }
-      );
-    },
     toCash: function() {
       this.$router.push({ path: "/user/user_cash" });
     }