微信小程序util.js

const api = require('../config/api.js')
const sysInfo = wx.getSystemInfoSync()
let loginNum = 0
const MAX_LOGIN_NUM = 10
const headerParams = {
  '_p': 2,
  '_m': sysInfo.model,
  '_o': 5,
  '_w': 1
}

function parseTime(time, cFormat) {
  if (!time) {
    return ''
  }
  const format = cFormat || '{y}-{m}-{d} {h}:{i}:{s}'
  let date
  if (typeof time === 'object') {
    date = time
  } else {
    if (typeof time === 'string' && /^[0-9]+$/.test(time)) {
      time = parseInt(time)
    }
    if (typeof time === 'number' && time.toString().length === 10) {
      time = time * 1000
    }
    date = new Date(time)
  }
  const formatObj = {
    y: date.getFullYear(),
    m: date.getMonth() + 1,
    d: date.getDate(),
    h: date.getHours(),
    i: date.getMinutes(),
    s: date.getSeconds(),
    a: date.getDay()
  }
  const time_str = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key) => {
    let value = formatObj[key]
    // Note: getDay() returns 0 on Sunday
    if (key === 'a') {
      return ['日', '一', '二', '三', '四', '五', '六'][value]
    }
    if (result.length > 0 && value < 10) {
      value = '0' + value
    }
    return value || 0
  })
  return time_str
}

function formatTime(date) {
  var year = date.getFullYear()
  var month = date.getMonth() + 1
  var day = date.getDate()

  var hour = date.getHours()
  var minute = date.getMinutes()
  var second = date.getSeconds()

  return [year, month, day].map(formatNumber).join('-') + ' ' + [hour, minute, second].map(formatNumber).join(':')
}

function formatNumber(n) {
  n = n.toString()
  return n[1] ? n : '0' + n
}

// 替换url中变量
function getRealUrl(url, ...params) {
  if (!url || !url.includes('{')) {
    return url
  }
  return url.replace(/{(\d+)}/g, function replacer(match, key) {
    return params[key]
  })
}

function formatTimeTwo(number, format) {
  var formateArr = ['Y', 'M', 'D', 'h', 'm', 's']
  var returnArr = []
  // var date = new Date(number * 1000);//时间戳为10位
  var date = new Date(number) //时间戳为13位
  returnArr.push(date.getFullYear())
  returnArr.push(formatNumber(date.getMonth() + 1))
  returnArr.push(formatNumber(date.getDate()))

  returnArr.push(formatNumber(date.getHours()))
  returnArr.push(formatNumber(date.getMinutes()))
  returnArr.push(formatNumber(date.getSeconds()))

  for (var i in returnArr) {
    format = format.replace(formateArr[i], returnArr[i])
  }
  return format
}
function getTime(dateStr) {
  var date = new Date(dateStr)
  var Month = date.getMonth() + 1
  var Day = date.getDate()
  var Y = date.getFullYear() + '-'
  var M = Month < 10 ? '0' + Month + '-' : Month + '-'
  var D = Day + 1 < 10 ? '0' + Day : Day
  return Y + M + D
}
/**
 * 微信upload上传
 */
function uploadFile(file, fileName) {
  return new Promise((resolve, reject) => {
    const tokenKey = wx.getStorageSync('tokenKey')
    const token = wx.getStorageSync('token')
    wx.uploadFile({
      url: api.ImgUpload,
      filePath: file,
      name: 'file',
      header: {
        ...headerParams,
        [tokenKey]: token
      },
      // formData: { name: fileName },
      success(res) {
        try {
          const result = JSON.parse(res.data)
          if (result.code === 0) {
            resolve(result.data)
          } else {
            reject(result.msg)
          }
        } catch (error) {
          reject(error)
        }
      },
      fail(err) {
        reject(err)
      }
    })
  })
}

/**
 * 封封微信的的request
 */
function request(url, data = {}, method = 'GET', headers = 1, needLogin = true) {
  console.log('request', url)
  return new Promise((resolve, reject) => {
    // 清理空value的key
    const parmas = {}
    Object.keys(data).forEach(key => {
      if (data[key] !== void 0 && data[key] !== null) {
        parmas[key] = data[key]
      }
    })

    if (wx.getStorageSync('token') || !needLogin) {
      _request(url, parmas, method, headers, resolve, reject)
    } else {
      loginByWeixin().then(res => {
        if (res.code === 0 && res.data.loginStatus === 1) {
          console.log('loginStatus == 1')
          // 切换到登录页面
          wx.navigateTo({
            url: '/pages/auth/login/login'
          })
          reject(res)
        } else {
          _request(url, parmas, method, headers, resolve, reject)
        }
      }).catch((err) => {
        reject(err)
      })
    }
  })
}

