Houjie
2025-04-11 1bf977929dd324f3ac64b70debd8a79443c54392
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
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
import { route, baseConfig, Global } from './config';
import { builtIn } from '../vueRouter/base';
import { err, log, warn } from './warn';
 
/**
 * 当前是不是H5运行环境
 */
export const isH5 = function () {
    return typeof window !== 'undefined' && typeof document !== 'undefined';
};
/**
 * 判断当前变量是否为Object
 * @param {Object} strObj
 */
export const isObject = function (strObj) {
    return strObj.toString() === '[object Object]' && strObj.constructor === Object;
};
/**
 * 获取当前运行平台
 * @param {Boolean} applets 默认false  true时所有小程序平台统一返回 APPLETS
 */
export const appPlatform = function (applets = false) {
    let platform = '';
 
    // #ifdef APP-PLUS-NVUE
    platform = 'APPNVUE';
    // #endif
 
    // #ifdef APP-PLUS
    platform = 'APP';
    // #endif
 
    // #ifdef H5
    platform = 'H5';
    // #endif
 
    // #ifdef MP-ALIPAY
    platform = 'ALIPAY';
    // #endif
 
    // #ifdef MP-BAIDU
    platform = 'BAIDU';
    // #endif
 
    // #ifdef MP-QQ
    platform = 'QQ';
    // #endif
 
    // #ifdef MP-WEIXIN
    platform = 'WEIXIN';
    // #endif
 
    // #ifdef MP-TOUTIAO
    platform = 'TOUTIAO';
    // #endif
 
    if (applets) {
        // #ifdef MP
        platform = 'APPLETS';
        // #endif
    }
 
    return platform;
};
/**
 * 定义一个空方法 如果最后一个参数为true则打印所有参数
 * @param  {...any} args
 */
export const noop = function (...args) {
    if (args[args.length - 1] === true) {
        log(args);
    }
};
/**
 * 格式化基础配置信息 通过new Router传递过来的参数
 */
export const formatConfig = function (userConfig) {
    if (!userConfig.routes || userConfig.routes.constructor !== Array) {
        return err(`路由参数 'routes' 必须传递 \r\n\r\n${JSON.stringify(userConfig)}`);
    }
    if (userConfig.h5 != null && userConfig.h5.constructor !== Object) {
        return err(`h5参数传递错误,应该是一个 'Object' 类型 示例:\r\n\r\n${JSON.stringify(baseConfig.h5)}`);
    }
    const config = Object.create(null);
    const baseConfigKeys = Object.keys(baseConfig);
    for (let i = 0; i < baseConfigKeys.length; i += 1) {
        const key = baseConfigKeys[i];
        if (userConfig[key] != null) {
            if (userConfig[key].constructor === Object) {
                config[key] = {
                    ...baseConfig[key],
                    ...userConfig[key],
                };
            } else if (key == 'routes') { // 需要加入已知的白名单
                config[key] = [...baseConfig[key], ...userConfig[key], ...builtIn];
            } else {
                config[key] = userConfig[key];
            }
        } else {
            config[key] = baseConfig[key];
        }
    }
    return config;
};
export const filter = function (str) {
    str += '';
    str = str.replace(/%/g, '%25');
    str = str.replace(/\+/g, '%2B');
    str = str.replace(/ /g, '%20');
    str = str.replace(/\//g, '%2F');
    str = str.replace(/\?/g, '%3F');
    str = str.replace(/&/g, '%26');
    str = str.replace(/=/g, '%3D');
    str = str.replace(/#/g, '%23');
    return str;
};
/**
 * 使用encodeURI:true的情况    需要进行编码后再传递,解码等等 可以传递深度对象并会在路径后面加入一个query=
 *
 * @param {String} routerName //路径名称
 * @param {JSON} query     //需要格式化参数
 * @param {Boolean} Encode     //是获取还是编码后传递
 */
export const parseQueryN = function (routerName, query, Encode) {
    if (Encode) {
        return {
            url: routerName,
            query: JSON.parse(decodeURIComponent(query.replace(/^query=/, ''))),
        };
    }
    return {
        url: routerName,
        query: `query=${encodeURIComponent(JSON.stringify(query))}`,
    };
};
/**
 * 使用encodeURI:false的情况 直接格式化为普通的queryURl参数形式传递即可 扁平深度对象
 *
 * @param {String} routerName //路径名称
 * @param {JSON} query     //需要格式化参数
 * @param {Boolean} Encode     //是获取还是编码后传递
 */
export const parseQueryD = function (routerName, query, Encode) {
    if (Encode) {
        const obj = {};
        const reg = /([^=&\s]+)[=\s]*([^&\s]*)/g;
        while (reg.exec(query)) {
            obj[RegExp.$1] = RegExp.$2;
        }
        return {
            url: routerName,
            query: obj,
        };
    }
    const encodeArr = [];
    const queryKeys = Object.keys(query);
    for (let i = 0; i < queryKeys.length; i += 1) {
        const attr = queryKeys[i];
        let encodeStr = '';
        if (query[attr].constructor == Object) {
            encodeStr = parseQueryD(routerName, query[attr], Encode).query;
            encodeArr.push(encodeStr);
        } else {
            encodeStr = filter(query[attr]);
            encodeArr.push(`${attr}=${encodeStr}`);
        }
    }
    return {
        url: routerName,
        query: encodeArr.join('&'),
    };
};
/**
 * @param {String} routerName //路径名称
 * @param {JSON} query     //需要格式化参数
 * @param {Boolean} Encode     //是获取还是编码后传递
 */
export const parseQuery = function (routerName, query, Encode = false) {
    if (Global.Router.CONFIG.encodeURI) {
        return parseQueryN(routerName, query, Encode);
    }
    return parseQueryD(routerName, query, Encode);
};
 
export const exactRule = function (cloneRule, routes, ruleKey, getRule = false) {
    const params = {};
    let i = 0;
    // eslint-disable-next-line
    while (true) {
        const item = routes[i];
        if (item == null) {
            if (!getRule) {
                err(`路由表中未查找到 '${ruleKey}' 为 '${cloneRule[ruleKey]}'`);
            }
            return {
                path: '',
                name: '',
            };
        }
        if (item[ruleKey] != null && item[ruleKey] === cloneRule[ruleKey]) {
            if (!getRule) {
                params.url = item.path;
                params.rule = item;
                if (isH5()) { // 如果是h5 则使用优先使用自定义路径名称
                    params.url = item.aliasPath || item.path;
                }
                return params;
            }
            return item;
        }
        i += 1;
    }
};
 
export const resolveRule = function (router, rule, query = {}, ruleKey = 'path') {
    const ruleInfo = route(
        exactRule({
            ...rule,
        },
        router.CONFIG.routes,
        ruleKey,
        router),
    );
    return {
        ...ruleInfo,
        query,
    };
};
/**
 * 把一些不必要的参数进行格式化掉,完成url的美观
 * @param {String} URLQuery URL中传递的参数
 */
export const formatURLQuery = function (URLQuery) {
    switch (URLQuery.trim()) {
    case 'query=%7B%7D':
    case '%7B%7D':
    case '?query=%7B%7D':
    case '?':
    case '?[object Object]':
    case '?query={}':
        URLQuery = '';
        break;
    default:
        warn('url已经很完美啦,不需要格式化!');
        break;
    }
    return URLQuery;
};
/**
 * 拷贝对象
 * @param {Object} object
 */
export const copyObject = function (object) {
    return JSON.parse(JSON.stringify(object));
};