cshenfu
2024-06-27 58aa6e282bb343503be3cb198948328ea3ed7b79
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
/**
 * 工具包
 * 请勿修改此处代码,因为插件更新后此处代码会被覆盖。
 * 作者:VK
 */
var fnUtil = {};
fnUtil.alipay = require('./alipay');
fnUtil.wxpay = require('./wxpay');
 
/**
 * 产生指定位数的随机数(支持任意字符,默认纯数字)
 * @params    {Number} length 数据源
 * @params    {String} str 指定的字符串中随机范围
 */
fnUtil.random = function(length, str) {
    let s = "";
    let list = "0123456789";
    //abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
    if (str) list = str;
    for (let i = 0; i < length; i++) {
        let code = list[Math.floor(Math.random() * list.length)];
        s += code;
    }
    return s;
};
 
/**
 * 日期格式化
 * @params {Date || Number} date 需要格式化的时间
 */
fnUtil.timeFormat = function(time, fmt = 'yyyy-MM-dd hh:mm:ss', targetTimezone = 8) {
    try {
        if (!time) {
            return "";
        }
        // 其他更多是格式化有如下:
        // yyyy-MM-dd hh:mm:ss|yyyy年MM月dd日 hh时MM分等,可自定义组合
        let date;
        if (typeof time === "number") {
            if (time.toString().length == 10) time *= 1000;
            date = new Date(time);
        } else {
            date = time;
        }
 
        const dif = date.getTimezoneOffset();
        const timeDif = dif * 60 * 1000 + (targetTimezone * 60 * 60 * 1000);
        const east8time = date.getTime() + timeDif;
 
        date = new Date(east8time);
        let opt = {
            "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+)/.test(fmt)) {
            fmt = fmt.replace(RegExp.$1, (date.getFullYear() + "").substr(4 - RegExp.$1.length));
        }
        for (let k in opt) {
            if (new RegExp("(" + k + ")").test(fmt)) {
                fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (opt[k]) : (("00" + opt[k]).substr(("" + opt[
                        k])
                    .length)));
            }
        }
        return fmt;
    } catch (err) {
        // 若格式错误,则原值显示
        return time;
    }
};
 
 
/**
 * request 请求库
 */
fnUtil.request = async function(obj = {}) {
    if (Object.prototype.toString.call(obj.content) === "[object object]") obj.content = JSON.stringify(obj
        .content);
    if (typeof obj.dataType === "undefined") obj.dataType = "json";
    // 当返回的是二进制时,需要设置dataType = default
    if (obj.dataType == "default" || obj.dataType === "") delete obj.dataType;
    if (obj.useContent) obj.content = JSON.stringify(obj.data);
    if (!obj.method) obj.method = "POST";
    if (typeof obj.headers === "undefined" && typeof obj.header !== "undefined") {
        obj.headers = obj.header;
    }
    let originalRes = await uniCloud.httpclient.request(obj.url, obj);
    if (!obj.needOriginalRes && originalRes && originalRes.data) {
        return originalRes.data;
    } else {
        return originalRes;
    }
};
// 是否是手机访问
fnUtil.isMobile = function(ua, isPC) {
    if (typeof isPC !== "undefined") return !isPC;
    let system = {
        ios: false,
        android: false
    };
    let p = ua.toLowerCase();
    system.ios = p.indexOf("iphone") > -1 || p.indexOf("ipad") > -1;
    system.android = p.indexOf("android") > -1;
    if (system.ios || system.android) {
        return true;
    } else {
        return false;
    }
};
 
 
const isSnakeCase = new RegExp('_(\\w)', 'g');
const isCamelCase = new RegExp('[A-Z]', 'g');
 
function parseObjectKeys(obj, type) {
    let parserReg;
    let parser;
    switch (type) {
        case 'snake2camel':
            parser = fnUtil.snake2camel
            parserReg = isSnakeCase
            break
        case 'camel2snake':
            parser = fnUtil.camel2snake
            parserReg = isCamelCase
            break
    }
    for (const key in obj) {
        if (Object.prototype.hasOwnProperty.call(obj, key)) {
            if (parserReg.test(key)) {
                const keyCopy = parser(key)
                obj[keyCopy] = obj[key]
                delete obj[key]
                if (Object.prototype.toString.call((obj[keyCopy])) === '[object Object]') {
                    obj[keyCopy] = parseObjectKeys(obj[keyCopy], type)
                } else if (Array.isArray(obj[keyCopy])) {
                    obj[keyCopy] = obj[keyCopy].map((item) => {
                        return parseObjectKeys(item, type)
                    })
                }
            }
        }
    }
    return obj
}
 
fnUtil.snake2camel = function(value) {
    return value.replace(isSnakeCase, (_, c) => (c ? c.toUpperCase() : ''))
}
 
fnUtil.camel2snake = function(value) {
    return value.replace(isCamelCase, str => '_' + str.toLowerCase())
}
 
// 转驼峰
fnUtil.snake2camelJson = function(obj) {
    return parseObjectKeys(obj, 'snake2camel');
};
 
// 转蛇形
fnUtil.camel2snakeJson = function(obj) {
    return parseObjectKeys(obj, 'camel2snake');
};
 
 
module.exports = fnUtil;