AIOStore-多平台电子商务管理系统
Aiostore 是一个全面的多平台电子商务管理系统,旨在统一Shopee、TikTok Shop、Tokopedia和Lazada平台的运营。这个功能丰富的现代应用程序为产品、订单、分析和客户通信提供了集中管理。
🎯 项目概述
版本: 1.3.0\ 阶段: 第3阶段-生产强化和多租户架构- 进行中\ 目的: 多平台电子商务管理系统\ 目标平台: Shopee、味觉商店、tokopedia、lazada
第3阶段:身份验证+有限写入(v1.3.0)
- ✅ Supabase身份验证集成 -使用会话管理进行电子邮件/密码身份验证
- ✅ 行级安全(RLS) -经过身份验证的用户的数据库级安全策略
- ✅ 有限的写入操作 -带有安全控制的服务层写入方法(干运行模式)
- ✅ 多租户架构 -用户→ 分支→ 渠道账户→ 同步作业结构
- ✅ 生产准备就绪 -部署就绪,具有全面的安全文档
✅ 功能已完成(100%)
核心功能
- 📊 仪表盘 -实时KPI、销售分析和平台性能
- 📦 产品管理 -多平台挂牌、批量操作、库存跟踪
- 📋 订单管理 -统一订单视图、状态跟踪、发货管理
- 💬 聊天界面 -跨所有平台的统一消息传递
- 📈 分析 -收入跟踪、平台比较、业务洞察
- 💰 金融 -收入/支出跟踪、交易管理
- ⚙️ 设置 -平台连接、同步设置、用户偏好
身份验证和安全(第3阶段)
- 🔐 真正的Supabase身份 -使用自动刷新令牌登录电子邮件/密码
- 🔒 受保护的路线 -基于会话的路由保护
- 🛡️ 行级安全性 -数据库级访问控制
- ✍️ 安全写入操作 -服务层以干运行模式写入(WRITE_mode=干默认)
- 📊 审核就绪 -全面的日志记录和安全指南
UI/UX卓越
- 📱 移动优先设计 -跨所有设备响应
- 🎨 专业设计 -带有Tailwind CSS的Shadcn UI组件
- ♿ 无障碍 -WCAG兼容键盘导航
- 🌓 暗模式支持 -系统偏好检测
🛠️ 技术栈
核心框架
{
"framework": "Next.js 14.x",
"language": "TypeScript 5.x",
"styling": "Tailwind CSS 3.x",
"ui-components": "Shadcn UI",
"state-management": "React Context API",
"forms": "React Hook Form + Zod validation",
"icons": "Lucide React",
"charts": "Recharts",
"toast": "Sonner"
}后端和数据库
{
"backend": "Next.js API Routes",
"authentication": "Supabase Auth",
"database": "Supabase PostgreSQL",
"security": "Row Level Security (RLS)"
}开发工具
{
"package-manager": "npm",
"linting": "ESLint",
"formatting": "Prettier",
"git": "Git + GitHub"
}🚀 入门指南
先决条件
- Node.js 18+
- npm或纱线
- 辅助数据库账户和项目(用于第3阶段功能)
安装
- 克隆存储库
git clone
cd aiostore- 安装依赖项
npm install- 运行开发服务器
npm run dev- 打开浏览器
为生产而建
npm run build
npm start📁 项目结构
aiostore/
├── public/ # Static assets
├── src/
│ ├── app/ # Next.js App Router pages
│ │ ├── (auth)/ # Authentication routes
│ │ │ ├── login/
│ │ │ └── register/
│ │ ├── (dashboard)/ # Protected dashboard routes
│ │ │ ├── dashboard/
│ │ │ ├── products/
│ │ │ ├── orders/
│ │ │ ├── chat/
│ │ │ ├── analytics/
│ │ │ ├── finance/
│ │ │ └── settings/
│ │ ├── layout.tsx # Root layout
│ │ ├── page.tsx # Homepage
│ │ └── globals.css # Global styles
│ ├── components/ # Reusable components
│ │ ├── ui/ # Shadcn UI components
│ │ ├── layout/ # Layout components
│ │ ├── dashboard/ # Dashboard components
│ │ ├── products/ # Product management
│ │ ├── orders/ # Order management
│ │ ├── chat/ # Chat interface
│ │ ├── analytics/ # Analytics components
│ │ ├── finance/ # Finance components
│ │ └── settings/ # Settings components
│ ├── lib/ # Utilities and configuration
│ │ ├── mock-data/ # Mock data for development
│ │ └── utils.ts # Utility functions
│ ├── types/ # TypeScript type definitions
│ └── hooks/ # Custom React hooks
├── docs/ # Documentation
├── postcss.config.js # PostCSS configuration
├── tailwind.config.ts # Tailwind configuration
├── tsconfig.json # TypeScript configuration
└── next.config.js # Next.js configuration🎨 设计系统
颜色
- 主要的,重要的 蓝色(#0ea5e9)
- 成功: 绿色(#22c55e)
- 警告: 橙色(#f59e0b)
- 危险: 红色(#ef4444)
- 中立: 灰度
排版
- 字体: 系统字体堆栈
- 尺寸: 12像素至36像素的比例
- 重量: 400至700
间距
- 基本单位: 4px
- 规模: 8像素至48像素
🔧 CSS配置-Context7解决方案
挑战
在开发过程中,我们遇到了Next.js 14 App Router和Tailwind CSS的关键CSS编译问题:
Module parse failed: Unexpected character '@' (1:0)
> @tailwind base;
| @tailwind components;
| @tailwind utilities;Context7解决方案
使用Context7 MCP服务器工具 为了访问Next.js官方文档,我们实现了以下解决方案:
1.安装所需的依赖项
npm install -D tailwindcss autoprefixer2.PostCSS配置(PostCSS.config.js)
export default {
plugins: {
'@tailwindcss/postcss': {},
},
}3.Next.js配置(Next.config.js)
/** @type {import('next').NextConfig} */
const nextConfig = {
experimental: {
appDir: true,
},
images: {
domains: ['images.unsplash.com', 'via.placeholder.com'],
},
}
module.exports = nextConfig4.全局CSS(src/app/globals.CSS)
@tailwind base;
@tailwind components;
@tailwind utilities;
@layer base {
:root {
--background: 0 0% 100%;
--foreground: 222.2 84% 4.9%;
--primary: 221.2 83.2% 53.3%;
--primary-foreground: 210 40% 98%;
/* ... other CSS variables */
}
}为什么此解决方案有效
这 Context7解决方案 地址 App Router的新CSS处理系统:
postcss.config.js-PostCSS的现代ES模块格式@tailwindcss/postcss-App Router官方Tailwind插件- 标准
@tailwind指令 -传统Tailwind语法 - 删除实验功能 -简化的Next.js配置
📊 模拟数据策略
为了开发和演示,AIOStore使用了全面的模拟数据:
- 产品: 50多个真实的产品列表,包含多平台数据
- 订单: 100+订单,各种状态和时间线
- 信息: 跨不同平台的聊天对话
- 交易: 用于分析的财务数据
- 分析: 图表和见解的历史数据
🧪 测试
手动测试检查表
- ✅ 所有页面均可访问和导航
- ✅ 具有验证功能的表单
- ✅ CRUD操作功能(模拟数据)
- ✅ 搜索和过滤器工作
- ✅ 图表渲染正确
- ✅ 响应式设计(手机、平板电脑、台式机)
- ✅ 加载状态和错误处理
- ✅ 吐司通知
- ✅ 无控制台错误
- ✅ TypeScript编译成功
浏览器测试
- ✅ Chrome(最新)
- ✅ Firefox(最新)
- ✅ Safari(最新)
- ✅ Edge(最新)
🔬 前端P0 DoD v1-如何验证
快速启动验证
- 启动应用程序:
npm run dev- 测试身份验证流程:
- 访问 /login - 使用任何电子邮件/密码(演示模式) - 验证重定向到 /dashboard - 检查受保护的路由现在是否可访问 - 在顶部栏下拉菜单中测试注销功能
- 测试产品流程:
- 引导到 /products - 点击任何产品上的“查看详情”(眼睛图标) - 验证导航 /products/[id] - 测试编辑功能(编辑按钮) - 保存更改并验证持久性 - 返回产品列表查看更改
- 测试订单流程:
- 引导到 /orders - 点击任何订单号 - 验证导航 /orders/[id] - 测试状态更新功能 - 检查订单时间表和进度 - 返回订单列表查看更改
- 测试导航:
- 所有列表页面都应该有工作分页 - 过滤器应适用于产品和订单 - 搜索功能应该正常工作 - 浏览器开发工具中没有控制台错误
手动测试检查表
- \[\]登录重定向到仪表板
- \[\]注销会清除会话并重定向到登录
- \[\]产品列表→ 详细导航工程
- \[\]订单列表→ 详细导航工程
- \[\]产品编辑保存并保持在模拟状态
- \[\]订单状态更新保存并保持在模拟状态
- \[\]表单验证显示内联错误
- \[\]保存操作时出现成功祝酒词
- \[\]响应式设计适用于所有页面
- \[\]导航过程中没有控制台错误
命令行验证
# Check TypeScript compilation
npm run typecheck
# Check linting
npm run lint
# Build the application
npm run build预期结果
- 所有类型检查和lint命令都应该通过
- 应用程序应无错误构建
- 所有验证步骤应顺利进行
- 浏览器中没有阻塞控制台错误
🧪 第2阶段验证-通过Supabase实现只读数据层
第二阶段概述
版本: 1.4.0\ 阶段: 后端集成(第2阶段)- 完成\ 目的: 用只读Supabase集成替换模拟数据\ 架构: 具有特征标志切换的服务层
🚀 新增功能
服务层架构
- 5服务类别:产品、订单、客户、交易、消息
- 统一数据服务:跨所有模块的单一接口
- 特征标志系统:每个模块
DATA_SOURCE=mock|supabase切换 - 健康监测:内置服务健康检查
Supabase集成
- 只读操作:只有SELECT查询,没有写入
- 环境变量:
NEXT_PUBLIC_SUPABASE_URL,NEXT_PUBLIC_SUPABASE_ANON_KEY - 数据契约:现场测绘记录在
DATA_CONTRACT.md - 类型安全:在所有服务中全面覆盖TypeScript
🔧 配置和设置
1.环境变量
创建 .env.local 使用Supabase凭据:
# Copy from .env.example and fill in your values
NEXT_PUBLIC_SUPABASE_URL=https://your-project.supabase.co
NEXT_PUBLIC_SUPABASE_ANON_KEY=your-anon-key
# Feature Flags (default: mock)
USE_SUPABASE_PRODUCTS=mock
USE_SUPABASE_ORDERS=mock
USE_SUPABASE_CUSTOMERS=mock
USE_SUPABASE_TRANSACTIONS=mock
USE_SUPABASE_MESSAGES=mock2.安装依赖项
npm install @supabase/supabase-js3.数据库设置(Supabase)
确保您的Supabase数据库包含以下表格:
products(产品、订单、客户、交易、消息)- 只读访问的正确RLS策略
- 与数据合同匹配的列名
🧪 第2阶段验证步骤
步骤1:基本服务测试
# Test TypeScript compilation
npm run typecheck
# Test linting
npm run lint
# Test build process
npm run build
npm start步骤2:功能标志测试
- 启动应用程序:
npm run dev- 打开浏览器控制台 并检查服务日志:
- 应该看到: 📦 Using mock data source for products - 应该看到: 🛒 Using mock data source for orders - 应该看到: 💰 Using mock data source for transactions - 应该看到: 💬 Using mock data source for messages
- 切换功能标志 在
.env.local:
USE_SUPABASE_PRODUCTS=supabase
USE_SUPABASE_ORDERS=supabase
USE_SUPABASE_CUSTOMERS=supabase
USE_SUPABASE_TRANSACTIONS=supabase
USE_SUPABASE_MESSAGES=supabase重新启动应用程序并检查控制台日志应更改为 supabase.
步骤3:数据源切换验证
- 将产品切换到Supabase:
- 集 USE_SUPABASE_PRODUCTS=supabase - 引导到 /products 页 - 验证从数据库加载的产品(最初可能为空) - 检查控制台: 📦 Using supabase data source for products
- 切换回模拟:
- 集 USE_SUPABASE_PRODUCTS=mock - 刷新页面 - 验证是否出现相同的模拟产品 - 检查控制台: 📦 Using mock data source for products
步骤4:服务健康检查
在浏览器控制台中,运行:
// Import the data service
import { dataService } from '@/services/data-service'
// Test all services
await dataService.testAllServices()
// Check service status
dataService.logStatus()预期产量:
🧪 AIOStore Data Service Tests
products: ✅ Healthy
orders: ✅ Healthy
customers: ✅ Healthy
transactions: ✅ Healthy
messages: ✅ Healthy步骤5:UI功能验证
- 产品页面(
/products):
- 应加载产品(基于标志的模拟或Supabase) - 搜索和过滤器应该工作 - 分页应该起作用 - 产品详细导航应该有效
- 订单页面(
/orders):
- 应加载订单(基于标志的模拟或Supabase) - 订单过滤和搜索应该有效 - 订单详细信息导航应该有效
- 其他页面:
- 财务页面应显示交易 - 聊天页面应显示对话 - 分析应使用可用数据
✅ 预期验证结果
控制台输出(模拟模式)
📦 Using mock data source for products
🛒 Using mock data source for orders
👥 Using mock data source for customers
💰 Using mock data source for transactions
💬 Using mock data source for messages
🧪 AIOStore Data Service Tests
products: ✅ Healthy
orders: ✅ Healthy
customers: ✅ Healthy
transactions: ✅ Healthy
messages: ✅ Healthy控制台输出(辅助模式)
📦 Using supabase data source for products
🛒 Using supabase data source for orders
👥 Using supabase data source for customers
💰 Using supabase data source for transactions
💰 Using supabase data source for messages
🧪 AIOStore Data Service Tests
products: ✅ Healthy
orders: ✅ Healthy
customers: ✅ Healthy
transactions: ✅ Healthy
messages: ✅ Healthy错误场景(辅助数据库设置问题)
如果Supabase配置不正确:
📦 Using supabase data source for products
[ProductsService] Error: Invalid API key
products: ❌ Failed
💰 Using supabase data source for transactions
[TransactionsService] Error: Connection failed
transactions: ❌ Failed🔄 回滚程序
如果出现问题,请立即恢复到模拟模式:
# In .env.local
USE_SUPABASE_PRODUCTS=mock
USE_SUPABASE_ORDERS=mock
USE_SUPABASE_CUSTOMERS=mock
USE_SUPABASE_TRANSACTIONS=mock
USE_SUPABASE_MESSAGES=mock📊 服务架构测试
个性化服务测试
// Test products service
import { productsService } from '@/services/products-service'
const result = await productsService.listProducts()
console.log('Products:', result.success ? '✅' : '❌', result.source)
// Test orders service
import { ordersService } from '@/services/orders-service'
const result = await ordersService.listOrders()
console.log('Orders:', result.success ? '✅' : '❌', result.source)功能标志集成
// Check current feature flags
import { featureFlags } from '@/lib/data-sources'
console.log('Products source:', featureFlags.products)
console.log('Orders source:', featureFlags.orders)📋 验证检查表
- \[\]已配置环境变量
- \[\]已安装依赖项(
@supabase/supabase-js) - \[\]TypeScript编译通过
- \[\]林亭传球
- \[\]构建过程成功
- \[\]应用程序启动时没有错误
- \[\]正确加载模拟数据(默认)
- \[\]控制台显示正确的服务日志
- \[\]功能标志切换工作
- \[\]Supabase连接正常(如果已配置)
- \[\]切换过程中UI保持不变
- \[\]所有服务均通过健康检查
- \[\]服务状态报告工作
- \[\]切换过程中没有控制台错误
- \[\]回滚到模拟模式有效
🛠️ 故障排除
常见问题
Supabase连接失败
- 检查
NEXT_PUBLIC_SUPABASE_URL是正确的 - 验证
NEXT_PUBLIC_SUPABASE_ANON_KEY有效 - 确保RLS策略允许读取访问
- 检查Supabase项目是否处于活动状态
TypeScript错误
- 验证所有服务导入是否正确
- 检查类型定义是否与实际数据匹配
- 跑
npm run typecheck有关详细错误
构建失败
- 清除
.next目录 - 重新安装依赖项
- 检查循环导入
服务健康检查失败
- 检查功能标志配置
- 验证Supabase凭据
- 查看控制台错误消息
📚 其他文件
- DATA_CONTRACT.md -mock和Supabase之间的字段映射
- 服务API文档 -个性化服务方法文档
- Supabase设置指南 -数据库模式和RLS策略
______________________________________________________________________
第2阶段确保模拟和真实数据源之间的无缝过渡,同时保持相同的UI体验和零停机时间。
🔐 第3阶段身份验证设置(辅助身份验证)
第三阶段概述
版本: 1.5.0\ 阶段: Auth+有限写入(第3阶段)- 进行中\ 目的: 通过服务层启用Supabase身份验证和有限的写入操作\ 架构: 真实身份+干燥→带RLS的带电安全开关
🚀 身份验证功能
Supabase身份验证集成
- 电子邮件/密码验证:注册和登录功能
- 会话管理:具有自动刷新功能的自动会话处理
- 受保护的路线:仪表板路由由真实身份验证保护
- 实时状态:立即反映身份验证状态更改
- 无模拟数据:用Supabase Auth替换了localStorage模拟
环境配置
创建 .env.local 使用Supabase凭据:
# Supabase Configuration (Phase 3)
NEXT_PUBLIC_SUPABASE_URL=https://your-project-id.supabase.co
NEXT_PUBLIC_SUPABASE_ANON_KEY=your-anon-key-here
# Write Mode Configuration (Phase 3)
WRITE_MODE=dry # Options: dry | live🔧 身份验证设置
1.基础项目设置
- 在以下位置创建帐户 网站 supabase.com
- 创建新项目
- 从“设置”>“API”获取项目URL和匿名密钥
- 配置身份验证设置:
- 启用电子邮件确认(开发时可选) - 将网站URL设置为 http://localhost:3000 (用于发展)
2.身份验证测试
# Start the application
npm run dev
# Navigate to http://localhost:3000
# Click "Login" or "Register"
# Test sign up with email/password
# Verify session persistence across page refreshes
# Test logout functionality3.受保护路由测试
- 无身份验证:
- 引导到 /dashboard → 应重定向到 /login - 对任何受保护路由的直接URL访问应失败
- 使用身份验证:
- 登录成功→ 应重定向到 /dashboard - 所有仪表板路线都应可访问 - 页面刷新时会话应保持不变 - 注销应清除会话并重定向到登录
🔒 身份验证方法
注册新用户
import { useAuth } from '@/contexts/AuthContext'
const { signUp } = useAuth()
const handleSignUp = async (email: string, password: string) => {
const result = await signUp(email, password)
if (result.error) {
console.error('Sign up failed:', result.error)
} else {
console.log('Sign up successful!')
}
}登录用户
import { useAuth } from '@/contexts/AuthContext'
const { login } = useAuth()
const handleLogin = async (email: string, password: string) => {
const success = await login(email, password)
if (success) {
console.log('Login successful!')
} else {
console.error('Login failed')
}
}注销用户
import { useAuth } from '@/contexts/AuthContext'
const { logout, user } = useAuth()
const handleLogout = () => {
logout()
// User will be set to null and redirected
}检查身份验证状态
import { useAuth } from '@/contexts/AuthContext'
const { user, isAuthenticated, isLoading } = useAuth()
// Use in components
if (isLoading) {
return
}
if (!isAuthenticated) {
return
}
return 🧪 第3阶段M1验证步骤
步骤1:环境设置
- 检查
.env.local包含必需的Supabase变量:
NEXT_PUBLIC_SUPABASE_URL=https://your-project.supabase.co
NEXT_PUBLIC_SUPABASE_ANON_KEY=your-anon-key步骤2:身份验证测试
# Start development server
npm run dev
# Open http://localhost:3000/login
# Test the following flows:
# 1. Sign Up Flow
# - Click "Don't have an account? Sign up"
# - Enter email/password
# - Submit form
# - Should see success message or confirmation required
# 2. Sign In Flow
# - Enter valid credentials
# - Should redirect to /dashboard
# - User should appear in topbar
# - Session should persist on page refresh
# 3. Protected Route Access
# - Navigate to /dashboard/products
# - Should show products page (authenticated)
# - Logout and try again
# - Should redirect to /login
# 4. Session Persistence
# - Log in and navigate around dashboard
# - Refresh page
# - Should remain logged in
# - Check browser storage for Supabase session步骤3:控制台验证
检查浏览器控制台的身份验证日志:
✅ "Auth state changed: SIGNED_IN [user-id]"
✅ "Auth state changed: SIGNED_OUT"
✅ No authentication errors
✅ Supabase client properly initialized步骤4:UI/UX验证
- \[\]登录表单显示正确
- \[\]注册表单显示正确
- \[\]表格验证工作
- \[\]出现成功/错误消息
- \[\]身份验证操作期间的加载状态
- \[\]顶部栏下拉菜单中的注销按钮
- \[\]用户信息显示在顶部栏中
- \[\]重定向行为正常工作
🔄 回滚程序
如果Supabase Auth导致问题:
- 暂时禁用辅助身份验证:
// In src/contexts/AuthContext.tsx, temporarily revert to mock
// This allows continued development while fixing issues- 或者配置开发环境:
# Use mock auth for development
# Keep Supabase configuration for production📊 预期验证结果
成功指标
✅ Login redirects to dashboard
✅ Sign up creates user successfully
✅ Session persists on page refresh
✅ Logout clears session and redirects to login
✅ Protected routes properly secured
✅ Real-time auth state updates
✅ No console errors during authentication
✅ Supabase Auth properly configured错误场景
❌ "Invalid API key" → Check Supabase configuration
❌ "Network error" → Check Supabase project status
❌ "Invalid credentials" → Verify email/password
❌ "Email not confirmed" → Check email confirmation settings🛠️ 故障排除
常见身份验证问题
Supabase连接失败
- 验证
NEXT_PUBLIC_SUPABASE_URL是正确的 - 检查
NEXT_PUBLIC_SUPABASE_ANON_KEY有效 - 确保Supabase项目处于活动状态且未暂停
- 检查Supabase仪表板中的身份验证设置
会话未持续
- 验证
persistSession: true在Supabase客户端配置中 - 检查浏览器存储权限
- 清除浏览器存储空间,然后重试
- 检查是否存在冲突的身份验证库
受保护的路线不起作用
- 确保AuthProvider封装应用程序
- 检查一下
isAuthenticated计算正确 - 验证仪表板布局是否使用
useAuth()钩子 - 检查身份验证状态下的竞争条件
构建错误
- 验证Supabase客户端导入是否正确
- 检查TypeScript类型是否与Supabase SDK匹配
- 清除
.next目录和重建 - 确保安装了所有身份验证依赖项
______________________________________________________________________
第3阶段M1通过无缝集成和适当的会话管理提供真正的身份验证。
📱 响应式设计
| 设备 | 断点 | 布局 |
|---|---|---|
| 手机 | \1024px | 带侧边栏的完整布局 |
🔒 安全功能
- 输入验证: 所有表单都使用Zod模式验证
- XSS保护: React内置的净化功能
- 类型安全: 完全覆盖TypeScript
- 环境变量: 敏感数据外部化
📈 性能优化
- 代码拆分: 自动使用Next.js
- 图像优化: Next.js图像组件
- 树木摇晃: 消除未使用的代码
- 捆绑分析: 优化包装尺寸
🤝 贡献
- 分叉存储库
- 创建要素分支:
git checkout -b feature/amazing-feature - 提交更改:
git commit -m 'Add amazing feature' - 推送到分支:
git push origin feature/amazing-feature - 打开拉取请求
📝 文档
- 组件文档 -组件库参考
- 部署指导 -生产部署说明
- Context7调试日志 -CSS修复文档
🆘 故障排除
常见问题
CSS未加载
- 确保
postcss.config.js使用Context7解决方案创建 - 验证
@tailwindcss/postcss已安装 - 检查一下
useLightningcss: true已从Next.js配置中删除
TypeScript错误
- 跑
npm run build检查类型问题 - 确保所有导入使用正确的路径别名
- 验证类型定义是否完整
构建失败
- 清除
.next目录:rm -rf .next - 重新安装依赖关系:
rm -rf node_modules && npm install - 在开发过程中检查控制台错误
📄 许可证
该项目根据MIT许可证获得许可。
👥 团队
- 发展: AIOStore开发团队
- UI/UX设计: 基于Shadcn UI的现代设计系统
- 文档: 全面的指南和参考
🎯 未来的增强功能
第二阶段:后端集成
- 真正的API集成
- 数据库连接(Supabase)
- 身份验证系统
- 支付处理
- 实时同步
第三阶段:高级功能
- 移动应用开发
- 人工智能驱动的洞察力
- 高级分析
- 多租户支持
______________________________________________________________________
内置于❤️ 使用Next.js、TypeScript和现代web技术。
*有关问题或支持,请参阅我们的文档或在存储库中创建问题。*
