【前端】印包客H5
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

202 lines
5.1 KiB

import env from '@/env/index.js'
import store from '@/store/index.js'
import { isDate, isString, isArray } from './is.js'
/**
* 日期格式化,样例 yyyy-mm-dd hh:MM:ss
* @param date Date 需要转换的日期
* @param fmt string 转化的格式 yyyy-mm-dd hh:MM:ss
*/
export const dateTimeFormat = (date, fmt) => {
if (isString(date)) {
date = date.replace(/-/g, '/')
}
if (!isDate(date)) {
date = new Date(date)
}
if (!date || isNaN(date.getTime())) {
throw new Error('日期不正确')
}
let ret
const opt = {
'y+': date.getFullYear().toString(), // 年
'm+': (date.getMonth() + 1).toString(), // 月
'd+': date.getDate().toString(), // 日
'h+': date.getHours().toString(), // 时
'M+': date.getMinutes().toString(), // 分
's+': date.getSeconds().toString() // 秒
}
for (let k in opt) {
ret = new RegExp('(' + k + ')').exec(fmt)
if (ret) {
fmt = fmt.replace(ret[1], ret[1].length == 1 ? opt[k] : opt[k].padStart(ret[1].length, '0'))
}
}
return fmt
}
/**
* 创建websocket
* @param {*} data
* @value {string} pageInfo 页面信息
* @value {true} retry 是否重连,默认false
* @returns 一个websocket实例
*/
export const makeSocket = async ({ pageInfo = '', retry = false }) => {
const socket = {
sockTask: null,
close: function () {
this.sockTask.close({ code: 1000 })
closeFlag = true
},
onMessage: function () {}
}
let limitedNum = 0
let closeFlag = false
let timer = null
async function createSocket() {
let url = ''
if (env == 'production') {
url = 'wss://api-client-yyt.qniao.cn/trading-center/wechatwebsock?token='
} else if (env == 'test') {
url = 'wss://api-client-yyt-test.qniao.cn/trading-center/wechatwebsock?token='
}
const token = store.state.qnToken
const socketTask = await uni.connectSocket({
url: `${url}${token}`,
header: {
'content-type': 'application/json'
},
success: () => {
console.log('websocket连接成功')
},
fail: () => {
console.log('websocket连接失败')
}
})
socketTask.onOpen(() => {
console.log(pageInfo + ' onOpen')
timer = setInterval(() => {
socketTask.send({ data: 'ping' })
}, 10000)
})
socketTask.onClose(() => {
console.log(pageInfo + ' onClose')
clearInterval(timer)
timer = null
if (!closeFlag && retry && limitedNum < 20) {
limitedNum++
console.log('重连次数:' + limitedNum)
createSocket()
}
})
socketTask.onError(() => {
console.log(pageInfo + ' error')
})
socket.sockTask = socketTask
}
await createSocket()
if (socket) {
socket.onMessage = (fn) => {
socket.sockTask.onMessage((res) => {
let data = JSON.parse(res.data)
console.log(pageInfo + '接收到消息:', data)
if (data.type != 'heartbeat') {
fn(data)
}
})
}
}
return socket
}
/**
* 正数的四舍五入
* @value {number} num 需要四舍五入的数字
* @value {number} precision 小数点后保留的位数
*/
export function round(number, precision) {
return Math.round(+number + 'e' + precision) / Math.pow(10, precision)
}
/**
* {beyond:是否超出目标时间,day:天,hours:小时,minutes:分钟,seconds:秒钟}
* @param time 计算时间
* @param target 对照时间
* @returns 时间差对象
*/
export const difTime = (time, target) => {
if (isString(time)) {
time = time.replace(/-/g, '/')
}
if (isString(target)) {
target = target.replace(/-/g, '/')
}
let begin = new Date(time).getTime()
// 兼容ios时间
let end = new Date(target).getTime()
let beyond = begin < end ? false : true
let diff = Math.abs(begin - end)
// 计算天数
let day = Math.floor(diff / (24 * 3600 * 1000))
day != day ? (day = 0) : ''
diff = diff % (24 * 3600 * 1000)
// 计算小时数
let hours = Math.floor(diff / (3600 * 1000))
hours != hours ? (hours = 0) : ''
diff = diff % (3600 * 1000)
// 计算分钟数
let minutes = Math.floor(diff / (60 * 1000))
minutes != minutes ? (minutes = 0) : ''
diff = diff % (60 * 1000)
// 计算秒数
let seconds = Math.floor(diff / 1000)
seconds != seconds ? (seconds = 0) : ''
return {
beyond,
day,
hours,
minutes,
seconds
}
}
/**
* 根据规则校验字段
* @param {*} value 输入值
* @param {array} rules 规则集 {type,required,message}
* @value {boolean} required 是否必填
* @value {string} type 字段类型校验,目前支持 phone
* @returns {object} {isValid,msg}
*/
export const validateField = (value, rules) => {
let isValid = true
let msg = ''
for (let rule of rules) {
if (rule.required) {
if (value === '' || value === undefined || value === null) {
isValid = false
msg = rule.message
break
}
if (isArray(value) && value.length === 0) {
isValid = false
msg = rule.message
break
}
}
if (rule.type === 'phone' && value !== '' && !/^1[3456789]\d{9}$/.test(value)) {
isValid = false
msg = rule.message
break
}
}
return {
isValid,
msg
}
}