后端:Product Module(CRUD)、Requirement Module(CRUD + 状态机流转)、PrismaService 前端:产品列表页、产品详情页(含需求池 Tab)、Zustand Store、API 封装 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
23 lines
847 B
TypeScript
23 lines
847 B
TypeScript
const API_BASE = process.env.NEXT_PUBLIC_API_URL || 'http://localhost:3001/api/v1';
|
|
|
|
async function request<T>(path: string, options?: RequestInit): Promise<T> {
|
|
const res = await fetch(`${API_BASE}${path}`, {
|
|
headers: { 'Content-Type': 'application/json', ...options?.headers },
|
|
...options,
|
|
});
|
|
if (!res.ok) {
|
|
const error = await res.json().catch(() => ({}));
|
|
throw new Error(error.message || `请求失败: ${res.status}`);
|
|
}
|
|
return res.json();
|
|
}
|
|
|
|
export const api = {
|
|
get: <T>(path: string) => request<T>(path),
|
|
post: <T>(path: string, data: unknown) =>
|
|
request<T>(path, { method: 'POST', body: JSON.stringify(data) }),
|
|
patch: <T>(path: string, data: unknown) =>
|
|
request<T>(path, { method: 'PATCH', body: JSON.stringify(data) }),
|
|
delete: <T>(path: string) => request<T>(path, { method: 'DELETE' }),
|
|
};
|