From 2d801601b39c87d01f809f59d4039a91f3ad853e Mon Sep 17 00:00:00 2001
From: root <295172551@qq.com>
Date: Thu, 3 Jul 2025 00:12:05 +0800
Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E5=91=BD=E5=90=8D=20WebUI=20=E9=A1=B9?=
=?UTF-8?q?=E7=9B=AE=E7=9B=B8=E5=85=B3=E5=BC=95=E7=94=A8=E4=B8=BA=20X1?=
=?UTF-8?q?=EF=BC=8C=E6=9B=B4=E6=96=B0=20README.md=20=E5=92=8C=20package.j?=
=?UTF-8?q?son?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/X1.WebUI/README.md | 292 ++++++++++++++++++++++++++++++++++++++
src/X1.WebUI/package.json | 74 ++++++++++
2 files changed, 366 insertions(+)
create mode 100644 src/X1.WebUI/README.md
create mode 100644 src/X1.WebUI/package.json
diff --git a/src/X1.WebUI/README.md b/src/X1.WebUI/README.md
new file mode 100644
index 0000000..5610c78
--- /dev/null
+++ b/src/X1.WebUI/README.md
@@ -0,0 +1,292 @@
+# X1 WebUI
+
+基于 Vite + React + TypeScript + Tailwind CSS + Shadcn UI 的现代化管理系统前端。
+
+## 特性
+
+- 🚀 基于 Vite 构建,开发体验极佳
+- ⚛️ 使用 React 18 和 TypeScript 开发
+- 🎨 使用 Tailwind CSS 和 Shadcn UI 构建美观的界面
+- 📱 响应式设计,支持移动端和桌面端
+- 🌙 支持暗黑模式
+- 🔒 内置登录认证
+- 📊 完整的布局系统
+- 🔔 通知系统
+- 🔍 搜索功能
+- 👤 用户管理
+- 👥 角色权限管理
+
+## 技术栈
+
+- 前端:React + TypeScript + Vite
+- UI 组件库:Radix UI + Tailwind CSS
+- 状态管理:React Query
+- HTTP 客户端:Axios
+- 路由:React Router
+- 表单处理:React Hook Form
+
+## 组件库
+
+项目使用 Radix UI 作为基础组件库,结合 Tailwind CSS 进行样式定制。主要组件包括:
+
+### 基础组件
+
+- `Button` - 按钮组件
+ ```tsx
+
+ ```
+
+- `Input` - 输入框组件
+ ```tsx
+
+ ```
+
+- `Select` - 下拉选择组件
+ ```tsx
+
+ ```
+
+- `Form` - 表单组件
+ ```tsx
+
+ ```
+
+- `Table` - 表格组件
+ ```tsx
+
+
+
+ 标题
+
+
+
+
+ 内容
+
+
+
+ ```
+
+- `Dialog` - 对话框组件
+ ```tsx
+
+ ```
+
+## 角色管理功能
+
+### 功能概述
+- 角色列表展示
+- 角色创建、编辑、删除
+- 角色权限管理
+- 角色用户关联
+
+### 技术实现
+- 使用 React + TypeScript 开发
+- 采用 Ant Design 组件库构建 UI
+- 使用 React Hooks 进行状态管理
+- 遵循 Clean Architecture 架构设计
+- 使用 Axios 进行 API 请求
+- 使用 React Query 进行数据缓存和状态管理
+- 使用 React Hook Form 进行表单管理
+- 使用 Zod 进行数据验证
+
+### 目录结构
+```
+src/
+├── pages/
+│ └── roles/
+│ ├── RolesView.tsx # 角色管理页面
+│ ├── RoleForm.tsx # 角色表单组件
+│ └── RolePermissions.tsx # 角色权限管理
+├── components/
+│ └── roles/
+│ ├── RoleList.tsx # 角色列表组件
+│ ├── RoleCard.tsx # 角色卡片组件
+│ └── PermissionTree.tsx # 权限树组件
+├── services/
+│ └── roleService.ts # 角色服务
+├── hooks/
+│ ├── useRoles.ts # 角色相关 Hook
+│ └── usePermissions.ts # 权限相关 Hook
+├── types/
+│ ├── role.ts # 角色类型定义
+│ └── permission.ts # 权限类型定义
+└── utils/
+ └── roleUtils.ts # 角色相关工具函数
+```
+
+### 使用说明
+1. 角色列表页面
+ - 展示所有角色信息
+ - 支持分页、排序和筛选
+ - 显示角色名称、描述、创建时间等信息
+ - 提供快速操作按钮
+
+2. 新建角色
+ - 点击"新建角色"按钮
+ - 填写角色基本信息
+ - 配置角色权限
+ - 提交表单创建角色
+
+3. 编辑角色
+ - 点击角色列表中的"编辑"按钮
+ - 修改角色信息
+ - 更新权限配置
+ - 保存更改
+
+4. 删除角色
+ - 点击角色列表中的"删除"按钮
+ - 确认删除操作
+ - 系统自动更新角色列表
+
+### API 接口
+- GET /api/roles
+ - 获取角色列表
+ - 支持分页、排序和筛选
+ - 返回角色数组
+
+- GET /api/roles/{id}
+ - 获取单个角色详情
+ - 包含角色基本信息和权限配置
+ - 返回角色对象
+
+- POST /api/roles
+ - 创建新角色
+ - 请求体:角色信息对象
+ - 返回创建的角色对象
+
+- PUT /api/roles/{id}
+ - 更新角色信息
+ - 请求体:更新的角色信息
+ - 返回更新后的角色对象
+
+- DELETE /api/roles/{id}
+ - 删除指定角色
+ - 返回删除成功状态
+
+### 数据模型
+```typescript
+interface Role {
+ id: string;
+ name: string;
+ description: string;
+ permissions: Permission[];
+ createdAt: string;
+ updatedAt: string;
+}
+
+interface Permission {
+ id: string;
+ name: string;
+ code: string;
+ description: string;
+ type: 'menu' | 'operation';
+ parentId?: string;
+}
+```
+
+### 开发指南
+1. 环境要求
+ - Node.js >= 16
+ - npm >= 7
+ - Git
+
+2. 开发流程
+ ```bash
+ # 克隆项目
+ git clone https://github.com/yourusername/cellular-management-webui.git
+
+ # 安装依赖
+ npm install
+
+ # 启动开发服务器
+ npm run dev
+
+ # 运行测试
+ npm test
+
+ # 构建生产版本
+ npm run build
+ ```
+
+3. 代码规范
+ - 使用 ESLint 进行代码检查
+ - 使用 Prettier 进行代码格式化
+ - 遵循 TypeScript 严格模式
+ - 使用 Git Flow 工作流
+
+4. 测试规范
+ - 单元测试覆盖率 > 80%
+ - 使用 Jest 和 React Testing Library
+ - 编写集成测试和端到端测试
+
+### 部署说明
+1. 构建项目
+ ```bash
+ npm run build
+ ```
+
+2. 部署步骤
+ - 将构建产物部署到 Web 服务器
+ - 配置 Nginx 反向代理
+ - 设置环境变量
+ - 配置 SSL 证书
+
+3. 环境变量
+ ```env
+ VITE_API_BASE_URL=https://api.example.com
+ VITE_APP_TITLE=Cellular Management
+ ```
+
+### 性能优化
+- 使用 React.lazy 进行代码分割
+- 实现组件级别的缓存
+- 优化图片和静态资源
+- 使用 Service Worker 实现离线功能
+
+### 安全措施
+- 实现 CSRF 防护
+- 使用 HTTPS
+- 实现请求限流
+- 数据加密传输
+- XSS 防护
+
+## 贡献指南
+1. Fork 项目
+2. 创建特性分支
+3. 提交更改
+4. 推送到分支
+5. 创建 Pull Request
+
+## 版本历史
+- v1.0.0 (2024-03-xx)
+ - 初始版本发布
+ - 实现基础功能
+ - 添加角色管理模块
+
+## 许可证
+MIT
\ No newline at end of file
diff --git a/src/X1.WebUI/package.json b/src/X1.WebUI/package.json
new file mode 100644
index 0000000..4a28745
--- /dev/null
+++ b/src/X1.WebUI/package.json
@@ -0,0 +1,74 @@
+{
+ "name": "x1-webui",
+ "private": true,
+ "version": "0.1.0",
+ "type": "module",
+ "scripts": {
+ "dev": "vite",
+ "build": "tsc && vite build",
+ "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0",
+ "preview": "vite preview"
+ },
+ "dependencies": {
+ "@radix-ui/react-accordion": "^1.2.10",
+ "@radix-ui/react-alert-dialog": "^1.1.13",
+ "@radix-ui/react-aspect-ratio": "^1.1.6",
+ "@radix-ui/react-avatar": "^1.1.9",
+ "@radix-ui/react-checkbox": "^1.3.1",
+ "@radix-ui/react-collapsible": "^1.1.10",
+ "@radix-ui/react-context-menu": "^2.2.14",
+ "@radix-ui/react-dialog": "^1.1.13",
+ "@radix-ui/react-dropdown-menu": "^2.1.14",
+ "@radix-ui/react-hover-card": "^1.1.13",
+ "@radix-ui/react-icons": "^1.3.2",
+ "@radix-ui/react-label": "^2.1.6",
+ "@radix-ui/react-menubar": "^1.1.14",
+ "@radix-ui/react-navigation-menu": "^1.2.12",
+ "@radix-ui/react-popover": "^1.1.13",
+ "@radix-ui/react-progress": "^1.1.6",
+ "@radix-ui/react-radio-group": "^1.3.6",
+ "@radix-ui/react-scroll-area": "^1.2.8",
+ "@radix-ui/react-select": "^2.2.4",
+ "@radix-ui/react-separator": "^1.1.6",
+ "@radix-ui/react-slider": "^1.3.4",
+ "@radix-ui/react-slot": "^1.2.2",
+ "@radix-ui/react-switch": "^1.2.4",
+ "@radix-ui/react-tabs": "^1.1.11",
+ "@radix-ui/react-toast": "^1.2.13",
+ "@radix-ui/react-toggle": "^1.1.8",
+ "@radix-ui/react-tooltip": "^1.2.6",
+ "axios": "^1.9.0",
+ "class-variance-authority": "^0.7.0",
+ "clsx": "^2.1.0",
+ "framer-motion": "^12.12.1",
+ "lucide-react": "^0.323.0",
+ "react": "^18.2.0",
+ "react-dom": "^18.2.0",
+ "react-google-recaptcha": "^3.1.0",
+ "react-hook-form": "^7.50.0",
+ "react-icons": "^5.5.0",
+ "react-router-dom": "^6.22.0",
+ "recoil": "^0.7.7",
+ "tailwind-merge": "^2.2.1",
+ "tailwindcss-animate": "^1.0.7",
+ "zod": "^3.24.4"
+ },
+ "devDependencies": {
+ "@shadcn/ui": "^0.0.4",
+ "@types/node": "^20.11.16",
+ "@types/react": "^18.2.43",
+ "@types/react-dom": "^18.2.17",
+ "@types/react-google-recaptcha": "^2.1.9",
+ "@typescript-eslint/eslint-plugin": "^6.14.0",
+ "@typescript-eslint/parser": "^6.14.0",
+ "@vitejs/plugin-react": "^4.2.1",
+ "autoprefixer": "^10.4.17",
+ "eslint": "^8.55.0",
+ "eslint-plugin-react-hooks": "^4.6.0",
+ "eslint-plugin-react-refresh": "^0.4.5",
+ "postcss": "^8.4.33",
+ "tailwindcss": "^3.4.1",
+ "typescript": "^5.2.2",
+ "vite": "^5.0.8"
+ }
+}