feat: 完成从Supabase到本地化架构的迁移\n\n- 添加本地SQLite数据库支持\n- 实现本地认证系统(JWT + bcrypt)\n- 创建Express.js API服务器\n- 实现完整的命理分析算法\n- 替换Supabase客户端为本地API客户端\n- 保持前端接口兼容性\n- 添加本地服务器启动脚本

This commit is contained in:
patdelphi
2025-08-18 09:41:38 +08:00
parent 5e87725cde
commit e806c216af
13 changed files with 3808 additions and 27 deletions

View File

@@ -1,5 +1,5 @@
import React, { createContext, useContext, useEffect, useState, ReactNode } from 'react';
import { User } from '@supabase/supabase-js';
import { User } from '../lib/localApi';
import { supabase } from '../lib/supabase';
interface AuthContextType {
@@ -25,19 +25,26 @@ export function AuthProvider({ children }: AuthProviderProps) {
async function loadUser() {
setLoading(true);
try {
const { data: { user } } = await supabase.auth.getUser();
setUser(user);
const response = await supabase.auth.getUser();
if (response.data?.user) {
setUser(response.data.user);
} else {
setUser(null);
}
} catch (error) {
console.error('加载用户信息失败:', error);
setUser(null);
} finally {
setLoading(false);
}
}
loadUser();
// Set up auth listener - KEEP SIMPLE, avoid any async operations in callback
// Set up auth listener - 本地API版本
const { data: { subscription } } = supabase.auth.onAuthStateChange(
(_event, session) => {
// NEVER use any async operations in callback
setUser(session?.user || null);
setLoading(false);
}
);
@@ -46,18 +53,25 @@ export function AuthProvider({ children }: AuthProviderProps) {
// Auth methods
async function signIn(email: string, password: string) {
return await supabase.auth.signInWithPassword({ email, password });
const response = await supabase.auth.signInWithPassword({ email, password });
if (response.data?.user) {
setUser(response.data.user);
}
return response;
}
async function signUp(email: string, password: string) {
return await supabase.auth.signUp({
email,
password,
});
const response = await supabase.auth.signUp({ email, password });
if (response.data?.user) {
setUser(response.data.user);
}
return response;
}
async function signOut() {
return await supabase.auth.signOut();
const response = await supabase.auth.signOut();
setUser(null);
return response;
}
return (