基于 Vite + React + TypeScript + Ant Design + SCSS 的后台管理平台。
内置多级路由菜单、登录 / 退出、动态菜单,以及一套可直接运行的 CRM 演示页面。
cd tenant-console
npm install
npm run dev
默认访问地址:http://localhost:5173
npm run build # 类型检查 + 生产构建
npm run preview # 预览生产构建
npm run typecheck # 仅做 TypeScript 类型检查
登录使用 POST /auth/tenant-login:
{
"phone": "string",
"password": "string",
"tenantCode": "string"
}
/proxy-api,代理目标由 .env 中的 VITE_API_PROXY_TARGET 配置(未配置时取 VITE_API_BASE_URL),浏览器端不会产生跨域请求。VITE_API_BASE_URL;需要在后端开启 CORS,或将前端与接口部署在同一域名下由反向代理转发。src/pages/login/index.tsx,调用 POST /auth/tenant-loginlocalStorage 持久化:src/store/auth.ts路由、菜单、面包屑共用一份配置:src/router/routeConfig.tsx。
{
path: '/system',
title: '用户与权限',
icon: <SafetyCertificateOutlined />,
children: [
{
path: '/system/users',
title: '用户管理',
icon: <TeamOutlined />,
element: <Users />,
},
],
}
src/router/index.tsx)/system)时,自动跳转到第一个子页面/login 并带上 state.from统一使用 src/api/request.ts 的 request(基于 axios):
const result = await request<{ keyword: string }, PageResult<User>>({
url: '/api/users',
method: 'GET',
params: { keyword },
});
request<TReq, TRes> 分别表示请求参数/请求体与响应 data 的类型。data;传 parse: false 返回完整 AxiosResponse。showError: false 可关闭。merge: false 时每次都单独发送。signal: AbortSignal 取消调用方的请求。ApiError,保留 status、data、response、config 与原始错误。页面级接口调用放在页面目录的 server.ts,组件通过它调用请求。
| 页面 | 路由 | 说明 |
|---|---|---|
| 工作台 | /dashboard |
数据卡片、快捷入口、动态、最近订单 |
| 用户管理 | /system/users |
员工列表、详情、增删改、导入 / 导出 |
| 角色管理 | /system/roles |
角色列表、详情、启用 / 停用 |
| 部门管理 | /system/departments |
组织树、增删改、启用 / 停用 |
| 订单管理 | /business/orders |
筛选、处理订单、导出 |
| 客户列表 | /customers/list |
接口数据,按归属销售员筛选 |
| 404 | 任意未知地址 | 页面不存在提示 |
src/
├── api/ # request.ts(axios 封装)与登录接口
├── components/ # 通用组件(如 AntdAppBridge)
├── layouts/ # 后台整体布局(侧边栏、头部、内容区)
├── pages/ # 业务页面
│ ├── login/
│ ├── dashboard/
│ ├── system/
│ ├── business/
│ └── error/
├── router/
│ ├── routeConfig.tsx # 路由 + 菜单唯一数据源
│ ├── menu.tsx # 菜单构建
│ └── index.tsx # React Router 路由生成 + 登录校验
├── store/ # Zustand 登录状态
├── styles/ # 全局 SCSS
├── utils/ # feedback.ts(全局错误提示)
├── types/
└── main.tsx
src/pages 下创建页面组件。src/router/routeConfig.tsx 中添加一条配置(path、title、icon、element)。侧边栏、面包屑会自动读取新配置,无需重复维护。