123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466 |
- const extend = function extend(target) {
- var sources = Array.prototype.slice.call(arguments, 1)
- for (var i = 0; i < sources.length; i += 1) {
- var source = sources[i]
- for (var key in source) {
- if (source.hasOwnProperty(key)) {
- target[key] = source[key]
- }
- }
- }
- return target
- }
- /**
- * 获取当前时间戳
- */
- const getTimestamp = (date) => {
- date = date || new Date()
- return Math.round(date / 1000)
- }
- /**
- * 保留指定小数位
- */
- const toDecimal = (float, num) => {
- if (typeof float !== 'number') float = parseFloat(float)
- return parseFloat(float.toFixed(num))
- }
- /**
- * 时间戳转 yyyy-MM-dd hh:mm
- */
- export function formatDate(timestamp, format) {
- const date = timestamp ? new Date(timestamp * 1000) : new Date();
- const data = {
- 'M+': date.getMonth() + 1,
- 'd+': date.getDate(),
- 'h+': date.getHours(),
- 'm+': date.getMinutes(),
- 's+': date.getSeconds(),
- 'q+': Math.floor((date.getMonth() + 3) / 3),
- 'S+': date.getMilliseconds()
- }
- if (/(y+)/i.test(format)) {
- format = format.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length))
- }
- for (var key in data) {
- if (new RegExp('(' + key + ')').test(format)) {
- format = format.replace(RegExp.$1, RegExp.$1.length == 1 ?
- data[key] : ('00' + data[key]).substr(('' + data[key]).length))
- }
- }
- return format
- }
- /**
- * 分钟、小时、天前的处理
- */
- const timeAgo = function(timestamp, format) {
- const minute = 1000 * 60 // 把分,时,天,周,半个月,一个月用毫秒表示
- const hour = minute * 60
- const day = hour * 24
- const now = new Date().getTime() // 获取当前时间毫秒
- const spreadTime = now - timestamp * 1000 // 时间差
- if (spreadTime < 0) {
- return
- }
- const minC = spreadTime / minute
- const hourC = spreadTime / hour
- const dayC = spreadTime / day
- let result
- if (spreadTime >= 0 && spreadTime <= minute) {
- result = '刚刚'
- } else if (minC >= 1 && minC <= 59) {
- result = parseInt(minC) + '分钟前'
- } else if (hourC >= 1 && hourC <= 23) {
- result = parseInt(hourC) + '小时前'
- } else if (dayC >= 1 && dayC < 3) {
- result = parseInt(dayC) + '天前'
- } else if (dayC >= 3 && dayC <= 7) {
- result = '3天前'
- } else {
- result = formatDate(timestamp, format)
- }
- return result
- }
- /**
- * param 将要转为URL参数字符串的对象
- * key URL参数字符串的前缀
- * encode true/false 是否进行URL编码,默认为true
- *
- * return URL参数字符串
- */
- const urlEncode = (param, key, encode) => {
- if (param == null) return ''
- const t = typeof(param)
- let paramStr = ''
- if (t === 'string' || t === 'number' || t === 'boolean') {
- paramStr += '&' + key + '=' + ((encode == null || encode) ? encodeURIComponent(param) : param)
- } else {
- for (let i in param) {
- let k = key == null ? i : key + (param instanceof Array ? '[' + i + ']' : '[' + i + ']')
- paramStr += urlEncode(param[i], k, encode)
- }
- }
- return paramStr
- }
- /**
- * return
- */
- const urlDecode = (query) => {
- if (!query) return null
- let hash, object = {}
- const hashes = query.slice(query.indexOf('?') + 1).split('&')
- for (let i = 0; i < hashes.length; i++) {
- hash = hashes[i].split('=')
- object[hash[0]] = hash[1]
- }
- return object;
- }
- /**
- * 对象合并
- */
- const deepAssign = (origin, source) => {
- for (let key in source) {
- if (source.hasOwnProperty(key)) {
- if (source[key] instanceof Object) {
- deepAssign(origin[key], source[key])
- } else {
- origin[key] = source[key]
- }
- }
- }
- }
- /**
- * 状态数据
- */
- const display = {
- toast: false, // 无用
- modal: false,
- loading: false,
- }
- // 显示消息提示
- const showToast = function(text, icon) {
- wx.showToast({
- title: text || '加载中',
- icon: icon || 'none',
- mask: true,
- duration: 2000
- })
- }
- // 隐藏消息提示
- const hideToast = function() {
- wx.hideToast()
- }
- // 显示 loading
- const showLoading = function(text) {
- if (!display.loading) {
- display.loading = true
- wx.showLoading({
- title: text || '加载中',
- mask: true
- })
- }
- }
- // 隐藏 loading
- const hideLoading = function() {
- if (display.loading) {
- display.loading = false
- wx.hideLoading()
- }
- }
- // 显示失败提示
- const showModal = (title, content) => {
- if (display.toast) hideToast()
- if (display.loading) hideLoading()
- if (!display.modal) {
- title = title || '信息提示'
- content = content || '未知错误' // content 为 null 时会报错
- display.modal = true
- wx.showModal({
- title,
- content: typeof content === 'object' ? JSON.stringify(content) : content,
- showCancel: false,
- confirmColor: '#3B99FC',
- complete: function(e) {
- display.modal = false
- }
- })
- }
- }
- export function buildPageUrl(page, options) {
- let pageUrl = page;
- if (options) {
- let params = urlEncode(options)
- pageUrl += '?' + params.substring(1, params.length);
- }
- return pageUrl;
- }
- export function encodeRedirectUrl(page, options) {
- return encodeURIComponent(buildPageUrl(page, options));
- }
- export function decodeRedirectUrl(url) {
- return decodeURIComponent(url);
- }
- /**
- * 处理富文本里的图片宽度自适应
- * 1.去掉img标签里的style、width、height属性
- * 2.img标签添加style属性:max-width:100%;height:auto
- * 3.修改所有style里的width属性为max-width:100%
- * 4.去掉<br/>标签
- *
- * @param html
- * @returns {void|string|*}
- */
- export function formatRichText(html){
- let newContent= html.replace(/<img[^>]*>/gi,function(match,capture){
- match = match.replace(/style="[^"]+"/gi, '').replace(/style='[^']+'/gi, '');
- match = match.replace(/width="[^"]+"/gi, '').replace(/width='[^']+'/gi, '');
- match = match.replace(/height="[^"]+"/gi, '').replace(/height='[^']+'/gi, '');
- return match;
- });
- newContent = newContent.replace(/style="[^"]+"/gi,function(match,capture){
- match = match.replace(/width:[^;]+;/gi, 'max-width:100%;').replace(/width:[^;]+;/gi, 'max-width:100%;');
- return match;
- });
- newContent = newContent.replace(/<br[^>]*\/>/gi, '');
- newContent = newContent.replace(/\<img/gi, '<img style="max-width:100%;height:auto;display:block;margin:10px 0;"');
- return newContent;
- }
- function strlen(value) {
- //中文、中文标点、全角字符按1长度,英文、英文符号、数字按0.5长度计算
- let cnReg = /([\u4e00-\u9fa5]|[\u3000-\u303F]|[\uFF00-\uFF60])/g;
- let mat = value.match(cnReg);
- let length = 0;
- if (mat) {
- return (length = mat.length + (value.length - mat.length) * 0.5);
- } else {
- return (length = value.length * 0.5);
- }
- }
- /**
- *
- * 判断是否在微信浏览器 true是
- */
- function isWeiXinBrowser() {
- // #ifdef H5
- let ua = window.navigator.userAgent.toLowerCase()
- if (ua.match(/MicroMessenger/i) == 'micromessenger') {
- return true
- } else {
- return false
- }
- // #endif
- return false
- }
- /**
- * 获取url参数
- * @param {*} name
- * @param {*}
- * @returns
- */
- function getQueryString(name, url) {
- var url = url || window.location.href
- var reg = new RegExp('(^|&|/?)' + name + '=([^&|/?]*)(&|/?|$)', 'i')
- var r = url.substr(1).match(reg)
- if (r != null) {
- return r[2]
- }
- return null
- }
- //路径转化
- function getPath(path) {
- return path?path.split('?').shift():path;
- }
- //复制内容
- function uniCopy({
- content,
- success,
- error
- }) {
- content = typeof content === 'string' ? content : content.toString() // 复制内容,必须字符串,数字需要转换为字符串
- /**
- * 小程序端 和 app端的复制逻辑
- */
- //#ifndef H5
- uni.setClipboardData({
- data: content,
- success: function() {
- success("复制成功~")
- },
- fail: function() {
- error("复制失败~")
- }
- });
- //#endif
- /**
- * H5端的复制逻辑
- */
- // #ifdef H5
- if (!document.queryCommandSupported('copy')) { //为了兼容有些浏览器 queryCommandSupported 的判断
- // 不支持
- error('浏览器不支持')
- }
- let textarea = document.createElement("textarea")
- textarea.value = content
- textarea.readOnly = "readOnly"
- document.body.appendChild(textarea)
- textarea.select() // 选择对象
- textarea.setSelectionRange(0, content.length) //核心
- let result = document.execCommand("copy") // 执行浏览器复制命令
- if (result) {
- success("复制成功~")
- } else {
- error("复制失败,请检查h5中调用该方法的方式,是不是用户点击的方式调用的,如果不是请改为用户点击的方式触发该方法,因为h5中安全性,不能js直接调用!")
- }
- textarea.remove()
- // #endif
- }
- //设置缓存
- function setDb(name, value, db_time = 7200) {
- let time = (new Date()).getTime();
- let data = {
- value: value,
- time: time,
- db_time: db_time
- }
- uni.setStorageSync(name, data);
- }
- //获取缓存
- function getDb(name) {
- try {
- let res = uni.getStorageSync(name);
- if (!res) {
- return '';
- }
- let time = (new Date()).getTime();
- if ((time - res.time) / 1000 >= res.db_time) {
- uni.removeStorageSync(name);
- return '';
- }
- return res.value;
- } catch (e) {
- //TODO handle the exception
- return '';
- }
- }
- /**
- * 下载图片
- */
- function getCachedImage(image_url) {
- return new Promise((resolve, reject) => {
- let arr = image_url.split('/');
- let image_name = arr[arr.length - 1];
- var u = getDb('cms' + image_name);
- if (u) {
- resolve(u);
- } else {
- // 本地没有缓存 需要下载
- uni.downloadFile({
- url: image_url,
- success: res => {
- if (res.statusCode === 200) {
- uni.saveFile({
- tempFilePath: res.tempFilePath,
- success: function(res) {
- setDb('cms' + image_name, res.savedFilePath)
- resolve(res.savedFilePath);
- }
- });
- } else {
- reject('下载失败');
- }
- },
- fail: function() {
- reject('下载失败');
- }
- });
- }
- });
- }
- /**
- * 重设tabbar
- * @param {Object} tablist
- */
- function setTabbar(tablist) {
- tablist.list.forEach((item, index) => {
- uni.setTabBarItem({
- index: index,
- text: item.text,
- iconPath: item.image,
- selectedIconPath: item.selectedImage,
- pagePath: item.path
- })
- })
- uni.setTabBarStyle({
- color: tablist.color,
- selectedColor: tablist.selectColor,
- backgroundColor: tablist.bgColor,
- borderStyle: 'black'
- })
- }
- export default {
- extend,
- toDecimal,
- getTimestamp,
- formatDate,
- timeAgo,
- urlEncode,
- urlDecode,
- deepAssign,
- showToast,
- hideToast,
- showLoading,
- hideLoading,
- showModal,
- formatRichText,
- strlen,
- isWeiXinBrowser,
- getQueryString,
- getPath,
- uniCopy,
- setDb,
- getDb,
- getCachedImage,
- setTabbar
- }
|