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
}
微信小程序util.js
最新推荐文章于 2024-07-06 10:12:39 发布