zoukankan      html  css  js  c++  java
  • 记录项目特点,主要为小程序,mpvue框架,项目实现的抽取一些公共方法,以及常用小程序api方法

    mpvue

      1、多层数据绑定中,无法实时更新,比如,object.obj1.obj2这种三层以上的,赋值的时候不会实时更新,最好重新定义一个新的值,newObject = object.obj1.obj2  

      2、 小程序路由封装: 

    //保留当前页面,跳转到应用内的某个页面,使用wx.navigateBack可以返回到原页面。
    export const navigateTo = function(url) {
      console.log(`跳转的链接:${url}`);
      wx.navigateTo({
        url: url,
        success: () => {},
        fail: () => {},
        complete: () => {}
      })
    }
    // //关闭当前页面,跳转到应用内的某个页面。
    export const redirectTo = function(url) {
      console.log(`跳转的链接:${url}`);
      wx.redirectTo({
        url: url,
        success: () => {},
        fail: () => {},
        complete: () => {}
      })
    }
    //回到一级页面。
    export const reLaunch = function(url) {
      console.log(`跳转的链接:${url}`);
      wx.reLaunch({
        url: url,
        success: () => {},
        fail: () => {},
        complete: () => {}
      })
    }

    3、保存图片到本地的封装

    /**
     * 保存图片到本地
     */
    export const saveImg = function(str) {
      let self = this;
      let img = str.replace(/http:/, "https:")
      wx.getSetting({
        success(res) {
          if (!res.authSetting['scope.writePhotosAlbum']) {
            // 接口调用询问
            wx.authorize({
              scope: 'scope.writePhotosAlbum',
              success() {
                saveToPhotosAlbum(img);
              },
              fail() {
                // 重新打开设置页面  用户之前拒绝了授权
                if (res.authSetting['scope.writePhotosAlbum'] == undefined) {
                  valid.showPlugin('提示',`授权失败`)
                } else {
                  valid.showPlugin(`提示`,`请先授权保存到相册`,()=>{
                    wx.openSetting({
                      success: ()=> {
                        saveToPhotosAlbum(img);
                      },
                      fail: ()=> {}
                    });
                  },true)
                }
              }
            })
          } else {
            console.log(img);
            saveToPhotosAlbum(img)
          }
        },
        fail(res) {}
      })
    }
    var saveToPhotosAlbum = function(img) {
      wx.getImageInfo({
        src: img,
        success: function(ret) {
          var path = ret.path;
          wx.saveImageToPhotosAlbum({
            filePath: path,
            success(result) {
              wx.showToast({
                title: '保存成功',
                icon: 'success',
                duration: 2000
              })
            }
          })
        }
      })
    }

    4、小程序录音方法的实现

      4.1、第一步打开录音授权

     1 /**
     2              * 打开录音授权
     3              */
     4             getLuVoice(){
     5                 wx.getSetting({ 
     6                     success: res => {
     7                         console.log(res)
     8                         if(!res.authSetting['scope.record']){
     9                             console.log('21213424')
    10                             wx.authorize({
    11                               scope:'scope.record',
    12                               success: res => {
    13                                 console.log(res)
    14                               },
    15                               fail: () => {
    16                                 if(res.authSetting['scope.record'] == undefined){
    17                                     // this.showPlugin('提示','授权失败')
    18                                 }else {
    19                                     this.showPlugin('提示','请重新授权录音',(res)=>{
    20                                         // console.log(res)
    21                                         wx.openSetting({ 
    22                                             success: res => {
    23                                                 console.log(res)
    24                                                 this.uploadVoice()
    25                                             } 
    26                                         });
    27                                     })
    28                                 }
    29                               },
    30                               complete: () => {}
    31                             });
    32                             
    33                         }else {
    34                             this.uploadVoice()
    35                         }
    36                     } 
    37                 });
    38                 
    39             },

      4.2、录音数据组成: 

    voice: {
        state: -1, //0未开始 1录音中 2已完成
        film: 0,
     },
       recorderManager: wx.getRecorderManager();
       backgroundAudioManager: wx.getBackgroundAudioManager();

      4.3、开始执行录音

    /**
                 * 开始录语音
                 */
                uploadVoice(){
                    
                    this.recorderManager.start({
                        duration: 300000,
                        format:'mp3'
                    })
                    this.recorderManager.onStart(() => {
                        console.log('recorder start')
                        this.voice.state = 1
                        this.voice.film = 0
                        this.timeInterval = setInterval(()=> {
                            this.voice.film++;
                            if (this.voice.film == 300 ) {
                                clearInterval(this.timeInterval);
                            }
                        }, 1000)
                    })
                    this.recorderManager.onStop((res) => {
                        console.log('recorder stop')
                        this.voice.state = 0
                        clearInterval(this.timeInterval);
                        console.log(res)
                        this.uploadQN(res)
                    })
                    this.recorderManager.onFrameRecorded((res) => {
                        this.voice.state = 0
                        clearInterval(this.timeInterval);
                        console.log(res)
                        this.uploadQN(res) //  这是把获取的录音链接上传到服务器
                    })
                },

      4.4、播放录音

    /**
                 * 播放录音
                 */
                playAudio(obj,index){
                    if (this.audioIndex > -1) {
                        this.voiceArr[this.audioIndex].state = 0
                    }
                    this.backgroundAudioManager.title = 'play';
                    this.backgroundAudioManager.src = obj.url
                    this.backgroundAudioManager.onPlay(()=>{
                        console.log('开始播放')
                        this.voiceArr[index].state = 1
                        // this.
                    })
                    this.backgroundAudioManager.onPause(()=>{
                        console.log('播放暂停')
                        this.voiceArr[index].state = 0
                    })
                    this.backgroundAudioManager.onTimeUpdate(()=>{
                        console.log('播放中')
                        console.log(this.backgroundAudioManager.duration)
                        console.log(this.backgroundAudioManager.currentTime)
                        this.voiceArr[index].time = parseInt(this.backgroundAudioManager.duration - this.backgroundAudioManager.currentTime) < 0? 0 : parseInt(this.backgroundAudioManager.duration - this.backgroundAudioManager.currentTime)
                    })
                    this.backgroundAudioManager.onEnded(()=>{
                        console.log('播放结束')
                        this.voiceArr[index].state = 0
                    })
                },

    注释:这个是把音视频的时间转换方法

    /**
                 *  转换音频时长显示
                 *  parseInt(duration/60) 是将秒转换为整分
                 *  duration%60 是取余,也就是整分后剩余的秒
                 *  minute+isM0+sec 就是分:秒(02:14)的格式
                 */
                transTime: function (time) {
                    let duration = parseInt(time);
                    let minute = parseInt(duration / 60);
                    let sec = duration % 60 + '';
                    let isM0 = ':';
                    if (minute === 0) {
                    minute = '00';
                    } else if (minute < 10) {
                    minute = '0' + minute;
                    }
                    if (sec.length === 1) {
                    sec = '0' + sec;
                    }
                    return minute + isM0 + sec
                },

    5、使用扫码场景值进入小程序,解析链接并获取自定义参数

    /**
     * 处理场景值、问号后参数、Storage参数
     */
    export const handleParameter = function(options) {
      console.log(`扫码的场景值:${options.scene}`);
      let sceneObj = new Object;
      if (options.scene) {
        let scene = decodeURIComponent(options.scene)
        let ary  = scene.split('#');
        for (let i = 0; i < ary.length; i++) {
         //  以下是自定义参数  根据自己项目需求改动,生成的二维码的参数排列也是这中形式,不然解析对不上
          if (i==0) {
            sceneObj.dId = ary[i]
          } else if (i==1) {
            sceneObj.cid = ary[i]
          } else if (i==2 && ary[i]) {
            sceneObj.sid = ary[i]
          } else if (i==3 && ary[i]) {
            sceneObj.sourceName = ary[i]
          } else if (i==4 && ary[i]) {
            sceneObj.shareUserId = ary[i]
          } else if (i==5 && ary[i]) {
            sceneObj.shareUserId1 = ary[i]
          } else if (i==6 && ary[i]) {
            sceneObj.code = ary[i]
          } else if (i==7 && ary[i]) {
            sceneObj.groupId = ary[i]
          }
        }
      }
      let obj = {};
      if (options.dId) {
        obj.dId = options.dId;
        wx.setStorageSync('dId',obj.dId)
      } else if (sceneObj.dId) {
        console.log(sceneObj)
        obj.dId = sceneObj.dId
        wx.setStorageSync('dId',obj.dId)
      } else if (wx.getStorageSync('dId')){
        obj.dId = wx.getStorageSync('dId')
      }
    
      if (options.cid) {
        obj.cid = options.cid
      } else if (sceneObj.cid) {
        obj.cid = sceneObj.cid
      }
      if (options.sid) {
        obj.sid = options.sid
      } else if (sceneObj.sid) {
        obj.sid = sceneObj.sid
      }
      if (options.sourceName) {
        obj.sourceName = options.sourceName;
        wx.setStorageSync('sourceName',obj.sourceName)
      } else if (sceneObj.sourceName) {
        getpathway(sceneObj.sourceName)
      }
    
      if (options.shareUserId) {
        obj.shareUserId = options.shareUserId
        wx.setStorageSync('shareUserId',obj.shareUserId)
      } else if (sceneObj.shareUserId) {
        console.log(sceneObj);
        obj.shareUserId = sceneObj.shareUserId
        wx.setStorageSync('shareUserId',obj.shareUserId)
      }
    
      if (options.shareUserId1) {
        obj.shareUserId1 = options.shareUserId1
        wx.setStorageSync('shareUserId1',obj.shareUserId1)
      } else if (sceneObj.shareUserId1) {
        obj.shareUserId1 = sceneObj.shareUserId1
        wx.setStorageSync('shareUserId1',obj.shareUserId1)
      }
      if (options.code) {
        obj.code = options.code
      } else if (sceneObj.code) {
        obj.code = sceneObj.code
      }
      if (options.groupId) {
        obj.groupId = options.groupId
      } else if (sceneObj.groupId) {
        obj.groupId = sceneObj.groupId
      }
      return obj
    }

    6、快速获取分享的链接,公共方法,并携带参数    注:主要是自己拿来记录的 并不适合用大众

    /**
     * 获取新的分享链接
     */
    export const getShareLink = function(){
      let uInfo = wx.getStorageSync('uInfo');
      let shareUserId = wx.getStorageSync('shareUserId');
      let shareUserId1 = wx.getStorageSync('shareUserId1');
      let link = "";
      if (uInfo) {
        if (shareUserId) {
          if (shareUserId == uInfo.userId) {
            if (shareUserId1) {
              link = `shareUserId=${uInfo.userId}&shareUserId1=${shareUserId1}`
            } else {
              link = `shareUserId=${uInfo.userId}`
            }
          } else {
            link = `shareUserId=${uInfo.userId}&shareUserId1=${shareUserId}`
          }
        } else {
          link = `shareUserId=${uInfo.userId}`
        }
      } else {
        if (shareUserId && shareUserId1) {
          link = `shareUserId=${shareUserId}&shareUserId1=${shareUserId1}`
        } else {
          if (shareUserId) {
            link = `shareUserId=${shareUserId}`
          } else {
            link = ""
          }
        }
      }
      if (link) {
        if (getoptions().indexOf('?') > -1) {
          return `${getoptions()}&${link}`
        } else {
          return `${getoptions()}?${link}`
        }
      } else {
        return getoptions()
      }
    }
    /**
     * 新的分享链接
     */
    var getoptions = function(){
      var pages = getCurrentPages() //获取加载的页面
      var currentPage = pages[pages.length - 1] //获取当前页面的对象
      var url = currentPage.route //当前页面url
      var options = currentPage.options //如果要获取url中所带的参数可以查看options
      let specialAty = ['shareUserId','shareUserId1','sourceName','scene']
      let aryRe = [];
      options.dId = options.dId ? options.dId : wx.getStorageSync('dId')
      let sceneObj = new Object;
      if (!isEmpty(options)) {
        if (options.scene) {
          let scene = decodeURIComponent(options.scene)
          let ary  = scene.split('#');
          for (let i = 0; i < ary.length; i++) {
            if (i==0) {
              sceneObj.dId = ary[i]
            } else if (i==1) {
              sceneObj.cid = ary[i]
            } else if (i==2 && ary[i]) {
              sceneObj.sid = ary[i]
            } else if (i==3 && ary[i]) {
              sceneObj.sourceName = ary[i]
            } else if (i==4 && ary[i]) {
              sceneObj.shareUserId = ary[i]
            } else if (i==5 && ary[i]) {
              sceneObj.shareUserId1 = ary[i]
            } else if (i==6 && ary[i]) {
              sceneObj.code = ary[i]
            }
          }
        }
        if (!isEmpty(sceneObj)) {
          if (sceneObj.sourceName) {
            getpathway(sceneObj.sourceName)
          }
          options = sceneObj
        }
        for (var variable in options) {
          if (!specialAty.includes(variable)) {
            if (options.hasOwnProperty(variable)) {
              aryRe.push(`${variable}=${options[variable]}`)
            }
          }
        }
      }
      if (aryRe.length > 0) {
        url += `?${aryRe.join('&')}`
      }
      if (getSourceName()) {
        if (url.indexOf('?') > -1) {
          return `/${url}&${getSourceName()}`
        } else {
          return `/${url}?${getSourceName()}`
        }
      } else {
        return `/${url}`
      }
    }
    /**
     * 获取渠道
     */
    export const getpathway = function(sourceName){
      flyGet(_url.GER_PATHWAY, {
        pathwayId: sourceName
      }, (res) => {
        if (res.data.code == 1000 && res.data.result) {
          let ary = res.data.result;
          wx.setStorageSync('sourceName',ary.pathwayId)
        }
      })
    }
    /**
     * 获取本人的sourceName
     */
    var getSourceName = function(){
      let uInfo = wx.getStorageSync('uInfo');
      if (uInfo && uInfo.vipSourceName) {
        return `sourceName=${uInfo.vipSourceName}`
      } else if (wx.getStorageSync('sourceName')) {
        return `sourceName=${wx.getStorageSync('sourceName')}`
      } else {
        return ""
      }
    }

    记录安卓手机的一些问题:

      1、在小程序弹窗的时候,安卓手机点击手机的返回,可以把弹窗消失,如果在做一些限制的话,就会无法得到想要的效果,封装弹窗时,在后面多做判断

      

    /**
     * 显示弹窗
     * @return {[type]} [description]
     */
    export const showPlugin = function(title = "提示", content, callback, showCancel = false){
      wx.showModal({
        title: title,
        content: content,
        showCancel: showCancel,
        success: (res)=> {
          if (res.confirm) {
            if (callback) {
              callback()
            }
          }else if(res.cancel){  // 防止安卓手机的返回
            callback()
          }else {   // 防止安卓手机的返回
            callback()   
          }
        }
      })
    }

    js基本的正则判断:https://mp.weixin.qq.com/s/U1dP7effxMZvLGRa8g5Lrg

    7、小程序复制内容:

    /**
     * 设置系统剪贴板的内容
     */
    export const clipboard = function(data){
      wx.setClipboardData({
        data: data,
        success: (res)=> {
          wx.showToast({
            title: '内容已复制',
            icon: 'success',
            duration: 2000
          })
        },
        fail: (res)=>{
          wx.showToast({
            title: `复制失败!`,
            icon: 'none',
            duration: 2000
          })
        }
      })
    }

    8、小程序预览图片

    /**
     * 预览图片
     */
    export const previewImg = function(current,urls){
      console.log(urls);
      wx.previewImage({
        current: current, // 当前显示图片的http链接
        urls: urls?urls:[current] // 需要预览的图片http链接列表
      })
    }

    9、canvas实现画图、画海报,其中文字换行,头像圆形,渲染文字的方法 

    /**
     * 文本换行
     * @param {Object} obj
     */
    export const textWrap = function(obj){
      let tr = getTextLine(obj);
      for (let i = 0; i < tr.length; i++) {
        if (i < obj.line){
          let txt = {
            context: obj.context,
            x: obj.x,
            y: obj.y + (i * obj.height),
            color: obj.color,
            size: obj.size,
            align: obj.align,
            baseline: obj.baseline,
            text: tr[i],
            bold: obj.bold
          };
          if (i == obj.line - 1) {
            if (tr.length > obj.line) {
              txt.text = txt.text.substring(0, txt.text.length - 1) + '...';
            }
          }
          drawText(txt);
        }
      }
    }
    /**
     * 渲染文字
     *
     * @param {Object} obj
     */
    var drawText = function (obj) {
      obj.context.save();
      obj.context.setFillStyle(obj.color);
      obj.context.setFontSize(obj.size);
      obj.context.setTextAlign(obj.align);
      obj.context.setTextBaseline(obj.baseline);
      if (obj.bold) {
        obj.context.fillText(obj.text, obj.x, obj.y - 0.5);
        obj.context.fillText(obj.text, obj.x - 0.5, obj.y);
      }
      obj.context.fillText(obj.text, obj.x, obj.y);
      if (obj.bold) {
        obj.context.fillText(obj.text, obj.x, obj.y + 0.5);
        obj.context.fillText(obj.text, obj.x + 0.5, obj.y);
      }
      obj.context.restore();
    }
    /**
     * 获取文本折行
     * @param {Object} obj
     * @return {Array} arrTr
     */
    var getTextLine = function(obj){
      obj.context.setFontSize(obj.size);
      let arrText = obj.text.split('');
      let line = '';
      let arrTr = [];
      for (let i = 0; i < arrText.length; i++) {
        var testLine = line + arrText[i];
        var metrics = obj.context.measureText(testLine);
        var width = metrics.width;
        if (width > obj.width && i > 0) {
          arrTr.push(line);
          line = arrText[i];
        } else {
          line = testLine;
        }
        if (i == arrText.length - 1) {
          arrTr.push(line);
        }
      }
      return arrTr;
    }
    
    /**
     * 圆形头像
     */
    export const circleImg = function(context, img, x, y, r){
      context.save();
      var d = 2 * r;
      var cx = x + r;
      var cy = y + r;
      context.beginPath();
      context.arc(cx, cy, r, 0, 2 * Math.PI);
      context.clip();
      context.drawImage(img, x, y, d, d);
      context.restore()
    }

  • 相关阅读:
    JQuery 快速入门一篇通
    Winform 显示Gif图片
    MD5编码工具类 MD5Code.java
    Asp.Net 上传图片并生成高清晰缩略图
    winform时钟c#代码
    PHP面试题汇总
    PHP条件语句语法与示例
    Android声音播放实例代码
    html和js基础功能代码备份
    纯C#实现屏幕指定区域截屏
  • 原文地址:https://www.cnblogs.com/PinkYun/p/11152597.html
Copyright © 2011-2022 走看看