Compare commits

..

4 Commits

Author SHA1 Message Date
kk 842defea21 注册成功后保存用户id与手机号
Uni-app H5 Deploy (Prod + Staging) / deploy (release) Successful in 44s
2026-07-11 18:30:16 +08:00
kk d392ff98b7 apiBaseUrl改成https
Uni-app H5 Deploy (Prod + Staging) / deploy (release) Successful in 41s
2026-07-11 18:22:44 +08:00
kk 18870f3e7d 注册成功后保存user_info
Uni-app H5 Deploy (Prod + Staging) / deploy (release) Successful in 46s
2026-07-11 18:05:45 +08:00
kk 878778f8f9 解决code被重复使用的问题
Uni-app H5 Deploy (Prod + Staging) / deploy (release) Successful in 41s
2026-07-11 17:52:33 +08:00
3 changed files with 54 additions and 23 deletions
+1 -1
View File
@@ -3,7 +3,7 @@
*/ */
const prod = { const prod = {
// 业务 API 地址(vms-api // 业务 API 地址(vms-api
apiBaseUrl: 'http://101.200.86.98:4000', apiBaseUrl: 'https://vmsapi.arklinksmart.cn',
// 网关地址(vms-gateway)— 用户授权、短信等接口走网关 // 网关地址(vms-gateway)— 用户授权、短信等接口走网关
apiGatewayUrl: 'https://gateway.arklinksmart.cn', apiGatewayUrl: 'https://gateway.arklinksmart.cn',
+31 -9
View File
@@ -72,6 +72,9 @@ export default {
* 发起 OAuth 授权(静默授权,只获取 openid) * 发起 OAuth 授权(静默授权,只获取 openid)
*/ */
async startAuth() { async startAuth() {
// 清除上次使用的 code 标记
uni.removeStorageSync('__used_auth_code');
const platform = detectPlatform(); const platform = detectPlatform();
const appNo = getAppNo(platform); const appNo = getAppNo(platform);
@@ -140,6 +143,20 @@ export default {
return; return;
} }
// 防止 code 重复提交:先检查再标记
const usedCode = uni.getStorageSync('__used_auth_code');
if (usedCode === code) {
console.warn('[loading] code 已使用过,跳过');
return;
}
uni.setStorageSync('__used_auth_code', code);
// 立即清除 URL 中的 code 参数,避免刷新重复处理
const url = new URL(window.location.href);
url.searchParams.delete('code');
url.searchParams.delete('state');
window.history.replaceState({}, '', url.toString());
try { try {
this.statusText = '正在验证身份...'; this.statusText = '正在验证身份...';
@@ -165,12 +182,6 @@ export default {
return; return;
} }
// 清除 URL 中的 code 参数,避免刷新重复处理
const url = new URL(window.location.href);
url.searchParams.delete('code');
url.searchParams.delete('state');
window.history.replaceState({}, '', url.toString());
// 存储 openid // 存储 openid
uni.setStorageSync('openid', openid); uni.setStorageSync('openid', openid);
@@ -219,6 +230,9 @@ export default {
* 发起非静默授权获取用户信息(snsapi_userinfo,弹窗确认) * 发起非静默授权获取用户信息(snsapi_userinfo,弹窗确认)
*/ */
async startUserInfoAuth() { async startUserInfoAuth() {
// 清除上次使用的 code 标记
uni.removeStorageSync('__used_auth_code');
const platform = detectPlatform(); const platform = detectPlatform();
const appNo = getAppNo(platform); const appNo = getAppNo(platform);
@@ -288,16 +302,24 @@ export default {
return; return;
} }
try { // 防止 code 重复提交
this.statusText = '正在获取用户信息...'; const usedCode = uni.getStorageSync('__used_auth_code');
if (usedCode === code) {
console.warn('[loading] code 已使用过,跳过');
return;
}
uni.setStorageSync('__used_auth_code', code);
// 清除 URL 中的 code/action 参数,避免刷新重复处理 // 立即清除 URL 中的 code/action 参数,避免刷新重复处理
const url = new URL(window.location.href); const url = new URL(window.location.href);
url.searchParams.delete('code'); url.searchParams.delete('code');
url.searchParams.delete('state'); url.searchParams.delete('state');
url.searchParams.delete('action'); url.searchParams.delete('action');
window.history.replaceState({}, '', url.toString()); window.history.replaceState({}, '', url.toString());
try {
this.statusText = '正在获取用户信息...';
// 用 code 调用 POST /api/v1/user/info 获取用户信息(必须用 POST,GET 是另一个端点) // 用 code 调用 POST /api/v1/user/info 获取用户信息(必须用 POST,GET 是另一个端点)
console.log('[loading] 请求 POST user/info, app_no:', appNo, 'code:', code); console.log('[loading] 请求 POST user/info, app_no:', appNo, 'code:', code);
const res = await gatewayPost('/api/v1/user/info', { const res = await gatewayPost('/api/v1/user/info', {
+18 -9
View File
@@ -183,23 +183,32 @@ export default {
}); });
const ret = res.data || {}; const ret = res.data || {};
console.log('[register] 注册响应:', JSON.stringify(ret, null, 2));
if (ret.code === 0 && ret.data) { if (ret.code === 0 && ret.data) {
// 保存 token // 保存 token
uni.setStorageSync('token', ret.data.token); uni.setStorageSync('token', ret.data.token);
// Mock 模式下,合并真实注册信息和 mock 配置 // 存储 user_info(接口返回 user_info.user_id 和 phone
const existing = uni.getStorageSync('user_info') || {};
const apiUserInfo = ret.data.user_info || {};
const userInfo = {
user_id: apiUserInfo.user_id || existing.user_id || '',
phone: apiUserInfo.phone || this.phone || existing.phone || '',
nickname: existing.nickname || '',
avatar: existing.avatar || '',
};
// Mock 模式下补充 mock 数据
if (config.mockWechatLogin) { if (config.mockWechatLogin) {
const mockInfo = config.mockUser.user_info; const mockInfo = config.mockUser.user_info;
const userInfo = { userInfo.nickname = userInfo.nickname || mockInfo.nickname;
user_id: ret.data.user_id || mockInfo.user_id, userInfo.avatar = userInfo.avatar || mockInfo.avatar;
phone: this.phone, // 使用真实注册的手机号
nickname: mockInfo.nickname,
avatar: mockInfo.avatar,
};
uni.setStorageSync('user_info', userInfo);
console.log('[register] Mock 模式,合并用户信息:', userInfo);
} }
uni.setStorageSync('user_info', userInfo);
console.log('[register] 存储 user_info:', userInfo);
// 清除临时数据 // 清除临时数据
uni.removeStorageSync('temp_token'); uni.removeStorageSync('temp_token');
uni.removeStorageSync('auth_info'); uni.removeStorageSync('auth_info');