function _request(url, data, method, headers, resolve, reject) {
  const tokenKey = wx.getStorageSync('tokenKey')
  let ContentType = ''
  if (headers === 1) {
    ContentType = 'application/json'
  } else {
    ContentType = 'application/x-www-form-urlencoded;charset=utf-8'
  }
  const header = {
    'Content-Type': ContentType
  }
  if (wx.getStorageSync('token')) {
    header[tokenKey] = wx.getStorageSync('token')
  }
  wx.request({
    url: url,
    data: data,
    method: method,
    header: Object.assign(header, headerParams),
    success: response => {
      if (response.data) {
        const result = response.data
        if (result.code !== 0) {
          if (result.code === 1) {
            console.log(result, 167)
            loginByWeixin().then(res => {
              if (res.code === 0 && res.data && res.data.loginStatus === 1) {
                console.log('loginStatus == 1')
                // 切换到登录页面
                wx.navigateTo({
                  url: '/pages/auth/login/login'
                })
                reject(res.msg || new Error('登陆失败'))
              } else {
                _request(url, data, method, headers, resolve, reject)
              }
            }).catch(err => {
              reject(err)
            })
          } else if (result.code === 19100) {
            // 清除登录相关内容
            try {
              wx.removeStorageSync('userInfo')
              wx.removeStorageSync('tokenKey')
              wx.removeStorageSync('token')
            } catch (e) {
              // Do something when catch error
            }
            reject(response)
          } else if (result.code === 19101) {
            // wx.reLaunch({
            //   url: '/pages/callHistory/callHistory'
            // })
            reject(response)
          } else {
            reject(response)
          }
        } else {
          console.log(result, 100)
          if (result.data && result.data.loginStatus === 0) {
            //存储用户信息
            loginNum = 0
            result.data.assistUserInfo.unionId = result.data.unionId
            setUserInfo(result.data.assistUserInfo)
            wx.setStorageSync('tokenKey', result.data.assistUserInfo.tokenKey)
            wx.setStorageSync('token', result.data.assistUserInfo.token)
            loginSuccess()
          } else if (result.data && result.data.loginStatus === 1) {
            loginNum = 0
            setUserInfo(result.data)
          }
          resolve(result)
        }
      } else {
        reject(response)
      }
    },
    fail: error => {
      reject(error)
    }
  })
}

/**
 * Promise封装wx.checkSession
 */
function checkSession() {
  return new Promise(function(resolve, reject) {
    wx.checkSession({
      success: function() {
        resolve(true)
      },
      fail: function() {
        reject(false)
      }
    })
  })
}

/**
 * Promise封装wx.login
 */
function login() {
  return new Promise(function(resolve, reject) {
    wx.login({
      success: function(res) {
        if (res.code) {
          resolve(res)
        } else {
          reject(res)
        }
      },
      fail: function(err) {
        reject(err)
      }
    })
  })
}

/**
 * 调用微信登录
 */
function loginByWeixin() {
  // console.log('loginByWeixin', 48)
  return new Promise((resolve, reject) => {
    console.log(loginNum, '=========loginByWeixin==========')
    if (loginNum >= MAX_LOGIN_NUM) {
      reject(new Error('登录异常'))
    } else {
      loginNum++
      login().then((res) => {
        // console.log('loginByWeixin', res)
        // debugger
        //登录远程服务器
        _request(api.LoginByCode + res.code, {}, 'get', 1, resolve, reject)
      }).catch((err) => {
        reject(err)
      })
    }
  })
}

/**
 * 调用注册
 */
function registerUser(data) {
  return new Promise((resolve, reject) => {
    const userInfo = getUserInfo()
    //登录远程服务器
    request(api.LoginByPhone, { ...data, ...userInfo }, 'POST', 1, false).then(res => {
      if (res.code === 0) {
        //存储用户信息
        setUserInfo(res.data)
        wx.setStorageSync('tokenKey', res.data.tokenKey)
        wx.setStorageSync('token', res.data.token)
        loginSuccess()
        resolve(res)
      } else {
        reject(res)
      }
    }).catch((err) => {
      reject(err)
    })
  })
}
/**
 * 判断用户是否登录
 */
