精华内容
下载资源
问答
  • 小程序商品发布页面:功能有多图片上传 遇到的问题记录一下: 1.uploadFile成功之后返回的参数是json字符串,一定要用JSON.parse转换为object格式 2.因为商品发布和编辑都是同一个页面,因为异步的问题,...

    小程序的商品发布页面:功能有多图片上传

    遇到的问题记录一下:

    1.uploadFile成功之后返回的参数是json字符串,一定要用JSON.parse转换为object格式

    2.因为商品发布和编辑都是在同一个页面,因为异步的问题,在编辑页获取商品类别经常失败,所以这里在获取类别成功之后再获取商品详情

    3.判断两位小数正则:/^\d+(\.\d{1,2})?$/

    4.使用picker一些注意的地方:

     <picker name="category" mode="selector" range="{{category}}" range-key="title" value="{{categoryInd}}" bindchange="category">
            <input data-id='{{category[categoryInd].categoryID}}' name="category" type='text' value='{{category[categoryInd].title}}' disabled='true'></input>
          </picker>

    range: 指定数组

    range-key:显示指定数组中的某个key

    value: 下标

    5.这里重点说一下编辑页面下图片的添加和删除问题

    有以下几种情况存在

    点击添加和删除的时候都会调用后台接口来返回当前图片的文件夹路径用来存入新的图片 

    1. 只是纯删除图片,可以直接调后台将图片从服务器中删除并返回
    2. 详情图片没动只改变了轮播的情况下
    3. 轮播没变详情改变了
    4. 两个都改变了

    做添加的时候考虑到的问题,将添加的放到一个新数组中,上传时也用新数组上传,推翻了以前的添加时把原有图片全部删除重新上传(不能添加一张图片以前的还没了吧)

    做删除的时候考虑到的问题,没有办法判断删除的时候是删的原来的还是新加的,这就有了以下的两个数组比对,相同的放到第三个数组中并上传,

    添加时分别放到两个数组A,B中,A中包含有以前的图片和新加的,B中只有新加的图片,删除只删除A中

    最后上传时,将A,B比对,相同的放到C中,将C上传(这样上传的就只有新添加的图片了,如果只有页面只有单张图片做编辑的话,就不用这么麻烦,添加的时候直接放到新数组中,删除也是新数组,最后上传依旧用新数组就行了。)

    <!--pages/productReleased/productReleased.wxml-->
    <!--商品发布-->
    <form bindsubmit="formSubmit">
      <!--商品名称-->
      <view class='title'>
        <view class='title_text'>
          <text>商品名称:</text>
          <input name="title" type='text' value='{{title}}' bindblur='titleBlur'></input>
        </view>
      </view>
      <!--商品价格-->
      <view class='title'>
        <view class='title_text'>
          <text>商品价格:</text>
          <input name="price" type='number' value='{{price}}' bindblur='priceBlur'></input>
        </view>
      </view>
      <!--商品信息-->
      <view class='info-point'>
        <view class='title_text'>
          <text>商品信息:</text>
          <textarea name="info" class='textarea' value='{{info}}' bindblur='infoBlur'></textarea>
        </view>
      </view>
      <!--商品卖点-->
      <view class='info-point'>
        <view class='title_text'>
          <text>商品卖点:</text>
          <textarea name="point" class='textarea' value='{{point}}' bindblur='pointBlur'></textarea>
        </view>
      </view>
    
      <!--商品类别-->
      <view class='title'>
        <view class='title_text'>
          <text>商品类别:</text>
          <picker name="category" mode="selector" range="{{category}}" range-key="title" value="{{categoryInd}}" bindchange="category">
            <input data-id='{{category[categoryInd].categoryID}}' name="category" type='text' value='{{category[categoryInd].title}}' disabled='true'></input>
          </picker>
           <span class='icon iconfont icon-weibiaoti34'></span>
        </view>
      </view>
    
      <!--商品类型-->
      <view class='title'>
        <view class='title_text'>
          <text>商品类型:</text>
          <picker name="type" mode="selector" range="{{type}}" range-key="name" value="{{typeInd}}" bindchange="type">
            <input id='{{type[typeInd].id}}' name="type" type='text' value='{{type[typeInd].name}}'disabled='true'></input>
          </picker>
          <span class='icon iconfont icon-weibiaoti34'></span>
        </view>
      </view>
    
      <!--商品状态-->
      <view class='title'>
        <view class='title_text'>
          <text>商品状态:</text>
          <picker name="state" mode="selector" range="{{state}}" range-key="name" value="{{stateInd}}" bindchange="state">
            <input id='{{state[stateInd].id}}' name="state" type='text' value='{{state[stateInd].name}}'disabled='true'></input>
          </picker>
          <span class='icon iconfont icon-weibiaoti34'></span>
        </view>
      </view>
    
      <!--上传图片-->
      <view class='upImv'>
    
        <view class='upImv_text'>轮播图片上传</view>
        <view class="addImv">
          <!--这个是已经选好的图片-->
          <view wx:for="{{banner}}" wx:key="key" class="upFile" bindtap="showImageBanner" style="border-radius: 5px" data-id="{{index}}">
            <image class="itemImv" src="{{item}}"></image>
            <image class="closeImv" src="../../resources/images/delect.png" mode="scaleToFill" catchtap="deleteImvBanner" data-id="{{index}}"></image>
          </view>
    
          <!--这个是选择图片-->
          <view class="chooseView" bindtap="chooseBanner" style="border-radius: 5px" wx:if="{{chooseViewShowBanner}}">
            <image class="chooseImv" src="../../resources/images/add.png"></image>
          </view>
        </view>
    
        <view class='upImv_text'>详情图片上传</view>
        <view class="addImv">
          <!--这个是已经选好的图片-->
          <view wx:for="{{detail}}" wx:key="key" class="upFile" bindtap="showImageDetail" style="border-radius: 5px" data-id="{{index}}">
            <image class="itemImv" src="{{item}}"></image>
            <image class="closeImv" src="../../resources/images/delect.png" mode="scaleToFill" catchtap="deleteImvDetail" data-id="{{index}}"></image>
          </view>
    
          <!--这个是选择图片-->
          <view class="chooseView" bindtap="chooseDetail" wx:if="{{chooseViewShowDetail}}">
            <image class="chooseImv" src="../../resources/images/add.png"></image>
          </view>
        </view>
    
      </view>
      <button form-type='submit' class='sureRelease'>确认发布</button>
    </form>
    // pages/productReleased/productReleased.js
    var app = getApp();
    Page({
    
      /**
       * 页面的初始数据
       */
      data: {
        title: "",
        info: "",
        point: "",
        price: "",
        type: [{
          name: "实物",
          id: 0
        }, {
          name: "虚拟",
          id: 1
        }],
        state: [{
          name: "下架",
          id: 0
        }, {
          name: "上架",
          id: 1
        }],
        productID: 0,
        category: [],
        categoryInd: -1, //类别
        typeInd: 0, //类型
        stateInd: 1, //状态
        banner: [], //轮播图片
        bannerNew: [],
        bannerAll: [],
        detail: [], //详情图片
        detailNew: [],
        detailAll: [],
        checkUp: true, //判断从编辑页面进来是否需要上传图片
        chooseViewShowDetail: true,
        chooseViewShowBanner: true,
        params: {
          productID: 0,
          contentFile: "",
          bannerFile: "",
          check: false,
        },
        dis: false,
      },
      /**
       * 生命周期函数--监听页面加载
       */
      onLoad: function(options) {
        this.setData({
          productID: options.productID
        })
        this.getCategory();
      },
      /**
       * 获取标题
       */
      titleBlur(e) {
        this.setData({
          title: e.detail.value
        })
      },
      /**
       * 获取商品价格
       */
      priceBlur(e) {
        this.setData({
          price: e.detail.value
        })
      },
      /**
       * 获取商品信息
       */
      infoBlur(e) {
        this.setData({
          info: e.detail.value
        })
      },
      /**
       * 获取商品卖点
       */
      pointBlur(e) {
        this.setData({
          point: e.detail.value
        })
      },
      /** 
       * 商品价格
       */
      price(e) {
        this.setData({
          price: e.detail.value
        })
      },
      /**
       * 商品类型
       */
      type(e) {
        this.setData({
          typeInd: e.detail.value
        })
      },
      /**
       * 商品状态
       */
      state(e) {
        this.setData({
          stateInd: e.detail.value
        })
      },
      /**
       * 商品类别
       */
      category(e) {
        this.setData({
          categoryInd: e.detail.value
        })
      },
      /**
       * 获取商品类别
       */
      getCategory() {
        let params = {}
        app.getCategoryList(params).then(res => {
          var good = []
          var g_type = res.data.categories[0].children //从接口中获取商品类别
          for (var i = 1; i < g_type.length; i++) { //从下标为1开始循环,不显示全部
            good[i - 1] = g_type[i] //将循环出来的数组,循环放入good中
          }
          this.setData({
            category: good
          })
          if (this.data.productID != 0) { //防止先调用详情方法而不显示类别
            if (res.state === 1) {
              this.getProductDetail();
            }
          }
        })
      },
    
      /**获取商品详情 */
      getProductDetail() {
        let params = {
          userID: app.globalData.userID,
          productID: this.data.productID
        }
        app.getReleaseProductDetail(params).then(res => {
          let product = res.data.productDetail[0]
          if (product.state) {
            this.setData({
              stateInd: 1
            })
          } else {
            this.setData({
              stateInd: 0
            })
          }
    
          let categoryInd = -1;
          for (var i = 0; i < this.data.category.length; i++) {
            if (this.data.category[i].categoryID === product.categoryID) {
              categoryInd = i
              break;
            } else {
              categoryInd: -1;
            }
          }
    
          if (product.bannerImages.length >= 2) {
            this.setData({
              chooseViewShowBanner: false
            })
          } else {
            this.setData({
              chooseViewShowBanner: true
            })
          }
    
          if (product.detailImages.length >= 3) {
            this.setData({
              chooseViewShowDetail: false
            })
          } else {
            this.setData({
              chooseViewShowDetail: true
            })
          }
          this.setData({
            title: product.title,
            info: product.info,
            point: product.point,
            typeInd: product.productType,
            price: product.currentPrice,
            banner: product.bannerImages,
            detail: product.detailImages,
            categoryInd: categoryInd
          })
        })
      },
    
      /**发布提交 */
      formSubmit(e) {
        let that = this
        var priceTF = /^\d+(\.\d{1,2})?$/
        if (e.detail.value.title === "") {
          wx.showToast({
            title: '请输入商品名称',
            icon: "none",
            duration: 1000,
            mask: true,
          })
        } else if (e.detail.value.title.length > 60) {
          wx.showToast({
            title: '商品名称不得大于60字',
            icon: "none",
            duration: 1000,
            mask: true,
          })
        } else if (e.detail.value.title.length === "") {
          wx.showToast({
            title: '请输入商品价格',
            icon: "none",
            duration: 1000,
            mask: true,
          })
        } else if (!priceTF.test(e.detail.value.price)) {
          wx.showToast({
            title: '商品价格精确到两位',
            icon: "none",
            duration: 1000,
            mask: true,
          })
        } else if (e.detail.value.info === "") {
          wx.showToast({
            title: '请输入商品信息',
            icon: "none",
            duration: 1000,
            mask: true,
          })
        } else if (e.detail.value.point === "") {
          wx.showToast({
            title: '请输入商品卖点',
            icon: "none",
            duration: 1000,
            mask: true,
          })
        } else if (that.data.categoryInd === -1) {
          wx.showToast({
            title: '请选择商品类别',
            icon: "none",
            duration: 1000,
            mask: true,
          })
        } else if (that.data.typeInd === -1) {
          wx.showToast({
            title: '请选择商品类型',
            icon: "none",
            duration: 1000,
            mask: true,
          })
        } else if (that.data.stateInd === -1) {
          wx.showToast({
            title: '请选择商品状态',
            icon: "none",
            duration: 1000,
            mask: true,
          })
        } else if (that.data.banner.length === 0) {
          wx.showToast({
            title: '请选择轮播图片',
            icon: "none",
            duration: 1000,
            mask: true,
          })
        } else if (that.data.detail.length === 0) {
          wx.showToast({
            title: '请选择详情图片',
            icon: "none",
            duration: 1000,
            mask: true,
          })
        } else {
          let params = {
            userID: app.globalData.userID,
            productID: that.data.productID,
            title: e.detail.value.title,
            price: e.detail.value.price,
            info: e.detail.value.info,
            point: e.detail.value.point,
            categoryID: that.data.category[that.data.categoryInd].categoryID,
            productType: that.data.type[that.data.typeInd].id,
            state: that.data.state[that.data.stateInd].id
          }
          wx.showModal({
            title: '提示',
            content: '确定发布商品',
            success(res) {
              if (res.confirm) {
                if (that.data.productID != 0) {
                  that.sureEdit(params); //编辑
                } else {
                  that.sureRelease(params); //发布
                }
                that.setData({
                  dis: true,
                })
              }
            }
          })
        }
      },
    
      /**确认发布 */
      sureRelease(params) {
        let that = this
        app.addProduct(params).then(res => {
          that.data.params.productID = res.data.productID;
          that.data.params.bannerFile = res.data.bannerFile;
          that.data.params.contentFile = res.data.contentFile;
          for (var i = 0; i < that.data.banner.length; i++) {
            wx.uploadFile({
              url: app.globalData.baseUrl + '/wechat/release/addProductPhoto',
              filePath: that.data.banner[i],
              name: 'banner',
              formData: {
                'parameters': JSON.stringify(that.data.params)
              },
            })
            if (that.data.banner.length === i + 1) {
              for (var j = 0; j < that.data.detail.length; j++) {
                if (that.data.detail.length === j + 1) {
                  that.data.params.check = true
                }
                wx.uploadFile({
                  url: app.globalData.baseUrl + '/wechat/release/addProductPhoto',
                  filePath: that.data.detail[j],
                  name: 'detail',
                  formData: {
                    'parameters': JSON.stringify(that.data.params)
                  },
                  success: function(res) {
                    if (JSON.parse(res.data).state === 1) {
                      wx.showToast({
                        title: '商品发布成功',
                        icon: "none",
                        duration: 2000,
                        mask: true,
                        success() {
                          setTimeout(function() {
                            wx.navigateBack({
                              delta: 0,
                            })
                          }, 1000);
                        }
                      })
                    } else {
                      wx.showToast({
                        title: '商品发布失败,请稍后再试',
                        icon: "none",
                        duration: 2000,
                        mask: true,
                        success() {
                          setTimeout(function() {
                            wx.navigateBack({
                              delta: 0,
                            })
                          }, 1000);
                        }
                      })
                    }
                  },
                  fail: function(res) {
                    if (JSON.parse(res.errMsg) === "request:fail socket time out timeout:6000") {
                      wx.showToast({
                        title: '请求超时,请稍后再试!',
                        icon: "none",
                        duration: 2000,
                        mask: true,
                        success() {
                          setTimeout(function() {
                            wx.navigateBack({
                              delta: 0,
                            })
                          }, 1000);
                        }
                      })
                    }
                  }
                })
              }
            }
          }
        })
      },
    
      /**确认编辑 */
      sureEdit(params) {
        let that = this
        app.addProduct(params).then(res => {
          that.data.params.productID = res.data.productID;
          //判断编辑页面下是否只改变了文字数据,选择图片后checkUp为false
          if (that.data.checkUp && res.state === 1) {
            wx.showToast({
              title: '商品修改成功',
              icon: "none",
              duration: 2000,
              mask: true,
              success() {
                setTimeout(function() {
                  wx.navigateBack({
                    delta: 0,
                  })
                }, 1000);
              }
            })
          }
          //判断编辑页面下是否改变了图片 改变了则uploadFile
          else {
            that.checkBanner();
            that.checkDetail();
            //如果没有添加直接删除图片的话
            if (that.data.bannerAll.length === 0 && that.data.detailAll.length === 0) {
              wx.showToast({
                title: '商品修改成功',
                icon: "none",
                duration: 2000,
                mask: true,
                success() {
                  setTimeout(function() {
                    wx.navigateBack({
                      delta: 0,
                    })
                  }, 1000);
                }
              })
            }
            //只改变bannerAll情况下,detailAll为空直接将bannerAll往数据库写入
            else if (that.data.detailAll.length === 0) {
              for (var i = 0; i < that.data.bannerAll.length; i++) {
                if (that.data.bannerAll.length === i + 1) {
                  that.data.params.check = true
                }
                wx.uploadFile({
                  url: app.globalData.baseUrl + '/wechat/release/addProductPhoto',
                  filePath: that.data.bannerAll[i],
                  name: 'banner',
                  formData: {
                    'parameters': JSON.stringify(that.data.params)
                  },
                  success: function(res) {
                    if (JSON.parse(res.data).state === 1) {
                      wx.showToast({
                        title: '商品修改成功',
                        icon: "none",
                        duration: 2000,
                        mask: true,
                        success() {
                          setTimeout(function() {
                            wx.navigateBack({
                              delta: 0,
                            })
                          }, 1000);
                        }
                      })
                    } else {
                      wx.showToast({
                        title: '商品修改失败',
                        icon: "none",
                        duration: 2000,
                        mask: true,
                        success() {
                          setTimeout(function() {
                            wx.navigateBack({
                              delta: 0,
                            })
                          }, 1000);
                        }
                      })
                    }
                  },
                  fail(res) {
                    if (JSON.parse(res.errMsg) === "request:fail socket time out timeout:6000") {
                      wx.showToast({
                        title: '请求超时,请稍后再试!',
                        icon: "none",
                        duration: 2000,
                        mask: true,
                        success() {
                          setTimeout(function() {
                            wx.navigateBack({
                              delta: 0,
                            })
                          }, 1000);
                        }
                      })
                    }
                  }
                })
              }
            }
            //只改变detailAll,不改变bannerAll的情况下,直接将detailAll写入数据库
            else if (that.data.bannerAll.length === 0) {
              for (var j = 0; j < that.data.detailAll.length; j++) {
                if (that.data.detailAll.length === j + 1) {
                  that.data.params.check = true
                }
                wx.uploadFile({
                  url: app.globalData.baseUrl + '/wechat/release/addProductPhoto',
                  filePath: that.data.detailAll[j],
                  name: 'detail',
                  formData: {
                    'parameters': JSON.stringify(that.data.params)
                  },
                  success: function(res) {
                    if (JSON.parse(res.data).state === 1) {
                      wx.showToast({
                        title: '商品修改成功',
                        icon: "none",
                        duration: 2000,
                        mask: true,
                        success() {
                          setTimeout(function() {
                            wx.navigateBack({
                              delta: 0,
                            })
                          }, 1000);
                        }
                      })
                    } else {
                      wx.showToast({
                        title: '商品修改失败',
                        icon: "none",
                        duration: 2000,
                        mask: true,
                        success() {
                          setTimeout(function() {
                            wx.navigateBack({
                              delta: 0,
                            })
                          }, 1000);
                        }
                      })
                    }
                  },
                  fail: function(res) {
                    if (JSON.parse(res.errMsg) === "request:fail socket time out timeout:6000") {
                      wx.showToast({
                        title: '请求超时,请稍后再试!',
                        icon: "none",
                        duration: 2000,
                        mask: true,
                        success() {
                          setTimeout(function() {
                            wx.navigateBack({
                              delta: 0,
                            })
                          }, 1000);
                        }
                      })
                    }
                  }
                })
              }
            }
            //如果detailAll和bannerAll都改变的情况下
            else {
              for (var i = 0; i < that.data.bannerAll.length; i++) {
                wx.uploadFile({
                  url: app.globalData.baseUrl + '/wechat/release/addProductPhoto',
                  filePath: that.data.bannerAll[i],
                  name: 'banner',
                  formData: {
                    'parameters': JSON.stringify(that.data.params)
                  },
                })
                if (that.data.bannerAll.length === i + 1) {
                  for (var j = 0; j < that.data.detailAll.length; j++) {
                    if (that.data.detailAll.length === j + 1) {
                      that.data.params.check = true
                    }
                    wx.uploadFile({
                      url: app.globalData.baseUrl + '/wechat/release/addProductPhoto',
                      filePath: that.data.detailAll[j],
                      name: 'detail',
                      formData: {
                        'parameters': JSON.stringify(that.data.params)
                      },
                      success: function(res) {
                        if (JSON.parse(res.data).state === 1) {
                          wx.showToast({
                            title: '商品修改成功',
                            icon: "none",
                            duration: 2000,
                            mask: true,
                            success() {
                              setTimeout(function() {
                                wx.navigateBack({
                                  delta: 0,
                                })
                              }, 1000);
                            }
                          })
                        } else {
                          wx.showToast({
                            title: '商品修改失败',
                            icon: "none",
                            duration: 2000,
                            mask: true,
                            success() {
                              setTimeout(function() {
                                wx.navigateBack({
                                  delta: 0,
                                })
                              }, 1000);
                            }
                          })
                        }
                      },
                      fail: function(res) {
                        if (JSON.parse(res.errMsg) === "request:fail socket time out timeout:6000") {
                          wx.showToast({
                            title: '请求超时,请稍后再试!',
                            icon: "none",
                            duration: 2000,
                            mask: true,
                            success() {
                              setTimeout(function() {
                                wx.navigateBack({
                                  delta: 0,
                                })
                              }, 1000);
                            }
                          })
                        }
                      }
                    })
                  }
                }
              }
            }
          }
        })
      },
    
      /**判断轮播新旧数组是否有相同值 */
      checkBanner() {
        let banner = this.data.banner
        let bannerNew = this.data.bannerNew
        let bannerAll = this.data.bannerAll
        for (var i = 0; i < banner.length; i++) {
          for (var j = 0; j < bannerNew.length; j++) {
            if (banner[i] === bannerNew[j]) {
              bannerAll = bannerAll.concat(bannerNew[j])
              this.setData({
                bannerAll: bannerAll
              })
            } else {
              console.log("banner无相同")
            }
          }
        }
      },
    
      /**判断详情新旧数组是否有相同值 */
      checkDetail() {
        let detail = this.data.detail
        let detailNew = this.data.detailNew
        let detailAll = this.data.detailAll
        for (var i = 0; i < detail.length; i++) {
          for (var j = 0; j < detailNew.length; j++) {
            if (detail[i] === detailNew[j]) {
              detailAll = detailAll.concat(detail[i])
              this.setData({
                detailAll: detailAll
              })
            } else {
              console.log("detail无相同")
            }
          }
        }
      },
      /** 选择图片detail */
      chooseDetail: function() {
        var that = this;
        if (that.data.detail.length < 3) {
          wx.chooseImage({
            count: 3,
            sizeType: [ 'compressed'],
            sourceType: ['album', 'camera'],
            success: function(photo) {
              //detail中包含的可能还有编辑页面下回显的图片,detailNew中包含的只有所选择的图片
              let detail = that.data.detail;
              detail = detail.concat(photo.tempFilePaths);
              let detailNew = that.data.detailNew
              detailNew = detailNew.concat(photo.tempFilePaths)
              that.setData({
                detail: detail,
                detailNew: detailNew,
                checkUp: false
              })
              that.chooseViewShowDetail();
    
              if (that.data.productID != 0) {
                let params = {
                  productID: that.data.productID,
                  isBanner: false,
                  index: -1,
                }
                app.deleteProductImage(params).then(res => {
                  //判断不为空防止将原有图片全删除后文件夹名返回空
                  if (res.data.fileContent !== "" && res.data.fileBanner !== "") {
                    that.data.params.contentFile = res.data.fileContent
                    that.data.params.bannerFile = res.data.fileBanner
                  }
                })
              }
            }
          })
        } else {
          wx.showToast({
            title: '限制选择3个文件',
            icon: 'none',
            duration: 1000
          })
        }
      },
    
      /** 删除图片detail */
      deleteImvDetail: function(e) {
        var that = this;
        var detail = that.data.detail;
        var itemIndex = e.currentTarget.dataset.id;
        if (that.data.productID != 0) {
          wx.showModal({
            title: '提示',
            content: '删除不可恢复,请谨慎操作',
            success(res) {
              if (res.confirm) {
                detail.splice(itemIndex, 1);
                that.setData({
                  detail: detail,
                  checkUp: false
                })
                that.chooseViewShowDetail();
                let params = {
                  productID: that.data.productID,
                  isBanner: false,
                  index: itemIndex,
                }
                app.deleteProductImage(params).then(res => {
                  if (res.data.fileContent !== "" && res.data.fileBanner !== "") {
                    that.data.params.contentFile = res.data.fileContent
                    that.data.params.bannerFile = res.data.fileBanner
                  }
                })
              }
            }
          })
        } else {
          detail.splice(itemIndex, 1);
          that.setData({
            detail: detail,
            checkUp: false
          })
          that.chooseViewShowDetail();
        }
      },
    
    
      /** 是否隐藏图片选择detail */
      chooseViewShowDetail: function() {
        if (this.data.detail.length >= 3) {
          this.setData({
            chooseViewShowDetail: false
          })
        } else {
          this.setData({
            chooseViewShowDetail: true
          })
        }
      },
    
      /** 查看大图Detail */
      showImageDetail: function(e) {
        var detail = this.data.detail;
        var itemIndex = e.currentTarget.dataset.id;
        wx.previewImage({
          current: detail[itemIndex], // 当前显示图片的http链接
          urls: detail // 需要预览的图片http链接列表
        })
      },
    
    
      /** 选择图片Banner */
      chooseBanner: function() {
        var that = this;
        if (that.data.banner.length < 2) {
          wx.chooseImage({
            count: 2, //最多选择4张图片- that.data.imgArr.length,
            sizeType: ['compressed'], // 可以指定是原图还是压缩图,默认二者都有
            sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有
            success: function(photo) {
              var banner = that.data.banner;
              banner = banner.concat(photo.tempFilePaths);
              var bannerNew = that.data.bannerNew;
              bannerNew = bannerNew.concat(photo.tempFilePaths);
              that.setData({
                banner: banner,
                bannerNew: bannerNew,
                checkUp: false
              })
              that.chooseViewShowBanner();
              if (that.data.productID != 0) {
                let params = {
                  productID: that.data.productID,
                  isBanner: false,
                  index: -1,
                }
                app.deleteProductImage(params).then(res => {
                  if (res.data.fileContent !== "" && res.data.fileBanner !== "") {
                    that.data.params.contentFile = res.data.fileContent
                    that.data.params.bannerFile = res.data.fileBanner
                  }
                })
              }
            }
          })
    
        } else {
          wx.showToast({
            title: '限制选择2个文件',
            icon: 'none',
            duration: 1000
          })
        }
      },
    
      /** 删除图片Banner */
      deleteImvBanner: function(e) {
        var that = this
        var banner = that.data.banner;
        var itemIndex = e.currentTarget.dataset.id;
        if (that.data.productID != 0) {
          wx.showModal({
            title: '提示',
            content: '删除不可恢复,请谨慎操作',
            success(res) {
              if (res.confirm) {
                banner.splice(itemIndex, 1);
                that.setData({
                  banner: banner,
                  checkUp: false
                })
                that.chooseViewShowBanner();
                let params = {
                  productID: that.data.productID,
                  isBanner: true,
                  index: itemIndex,
                }
                app.deleteProductImage(params).then(res => {
                  if (res.data.fileContent !== "" && res.data.fileBanner !== "") {
                    that.data.params.contentFile = res.data.fileContent
                    that.data.params.bannerFile = res.data.fileBanner
                  }
                })
              }
            }
          })
        } else {
          banner.splice(itemIndex, 1);
          that.setData({
            banner: banner,
            checkUp: false
          })
          that.chooseViewShowBanner();
        }
      },
    
    
      /** 是否隐藏图片选择Banner*/
      chooseViewShowBanner() {
        if (this.data.banner.length >= 2) {
          this.setData({
            chooseViewShowBanner: false
          })
        } else {
          this.setData({
            chooseViewShowBanner: true
          })
        }
      },
    
      /** 查看大图Banner */
      showImageBanner: function(e) {
        var banner = this.data.banner;
        var itemIndex = e.currentTarget.dataset.id;
        wx.previewImage({
          current: banner[itemIndex], // 当前显示图片的http链接
          urls: banner // 需要预览的图片http链接列表
        })
      },
    })

     

    /* pages/productReleased/productReleased.wxss */
    
    page {
      background-color: #f1f1f1;
    }
    
    .title {
      margin-top: 5rpx;
      background-color: white;
      width: 100%;
      height: 80rpx;
    }
    
    .title_text {
      margin-left: 20rpx;
      width: 100%;
      height: 50rpx;
      padding-top: 10rpx;
      display: flex;
    }
    
    .title_text text {
      font-size: 30rpx;
    }
    
    .title_text input {
      font-size: 30rpx;
      width: 60vw;
      margin-left: 20rpx;
    }
    
    .textarea {
      height: 100rpx;
      font-size: 30rpx;
      margin-left: 40rpx;
      width: 500rpx;
    }
    
    .info-point {
      background-color: white;
      width: 100%;
      height: 100rpx;
      margin-top: 5rpx;
    }
    
    /*选择图片View*/
    
    .addImv {
      background-color: white;
      /* border: 1px dashed gray; */
      display: flex;
      flex-wrap: wrap;
      align-items: center;
      margin-top: 5rpx;
    }
    
    .upImv {
      background-color: white;
      width: 100%;
      margin-top: 5rpx;
    }
    
    .upImv_text {
      font-size: 30rpx;
      margin-left: 20rpx;
      padding-top: 20rpx;
    }
    
    /*添加图片*/
    
    .addImv .chooseView {
      width: 180rpx;
      height: 180rpx;
      margin: 20rpx 20rpx;
      background-color: #f2f6f9;
      border: 1px dashed lightgray;
      text-align: center;
      line-height: 180rpx;
      /* padding: 0rpx 7rpx; */
      border-radius: 5px;
      margin-left: 40rpx;
    }
    
    .addImv .chooseImv {
      width: 50rpx;
      height: 50rpx;
    }
    
    /*已选择的图片*/
    
    .addImv .upFile {
      width: 180rpx;
      height: 180rpx;
      position: relative;
      padding: 0rpx 7rpx;
      margin-left: 40rpx;
      border: 1px solid #c0ccda;
    }
    
    .addImv .upFile .itemImv {
      width: 180rpx;
      height: 180rpx;
      padding: 0rpx 7rpx;
    }
    
    .addImv .upFile .closeImv {
      position: absolute;
      right: 0rpx;
      top: 0rpx;
      width: 50rpx;
      height: 50rpx;
    }
    
    .sureRelease {
      background-color: #e44178;
      color: white;
      position: fixed;
      width: 100%;
      bottom: 0rpx;
    }
    
    .icon {
      margin-left: 80rpx;
    }
    

    展开全文
  • 微信小程序直播怎么上架商品

    千次阅读 2020-12-11 15:00:40
    现在很多的已经开通了微信小程序直播,但是开通直播功能后,也创立了自己的直播间,但是,很多的商家遇到了商品商家的问题,不知道微信小程序直播如何添加商品?我们知道商家开通直播间就是为了卖货的,商品货物如果...

      现在很多的已经开通了微信小程序直播,但是开通直播功能后,也创立了自己的直播间,但是,很多的商家遇到了商品商家的问题,不知道微信小程序直播如何添加商品?我们知道商家开通直播间就是为了卖货的,商品货物如果上架不了,这个直播间就是白开了。下面木鱼小铺小编就和大家分享一下微信小程序直播添加商的方法。希望可以帮助到大家。
      
      第一步:登录微信小程序管理后台


        首先,需要登录您的微信小程序管理后台,进入后台之后,点击“功能栏”-“直播”-“商品库”-添加商品。如图所示:


      第二步:添加商品
      商家点击“添加商品”按钮,然后进入添加商品页面,根据页面提示,填写相关信息。


      这里我们举例说明来,展示一下如何获取商品链接。
      

      登录小程序管理后台,依次点击商品-商品管理,选择您需要直播商品,在商品右侧有一个“查看商品路径”,将路径复制到商品链接就可以了。
      


      注:商品链接必须是您已上线的商品,而且符合小程序直播要求售卖商品,否则提交之后,商品审核不通过。
      
      所有信息设置完成之后,点击“保存并提审”按钮,审核通过之后,在已入库商品中显示该商品。
      


      如果审核不通过,查看不通过原因,需修改重新提交即可。
      


      每添加商品库的商品都需要提交给官方审核,审核时间1-7天。只要符合官方直播售卖商品很快就能通过,只有已入库的商品才能在直播间卖货。建议商家将直播间商品提前录入商品库。官方规定已入库商品最多2000件,每天限制提交500件。
      
      以上就是关于微信小程序直播如何上架商品的方法,不知道你是不是已经学会了呢?大家可以根据这个步骤来试试自己添加一下。

    展开全文
  • 微信小程序发布规则

    千次阅读 2020-04-10 17:52:22
    1.《微信小程序平台服务条款》...2.微信小程序平台运营规范 ...

    1.《微信小程序平台服务条款》https://developers.weixin.qq.com/miniprogram/product/reject.html#_3-1-%E5%B0%8F%E7%A8%8B%E5%BA%8F%E5%9F%BA%E6%9C%AC%E5%8A%9F%E8%83%BD%E5%AE%A1%E6%A0%B8%E8%A7%84%E8%8C%83

    2.微信小程序平台运营规范

    https://developers.weixin.qq.com/miniprogram/product/

    微信小程序平台常见拒绝情形

    ​除本微信小程序平台常见拒绝情形外,开发者还应遵守《微信小程序平台服务条款》及腾讯公布的相关规则、规范。

    1. 帐号基本信息

    1.1 小程序名称、简介、logo、服务范围、服务标签、帐号基本信息文字均不得:

    ​(1)侵犯他人权益(著作权、商标权、肖像权、名誉权等)。包括但不限于,使用或包含不属于该小程序主体的品牌或商标、标识等内容或与之相似的内容、信息、特殊角标。示例:检查名称、简介中是否含有该小程序不属于该帐号的权益。

    ​(2)含有商业化用语的、热门小程序名称、“国家级”、“最高级”等新广告法明令禁止或其他无关的词语。

    ​(3)含有政治、色情、敏感、暴力血腥、恐怖、其他国家法律法规禁止的词汇及违法内容。

    1.2 特别规则

    1.2.1 小程序名称、简介:

    ​(1)小程序的简介需明确介绍小程序的功能点,不能使用模糊的词义表达,比如:该小程序旨在提高用户的生活品味、该小程序旨在提高用户的购物体验。示例:能在简介中提炼该小程序的几个功能点。

    ​(2)名称、简介的信息表达的意思必须有关联,具有一致性,并应与实际提供的功能一致,不含有与功能无关的搜索热词。示例:简介中能找到小程序名称或者分拆出来的词汇。

    ​(3)小程序名称不能以电话、邮件、日历、小游戏等广义归纳类、斗地主、麻将等通用游戏名称类、或者其他普遍且不具有识别性词语来命名。示例:名称不是单词汇,必须是两个词以上的组合,当无法判断时,审核人员可主观判断。

    1.2.2 小程序头像logo:

    ​(1)小程序头像logo清晰度不够时,不予通过。示例:无法看清、分辨、识别图片中包含的各个元素,如:文字、物体、形状等。

    ​(2)小程序头像logo应与名称、简介保持一致。

    (3)小程序头像logo不得包含腾讯、微信等官方品牌标识。

    1.2.3 小程序的服务范围和服务标签:

    ​小程序所设置的服务标签,应与所选的服务范围保持一致。标签不能超出服务范围。示例:服务范围是家政,服务标签是美食。

    2. 服务类目审核

    ​服务类目是指开发者按照小程序所提供的服务类型和所涉及的服务内容,在平台提供的分类分级表格中选择对应的行业范围。

    2.1 小程序的类目要和自身所提供的服务一致。

    ​2.1.1 小程序服务类目所对应的页面中的核心内容必须与该类目一致。

    ​2.1.2 必须保证用户在该页面能使用该服务类目,不得隐藏,不得进行多次跳转。

    2.1.3 你需根据实际提供服务范围慎重选择服务类目,一旦你选择了游戏类目,该类目将不可修改变更为其他小程序类目。

    2.2 小程序的服务类目链接使用正常,不存在违法违规或不符合与腾讯所签署的相关协议、腾讯公布的相关规则、规范等内容。

    ​示例:

    ​(1) 小程序服务类目所对应的页面链接不能正常打开。

    ​(2) 小程序服务类目所对应的页面链接加载非法信息。

    ​(3) 小程序服务类目所对应的页面链接加载恶意、色情广告。

    ​(4) 小程序服务类目所对应的页面链接加载侵犯他人权益的内容;含有商业化用语的、热门小程序名称、“国家级”、“最高级”等新广告法明令禁止或其他无关的词语、不含有政治、色情、敏感、暴力血腥、恐怖、其他国家法律法规禁止的词汇及其他违法内容。

    3. 小程序整体审核规则

    3.1 小程序基本功能审核规范

    ​3.1.1 小程序所实际提供的功能点,需与小程序的简介一致。示例:功能包括但不限于简介中提炼的功能点;

    ​3.1.2 小程序所提供的所有服务类目功能,必须在小程序首页得到体现,即在小程序首页必须能直达或者经过2次点击到达所有本文档2(服务类目审核)中提交的服务类目页面;

    ​3.1.3 小程序实际所提供的服务不得属于尚未开放的服务范围。不应超出小程序平台已开放的类目库范围。

    ​3.1.4 小程序中若存在隐藏或付费功能(比如仅充值可见,仅会员可见等受限功能点),该功能的实现不得含有色情、暴力、政治敏感或其他违法违规内容,开发者提供的测试号需可完整呈现和体验该功能;

    ​3.1.5 小程序的功能应具有使用价值,不能过于简单,示例:只有一个页面,只有一个按钮;

    ​3.1.6 未经腾讯公司授权的情况下,不得在小程序中提供与微信客户端功能相同或类似的功能,示例:小程序功能不能包含朋友圈、漂流瓶等。

    ​3.1.7 在未经允许或未经腾讯公司授权的情况下,不得展示和推荐第三方小程序。示例:不能做小程序导航,不能做小程序链接互推,小程序排行榜等。

    ​3.1.8 小程序功能的使用,无需以关注或使用其他号为条件。示例:使用A小程序时,必须同时使用B小程序

    3.2 小程序页面内容审核规范

    ​3.2.1 小程序的页面内容中,存在诱导类行为,包括但不限于诱导分享、诱导添加、诱导关注公众号、诱导下载等,要求用户分享、添加、关注或下载后才可操作的程序,含有明示或暗示用户分享的文案、图片、按钮、浮层、弹窗等的小程序,通过利益诱惑诱导用户分享、传播的小程序,用夸张言语来胁迫、引诱用户分享的小程序,强制或诱导用户添加小程序的,都将会被拒绝;

    ​3.2.2 小程序的页面内容中,主要为营销或广告用途(如内含空白广告位、招商广告等),将会被拒绝;示例:漂浮悬浮广告,含有功能使用的页面中的广告展示比例超过50%,广告遮挡功能。

    ​3.2.3 小程序的页面内容中,存在对用户产生误导、引发用户恐惧心理、严重破坏用户体验或损害用户利益的谣言类等内容的,将会被拒绝;

    ​3.2.4 小程序的页面内容中,不能存在测试类内容;示例:算命,抽签,星座运势等。

    ​3.2.5 小程序的页面内容中不能存在虚假、欺诈类内容,包括但不限于虚假红包、虚假活动、宣传或销售侵害他人合法权益的商品,仿冒腾讯官方或他人业务,其他可能造成微信用户混淆的内容和服务等;

    ​3.2.6 小程序的页面中不能含有传播骚扰信息、广告信息和垃圾信息等内容;

    ​3.2.7 小程序的页面中不得含有可能违反与腾讯签订的、任何形式的服务协议、平台协议、功能协议的内容;

    ​3.2.8 含有发布、传送、传播、储存违反国家法律法规的或含有以下信息内容的,将会被拒绝:

      3.2.8.1 反对宪法所确定基本原则的,危害国家安全、泄露国家秘密、颠覆国家政权、破坏国家统一 、损害国家荣誉和利益的小程序;

    ​  3.2.8.2 任何带有虚假、欺诈内容等的小程序不予通过;

    ​  3.2.8.3 任何召集、推销、鼓动犯罪或有明显侵犯社会善良风俗行为的小程序不予通过;

    ​  3.2.8.4 任何包含法律法规禁止传播内容的小程序不予通过;

      ​3.2.8.5 小程序内容包含反政府、反社会或不符合主流政治的行为的,或存在煽动性的涉政言论或国家法律禁止的内容的,或含有散布谣言,扰乱社会秩序,破坏社会稳定信息的,不予通过;

      ​3.2.8.6 小程序内容不能含有色情素材(即旨在激发情欲,对性器官或性行为的明确描述或展示,而无关美学),或存在涉嫌宣扬传播淫秽、色情内容信息,包括暴露图片、挑逗内容等的,或包含非法色情交易的信息;

      ​3.2.8.7 小程序内容不能包含煽动民族仇恨、民族歧视、破坏民族团结的内容、破坏国家宗教政策、宣扬邪教和封建迷信的;

      ​3.2.8.8 小程序内容不能包含展示人或动物被杀戮、致残、枪击、针刺或其他伤害的真实图片,描述暴力或虐待儿童的,或包含宣扬暴力血腥内容的,或包含侮辱或者诽谤他人,侵害他人合法权益信息的,将会被拒绝;

      ​3.2.8.9 小程序内容不能包含赌博、有奖竞猜和抽奖的内容,提供游戏类目服务的小程序如采取随机抽取方式提供虚拟道具和增值服务的,不得诱导用户以直接投入法定货币或者虚拟货币的方式参与;

      3.2.8.10 小程序内容不能包含诱发未成年人违反公德、违法犯罪的行为的内容以及妨害未成年人身心健康的内容。

    ​3.2.9 小程序内的图片上不能含有广告、网址或虚假内容。

    ​3.2.10 小程序代替用户发表、发送、转交任何内容前,必须征得用户明确同意和授权。

    ​3.2.11 小程序的服务提供者必须提供过滤不当内容的措施。示例:设置对发布色情、赌博等涉嫌违法违规的词汇进行过滤提示的措施。

    ​3.2.12 小程序页面中不能存在误导和错误暗示腾讯公司与该小程序有任何合作、投资、背书关系的内容,例如误导和错误暗示腾讯公司是该小程序运营者,或者误导和错误暗示腾讯公司以任何形式表示认可其质量、服务或与其存在合作关而该小程序事实上并非为腾讯公司运营。

    3.3 可用性和完整性

    ​3.3.1 提交的小程序须是一个完成品,要求可以打开,可以运行,且不可以是一个测试版。示例:不可运行、存在崩溃、闪退、按钮没有响应、文字表述不完整等。

    ​3.3.2 本身会崩溃,或小程序程序会造成微信客户端崩溃的,将会被拒绝。

    ​3.3.3 存在严重Bug的小程序(如无法添加和打开、无法返回和退出、卡顿严重等),将会被拒绝。

    ​3.3.4 若小程序中存在帐号体系,需提供测试号,包含帐号和密码(可以体验所有功能)。

    3.4 用户隐私和数据安全

    ​3.4.1 在收集和使用用户任何数据时,必须明确告知用户该数据的用途,确保经过用户明确同意和授权,并应在用户同意和授权的范围内进行合理使用。在用户注销帐号后应相应删除相关数据。数据包括但不限于获取地理位置、用户通讯录、用户手机号码等。

    ​3.4.2 不得在小程序任何页面请求或诱导用户输入微信用户的用户名或密码。

    ​3.4.3 不得将搜索小程序功能加入小程序。

    ​3.4.4 不得在页面中进行或将通过小程序收集到的用户数据私下进行出售、转交、交易、越权披露或泄露。

    ​3.4.5 不得在未经用户授权同意的情况下,显示用户相关数据,比如:头像,昵称等信息。

    ​3.4.6 小程序不得要求用户降低手机操作系统安全性(如要求iPhone 用户越狱、Android 用户ROOT 等)后,方能使用相关功能。

    ​3.4.7 若小程序有需要追踪用户的地理位置的功能,则必须提供退出该位置追踪的功能和明确指示。

    3.5 技术实现规范性

    ​3.5.1 需要提供小程序文档和说明

    ​3.5.2 禁止视频、音乐、语音等多媒体的自动播放

    ​3.5.3 安装或运行其他可执行代码的程序,将会被拒绝

    ​3.5.4 违规加载或更新代码,将会被拒绝

    ​3.5.5 如果小程序有账户系统,必须提供能正常使用且易于发现的“退出”账户选项。

    3.6 UI 规范

    ​3.6.1 符合WeApp UI 规范

    ​3.6.2 小程序页面内的浮层和弹窗可关闭

    ​3.6.3 小程序的界面必须遵守微信的外观和功能,不得提供改变微信外观和功能的产品体验。

    ​3.6.4 小程序的界面不得模仿系统通知或警告诱导用户点击。

    ​3.6.5 小程序头像logo需使用透明或有色背景。若使用白色背景,需使用有色边框。

    3.6.6 如相关法律法规规定提供服务的界面必须进行特别信息标识的,应予以明确标识。如小游戏必须在游戏开始画面显著位置标明游戏的批准文号、网络游戏出版号以及著作权登记号,全文登载《健康游戏忠告》等。

    微信团队

    展开全文
  • 小程序发布的流程 步骤: 1. 开发者工具,点击代码上传 然后填写版本信息 2. 登录微信公众平台并访问小程序首页 确认填写好相关小程序信息后,点击“前往发布”按钮 点击提交审核,填写信息。 至此,发布流程...

    发布流程,大概分三个大步骤:

    • 上传代码
    • 提交审核
    • 发布版本

    小程序发布的流程

    步骤:

    1. 在开发者工具,点击代码上传

    代码上传
    然后填写版本信息

    2. 登录微信公众平台并访问小程序首页

    确认填写好相关小程序信息后,点击前往发布按钮
    前往发布

    点击提交审核,填写信息。
    提交审核(1)

    提交审核(2)

    3. 审核通过后,点击提交发布

    发布

    至此,发布流程完成。


    提交还是很简单的,但是涉及到审核通过问题,那么我们需要做些什么来提高通过率呢?

    之前虽然没有提交过,但是听说过审核比较严格,比如:

    • 不能出现测试数据

    至少不能一眼看出来就是测试的数据信息,类似商品名称,你写个测试商品,那估计就要打回来了。

    • 要让审核人员完整体验程序

    所以有登录限制什么的,要提供测试账号。


    第一点我有注意,用的数据都是模拟真实的,估计没问题。
    然后到了完整体验这块,我找了半天,愣是没找到让提交测试账号的地方。

    心塞。
    心塞
    去微信开放社区找答案。

    带测试账号提交的界面
    微信开放社区
    从图中可以得知,上述提交审核界面,带有要求提供测试账号的地方,是在审核被退回的情况下,再次提交才会有。

    我们需要在官方人员说的版本描述处填写相关信息。
    即:
    版本描述处
    版本管理

    ok,到此就只要等待审核通过了。
    美滋滋

    展开全文
  • 微信小程序商品展示页面(仿咸鱼)

    千次阅读 2019-03-06 17:43:09
    项目中做了一个商品发布展示的页面,记录下来 解决问题: 想setData中更改数组具体下标中的某个值: let one = "lowMoney[" + 0 + "].money"; this.setData({ [one]: (product.currentPrice * 0.1).toFixed(2...
  • 这一节介绍的是评论帖子,还有发布话题功能的实现。 首先说说评论帖子的功能。 先看一下效果图: 从上一节可知,进行评论跳转的时候需要带来一些关于帖子的数据。 这一个页面对于布局来说,也是十分的重要。...
  • 安装的Wordpress插件搜索Mini Program API插件安装,就可以连接你的网站数据同步到小程序端,无缝对接一个小程序,无需编程轻松生成一个属于的个人小程序,没有资质限制个人也可以上线。 简约精美的UI设计,独家...
  • 从今天开始带领大家实现一款云开发版的点餐小程序 技术选型 1,前端 微信小程序原生框架 css JavaScript 2,管理后台 云开发Cms内容管理系统 web网页 3,数据后台 小程序云开发 云函数 云数据库 云存储 效果...
  • 修改index.js 跳转页面指向,同时新建item目录和itemList为商品列表相关配置itemDetail为商品详情相关配置4.itemList和itemDetail详细内容,请下载!https://download.csdn.net/download/xinteng2012/10531879如有...
  • 2016 年 12 月 28 日,张小龙微信公开课 PRO 版的会场上,宣布了微信小程序的正式发布时间。 可惜,这个时间并不是今天,而是 1 月 9 号。
  • 即速应用商店_分类最齐全的小程序商店,收录当前最新最热门小程序,汇集各行业小程序案例及评测,这里可以轻松找到各种实用好玩的小程序,也可免费发布 自己的小程序获取巨大流量 。PS:关于微信小程序商店_即速...
  • 前段时间闲暇的时候看到一个贝塞尔曲线算法的文章,试着在小程序里去实现小程序的贝塞尔曲线算法,及其效果。 主要应用到的技术点: 1、小程序wxss布局,以及数据绑定 2、js二次bezier曲线算法 核心算法,写...
  • 微信小程序实战项目(商品列表)-four

    千次阅读 2020-11-19 15:35:45
    小程序配置文件中启用上拉和下拉功能 1.1启用下拉功能 这个启用下拉功能用来刷新,微信小程序文档提供了刷新事件为onPullDownRefresh,首先需要在商品列表对应的页面配置进行index.json添加为 ...
  • 微信小程序小程序审核

    千次阅读 2018-07-06 11:12:35
    小程序审核时间慢或是审核不通过,不要慌!可从以下去找问题:1.帐号基本信息1.1小程序名称、简介、logo、服务范围、服务标签、帐号基本信息文字均不得:​ (1)侵犯他人权益(著作权、商标权、肖像权、名誉权等)...
  • 即速应用商店-分类最齐全的小程序商店,收录当前最新最热门小程序,汇集各行业小程序案例及评测,这里可以轻松找到各种实用好玩的小程序,也可免费发布 自己的小程序获取巨大流量 。PS:关于微信小程序商店_即速...
  • 即速应用商店-分类最齐全的小程序商店,收录当前最新最热门小程序,汇集各行业小程序案例及评测,这里可以轻松找到各种实用好玩的小程序,也可 免费发布 自己的小程序获取 巨大流量 。PS:关于微信小程序商店_...
  • 7月19日微信小程序联盟更新的小程序开发教程、小程序资讯、小程序demo、小程序实战内容合揖如下:小程序资讯与小程序教程 一张图带你看懂小程序发展蓝皮书 2017-07-19 微信小程序开发问答《五十三》手机号码处理为...
  • 即速应用商店_分类最齐全的小程序商店,收录当前最新最热门小程序,汇集各行业小程序案例及评测,这里可以轻松找到各种实用好玩的小程序,也可免费发布 自己的小程序获取巨大流量 。PS:关于微信小程序商店_即速...
  • 毕业设计做了一个微信小程序用于二手闲置商城与校园跳蚤物品交换,花费了一个多月进行构思设计和开发,可做为毕业设计或者计算机期末作业。 微信小程序二手闲置商城校园跳蚤物品交换平台主要的功能模块分析如下: ...
  • 此篇博文主要讲如何在商品详情页面,点击加入购物车按钮,将商品加入购物车,并更新购物车中商品总数量。 步骤: 点击添加购物车按钮 || 判断该商品是否已经存在于购物车中 || || 已经存在 不存在 ...
  • 微信小程序使用canvas画海报的时候,会导致个别用户无法生成的情况,你们可以尝试把绘画某些块的代码注释掉再进行扫码调试,我前几天就遇到个别客户无法生成商品海报的情况,刚开始是以为上一个同事留的坑,当我...
  • 1.总体功能图 1用户端 ... (2)闲置信息模块 闲置信息的发布、查询 (3)留言模块 实时留言功能 (4)关注用户 实时了解关注用户动态... (3)发布信息管理 发布信息管理 (4)数据统计模块 统计系统信息及交易信...
  • 如果公司需要开发小程序,首先要公司微信公众号里面申请小程序,快速开通并认证之后才能使用。微信最新推出,只要认证过微信公众号,那么接着认证微信小程序就可以复用微信公众号资质注册小程序流,快速注册认证...
  • 微信小程序 --- 完成小程序支付功能

    千次阅读 2018-03-08 11:02:26
    最近开发小程序,一直小程序的支付。经过一天的努力,小程序支付功能最终实现了。下面感谢 csdn 博主:千堆雪惹尘埃 发布的 " 小程序与php 实现微信支付 "原文地址:...
  • 从今天开始就来带领大家学习微信小程序了,只要你跟着我一步步来,相信你也可以上线一款属于自己的微信小程序 一,认识小程序 微信⼩程序,简称⼩程序,英⽂名 Mini Program Mini Program ,是⼀种不需要下载安装...
  • 第 3-8 课:云开发之商品信息和主题商品数据实现 因为前面做了大量的铺垫,越到... fields 文件夹新建 productThemeField.js // 指定返回结果中记录需返回的字段 module.exports = { PRODUCTTHEMEFIELD: { th...
  • 导师说有内部测试发布这种东西。。。可是没有百度到。 找到一种方法也确实可行: 使用微信开发者工具的二维码编译功能,就可以预览你生成的二维码实际是链接去哪一页了。 后续有其他方法再更新。。。 ...
  • 微信小程序-简单出售商品示例

    千次阅读 2017-08-02 09:07:02
    首先布局下方”发布”,”搜索”部分,index.wxss文件如下 .nav { height : 42 px ; width : 100 % ; position : absolute ; /* top: 100%; */ bottom : 0 px ; display : flex ; ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 35,520
精华内容 14,208
关键字:

如何在小程序发布商品