sa2kit 1.6.64 → 1.6.67
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/auth/legacy/core/index.js +24 -12
- package/dist/auth/legacy/core/index.js.map +1 -1
- package/dist/auth/legacy/core/index.mjs +24 -12
- package/dist/auth/legacy/core/index.mjs.map +1 -1
- package/dist/auth/legacy/index.js +30 -12
- package/dist/auth/legacy/index.js.map +1 -1
- package/dist/auth/legacy/index.mjs +30 -12
- package/dist/auth/legacy/index.mjs.map +1 -1
- package/dist/auth/legacy/logic/index.js +24 -12
- package/dist/auth/legacy/logic/index.js.map +1 -1
- package/dist/auth/legacy/logic/index.mjs +24 -12
- package/dist/auth/legacy/logic/index.mjs.map +1 -1
- package/dist/auth/legacy/miniapp/index.js +24 -12
- package/dist/auth/legacy/miniapp/index.js.map +1 -1
- package/dist/auth/legacy/miniapp/index.mjs +24 -12
- package/dist/auth/legacy/miniapp/index.mjs.map +1 -1
- package/dist/auth/legacy/routes/index.d.mts +3 -0
- package/dist/auth/legacy/routes/index.d.ts +3 -0
- package/dist/auth/legacy/routes/index.js +8 -1
- package/dist/auth/legacy/routes/index.js.map +1 -1
- package/dist/auth/legacy/routes/index.mjs +8 -1
- package/dist/auth/legacy/routes/index.mjs.map +1 -1
- package/dist/auth/legacy/server/index.js +8 -1
- package/dist/auth/legacy/server/index.js.map +1 -1
- package/dist/auth/legacy/server/index.mjs +8 -1
- package/dist/auth/legacy/server/index.mjs.map +1 -1
- package/dist/auth/legacy/ui/miniapp/index.js.map +1 -1
- package/dist/auth/legacy/ui/miniapp/index.mjs.map +1 -1
- package/dist/auth/legacy/ui/web/index.js +6 -0
- package/dist/auth/legacy/ui/web/index.js.map +1 -1
- package/dist/auth/legacy/ui/web/index.mjs +6 -0
- package/dist/auth/legacy/ui/web/index.mjs.map +1 -1
- package/dist/auth/legacy/web/index.js +30 -12
- package/dist/auth/legacy/web/index.js.map +1 -1
- package/dist/auth/legacy/web/index.mjs +30 -12
- package/dist/auth/legacy/web/index.mjs.map +1 -1
- package/dist/festivalCard/index.d.mts +10 -0
- package/dist/festivalCard/index.d.ts +10 -0
- package/dist/festivalCard/index.js +206 -0
- package/dist/festivalCard/index.js.map +1 -0
- package/dist/festivalCard/index.mjs +181 -0
- package/dist/festivalCard/index.mjs.map +1 -0
- package/dist/index.d.mts +2 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.js +210 -18
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +208 -18
- package/dist/index.mjs.map +1 -1
- package/dist/screenReceiver/core/index.d.mts +10 -2
- package/dist/screenReceiver/core/index.d.ts +10 -2
- package/dist/screenReceiver/core/index.js +15 -0
- package/dist/screenReceiver/core/index.js.map +1 -1
- package/dist/screenReceiver/core/index.mjs +15 -1
- package/dist/screenReceiver/core/index.mjs.map +1 -1
- package/dist/screenReceiver/index.d.mts +1 -1
- package/dist/screenReceiver/index.d.ts +1 -1
- package/dist/screenReceiver/index.js +21 -3
- package/dist/screenReceiver/index.js.map +1 -1
- package/dist/screenReceiver/index.mjs +21 -4
- package/dist/screenReceiver/index.mjs.map +1 -1
- package/dist/screenReceiver/server/index.js +1 -1
- package/dist/screenReceiver/server/index.js.map +1 -1
- package/dist/screenReceiver/server/index.mjs +1 -1
- package/dist/screenReceiver/server/index.mjs.map +1 -1
- package/dist/screenReceiver/server/next.d.mts +9 -0
- package/dist/screenReceiver/server/next.d.ts +9 -0
- package/dist/screenReceiver/server/next.js +178 -0
- package/dist/screenReceiver/server/next.js.map +1 -0
- package/dist/screenReceiver/server/next.mjs +176 -0
- package/dist/screenReceiver/server/next.mjs.map +1 -0
- package/dist/screenReceiver/web/index.d.mts +1 -1
- package/dist/screenReceiver/web/index.d.ts +1 -1
- package/dist/screenReceiver/web/index.js +21 -3
- package/dist/screenReceiver/web/index.js.map +1 -1
- package/dist/screenReceiver/web/index.mjs +21 -4
- package/dist/screenReceiver/web/index.mjs.map +1 -1
- package/dist/showmasterpiece/index.js +30 -12
- package/dist/showmasterpiece/index.js.map +1 -1
- package/dist/showmasterpiece/index.mjs +30 -12
- package/dist/showmasterpiece/index.mjs.map +1 -1
- package/dist/showmasterpiece/ui/web/index.js +30 -12
- package/dist/showmasterpiece/ui/web/index.js.map +1 -1
- package/dist/showmasterpiece/ui/web/index.mjs +30 -12
- package/dist/showmasterpiece/ui/web/index.mjs.map +1 -1
- package/dist/showmasterpiece/web/index.js +30 -12
- package/dist/showmasterpiece/web/index.js.map +1 -1
- package/dist/showmasterpiece/web/index.mjs +30 -12
- package/dist/showmasterpiece/web/index.mjs.map +1 -1
- package/package.json +11 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/auth/legacy/schema/index.ts","../../../../src/auth/legacy/services/authDbService.ts","../../../../src/auth/legacy/utils/authUtils.ts","../../../../src/auth/legacy/routes/login.ts","../../../../src/auth/legacy/routes/register.ts","../../../../src/auth/legacy/routes/logout.ts","../../../../src/auth/legacy/routes/validate.ts","../../../../src/auth/legacy/routes/sendVerificationCode.ts","../../../../src/auth/legacy/routes/resetPassword.ts","../../../../src/auth/legacy/server.ts"],"names":["NextResponse"],"mappings":"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","file":"index.mjs","sourcesContent":["import { pgTable, serial, text, timestamp, boolean, varchar, integer } from 'drizzle-orm/pg-core';\nimport { relations } from 'drizzle-orm';\n\n// 用户表\nexport const legacyUsers = pgTable('users', {\n id: serial('id').primaryKey(),\n phone: varchar('phone', { length: 20 }).notNull().unique(),\n password: varchar('password', { length: 255 }).notNull(),\n name: varchar('name', { length: 100 }),\n email: varchar('email', { length: 255 }),\n isActive: boolean('is_active').notNull().default(true),\n role: varchar('role', { length: 20 }).notNull().default('user'),\n lastLoginAt: timestamp('last_login_at'),\n createdAt: timestamp('created_at').defaultNow().notNull(),\n updatedAt: timestamp('updated_at').defaultNow().notNull(),\n});\n\n// 用户会话表\nexport const legacyUserSessions = pgTable('user_sessions', {\n id: serial('id').primaryKey(),\n userId: integer('user_id').notNull().references(() => legacyUsers.id, { onDelete: 'cascade' }),\n sessionToken: varchar('session_token', { length: 255 }).notNull().unique(),\n expiresAt: timestamp('expires_at').notNull(),\n createdAt: timestamp('created_at').defaultNow().notNull(),\n});\n\n// 验证码表\nexport const legacyVerificationCodes = pgTable('verification_codes', {\n id: serial('id').primaryKey(),\n phone: text('phone').notNull(),\n code: text('code').notNull(),\n expiresAt: timestamp('expires_at').notNull(),\n createdAt: timestamp('created_at').defaultNow().notNull(),\n used: boolean('used').default(false).notNull(),\n});\n\n// 关系定义\nexport const legacyUsersRelations = relations(legacyUsers, ({ many }) => ({\n sessions: many(legacyUserSessions),\n}));\n\nexport const legacyUserSessionsRelations = relations(legacyUserSessions, ({ one }) => ({\n user: one(legacyUsers, {\n fields: [legacyUserSessions.userId],\n references: [legacyUsers.id],\n }),\n}));\n","import { randomBytes } from 'crypto';\nimport { eq, and, gt, lt } from 'drizzle-orm';\nimport bcrypt from 'bcryptjs';\nimport type { AuthService, SessionValidation, User, UserSession } from '../types';\nimport { legacyUsers, legacyUserSessions, legacyVerificationCodes } from '../schema';\n\nexport interface LegacyAuthDbConfig {\n db: any;\n tables?: {\n users?: typeof legacyUsers;\n userSessions?: typeof legacyUserSessions;\n verificationCodes?: typeof legacyVerificationCodes;\n };\n saltRounds?: number;\n sessionDurationMs?: number;\n}\n\ntype LegacyAuthTables = {\n users: NonNullable<NonNullable<LegacyAuthDbConfig['tables']>['users']>;\n userSessions: NonNullable<NonNullable<LegacyAuthDbConfig['tables']>['userSessions']>;\n verificationCodes: NonNullable<NonNullable<LegacyAuthDbConfig['tables']>['verificationCodes']>;\n};\n\n/**\n * 认证数据库服务类(Legacy:手机号 + Cookie 会话)\n */\nexport class LegacyAuthDbService implements AuthService {\n private db: LegacyAuthDbConfig['db'];\n private tables: LegacyAuthTables;\n private saltRounds: number;\n private sessionDurationMs: number;\n\n constructor(config: LegacyAuthDbConfig) {\n this.db = config.db;\n this.tables = {\n users: config.tables?.users ?? legacyUsers,\n userSessions: config.tables?.userSessions ?? legacyUserSessions,\n verificationCodes: config.tables?.verificationCodes ?? legacyVerificationCodes,\n };\n this.saltRounds = config.saltRounds || 12;\n this.sessionDurationMs = config.sessionDurationMs || 30 * 24 * 60 * 60 * 1000;\n }\n\n async verifyPassword(phone: string, password: string): Promise<User | null> {\n try {\n const result = await this.db\n .select()\n .from(this.tables.users)\n .where(eq(this.tables.users.phone, phone))\n .limit(1);\n\n const user = result[0];\n if (!user) return null;\n if (!user.isActive) return null;\n\n const isValid = await bcrypt.compare(password, user.password);\n if (!isValid) return null;\n\n const { password: _, ...userWithoutPassword } = user;\n return userWithoutPassword as User;\n } catch (error) {\n console.error('💥 [LegacyAuthDbService] 密码验证异常:', error);\n return null;\n }\n }\n\n async createUser(phone: string, password: string, name?: string): Promise<User> {\n try {\n const existingUser = await this.db\n .select()\n .from(this.tables.users)\n .where(eq(this.tables.users.phone, phone))\n .limit(1);\n if (existingUser.length > 0) {\n throw new Error('用户已存在');\n }\n\n const hashedPassword = await bcrypt.hash(password, this.saltRounds);\n const result = await this.db\n .insert(this.tables.users)\n .values({\n phone,\n password: hashedPassword,\n name: name || null,\n isActive: true,\n role: 'user',\n })\n .returning();\n\n const createdUser = result[0];\n if (!createdUser) {\n throw new Error('创建用户失败: 未返回用户记录');\n }\n const { password: _, ...userWithoutPassword } = createdUser;\n return userWithoutPassword as User;\n } catch (error) {\n console.error('创建用户失败:', error);\n throw new Error('创建用户失败');\n }\n }\n\n async updateLastLogin(userId: number): Promise<void> {\n try {\n await this.db\n .update(this.tables.users)\n .set({ lastLoginAt: new Date(), updatedAt: new Date() })\n .where(eq(this.tables.users.id, userId));\n } catch (error) {\n console.error('更新最后登录时间失败:', error);\n throw new Error('更新最后登录时间失败');\n }\n }\n\n async createSession(userId: number): Promise<UserSession> {\n try {\n const sessionToken = randomBytes(32).toString('hex');\n const expiresAt = new Date(Date.now() + this.sessionDurationMs);\n\n const result = await this.db\n .insert(this.tables.userSessions)\n .values({\n userId,\n sessionToken,\n expiresAt,\n })\n .returning();\n\n const session = result[0];\n if (!session) {\n throw new Error('创建会话失败: 未返回会话记录');\n }\n return session;\n } catch (error) {\n console.error('创建会话失败:', error);\n throw new Error('创建会话失败');\n }\n }\n\n async validateSession(sessionToken: string): Promise<SessionValidation> {\n try {\n const now = new Date();\n const result = await this.db\n .select({\n session: this.tables.userSessions,\n user: this.tables.users,\n })\n .from(this.tables.userSessions)\n .innerJoin(this.tables.users, eq(this.tables.userSessions.userId, this.tables.users.id))\n .where(\n and(\n eq(this.tables.userSessions.sessionToken, sessionToken),\n gt(this.tables.userSessions.expiresAt, now),\n eq(this.tables.users.isActive, true)\n )\n )\n .limit(1);\n\n const row = result[0];\n if (!row) {\n return { valid: false };\n }\n\n const { password: _, ...userWithoutPassword } = row.user;\n return { valid: true, user: userWithoutPassword as User };\n } catch (error) {\n console.error('会话验证失败:', error);\n return { valid: false };\n }\n }\n\n async deleteSession(sessionToken: string): Promise<void> {\n try {\n await this.db\n .delete(this.tables.userSessions)\n .where(eq(this.tables.userSessions.sessionToken, sessionToken));\n } catch (error) {\n console.error('删除会话失败:', error);\n throw new Error('删除会话失败');\n }\n }\n\n async deleteUserSessions(userId: number): Promise<void> {\n try {\n await this.db\n .delete(this.tables.userSessions)\n .where(eq(this.tables.userSessions.userId, userId));\n } catch (error) {\n console.error('删除用户会话失败:', error);\n throw new Error('删除用户会话失败');\n }\n }\n\n async cleanupExpiredSessions(): Promise<void> {\n try {\n const now = new Date();\n await this.db\n .delete(this.tables.userSessions)\n .where(lt(this.tables.userSessions.expiresAt, now));\n } catch (error) {\n console.error('清理过期会话失败:', error);\n }\n }\n\n async getUserByPhone(phone: string): Promise<User | null> {\n try {\n const result = await this.db\n .select()\n .from(this.tables.users)\n .where(eq(this.tables.users.phone, phone))\n .limit(1);\n\n const user = result[0];\n if (!user) return null;\n const { password: _, ...userWithoutPassword } = user;\n return userWithoutPassword as User;\n } catch (error) {\n console.error('查询用户失败:', error);\n throw error;\n }\n }\n\n async sendVerificationCode(phone: string): Promise<string> {\n try {\n await this.cleanupExpiredVerificationCodes();\n\n const existingCode = await this.db\n .select()\n .from(this.tables.verificationCodes)\n .where(\n and(\n eq(this.tables.verificationCodes.phone, phone),\n eq(this.tables.verificationCodes.used, false),\n gt(this.tables.verificationCodes.expiresAt, new Date())\n )\n )\n .limit(1);\n\n const currentCode = existingCode[0];\n if (currentCode) {\n const timeDiff = Date.now() - currentCode.createdAt.getTime();\n if (timeDiff < 60 * 1000) {\n throw new Error('验证码发送过于频繁,请稍后再试');\n }\n }\n\n const code = Math.floor(100000 + Math.random() * 900000).toString();\n\n await this.db\n .insert(this.tables.verificationCodes)\n .values({\n phone,\n code,\n expiresAt: new Date(Date.now() + 10 * 60 * 1000),\n })\n .returning();\n\n return code;\n } catch (error) {\n console.error('发送验证码失败:', error);\n throw error;\n }\n }\n\n async verifyCode(phone: string, code: string): Promise<boolean> {\n try {\n const result = await this.db\n .select()\n .from(this.tables.verificationCodes)\n .where(\n and(\n eq(this.tables.verificationCodes.phone, phone),\n eq(this.tables.verificationCodes.code, code),\n eq(this.tables.verificationCodes.used, false),\n gt(this.tables.verificationCodes.expiresAt, new Date())\n )\n )\n .limit(1);\n\n const verificationCode = result[0];\n if (!verificationCode) return false;\n\n await this.db\n .update(this.tables.verificationCodes)\n .set({ used: true })\n .where(eq(this.tables.verificationCodes.id, verificationCode.id));\n\n return true;\n } catch (error) {\n console.error('验证码验证失败:', error);\n throw error;\n }\n }\n\n async resetPassword(phone: string, newPassword: string): Promise<void> {\n try {\n const hashedPassword = await bcrypt.hash(newPassword, this.saltRounds);\n await this.db\n .update(this.tables.users)\n .set({ password: hashedPassword })\n .where(eq(this.tables.users.phone, phone));\n } catch (error) {\n console.error('密码重置失败:', error);\n throw error;\n }\n }\n\n async cleanupExpiredVerificationCodes(): Promise<void> {\n try {\n const now = new Date();\n await this.db\n .delete(this.tables.verificationCodes)\n .where(lt(this.tables.verificationCodes.expiresAt, now))\n .returning();\n } catch (error) {\n console.error('清理过期验证码失败:', error);\n }\n }\n}\n","import type { User } from '../types';\n\n/**\n * 验证手机号格式\n */\nexport function validatePhoneNumber(phone: string): boolean {\n return /^1[3-9]\\d{9}$/.test(phone);\n}\n\n/**\n * 验证密码强度(可扩展)\n */\nexport function validatePassword(password: string): { valid: boolean; message?: string } {\n if (!password) {\n return { valid: false, message: '密码不能为空' };\n }\n \n if (password.length < 6) {\n return { valid: false, message: '密码长度至少6位' };\n }\n \n return { valid: true };\n}\n\n/**\n * 生成安全的会话令牌\n */\nexport function generateSessionToken(): string {\n // 在实际环境中,应该使用更安全的随机数生成\n return Math.random().toString(36).substring(2) + \n Date.now().toString(36) + \n Math.random().toString(36).substring(2);\n}\n\n/**\n * 检查用户是否为管理员\n */\nexport function isAdmin(user: User | null): boolean {\n return user?.role === 'admin';\n}\n\n/**\n * 检查用户是否处于活跃状态\n */\nexport function isActiveUser(user: User | null): boolean {\n return user?.isActive === true;\n}\n\n/**\n * 格式化用户显示名称\n */\nexport function getUserDisplayName(user: User): string {\n return user.name || user.phone || '未知用户';\n}\n\n/**\n * 计算会话过期时间\n */\nexport function calculateSessionExpiry(days: number = 30): Date {\n return new Date(Date.now() + days * 24 * 60 * 60 * 1000);\n}\n\n/**\n * 检查会话是否过期\n */\nexport function isSessionExpired(expiresAt: Date): boolean {\n return new Date() > new Date(expiresAt);\n} ","import { NextRequest, NextResponse } from 'next/server';\nimport { validatePhoneNumber, validatePassword } from '../utils/authUtils';\nimport type { LegacyLoginRouteConfig, LegacyApiResponse } from './types';\n\nexport function createLegacyLoginHandler(config: LegacyLoginRouteConfig) {\n return async (request: NextRequest) => {\n try {\n const { phone, password } = await request.json();\n\n if (!phone || !password) {\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: '请输入手机号和密码' },\n { status: 400 }\n );\n }\n\n if (!validatePhoneNumber(phone)) {\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: '请输入正确的手机号格式' },\n { status: 400 }\n );\n }\n\n const passwordValidation = validatePassword(password);\n if (!passwordValidation.valid) {\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: passwordValidation.message || '密码格式错误' },\n { status: 400 }\n );\n }\n\n const user = await config.authService.verifyPassword(phone, password);\n if (!user) {\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: '手机号或密码错误' },\n { status: 401 }\n );\n }\n\n const session = await config.authService.createSession(user.id);\n await config.authService.updateLastLogin(user.id);\n\n const response = NextResponse.json<LegacyApiResponse>({\n success: true,\n message: '登录成功',\n data: { user, sessionToken: session.sessionToken },\n });\n\n const cookieOptions = {\n name: config.cookieOptions?.name || 'session_token',\n httpOnly: config.cookieOptions?.httpOnly !== false,\n secure: config.cookieOptions?.secure || false,\n sameSite: config.cookieOptions?.sameSite || 'lax',\n maxAge: config.cookieOptions?.maxAge || 30 * 24 * 60 * 60,\n path: config.cookieOptions?.path || '/',\n };\n\n response.cookies.set(cookieOptions.name, session.sessionToken, {\n httpOnly: cookieOptions.httpOnly,\n secure: cookieOptions.secure,\n sameSite: cookieOptions.sameSite,\n maxAge: cookieOptions.maxAge,\n path: cookieOptions.path,\n });\n\n return response;\n } catch (error) {\n console.error('💥 [LegacyLogin] 登录异常:', error);\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: '登录失败,请稍后重试' },\n { status: 500 }\n );\n }\n };\n}\n","import { NextRequest, NextResponse } from 'next/server';\nimport { validatePhoneNumber, validatePassword } from '../utils/authUtils';\nimport type { LegacyRegisterRouteConfig, LegacyApiResponse } from './types';\n\nexport function createLegacyRegisterHandler(config: LegacyRegisterRouteConfig) {\n return async (request: NextRequest) => {\n try {\n const { phone, password, name } = await request.json();\n\n if (!phone || !password) {\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: '请输入手机号和密码' },\n { status: 400 }\n );\n }\n\n if (!validatePhoneNumber(phone)) {\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: '请输入正确的手机号格式' },\n { status: 400 }\n );\n }\n\n const passwordValidation = validatePassword(password);\n if (!passwordValidation.valid) {\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: passwordValidation.message || '密码格式错误' },\n { status: 400 }\n );\n }\n\n const user = await config.authService.createUser(phone, password, name);\n const session = await config.authService.createSession(user.id);\n await config.authService.updateLastLogin(user.id);\n\n const response = NextResponse.json<LegacyApiResponse>({\n success: true,\n message: '注册成功',\n data: { user, sessionToken: session.sessionToken },\n });\n\n const cookieOptions = {\n name: config.cookieOptions?.name || 'session_token',\n httpOnly: config.cookieOptions?.httpOnly !== false,\n secure: config.cookieOptions?.secure || false,\n sameSite: config.cookieOptions?.sameSite || 'lax',\n maxAge: config.cookieOptions?.maxAge || 30 * 24 * 60 * 60,\n path: config.cookieOptions?.path || '/',\n };\n\n response.cookies.set(cookieOptions.name, session.sessionToken, {\n httpOnly: cookieOptions.httpOnly,\n secure: cookieOptions.secure,\n sameSite: cookieOptions.sameSite,\n maxAge: cookieOptions.maxAge,\n path: cookieOptions.path,\n });\n\n return response;\n } catch (error) {\n console.error('💥 [LegacyRegister] 注册异常:', error);\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: '注册失败,请稍后重试' },\n { status: 500 }\n );\n }\n };\n}\n","import { NextRequest, NextResponse } from 'next/server';\nimport type { LegacyLogoutRouteConfig, LegacyApiResponse } from './types';\n\nexport function createLegacyLogoutHandler(config: LegacyLogoutRouteConfig) {\n return async (request: NextRequest) => {\n try {\n const cookieName = config.cookieOptions?.name || 'session_token';\n const sessionToken = request.cookies.get(cookieName)?.value;\n\n if (sessionToken) {\n await config.authService.deleteSession(sessionToken);\n }\n\n const response = NextResponse.json<LegacyApiResponse>({\n success: true,\n message: '登出成功',\n });\n\n response.cookies.set(cookieName, '', {\n httpOnly: true,\n secure: config.cookieOptions?.secure || false,\n sameSite: config.cookieOptions?.sameSite || 'lax',\n maxAge: 0,\n path: config.cookieOptions?.path || '/',\n });\n\n return response;\n } catch (error) {\n console.error('💥 [LegacyLogout] 登出异常:', error);\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: '登出失败,请稍后重试' },\n { status: 500 }\n );\n }\n };\n}\n","import { NextRequest, NextResponse } from 'next/server';\nimport type { LegacyValidateRouteConfig, LegacyApiResponse } from './types';\n\nexport function createLegacyValidateHandler(config: LegacyValidateRouteConfig) {\n return async (request: NextRequest) => {\n try {\n const cookieName = config.cookieOptions?.name || 'session_token';\n const sessionToken = request.cookies.get(cookieName)?.value;\n\n if (!sessionToken) {\n return NextResponse.json<LegacyApiResponse>(\n { success: true, data: { valid: false } },\n { status: 200 }\n );\n }\n\n const validation = await config.authService.validateSession(sessionToken);\n return NextResponse.json<LegacyApiResponse>({\n success: true,\n data: validation,\n });\n } catch (error) {\n console.error('💥 [LegacyValidate] 验证异常:', error);\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: '验证失败' },\n { status: 500 }\n );\n }\n };\n}\n","import { NextRequest, NextResponse } from 'next/server';\nimport { validatePhoneNumber } from '../utils/authUtils';\nimport type { LegacySendVerificationCodeConfig, LegacyApiResponse } from './types';\n\nexport function createLegacySendVerificationCodeHandler(config: LegacySendVerificationCodeConfig) {\n return async (request: NextRequest) => {\n try {\n const { phone } = await request.json();\n if (!validatePhoneNumber(phone)) {\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: '请输入正确的手机号格式' },\n { status: 400 }\n );\n }\n\n const user = await config.authService.getUserByPhone(phone);\n if (!user) {\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: '该手机号未注册' },\n { status: 404 }\n );\n }\n\n await config.authService.sendVerificationCode(phone);\n return NextResponse.json<LegacyApiResponse>({\n success: true,\n message: '验证码已发送',\n });\n } catch (error) {\n console.error('💥 [LegacySendVerificationCode] 发送异常:', error);\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: '发送验证码失败,请稍后重试' },\n { status: 500 }\n );\n }\n };\n}\n","import { NextRequest, NextResponse } from 'next/server';\nimport { validatePhoneNumber, validatePassword } from '../utils/authUtils';\nimport type { LegacyResetPasswordConfig, LegacyApiResponse } from './types';\n\nexport function createLegacyResetPasswordHandler(config: LegacyResetPasswordConfig) {\n return async (request: NextRequest) => {\n try {\n const { phone, newPassword, verificationCode } = await request.json();\n\n if (!validatePhoneNumber(phone)) {\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: '请输入正确的手机号格式' },\n { status: 400 }\n );\n }\n\n const passwordValidation = validatePassword(newPassword);\n if (!passwordValidation.valid) {\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: passwordValidation.message || '密码格式错误' },\n { status: 400 }\n );\n }\n\n const isValidCode = await config.authService.verifyCode(phone, verificationCode);\n if (!isValidCode) {\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: '验证码无效或已过期' },\n { status: 400 }\n );\n }\n\n await config.authService.resetPassword(phone, newPassword);\n return NextResponse.json<LegacyApiResponse>({\n success: true,\n message: '密码重置成功',\n });\n } catch (error) {\n console.error('💥 [LegacyResetPassword] 重置异常:', error);\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: '重置密码失败,请稍后重试' },\n { status: 500 }\n );\n }\n };\n}\n","import type { NextRequest } from 'next/server';\nimport type { User } from './types';\nimport type { LegacyAuthDbService } from './services';\n\nexport interface LegacyServerConfig {\n cookieName?: string;\n}\n\nexport function createLegacyValidateApiAuth(\n authService: LegacyAuthDbService,\n config: LegacyServerConfig = {}\n) {\n const cookieName = config.cookieName || 'session_token';\n return async (request: NextRequest): Promise<User | null> => {\n try {\n const sessionToken = request.cookies.get(cookieName)?.value;\n if (!sessionToken) return null;\n\n const validation = await authService.validateSession(sessionToken);\n return validation.valid && validation.user ? validation.user : null;\n } catch (error) {\n console.error('💥 [LegacyAuth] API权限验证异常:', error);\n return null;\n }\n };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../../src/auth/legacy/schema/index.ts","../../../../src/auth/legacy/services/authDbService.ts","../../../../src/auth/legacy/utils/authUtils.ts","../../../../src/auth/legacy/routes/login.ts","../../../../src/auth/legacy/routes/register.ts","../../../../src/auth/legacy/routes/logout.ts","../../../../src/auth/legacy/routes/validate.ts","../../../../src/auth/legacy/routes/sendVerificationCode.ts","../../../../src/auth/legacy/routes/resetPassword.ts","../../../../src/auth/legacy/server.ts"],"names":["NextResponse"],"mappings":"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","file":"index.mjs","sourcesContent":["import { pgTable, serial, text, timestamp, boolean, varchar, integer } from 'drizzle-orm/pg-core';\nimport { relations } from 'drizzle-orm';\n\n// 用户表\nexport const legacyUsers = pgTable('users', {\n id: serial('id').primaryKey(),\n phone: varchar('phone', { length: 20 }).notNull().unique(),\n password: varchar('password', { length: 255 }).notNull(),\n name: varchar('name', { length: 100 }),\n email: varchar('email', { length: 255 }),\n isActive: boolean('is_active').notNull().default(true),\n role: varchar('role', { length: 20 }).notNull().default('user'),\n lastLoginAt: timestamp('last_login_at'),\n createdAt: timestamp('created_at').defaultNow().notNull(),\n updatedAt: timestamp('updated_at').defaultNow().notNull(),\n});\n\n// 用户会话表\nexport const legacyUserSessions = pgTable('user_sessions', {\n id: serial('id').primaryKey(),\n userId: integer('user_id').notNull().references(() => legacyUsers.id, { onDelete: 'cascade' }),\n sessionToken: varchar('session_token', { length: 255 }).notNull().unique(),\n expiresAt: timestamp('expires_at').notNull(),\n createdAt: timestamp('created_at').defaultNow().notNull(),\n});\n\n// 验证码表\nexport const legacyVerificationCodes = pgTable('verification_codes', {\n id: serial('id').primaryKey(),\n phone: text('phone').notNull(),\n code: text('code').notNull(),\n expiresAt: timestamp('expires_at').notNull(),\n createdAt: timestamp('created_at').defaultNow().notNull(),\n used: boolean('used').default(false).notNull(),\n});\n\n// 关系定义\nexport const legacyUsersRelations = relations(legacyUsers, ({ many }) => ({\n sessions: many(legacyUserSessions),\n}));\n\nexport const legacyUserSessionsRelations = relations(legacyUserSessions, ({ one }) => ({\n user: one(legacyUsers, {\n fields: [legacyUserSessions.userId],\n references: [legacyUsers.id],\n }),\n}));\n","import { randomBytes } from 'crypto';\nimport { eq, and, gt, lt } from 'drizzle-orm';\nimport bcrypt from 'bcryptjs';\nimport type { AuthService, SessionValidation, User, UserSession } from '../types';\nimport { legacyUsers, legacyUserSessions, legacyVerificationCodes } from '../schema';\n\nexport interface LegacyAuthDbConfig {\n db: any;\n tables?: {\n users?: typeof legacyUsers;\n userSessions?: typeof legacyUserSessions;\n verificationCodes?: typeof legacyVerificationCodes;\n };\n saltRounds?: number;\n sessionDurationMs?: number;\n}\n\ntype LegacyAuthTables = {\n users: NonNullable<NonNullable<LegacyAuthDbConfig['tables']>['users']>;\n userSessions: NonNullable<NonNullable<LegacyAuthDbConfig['tables']>['userSessions']>;\n verificationCodes: NonNullable<NonNullable<LegacyAuthDbConfig['tables']>['verificationCodes']>;\n};\n\n/**\n * 认证数据库服务类(Legacy:手机号 + Cookie 会话)\n */\nexport class LegacyAuthDbService implements AuthService {\n private db: LegacyAuthDbConfig['db'];\n private tables: LegacyAuthTables;\n private saltRounds: number;\n private sessionDurationMs: number;\n\n constructor(config: LegacyAuthDbConfig) {\n this.db = config.db;\n this.tables = {\n users: config.tables?.users ?? legacyUsers,\n userSessions: config.tables?.userSessions ?? legacyUserSessions,\n verificationCodes: config.tables?.verificationCodes ?? legacyVerificationCodes,\n };\n this.saltRounds = config.saltRounds || 12;\n this.sessionDurationMs = config.sessionDurationMs || 30 * 24 * 60 * 60 * 1000;\n }\n\n async verifyPassword(phone: string, password: string): Promise<User | null> {\n try {\n const result = await this.db\n .select()\n .from(this.tables.users)\n .where(eq(this.tables.users.phone, phone))\n .limit(1);\n\n const user = result[0];\n if (!user) return null;\n if (!user.isActive) return null;\n\n const isValid = await bcrypt.compare(password, user.password);\n if (!isValid) return null;\n\n const { password: _, ...userWithoutPassword } = user;\n return userWithoutPassword as User;\n } catch (error) {\n console.error('💥 [LegacyAuthDbService] 密码验证异常:', error);\n return null;\n }\n }\n\n async createUser(phone: string, password: string, name?: string): Promise<User> {\n try {\n const existingUser = await this.db\n .select()\n .from(this.tables.users)\n .where(eq(this.tables.users.phone, phone))\n .limit(1);\n if (existingUser.length > 0) {\n throw new Error('用户已存在');\n }\n\n const hashedPassword = await bcrypt.hash(password, this.saltRounds);\n const result = await this.db\n .insert(this.tables.users)\n .values({\n phone,\n password: hashedPassword,\n name: name || null,\n isActive: true,\n role: 'user',\n })\n .returning();\n\n const createdUser = result[0];\n if (!createdUser) {\n throw new Error('创建用户失败: 未返回用户记录');\n }\n const { password: _, ...userWithoutPassword } = createdUser;\n return userWithoutPassword as User;\n } catch (error) {\n console.error('创建用户失败:', error);\n throw new Error('创建用户失败');\n }\n }\n\n async updateLastLogin(userId: number): Promise<void> {\n try {\n await this.db\n .update(this.tables.users)\n .set({ lastLoginAt: new Date(), updatedAt: new Date() })\n .where(eq(this.tables.users.id, userId));\n } catch (error) {\n console.error('更新最后登录时间失败:', error);\n throw new Error('更新最后登录时间失败');\n }\n }\n\n async createSession(userId: number): Promise<UserSession> {\n try {\n const sessionToken = randomBytes(32).toString('hex');\n const expiresAt = new Date(Date.now() + this.sessionDurationMs);\n\n const result = await this.db\n .insert(this.tables.userSessions)\n .values({\n userId,\n sessionToken,\n expiresAt,\n })\n .returning();\n\n const session = result[0];\n if (!session) {\n throw new Error('创建会话失败: 未返回会话记录');\n }\n return session;\n } catch (error) {\n console.error('创建会话失败:', error);\n throw new Error('创建会话失败');\n }\n }\n\n async validateSession(sessionToken: string): Promise<SessionValidation> {\n try {\n const now = new Date();\n const result = await this.db\n .select({\n session: this.tables.userSessions,\n user: this.tables.users,\n })\n .from(this.tables.userSessions)\n .innerJoin(this.tables.users, eq(this.tables.userSessions.userId, this.tables.users.id))\n .where(\n and(\n eq(this.tables.userSessions.sessionToken, sessionToken),\n gt(this.tables.userSessions.expiresAt, now),\n eq(this.tables.users.isActive, true)\n )\n )\n .limit(1);\n\n const row = result[0];\n if (!row) {\n return { valid: false };\n }\n\n const { password: _, ...userWithoutPassword } = row.user;\n return { valid: true, user: userWithoutPassword as User };\n } catch (error) {\n console.error('会话验证失败:', error);\n return { valid: false };\n }\n }\n\n async deleteSession(sessionToken: string): Promise<void> {\n try {\n await this.db\n .delete(this.tables.userSessions)\n .where(eq(this.tables.userSessions.sessionToken, sessionToken));\n } catch (error) {\n console.error('删除会话失败:', error);\n throw new Error('删除会话失败');\n }\n }\n\n async deleteUserSessions(userId: number): Promise<void> {\n try {\n await this.db\n .delete(this.tables.userSessions)\n .where(eq(this.tables.userSessions.userId, userId));\n } catch (error) {\n console.error('删除用户会话失败:', error);\n throw new Error('删除用户会话失败');\n }\n }\n\n async cleanupExpiredSessions(): Promise<void> {\n try {\n const now = new Date();\n await this.db\n .delete(this.tables.userSessions)\n .where(lt(this.tables.userSessions.expiresAt, now));\n } catch (error) {\n console.error('清理过期会话失败:', error);\n }\n }\n\n async getUserByPhone(phone: string): Promise<User | null> {\n try {\n const result = await this.db\n .select()\n .from(this.tables.users)\n .where(eq(this.tables.users.phone, phone))\n .limit(1);\n\n const user = result[0];\n if (!user) return null;\n const { password: _, ...userWithoutPassword } = user;\n return userWithoutPassword as User;\n } catch (error) {\n console.error('查询用户失败:', error);\n throw error;\n }\n }\n\n async sendVerificationCode(phone: string): Promise<string> {\n try {\n await this.cleanupExpiredVerificationCodes();\n\n const existingCode = await this.db\n .select()\n .from(this.tables.verificationCodes)\n .where(\n and(\n eq(this.tables.verificationCodes.phone, phone),\n eq(this.tables.verificationCodes.used, false),\n gt(this.tables.verificationCodes.expiresAt, new Date())\n )\n )\n .limit(1);\n\n const currentCode = existingCode[0];\n if (currentCode) {\n const timeDiff = Date.now() - currentCode.createdAt.getTime();\n if (timeDiff < 60 * 1000) {\n throw new Error('验证码发送过于频繁,请稍后再试');\n }\n }\n\n const code = Math.floor(100000 + Math.random() * 900000).toString();\n\n await this.db\n .insert(this.tables.verificationCodes)\n .values({\n phone,\n code,\n expiresAt: new Date(Date.now() + 10 * 60 * 1000),\n })\n .returning();\n\n return code;\n } catch (error) {\n console.error('发送验证码失败:', error);\n throw error;\n }\n }\n\n async verifyCode(phone: string, code: string): Promise<boolean> {\n try {\n const result = await this.db\n .select()\n .from(this.tables.verificationCodes)\n .where(\n and(\n eq(this.tables.verificationCodes.phone, phone),\n eq(this.tables.verificationCodes.code, code),\n eq(this.tables.verificationCodes.used, false),\n gt(this.tables.verificationCodes.expiresAt, new Date())\n )\n )\n .limit(1);\n\n const verificationCode = result[0];\n if (!verificationCode) return false;\n\n await this.db\n .update(this.tables.verificationCodes)\n .set({ used: true })\n .where(eq(this.tables.verificationCodes.id, verificationCode.id));\n\n return true;\n } catch (error) {\n console.error('验证码验证失败:', error);\n throw error;\n }\n }\n\n async resetPassword(phone: string, newPassword: string): Promise<void> {\n try {\n const hashedPassword = await bcrypt.hash(newPassword, this.saltRounds);\n await this.db\n .update(this.tables.users)\n .set({ password: hashedPassword })\n .where(eq(this.tables.users.phone, phone));\n } catch (error) {\n console.error('密码重置失败:', error);\n throw error;\n }\n }\n\n async cleanupExpiredVerificationCodes(): Promise<void> {\n try {\n const now = new Date();\n await this.db\n .delete(this.tables.verificationCodes)\n .where(lt(this.tables.verificationCodes.expiresAt, now))\n .returning();\n } catch (error) {\n console.error('清理过期验证码失败:', error);\n }\n }\n}\n","import type { User } from '../types';\n\n/**\n * 验证手机号格式\n */\nexport function validatePhoneNumber(phone: string): boolean {\n return /^1[3-9]\\d{9}$/.test(phone);\n}\n\n/**\n * 验证密码强度(可扩展)\n */\nexport function validatePassword(password: string): { valid: boolean; message?: string } {\n if (!password) {\n return { valid: false, message: '密码不能为空' };\n }\n \n if (password.length < 6) {\n return { valid: false, message: '密码长度至少6位' };\n }\n \n return { valid: true };\n}\n\n/**\n * 生成安全的会话令牌\n */\nexport function generateSessionToken(): string {\n // 在实际环境中,应该使用更安全的随机数生成\n return Math.random().toString(36).substring(2) + \n Date.now().toString(36) + \n Math.random().toString(36).substring(2);\n}\n\n/**\n * 检查用户是否为管理员\n */\nexport function isAdmin(user: User | null): boolean {\n return user?.role === 'admin';\n}\n\n/**\n * 检查用户是否处于活跃状态\n */\nexport function isActiveUser(user: User | null): boolean {\n return user?.isActive === true;\n}\n\n/**\n * 格式化用户显示名称\n */\nexport function getUserDisplayName(user: User): string {\n return user.name || user.phone || '未知用户';\n}\n\n/**\n * 计算会话过期时间\n */\nexport function calculateSessionExpiry(days: number = 30): Date {\n return new Date(Date.now() + days * 24 * 60 * 60 * 1000);\n}\n\n/**\n * 检查会话是否过期\n */\nexport function isSessionExpired(expiresAt: Date): boolean {\n return new Date() > new Date(expiresAt);\n} ","import { NextRequest, NextResponse } from 'next/server';\nimport { validatePhoneNumber, validatePassword } from '../utils/authUtils';\nimport type { LegacyLoginRouteConfig, LegacyApiResponse } from './types';\n\nexport function createLegacyLoginHandler(config: LegacyLoginRouteConfig) {\n return async (request: NextRequest) => {\n try {\n const { phone, password } = await request.json();\n\n if (!phone || !password) {\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: '请输入手机号和密码' },\n { status: 400 }\n );\n }\n\n if (!validatePhoneNumber(phone)) {\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: '请输入正确的手机号格式' },\n { status: 400 }\n );\n }\n\n const passwordValidation = validatePassword(password);\n if (!passwordValidation.valid) {\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: passwordValidation.message || '密码格式错误' },\n { status: 400 }\n );\n }\n\n const user = await config.authService.verifyPassword(phone, password);\n if (!user) {\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: '手机号或密码错误' },\n { status: 401 }\n );\n }\n\n const session = await config.authService.createSession(user.id);\n await config.authService.updateLastLogin(user.id);\n\n const response = NextResponse.json<LegacyApiResponse>({\n success: true,\n message: '登录成功',\n user,\n sessionToken: session.sessionToken,\n data: { user, sessionToken: session.sessionToken },\n });\n\n const cookieOptions = {\n name: config.cookieOptions?.name || 'session_token',\n httpOnly: config.cookieOptions?.httpOnly !== false,\n secure: config.cookieOptions?.secure || false,\n sameSite: config.cookieOptions?.sameSite || 'lax',\n maxAge: config.cookieOptions?.maxAge || 30 * 24 * 60 * 60,\n path: config.cookieOptions?.path || '/',\n };\n\n response.cookies.set(cookieOptions.name, session.sessionToken, {\n httpOnly: cookieOptions.httpOnly,\n secure: cookieOptions.secure,\n sameSite: cookieOptions.sameSite,\n maxAge: cookieOptions.maxAge,\n path: cookieOptions.path,\n });\n\n return response;\n } catch (error) {\n console.error('💥 [LegacyLogin] 登录异常:', error);\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: '登录失败,请稍后重试' },\n { status: 500 }\n );\n }\n };\n}\n","import { NextRequest, NextResponse } from 'next/server';\nimport { validatePhoneNumber, validatePassword } from '../utils/authUtils';\nimport type { LegacyRegisterRouteConfig, LegacyApiResponse } from './types';\n\nexport function createLegacyRegisterHandler(config: LegacyRegisterRouteConfig) {\n return async (request: NextRequest) => {\n try {\n const { phone, password, name } = await request.json();\n\n if (!phone || !password) {\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: '请输入手机号和密码' },\n { status: 400 }\n );\n }\n\n if (!validatePhoneNumber(phone)) {\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: '请输入正确的手机号格式' },\n { status: 400 }\n );\n }\n\n const passwordValidation = validatePassword(password);\n if (!passwordValidation.valid) {\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: passwordValidation.message || '密码格式错误' },\n { status: 400 }\n );\n }\n\n const user = await config.authService.createUser(phone, password, name);\n const session = await config.authService.createSession(user.id);\n await config.authService.updateLastLogin(user.id);\n\n const response = NextResponse.json<LegacyApiResponse>({\n success: true,\n message: '注册成功',\n user,\n sessionToken: session.sessionToken,\n data: { user, sessionToken: session.sessionToken },\n });\n\n const cookieOptions = {\n name: config.cookieOptions?.name || 'session_token',\n httpOnly: config.cookieOptions?.httpOnly !== false,\n secure: config.cookieOptions?.secure || false,\n sameSite: config.cookieOptions?.sameSite || 'lax',\n maxAge: config.cookieOptions?.maxAge || 30 * 24 * 60 * 60,\n path: config.cookieOptions?.path || '/',\n };\n\n response.cookies.set(cookieOptions.name, session.sessionToken, {\n httpOnly: cookieOptions.httpOnly,\n secure: cookieOptions.secure,\n sameSite: cookieOptions.sameSite,\n maxAge: cookieOptions.maxAge,\n path: cookieOptions.path,\n });\n\n return response;\n } catch (error) {\n console.error('💥 [LegacyRegister] 注册异常:', error);\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: '注册失败,请稍后重试' },\n { status: 500 }\n );\n }\n };\n}\n","import { NextRequest, NextResponse } from 'next/server';\nimport type { LegacyLogoutRouteConfig, LegacyApiResponse } from './types';\n\nexport function createLegacyLogoutHandler(config: LegacyLogoutRouteConfig) {\n return async (request: NextRequest) => {\n try {\n const cookieName = config.cookieOptions?.name || 'session_token';\n const sessionToken = request.cookies.get(cookieName)?.value;\n\n if (sessionToken) {\n await config.authService.deleteSession(sessionToken);\n }\n\n const response = NextResponse.json<LegacyApiResponse>({\n success: true,\n message: '登出成功',\n });\n\n response.cookies.set(cookieName, '', {\n httpOnly: true,\n secure: config.cookieOptions?.secure || false,\n sameSite: config.cookieOptions?.sameSite || 'lax',\n maxAge: 0,\n path: config.cookieOptions?.path || '/',\n });\n\n return response;\n } catch (error) {\n console.error('💥 [LegacyLogout] 登出异常:', error);\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: '登出失败,请稍后重试' },\n { status: 500 }\n );\n }\n };\n}\n","import { NextRequest, NextResponse } from 'next/server';\nimport type { LegacyValidateRouteConfig, LegacyApiResponse } from './types';\n\nexport function createLegacyValidateHandler(config: LegacyValidateRouteConfig) {\n return async (request: NextRequest) => {\n try {\n const cookieName = config.cookieOptions?.name || 'session_token';\n const sessionToken = request.cookies.get(cookieName)?.value;\n\n if (!sessionToken) {\n return NextResponse.json<LegacyApiResponse>(\n { success: true, valid: false, user: null, data: { valid: false, user: null } },\n { status: 200 }\n );\n }\n\n const validation = await config.authService.validateSession(sessionToken);\n return NextResponse.json<LegacyApiResponse>({\n success: true,\n valid: validation.valid,\n user: validation.user,\n message: validation.valid ? '会话有效' : '会话无效',\n data: validation,\n });\n } catch (error) {\n console.error('💥 [LegacyValidate] 验证异常:', error);\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: '验证失败' },\n { status: 500 }\n );\n }\n };\n}\n","import { NextRequest, NextResponse } from 'next/server';\nimport { validatePhoneNumber } from '../utils/authUtils';\nimport type { LegacySendVerificationCodeConfig, LegacyApiResponse } from './types';\n\nexport function createLegacySendVerificationCodeHandler(config: LegacySendVerificationCodeConfig) {\n return async (request: NextRequest) => {\n try {\n const { phone } = await request.json();\n if (!validatePhoneNumber(phone)) {\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: '请输入正确的手机号格式' },\n { status: 400 }\n );\n }\n\n const user = await config.authService.getUserByPhone(phone);\n if (!user) {\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: '该手机号未注册' },\n { status: 404 }\n );\n }\n\n await config.authService.sendVerificationCode(phone);\n return NextResponse.json<LegacyApiResponse>({\n success: true,\n message: '验证码已发送',\n });\n } catch (error) {\n console.error('💥 [LegacySendVerificationCode] 发送异常:', error);\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: '发送验证码失败,请稍后重试' },\n { status: 500 }\n );\n }\n };\n}\n","import { NextRequest, NextResponse } from 'next/server';\nimport { validatePhoneNumber, validatePassword } from '../utils/authUtils';\nimport type { LegacyResetPasswordConfig, LegacyApiResponse } from './types';\n\nexport function createLegacyResetPasswordHandler(config: LegacyResetPasswordConfig) {\n return async (request: NextRequest) => {\n try {\n const { phone, newPassword, verificationCode } = await request.json();\n\n if (!validatePhoneNumber(phone)) {\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: '请输入正确的手机号格式' },\n { status: 400 }\n );\n }\n\n const passwordValidation = validatePassword(newPassword);\n if (!passwordValidation.valid) {\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: passwordValidation.message || '密码格式错误' },\n { status: 400 }\n );\n }\n\n const isValidCode = await config.authService.verifyCode(phone, verificationCode);\n if (!isValidCode) {\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: '验证码无效或已过期' },\n { status: 400 }\n );\n }\n\n await config.authService.resetPassword(phone, newPassword);\n return NextResponse.json<LegacyApiResponse>({\n success: true,\n message: '密码重置成功',\n });\n } catch (error) {\n console.error('💥 [LegacyResetPassword] 重置异常:', error);\n return NextResponse.json<LegacyApiResponse>(\n { success: false, message: '重置密码失败,请稍后重试' },\n { status: 500 }\n );\n }\n };\n}\n","import type { NextRequest } from 'next/server';\nimport type { User } from './types';\nimport type { LegacyAuthDbService } from './services';\n\nexport interface LegacyServerConfig {\n cookieName?: string;\n}\n\nexport function createLegacyValidateApiAuth(\n authService: LegacyAuthDbService,\n config: LegacyServerConfig = {}\n) {\n const cookieName = config.cookieName || 'session_token';\n return async (request: NextRequest): Promise<User | null> => {\n try {\n const sessionToken = request.cookies.get(cookieName)?.value;\n if (!sessionToken) return null;\n\n const validation = await authService.validateSession(sessionToken);\n return validation.valid && validation.user ? validation.user : null;\n } catch (error) {\n console.error('💥 [LegacyAuth] API权限验证异常:', error);\n return null;\n }\n };\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/auth/legacy/contexts/AuthContext.tsx","../../../../../src/auth/legacy/utils/authUtils.ts","../../../../../src/auth/legacy/ui/miniapp/components/LoginModal.tsx","../../../../../src/auth/legacy/ui/miniapp/components/RegisterModal.tsx","../../../../../src/auth/legacy/ui/miniapp/components/ForgotPasswordModal.tsx"],"names":["createContext","useContext","useState","React","View","Text","Button","Input","error"],"mappings":"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","file":"index.js","sourcesContent":["'use client';\n\nimport React, { createContext, useContext, useState, useEffect, useCallback, useRef } from 'react';\nimport type { User, UseAuthReturn, LoginRequest, RegisterRequest } from '../types';\n\ninterface AuthContextType extends UseAuthReturn {}\n\nconst AuthContext = createContext<AuthContextType | undefined>(undefined);\n\nexport function AuthProvider({ children }: { children: React.ReactNode }) {\n const [user, setUser] = useState<User | null>(null);\n const [loading, setLoading] = useState(true);\n const [isAuthenticated, setIsAuthenticated] = useState(false);\n const isMountedRef = useRef(true);\n\n // 安全的状态更新函数\n const safeSetState = useCallback((updater: () => void) => {\n if (isMountedRef.current) {\n updater();\n }\n }, []);\n\n // 验证会话\n const validateSession = useCallback(async () => {\n console.log('🔍 [AuthContext] 开始验证会话...');\n try {\n const response = await fetch('/api/auth/validate');\n console.log('📡 [AuthContext] 会话验证响应状态:', response.status);\n \n const data = await response.json();\n console.log('📄 [AuthContext] 会话验证响应数据:', data);\n \n safeSetState(() => {\n if (data.valid && data.user) {\n console.log('✅ [AuthContext] 会话验证成功, 用户:', data.user);\n setUser(data.user);\n setIsAuthenticated(true);\n } else {\n console.log('❌ [AuthContext] 会话验证失败:', data.message);\n setUser(null);\n setIsAuthenticated(false);\n }\n setLoading(false);\n });\n } catch (error) {\n console.error('💥 [AuthContext] 会话验证异常:', error);\n safeSetState(() => {\n setUser(null);\n setIsAuthenticated(false);\n setLoading(false);\n });\n }\n }, [safeSetState]);\n\n // 登录\n const login = useCallback(async (credentials: LoginRequest) => {\n console.log('🔑 [AuthContext] 开始登录...');\n console.log('📝 [AuthContext] 登录凭据:', { phone: credentials.phone, password: '***' });\n \n try {\n console.log('📤 [AuthContext] 发送登录请求到 /api/auth/login');\n const response = await fetch('/api/auth/login', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(credentials),\n });\n\n console.log('📡 [AuthContext] 收到响应,状态码:', response.status);\n const data = await response.json();\n console.log('📄 [AuthContext] 响应数据:', data);\n\n if (data.success && data.user) {\n console.log('✅ [AuthContext] 登录成功, 开始更新全局状态');\n console.log('👤 [AuthContext] 用户数据:', data.user);\n \n // 记录当前状态\n console.log('📊 [AuthContext] 更新前状态:', {\n currentUser: user ? `${user.name || '未设置'} (${user.phone})` : null,\n currentIsAuthenticated: isAuthenticated,\n currentLoading: loading\n });\n \n // 使用同步的状态更新确保立即生效\n console.log('🔄 [AuthContext] 执行全局状态更新...');\n safeSetState(() => {\n console.log('🔄 [AuthContext] 正在设置用户:', data.user);\n setUser(data.user);\n console.log('🔄 [AuthContext] 正在设置认证状态: true');\n setIsAuthenticated(true);\n console.log('🔄 [AuthContext] 正在设置加载状态: false');\n setLoading(false);\n console.log('✅ [AuthContext] 全局状态更新完成');\n });\n \n // 等待下一个事件循环后输出确认日志\n setTimeout(() => {\n console.log('🎉 [AuthContext] 延迟确认 - 全局登录状态应该已更新:', {\n user: data.user,\n isAuthenticated: true\n });\n }, 0);\n \n console.log('🚀 [AuthContext] 返回成功结果');\n return { success: true, user: data.user };\n } else {\n console.log('❌ [AuthContext] 登录失败:', data.message);\n return { success: false, message: data.message };\n }\n } catch (error) {\n console.error('💥 [AuthContext] 登录异常:', error);\n return { success: false, message: '登录失败,请稍后重试' };\n }\n }, [safeSetState, user, isAuthenticated, loading]);\n\n // 注册\n const register = useCallback(async (userData: RegisterRequest) => {\n console.log('📝 [AuthContext] 开始注册...');\n try {\n const response = await fetch('/api/auth/register', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(userData),\n });\n\n const data = await response.json();\n console.log('📡 [AuthContext] 注册响应:', data);\n\n if (data.success && data.user) {\n console.log('✅ [AuthContext] 注册成功, 立即更新全局状态');\n \n // 使用同步的状态更新确保立即生效\n safeSetState(() => {\n setUser(data.user);\n setIsAuthenticated(true);\n setLoading(false);\n });\n \n console.log('🚀 [AuthContext] 返回注册成功结果');\n return { success: true, user: data.user };\n } else {\n console.log('❌ [AuthContext] 注册失败:', data.message);\n return { success: false, message: data.message };\n }\n } catch (error) {\n console.error('💥 [AuthContext] 注册异常:', error);\n return { success: false, message: '注册失败,请稍后重试' };\n }\n }, [safeSetState]);\n\n // 登出\n const logout = useCallback(async () => {\n console.log('🚪 [AuthContext] 开始登出...');\n try {\n await fetch('/api/auth/logout', { method: 'POST' });\n safeSetState(() => {\n setUser(null);\n setIsAuthenticated(false);\n });\n console.log('✅ [AuthContext] 登出成功, 全局状态已清除');\n } catch (error) {\n console.error('💥 [AuthContext] 登出失败:', error);\n }\n }, [safeSetState]);\n\n // 刷新用户信息\n const refreshUser = useCallback(() => {\n console.log('🔄 [AuthContext] 刷新用户信息...');\n setLoading(true);\n validateSession();\n }, [validateSession]);\n\n // 组件挂载/卸载管理\n useEffect(() => {\n isMountedRef.current = true;\n return () => {\n isMountedRef.current = false;\n };\n }, []);\n\n // 初始化时验证会话\n useEffect(() => {\n console.log('🚀 [AuthContext] 初始化, 开始验证会话');\n validateSession();\n }, [validateSession]);\n\n // 状态变化监控(用于调试)\n useEffect(() => {\n console.log('📊 [AuthContext] 全局状态变化:', {\n isAuthenticated,\n user: user ? `${user.name || '未设置'} (${user.phone})` : null,\n loading\n });\n }, [isAuthenticated, user, loading]);\n\n const value: AuthContextType = {\n user,\n loading,\n isAuthenticated,\n login,\n register,\n logout,\n refreshUser,\n };\n\n return (\n <AuthContext.Provider value={value}>\n {children}\n </AuthContext.Provider>\n );\n}\n\nexport function useAuth(): UseAuthReturn {\n const context = useContext(AuthContext);\n if (context === undefined) {\n throw new Error('useAuth must be used within an AuthProvider');\n }\n return context;\n} ","import type { User } from '../types';\n\n/**\n * 验证手机号格式\n */\nexport function validatePhoneNumber(phone: string): boolean {\n return /^1[3-9]\\d{9}$/.test(phone);\n}\n\n/**\n * 验证密码强度(可扩展)\n */\nexport function validatePassword(password: string): { valid: boolean; message?: string } {\n if (!password) {\n return { valid: false, message: '密码不能为空' };\n }\n \n if (password.length < 6) {\n return { valid: false, message: '密码长度至少6位' };\n }\n \n return { valid: true };\n}\n\n/**\n * 生成安全的会话令牌\n */\nexport function generateSessionToken(): string {\n // 在实际环境中,应该使用更安全的随机数生成\n return Math.random().toString(36).substring(2) + \n Date.now().toString(36) + \n Math.random().toString(36).substring(2);\n}\n\n/**\n * 检查用户是否为管理员\n */\nexport function isAdmin(user: User | null): boolean {\n return user?.role === 'admin';\n}\n\n/**\n * 检查用户是否处于活跃状态\n */\nexport function isActiveUser(user: User | null): boolean {\n return user?.isActive === true;\n}\n\n/**\n * 格式化用户显示名称\n */\nexport function getUserDisplayName(user: User): string {\n return user.name || user.phone || '未知用户';\n}\n\n/**\n * 计算会话过期时间\n */\nexport function calculateSessionExpiry(days: number = 30): Date {\n return new Date(Date.now() + days * 24 * 60 * 60 * 1000);\n}\n\n/**\n * 检查会话是否过期\n */\nexport function isSessionExpired(expiresAt: Date): boolean {\n return new Date() > new Date(expiresAt);\n} ","'use client';\n\nimport React, { useState } from 'react';\nimport { View, Text, Input, Button } from '@tarojs/components';\nimport { useAuth } from '../../../contexts/AuthContext';\nimport { validatePhoneNumber } from '../../../utils/authUtils';\nimport type { LoginModalProps } from '../../../types';\n\ntype MiniappInputEvent = {\n detail: {\n value: string;\n };\n};\n\nexport default function LoginModal({ isOpen, onClose, onSuccess, onSwitchToRegister }: LoginModalProps) {\n const { login } = useAuth();\n const [formData, setFormData] = useState({ phone: '', password: '' });\n const [error, setError] = useState('');\n const [loading, setLoading] = useState(false);\n\n if (!isOpen) return null;\n\n const handleSubmit = async () => {\n setError('');\n setLoading(true);\n\n if (!formData.phone || !formData.password) {\n setError('请填写完整信息');\n setLoading(false);\n return;\n }\n\n if (!validatePhoneNumber(formData.phone)) {\n setError('请输入正确的手机号');\n setLoading(false);\n return;\n }\n\n const result = await login(formData);\n if (result.success) {\n onSuccess();\n } else {\n setError(result.message || '登录失败');\n }\n setLoading(false);\n };\n\n return (\n <View className=\"auth-modal\">\n <View className=\"auth-card\">\n <View className=\"auth-header\">\n <Text className=\"auth-title\">用户登录</Text>\n <Button className=\"auth-close\" onClick={onClose}>\n 关闭\n </Button>\n </View>\n <View className=\"auth-form\">\n <Input\n name=\"phone\"\n value={formData.phone}\n onInput={(e: MiniappInputEvent) => setFormData(prev => ({ ...prev, phone: e.detail.value }))}\n placeholder=\"请输入手机号\"\n type=\"text\"\n />\n <Input\n name=\"password\"\n value={formData.password}\n onInput={(e: MiniappInputEvent) => setFormData(prev => ({ ...prev, password: e.detail.value }))}\n placeholder=\"请输入密码\"\n type=\"password\"\n />\n {error && <Text className=\"auth-error\">{error}</Text>}\n <Button className=\"auth-submit\" loading={loading} onClick={handleSubmit}>\n {loading ? '登录中...' : '登录'}\n </Button>\n {onSwitchToRegister && (\n <Button className=\"auth-switch\" onClick={onSwitchToRegister}>\n 去注册\n </Button>\n )}\n </View>\n </View>\n </View>\n );\n}\n","'use client';\n\nimport React, { useState } from 'react';\nimport { View, Text, Input, Button } from '@tarojs/components';\nimport { useAuth } from '../../../contexts/AuthContext';\nimport { validatePhoneNumber, validatePassword } from '../../../utils/authUtils';\nimport type { RegisterModalProps } from '../../../types';\n\ntype MiniappInputEvent = {\n detail: {\n value: string;\n };\n};\n\nexport default function RegisterModal({ isOpen, onClose, onSuccess, onSwitchToLogin }: RegisterModalProps) {\n const { register } = useAuth();\n const [formData, setFormData] = useState({\n phone: '',\n name: '',\n password: '',\n confirmPassword: '',\n });\n const [error, setError] = useState('');\n const [loading, setLoading] = useState(false);\n\n if (!isOpen) return null;\n\n const handleSubmit = async () => {\n setError('');\n setLoading(true);\n\n if (!formData.phone || !formData.password || !formData.confirmPassword) {\n setError('请填写完整信息');\n setLoading(false);\n return;\n }\n\n if (!validatePhoneNumber(formData.phone)) {\n setError('请输入正确的手机号');\n setLoading(false);\n return;\n }\n\n const passwordValidation = validatePassword(formData.password);\n if (!passwordValidation.valid) {\n setError(passwordValidation.message || '密码格式错误');\n setLoading(false);\n return;\n }\n\n if (formData.password !== formData.confirmPassword) {\n setError('两次输入的密码不一致');\n setLoading(false);\n return;\n }\n\n const result = await register({\n phone: formData.phone,\n password: formData.password,\n name: formData.name || undefined,\n });\n\n if (result.success) {\n onSuccess();\n } else {\n setError(result.message || '注册失败');\n }\n\n setLoading(false);\n };\n\n return (\n <View className=\"auth-modal\">\n <View className=\"auth-card\">\n <View className=\"auth-header\">\n <Text className=\"auth-title\">用户注册</Text>\n <Button className=\"auth-close\" onClick={onClose}>\n 关闭\n </Button>\n </View>\n <View className=\"auth-form\">\n <Input\n name=\"phone\"\n value={formData.phone}\n onInput={(e: MiniappInputEvent) => setFormData(prev => ({ ...prev, phone: e.detail.value }))}\n placeholder=\"请输入手机号\"\n type=\"text\"\n />\n <Input\n name=\"name\"\n value={formData.name}\n onInput={(e: MiniappInputEvent) => setFormData(prev => ({ ...prev, name: e.detail.value }))}\n placeholder=\"请输入昵称\"\n type=\"text\"\n />\n <Input\n name=\"password\"\n value={formData.password}\n onInput={(e: MiniappInputEvent) => setFormData(prev => ({ ...prev, password: e.detail.value }))}\n placeholder=\"请输入密码\"\n type=\"password\"\n />\n <Input\n name=\"confirmPassword\"\n value={formData.confirmPassword}\n onInput={(e: MiniappInputEvent) => setFormData(prev => ({ ...prev, confirmPassword: e.detail.value }))}\n placeholder=\"请确认密码\"\n type=\"password\"\n />\n {error && <Text className=\"auth-error\">{error}</Text>}\n <Button className=\"auth-submit\" loading={loading} onClick={handleSubmit}>\n {loading ? '注册中...' : '注册'}\n </Button>\n {onSwitchToLogin && (\n <Button className=\"auth-switch\" onClick={onSwitchToLogin}>\n 去登录\n </Button>\n )}\n </View>\n </View>\n </View>\n );\n}\n","'use client';\n\nimport React, { useState } from 'react';\nimport { View, Text, Input, Button } from '@tarojs/components';\nimport { validatePhoneNumber, validatePassword } from '../../../utils/authUtils';\nimport type { ForgotPasswordModalProps } from '../../../types';\n\ntype MiniappInputEvent = {\n detail: {\n value: string;\n };\n};\n\nexport default function ForgotPasswordModal({ isOpen, onClose, onSuccess }: ForgotPasswordModalProps) {\n const [step, setStep] = useState<'phone' | 'verify' | 'reset'>('phone');\n const [formData, setFormData] = useState({\n phone: '',\n verificationCode: '',\n newPassword: '',\n confirmPassword: '',\n });\n const [error, setError] = useState('');\n const [loading, setLoading] = useState(false);\n\n if (!isOpen) return null;\n\n const handleSendCode = async () => {\n setError('');\n setLoading(true);\n\n if (!validatePhoneNumber(formData.phone)) {\n setError('请输入正确的手机号');\n setLoading(false);\n return;\n }\n\n try {\n const response = await fetch('/api/auth/send-verification-code', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ phone: formData.phone }),\n });\n const data = await response.json();\n if (data.success) {\n setStep('verify');\n } else {\n setError(data.message || '发送失败');\n }\n } catch (error) {\n console.error('💥 [ForgotPasswordModal] 发送验证码异常:', error);\n setError('发送失败,请稍后重试');\n } finally {\n setLoading(false);\n }\n };\n\n const handleVerifyCode = () => {\n if (!formData.verificationCode) {\n setError('请输入验证码');\n return;\n }\n setStep('reset');\n };\n\n const handleResetPassword = async () => {\n const passwordValidation = validatePassword(formData.newPassword);\n if (!passwordValidation.valid) {\n setError(passwordValidation.message || '密码格式错误');\n return;\n }\n if (formData.newPassword !== formData.confirmPassword) {\n setError('两次输入的密码不一致');\n return;\n }\n\n setLoading(true);\n try {\n const response = await fetch('/api/auth/reset-password', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n phone: formData.phone,\n verificationCode: formData.verificationCode,\n newPassword: formData.newPassword,\n }),\n });\n const data = await response.json();\n if (data.success) {\n onSuccess();\n } else {\n setError(data.message || '重置失败');\n }\n } catch (error) {\n console.error('💥 [ForgotPasswordModal] 重置密码异常:', error);\n setError('重置失败,请稍后重试');\n } finally {\n setLoading(false);\n }\n };\n\n const renderContent = () => {\n if (step === 'phone') {\n return (\n <>\n <Input\n name=\"phone\"\n value={formData.phone}\n onInput={(e: MiniappInputEvent) => setFormData(prev => ({ ...prev, phone: e.detail.value }))}\n placeholder=\"请输入手机号\"\n type=\"text\"\n />\n <Button className=\"auth-submit\" loading={loading} onClick={handleSendCode}>\n {loading ? '发送中...' : '发送验证码'}\n </Button>\n </>\n );\n }\n\n if (step === 'verify') {\n return (\n <>\n <Input\n name=\"verificationCode\"\n value={formData.verificationCode}\n onInput={(e: MiniappInputEvent) => setFormData(prev => ({ ...prev, verificationCode: e.detail.value }))}\n placeholder=\"请输入验证码\"\n type=\"text\"\n />\n <Button className=\"auth-submit\" onClick={handleVerifyCode}>\n 下一步\n </Button>\n </>\n );\n }\n\n return (\n <>\n <Input\n name=\"newPassword\"\n value={formData.newPassword}\n onInput={(e: MiniappInputEvent) => setFormData(prev => ({ ...prev, newPassword: e.detail.value }))}\n placeholder=\"请输入新密码\"\n type=\"password\"\n />\n <Input\n name=\"confirmPassword\"\n value={formData.confirmPassword}\n onInput={(e: MiniappInputEvent) => setFormData(prev => ({ ...prev, confirmPassword: e.detail.value }))}\n placeholder=\"请确认新密码\"\n type=\"password\"\n />\n <Button className=\"auth-submit\" loading={loading} onClick={handleResetPassword}>\n {loading ? '提交中...' : '重置密码'}\n </Button>\n </>\n );\n };\n\n return (\n <View className=\"auth-modal\">\n <View className=\"auth-card\">\n <View className=\"auth-header\">\n <Text className=\"auth-title\">找回密码</Text>\n <Button className=\"auth-close\" onClick={onClose}>\n 关闭\n </Button>\n </View>\n <View className=\"auth-form\">\n {renderContent()}\n {error && <Text className=\"auth-error\">{error}</Text>}\n </View>\n </View>\n </View>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../../../src/auth/legacy/contexts/AuthContext.tsx","../../../../../src/auth/legacy/utils/authUtils.ts","../../../../../src/auth/legacy/ui/miniapp/components/LoginModal.tsx","../../../../../src/auth/legacy/ui/miniapp/components/RegisterModal.tsx","../../../../../src/auth/legacy/ui/miniapp/components/ForgotPasswordModal.tsx"],"names":["createContext","useContext","useState","React","View","Text","Button","Input","error"],"mappings":"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","file":"index.js","sourcesContent":["'use client';\n\nimport React, { createContext, useContext, useState, useEffect, useCallback, useRef } from 'react';\nimport type { User, UseAuthReturn, LoginRequest, RegisterRequest } from '../types';\n\ninterface AuthContextType extends UseAuthReturn {}\n\nconst AuthContext = createContext<AuthContextType | undefined>(undefined);\n\nfunction extractUser(data: any): User | null {\n return data?.user ?? data?.data?.user ?? null;\n}\n\nfunction extractValid(data: any): boolean {\n if (typeof data?.valid === 'boolean') return data.valid;\n if (typeof data?.data?.valid === 'boolean') return data.data.valid;\n return false;\n}\n\nexport function AuthProvider({ children }: { children: React.ReactNode }) {\n const [user, setUser] = useState<User | null>(null);\n const [loading, setLoading] = useState(true);\n const [isAuthenticated, setIsAuthenticated] = useState(false);\n const isMountedRef = useRef(true);\n\n // 安全的状态更新函数\n const safeSetState = useCallback((updater: () => void) => {\n if (isMountedRef.current) {\n updater();\n }\n }, []);\n\n // 验证会话\n const validateSession = useCallback(async () => {\n console.log('🔍 [AuthContext] 开始验证会话...');\n try {\n const response = await fetch('/api/auth/validate');\n console.log('📡 [AuthContext] 会话验证响应状态:', response.status);\n \n const data = await response.json();\n console.log('📄 [AuthContext] 会话验证响应数据:', data);\n const resolvedUser = extractUser(data);\n const resolvedValid = extractValid(data);\n \n safeSetState(() => {\n if (resolvedValid && resolvedUser) {\n console.log('✅ [AuthContext] 会话验证成功, 用户:', resolvedUser);\n setUser(resolvedUser);\n setIsAuthenticated(true);\n } else {\n console.log('❌ [AuthContext] 会话验证失败:', data.message);\n setUser(null);\n setIsAuthenticated(false);\n }\n setLoading(false);\n });\n } catch (error) {\n console.error('💥 [AuthContext] 会话验证异常:', error);\n safeSetState(() => {\n setUser(null);\n setIsAuthenticated(false);\n setLoading(false);\n });\n }\n }, [safeSetState]);\n\n // 登录\n const login = useCallback(async (credentials: LoginRequest) => {\n console.log('🔑 [AuthContext] 开始登录...');\n console.log('📝 [AuthContext] 登录凭据:', { phone: credentials.phone, password: '***' });\n \n try {\n console.log('📤 [AuthContext] 发送登录请求到 /api/auth/login');\n const response = await fetch('/api/auth/login', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(credentials),\n });\n\n console.log('📡 [AuthContext] 收到响应,状态码:', response.status);\n const data = await response.json();\n console.log('📄 [AuthContext] 响应数据:', data);\n const resolvedUser = extractUser(data);\n\n if (data.success && resolvedUser) {\n console.log('✅ [AuthContext] 登录成功, 开始更新全局状态');\n console.log('👤 [AuthContext] 用户数据:', resolvedUser);\n \n // 记录当前状态\n console.log('📊 [AuthContext] 更新前状态:', {\n currentUser: user ? `${user.name || '未设置'} (${user.phone})` : null,\n currentIsAuthenticated: isAuthenticated,\n currentLoading: loading\n });\n \n // 使用同步的状态更新确保立即生效\n console.log('🔄 [AuthContext] 执行全局状态更新...');\n safeSetState(() => {\n console.log('🔄 [AuthContext] 正在设置用户:', resolvedUser);\n setUser(resolvedUser);\n console.log('🔄 [AuthContext] 正在设置认证状态: true');\n setIsAuthenticated(true);\n console.log('🔄 [AuthContext] 正在设置加载状态: false');\n setLoading(false);\n console.log('✅ [AuthContext] 全局状态更新完成');\n });\n \n // 等待下一个事件循环后输出确认日志\n setTimeout(() => {\n console.log('🎉 [AuthContext] 延迟确认 - 全局登录状态应该已更新:', {\n user: resolvedUser,\n isAuthenticated: true\n });\n }, 0);\n \n console.log('🚀 [AuthContext] 返回成功结果');\n return { success: true, user: resolvedUser };\n } else {\n console.log('❌ [AuthContext] 登录失败:', data.message);\n return { success: false, message: data.message };\n }\n } catch (error) {\n console.error('💥 [AuthContext] 登录异常:', error);\n return { success: false, message: '登录失败,请稍后重试' };\n }\n }, [safeSetState, user, isAuthenticated, loading]);\n\n // 注册\n const register = useCallback(async (userData: RegisterRequest) => {\n console.log('📝 [AuthContext] 开始注册...');\n try {\n const response = await fetch('/api/auth/register', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(userData),\n });\n\n const data = await response.json();\n console.log('📡 [AuthContext] 注册响应:', data);\n const resolvedUser = extractUser(data);\n\n if (data.success && resolvedUser) {\n console.log('✅ [AuthContext] 注册成功, 立即更新全局状态');\n \n // 使用同步的状态更新确保立即生效\n safeSetState(() => {\n setUser(resolvedUser);\n setIsAuthenticated(true);\n setLoading(false);\n });\n \n console.log('🚀 [AuthContext] 返回注册成功结果');\n return { success: true, user: resolvedUser };\n } else {\n console.log('❌ [AuthContext] 注册失败:', data.message);\n return { success: false, message: data.message };\n }\n } catch (error) {\n console.error('💥 [AuthContext] 注册异常:', error);\n return { success: false, message: '注册失败,请稍后重试' };\n }\n }, [safeSetState]);\n\n // 登出\n const logout = useCallback(async () => {\n console.log('🚪 [AuthContext] 开始登出...');\n try {\n await fetch('/api/auth/logout', { method: 'POST' });\n safeSetState(() => {\n setUser(null);\n setIsAuthenticated(false);\n });\n console.log('✅ [AuthContext] 登出成功, 全局状态已清除');\n } catch (error) {\n console.error('💥 [AuthContext] 登出失败:', error);\n }\n }, [safeSetState]);\n\n // 刷新用户信息\n const refreshUser = useCallback(() => {\n console.log('🔄 [AuthContext] 刷新用户信息...');\n setLoading(true);\n validateSession();\n }, [validateSession]);\n\n // 组件挂载/卸载管理\n useEffect(() => {\n isMountedRef.current = true;\n return () => {\n isMountedRef.current = false;\n };\n }, []);\n\n // 初始化时验证会话\n useEffect(() => {\n console.log('🚀 [AuthContext] 初始化, 开始验证会话');\n validateSession();\n }, [validateSession]);\n\n // 状态变化监控(用于调试)\n useEffect(() => {\n console.log('📊 [AuthContext] 全局状态变化:', {\n isAuthenticated,\n user: user ? `${user.name || '未设置'} (${user.phone})` : null,\n loading\n });\n }, [isAuthenticated, user, loading]);\n\n const value: AuthContextType = {\n user,\n loading,\n isAuthenticated,\n login,\n register,\n logout,\n refreshUser,\n };\n\n return (\n <AuthContext.Provider value={value}>\n {children}\n </AuthContext.Provider>\n );\n}\n\nexport function useAuth(): UseAuthReturn {\n const context = useContext(AuthContext);\n if (context === undefined) {\n throw new Error('useAuth must be used within an AuthProvider');\n }\n return context;\n} \n","import type { User } from '../types';\n\n/**\n * 验证手机号格式\n */\nexport function validatePhoneNumber(phone: string): boolean {\n return /^1[3-9]\\d{9}$/.test(phone);\n}\n\n/**\n * 验证密码强度(可扩展)\n */\nexport function validatePassword(password: string): { valid: boolean; message?: string } {\n if (!password) {\n return { valid: false, message: '密码不能为空' };\n }\n \n if (password.length < 6) {\n return { valid: false, message: '密码长度至少6位' };\n }\n \n return { valid: true };\n}\n\n/**\n * 生成安全的会话令牌\n */\nexport function generateSessionToken(): string {\n // 在实际环境中,应该使用更安全的随机数生成\n return Math.random().toString(36).substring(2) + \n Date.now().toString(36) + \n Math.random().toString(36).substring(2);\n}\n\n/**\n * 检查用户是否为管理员\n */\nexport function isAdmin(user: User | null): boolean {\n return user?.role === 'admin';\n}\n\n/**\n * 检查用户是否处于活跃状态\n */\nexport function isActiveUser(user: User | null): boolean {\n return user?.isActive === true;\n}\n\n/**\n * 格式化用户显示名称\n */\nexport function getUserDisplayName(user: User): string {\n return user.name || user.phone || '未知用户';\n}\n\n/**\n * 计算会话过期时间\n */\nexport function calculateSessionExpiry(days: number = 30): Date {\n return new Date(Date.now() + days * 24 * 60 * 60 * 1000);\n}\n\n/**\n * 检查会话是否过期\n */\nexport function isSessionExpired(expiresAt: Date): boolean {\n return new Date() > new Date(expiresAt);\n} ","'use client';\n\nimport React, { useState } from 'react';\nimport { View, Text, Input, Button } from '@tarojs/components';\nimport { useAuth } from '../../../contexts/AuthContext';\nimport { validatePhoneNumber } from '../../../utils/authUtils';\nimport type { LoginModalProps } from '../../../types';\n\ntype MiniappInputEvent = {\n detail: {\n value: string;\n };\n};\n\nexport default function LoginModal({ isOpen, onClose, onSuccess, onSwitchToRegister }: LoginModalProps) {\n const { login } = useAuth();\n const [formData, setFormData] = useState({ phone: '', password: '' });\n const [error, setError] = useState('');\n const [loading, setLoading] = useState(false);\n\n if (!isOpen) return null;\n\n const handleSubmit = async () => {\n setError('');\n setLoading(true);\n\n if (!formData.phone || !formData.password) {\n setError('请填写完整信息');\n setLoading(false);\n return;\n }\n\n if (!validatePhoneNumber(formData.phone)) {\n setError('请输入正确的手机号');\n setLoading(false);\n return;\n }\n\n const result = await login(formData);\n if (result.success) {\n onSuccess();\n } else {\n setError(result.message || '登录失败');\n }\n setLoading(false);\n };\n\n return (\n <View className=\"auth-modal\">\n <View className=\"auth-card\">\n <View className=\"auth-header\">\n <Text className=\"auth-title\">用户登录</Text>\n <Button className=\"auth-close\" onClick={onClose}>\n 关闭\n </Button>\n </View>\n <View className=\"auth-form\">\n <Input\n name=\"phone\"\n value={formData.phone}\n onInput={(e: MiniappInputEvent) => setFormData(prev => ({ ...prev, phone: e.detail.value }))}\n placeholder=\"请输入手机号\"\n type=\"text\"\n />\n <Input\n name=\"password\"\n value={formData.password}\n onInput={(e: MiniappInputEvent) => setFormData(prev => ({ ...prev, password: e.detail.value }))}\n placeholder=\"请输入密码\"\n type=\"password\"\n />\n {error && <Text className=\"auth-error\">{error}</Text>}\n <Button className=\"auth-submit\" loading={loading} onClick={handleSubmit}>\n {loading ? '登录中...' : '登录'}\n </Button>\n {onSwitchToRegister && (\n <Button className=\"auth-switch\" onClick={onSwitchToRegister}>\n 去注册\n </Button>\n )}\n </View>\n </View>\n </View>\n );\n}\n","'use client';\n\nimport React, { useState } from 'react';\nimport { View, Text, Input, Button } from '@tarojs/components';\nimport { useAuth } from '../../../contexts/AuthContext';\nimport { validatePhoneNumber, validatePassword } from '../../../utils/authUtils';\nimport type { RegisterModalProps } from '../../../types';\n\ntype MiniappInputEvent = {\n detail: {\n value: string;\n };\n};\n\nexport default function RegisterModal({ isOpen, onClose, onSuccess, onSwitchToLogin }: RegisterModalProps) {\n const { register } = useAuth();\n const [formData, setFormData] = useState({\n phone: '',\n name: '',\n password: '',\n confirmPassword: '',\n });\n const [error, setError] = useState('');\n const [loading, setLoading] = useState(false);\n\n if (!isOpen) return null;\n\n const handleSubmit = async () => {\n setError('');\n setLoading(true);\n\n if (!formData.phone || !formData.password || !formData.confirmPassword) {\n setError('请填写完整信息');\n setLoading(false);\n return;\n }\n\n if (!validatePhoneNumber(formData.phone)) {\n setError('请输入正确的手机号');\n setLoading(false);\n return;\n }\n\n const passwordValidation = validatePassword(formData.password);\n if (!passwordValidation.valid) {\n setError(passwordValidation.message || '密码格式错误');\n setLoading(false);\n return;\n }\n\n if (formData.password !== formData.confirmPassword) {\n setError('两次输入的密码不一致');\n setLoading(false);\n return;\n }\n\n const result = await register({\n phone: formData.phone,\n password: formData.password,\n name: formData.name || undefined,\n });\n\n if (result.success) {\n onSuccess();\n } else {\n setError(result.message || '注册失败');\n }\n\n setLoading(false);\n };\n\n return (\n <View className=\"auth-modal\">\n <View className=\"auth-card\">\n <View className=\"auth-header\">\n <Text className=\"auth-title\">用户注册</Text>\n <Button className=\"auth-close\" onClick={onClose}>\n 关闭\n </Button>\n </View>\n <View className=\"auth-form\">\n <Input\n name=\"phone\"\n value={formData.phone}\n onInput={(e: MiniappInputEvent) => setFormData(prev => ({ ...prev, phone: e.detail.value }))}\n placeholder=\"请输入手机号\"\n type=\"text\"\n />\n <Input\n name=\"name\"\n value={formData.name}\n onInput={(e: MiniappInputEvent) => setFormData(prev => ({ ...prev, name: e.detail.value }))}\n placeholder=\"请输入昵称\"\n type=\"text\"\n />\n <Input\n name=\"password\"\n value={formData.password}\n onInput={(e: MiniappInputEvent) => setFormData(prev => ({ ...prev, password: e.detail.value }))}\n placeholder=\"请输入密码\"\n type=\"password\"\n />\n <Input\n name=\"confirmPassword\"\n value={formData.confirmPassword}\n onInput={(e: MiniappInputEvent) => setFormData(prev => ({ ...prev, confirmPassword: e.detail.value }))}\n placeholder=\"请确认密码\"\n type=\"password\"\n />\n {error && <Text className=\"auth-error\">{error}</Text>}\n <Button className=\"auth-submit\" loading={loading} onClick={handleSubmit}>\n {loading ? '注册中...' : '注册'}\n </Button>\n {onSwitchToLogin && (\n <Button className=\"auth-switch\" onClick={onSwitchToLogin}>\n 去登录\n </Button>\n )}\n </View>\n </View>\n </View>\n );\n}\n","'use client';\n\nimport React, { useState } from 'react';\nimport { View, Text, Input, Button } from '@tarojs/components';\nimport { validatePhoneNumber, validatePassword } from '../../../utils/authUtils';\nimport type { ForgotPasswordModalProps } from '../../../types';\n\ntype MiniappInputEvent = {\n detail: {\n value: string;\n };\n};\n\nexport default function ForgotPasswordModal({ isOpen, onClose, onSuccess }: ForgotPasswordModalProps) {\n const [step, setStep] = useState<'phone' | 'verify' | 'reset'>('phone');\n const [formData, setFormData] = useState({\n phone: '',\n verificationCode: '',\n newPassword: '',\n confirmPassword: '',\n });\n const [error, setError] = useState('');\n const [loading, setLoading] = useState(false);\n\n if (!isOpen) return null;\n\n const handleSendCode = async () => {\n setError('');\n setLoading(true);\n\n if (!validatePhoneNumber(formData.phone)) {\n setError('请输入正确的手机号');\n setLoading(false);\n return;\n }\n\n try {\n const response = await fetch('/api/auth/send-verification-code', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ phone: formData.phone }),\n });\n const data = await response.json();\n if (data.success) {\n setStep('verify');\n } else {\n setError(data.message || '发送失败');\n }\n } catch (error) {\n console.error('💥 [ForgotPasswordModal] 发送验证码异常:', error);\n setError('发送失败,请稍后重试');\n } finally {\n setLoading(false);\n }\n };\n\n const handleVerifyCode = () => {\n if (!formData.verificationCode) {\n setError('请输入验证码');\n return;\n }\n setStep('reset');\n };\n\n const handleResetPassword = async () => {\n const passwordValidation = validatePassword(formData.newPassword);\n if (!passwordValidation.valid) {\n setError(passwordValidation.message || '密码格式错误');\n return;\n }\n if (formData.newPassword !== formData.confirmPassword) {\n setError('两次输入的密码不一致');\n return;\n }\n\n setLoading(true);\n try {\n const response = await fetch('/api/auth/reset-password', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n phone: formData.phone,\n verificationCode: formData.verificationCode,\n newPassword: formData.newPassword,\n }),\n });\n const data = await response.json();\n if (data.success) {\n onSuccess();\n } else {\n setError(data.message || '重置失败');\n }\n } catch (error) {\n console.error('💥 [ForgotPasswordModal] 重置密码异常:', error);\n setError('重置失败,请稍后重试');\n } finally {\n setLoading(false);\n }\n };\n\n const renderContent = () => {\n if (step === 'phone') {\n return (\n <>\n <Input\n name=\"phone\"\n value={formData.phone}\n onInput={(e: MiniappInputEvent) => setFormData(prev => ({ ...prev, phone: e.detail.value }))}\n placeholder=\"请输入手机号\"\n type=\"text\"\n />\n <Button className=\"auth-submit\" loading={loading} onClick={handleSendCode}>\n {loading ? '发送中...' : '发送验证码'}\n </Button>\n </>\n );\n }\n\n if (step === 'verify') {\n return (\n <>\n <Input\n name=\"verificationCode\"\n value={formData.verificationCode}\n onInput={(e: MiniappInputEvent) => setFormData(prev => ({ ...prev, verificationCode: e.detail.value }))}\n placeholder=\"请输入验证码\"\n type=\"text\"\n />\n <Button className=\"auth-submit\" onClick={handleVerifyCode}>\n 下一步\n </Button>\n </>\n );\n }\n\n return (\n <>\n <Input\n name=\"newPassword\"\n value={formData.newPassword}\n onInput={(e: MiniappInputEvent) => setFormData(prev => ({ ...prev, newPassword: e.detail.value }))}\n placeholder=\"请输入新密码\"\n type=\"password\"\n />\n <Input\n name=\"confirmPassword\"\n value={formData.confirmPassword}\n onInput={(e: MiniappInputEvent) => setFormData(prev => ({ ...prev, confirmPassword: e.detail.value }))}\n placeholder=\"请确认新密码\"\n type=\"password\"\n />\n <Button className=\"auth-submit\" loading={loading} onClick={handleResetPassword}>\n {loading ? '提交中...' : '重置密码'}\n </Button>\n </>\n );\n };\n\n return (\n <View className=\"auth-modal\">\n <View className=\"auth-card\">\n <View className=\"auth-header\">\n <Text className=\"auth-title\">找回密码</Text>\n <Button className=\"auth-close\" onClick={onClose}>\n 关闭\n </Button>\n </View>\n <View className=\"auth-form\">\n {renderContent()}\n {error && <Text className=\"auth-error\">{error}</Text>}\n </View>\n </View>\n </View>\n );\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/auth/legacy/contexts/AuthContext.tsx","../../../../../src/auth/legacy/utils/authUtils.ts","../../../../../src/auth/legacy/ui/miniapp/components/LoginModal.tsx","../../../../../src/auth/legacy/ui/miniapp/components/RegisterModal.tsx","../../../../../src/auth/legacy/ui/miniapp/components/ForgotPasswordModal.tsx"],"names":["useState","React","View","Text","Button","Input","error"],"mappings":";;;;AAOA,IAAM,WAAA,GAAc,cAA2C,MAAS,CAAA;AA4MjE,SAAS,OAAA,GAAyB;AACvC,EAAA,MAAM,OAAA,GAAU,WAAW,WAAW,CAAA;AACtC,EAAA,IAAI,YAAY,MAAA,EAAW;AACzB,IAAA,MAAM,IAAI,MAAM,6CAA6C,CAAA;AAAA,EAC/D;AACA,EAAA,OAAO,OAAA;AACT;;;ACpNO,SAAS,oBAAoB,KAAA,EAAwB;AAC1D,EAAA,OAAO,eAAA,CAAgB,KAAK,KAAK,CAAA;AACnC;AAKO,SAAS,iBAAiB,QAAA,EAAwD;AACvF,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,OAAA,EAAS,sCAAA,EAAS;AAAA,EAC3C;AAEA,EAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AACvB,IAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,OAAA,EAAS,6CAAA,EAAW;AAAA,EAC7C;AAEA,EAAA,OAAO,EAAE,OAAO,IAAA,EAAK;AACvB;;;ACRe,SAAR,WAA4B,EAAE,MAAA,EAAQ,OAAA,EAAS,SAAA,EAAW,oBAAmB,EAAoB;AACtG,EAAA,MAAM,EAAE,KAAA,EAAM,GAAI,OAAA,EAAQ;AAC1B,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,QAAAA,CAAS,EAAE,KAAA,EAAO,EAAA,EAAI,QAAA,EAAU,EAAA,EAAI,CAAA;AACpE,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAS,EAAE,CAAA;AACrC,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,SAAS,KAAK,CAAA;AAE5C,EAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AAEpB,EAAA,MAAM,eAAe,YAAY;AAC/B,IAAA,QAAA,CAAS,EAAE,CAAA;AACX,IAAA,UAAA,CAAW,IAAI,CAAA;AAEf,IAAA,IAAI,CAAC,QAAA,CAAS,KAAA,IAAS,CAAC,SAAS,QAAA,EAAU;AACzC,MAAA,QAAA,CAAS,4CAAS,CAAA;AAClB,MAAA,UAAA,CAAW,KAAK,CAAA;AAChB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,mBAAA,CAAoB,QAAA,CAAS,KAAK,CAAA,EAAG;AACxC,MAAA,QAAA,CAAS,wDAAW,CAAA;AACpB,MAAA,UAAA,CAAW,KAAK,CAAA;AAChB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,QAAQ,CAAA;AACnC,IAAA,IAAI,OAAO,OAAA,EAAS;AAClB,MAAA,SAAA,EAAU;AAAA,IACZ,CAAA,MAAO;AACL,MAAA,QAAA,CAAS,MAAA,CAAO,WAAW,0BAAM,CAAA;AAAA,IACnC;AACA,IAAA,UAAA,CAAW,KAAK,CAAA;AAAA,EAClB,CAAA;AAEA,EAAA,uBACEC,OAAA,aAAA,CAAC,IAAA,EAAA,EAAK,WAAU,YAAA,EAAA,kBACdA,OAAA,aAAA,CAAC,IAAA,EAAA,EAAK,WAAU,WAAA,EAAA,kBACdA,OAAA,aAAA,CAAC,IAAA,EAAA,EAAK,WAAU,aAAA,EAAA,kBACdA,OAAA,aAAA,CAAC,IAAA,EAAA,EAAK,WAAU,YAAA,EAAA,EAAa,0BAAI,mBACjCA,MAAAA,CAAA,cAAC,MAAA,EAAA,EAAO,SAAA,EAAU,cAAa,OAAA,EAAS,OAAA,EAAA,EAAS,cAEjD,CACF,CAAA,kBACAA,MAAAA,CAAA,aAAA,CAAC,QAAK,SAAA,EAAU,WAAA,EAAA,kBACdA,MAAAA,CAAA,aAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,OAAA;AAAA,MACL,OAAO,QAAA,CAAS,KAAA;AAAA,MAChB,OAAA,EAAS,CAAC,CAAA,KAAyB,WAAA,CAAY,CAAA,IAAA,MAAS,EAAE,GAAG,IAAA,EAAM,KAAA,EAAO,CAAA,CAAE,MAAA,CAAO,KAAA,EAAM,CAAE,CAAA;AAAA,MAC3F,WAAA,EAAY,sCAAA;AAAA,MACZ,IAAA,EAAK;AAAA;AAAA,GACP,kBACAA,MAAAA,CAAA,aAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,UAAA;AAAA,MACL,OAAO,QAAA,CAAS,QAAA;AAAA,MAChB,OAAA,EAAS,CAAC,CAAA,KAAyB,WAAA,CAAY,CAAA,IAAA,MAAS,EAAE,GAAG,IAAA,EAAM,QAAA,EAAU,CAAA,CAAE,MAAA,CAAO,KAAA,EAAM,CAAE,CAAA;AAAA,MAC9F,WAAA,EAAY,gCAAA;AAAA,MACZ,IAAA,EAAK;AAAA;AAAA,GACP,EACC,KAAA,oBAASA,MAAAA,CAAA,cAAC,IAAA,EAAA,EAAK,SAAA,EAAU,YAAA,EAAA,EAAc,KAAM,mBAC9CA,MAAAA,CAAA,aAAA,CAAC,MAAA,EAAA,EAAO,WAAU,aAAA,EAAc,OAAA,EAAkB,OAAA,EAAS,YAAA,EAAA,EACxD,UAAU,uBAAA,GAAW,cACxB,CAAA,EACC,kBAAA,oBACCA,MAAAA,CAAA,aAAA,CAAC,MAAA,EAAA,EAAO,SAAA,EAAU,eAAc,OAAA,EAAS,kBAAA,EAAA,EAAoB,oBAE7D,CAEJ,CACF,CACF,CAAA;AAEJ;ACtEe,SAAR,cAA+B,EAAE,MAAA,EAAQ,OAAA,EAAS,SAAA,EAAW,iBAAgB,EAAuB;AACzG,EAAA,MAAM,EAAE,QAAA,EAAS,GAAI,OAAA,EAAQ;AAC7B,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAID,QAAAA,CAAS;AAAA,IACvC,KAAA,EAAO,EAAA;AAAA,IACP,IAAA,EAAM,EAAA;AAAA,IACN,QAAA,EAAU,EAAA;AAAA,IACV,eAAA,EAAiB;AAAA,GAClB,CAAA;AACD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAS,EAAE,CAAA;AACrC,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,SAAS,KAAK,CAAA;AAE5C,EAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AAEpB,EAAA,MAAM,eAAe,YAAY;AAC/B,IAAA,QAAA,CAAS,EAAE,CAAA;AACX,IAAA,UAAA,CAAW,IAAI,CAAA;AAEf,IAAA,IAAI,CAAC,SAAS,KAAA,IAAS,CAAC,SAAS,QAAA,IAAY,CAAC,SAAS,eAAA,EAAiB;AACtE,MAAA,QAAA,CAAS,4CAAS,CAAA;AAClB,MAAA,UAAA,CAAW,KAAK,CAAA;AAChB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,mBAAA,CAAoB,QAAA,CAAS,KAAK,CAAA,EAAG;AACxC,MAAA,QAAA,CAAS,wDAAW,CAAA;AACpB,MAAA,UAAA,CAAW,KAAK,CAAA;AAChB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,kBAAA,GAAqB,gBAAA,CAAiB,QAAA,CAAS,QAAQ,CAAA;AAC7D,IAAA,IAAI,CAAC,mBAAmB,KAAA,EAAO;AAC7B,MAAA,QAAA,CAAS,kBAAA,CAAmB,WAAW,sCAAQ,CAAA;AAC/C,MAAA,UAAA,CAAW,KAAK,CAAA;AAChB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,QAAA,CAAS,QAAA,KAAa,QAAA,CAAS,eAAA,EAAiB;AAClD,MAAA,QAAA,CAAS,8DAAY,CAAA;AACrB,MAAA,UAAA,CAAW,KAAK,CAAA;AAChB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS;AAAA,MAC5B,OAAO,QAAA,CAAS,KAAA;AAAA,MAChB,UAAU,QAAA,CAAS,QAAA;AAAA,MACnB,IAAA,EAAM,SAAS,IAAA,IAAQ;AAAA,KACxB,CAAA;AAED,IAAA,IAAI,OAAO,OAAA,EAAS;AAClB,MAAA,SAAA,EAAU;AAAA,IACZ,CAAA,MAAO;AACL,MAAA,QAAA,CAAS,MAAA,CAAO,WAAW,0BAAM,CAAA;AAAA,IACnC;AAEA,IAAA,UAAA,CAAW,KAAK,CAAA;AAAA,EAClB,CAAA;AAEA,EAAA,uBACEC,OAAA,aAAA,CAACC,IAAAA,EAAA,EAAK,SAAA,EAAU,YAAA,EAAA,kBACdD,MAAAA,CAAA,aAAA,CAACC,IAAAA,EAAA,EAAK,SAAA,EAAU,WAAA,EAAA,kBACdD,MAAAA,CAAA,aAAA,CAACC,IAAAA,EAAA,EAAK,SAAA,EAAU,aAAA,EAAA,kBACdD,MAAAA,CAAA,aAAA,CAACE,IAAAA,EAAA,EAAK,SAAA,EAAU,YAAA,EAAA,EAAa,0BAAI,CAAA,kBACjCF,OAAA,aAAA,CAACG,MAAAA,EAAA,EAAO,SAAA,EAAU,YAAA,EAAa,OAAA,EAAS,WAAS,cAEjD,CACF,CAAA,kBACAH,MAAAA,CAAA,aAAA,CAACC,MAAA,EAAK,SAAA,EAAU,WAAA,EAAA,kBACdD,MAAAA,CAAA,aAAA;AAAA,IAACI,KAAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,OAAA;AAAA,MACL,OAAO,QAAA,CAAS,KAAA;AAAA,MAChB,OAAA,EAAS,CAAC,CAAA,KAAyB,WAAA,CAAY,CAAA,IAAA,MAAS,EAAE,GAAG,IAAA,EAAM,KAAA,EAAO,CAAA,CAAE,MAAA,CAAO,KAAA,EAAM,CAAE,CAAA;AAAA,MAC3F,WAAA,EAAY,sCAAA;AAAA,MACZ,IAAA,EAAK;AAAA;AAAA,GACP,kBACAJ,MAAAA,CAAA,aAAA;AAAA,IAACI,KAAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,MAAA;AAAA,MACL,OAAO,QAAA,CAAS,IAAA;AAAA,MAChB,OAAA,EAAS,CAAC,CAAA,KAAyB,WAAA,CAAY,CAAA,IAAA,MAAS,EAAE,GAAG,IAAA,EAAM,IAAA,EAAM,CAAA,CAAE,MAAA,CAAO,KAAA,EAAM,CAAE,CAAA;AAAA,MAC1F,WAAA,EAAY,gCAAA;AAAA,MACZ,IAAA,EAAK;AAAA;AAAA,GACP,kBACAJ,MAAAA,CAAA,aAAA;AAAA,IAACI,KAAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,UAAA;AAAA,MACL,OAAO,QAAA,CAAS,QAAA;AAAA,MAChB,OAAA,EAAS,CAAC,CAAA,KAAyB,WAAA,CAAY,CAAA,IAAA,MAAS,EAAE,GAAG,IAAA,EAAM,QAAA,EAAU,CAAA,CAAE,MAAA,CAAO,KAAA,EAAM,CAAE,CAAA;AAAA,MAC9F,WAAA,EAAY,gCAAA;AAAA,MACZ,IAAA,EAAK;AAAA;AAAA,GACP,kBACAJ,MAAAA,CAAA,aAAA;AAAA,IAACI,KAAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,iBAAA;AAAA,MACL,OAAO,QAAA,CAAS,eAAA;AAAA,MAChB,OAAA,EAAS,CAAC,CAAA,KAAyB,WAAA,CAAY,CAAA,IAAA,MAAS,EAAE,GAAG,IAAA,EAAM,eAAA,EAAiB,CAAA,CAAE,MAAA,CAAO,KAAA,EAAM,CAAE,CAAA;AAAA,MACrG,WAAA,EAAY,gCAAA;AAAA,MACZ,IAAA,EAAK;AAAA;AAAA,KAEN,KAAA,oBAASJ,MAAAA,CAAA,aAAA,CAACE,MAAA,EAAK,SAAA,EAAU,YAAA,EAAA,EAAc,KAAM,mBAC9CF,MAAAA,CAAA,cAACG,MAAAA,EAAA,EAAO,WAAU,aAAA,EAAc,OAAA,EAAkB,OAAA,EAAS,YAAA,EAAA,EACxD,UAAU,uBAAA,GAAW,cACxB,CAAA,EACC,eAAA,oBACCH,MAAAA,CAAA,aAAA,CAACG,MAAAA,EAAA,EAAO,WAAU,aAAA,EAAc,OAAA,EAAS,mBAAiB,oBAE1D,CAEJ,CACF,CACF,CAAA;AAEJ;AC7Ge,SAAR,mBAAA,CAAqC,EAAE,MAAA,EAAQ,OAAA,EAAS,WAAU,EAA6B;AACpG,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIJ,SAAuC,OAAO,CAAA;AACtE,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,QAAAA,CAAS;AAAA,IACvC,KAAA,EAAO,EAAA;AAAA,IACP,gBAAA,EAAkB,EAAA;AAAA,IAClB,WAAA,EAAa,EAAA;AAAA,IACb,eAAA,EAAiB;AAAA,GAClB,CAAA;AACD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAS,EAAE,CAAA;AACrC,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,SAAS,KAAK,CAAA;AAE5C,EAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AAEpB,EAAA,MAAM,iBAAiB,YAAY;AACjC,IAAA,QAAA,CAAS,EAAE,CAAA;AACX,IAAA,UAAA,CAAW,IAAI,CAAA;AAEf,IAAA,IAAI,CAAC,mBAAA,CAAoB,QAAA,CAAS,KAAK,CAAA,EAAG;AACxC,MAAA,QAAA,CAAS,wDAAW,CAAA;AACpB,MAAA,UAAA,CAAW,KAAK,CAAA;AAChB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,kCAAA,EAAoC;AAAA,QAC/D,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,QAC9C,MAAM,IAAA,CAAK,SAAA,CAAU,EAAE,KAAA,EAAO,QAAA,CAAS,OAAO;AAAA,OAC/C,CAAA;AACD,MAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,MAAA,IAAI,KAAK,OAAA,EAAS;AAChB,QAAA,OAAA,CAAQ,QAAQ,CAAA;AAAA,MAClB,CAAA,MAAO;AACL,QAAA,QAAA,CAAS,IAAA,CAAK,WAAW,0BAAM,CAAA;AAAA,MACjC;AAAA,IACF,SAASM,MAAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,+EAAqCA,MAAK,CAAA;AACxD,MAAA,QAAA,CAAS,8DAAY,CAAA;AAAA,IACvB,CAAA,SAAE;AACA,MAAA,UAAA,CAAW,KAAK,CAAA;AAAA,IAClB;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,mBAAmB,MAAM;AAC7B,IAAA,IAAI,CAAC,SAAS,gBAAA,EAAkB;AAC9B,MAAA,QAAA,CAAS,sCAAQ,CAAA;AACjB,MAAA;AAAA,IACF;AACA,IAAA,OAAA,CAAQ,OAAO,CAAA;AAAA,EACjB,CAAA;AAEA,EAAA,MAAM,sBAAsB,YAAY;AACtC,IAAA,MAAM,kBAAA,GAAqB,gBAAA,CAAiB,QAAA,CAAS,WAAW,CAAA;AAChE,IAAA,IAAI,CAAC,mBAAmB,KAAA,EAAO;AAC7B,MAAA,QAAA,CAAS,kBAAA,CAAmB,WAAW,sCAAQ,CAAA;AAC/C,MAAA;AAAA,IACF;AACA,IAAA,IAAI,QAAA,CAAS,WAAA,KAAgB,QAAA,CAAS,eAAA,EAAiB;AACrD,MAAA,QAAA,CAAS,8DAAY,CAAA;AACrB,MAAA;AAAA,IACF;AAEA,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,0BAAA,EAA4B;AAAA,QACvD,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,QAC9C,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,UACnB,OAAO,QAAA,CAAS,KAAA;AAAA,UAChB,kBAAkB,QAAA,CAAS,gBAAA;AAAA,UAC3B,aAAa,QAAA,CAAS;AAAA,SACvB;AAAA,OACF,CAAA;AACD,MAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,MAAA,IAAI,KAAK,OAAA,EAAS;AAChB,QAAA,SAAA,EAAU;AAAA,MACZ,CAAA,MAAO;AACL,QAAA,QAAA,CAAS,IAAA,CAAK,WAAW,0BAAM,CAAA;AAAA,MACjC;AAAA,IACF,SAASA,MAAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,yEAAoCA,MAAK,CAAA;AACvD,MAAA,QAAA,CAAS,8DAAY,CAAA;AAAA,IACvB,CAAA,SAAE;AACA,MAAA,UAAA,CAAW,KAAK,CAAA;AAAA,IAClB;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,gBAAgB,MAAM;AAC1B,IAAA,IAAI,SAAS,OAAA,EAAS;AACpB,MAAA,uBACEL,MAAAA,CAAA,aAAA,CAAAA,MAAAA,CAAA,QAAA,EAAA,IAAA,kBACEA,MAAAA,CAAA,aAAA;AAAA,QAACI,KAAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,OAAA;AAAA,UACL,OAAO,QAAA,CAAS,KAAA;AAAA,UAChB,OAAA,EAAS,CAAC,CAAA,KAAyB,WAAA,CAAY,CAAA,IAAA,MAAS,EAAE,GAAG,IAAA,EAAM,KAAA,EAAO,CAAA,CAAE,MAAA,CAAO,KAAA,EAAM,CAAE,CAAA;AAAA,UAC3F,WAAA,EAAY,sCAAA;AAAA,UACZ,IAAA,EAAK;AAAA;AAAA,OACP,kBACAJ,MAAAA,CAAA,aAAA,CAACG,QAAA,EAAO,SAAA,EAAU,aAAA,EAAc,OAAA,EAAkB,OAAA,EAAS,cAAA,EAAA,EACxD,OAAA,GAAU,uBAAA,GAAW,gCACxB,CACF,CAAA;AAAA,IAEJ;AAEA,IAAA,IAAI,SAAS,QAAA,EAAU;AACrB,MAAA,uBACEH,MAAAA,CAAA,aAAA,CAAAA,MAAAA,CAAA,QAAA,EAAA,IAAA,kBACEA,MAAAA,CAAA,aAAA;AAAA,QAACI,KAAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,kBAAA;AAAA,UACL,OAAO,QAAA,CAAS,gBAAA;AAAA,UAChB,OAAA,EAAS,CAAC,CAAA,KAAyB,WAAA,CAAY,CAAA,IAAA,MAAS,EAAE,GAAG,IAAA,EAAM,gBAAA,EAAkB,CAAA,CAAE,MAAA,CAAO,KAAA,EAAM,CAAE,CAAA;AAAA,UACtG,WAAA,EAAY,sCAAA;AAAA,UACZ,IAAA,EAAK;AAAA;AAAA,OACP,kBACAJ,MAAAA,CAAA,aAAA,CAACG,MAAAA,EAAA,EAAO,SAAA,EAAU,aAAA,EAAc,OAAA,EAAS,gBAAA,EAAA,EAAkB,oBAE3D,CACF,CAAA;AAAA,IAEJ;AAEA,IAAA,uBACEH,MAAAA,CAAA,aAAA,CAAAA,MAAAA,CAAA,QAAA,EAAA,IAAA,kBACEA,MAAAA,CAAA,aAAA;AAAA,MAACI,KAAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,aAAA;AAAA,QACL,OAAO,QAAA,CAAS,WAAA;AAAA,QAChB,OAAA,EAAS,CAAC,CAAA,KAAyB,WAAA,CAAY,CAAA,IAAA,MAAS,EAAE,GAAG,IAAA,EAAM,WAAA,EAAa,CAAA,CAAE,MAAA,CAAO,KAAA,EAAM,CAAE,CAAA;AAAA,QACjG,WAAA,EAAY,sCAAA;AAAA,QACZ,IAAA,EAAK;AAAA;AAAA,KACP,kBACAJ,MAAAA,CAAA,aAAA;AAAA,MAACI,KAAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,iBAAA;AAAA,QACL,OAAO,QAAA,CAAS,eAAA;AAAA,QAChB,OAAA,EAAS,CAAC,CAAA,KAAyB,WAAA,CAAY,CAAA,IAAA,MAAS,EAAE,GAAG,IAAA,EAAM,eAAA,EAAiB,CAAA,CAAE,MAAA,CAAO,KAAA,EAAM,CAAE,CAAA;AAAA,QACrG,WAAA,EAAY,sCAAA;AAAA,QACZ,IAAA,EAAK;AAAA;AAAA,KACP,kBACAJ,MAAAA,CAAA,aAAA,CAACG,QAAA,EAAO,SAAA,EAAU,aAAA,EAAc,OAAA,EAAkB,OAAA,EAAS,mBAAA,EAAA,EACxD,OAAA,GAAU,uBAAA,GAAW,0BACxB,CACF,CAAA;AAAA,EAEJ,CAAA;AAEA,EAAA,uBACEH,MAAAA,CAAA,aAAA,CAACC,IAAAA,EAAA,EAAK,SAAA,EAAU,YAAA,EAAA,kBACdD,MAAAA,CAAA,aAAA,CAACC,IAAAA,EAAA,EAAK,SAAA,EAAU,WAAA,EAAA,kBACdD,MAAAA,CAAA,aAAA,CAACC,IAAAA,EAAA,EAAK,SAAA,EAAU,aAAA,EAAA,kBACdD,MAAAA,CAAA,aAAA,CAACE,IAAAA,EAAA,EAAK,SAAA,EAAU,YAAA,EAAA,EAAa,0BAAI,CAAA,kBACjCF,MAAAA,CAAA,aAAA,CAACG,MAAAA,EAAA,EAAO,SAAA,EAAU,YAAA,EAAa,OAAA,EAAS,OAAA,EAAA,EAAS,cAEjD,CACF,CAAA,kBACAH,MAAAA,CAAA,aAAA,CAACC,IAAAA,EAAA,EAAK,SAAA,EAAU,WAAA,EAAA,EACb,aAAA,EAAc,EACd,KAAA,oBAASD,MAAAA,CAAA,aAAA,CAACE,IAAAA,EAAA,EAAK,SAAA,EAAU,YAAA,EAAA,EAAc,KAAM,CAChD,CACF,CACF,CAAA;AAEJ","file":"index.mjs","sourcesContent":["'use client';\n\nimport React, { createContext, useContext, useState, useEffect, useCallback, useRef } from 'react';\nimport type { User, UseAuthReturn, LoginRequest, RegisterRequest } from '../types';\n\ninterface AuthContextType extends UseAuthReturn {}\n\nconst AuthContext = createContext<AuthContextType | undefined>(undefined);\n\nexport function AuthProvider({ children }: { children: React.ReactNode }) {\n const [user, setUser] = useState<User | null>(null);\n const [loading, setLoading] = useState(true);\n const [isAuthenticated, setIsAuthenticated] = useState(false);\n const isMountedRef = useRef(true);\n\n // 安全的状态更新函数\n const safeSetState = useCallback((updater: () => void) => {\n if (isMountedRef.current) {\n updater();\n }\n }, []);\n\n // 验证会话\n const validateSession = useCallback(async () => {\n console.log('🔍 [AuthContext] 开始验证会话...');\n try {\n const response = await fetch('/api/auth/validate');\n console.log('📡 [AuthContext] 会话验证响应状态:', response.status);\n \n const data = await response.json();\n console.log('📄 [AuthContext] 会话验证响应数据:', data);\n \n safeSetState(() => {\n if (data.valid && data.user) {\n console.log('✅ [AuthContext] 会话验证成功, 用户:', data.user);\n setUser(data.user);\n setIsAuthenticated(true);\n } else {\n console.log('❌ [AuthContext] 会话验证失败:', data.message);\n setUser(null);\n setIsAuthenticated(false);\n }\n setLoading(false);\n });\n } catch (error) {\n console.error('💥 [AuthContext] 会话验证异常:', error);\n safeSetState(() => {\n setUser(null);\n setIsAuthenticated(false);\n setLoading(false);\n });\n }\n }, [safeSetState]);\n\n // 登录\n const login = useCallback(async (credentials: LoginRequest) => {\n console.log('🔑 [AuthContext] 开始登录...');\n console.log('📝 [AuthContext] 登录凭据:', { phone: credentials.phone, password: '***' });\n \n try {\n console.log('📤 [AuthContext] 发送登录请求到 /api/auth/login');\n const response = await fetch('/api/auth/login', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(credentials),\n });\n\n console.log('📡 [AuthContext] 收到响应,状态码:', response.status);\n const data = await response.json();\n console.log('📄 [AuthContext] 响应数据:', data);\n\n if (data.success && data.user) {\n console.log('✅ [AuthContext] 登录成功, 开始更新全局状态');\n console.log('👤 [AuthContext] 用户数据:', data.user);\n \n // 记录当前状态\n console.log('📊 [AuthContext] 更新前状态:', {\n currentUser: user ? `${user.name || '未设置'} (${user.phone})` : null,\n currentIsAuthenticated: isAuthenticated,\n currentLoading: loading\n });\n \n // 使用同步的状态更新确保立即生效\n console.log('🔄 [AuthContext] 执行全局状态更新...');\n safeSetState(() => {\n console.log('🔄 [AuthContext] 正在设置用户:', data.user);\n setUser(data.user);\n console.log('🔄 [AuthContext] 正在设置认证状态: true');\n setIsAuthenticated(true);\n console.log('🔄 [AuthContext] 正在设置加载状态: false');\n setLoading(false);\n console.log('✅ [AuthContext] 全局状态更新完成');\n });\n \n // 等待下一个事件循环后输出确认日志\n setTimeout(() => {\n console.log('🎉 [AuthContext] 延迟确认 - 全局登录状态应该已更新:', {\n user: data.user,\n isAuthenticated: true\n });\n }, 0);\n \n console.log('🚀 [AuthContext] 返回成功结果');\n return { success: true, user: data.user };\n } else {\n console.log('❌ [AuthContext] 登录失败:', data.message);\n return { success: false, message: data.message };\n }\n } catch (error) {\n console.error('💥 [AuthContext] 登录异常:', error);\n return { success: false, message: '登录失败,请稍后重试' };\n }\n }, [safeSetState, user, isAuthenticated, loading]);\n\n // 注册\n const register = useCallback(async (userData: RegisterRequest) => {\n console.log('📝 [AuthContext] 开始注册...');\n try {\n const response = await fetch('/api/auth/register', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(userData),\n });\n\n const data = await response.json();\n console.log('📡 [AuthContext] 注册响应:', data);\n\n if (data.success && data.user) {\n console.log('✅ [AuthContext] 注册成功, 立即更新全局状态');\n \n // 使用同步的状态更新确保立即生效\n safeSetState(() => {\n setUser(data.user);\n setIsAuthenticated(true);\n setLoading(false);\n });\n \n console.log('🚀 [AuthContext] 返回注册成功结果');\n return { success: true, user: data.user };\n } else {\n console.log('❌ [AuthContext] 注册失败:', data.message);\n return { success: false, message: data.message };\n }\n } catch (error) {\n console.error('💥 [AuthContext] 注册异常:', error);\n return { success: false, message: '注册失败,请稍后重试' };\n }\n }, [safeSetState]);\n\n // 登出\n const logout = useCallback(async () => {\n console.log('🚪 [AuthContext] 开始登出...');\n try {\n await fetch('/api/auth/logout', { method: 'POST' });\n safeSetState(() => {\n setUser(null);\n setIsAuthenticated(false);\n });\n console.log('✅ [AuthContext] 登出成功, 全局状态已清除');\n } catch (error) {\n console.error('💥 [AuthContext] 登出失败:', error);\n }\n }, [safeSetState]);\n\n // 刷新用户信息\n const refreshUser = useCallback(() => {\n console.log('🔄 [AuthContext] 刷新用户信息...');\n setLoading(true);\n validateSession();\n }, [validateSession]);\n\n // 组件挂载/卸载管理\n useEffect(() => {\n isMountedRef.current = true;\n return () => {\n isMountedRef.current = false;\n };\n }, []);\n\n // 初始化时验证会话\n useEffect(() => {\n console.log('🚀 [AuthContext] 初始化, 开始验证会话');\n validateSession();\n }, [validateSession]);\n\n // 状态变化监控(用于调试)\n useEffect(() => {\n console.log('📊 [AuthContext] 全局状态变化:', {\n isAuthenticated,\n user: user ? `${user.name || '未设置'} (${user.phone})` : null,\n loading\n });\n }, [isAuthenticated, user, loading]);\n\n const value: AuthContextType = {\n user,\n loading,\n isAuthenticated,\n login,\n register,\n logout,\n refreshUser,\n };\n\n return (\n <AuthContext.Provider value={value}>\n {children}\n </AuthContext.Provider>\n );\n}\n\nexport function useAuth(): UseAuthReturn {\n const context = useContext(AuthContext);\n if (context === undefined) {\n throw new Error('useAuth must be used within an AuthProvider');\n }\n return context;\n} ","import type { User } from '../types';\n\n/**\n * 验证手机号格式\n */\nexport function validatePhoneNumber(phone: string): boolean {\n return /^1[3-9]\\d{9}$/.test(phone);\n}\n\n/**\n * 验证密码强度(可扩展)\n */\nexport function validatePassword(password: string): { valid: boolean; message?: string } {\n if (!password) {\n return { valid: false, message: '密码不能为空' };\n }\n \n if (password.length < 6) {\n return { valid: false, message: '密码长度至少6位' };\n }\n \n return { valid: true };\n}\n\n/**\n * 生成安全的会话令牌\n */\nexport function generateSessionToken(): string {\n // 在实际环境中,应该使用更安全的随机数生成\n return Math.random().toString(36).substring(2) + \n Date.now().toString(36) + \n Math.random().toString(36).substring(2);\n}\n\n/**\n * 检查用户是否为管理员\n */\nexport function isAdmin(user: User | null): boolean {\n return user?.role === 'admin';\n}\n\n/**\n * 检查用户是否处于活跃状态\n */\nexport function isActiveUser(user: User | null): boolean {\n return user?.isActive === true;\n}\n\n/**\n * 格式化用户显示名称\n */\nexport function getUserDisplayName(user: User): string {\n return user.name || user.phone || '未知用户';\n}\n\n/**\n * 计算会话过期时间\n */\nexport function calculateSessionExpiry(days: number = 30): Date {\n return new Date(Date.now() + days * 24 * 60 * 60 * 1000);\n}\n\n/**\n * 检查会话是否过期\n */\nexport function isSessionExpired(expiresAt: Date): boolean {\n return new Date() > new Date(expiresAt);\n} ","'use client';\n\nimport React, { useState } from 'react';\nimport { View, Text, Input, Button } from '@tarojs/components';\nimport { useAuth } from '../../../contexts/AuthContext';\nimport { validatePhoneNumber } from '../../../utils/authUtils';\nimport type { LoginModalProps } from '../../../types';\n\ntype MiniappInputEvent = {\n detail: {\n value: string;\n };\n};\n\nexport default function LoginModal({ isOpen, onClose, onSuccess, onSwitchToRegister }: LoginModalProps) {\n const { login } = useAuth();\n const [formData, setFormData] = useState({ phone: '', password: '' });\n const [error, setError] = useState('');\n const [loading, setLoading] = useState(false);\n\n if (!isOpen) return null;\n\n const handleSubmit = async () => {\n setError('');\n setLoading(true);\n\n if (!formData.phone || !formData.password) {\n setError('请填写完整信息');\n setLoading(false);\n return;\n }\n\n if (!validatePhoneNumber(formData.phone)) {\n setError('请输入正确的手机号');\n setLoading(false);\n return;\n }\n\n const result = await login(formData);\n if (result.success) {\n onSuccess();\n } else {\n setError(result.message || '登录失败');\n }\n setLoading(false);\n };\n\n return (\n <View className=\"auth-modal\">\n <View className=\"auth-card\">\n <View className=\"auth-header\">\n <Text className=\"auth-title\">用户登录</Text>\n <Button className=\"auth-close\" onClick={onClose}>\n 关闭\n </Button>\n </View>\n <View className=\"auth-form\">\n <Input\n name=\"phone\"\n value={formData.phone}\n onInput={(e: MiniappInputEvent) => setFormData(prev => ({ ...prev, phone: e.detail.value }))}\n placeholder=\"请输入手机号\"\n type=\"text\"\n />\n <Input\n name=\"password\"\n value={formData.password}\n onInput={(e: MiniappInputEvent) => setFormData(prev => ({ ...prev, password: e.detail.value }))}\n placeholder=\"请输入密码\"\n type=\"password\"\n />\n {error && <Text className=\"auth-error\">{error}</Text>}\n <Button className=\"auth-submit\" loading={loading} onClick={handleSubmit}>\n {loading ? '登录中...' : '登录'}\n </Button>\n {onSwitchToRegister && (\n <Button className=\"auth-switch\" onClick={onSwitchToRegister}>\n 去注册\n </Button>\n )}\n </View>\n </View>\n </View>\n );\n}\n","'use client';\n\nimport React, { useState } from 'react';\nimport { View, Text, Input, Button } from '@tarojs/components';\nimport { useAuth } from '../../../contexts/AuthContext';\nimport { validatePhoneNumber, validatePassword } from '../../../utils/authUtils';\nimport type { RegisterModalProps } from '../../../types';\n\ntype MiniappInputEvent = {\n detail: {\n value: string;\n };\n};\n\nexport default function RegisterModal({ isOpen, onClose, onSuccess, onSwitchToLogin }: RegisterModalProps) {\n const { register } = useAuth();\n const [formData, setFormData] = useState({\n phone: '',\n name: '',\n password: '',\n confirmPassword: '',\n });\n const [error, setError] = useState('');\n const [loading, setLoading] = useState(false);\n\n if (!isOpen) return null;\n\n const handleSubmit = async () => {\n setError('');\n setLoading(true);\n\n if (!formData.phone || !formData.password || !formData.confirmPassword) {\n setError('请填写完整信息');\n setLoading(false);\n return;\n }\n\n if (!validatePhoneNumber(formData.phone)) {\n setError('请输入正确的手机号');\n setLoading(false);\n return;\n }\n\n const passwordValidation = validatePassword(formData.password);\n if (!passwordValidation.valid) {\n setError(passwordValidation.message || '密码格式错误');\n setLoading(false);\n return;\n }\n\n if (formData.password !== formData.confirmPassword) {\n setError('两次输入的密码不一致');\n setLoading(false);\n return;\n }\n\n const result = await register({\n phone: formData.phone,\n password: formData.password,\n name: formData.name || undefined,\n });\n\n if (result.success) {\n onSuccess();\n } else {\n setError(result.message || '注册失败');\n }\n\n setLoading(false);\n };\n\n return (\n <View className=\"auth-modal\">\n <View className=\"auth-card\">\n <View className=\"auth-header\">\n <Text className=\"auth-title\">用户注册</Text>\n <Button className=\"auth-close\" onClick={onClose}>\n 关闭\n </Button>\n </View>\n <View className=\"auth-form\">\n <Input\n name=\"phone\"\n value={formData.phone}\n onInput={(e: MiniappInputEvent) => setFormData(prev => ({ ...prev, phone: e.detail.value }))}\n placeholder=\"请输入手机号\"\n type=\"text\"\n />\n <Input\n name=\"name\"\n value={formData.name}\n onInput={(e: MiniappInputEvent) => setFormData(prev => ({ ...prev, name: e.detail.value }))}\n placeholder=\"请输入昵称\"\n type=\"text\"\n />\n <Input\n name=\"password\"\n value={formData.password}\n onInput={(e: MiniappInputEvent) => setFormData(prev => ({ ...prev, password: e.detail.value }))}\n placeholder=\"请输入密码\"\n type=\"password\"\n />\n <Input\n name=\"confirmPassword\"\n value={formData.confirmPassword}\n onInput={(e: MiniappInputEvent) => setFormData(prev => ({ ...prev, confirmPassword: e.detail.value }))}\n placeholder=\"请确认密码\"\n type=\"password\"\n />\n {error && <Text className=\"auth-error\">{error}</Text>}\n <Button className=\"auth-submit\" loading={loading} onClick={handleSubmit}>\n {loading ? '注册中...' : '注册'}\n </Button>\n {onSwitchToLogin && (\n <Button className=\"auth-switch\" onClick={onSwitchToLogin}>\n 去登录\n </Button>\n )}\n </View>\n </View>\n </View>\n );\n}\n","'use client';\n\nimport React, { useState } from 'react';\nimport { View, Text, Input, Button } from '@tarojs/components';\nimport { validatePhoneNumber, validatePassword } from '../../../utils/authUtils';\nimport type { ForgotPasswordModalProps } from '../../../types';\n\ntype MiniappInputEvent = {\n detail: {\n value: string;\n };\n};\n\nexport default function ForgotPasswordModal({ isOpen, onClose, onSuccess }: ForgotPasswordModalProps) {\n const [step, setStep] = useState<'phone' | 'verify' | 'reset'>('phone');\n const [formData, setFormData] = useState({\n phone: '',\n verificationCode: '',\n newPassword: '',\n confirmPassword: '',\n });\n const [error, setError] = useState('');\n const [loading, setLoading] = useState(false);\n\n if (!isOpen) return null;\n\n const handleSendCode = async () => {\n setError('');\n setLoading(true);\n\n if (!validatePhoneNumber(formData.phone)) {\n setError('请输入正确的手机号');\n setLoading(false);\n return;\n }\n\n try {\n const response = await fetch('/api/auth/send-verification-code', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ phone: formData.phone }),\n });\n const data = await response.json();\n if (data.success) {\n setStep('verify');\n } else {\n setError(data.message || '发送失败');\n }\n } catch (error) {\n console.error('💥 [ForgotPasswordModal] 发送验证码异常:', error);\n setError('发送失败,请稍后重试');\n } finally {\n setLoading(false);\n }\n };\n\n const handleVerifyCode = () => {\n if (!formData.verificationCode) {\n setError('请输入验证码');\n return;\n }\n setStep('reset');\n };\n\n const handleResetPassword = async () => {\n const passwordValidation = validatePassword(formData.newPassword);\n if (!passwordValidation.valid) {\n setError(passwordValidation.message || '密码格式错误');\n return;\n }\n if (formData.newPassword !== formData.confirmPassword) {\n setError('两次输入的密码不一致');\n return;\n }\n\n setLoading(true);\n try {\n const response = await fetch('/api/auth/reset-password', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n phone: formData.phone,\n verificationCode: formData.verificationCode,\n newPassword: formData.newPassword,\n }),\n });\n const data = await response.json();\n if (data.success) {\n onSuccess();\n } else {\n setError(data.message || '重置失败');\n }\n } catch (error) {\n console.error('💥 [ForgotPasswordModal] 重置密码异常:', error);\n setError('重置失败,请稍后重试');\n } finally {\n setLoading(false);\n }\n };\n\n const renderContent = () => {\n if (step === 'phone') {\n return (\n <>\n <Input\n name=\"phone\"\n value={formData.phone}\n onInput={(e: MiniappInputEvent) => setFormData(prev => ({ ...prev, phone: e.detail.value }))}\n placeholder=\"请输入手机号\"\n type=\"text\"\n />\n <Button className=\"auth-submit\" loading={loading} onClick={handleSendCode}>\n {loading ? '发送中...' : '发送验证码'}\n </Button>\n </>\n );\n }\n\n if (step === 'verify') {\n return (\n <>\n <Input\n name=\"verificationCode\"\n value={formData.verificationCode}\n onInput={(e: MiniappInputEvent) => setFormData(prev => ({ ...prev, verificationCode: e.detail.value }))}\n placeholder=\"请输入验证码\"\n type=\"text\"\n />\n <Button className=\"auth-submit\" onClick={handleVerifyCode}>\n 下一步\n </Button>\n </>\n );\n }\n\n return (\n <>\n <Input\n name=\"newPassword\"\n value={formData.newPassword}\n onInput={(e: MiniappInputEvent) => setFormData(prev => ({ ...prev, newPassword: e.detail.value }))}\n placeholder=\"请输入新密码\"\n type=\"password\"\n />\n <Input\n name=\"confirmPassword\"\n value={formData.confirmPassword}\n onInput={(e: MiniappInputEvent) => setFormData(prev => ({ ...prev, confirmPassword: e.detail.value }))}\n placeholder=\"请确认新密码\"\n type=\"password\"\n />\n <Button className=\"auth-submit\" loading={loading} onClick={handleResetPassword}>\n {loading ? '提交中...' : '重置密码'}\n </Button>\n </>\n );\n };\n\n return (\n <View className=\"auth-modal\">\n <View className=\"auth-card\">\n <View className=\"auth-header\">\n <Text className=\"auth-title\">找回密码</Text>\n <Button className=\"auth-close\" onClick={onClose}>\n 关闭\n </Button>\n </View>\n <View className=\"auth-form\">\n {renderContent()}\n {error && <Text className=\"auth-error\">{error}</Text>}\n </View>\n </View>\n </View>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../../../src/auth/legacy/contexts/AuthContext.tsx","../../../../../src/auth/legacy/utils/authUtils.ts","../../../../../src/auth/legacy/ui/miniapp/components/LoginModal.tsx","../../../../../src/auth/legacy/ui/miniapp/components/RegisterModal.tsx","../../../../../src/auth/legacy/ui/miniapp/components/ForgotPasswordModal.tsx"],"names":["useState","React","View","Text","Button","Input","error"],"mappings":"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","file":"index.mjs","sourcesContent":["'use client';\n\nimport React, { createContext, useContext, useState, useEffect, useCallback, useRef } from 'react';\nimport type { User, UseAuthReturn, LoginRequest, RegisterRequest } from '../types';\n\ninterface AuthContextType extends UseAuthReturn {}\n\nconst AuthContext = createContext<AuthContextType | undefined>(undefined);\n\nfunction extractUser(data: any): User | null {\n return data?.user ?? data?.data?.user ?? null;\n}\n\nfunction extractValid(data: any): boolean {\n if (typeof data?.valid === 'boolean') return data.valid;\n if (typeof data?.data?.valid === 'boolean') return data.data.valid;\n return false;\n}\n\nexport function AuthProvider({ children }: { children: React.ReactNode }) {\n const [user, setUser] = useState<User | null>(null);\n const [loading, setLoading] = useState(true);\n const [isAuthenticated, setIsAuthenticated] = useState(false);\n const isMountedRef = useRef(true);\n\n // 安全的状态更新函数\n const safeSetState = useCallback((updater: () => void) => {\n if (isMountedRef.current) {\n updater();\n }\n }, []);\n\n // 验证会话\n const validateSession = useCallback(async () => {\n console.log('🔍 [AuthContext] 开始验证会话...');\n try {\n const response = await fetch('/api/auth/validate');\n console.log('📡 [AuthContext] 会话验证响应状态:', response.status);\n \n const data = await response.json();\n console.log('📄 [AuthContext] 会话验证响应数据:', data);\n const resolvedUser = extractUser(data);\n const resolvedValid = extractValid(data);\n \n safeSetState(() => {\n if (resolvedValid && resolvedUser) {\n console.log('✅ [AuthContext] 会话验证成功, 用户:', resolvedUser);\n setUser(resolvedUser);\n setIsAuthenticated(true);\n } else {\n console.log('❌ [AuthContext] 会话验证失败:', data.message);\n setUser(null);\n setIsAuthenticated(false);\n }\n setLoading(false);\n });\n } catch (error) {\n console.error('💥 [AuthContext] 会话验证异常:', error);\n safeSetState(() => {\n setUser(null);\n setIsAuthenticated(false);\n setLoading(false);\n });\n }\n }, [safeSetState]);\n\n // 登录\n const login = useCallback(async (credentials: LoginRequest) => {\n console.log('🔑 [AuthContext] 开始登录...');\n console.log('📝 [AuthContext] 登录凭据:', { phone: credentials.phone, password: '***' });\n \n try {\n console.log('📤 [AuthContext] 发送登录请求到 /api/auth/login');\n const response = await fetch('/api/auth/login', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(credentials),\n });\n\n console.log('📡 [AuthContext] 收到响应,状态码:', response.status);\n const data = await response.json();\n console.log('📄 [AuthContext] 响应数据:', data);\n const resolvedUser = extractUser(data);\n\n if (data.success && resolvedUser) {\n console.log('✅ [AuthContext] 登录成功, 开始更新全局状态');\n console.log('👤 [AuthContext] 用户数据:', resolvedUser);\n \n // 记录当前状态\n console.log('📊 [AuthContext] 更新前状态:', {\n currentUser: user ? `${user.name || '未设置'} (${user.phone})` : null,\n currentIsAuthenticated: isAuthenticated,\n currentLoading: loading\n });\n \n // 使用同步的状态更新确保立即生效\n console.log('🔄 [AuthContext] 执行全局状态更新...');\n safeSetState(() => {\n console.log('🔄 [AuthContext] 正在设置用户:', resolvedUser);\n setUser(resolvedUser);\n console.log('🔄 [AuthContext] 正在设置认证状态: true');\n setIsAuthenticated(true);\n console.log('🔄 [AuthContext] 正在设置加载状态: false');\n setLoading(false);\n console.log('✅ [AuthContext] 全局状态更新完成');\n });\n \n // 等待下一个事件循环后输出确认日志\n setTimeout(() => {\n console.log('🎉 [AuthContext] 延迟确认 - 全局登录状态应该已更新:', {\n user: resolvedUser,\n isAuthenticated: true\n });\n }, 0);\n \n console.log('🚀 [AuthContext] 返回成功结果');\n return { success: true, user: resolvedUser };\n } else {\n console.log('❌ [AuthContext] 登录失败:', data.message);\n return { success: false, message: data.message };\n }\n } catch (error) {\n console.error('💥 [AuthContext] 登录异常:', error);\n return { success: false, message: '登录失败,请稍后重试' };\n }\n }, [safeSetState, user, isAuthenticated, loading]);\n\n // 注册\n const register = useCallback(async (userData: RegisterRequest) => {\n console.log('📝 [AuthContext] 开始注册...');\n try {\n const response = await fetch('/api/auth/register', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(userData),\n });\n\n const data = await response.json();\n console.log('📡 [AuthContext] 注册响应:', data);\n const resolvedUser = extractUser(data);\n\n if (data.success && resolvedUser) {\n console.log('✅ [AuthContext] 注册成功, 立即更新全局状态');\n \n // 使用同步的状态更新确保立即生效\n safeSetState(() => {\n setUser(resolvedUser);\n setIsAuthenticated(true);\n setLoading(false);\n });\n \n console.log('🚀 [AuthContext] 返回注册成功结果');\n return { success: true, user: resolvedUser };\n } else {\n console.log('❌ [AuthContext] 注册失败:', data.message);\n return { success: false, message: data.message };\n }\n } catch (error) {\n console.error('💥 [AuthContext] 注册异常:', error);\n return { success: false, message: '注册失败,请稍后重试' };\n }\n }, [safeSetState]);\n\n // 登出\n const logout = useCallback(async () => {\n console.log('🚪 [AuthContext] 开始登出...');\n try {\n await fetch('/api/auth/logout', { method: 'POST' });\n safeSetState(() => {\n setUser(null);\n setIsAuthenticated(false);\n });\n console.log('✅ [AuthContext] 登出成功, 全局状态已清除');\n } catch (error) {\n console.error('💥 [AuthContext] 登出失败:', error);\n }\n }, [safeSetState]);\n\n // 刷新用户信息\n const refreshUser = useCallback(() => {\n console.log('🔄 [AuthContext] 刷新用户信息...');\n setLoading(true);\n validateSession();\n }, [validateSession]);\n\n // 组件挂载/卸载管理\n useEffect(() => {\n isMountedRef.current = true;\n return () => {\n isMountedRef.current = false;\n };\n }, []);\n\n // 初始化时验证会话\n useEffect(() => {\n console.log('🚀 [AuthContext] 初始化, 开始验证会话');\n validateSession();\n }, [validateSession]);\n\n // 状态变化监控(用于调试)\n useEffect(() => {\n console.log('📊 [AuthContext] 全局状态变化:', {\n isAuthenticated,\n user: user ? `${user.name || '未设置'} (${user.phone})` : null,\n loading\n });\n }, [isAuthenticated, user, loading]);\n\n const value: AuthContextType = {\n user,\n loading,\n isAuthenticated,\n login,\n register,\n logout,\n refreshUser,\n };\n\n return (\n <AuthContext.Provider value={value}>\n {children}\n </AuthContext.Provider>\n );\n}\n\nexport function useAuth(): UseAuthReturn {\n const context = useContext(AuthContext);\n if (context === undefined) {\n throw new Error('useAuth must be used within an AuthProvider');\n }\n return context;\n} \n","import type { User } from '../types';\n\n/**\n * 验证手机号格式\n */\nexport function validatePhoneNumber(phone: string): boolean {\n return /^1[3-9]\\d{9}$/.test(phone);\n}\n\n/**\n * 验证密码强度(可扩展)\n */\nexport function validatePassword(password: string): { valid: boolean; message?: string } {\n if (!password) {\n return { valid: false, message: '密码不能为空' };\n }\n \n if (password.length < 6) {\n return { valid: false, message: '密码长度至少6位' };\n }\n \n return { valid: true };\n}\n\n/**\n * 生成安全的会话令牌\n */\nexport function generateSessionToken(): string {\n // 在实际环境中,应该使用更安全的随机数生成\n return Math.random().toString(36).substring(2) + \n Date.now().toString(36) + \n Math.random().toString(36).substring(2);\n}\n\n/**\n * 检查用户是否为管理员\n */\nexport function isAdmin(user: User | null): boolean {\n return user?.role === 'admin';\n}\n\n/**\n * 检查用户是否处于活跃状态\n */\nexport function isActiveUser(user: User | null): boolean {\n return user?.isActive === true;\n}\n\n/**\n * 格式化用户显示名称\n */\nexport function getUserDisplayName(user: User): string {\n return user.name || user.phone || '未知用户';\n}\n\n/**\n * 计算会话过期时间\n */\nexport function calculateSessionExpiry(days: number = 30): Date {\n return new Date(Date.now() + days * 24 * 60 * 60 * 1000);\n}\n\n/**\n * 检查会话是否过期\n */\nexport function isSessionExpired(expiresAt: Date): boolean {\n return new Date() > new Date(expiresAt);\n} ","'use client';\n\nimport React, { useState } from 'react';\nimport { View, Text, Input, Button } from '@tarojs/components';\nimport { useAuth } from '../../../contexts/AuthContext';\nimport { validatePhoneNumber } from '../../../utils/authUtils';\nimport type { LoginModalProps } from '../../../types';\n\ntype MiniappInputEvent = {\n detail: {\n value: string;\n };\n};\n\nexport default function LoginModal({ isOpen, onClose, onSuccess, onSwitchToRegister }: LoginModalProps) {\n const { login } = useAuth();\n const [formData, setFormData] = useState({ phone: '', password: '' });\n const [error, setError] = useState('');\n const [loading, setLoading] = useState(false);\n\n if (!isOpen) return null;\n\n const handleSubmit = async () => {\n setError('');\n setLoading(true);\n\n if (!formData.phone || !formData.password) {\n setError('请填写完整信息');\n setLoading(false);\n return;\n }\n\n if (!validatePhoneNumber(formData.phone)) {\n setError('请输入正确的手机号');\n setLoading(false);\n return;\n }\n\n const result = await login(formData);\n if (result.success) {\n onSuccess();\n } else {\n setError(result.message || '登录失败');\n }\n setLoading(false);\n };\n\n return (\n <View className=\"auth-modal\">\n <View className=\"auth-card\">\n <View className=\"auth-header\">\n <Text className=\"auth-title\">用户登录</Text>\n <Button className=\"auth-close\" onClick={onClose}>\n 关闭\n </Button>\n </View>\n <View className=\"auth-form\">\n <Input\n name=\"phone\"\n value={formData.phone}\n onInput={(e: MiniappInputEvent) => setFormData(prev => ({ ...prev, phone: e.detail.value }))}\n placeholder=\"请输入手机号\"\n type=\"text\"\n />\n <Input\n name=\"password\"\n value={formData.password}\n onInput={(e: MiniappInputEvent) => setFormData(prev => ({ ...prev, password: e.detail.value }))}\n placeholder=\"请输入密码\"\n type=\"password\"\n />\n {error && <Text className=\"auth-error\">{error}</Text>}\n <Button className=\"auth-submit\" loading={loading} onClick={handleSubmit}>\n {loading ? '登录中...' : '登录'}\n </Button>\n {onSwitchToRegister && (\n <Button className=\"auth-switch\" onClick={onSwitchToRegister}>\n 去注册\n </Button>\n )}\n </View>\n </View>\n </View>\n );\n}\n","'use client';\n\nimport React, { useState } from 'react';\nimport { View, Text, Input, Button } from '@tarojs/components';\nimport { useAuth } from '../../../contexts/AuthContext';\nimport { validatePhoneNumber, validatePassword } from '../../../utils/authUtils';\nimport type { RegisterModalProps } from '../../../types';\n\ntype MiniappInputEvent = {\n detail: {\n value: string;\n };\n};\n\nexport default function RegisterModal({ isOpen, onClose, onSuccess, onSwitchToLogin }: RegisterModalProps) {\n const { register } = useAuth();\n const [formData, setFormData] = useState({\n phone: '',\n name: '',\n password: '',\n confirmPassword: '',\n });\n const [error, setError] = useState('');\n const [loading, setLoading] = useState(false);\n\n if (!isOpen) return null;\n\n const handleSubmit = async () => {\n setError('');\n setLoading(true);\n\n if (!formData.phone || !formData.password || !formData.confirmPassword) {\n setError('请填写完整信息');\n setLoading(false);\n return;\n }\n\n if (!validatePhoneNumber(formData.phone)) {\n setError('请输入正确的手机号');\n setLoading(false);\n return;\n }\n\n const passwordValidation = validatePassword(formData.password);\n if (!passwordValidation.valid) {\n setError(passwordValidation.message || '密码格式错误');\n setLoading(false);\n return;\n }\n\n if (formData.password !== formData.confirmPassword) {\n setError('两次输入的密码不一致');\n setLoading(false);\n return;\n }\n\n const result = await register({\n phone: formData.phone,\n password: formData.password,\n name: formData.name || undefined,\n });\n\n if (result.success) {\n onSuccess();\n } else {\n setError(result.message || '注册失败');\n }\n\n setLoading(false);\n };\n\n return (\n <View className=\"auth-modal\">\n <View className=\"auth-card\">\n <View className=\"auth-header\">\n <Text className=\"auth-title\">用户注册</Text>\n <Button className=\"auth-close\" onClick={onClose}>\n 关闭\n </Button>\n </View>\n <View className=\"auth-form\">\n <Input\n name=\"phone\"\n value={formData.phone}\n onInput={(e: MiniappInputEvent) => setFormData(prev => ({ ...prev, phone: e.detail.value }))}\n placeholder=\"请输入手机号\"\n type=\"text\"\n />\n <Input\n name=\"name\"\n value={formData.name}\n onInput={(e: MiniappInputEvent) => setFormData(prev => ({ ...prev, name: e.detail.value }))}\n placeholder=\"请输入昵称\"\n type=\"text\"\n />\n <Input\n name=\"password\"\n value={formData.password}\n onInput={(e: MiniappInputEvent) => setFormData(prev => ({ ...prev, password: e.detail.value }))}\n placeholder=\"请输入密码\"\n type=\"password\"\n />\n <Input\n name=\"confirmPassword\"\n value={formData.confirmPassword}\n onInput={(e: MiniappInputEvent) => setFormData(prev => ({ ...prev, confirmPassword: e.detail.value }))}\n placeholder=\"请确认密码\"\n type=\"password\"\n />\n {error && <Text className=\"auth-error\">{error}</Text>}\n <Button className=\"auth-submit\" loading={loading} onClick={handleSubmit}>\n {loading ? '注册中...' : '注册'}\n </Button>\n {onSwitchToLogin && (\n <Button className=\"auth-switch\" onClick={onSwitchToLogin}>\n 去登录\n </Button>\n )}\n </View>\n </View>\n </View>\n );\n}\n","'use client';\n\nimport React, { useState } from 'react';\nimport { View, Text, Input, Button } from '@tarojs/components';\nimport { validatePhoneNumber, validatePassword } from '../../../utils/authUtils';\nimport type { ForgotPasswordModalProps } from '../../../types';\n\ntype MiniappInputEvent = {\n detail: {\n value: string;\n };\n};\n\nexport default function ForgotPasswordModal({ isOpen, onClose, onSuccess }: ForgotPasswordModalProps) {\n const [step, setStep] = useState<'phone' | 'verify' | 'reset'>('phone');\n const [formData, setFormData] = useState({\n phone: '',\n verificationCode: '',\n newPassword: '',\n confirmPassword: '',\n });\n const [error, setError] = useState('');\n const [loading, setLoading] = useState(false);\n\n if (!isOpen) return null;\n\n const handleSendCode = async () => {\n setError('');\n setLoading(true);\n\n if (!validatePhoneNumber(formData.phone)) {\n setError('请输入正确的手机号');\n setLoading(false);\n return;\n }\n\n try {\n const response = await fetch('/api/auth/send-verification-code', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ phone: formData.phone }),\n });\n const data = await response.json();\n if (data.success) {\n setStep('verify');\n } else {\n setError(data.message || '发送失败');\n }\n } catch (error) {\n console.error('💥 [ForgotPasswordModal] 发送验证码异常:', error);\n setError('发送失败,请稍后重试');\n } finally {\n setLoading(false);\n }\n };\n\n const handleVerifyCode = () => {\n if (!formData.verificationCode) {\n setError('请输入验证码');\n return;\n }\n setStep('reset');\n };\n\n const handleResetPassword = async () => {\n const passwordValidation = validatePassword(formData.newPassword);\n if (!passwordValidation.valid) {\n setError(passwordValidation.message || '密码格式错误');\n return;\n }\n if (formData.newPassword !== formData.confirmPassword) {\n setError('两次输入的密码不一致');\n return;\n }\n\n setLoading(true);\n try {\n const response = await fetch('/api/auth/reset-password', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n phone: formData.phone,\n verificationCode: formData.verificationCode,\n newPassword: formData.newPassword,\n }),\n });\n const data = await response.json();\n if (data.success) {\n onSuccess();\n } else {\n setError(data.message || '重置失败');\n }\n } catch (error) {\n console.error('💥 [ForgotPasswordModal] 重置密码异常:', error);\n setError('重置失败,请稍后重试');\n } finally {\n setLoading(false);\n }\n };\n\n const renderContent = () => {\n if (step === 'phone') {\n return (\n <>\n <Input\n name=\"phone\"\n value={formData.phone}\n onInput={(e: MiniappInputEvent) => setFormData(prev => ({ ...prev, phone: e.detail.value }))}\n placeholder=\"请输入手机号\"\n type=\"text\"\n />\n <Button className=\"auth-submit\" loading={loading} onClick={handleSendCode}>\n {loading ? '发送中...' : '发送验证码'}\n </Button>\n </>\n );\n }\n\n if (step === 'verify') {\n return (\n <>\n <Input\n name=\"verificationCode\"\n value={formData.verificationCode}\n onInput={(e: MiniappInputEvent) => setFormData(prev => ({ ...prev, verificationCode: e.detail.value }))}\n placeholder=\"请输入验证码\"\n type=\"text\"\n />\n <Button className=\"auth-submit\" onClick={handleVerifyCode}>\n 下一步\n </Button>\n </>\n );\n }\n\n return (\n <>\n <Input\n name=\"newPassword\"\n value={formData.newPassword}\n onInput={(e: MiniappInputEvent) => setFormData(prev => ({ ...prev, newPassword: e.detail.value }))}\n placeholder=\"请输入新密码\"\n type=\"password\"\n />\n <Input\n name=\"confirmPassword\"\n value={formData.confirmPassword}\n onInput={(e: MiniappInputEvent) => setFormData(prev => ({ ...prev, confirmPassword: e.detail.value }))}\n placeholder=\"请确认新密码\"\n type=\"password\"\n />\n <Button className=\"auth-submit\" loading={loading} onClick={handleResetPassword}>\n {loading ? '提交中...' : '重置密码'}\n </Button>\n </>\n );\n };\n\n return (\n <View className=\"auth-modal\">\n <View className=\"auth-card\">\n <View className=\"auth-header\">\n <Text className=\"auth-title\">找回密码</Text>\n <Button className=\"auth-close\" onClick={onClose}>\n 关闭\n </Button>\n </View>\n <View className=\"auth-form\">\n {renderContent()}\n {error && <Text className=\"auth-error\">{error}</Text>}\n </View>\n </View>\n </View>\n );\n}\n"]}
|