zjk
2026-09-16 d41fd9347b2ec9a40286a7921f4909ac0b0f4ecc
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
const DEFAULT_TIMEOUT = 30000;
const DEVICE_IP_KEY = 'device_ip';
const DEVICE_PORT_KEY = 'device_port';
const DEVICE_ID_KEY = 'device_id';
const DEVICE_FINGERPRINT_KEY = 'device_fingerprint';
 
const normalizeIp = (ip = '') => {
    return String(ip).trim().replace(/^https?:\/\//, '');
};
 
const normalizePort = (port = '') => {
    return String(port).trim();
};
 
export const buildBaseUrl = ({ ip, port }) => {
    // return 'http://deab5d36.natappfree.cc'
    const normalizedIp = normalizeIp(ip);
    const normalizedPort = normalizePort(port);
 
    if (!normalizedIp || !normalizedPort) {
        return '';
    }
 
    return `http://${normalizedIp}:${normalizedPort}`;
};
 
export const getRequestServerConfig = () => {
    return {
        ip: normalizeIp(uni.getStorageSync(DEVICE_IP_KEY) || ''),
        port: normalizePort(uni.getStorageSync(DEVICE_PORT_KEY) || ''),
    };
};
 
export const setRequestServerConfig = ({ ip, port }) => {
    uni.setStorageSync(DEVICE_IP_KEY, normalizeIp(ip));
    uni.setStorageSync(DEVICE_PORT_KEY, normalizePort(port));
};
 
export const clearRequestServerConfig = () => {
    uni.removeStorageSync(DEVICE_IP_KEY);
    uni.removeStorageSync(DEVICE_PORT_KEY);
};
 
export const hasRequestServerConfig = () => {
    const { ip, port } = getRequestServerConfig();
    return Boolean(ip && port);
};
 
export const getDeviceActivationStorage = () => {
    return {
        deviceId: String(uni.getStorageSync(DEVICE_ID_KEY) || '').trim(),
        deviceFingerprint: String(uni.getStorageSync(DEVICE_FINGERPRINT_KEY) || '').trim(),
    };
};
 
export const hasActivatedDevice = () => {
    const { deviceId, deviceFingerprint } = getDeviceActivationStorage();
    return Boolean(hasRequestServerConfig() && deviceId && deviceFingerprint);
};
 
const resolveRequestUrl = (url, baseURL) => {
    if (!url) {
        throw new Error('请求的 URL 不能为空');
    }
 
    if (/^https?:\/\//.test(url)) {
        return url;
    }
 
    const resolvedBaseUrl = baseURL || buildBaseUrl(getRequestServerConfig());
    if (!resolvedBaseUrl) {
        throw new Error('未配置服务地址,请先完成设备激活');
    }
 
    const safeUrl = String(url);
    return `${resolvedBaseUrl}${safeUrl.startsWith('/') ? safeUrl : `/${safeUrl}`}`;
};
 
const isBusinessSuccess = (responseData) => {
    if (!responseData || typeof responseData !== 'object' || Array.isArray(responseData)) {
        return true;
    }
 
    if (!Object.prototype.hasOwnProperty.call(responseData, 'code')) {
        return true;
    }
 
    return Number(responseData.code) === 200;
};
 
export const request = ({
    url,
    method = 'GET',
    data = {},
    header = {},
    timeout = DEFAULT_TIMEOUT,
    baseURL = '',
    responseType = 'text',
}) => {
    return new Promise((resolve, reject) => {
        let resolvedUrl = '';
 
        try {
            resolvedUrl = resolveRequestUrl(url, baseURL);
        } catch (error) {
            reject({
                message: error?.message || '请求地址解析失败',
            });
            return;
        }
 
        uni.request({
            url: resolvedUrl,
            method,
            data,
            header,
            timeout,
            responseType,
            success: (response) => {
                const { statusCode, data: responseData } = response;
                console.log('请求成功:', response);
                // 统一按 HTTP 状态码判断请求是否成功
                if (statusCode >= 200 && statusCode < 300) {
                    // 接口存在业务 code 时,统一按业务成功态判断
                    if (!isBusinessSuccess(responseData)) {
                        reject(responseData);
                        return;
                    }
 
                    resolve(responseData);
                    return;
                }
 
                reject({
                    ...response,
                    message: responseData?.message || `请求失败,状态码:${statusCode}`,
                });
            },
            fail: (error) => {
                reject({
                    ...error,
                    message: error?.errMsg || '网络请求失败',
                });
            },
        });
    });
};