function checkLogin() {
  return new Promise(function(resolve, reject) {
    // debugger
    if (wx.getStorageSync('userInfo') && wx.getStorageSync('token')) {
      checkSession().then(() => {
        resolve(true)
      }).catch(() => {
        reject(false)
      })
    } else {
      reject(false)
    }
  })
}

function getUserInfo() {
  return wx.getStorageSync('userInfo')
}

function setUserInfo(userInfo) {
  const app = getApp()
  app.globalData.userInfo = userInfo
  return wx.setStorageSync('userInfo', userInfo)
}

function getToken() {
  return wx.getStorageSync('token')
}

function redirect(url) {
  //判断页面是否需要登录
  if (!getToken()) {
    wx.redirectTo({
      url: '/pages/auth/login/login'
    })
    return false
  } else {
    wx.redirectTo({
      url: url
    })
  }
}

function showErrorToast(msg) {
  wx.showToast({
    title: msg,
    icon: 'none'
  })
}

function showToast(obj) {
  var data = {}
  data.title = obj.title
  data.icon = obj.icon || 'none'
  if (obj.duration) {
    data.duration = obj.duration
  }
  if (obj.image) {
    data.image = obj.image
  }
  data.mask = obj.mask || false
  if (obj.success) {
    data.success = obj.success
  }
  if (obj.fail) {
    data.fail = obj.fail
  }
  if (obj.complete) {
    data.complete = obj.complete
  }
  wx.showToast(data)
}

function rpxTopx(rpx) {
  return rpx / 750 * wx.getSystemInfoSync().windowWidth
}

// 验证手机号是否正确
function validatePhoneNumber(phoneNumber) {
  // 正则来源: https://github.com/VincentSit/ChinaMobilePhoneNumberRegex/blob/master/POSIX-CN.md
  const rex = /^(?:\+?86)?1(?:3\d{3}|5[^4\D]\d{2}|8\d{3}|7(?:[0-35-9]\d{2}|4(?:0\d|1[0-2]|9\d))|9[0-35-9]\d{2}|6[2567]\d{2}|4[579]\d{2})\d{6}$/
  return rex.test(phoneNumber)
}

function makePhoneCall(phoneNumber) {
  const info = wx.getSystemInfoSync()
  if (info.platform === 'android') {
    // android 需要执行的代码
    wx.showActionSheet({
      itemList: [phoneNumber],
      success(res) {
        wx.makePhoneCall({
          phoneNumber: phoneNumber
        })
      },
      fail(res) {
        console.log(res.errMsg)
      }
    })
  } else {
    // ios 需要执行的代码
    wx.makePhoneCall({
      phoneNumber: phoneNumber
    })
  }
}
/**
 * 数字小于 10 补 0
 */
function zeroFill(num) {
  if (!isFinite(num)) {
    return ''
  }
  return num < 10 ? '0' + num : num
}
/**
 * 秒数格式化为 分秒
 *
 * @param num 秒数
 * @return {string} 分秒
 */
function formatSeconds(value) {
  var secondTime = parseInt(value) // 秒
  var minuteTime = 0 // 分
  // var hourTime = 0 // 小时
  if (secondTime > 60) {
    minuteTime = parseInt(secondTime / 60)
    secondTime = parseInt(secondTime % 60)
    if (minuteTime > 60) {
      // hourTime = parseInt(minuteTime / 60)
      minuteTime = parseInt(minuteTime % 60)
    }
  }
  return zeroFill(minuteTime) + ':' + zeroFill(secondTime)
}

/**
 * 输入Unix时间戳,返回指定时间格式
 */
