# react-template-vite
**Repository Path**: hezebin-react/react-template-vite
## Basic Information
- **Project Name**: react-template-vite
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2024-10-28
- **Last Updated**: 2026-09-28
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# react-template-vite
React TypeScript 的模板项目,包含了常用的组件、工具、配置等。
基于 Vite 构建:https://cn.vitejs.dev/
## 快速创建项目
```bash
npx pcq -t vite [project-name]
```
## 开发
```bash
yarn dev
```
## 打包
```bash
yarn build
```
## 环境变量
在项目根目录 `.env` 中配置(修改后需重启开发服务):
```env
# 系统名称 / 页面标题
VITE_APP_TITLE=React Template Vite
# 侧边栏宽度(px)
VITE_SIDEBAR_WIDTH_MIN=250
VITE_SIDEBAR_WIDTH_MAX=520
VITE_SIDEBAR_WIDTH_DEFAULT=288
```
统一读取入口:`src/config/index.ts`。
---
## 如何新加页面
新增一个后台页面通常需要 **3 步**:页面组件 → 路由 → 侧栏菜单。
### 1. 创建页面组件
在 `src/page/` 下新建目录,例如 `src/page/Hello/`:
```tsx
// src/page/Hello/index.tsx
import styles from './index.module.scss'
const Hello = () => {
return
Hello
}
export default Hello
```
样式使用 CSS Modules(`index.module.scss`),颜色尽量使用主题变量(如 `var(--app-ink)`),以同时适配明亮 / 暗黑主题。
### 2. 注册路由
编辑 `src/router/config.tsx`,在 `RequireAuth` + `LoggedLayout` 的 `children` 中增加路由:
```tsx
import Hello from '../page/Hello'
// ...
children: [
// ...
{ path: 'hello', element: },
]
```
访问路径即为 `/hello`。
> 需要登录才能访问的页面放在 `RequireAuth` 包裹的布局下;公开页(如登录)放在布局外,可用 `GuestOnly` 限制已登录用户访问。
### 3. 加入侧边栏菜单
编辑 `src/layout/LoggedLayout/menu.config.tsx`:
```tsx
{ icon: , key: 'hello', label: 'Hello' }
```
菜单 `key` 会拼成路径。规则:
| 配置 | 最终路径 |
|------|----------|
| `{ key: 'hello' }` | `/hello` |
| `{ key: 'demo', children: [{ key: 'a' }] }` | `/demo/a` |
| `{ key: 'test/1' }` | `/test/1` |
父子菜单示例:
```tsx
{
key: 'demo',
label: '示例分组',
children: [
{ key: 'hello', label: 'Hello' },
],
}
```
对应路由应写为 `path: 'demo/hello'`。
---
## 如何使用 API
API 客户端封装在 `src/api/index.tsx`,基于 `@hezebin/doraemon` 的 `newApi`,默认 `baseURL` 为 `/api`,并自动附带本地 token。
### 基本用法
```tsx
import { api } from '../../api'
api
.get('/hello')
.then((res) => {
// res 为业务响应体,通常含 code / message / data
console.log(res)
})
.catch((err) => {
console.error(err)
})
// 其他方法同理:api.post / api.put / api.delete ...
```
### 约定与行为
- **成功判定**:业务 `code` 为 `0` 或 `1` 视为正常;其他值会通过 `notification` 提示错误。
- **HTTP 错误**:`onError` / `onAbnormal` 中统一 `notification.error`。
- **401**:清空本地 token(后续可配合跳转登录)。
- **Token**:请求时通过 `withToken` 从本地读取;登录成功后由 store 写入。
参考示例:`src/page/Test/index.tsx`。
---
## 如何认证
当前模板为 **演示登录**:任意非空账号密码均可登录,会生成随机 token 并写入本地。
### 流程概览
1. 未登录访问后台路由 → `RequireAuth` 跳转到 `/login`,并带上 `state.from`。
2. 登录页提交 → `store.login(username)` 生成 token + user,持久化到 localStorage。
3. 跳转回 `from` 或首页 `/`。
4. 侧栏底部可 **退出登录** → `store.logout()`,清空 token / user,回到 `/login`。
5. 已登录访问 `/login` → `GuestOnly` 重定向到 `/`。
### 关键文件
| 文件 | 作用 |
|------|------|
| `src/router/AuthGate.tsx` | `RequireAuth` / `GuestOnly` 路由守卫 |
| `src/router/config.tsx` | 登录页与后台布局路由划分 |
| `src/store/index.ts` | `token` / `user`、`login` / `logout`,并同步 localStorage |
| `src/page/Login/index.tsx` | 登录页 UI 与调用 `login` |
| `src/api/index.tsx` | 请求自动带 token;401 时清 token |
### 接入真实后端
将 `store.login` 改为请求真实登录接口,用接口返回的 token / 用户信息调用 `setToken` / `setUser` 即可;路由守卫逻辑可保持不变(仍以本地是否有 `token` 为准)。