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