From db888df50f304b09f3bdf4b8aa3491892b412826 Mon Sep 17 00:00:00 2001 From: stu2not Date: Thu, 16 Apr 2026 18:18:48 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B0=8F=E7=A8=8B=E5=BA=8F=E5=89=8D=E7=AB=AF?= =?UTF-8?q?=E6=8E=A5=E5=85=A5=E5=BE=AE=E4=BF=A1=E7=99=BB=E5=BD=95=E4=B8=8E?= =?UTF-8?q?=E7=8E=AF=E5=A2=83=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- banban-mini/config/dev.js | 5 ++- banban-mini/config/index.js | 13 +++++-- banban-mini/config/prod.js | 5 ++- banban-mini/src/config/env.ts | 14 ++++++++ banban-mini/src/pages/login/index.tsx | 47 ++++++++----------------- banban-mini/src/services/api.ts | 6 ++-- banban-mini/src/services/auth.ts | 49 +++++++++++++++++---------- 7 files changed, 81 insertions(+), 58 deletions(-) create mode 100644 banban-mini/src/config/env.ts diff --git a/banban-mini/config/dev.js b/banban-mini/config/dev.js index 77f8f0d..fbbf381 100644 --- a/banban-mini/config/dev.js +++ b/banban-mini/config/dev.js @@ -3,7 +3,10 @@ module.exports = { NODE_ENV: '"development"' }, defineConstants: { + __APP_ENV__: '"development"', + // Local backend for daily development. + __API_BASE_URL__: '"http://192.168.101.78:8001"' }, mini: {}, h5: {} -} \ No newline at end of file +} diff --git a/banban-mini/config/index.js b/banban-mini/config/index.js index ee013d5..0d6c467 100644 --- a/banban-mini/config/index.js +++ b/banban-mini/config/index.js @@ -1,6 +1,6 @@ const path = require('path') -module.exports = { +const config = { projectName: 'banban-mini', date: '2025-3-3', designWidth: 750, @@ -59,4 +59,13 @@ module.exports = { } } } -} \ No newline at end of file +} + +module.exports = function (merge) { + const envConfig = + process.env.NODE_ENV === 'development' + ? require('./dev') + : require('./prod') + + return merge({}, config, envConfig) +} diff --git a/banban-mini/config/prod.js b/banban-mini/config/prod.js index 347b6b5..913c379 100644 --- a/banban-mini/config/prod.js +++ b/banban-mini/config/prod.js @@ -3,7 +3,10 @@ module.exports = { NODE_ENV: '"production"' }, defineConstants: { + __APP_ENV__: '"production"', + // Replace with the production backend before publishing a release build. + __API_BASE_URL__: '"http://192.168.101.78:8001"' }, mini: {}, h5: {} -} \ No newline at end of file +} diff --git a/banban-mini/src/config/env.ts b/banban-mini/src/config/env.ts new file mode 100644 index 0000000..a233ea0 --- /dev/null +++ b/banban-mini/src/config/env.ts @@ -0,0 +1,14 @@ +declare const __APP_ENV__: 'development' | 'production' +declare const __API_BASE_URL__: string + +export interface AppConfig { + appEnv: 'development' | 'production' + apiBaseUrl: string +} + +export const APP_CONFIG: AppConfig = { + appEnv: __APP_ENV__, + apiBaseUrl: __API_BASE_URL__, +} + +export const API_BASE_URL = APP_CONFIG.apiBaseUrl diff --git a/banban-mini/src/pages/login/index.tsx b/banban-mini/src/pages/login/index.tsx index 694eee3..ff4cc08 100644 --- a/banban-mini/src/pages/login/index.tsx +++ b/banban-mini/src/pages/login/index.tsx @@ -1,7 +1,7 @@ import { View, Text, Button } from '@tarojs/components' import { useEffect } from 'react' import Taro from '@tarojs/taro' -import { BASE_URL, request } from '@/services/api' +import { wechatLogin } from '@/services/auth' import './index.scss' export default function Login() { @@ -25,6 +25,9 @@ export default function Login() { const loginRes = await Taro.login() const code = loginRes.code console.log('[Login] Got code:', code ? 'yes' : 'no') + if (!code) { + throw new Error('未获取到微信登录凭证') + } // 2. 获取用户头像信息 (可选) let userInfo = null @@ -41,48 +44,26 @@ export default function Login() { // 3. 调用后端登录接口 (微信登录) console.log('[Login] Step 3: Calling backend /auth/login...') - const res = await request<{ access_token: string; expires_in: number; user_id: number }>('/auth/login', { - method: 'POST', - data: { - code: code, // 微信 code - nickname: userInfo?.nickName, - avatar_url: userInfo?.avatarUrl - } + const res = await wechatLogin({ + code, + nickname: userInfo?.nickName, + avatar_url: userInfo?.avatarUrl }) console.log('[Login] Backend login success, user_id:', res.user_id) - // 4. 保存 token 和用户信息 - console.log('[Login] Step 4: Saving token and user info...') - Taro.setStorageSync('token', res.access_token) - Taro.setStorageSync('user_id', res.user_id) - Taro.setStorageSync('expires_in', res.expires_in) - - // 保存用户信息用于显示 + // 4. 保存用户信息用于显示 + console.log('[Login] Step 4: Saving user info...') if (userInfo) { Taro.setStorageSync('userInfo', { nickname: userInfo.nickName, avatar_url: userInfo.avatarUrl }) - } - - // 5. 如果获取到了用户信息,发送到后端更新 - if (userInfo) { - console.log('[Login] Step 5: Updating user profile...') - try { - await request(`/parents/${res.user_id}`, { - method: 'PATCH', - data: { - nickname: userInfo.nickName, - avatar_url: userInfo.avatarUrl - } - }) - } catch (e) { - console.log('[Login] Update user profile failed:', e) - } + } else { + Taro.removeStorageSync('userInfo') } Taro.hideLoading() - console.log('[Login] Step 6: Login complete, showing success toast') + console.log('[Login] Step 5: Login complete, showing success toast') Taro.showToast({ title: '登录成功', icon: 'success' }) // 6. 跳转到首页 @@ -95,7 +76,7 @@ export default function Login() { Taro.hideLoading() console.error('[Login] Login failed:', err) - // 如果是 401 错误,尝试通过创建新用户登录 + // 401 通常表示微信 code 失效或已被使用,提示用户重试登录 if (err.status === 401) { Taro.showToast({ title: '登录失败,请重试', diff --git a/banban-mini/src/services/api.ts b/banban-mini/src/services/api.ts index ef3ad91..3a1e653 100644 --- a/banban-mini/src/services/api.ts +++ b/banban-mini/src/services/api.ts @@ -1,7 +1,7 @@ import Taro from '@tarojs/taro' +import { API_BASE_URL } from '@/config/env' -// const BASE_URL = 'http://175.24.73.253:8001' // 改为实际后端IP -const BASE_URL = 'http://127.0.0.1:8001' +const BASE_URL = API_BASE_URL class ApiError extends Error { constructor(public status: number, message: string) { @@ -53,4 +53,4 @@ export function getToken(): string { export function getCurrentUserId(): number { return Taro.getStorageSync('user_id') || 0 -} \ No newline at end of file +} diff --git a/banban-mini/src/services/auth.ts b/banban-mini/src/services/auth.ts index cf2511c..118f3c4 100644 --- a/banban-mini/src/services/auth.ts +++ b/banban-mini/src/services/auth.ts @@ -1,4 +1,19 @@ -import { request, BASE_URL } from './api' +import Taro from '@tarojs/taro' + +import { request } from './api' + +export interface WechatLoginPayload { + code: string + nickname?: string + avatar_url?: string +} + +export interface LoginSession { + access_token: string + token_type: string + expires_in: number + user_id: number +} export interface Parent { user_id: number @@ -11,22 +26,18 @@ export interface Parent { } // 微信登录 -export async function wechatLogin(code: string): Promise<{ token: string; user_id: number }> { - // TODO: 实现微信登录 - 通过 code 换取 openid,然后调用后端 - // 这里先返回 mock 数据 - const mockParent: Parent = { - user_id: 1, - openid: 'mock_openid_' + code, - nickname: '微信用户', - status: 1, - } - - // 保存模拟 token - const token = 'mock_token_' + Date.now() - Taro.setStorageSync('token', token) - Taro.setStorageSync('user_id', mockParent.user_id) - - return { token, user_id: mockParent.user_id } +export async function wechatLogin(data: WechatLoginPayload): Promise { + const session = await request('/auth/login', { + method: 'POST', + data, + }) + + Taro.setStorageSync('token', session.access_token) + Taro.setStorageSync('token_type', session.token_type) + Taro.setStorageSync('user_id', session.user_id) + Taro.setStorageSync('expires_in', session.expires_in) + + return session } // 创建家长 @@ -66,10 +77,12 @@ export function getToken(): string { // 清除 token export function clearToken(): void { Taro.removeStorageSync('token') + Taro.removeStorageSync('token_type') Taro.removeStorageSync('user_id') + Taro.removeStorageSync('expires_in') } // 获取当前用户ID export function getCurrentUserId(): number { return Taro.getStorageSync('user_id') || 0 -} \ No newline at end of file +}