# next-base **Repository Path**: QOH/next-base ## Basic Information - **Project Name**: next-base - **Description**: 这是一个基于 Next.js 15 + React 19 + TypeScript + Tailwind CSS + shadcn/ui 的现代化 Web 应用基础项目 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2025-09-02 - **Last Updated**: 2025-11-25 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Next.js CSGO 项目 这是一个基于 Next.js 15 + React 19 + TypeScript + Tailwind CSS + shadcn/ui 的现代化 Web 应用项目。 ## 技术栈 - **框架**: Next.js 15 (App Router) - **UI库**: React 19 - **类型系统**: TypeScript 5 - **样式**: Tailwind CSS 4 - **组件库**: shadcn/ui - **状态管理**: Redux Toolkit - **HTTP 请求**: Axios + 统一封装 + SWR 数据获取 - **国际化**: next-intl - **字体**: Geist Sans & Geist Mono - **包管理器**: pnpm - **构建工具**: Turbopack ## 快速开始 ### 安装依赖 ```bash pnpm install ``` ### 启动开发服务器 ```bash pnpm dev ``` 打开 [http://localhost:3000](http://localhost:3000) 查看应用。 ### 构建生产版本 ```bash pnpm build pnpm start ``` ## 国际化支持 本项目支持多语言国际化,目前支持: - 🇨🇳 中文(默认) - 🇺🇸 English - 🇯🇵 日本語 ### 国际化特性 - **自动语言检测**:根据浏览器语言自动选择 - **URL 路由**:支持 `/zh`、`/en`、`/ja` 路径 - **语言切换**:右上角语言切换器 - **静态生成**:所有语言版本都支持静态生成 - **类型安全**:完整的 TypeScript 类型支持 ### 添加新语言 1. 在 `messages/` 目录下创建新的语言文件(如 `fr.json`) 2. 在 `src/i18n/routing.ts` 中添加新的语言代码 3. 在 `src/components/LanguageSwitcher.tsx` 中添加语言选项 ### 使用翻译 ```tsx // 服务端组件 import { getTranslations } from 'next-intl/server'; export default async function Page() { const t = await getTranslations(); return

{t('home.title')}

; } // 客户端组件 'use client'; import { useTranslations } from 'next-intl'; export default function Component() { const t = useTranslations(); return

{t('common.loading')}

