zt-admin-template 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +11 -0
- package/template/.env.development +2 -0
- package/template/.env.production +2 -0
- package/template/.env.test +2 -0
- package/template/.kiro/specs/course-backend-integration/.config.kiro +1 -0
- package/template/.kiro/specs/course-backend-integration/design.md +234 -0
- package/template/.kiro/specs/course-backend-integration/requirements.md +116 -0
- package/template/.kiro/specs/course-backend-integration/tasks.md +0 -0
- package/template/COMPLETION_CHECKLIST.md +305 -0
- package/template/DEPLOYMENT_GUIDE.md +391 -0
- package/template/FINAL_SUMMARY.md +428 -0
- package/template/IMPLEMENTATION_SUMMARY.md +382 -0
- package/template/INTEGRATION_GUIDE.md +458 -0
- package/template/PROJECT_OVERVIEW.md +343 -0
- package/template/QUICK_START.md +273 -0
- package/template/RBAC_Tutorial.md +424 -0
- package/template/README.md +16 -0
- package/template/React_Antd_TS_Tutorial.md +279 -0
- package/template/START_ALL.md +163 -0
- package/template/SYSTEM_MANAGEMENT.md +247 -0
- package/template/eslint.config.js +29 -0
- package/template/index.html +13 -0
- package/template/koa-server/README.md +65 -0
- package/template/koa-server/app.js +625 -0
- package/template/koa-server/package-lock.json +1547 -0
- package/template/koa-server/package.json +26 -0
- package/template/koa-server/public/assets/index-B1Cj4mG9.css +1 -0
- package/template/koa-server/public/assets/index-Mgxg-xqT.js +503 -0
- package/template/koa-server/public/favicon.svg +1 -0
- package/template/koa-server/public/icons.svg +24 -0
- package/template/koa-server/public/index.html +14 -0
- package/template/koa-server/uploads/1774265088480-962006467.png +0 -0
- package/template/koa-server/uploads/file-1774346891704-610962013.png +0 -0
- package/template/koa-server/uploads/file-1774346898887-58636533.png +0 -0
- package/template/koa-server/uploads/file-1774346912676-771862547.png +0 -0
- package/template/koa-server/uploads/file-1774347025308-130037894.png +0 -0
- package/template/koa-server/uploads/file-1774347031104-766499773.png +0 -0
- package/template/koa-server/uploads/file-1774347094969-731402203.png +0 -0
- package/template/koa-server/uploads/file-1774347101948-330296656.png +0 -0
- package/template/koa-server/uploads/file-1774351682377-932868720.png +0 -0
- package/template/koa-server/uploads/file-1774352037654-877426905.png +0 -0
- package/template/koa-server/uploads/file-1774352175463-386248997.png +0 -0
- package/template/koa-server/uploads/file-1774361446433-405859961.png +0 -0
- package/template/koa-server/uploads/file-1774361512207-465806267.png +0 -0
- package/template/lianxi.html +15 -0
- package/template/package-lock.json +6307 -0
- package/template/package.json +36 -0
- package/template/public/favicon.svg +1 -0
- package/template/public/icons.svg +24 -0
- package/template/src/App.css +184 -0
- package/template/src/App.tsx +44 -0
- package/template/src/api/course.ts +86 -0
- package/template/src/api/menu.ts +55 -0
- package/template/src/api/role.ts +58 -0
- package/template/src/api/user.ts +58 -0
- package/template/src/assets/hero.png +0 -0
- package/template/src/assets/react.svg +1 -0
- package/template/src/assets/vite.svg +1 -0
- package/template/src/components/Child.tsx +10 -0
- package/template/src/components/MainLayout.tsx +169 -0
- package/template/src/components/SunZi.tsx +13 -0
- package/template/src/contexts/ThemeContext.tsx +33 -0
- package/template/src/hooks/usePermission.tsx +62 -0
- package/template/src/index.css +111 -0
- package/template/src/main.tsx +13 -0
- package/template/src/pages/Dashboard.tsx +39 -0
- package/template/src/pages/Users.tsx +95 -0
- package/template/src/pages/banner/BannerList.tsx +182 -0
- package/template/src/pages/course/Course.tsx +586 -0
- package/template/src/pages/course/CourseList.tsx +168 -0
- package/template/src/pages/system/menu/Menu.tsx +501 -0
- package/template/src/pages/system/role/Role.tsx +458 -0
- package/template/src/pages/system/user/User.tsx +364 -0
- package/template/src/types/permission.ts +21 -0
- package/template/src/utils/request.tsx +94 -0
- package/template/src/vite-env.d.ts +1 -0
- package/template/tsconfig.app.json +32 -0
- package/template/tsconfig.json +7 -0
- package/template/tsconfig.node.json +13 -0
- package/template/vite.config.ts +30 -0
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
# React + Ant Design + TypeScript 项目实战教程
|
|
2
|
+
|
|
3
|
+
本教程基于当前项目,详细讲解如何构建一个基于 React 19、TypeScript、Vite 和 Ant Design 6 的后台管理系统雏形。
|
|
4
|
+
|
|
5
|
+
## 1. 技术栈
|
|
6
|
+
|
|
7
|
+
- **构建工具**: [Vite](https://vitejs.dev/)
|
|
8
|
+
- **前端框架**: [React](https://react.dev/) (v19)
|
|
9
|
+
- **编程语言**: [TypeScript](https://www.typescriptlang.org/)
|
|
10
|
+
- **UI 组件库**: [Ant Design](https://ant.design/) (v6)
|
|
11
|
+
- **路由管理**: [React Router](https://reactrouter.com/) (v7)
|
|
12
|
+
- **状态管理**: React Context API
|
|
13
|
+
|
|
14
|
+
## 2. 项目初始化
|
|
15
|
+
|
|
16
|
+
如果你是从零开始,可以使用 Vite 快速创建一个 React + TypeScript 项目:
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
# 创建项目
|
|
20
|
+
npm create vite@latest admin-system -- --template react-ts
|
|
21
|
+
|
|
22
|
+
# 进入项目目录
|
|
23
|
+
cd admin-system
|
|
24
|
+
|
|
25
|
+
# 安装依赖
|
|
26
|
+
npm install
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
### 安装项目所需依赖
|
|
30
|
+
|
|
31
|
+
安装 Ant Design、图标库和路由:
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
npm install antd @ant-design/icons react-router-dom
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## 3. 项目结构
|
|
38
|
+
|
|
39
|
+
建议的目录结构如下:
|
|
40
|
+
|
|
41
|
+
```
|
|
42
|
+
src/
|
|
43
|
+
├── assets/ # 静态资源
|
|
44
|
+
├── components/ # 公共组件 (Layout, Header, etc.)
|
|
45
|
+
├── contexts/ # 全局上下文 (Context)
|
|
46
|
+
├── pages/ # 页面组件 (Dashboard, Users, etc.)
|
|
47
|
+
├── App.tsx # 根组件
|
|
48
|
+
├── main.tsx # 入口文件
|
|
49
|
+
└── vite-env.d.ts # Vite 类型定义
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## 4. 核心功能实现
|
|
53
|
+
|
|
54
|
+
### 4.1 入口文件配置 (`src/main.tsx`)
|
|
55
|
+
|
|
56
|
+
配置 `BrowserRouter` 用于路由管理,并使用 `StrictMode` 包裹应用。
|
|
57
|
+
|
|
58
|
+
```tsx
|
|
59
|
+
import { StrictMode } from 'react'
|
|
60
|
+
import { createRoot } from 'react-dom/client'
|
|
61
|
+
import { BrowserRouter } from 'react-router-dom'
|
|
62
|
+
import App from './App'
|
|
63
|
+
|
|
64
|
+
createRoot(document.getElementById('root')!).render(
|
|
65
|
+
<StrictMode>
|
|
66
|
+
<BrowserRouter>
|
|
67
|
+
<App />
|
|
68
|
+
</BrowserRouter>
|
|
69
|
+
</StrictMode>
|
|
70
|
+
)
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### 4.2 全局状态管理 - ThemeContext (`src/contexts/ThemeContext.tsx`)
|
|
74
|
+
|
|
75
|
+
使用 Context API 实现主题切换,并结合 TypeScript 定义类型安全接口。
|
|
76
|
+
|
|
77
|
+
```tsx
|
|
78
|
+
import { createContext, useContext, useState, ReactNode } from "react";
|
|
79
|
+
|
|
80
|
+
// 定义 Context 的数据类型
|
|
81
|
+
interface ThemeContextType {
|
|
82
|
+
theme: string;
|
|
83
|
+
toggleTheme: () => void;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// 创建 Context 并提供默认值
|
|
87
|
+
const ThemeContext = createContext<ThemeContextType>({
|
|
88
|
+
theme: "light",
|
|
89
|
+
toggleTheme: () => { }
|
|
90
|
+
})
|
|
91
|
+
|
|
92
|
+
interface ThemeProviderProps {
|
|
93
|
+
children: ReactNode;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// Provider 组件
|
|
97
|
+
export function ThemeProvider({ children }: ThemeProviderProps) {
|
|
98
|
+
const [theme, setTheme] = useState<string>("light");
|
|
99
|
+
|
|
100
|
+
const toggleTheme = () => {
|
|
101
|
+
setTheme(prev => prev === "light" ? "dark" : "light");
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
return (
|
|
105
|
+
<ThemeContext.Provider value={{ theme, toggleTheme }}>
|
|
106
|
+
{children}
|
|
107
|
+
</ThemeContext.Provider>
|
|
108
|
+
);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// 自定义 Hook 方便使用
|
|
112
|
+
export function useTheme(){
|
|
113
|
+
return useContext(ThemeContext)
|
|
114
|
+
}
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
### 4.3 布局组件 - Ant Design Layout (`src/components/MainLayout.tsx`)
|
|
118
|
+
|
|
119
|
+
使用 Ant Design 的 `Layout` 和 `Menu` 组件构建侧边栏布局。注意 TypeScript 类型的使用。
|
|
120
|
+
|
|
121
|
+
```tsx
|
|
122
|
+
import React, { useState } from 'react';
|
|
123
|
+
import { Layout, Menu, theme } from 'antd';
|
|
124
|
+
import { PieChartOutlined, UserOutlined } from '@ant-design/icons';
|
|
125
|
+
import { Outlet, useNavigate, useLocation } from 'react-router-dom';
|
|
126
|
+
import type { MenuProps } from 'antd';
|
|
127
|
+
|
|
128
|
+
const { Header, Content, Footer, Sider } = Layout;
|
|
129
|
+
|
|
130
|
+
// 定义菜单项类型助手函数
|
|
131
|
+
type MenuItem = Required<MenuProps>['items'][number];
|
|
132
|
+
|
|
133
|
+
function getItem(
|
|
134
|
+
label: React.ReactNode,
|
|
135
|
+
key: React.Key,
|
|
136
|
+
icon?: React.ReactNode,
|
|
137
|
+
children?: MenuItem[],
|
|
138
|
+
): MenuItem {
|
|
139
|
+
return { key, icon, children, label } as MenuItem;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
const items: MenuItem[] = [
|
|
143
|
+
getItem('Dashboard', '/', <PieChartOutlined />),
|
|
144
|
+
getItem('Users', '/users', <UserOutlined />),
|
|
145
|
+
];
|
|
146
|
+
|
|
147
|
+
const MainLayout: React.FC = () => {
|
|
148
|
+
const [collapsed, setCollapsed] = useState(false);
|
|
149
|
+
const { token: { colorBgContainer } } = theme.useToken();
|
|
150
|
+
const navigate = useNavigate();
|
|
151
|
+
const location = useLocation();
|
|
152
|
+
|
|
153
|
+
return (
|
|
154
|
+
<Layout style={{ minHeight: '100vh' }}>
|
|
155
|
+
<Sider collapsible collapsed={collapsed} onCollapse={setCollapsed}>
|
|
156
|
+
<Menu
|
|
157
|
+
theme="dark"
|
|
158
|
+
defaultSelectedKeys={['/']}
|
|
159
|
+
selectedKeys={[location.pathname]}
|
|
160
|
+
mode="inline"
|
|
161
|
+
items={items}
|
|
162
|
+
onClick={({ key }) => navigate(key)}
|
|
163
|
+
/>
|
|
164
|
+
</Sider>
|
|
165
|
+
<Layout>
|
|
166
|
+
<Header style={{ padding: 0, background: colorBgContainer }} />
|
|
167
|
+
<Content style={{ margin: '16px' }}>
|
|
168
|
+
{/* Outlet 用于渲染子路由 */}
|
|
169
|
+
<Outlet />
|
|
170
|
+
</Content>
|
|
171
|
+
</Layout>
|
|
172
|
+
</Layout>
|
|
173
|
+
);
|
|
174
|
+
};
|
|
175
|
+
|
|
176
|
+
export default MainLayout;
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
### 4.4 数据展示页面 - Ant Design Table (`src/pages/Users.tsx`)
|
|
180
|
+
|
|
181
|
+
使用 TypeScript 定义表格列(`ColumnsType`)和数据源(`DataType`)的类型。
|
|
182
|
+
|
|
183
|
+
```tsx
|
|
184
|
+
import React from 'react';
|
|
185
|
+
import { Table, Tag, Space } from 'antd';
|
|
186
|
+
import type { ColumnsType } from 'antd/es/table';
|
|
187
|
+
|
|
188
|
+
// 定义数据类型接口
|
|
189
|
+
interface DataType {
|
|
190
|
+
key: string;
|
|
191
|
+
name: string;
|
|
192
|
+
age: number;
|
|
193
|
+
tags: string[];
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
// 定义列配置,泛型指定为 DataType
|
|
197
|
+
const columns: ColumnsType<DataType> = [
|
|
198
|
+
{
|
|
199
|
+
title: 'Name',
|
|
200
|
+
dataIndex: 'name',
|
|
201
|
+
key: 'name',
|
|
202
|
+
render: (text) => <a>{text}</a>,
|
|
203
|
+
},
|
|
204
|
+
// ... 其他列
|
|
205
|
+
];
|
|
206
|
+
|
|
207
|
+
const data: DataType[] = [
|
|
208
|
+
{ key: '1', name: 'John Brown', age: 32, tags: ['developer'] },
|
|
209
|
+
];
|
|
210
|
+
|
|
211
|
+
const Users: React.FC = () => {
|
|
212
|
+
return (
|
|
213
|
+
<div>
|
|
214
|
+
<h2>Users Management</h2>
|
|
215
|
+
<Table columns={columns} dataSource={data} />
|
|
216
|
+
</div>
|
|
217
|
+
);
|
|
218
|
+
};
|
|
219
|
+
|
|
220
|
+
export default Users;
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
### 4.5 路由配置与组件组合 (`src/App.tsx`)
|
|
224
|
+
|
|
225
|
+
虽然当前 `App.tsx` 主要是为了演示 Context 的使用,但通常我们会在这里配置路由。
|
|
226
|
+
|
|
227
|
+
```tsx
|
|
228
|
+
import React from 'react';
|
|
229
|
+
import Child from './components/Child';
|
|
230
|
+
import { ThemeProvider } from './contexts/ThemeContext';
|
|
231
|
+
|
|
232
|
+
const App: React.FC = () => {
|
|
233
|
+
return (
|
|
234
|
+
<ThemeProvider>
|
|
235
|
+
<Child />
|
|
236
|
+
</ThemeProvider>
|
|
237
|
+
);
|
|
238
|
+
};
|
|
239
|
+
|
|
240
|
+
export default App;
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
*注意:如果需要启用完整路由,可以将 `App.tsx` 中的 `<ThemeProvider>` 替换为 `<Routes>` 配置,如代码注释所示。*
|
|
244
|
+
|
|
245
|
+
## 5. 运行与构建
|
|
246
|
+
|
|
247
|
+
### 开发模式
|
|
248
|
+
|
|
249
|
+
```bash
|
|
250
|
+
npm run dev
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
### 构建生产版本
|
|
254
|
+
|
|
255
|
+
TypeScript 项目构建时会先进行类型检查 (`tsc -b`)。
|
|
256
|
+
|
|
257
|
+
```bash
|
|
258
|
+
npm run build
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
## 6. TypeScript 开发技巧
|
|
262
|
+
|
|
263
|
+
1. **组件 Props 类型**: 总是为组件 Props 定义接口。
|
|
264
|
+
```tsx
|
|
265
|
+
interface MyComponentProps {
|
|
266
|
+
title: string;
|
|
267
|
+
isActive?: boolean; // 可选属性
|
|
268
|
+
}
|
|
269
|
+
const MyComponent: React.FC<MyComponentProps> = ({ title, isActive }) => { ... }
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
2. **事件处理类型**: React 提供了丰富的事件类型。
|
|
273
|
+
```tsx
|
|
274
|
+
const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {
|
|
275
|
+
console.log(event.target.value);
|
|
276
|
+
}
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
3. **Ant Design 类型**: 从 `antd` 或子路径导入组件特定的类型(如 `ColumnsType`, `MenuProps`),这能提供极好的代码补全和类型检查。
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
# 完整启动指南
|
|
2
|
+
|
|
3
|
+
## 一键启动所有服务
|
|
4
|
+
|
|
5
|
+
### 方式一:分别启动(推荐)
|
|
6
|
+
|
|
7
|
+
#### 1. 启动后端服务器(新终端窗口)
|
|
8
|
+
```bash
|
|
9
|
+
cd koa-server
|
|
10
|
+
npm install
|
|
11
|
+
npm run dev
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
后端服务器将在 `http://localhost:8080` 启动
|
|
15
|
+
|
|
16
|
+
#### 2. 启动前端应用(新终端窗口)
|
|
17
|
+
```bash
|
|
18
|
+
npm install
|
|
19
|
+
npm run dev
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
前端应用将在 `http://localhost:5173` 启动
|
|
23
|
+
|
|
24
|
+
### 方式二:使用 npm 脚本
|
|
25
|
+
|
|
26
|
+
在项目根目录创建启动脚本(Windows):
|
|
27
|
+
|
|
28
|
+
**start-all.bat**
|
|
29
|
+
```batch
|
|
30
|
+
@echo off
|
|
31
|
+
start cmd /k "cd koa-server && npm install && npm run dev"
|
|
32
|
+
timeout /t 3
|
|
33
|
+
start cmd /k "npm install && npm run dev"
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
然后运行:
|
|
37
|
+
```bash
|
|
38
|
+
start-all.bat
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
### 方式三:使用 PowerShell
|
|
42
|
+
|
|
43
|
+
```powershell
|
|
44
|
+
# 启动后端
|
|
45
|
+
Start-Process powershell -ArgumentList "cd koa-server; npm install; npm run dev"
|
|
46
|
+
|
|
47
|
+
# 等待3秒
|
|
48
|
+
Start-Sleep -Seconds 3
|
|
49
|
+
|
|
50
|
+
# 启动前端
|
|
51
|
+
Start-Process powershell -ArgumentList "npm install; npm run dev"
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## 验证服务
|
|
55
|
+
|
|
56
|
+
### 检查后端服务
|
|
57
|
+
```bash
|
|
58
|
+
curl http://localhost:8080/health
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
应该返回:
|
|
62
|
+
```json
|
|
63
|
+
{"status":"ok"}
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
### 检查前端应用
|
|
67
|
+
访问 `http://localhost:5173`
|
|
68
|
+
|
|
69
|
+
## 环境配置
|
|
70
|
+
|
|
71
|
+
### 开发环境
|
|
72
|
+
- 前端 API 地址:`http://localhost:8080`
|
|
73
|
+
- 配置文件:`.env.development`
|
|
74
|
+
|
|
75
|
+
### 测试环境
|
|
76
|
+
- 前端 API 地址:`http://localhost:8081`
|
|
77
|
+
- 配置文件:`.env.test`
|
|
78
|
+
- 构建命令:`npm run build:test`
|
|
79
|
+
|
|
80
|
+
### 生产环境
|
|
81
|
+
- 前端 API 地址:`http://47.113.230.113`
|
|
82
|
+
- 配置文件:`.env.production`
|
|
83
|
+
- 构建命令:`npm run build`
|
|
84
|
+
|
|
85
|
+
## 常见问题
|
|
86
|
+
|
|
87
|
+
### 端口被占用
|
|
88
|
+
如果 8080 端口被占用,修改 `koa-server/app.js` 中的端口号:
|
|
89
|
+
```javascript
|
|
90
|
+
const port = 8080; // 改为其他端口,如 8081
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
### 跨域问题
|
|
94
|
+
后端已配置 CORS,如果仍有问题,检查 `koa-server/app.js` 中的 CORS 配置
|
|
95
|
+
|
|
96
|
+
### API 请求失败
|
|
97
|
+
1. 确保后端服务已启动
|
|
98
|
+
2. 检查 `.env.development` 中的 API 地址
|
|
99
|
+
3. 查看浏览器控制台的错误信息
|
|
100
|
+
|
|
101
|
+
## 测试流程
|
|
102
|
+
|
|
103
|
+
1. **启动后端服务**
|
|
104
|
+
```bash
|
|
105
|
+
cd koa-server && npm run dev
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
2. **启动前端应用**
|
|
109
|
+
```bash
|
|
110
|
+
npm run dev
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
3. **访问应用**
|
|
114
|
+
- 打开 `http://localhost:5173`
|
|
115
|
+
- 点击左侧菜单"系统管理"
|
|
116
|
+
- 选择"用户管理"、"角色管理"或"菜单管理"
|
|
117
|
+
|
|
118
|
+
4. **测试功能**
|
|
119
|
+
- 新增:点击"新增"按钮
|
|
120
|
+
- 编辑:点击编辑图标
|
|
121
|
+
- 删除:点击删除图标
|
|
122
|
+
- 搜索:输入搜索条件点击"搜索"
|
|
123
|
+
|
|
124
|
+
## 生产部署
|
|
125
|
+
|
|
126
|
+
### 前端构建
|
|
127
|
+
```bash
|
|
128
|
+
npm run build
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
生成的文件在 `dist` 目录
|
|
132
|
+
|
|
133
|
+
### 后端部署
|
|
134
|
+
```bash
|
|
135
|
+
cd koa-server
|
|
136
|
+
npm install --production
|
|
137
|
+
npm start
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
## 监控和日志
|
|
141
|
+
|
|
142
|
+
### 前端日志
|
|
143
|
+
打开浏览器开发者工具(F12)查看控制台日志
|
|
144
|
+
|
|
145
|
+
### 后端日志
|
|
146
|
+
后端服务启动时会输出日志信息
|
|
147
|
+
|
|
148
|
+
## 性能优化
|
|
149
|
+
|
|
150
|
+
### 前端
|
|
151
|
+
- 使用 `npm run build` 进行生产构建
|
|
152
|
+
- 启用代码分割和懒加载
|
|
153
|
+
|
|
154
|
+
### 后端
|
|
155
|
+
- 使用 PM2 进行进程管理
|
|
156
|
+
- 配置负载均衡
|
|
157
|
+
|
|
158
|
+
## 下一步
|
|
159
|
+
|
|
160
|
+
1. 集成数据库(MongoDB/MySQL)
|
|
161
|
+
2. 实现用户认证和授权
|
|
162
|
+
3. 添加操作日志
|
|
163
|
+
4. 性能监控和优化
|
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
# 系统管理模块文档
|
|
2
|
+
|
|
3
|
+
## 概述
|
|
4
|
+
|
|
5
|
+
本项目包含三个完整的系统管理模块,基于若依管理系统的设计风格实现:
|
|
6
|
+
|
|
7
|
+
- **用户管理** (`src/pages/system/user/User.tsx`)
|
|
8
|
+
- **角色管理** (`src/pages/system/role/Role.tsx`)
|
|
9
|
+
- **菜单管理** (`src/pages/system/menu/Menu.tsx`)
|
|
10
|
+
|
|
11
|
+
## 功能特性
|
|
12
|
+
|
|
13
|
+
### 1. 用户管理
|
|
14
|
+
|
|
15
|
+
#### 主要功能
|
|
16
|
+
- 用户列表展示(分页、排序)
|
|
17
|
+
- 新增用户
|
|
18
|
+
- 编辑用户信息
|
|
19
|
+
- 删除用户
|
|
20
|
+
- 搜索和筛选
|
|
21
|
+
|
|
22
|
+
#### 用户字段
|
|
23
|
+
- 用户编号
|
|
24
|
+
- 用户名称(登录名)
|
|
25
|
+
- 用户昵称
|
|
26
|
+
- 部门
|
|
27
|
+
- 手机号码
|
|
28
|
+
- 邮箱
|
|
29
|
+
- 性别
|
|
30
|
+
- 状态(正常/停用)
|
|
31
|
+
- 创建时间
|
|
32
|
+
- 备注
|
|
33
|
+
|
|
34
|
+
#### 操作
|
|
35
|
+
- **新增**: 点击"新增"按钮打开表单
|
|
36
|
+
- **编辑**: 点击编辑图标修改用户信息
|
|
37
|
+
- **删除**: 点击删除图标,确认后删除用户
|
|
38
|
+
- **搜索**: 按用户名、手机号、创建时间、状态搜索
|
|
39
|
+
- **导出**: 导出用户列表
|
|
40
|
+
|
|
41
|
+
### 2. 角色管理
|
|
42
|
+
|
|
43
|
+
#### 主要功能
|
|
44
|
+
- 角色列表展示
|
|
45
|
+
- 新增角色
|
|
46
|
+
- 编辑角色
|
|
47
|
+
- 删除角色
|
|
48
|
+
- 权限分配
|
|
49
|
+
|
|
50
|
+
#### 角色字段
|
|
51
|
+
- 角色编号
|
|
52
|
+
- 角色名称
|
|
53
|
+
- 权限字符
|
|
54
|
+
- 显示顺序
|
|
55
|
+
- 状态(正常/停用)
|
|
56
|
+
- 创建时间
|
|
57
|
+
- 备注
|
|
58
|
+
|
|
59
|
+
#### 权限分配
|
|
60
|
+
- 树形权限选择
|
|
61
|
+
- 支持多级权限
|
|
62
|
+
- 权限包括:
|
|
63
|
+
- 系统管理
|
|
64
|
+
- 用户管理(查看、新增、修改、删除)
|
|
65
|
+
- 角色管理(查看、新增、修改、删除)
|
|
66
|
+
- 菜单管理(查看、新增、修改、删除)
|
|
67
|
+
- 业务管理
|
|
68
|
+
- 订单管理(查看、新增)
|
|
69
|
+
|
|
70
|
+
#### 操作
|
|
71
|
+
- **新增**: 创建新角色并分配权限
|
|
72
|
+
- **编辑**: 修改角色信息和权限
|
|
73
|
+
- **删除**: 删除角色
|
|
74
|
+
- **权限分配**: 在弹窗中选择权限
|
|
75
|
+
|
|
76
|
+
### 3. 菜单管理
|
|
77
|
+
|
|
78
|
+
#### 主要功能
|
|
79
|
+
- 菜单树形展示
|
|
80
|
+
- 新增菜单/子菜单
|
|
81
|
+
- 编辑菜单
|
|
82
|
+
- 删除菜单
|
|
83
|
+
- 展开/折叠菜单树
|
|
84
|
+
|
|
85
|
+
#### 菜单字段
|
|
86
|
+
- 菜单名称
|
|
87
|
+
- 父菜单
|
|
88
|
+
- 排序
|
|
89
|
+
- 菜单类型(目录/菜单/按钮)
|
|
90
|
+
- 路由地址
|
|
91
|
+
- 组件路径
|
|
92
|
+
- 权限标识
|
|
93
|
+
- 菜单图标
|
|
94
|
+
- 是否外链
|
|
95
|
+
- 是否缓存
|
|
96
|
+
- 是否可见
|
|
97
|
+
- 状态(正常/停用)
|
|
98
|
+
- 创建时间
|
|
99
|
+
- 备注
|
|
100
|
+
|
|
101
|
+
#### 菜单类型
|
|
102
|
+
- **M (目录)**: 菜单分类
|
|
103
|
+
- **C (菜单)**: 可访问的菜单项
|
|
104
|
+
- **F (按钮)**: 页面内的操作按钮
|
|
105
|
+
|
|
106
|
+
#### 操作
|
|
107
|
+
- **新增**: 添加顶级菜单
|
|
108
|
+
- **新增子菜单**: 在菜单行点击"+"添加子菜单
|
|
109
|
+
- **编辑**: 修改菜单配置
|
|
110
|
+
- **删除**: 删除菜单及其子菜单
|
|
111
|
+
- **展开/折叠**: 展开或折叠菜单树
|
|
112
|
+
|
|
113
|
+
## 路由配置
|
|
114
|
+
|
|
115
|
+
所有管理页面已在 `src/App.tsx` 中配置路由:
|
|
116
|
+
|
|
117
|
+
```typescript
|
|
118
|
+
<Route path="system/user" element={<User />} />
|
|
119
|
+
<Route path="system/role" element={<Role />} />
|
|
120
|
+
<Route path="system/menu" element={<Menu />} />
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
## 菜单导航
|
|
124
|
+
|
|
125
|
+
在左侧菜单栏中,"系统管理"下包含三个子菜单项:
|
|
126
|
+
- 用户管理
|
|
127
|
+
- 角色管理
|
|
128
|
+
- 菜单管理
|
|
129
|
+
|
|
130
|
+
## 数据管理
|
|
131
|
+
|
|
132
|
+
### 状态管理
|
|
133
|
+
所有数据使用 React 的 `useState` Hook 进行本地状态管理。
|
|
134
|
+
|
|
135
|
+
### 示例数据
|
|
136
|
+
每个模块都包含初始示例数据:
|
|
137
|
+
|
|
138
|
+
**用户管理**:
|
|
139
|
+
- admin (管理员)
|
|
140
|
+
- test (测试员)
|
|
141
|
+
- dev (开发者)
|
|
142
|
+
|
|
143
|
+
**角色管理**:
|
|
144
|
+
- 超级管理员 (admin)
|
|
145
|
+
- 普通角色 (common)
|
|
146
|
+
- 测试角色 (test)
|
|
147
|
+
|
|
148
|
+
**菜单管理**:
|
|
149
|
+
- 系统管理 (目录)
|
|
150
|
+
- 用户管理 (菜单)
|
|
151
|
+
- 角色管理 (菜单)
|
|
152
|
+
- 菜单管理 (菜单)
|
|
153
|
+
- 业务管理 (目录)
|
|
154
|
+
- 订单管理 (菜单)
|
|
155
|
+
|
|
156
|
+
## 表单验证
|
|
157
|
+
|
|
158
|
+
### 用户管理
|
|
159
|
+
- 用户名称: 必填
|
|
160
|
+
- 用户昵称: 必填
|
|
161
|
+
- 邮箱: 邮箱格式验证
|
|
162
|
+
- 手机号码: 手机号格式验证 (1[3-9]开头的11位数字)
|
|
163
|
+
|
|
164
|
+
### 角色管理
|
|
165
|
+
- 角色名称: 必填
|
|
166
|
+
- 权限字符: 必填
|
|
167
|
+
- 显示顺序: 必填
|
|
168
|
+
|
|
169
|
+
### 菜单管理
|
|
170
|
+
- 菜单名称: 必填
|
|
171
|
+
- 路由地址: 必填
|
|
172
|
+
- 菜单类型: 必填
|
|
173
|
+
- 显示顺序: 必填
|
|
174
|
+
|
|
175
|
+
## 组件依赖
|
|
176
|
+
|
|
177
|
+
所有管理页面使用以下 Ant Design 组件:
|
|
178
|
+
- Table: 数据表格
|
|
179
|
+
- Form: 表单
|
|
180
|
+
- Modal: 对话框
|
|
181
|
+
- Button: 按钮
|
|
182
|
+
- Input: 输入框
|
|
183
|
+
- Select: 下拉选择
|
|
184
|
+
- Switch: 开关
|
|
185
|
+
- DatePicker: 日期选择
|
|
186
|
+
- Tree: 树形组件(角色管理权限分配)
|
|
187
|
+
- Card: 卡片
|
|
188
|
+
- Row/Col: 栅格布局
|
|
189
|
+
- Space: 间距
|
|
190
|
+
- Tooltip: 提示
|
|
191
|
+
- Popconfirm: 确认对话框
|
|
192
|
+
|
|
193
|
+
## 扩展建议
|
|
194
|
+
|
|
195
|
+
### 后端集成
|
|
196
|
+
1. 将本地状态管理替换为 API 调用
|
|
197
|
+
2. 实现真实的数据持久化
|
|
198
|
+
3. 添加权限验证
|
|
199
|
+
|
|
200
|
+
### 功能增强
|
|
201
|
+
1. 批量操作(批量删除、批量导出)
|
|
202
|
+
2. 高级搜索和筛选
|
|
203
|
+
3. 数据导入功能
|
|
204
|
+
4. 操作日志记录
|
|
205
|
+
5. 用户头像上传
|
|
206
|
+
6. 角色权限预设模板
|
|
207
|
+
|
|
208
|
+
### 性能优化
|
|
209
|
+
1. 虚拟滚动处理大数据列表
|
|
210
|
+
2. 分页加载
|
|
211
|
+
3. 缓存优化
|
|
212
|
+
|
|
213
|
+
## 使用示例
|
|
214
|
+
|
|
215
|
+
### 添加新用户
|
|
216
|
+
1. 点击"新增"按钮
|
|
217
|
+
2. 填写用户信息
|
|
218
|
+
3. 点击"确定"保存
|
|
219
|
+
|
|
220
|
+
### 分配角色权限
|
|
221
|
+
1. 在角色管理中点击"新增"
|
|
222
|
+
2. 填写角色基本信息
|
|
223
|
+
3. 在权限分配区域选择需要的权限
|
|
224
|
+
4. 点击"确定"保存
|
|
225
|
+
|
|
226
|
+
### 管理菜单结构
|
|
227
|
+
1. 在菜单管理中查看菜单树
|
|
228
|
+
2. 点击"+"添加子菜单
|
|
229
|
+
3. 配置菜单路由和权限
|
|
230
|
+
4. 点击"确定"保存
|
|
231
|
+
|
|
232
|
+
## 技术栈
|
|
233
|
+
|
|
234
|
+
- React 19.2.4
|
|
235
|
+
- TypeScript 5.9.3
|
|
236
|
+
- Ant Design 6.3.2
|
|
237
|
+
- React Router 7.13.1
|
|
238
|
+
- Dayjs 1.11.10
|
|
239
|
+
- Vite 5.4.0
|
|
240
|
+
|
|
241
|
+
## 浏览器兼容性
|
|
242
|
+
|
|
243
|
+
支持所有现代浏览器(Chrome、Firefox、Safari、Edge)
|
|
244
|
+
|
|
245
|
+
## 许可证
|
|
246
|
+
|
|
247
|
+
MIT
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import js from '@eslint/js'
|
|
2
|
+
import globals from 'globals'
|
|
3
|
+
import reactHooks from 'eslint-plugin-react-hooks'
|
|
4
|
+
import reactRefresh from 'eslint-plugin-react-refresh'
|
|
5
|
+
import { defineConfig, globalIgnores } from 'eslint/config'
|
|
6
|
+
|
|
7
|
+
export default defineConfig([
|
|
8
|
+
globalIgnores(['dist']),
|
|
9
|
+
{
|
|
10
|
+
files: ['**/*.{js,jsx}'],
|
|
11
|
+
extends: [
|
|
12
|
+
js.configs.recommended,
|
|
13
|
+
reactHooks.configs.flat.recommended,
|
|
14
|
+
reactRefresh.configs.vite,
|
|
15
|
+
],
|
|
16
|
+
languageOptions: {
|
|
17
|
+
ecmaVersion: 2020,
|
|
18
|
+
globals: globals.browser,
|
|
19
|
+
parserOptions: {
|
|
20
|
+
ecmaVersion: 'latest',
|
|
21
|
+
ecmaFeatures: { jsx: true },
|
|
22
|
+
sourceType: 'module',
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
rules: {
|
|
26
|
+
'no-unused-vars': ['error', { varsIgnorePattern: '^[A-Z_]' }],
|
|
27
|
+
},
|
|
28
|
+
},
|
|
29
|
+
])
|