Files
s2f/frontend/app/api/[...path]/route.ts
T
freedakgmail 33b4c734aa feat: 完善前后端核心功能模块
后端:
- 新增认证(auth)、任务(tasks)、映射(mappings)、对账(reconciliation)、异常(exceptions)、导出(exports) API
- 新增核心模块: database, security, permissions, tenant, exceptions, error_handlers
- 新增数据模型: user, company, reconciliation_task, field_mapping, uploaded_file 等
- 新增服务层: ai_recognizer, file_parser, file_storage, mapping, reconciliation 等
- 添加数据库迁移脚本

前端:
- 新增登录页面和仪表盘页面
- 新增任务列表、任务详情、字段映射页面
- 新增异常处理页面和规则设置页面
- 新增 API 代理路由 /api/[...path]
- 新增 UI 组件库 (button, card, dialog, input, table 等)
- 新增 auth 组件 (ProtectedRoute, PermissionGate)
- 新增 layout 组件 (Header, Sidebar)
- 新增 mapping 组件 (FieldMappingTable, AISuggestionPanel)
- 新增 API 客户端和 hooks (useAsync, useToast, usePermission 等)
- 新增状态管理 (auth-store, company-store, ui-store)
- 集成 Tailwind CSS 和 shadcn/ui 组件库

其他:
- 添加 Alembic 数据库迁移配置
- 添加初始化示例数据脚本
- 更新项目文档
2026-07-07 09:04:47 +08:00

147 lines
4.0 KiB
TypeScript

import { NextRequest, NextResponse } from 'next/server';
/**
* 通用的 API 代理路由
*/
export async function GET(
request: NextRequest,
{ params }: { params: Promise<{ path: string[] }> }
) {
const { path } = await params;
const targetPath = path.join('/');
const searchParams = request.nextUrl.search;
const targetUrl = `http://localhost:8000/api/${targetPath}${searchParams}`;
const headers: Record<string, string> = {};
request.headers.forEach((value, key) => {
if (key.toLowerCase() !== 'host') {
headers[key] = value;
}
});
try {
const response = await fetch(targetUrl, { headers });
const data = await response.json();
return NextResponse.json(data, { status: response.status });
} catch (error) {
return NextResponse.json({ detail: 'Proxy error' }, { status: 502 });
}
}
export async function POST(
request: NextRequest,
{ params }: { params: Promise<{ path: string[] }> }
) {
const { path } = await params;
const targetPath = path.join('/');
const searchParams = request.nextUrl.search;
const targetUrl = `http://localhost:8000/api/${targetPath}${searchParams}`;
const body = await request.text();
const headers: Record<string, string> = {};
request.headers.forEach((value, key) => {
if (key.toLowerCase() !== 'host') {
headers[key] = value;
}
});
try {
const response = await fetch(targetUrl, {
method: 'POST',
headers,
body,
});
const data = await response.json();
return NextResponse.json(data, { status: response.status });
} catch (error) {
return NextResponse.json({ detail: 'Proxy error' }, { status: 502 });
}
}
export async function PUT(
request: NextRequest,
{ params }: { params: Promise<{ path: string[] }> }
) {
const { path } = await params;
const targetPath = path.join('/');
const searchParams = request.nextUrl.search;
const targetUrl = `http://localhost:8000/api/${targetPath}${searchParams}`;
const body = await request.text();
const headers: Record<string, string> = {};
request.headers.forEach((value, key) => {
if (key.toLowerCase() !== 'host') {
headers[key] = value;
}
});
try {
const response = await fetch(targetUrl, {
method: 'PUT',
headers,
body,
});
const data = await response.json();
return NextResponse.json(data, { status: response.status });
} catch (error) {
return NextResponse.json({ detail: 'Proxy error' }, { status: 502 });
}
}
export async function PATCH(
request: NextRequest,
{ params }: { params: Promise<{ path: string[] }> }
) {
const { path } = await params;
const targetPath = path.join('/');
const searchParams = request.nextUrl.search;
const targetUrl = `http://localhost:8000/api/${targetPath}${searchParams}`;
const body = await request.text();
const headers: Record<string, string> = {};
request.headers.forEach((value, key) => {
if (key.toLowerCase() !== 'host') {
headers[key] = value;
}
});
try {
const response = await fetch(targetUrl, {
method: 'PATCH',
headers,
body,
});
const data = await response.json();
return NextResponse.json(data, { status: response.status });
} catch (error) {
return NextResponse.json({ detail: 'Proxy error' }, { status: 502 });
}
}
export async function DELETE(
request: NextRequest,
{ params }: { params: Promise<{ path: string[] }> }
) {
const { path } = await params;
const targetPath = path.join('/');
const searchParams = request.nextUrl.search;
const targetUrl = `http://localhost:8000/api/${targetPath}${searchParams}`;
const headers: Record<string, string> = {};
request.headers.forEach((value, key) => {
if (key.toLowerCase() !== 'host') {
headers[key] = value;
}
});
try {
const response = await fetch(targetUrl, {
method: 'DELETE',
headers,
});
const data = await response.json();
return NextResponse.json(data, { status: response.status });
} catch (error) {
return NextResponse.json({ detail: 'Proxy error' }, { status: 502 });
}
}