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
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
|
|
}
|
|
}
|