; } ``` ## Redux Toolkit 状态管理 本项目集成了 Redux Toolkit 进行全局状态管理,提供了现代化的 Redux 开发体验。 ### Redux 特性 - **Redux Toolkit**:使用官方推荐的现代 Redux 工具集 - **类型安全**:完整的 TypeScript 类型支持 - **DevTools**:集成 Redux DevTools 用于调试 - **异步处理**:使用 createAsyncThunk 处理异步操作 - **Immer 集成**:支持不可变状态的直接修改语法 ### Store 结构 ```typescript // src/lib/store.ts export const store = configureStore({ reducer: { counter: counterReducer, // 计数器状态 user: userReducer, // 用户管理状态 }, }); ``` ### 使用示例 ```typescript // 使用类型化的 hooks import { useAppDispatch, useAppSelector } from '@/lib/hooks'; import { increment, decrement } from '@/lib/features/counter/counterSlice'; function Counter() { const dispatch = useAppDispatch(); const count = useAppSelector((state) => state.counter.value); return (
{count}
); } ``` ### 服务端数据预填充(深层合并) ```typescript // 在页面组件中 const users = await fetchUsersOnServer(); // 只需传入需要预填充的部分,其他字段会自动使用默认值 const preloadedState = { user: { users: users, // 只传入需要的数据 } }; // 传递给 StoreProvider,会自动深层合并 return ( {children} ); ``` ### 已实现的功能 1. **计数器演示**: - 基本的增减操作 - 自定义步长设置 - 自定义增量输入 - 重置功能 2. **用户管理演示**: - 服务端预渲染用户列表 - 用户登录/登出 - 添加/删除用户 - 状态管理和错误处理 ## HTTP 请求封装 本项目集成了基于 axios 的请求封装,参照 vebn-admin 风格: ### 特性 - **统一拦截器**:请求/响应统一处理 - **Cookie Token 管理**:Token 存储在 Cookie 中,支持访问令牌和刷新令牌 - **QS 参数处理**:使用 qs 库处理复杂参数序列化 - **错误统一处理**:全局错误拦截和提示 - **TypeScript 支持**:完整的类型定义 - **多种请求方法**:GET、POST、PUT、DELETE、PATCH 等 ### 使用方法 #### 1. 基础请求 ```typescript import request from '@/lib/request'; // GET 请求 const response = await request.get('/api/users'); // POST 请求 const response = await request.post('/api/users', { name: 'John' }); // 文件上传 const response = await request.upload('/api/upload', formData); ``` #### 2. API 服务层 ```typescript import request, { ResultData } from '@/lib/request'; export const getUserList = (params?: any): Promise> => { return request.get('/users', params); }; export const createUser = (params: CreateUserParams): Promise> => { return request.post('/users', params); }; ``` #### 3. Token 管理 ```typescript import request from '@/lib/request'; import { TokenManager } from '@/lib/utils/token'; // 设置令牌 request.setToken('your-access-token'); TokenManager.setToken('your-access-token'); // 设置令牌对 request.setTokens('access-token', 'refresh-token'); // 获取令牌 const token = request.getTokenPublic(); const hasToken = request.hasToken(); // 清除令牌 request.clearToken(); ``` #### 4. 参数处理 ```typescript // 复杂参数会自动使用 qs 序列化 const response = await request.get('/api/users', { filters: { status: ['active', 'pending'], roles: ['admin', 'user'] }, pagination: { page: 1, limit: 10 } }); // 生成: /api/users?filters[status][0]=active&filters[status][1]=pending... ``` #### 5. 环境变量配置 创建 `.env.local` 文件: ```env # API 配置 NEXT_PUBLIC_API_BASE_URL=http://localhost:3000/api # WebSocket 配置 NEXT_PUBLIC_WS_BASE_URL=ws://localhost:8080 NEXT_PUBLIC_WS_CHAT_URL=ws://localhost:8080/chat NEXT_PUBLIC_WS_NOTIFICATION_URL=ws://localhost:8080/notifications ``` ### API 结构 ``` src/lib/ ├── request/ │ └── index.ts # HTTP 请求封装 ├── api/ │ ├── index.ts # API 统一导出 │ └── user.ts # 用户相关 API ├── swr/ │ └── config.ts # SWR 配置 ├── hooks/ │ ├── useSWR.ts # SWR hooks 工具 │ ├── useWebSocket.ts # WebSocket hooks │ └── useSharedWebSocket.ts # 共享 WebSocket hooks ├── utils/ │ ├── errorHandler.ts # 错误处理工具 │ ├── token.ts # Token 管理工具 │ └── toast.ts # Toast 通知工具 ├── websocket/ │ ├── WebSocketManager.ts # WebSocket 管理器 │ └── index.ts # WebSocket 工厂 └── serverActions.ts # 服务端数据获取 ``` ## Sonner Toast 通知 项目集成了 Sonner 作为现代化的 Toast 通知系统: ### 特性 - **现代化设计**:支持深色模式和丰富的视觉效果 - **多种类型**:成功、错误、警告、信息、加载状态 - **Promise 支持**:自动处理异步操作状态 - **操作按钮**:支持操作和取消按钮 - **自定义样式**:支持完全自定义的通知内容 - **智能管理**:自动堆叠、展开和过期处理 ### 使用方法 ```typescript import { toast } from '@/lib/utils/toast'; // 基础通知 toast.success('操作成功'); toast.error('操作失败'); toast.warning('警告信息'); toast.info('提示信息'); // Promise 通知 toast.promise(apiCall(), { loading: '处理中...', success: '操作成功', error: '操作失败', }); // 操作通知 toast.action('文件已删除', '撤销', () => { // 撤销操作 }); // 自定义通知 toast.custom(
自定义内容
, { duration: 5000 } ); ``` ## WebSocket 实时通信 项目提供了完整的 WebSocket 封装,支持实时通信: ### 特性 - **连接管理**:自动连接、重连、心跳保活 - **连接复用**:相同 URL 自动复用连接,引用计数管理 - **消息处理**:类型化消息、事件订阅、消息队列 - **React 集成**:多种专用 Hook,状态自动管理 - **跨页面共享**:支持跨页面、跨组件的连接复用 - **Token 集成**:自动注入认证信息 - **错误处理**:完善的错误处理和重试机制 ### 使用方法 #### 基础 WebSocket ```typescript import { useWebSocket } from '@/lib/hooks/useWebSocket'; function MyComponent() { const { send, isConnected, state } = useWebSocket('ws://localhost:8080', { onOpen: () => console.log('连接成功'), onMessage: (data) => console.log('收到消息:', data), }); const sendMessage = () => { send({ type: 'message', data: 'Hello' }); }; } ``` #### 聊天 WebSocket ```typescript import { useWebSocketChat } from '@/lib/hooks/useWebSocket'; function ChatComponent() { const { messages, sendMessage, isConnected } = useWebSocketChat('ws://localhost:8080/chat'); return (
{messages.map(msg => (
{msg.content}
))}
); } ``` #### WebSocket 工厂 ```typescript import WebSocketFactory from '@/lib/websocket'; // 获取聊天实例 const chatWs = WebSocketFactory.getChat(); // 获取通知实例 const notificationWs = WebSocketFactory.getNotification(); // 自定义实例 const customWs = WebSocketFactory.getCustom('myService', 'ws://example.com'); ``` #### 连接复用 Hook ```typescript import { useSharedWebSocket } from '@/lib/hooks/useSharedWebSocket'; function ComponentA() { // 多个组件使用相同 URL 会共享连接 const ws = useSharedWebSocket('ws://localhost:8080/chat', { instanceKey: 'shared_chat', // 自定义实例键名 onMessage: (data) => console.log('A 收到:', data), }); } function ComponentB() { // 与 ComponentA 共享同一个连接 const ws = useSharedWebSocket('ws://localhost:8080/chat', { instanceKey: 'shared_chat', onMessage: (data) => console.log('B 收到:', data), }); } ``` #### 预定义共享 Hook ```typescript import { useSharedChatWebSocket, useSharedNotificationWebSocket, useSharedGeneralWebSocket } from '@/lib/hooks/useSharedWebSocket'; // 聊天连接(跨组件共享) const chat = useSharedChatWebSocket({ onMessage: (data) => console.log('聊天消息:', data), }); // 通知连接(跨组件共享) const notification = useSharedNotificationWebSocket({ onMessage: (data) => console.log('通知:', data), }); ``` ## SWR 数据获取 本项目集成了 SWR 用于客户端数据获取和缓存: ### 特性 - **自动缓存**:智能缓存和重新验证 - **错误重试**:自动错误重试机制 - **乐观更新**:提升用户体验 - **错误拦截配置**:可配置是否拦截错误 - **国际化错误信息**:多语言错误提示 - **TypeScript 支持**:完整的类型安全 ### 使用方法 #### 1. 基础数据获取 ```typescript import { useRequest } from '@/lib/hooks/useSWR'; function UserList() { const { data, error, isLoading } = useRequest('/api/users'); if (error) return
加载失败
; if (isLoading) return
加载中...
; return
{data?.map(user => user.name)}
; } ``` #### 2. 数据变更操作 ```typescript import { usePostMutation } from '@/lib/hooks/useSWR'; function CreateUser() { const { trigger, isMutating } = usePostMutation('/api/users', { onSuccess: () => { // 成功后刷新列表 mutate('/api/users'); } }); const handleCreate = () => { trigger({ name: 'New User', email: 'user@example.com' }); }; return ( ); } ``` #### 3. 错误处理配置 ```typescript // 跳过错误拦截 const { data } = useRequest('/api/users', { skipErrorHandler: true }); // 使用静默 fetcher import { silentFetcher } from '@/lib/swr/config'; const { data } = useSWR('/api/users', silentFetcher); ``` ## shadcn/ui 集成 本项目已完整集成 shadcn/ui 组件库,包含以下配置: ### 1. 核心依赖 ```json { "dependencies": { "class-variance-authority": "^0.7.0", "clsx": "^2.0.0", "tailwind-merge": "^2.0.0", "lucide-react": "^0.294.0" }, "devDependencies": { "tailwindcss-animate": "^1.0.7" } } ``` ### 2. 配置文件 - `components.json` - shadcn/ui 配置文件 - `tailwind.config.ts` - Tailwind CSS 配置,包含 shadcn/ui 主题 - `src/app/globals.css` - 全局样式,包含 CSS 变量和暗色模式支持 - `src/lib/utils.ts` - 工具函数,包含 `cn` 函数用于样式合并 ### 3. 已安装的组件 - Button - 按钮组件 - Card - 卡片组件 - Input - 输入框组件 - Label - 标签组件 - DropdownMenu - 下拉菜单组件 - Badge - 徽章组件 ### 4. 添加新组件 使用 shadcn/ui CLI 添加新组件: ```bash # 添加单个组件 pnpm dlx shadcn@latest add [component-name] # 添加多个组件 pnpm dlx shadcn@latest add [component1] [component2] [component3] # 查看可用组件 pnpm dlx shadcn@latest add ``` ### 5. 使用示例 ```tsx import { Button } from "@/components/ui/button"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; export default function MyComponent() { return ( 示例卡片 ); } ``` ## 项目结构 ``` src/ ├── app/ # Next.js App Router 页面 │ ├── [locale]/ # 国际化路由 │ │ ├── layout.tsx # 语言布局 │ │ └── page.tsx # 首页 │ ├── globals.css # 全局样式 │ └── layout.tsx # 根布局 ├── components/ # 组件目录 │ ├── ui/ # shadcn/ui 组件 │ ├── providers/ # 上下文提供者 │ │ ├── SWRProvider.tsx # SWR 提供者 │ │ └── StoreProvider.tsx # Redux 提供者 │ ├── CounterDemo.tsx # 计数器演示组件 │ ├── UserDemo.tsx # 用户管理演示组件 │ ├── UserSWRDemo.tsx # SWR 用户管理演示 │ ├── TokenDemo.tsx # Token 管理演示 │ ├── SonnerDemo.tsx # Toast 通知演示 │ ├── WebSocketDemo.tsx # WebSocket 演示 │ ├── SharedWebSocketDemo.tsx # 共享 WebSocket 演示 │ └── LanguageSwitcher.tsx # 语言切换器 ├── i18n/ # 国际化配置 │ ├── request.ts # 请求配置 │ └── routing.ts # 路由配置 ├── lib/ # 工具库 │ ├── features/ # Redux 功能模块 │ │ ├── counter/ # 计数器状态 │ │ └── user/ # 用户状态 │ ├── request/ # HTTP 请求封装 │ │ └── index.ts # Axios 请求工具 │ ├── api/ # API 服务层 │ │ ├── index.ts # API 统一导出 │ │ └── user.ts # 用户相关 API │ ├── swr/ # SWR 配置 │ │ └── config.ts # SWR 配置和 fetcher │ ├── hooks/ # 自定义 hooks │ │ ├── useSWR.ts # SWR hooks 工具 │ │ └── index.ts # Redux hooks │ ├── utils/ # 工具函数 │ │ └── errorHandler.ts # 错误处理工具 │ ├── store.ts # Redux store 配置 │ ├── storeUtils.ts # Store 工具函数 │ ├── serverActions.ts # 服务端数据获取 │ └── utils.ts # 通用工具函数 ├── middleware.ts # 中间件(处理语言路由) └── messages/ # 语言文件 ├── zh.json # 中文翻译 ├── en.json # 英文翻译 └── ja.json # 日文翻译 ``` ## 特性 - ✅ **现代化技术栈**: Next.js 15 + React 19 + TypeScript - ✅ **状态管理**: Redux Toolkit 全局状态管理 + 深层合并预填充 - ✅ **HTTP 请求**: Axios 统一封装 + SWR 数据获取 + 类型安全 API - ✅ **国际化支持**: 多语言支持(中文/英文/日文) - ✅ **响应式设计**: 基于 Tailwind CSS 的响应式布局 - ✅ **暗色模式**: 内置暗色模式支持 - ✅ **类型安全**: 完整的 TypeScript 类型定义 - ✅ **组件库**: 基于 shadcn/ui 的现代化组件 - ✅ **性能优化**: Turbopack 构建工具 - ✅ **可访问性**: 基于 Radix UI 的无障碍支持 - ✅ **静态生成**: 支持多语言静态站点生成 - ✅ **开发工具**: Redux DevTools 集成 ## 开发指南 ### 代码规范 - 使用 TypeScript 严格模式 - 遵循 ESLint 和 Prettier 配置 - 使用函数式组件和 React Hooks - 优先使用 React Server Components ### 样式规范 - 使用 Tailwind CSS utility classes - 通过 CSS 变量支持主题定制 - 使用 `cn()` 函数合并样式类 ### 组件开发 - 组件放置在 `src/components/` 目录 - UI 组件使用 shadcn/ui - 自定义组件遵循 shadcn/ui 设计规范 ## 了解更多 - [Next.js 文档](https://nextjs.org/docs) - [shadcn/ui 文档](https://ui.shadcn.com) - [Tailwind CSS 文档](https://tailwindcss.com/docs) - [TypeScript 文档](https://www.typescriptlang.org/docs) ## 部署 推荐使用 [Vercel](https://vercel.com) 部署,它是 Next.js 的创建者提供的平台。 查看 [Next.js 部署文档](https://nextjs.org/docs/app/building-your-application/deploying) 了解更多部署选项。