feat: 实现 Mini Game AI 工具平台

基于 Next.js 15、React 19 和 TypeScript 构建面向小游戏开发者的 AI 赋能工具平台。

主要功能:
- 首页:包含 Hero、功能展示、优势介绍、定价和 CTA 区域
- 三大核心工具:视频转序列帧、图片压缩、音频压缩
- 响应式布局:包含顶部导航、页脚和侧边栏
- 文件上传:支持拖拽上传,使用 react-dropzone
- 进度追踪:实时显示上传和处理进度
- 可配置工具:每个工具都支持自定义参数配置
- 结果预览:支持下载处理后的文件
- 4K 优化:针对大屏幕优化的响应式设计
- API 路由:文件上传和处理的模拟实现

技术栈:
- Next.js 15 (App Router)
- React 19
- TypeScript (严格模式)
- Tailwind CSS(自定义 4K 断点)
- shadcn/ui 组件库
- Framer Motion 动画
- Zustand 状态管理

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-01-20 22:26:55 +08:00
parent 9529a684a1
commit a7449bf49b
40 changed files with 10963 additions and 0 deletions

45
src/store/authStore.ts Normal file
View File

@@ -0,0 +1,45 @@
import { create } from "zustand";
import { type User } from "@/types";
interface AuthState {
user: User | null;
isAuthenticated: boolean;
isLoading: boolean;
// Actions
setUser: (user: User | null) => void;
login: (user: User) => void;
logout: () => void;
setLoading: (isLoading: boolean) => void;
}
export const useAuthStore = create<AuthState>((set) => ({
user: null,
isAuthenticated: false,
isLoading: true,
setUser: (user) =>
set({
user,
isAuthenticated: !!user,
}),
login: (user) =>
set({
user,
isAuthenticated: true,
isLoading: false,
}),
logout: () =>
set({
user: null,
isAuthenticated: false,
isLoading: false,
}),
setLoading: (isLoading) =>
set({
isLoading,
}),
}));

62
src/store/uploadStore.ts Normal file
View File

@@ -0,0 +1,62 @@
import { create } from "zustand";
import { type UploadedFile, type ProcessingProgress } from "@/types";
interface UploadState {
files: UploadedFile[];
processingStatus: ProcessingProgress;
isProcessing: boolean;
// Actions
addFile: (file: UploadedFile) => void;
removeFile: (id: string) => void;
clearFiles: () => void;
setProcessingStatus: (status: Partial<ProcessingProgress>) => void;
resetProcessingStatus: () => void;
setIsProcessing: (isProcessing: boolean) => void;
}
export const useUploadStore = create<UploadState>((set) => ({
files: [],
processingStatus: {
status: "idle",
progress: 0,
message: "",
},
isProcessing: false,
addFile: (file) =>
set((state) => ({
files: [...state.files, file],
})),
removeFile: (id) =>
set((state) => ({
files: state.files.filter((f) => f.id !== id),
})),
clearFiles: () =>
set({
files: [],
}),
setProcessingStatus: (status) =>
set((state) => ({
processingStatus: { ...state.processingStatus, ...status },
})),
resetProcessingStatus: () =>
set({
processingStatus: {
status: "idle",
progress: 0,
message: "",
},
}),
setIsProcessing: (isProcessing) =>
set({
isProcessing,
}),
}));