UNI-APP 一些常用方法

module.exports = {
  // 判斷是 IOS 還是安卓
  getPhoneType() {
    var type = 'other'
    switch (uni.getSystemInfoSync().platform) {
      case 'android':
        type = 'android'
        break;
      case 'ios':
        type = 'ios'
        break;
      default:
        break;
    }
    return type
  },

  // 處理手機號碼中間四位
  phoneNumHide(phone) {
    var reg = /^(\d{3})\d{4}(\d{4})$/;
    phone = phone.replace(reg, "$1****$2");
    return phone
  },

  // 處理文件路徑
  getLocalFilePath(path) {
    if (path.indexOf('_www') === 0 || path.indexOf('_doc') === 0 || path.indexOf('_documents') === 0 || path.indexOf('_downloads') === 0) {
      return path
    }
    if (path.indexOf('file://') === 0) {
      return path
    }
    if (path.indexOf('/storage/emulated/0/') === 0) {
      return path
    }
    if (path.indexOf('/') === 0) {
      var localFilePath = plus.io.convertAbsoluteFileSystem(path)
      if (localFilePath !== path) {
        return localFilePath
      } else {
        path = path.substr(1)
      }
    }
    return '_www/' + path
  },

  // 圖片轉(zhuǎn) base64ToPath
  pathToBase64(path) {
    let that = this
    return new Promise((resolve, reject) => {
      if (typeof window === 'object' && 'document' in window) {
        if (typeof FileReader === 'function') {
          var xhr = new XMLHttpRequest()
          xhr.open('GET', path, true)
          xhr.responseType = 'blob'
          xhr.onload = () => {
            if (this.status === 200) {
              let fileReader = new FileReader()
              fileReader.onload = (e) => {
                resolve(e.target.result)
              }
              fileReader.onerror = reject
              fileReader.readAsDataURL(this.response)
            }
          }
          xhr.onerror = reject
          xhr.send()
          return
        }
        var canvas = document.createElement('canvas')
        var c2x = canvas.getContext('2d')
        var img = new Image
        img.onload = () => {
          canvas.width = img.width
          canvas.height = img.height
          c2x.drawImage(img, 0, 0)
          resolve(canvas.toDataURL())
          canvas.height = canvas.width = 0
        }
        img.onerror = reject
        img.src = path
        return
      }
      if (typeof plus === 'object') {
        plus.io.resolveLocalFileSystemURL(that.getLocalFilePath(path), (entry) => {
          entry.file((file) => {
            var fileReader = new plus.io.FileReader()
            fileReader.onload = (data) => {
              resolve(data.target.result)
            }
            fileReader.onerror = (error) => {
              reject(error)
            }
            fileReader.readAsDataURL(file)
          }, (error) => {
            reject(error)
          })
        }, (error) => {
          reject(error)
        })
        return
      }
      if (typeof wx === 'object' && wx.canIUse('getFileSystemManager')) {
        wx.getFileSystemManager().readFile({
          filePath: path,
          encoding: 'base64',
          success(res) {
            resolve('data:image/png;base64,' + res.data)
          },
          fail(error) {
            reject(error)
          }
        })
        return
      }
      reject(new Error('not support'))
    })
  },

  // base 64 轉(zhuǎn)文件路徑
  base64ToPath(base64) {
    return new Promise((resolve, reject) => {
      if (typeof window === 'object' && 'document' in window) {
        base64 = base64.split(',')
        var type = base64[0].match(/:(.*?);/)[1]
        var str = atob(base64[1])
        var n = str.length
        var array = new Uint8Array(n)
        while (n--) {
          array[n] = str.charCodeAt(n)
        }
        return resolve((window.URL || window.webkitURL).createObjectURL(new Blob([array], {
          type: type
        })))
      }
      var extName = base64.match(/data\:\S+\/(\S+);/)
      if (extName) {
        extName = extName[1]
      } else {
        reject(new Error('base64 error'))
      }
      var fileName = Date.now() + '.' + extName
      if (typeof plus === 'object') {
        var bitmap = new plus.nativeObj.Bitmap('bitmap' + Date.now())
        bitmap.loadBase64Data(base64, () => {
          var filePath = '_doc/uniapp_temp/' + fileName
          bitmap.save(filePath, {}, () => {
            bitmap.clear()
            resolve(filePath)
          }, (error) => {
            bitmap.clear()
            reject(error)
          })
        }, (error) => {
          bitmap.clear()
          reject(error)
        })
        return
      }
      if (typeof wx === 'object' && wx.canIUse('getFileSystemManager')) {
        var filePath = wx.env.USER_DATA_PATH + '/' + fileName
        wx.getFileSystemManager().writeFile({
          filePath: filePath,
          data: base64.replace(/^data:\S+\/\S+;base64,/, ''),
          encoding: 'base64',
          success() {
            resolve(filePath)
          },
          fail(error) {
            reject(error)
          }
        })
        return
      }
      reject(new Error('not support'))
    })
  },

  // 打開第三方地圖應(yīng)用
  toMapAPP(latitude, longitude, name) {
    let url = "";
    if (plus.os.name == "Android") { // 判斷是安卓端
      plus.nativeUI.actionSheet({ // 選擇菜單
        title: "選擇地圖應(yīng)用",
        cancel: "取消",
        buttons: [{
          title: "騰訊地圖"
        }, {
          title: "百度地圖"
        }, {
          title: "高德地圖"
        }]
      }, (e) => {
        switch (e.index) {
          // 下面是拼接 url,不同系統(tǒng)以及不同地圖都有不同的拼接字段
          case 1:
            // 注意 referer=xxx 的 xxx 替換成你在騰訊地圖開發(fā)平臺申請的 key
            url = `qqmap://map/geocoder?coord=${latitude},${longitude}&referer=7ZDBZ-POOWJ-3PRFG-KCBCD-WAH5K-AVFVL`;
            break;
          case 2:
            url =
              `baidumap://map/marker?location=${latitude},${longitude}&title=${name}&coord_type=gcj02&src=andr.baidu.openAPIdemo`;
            break;
          case 3:
            url = `androidamap://viewMap?sourceApplication=appname&poiname=${name}&lat=${latitude}&lon=${longitude}&dev=0`;
            break;
          default:
            break;
        }
        if (url != "") {
          url = encodeURI(url);
          // plus.runtime.openURL(url, (e) => {}) // 調(diào)起手機APP應(yīng)用
          plus.runtime.openURL(url, (e) => {
            plus.nativeUI.alert("本機未安裝指定的地圖應(yīng)用");
          });
        }
      })
    } else {
      // iOS上獲取本機是否安裝了百度高德地圖谴轮,需要在 manifest 里配置
      // 在 manifest.json 文件 app-plus -> distribute -> apple -> urlschemewhitelist 點下添加
      // (如urlschemewhitelist:["iosamap","baidumap","qqmap"])  
      plus.nativeUI.actionSheet({
        title: "選擇地圖應(yīng)用",
        cancel: "取消",
        buttons: [{
          title: "騰訊地圖"
        }, {
          title: "百度地圖"
        }, {
          title: "高德地圖"
        }]
      }, (e) => {
        switch (e.index) {
          case 1:
            url = `qqmap://map/geocoder?coord=${latitude},${longitude}&referer=xxx`;
            break;
          case 2:
            url =
              `baidumap://map/marker?location=${latitude},${longitude}&title=${name}&content=${name}&src=ios.baidu.openAPIdemo&coord_type=gcj02`;
            break;
          case 3:
            url =
              `iosamap://viewMap?sourceApplication=applicationName&poiname=${name}&lat=${latitude}&lon=${longitude}&dev=0`;
            break;
          default:
            break;
        }
        if (url != "") {
          url = encodeURI(url);
          plus.runtime.openURL(url, (e) => {
            plus.nativeUI.alert("本機未安裝指定的地圖應(yīng)用");
          });
        }
      })
    }
  },

  // 獲取頁面路徑
  getCurPage() {
    var pages = getCurrentPages();
    var page = pages[pages.length - 1]
    return 'https://czjxmx.com/h5/#' + page.route
  },

  // 短震動
  vibrate() {
    let UIImpactFeedbackGenerator = plus.ios.importClass('UIImpactFeedbackGenerator');
    let impact = new UIImpactFeedbackGenerator();
    impact.prepare();
    impact.init(1);
    impact.impactOccurred();
  },

  // 獲取用戶cid
  getUserCid() {
    let clientInfo = plus.push.getClientInfo()
    return clientInfo.clientid // 設(shè)備CID
  },

  // 數(shù)組內(nèi)是否包含
  inArray(search, array) {
    for (var i in array) {
      if (array[i] == search) {
        return true;
      }
    }
    return false;
  },

  // 公眾號登錄鑒權(quán)--靜默授權(quán)
  gzhLoginBase(url, type) {
    // type  :  snsapi_base 靜默授權(quán)  snsapi_userinfo 獲取用戶信息
    let local = encodeURIComponent(url) // 獲取當(dāng)前頁面地址
    let Appid = '你的APPID'
    window.location.href =
      "https://open.weixin.qq.com/connect/oauth2/authorize?appid=" +
      Appid + // 你APP申請的APPId洲炊,每個app都有個ID是識別你app的方式
      "&redirect_uri=" +
      local +
      "&response_type=code&scope=" + type + "&state=1#wechat_redirect";
  },

  // 判斷是否是微信瀏覽器
  is_wx() {
    let en = window.navigator.userAgent.toLowerCase()
    // 匹配en中是否含有 MicroMessenger 字符串
    if (en.match(/MicroMessenger/i) == 'micromessenger') {
      return true
    }
    if (en.match(/MicroMessenger/i) != 'micromessenger') {
      return false
    }
  },

  // 隨機整數(shù)
  random(lower, upper) {
    return Math.floor(Math.random() * (upper - lower + 1)) + lower;
  },

  // 監(jiān)聽網(wǎng)絡(luò)
  onNetWork() {
    let func = (res) => {
      if (res.networkType === 'none') {
        uni.showToast({
          title: '網(wǎng)絡(luò)異常,請先連接',
          icon: 'none',
          duration: 3000
        });
      }
    }
    uni.getNetworkType({
      success: func
    });
    uni.onNetworkStatusChange(func);
  },

  // 數(shù)組置頂
  toFirst(arr, index) {
    if (index != 0) {
      arr.unshift(arr.splice(index, 1)[0]);
    }
    return arr;
  },

  // 判斷地址是否包含前綴
  httpLink(url) {
    const Http = url.substr(0, 7).toLowerCase()
    const Https = url.substr(0, 8).toLowerCase()
    if (Http === "http://" || Https === "https://") {
      return true
    }
    return false
  },

  // 獲取當(dāng)前頁面路由---包含參數(shù)
  getNowPagePath() {
    let routes = getCurrentPages(); // 獲取當(dāng)前打開過的頁面路由數(shù)組
    if (routes.length == 0) {
      return '/index/index'
    }
    let curRoute = routes[routes.length - 1].route // 獲取當(dāng)前頁面路由
    let curParam = routes[routes.length - 1].options; // 獲取路由參數(shù)
    // 拼接參數(shù)
    let param = ''
    for (let key in curParam) {
      if (key != 'code') {
        if (param == '') {
          param += '?' + key + '=' + curParam[key]
        } else {
          param += '&' + key + '=' + curParam[key]
        }
      }
    }

    let page_url = '/' + curRoute + param
    return page_url
  },

  // 獲取字符長度   中文2個字符响疚,英文一個字符
  strlen(str) {
    var len = 0;
    for (var i = 0; i < str.length; i++) {
      var c = str.charCodeAt(i);
      // 單字節(jié)加1   
      if ((c >= 0x0001 && c <= 0x007e) || (0xff60 <= c && c <= 0xff9f)) {
        len++
      } else {
        len += 2
      }
    }
    return len
  },

  // 字符空格過濾
  trim(str) {
    return str.replace(/^(\s|\u00A0)+/, '').replace(/(\s|\u00A0)+$/, '');
  },

  // 數(shù)字轉(zhuǎn)中文
  toChinesNum(num) {
    let changeNum = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九'];
    let unit = ["", "十", "百", "千", "萬"];
    num = parseInt(num);
    let getWan = (temp) => {
      let strArr = temp.toString().split("").reverse();
      let newNum = "";
      for (var i = 0; i < strArr.length; i++) {
        newNum = (i == 0 && strArr[i] == 0 ? "" : (i > 0 && strArr[i] == 0 && strArr[i - 1] == 0 ? "" : changeNum[strArr[i]] + (strArr[i] == 0 ? unit[0] : unit[i]))) + newNum;
      }
      return newNum;
    }
    let overWan = Math.floor(num / 10000);
    let noWan = num % 10000;
    if (noWan.toString().length < 4) {
      noWan = "0" + noWan;
    }
    return overWan ? getWan(overWan) + "萬" + getWan(noWan) : getWan(num);
  }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末搏熄,一起剝皮案震驚了整個濱河市类少,隨后出現(xiàn)的幾起案子报亩,更是在濱河造成了極大的恐慌吕座,老刑警劉巖匣沼,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件专缠,死亡現(xiàn)場離奇詭異雷酪,居然都是意外死亡,警方通過查閱死者的電腦和手機涝婉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進店門哥力,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事吩跋∧洌” “怎么了?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵锌钮,是天一觀的道長桥温。 經(jīng)常有香客問我,道長梁丘,這世上最難降的妖魔是什么侵浸? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮氛谜,結(jié)果婚禮上掏觉,老公的妹妹穿的比我還像新娘。我一直安慰自己混蔼,他們只是感情好履腋,可當(dāng)我...
    茶點故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著惭嚣,像睡著了一般遵湖。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上晚吞,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天延旧,我揣著相機與錄音,去河邊找鬼槽地。 笑死迁沫,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的捌蚊。 我是一名探鬼主播集畅,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼缅糟!你這毒婦竟也來了挺智?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤窗宦,失蹤者是張志新(化名)和其女友劉穎赦颇,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體赴涵,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡媒怯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了髓窜。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片扇苞。...
    茶點故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出杨拐,到底是詐尸還是另有隱情祈餐,我是刑警寧澤擂啥,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布哄陶,位于F島的核電站,受9級特大地震影響哺壶,放射性物質(zhì)發(fā)生泄漏屋吨。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一山宾、第九天 我趴在偏房一處隱蔽的房頂上張望至扰。 院中可真熱鬧,春花似錦资锰、人聲如沸敢课。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽直秆。三九已至,卻和暖如春鞭盟,著一層夾襖步出監(jiān)牢的瞬間圾结,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工齿诉, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留筝野,地道東北人。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓粤剧,卻偏偏與公主長得像歇竟,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子抵恋,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,055評論 2 355

推薦閱讀更多精彩內(nèi)容