function calcTimeHeader(time) {
  // 格式化传入时间
  const date = new Date(parseInt(time)),
    year = date.getUTCFullYear(),
    month = date.getUTCMonth(),
    day = date.getDate(),
    hour = date.getHours(),
    minute = date.getUTCMinutes()
  // 获取当前时间
  const currentDate = new Date(),
    currentYear = date.getUTCFullYear(),
    currentMonth = date.getUTCMonth(),
    currentDay = currentDate.getDate()
  // 计算是否是同一天
  if (currentYear === year && currentMonth === month && currentDay === day) { //同一天直接返回
    if (hour > 12) {
      return `下午 ${hour}:${minute < 10 ? '0' + minute : minute}`
    } else {
      return `上午 ${hour}:${minute < 10 ? '0' + minute : minute}`
    }
  }
  // 计算是否是昨天
  const yesterday = new Date(currentDate - 24 * 3600 * 1000)
  if (year === yesterday.getUTCFullYear() && month === yesterday.getUTCMonth() && day === yesterday.getDate()) { //昨天
    return `昨天 ${hour}:${minute < 10 ? '0' + minute : minute}`
  } else {
    return `${year}-${month + 1}-${day} ${hour}:${minute < 10 ? '0' + minute : minute}`
  }
}
function getDate(date) {
  if (!date) {
    return new Date()
  }

  var theDate = ''
  if (typeof date === 'number') {
    theDate = new Date(date)
  } else if (date.length === undefined) {
    theDate = date
  } else {
    var beforeTime
    if (date.length > 10) {
      var dateArr = date.split(/[T\s]/)

      beforeTime = dateArr[0].split('-')
      var afterTime = dateArr[1].split(':')

      afterTime[2] = afterTime[2] ? afterTime[2] : '00'
    } else {
      beforeTime = date.split('-')
    }

    if (afterTime) {
      theDate = new Date(beforeTime[0], beforeTime[1] - 1, beforeTime[2], afterTime[0], afterTime[1], afterTime[2])
    } else {
      theDate = new Date(beforeTime[0], beforeTime[1] - 1, beforeTime[2])
    }
  }

  if (!theDate) {
    theDate = new Date()
  }

  return theDate
}
function getDateDiff(dateStr) {
  var publishTime = parseInt(getDate(dateStr).getTime() / 1000),
    d_seconds,
    d_minutes,
    d_hours,
    d_days,
    d,
    timeNow = parseInt(new Date().getTime() / 1000)

  d = timeNow - publishTime
  d_days = parseInt(d / 86400)
  d_hours = parseInt(d / 3600)
  d_minutes = parseInt(d / 60)
  d_seconds = parseInt(d)

  if (d_days > 0 && d_days < 30) {
    return d_days + '天前'
  } else if (d_days <= 0 && d_hours > 0) {
    return d_hours + '小时前'
  } else if (d_hours <= 0 && d_minutes > 0) {
    return d_minutes + '分钟前'
  } else if (d_seconds < 60) {
    if (d_seconds <= 0) {
      return '刚刚'
    } else {
      return d_seconds + '秒前'
    }
  } else if (d_days >= 30 && d_days < 365) {
    return Math.floor(d_days / 30) + '个月前'
  } else if (d_days >= 365) {
    return Math.floor(d_days / 365) + '年前'
  }
}
//mqtt消息到达更新
function onMessageArrived() {
  const pages = getCurrentPages()
  if (pages.length > 0) {
    const page = pages[pages.length - 1]
    if ('onMessageArrived' in page) {
      page.onMessageArrived.apply(page, arguments)
    }
  }
}
// 设置用户聊天数据
function setChatData(key, data) {
  var cdata = getChatData(key)
  if (cdata) {
    //设置缓存数据条数限制
    if (cdata.length >= 100) {
      cdata.shift()
    }
    // wx.getStorageSync(key,[...cdata, data]);
  }
  console.log(cdata, data, 482)
  wx.setStorageSync(key, [...cdata, data])

}

// 获取用户聊天数据
function getChatData(key) {
  const data = wx.getStorageSync(key)
  return data || ''
}
// 获取当前页面栈
function getCurrent() {
  var page = getCurrentPages().length === 1 ? false : true
  return page
}
// 浮点处理
function accMul(arg1, arg2) {
  var m = 0, s1 = arg1.toString(), s2 = arg2.toString()
  try {
    m += s1.split('.')[1].length
  } catch (e) {
    console.log(e)
  }
  try {
    m += s2.split('.')[1].length
  } catch (e) {
    console.log(e)
  }
  return Number(s1.replace('.', '')) * Number(s2.replace('.', '')) / Math.pow(10, m)
}
/**
 *
 * @returns android ios
 */
function getPlatform() {
  const info = wx.getSystemInfoSync()
  console.log('======platform=======', info.platform)
  return info.platform
}
function loginSuccess() {
  const app = getApp()
  app.globalData.hasLogin = true
  console.log('======loginSuccess=====')
  //app.getConnectParams()
}
module.exports = {
  parseTime,
  formatTime,
  formatTimeTwo,
  request,
  redirect,
  showErrorToast,
  showToast,
  rpxTopx,
  validatePhoneNumber,
  makePhoneCall,
  formatSeconds,
  loginByWeixin,
  registerUser,
  checkLogin,
  getUserInfo,
  setUserInfo,
  onMessageArrived,
  setChatData,
  getChatData,
  calcTimeHeader,
  getCurrent,
  getTime,
  getRealUrl,
  getDateDiff,
  getDate,
  accMul,
  getPlatform,
  uploadFile
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值