9.1 KiB
CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
Project Overview
Deploy Ease Platform is a modern enterprise deployment management system frontend built with React 18, TypeScript, and Vite. It provides a comprehensive UI for managing applications, workflows, deployments, servers, and system configurations.
Tech Stack
- Framework: React 18 + TypeScript 5.3
- Build Tool: Vite 5.x
- Routing: React Router 6
- State Management: Redux Toolkit
- UI Components: Radix UI + Ant Design + shadcn/ui
- Styling: TailwindCSS 3.x
- Forms: React Hook Form + Zod validation
- HTTP Client: Axios (with centralized request handler in
src/utils/request.ts) - Code Editor: Monaco Editor
- Flow Visualization: XYFlow + ReactFlow + Dagre
- Form Builder: @react-form-builder libraries
Development Commands
# Install dependencies
pnpm install
# Start development server (runs on http://localhost:3000)
pnpm dev
# Build for production (TypeScript + Vite)
pnpm build
# Lint code (ESLint for .ts, .tsx files)
pnpm lint
# Preview production build locally
pnpm preview
# Compile page generator script
npx tsc -p scripts/tsconfig.json
# Run page generator (interactive mode)
node dist/scripts/generate-page.js
# Run page generator (with CLI arguments)
node dist/scripts/generate-page.js <moduleName> "<displayName>" "<apiEndpoint>"
High-Level Architecture
Directory Structure
src/
├── components/ # Reusable components
│ └── ui/ # Radix UI + shadcn/ui component library
├── pages/ # Page components (organized by feature module)
│ ├── Dashboard/ # Dashboard and overview
│ ├── Deploy/ # Deployment features (applications, deployments, servers, etc.)
│ ├── System/ # System management (users, roles, menus, departments, etc.)
│ ├── Workflow/ # Workflow engine (design, instance, monitoring)
│ ├── Form/ # Form management system
│ ├── LogStream/ # Log streaming and viewing
│ └── Login/ # Authentication
├── layouts/ # Layout components (BasicLayout, etc.)
├── router/ # React Router configuration (index.tsx)
├── store/ # Redux state management (user slice, etc.)
├── services/ # API service layer (weather.ts, etc.)
├── utils/ # Utility functions
│ ├── request.ts # Axios HTTP client with interceptors and error handling
│ ├── table.ts # Table-related utilities
│ ├── page.ts # Page-related utilities
│ └── jsonSchemaUtils.ts
├── hooks/ # Custom React hooks (useTableData, usePageData, etc.)
├── types/ # TypeScript type definitions
├── config/ # Configuration files (icons, etc.)
└── main.tsx # Application entry point
Architecture Patterns
1. Page Structure
Each feature page follows a consistent pattern:
pages/[Feature]/[Module]/
├── List/
│ ├── index.tsx # Main list component
│ ├── components/ # Page-specific components (modals, etc.)
│ ├── service.ts # API service calls
│ ├── types.ts # TypeScript interfaces
│ └── schema.ts # Form validation schemas (Zod)
└── Detail/ # If applicable
2. API Layer
All HTTP requests use the centralized http client from src/utils/request.ts:
- Request Interceptor: Automatically adds Bearer token from localStorage
- Response Interceptor: Handles standardized Response format with error handling
- Error Handling: Global error handling with toast notifications
- Token Expiration: Auto-logout on 401 with localStorage cleanup
Example:
import http from '@/utils/request';
const data = await http.get<DataType>('/api/endpoint');
const result = await http.post<ResultType>('/api/endpoint', payload);
3. State Management
Redux Toolkit is used minimally for global state (currently just user state):
// src/store/userSlice.ts - User authentication and info
// Access via: useSelector((state: RootState) => state.user)
Form-level state uses React Hook Form (not Redux) for better performance and reduced boilerplate.
4. Routing
React Router 6 with lazy-loaded pages and route guards:
- Private routes check Redux store for user token
- Pages are code-split with Suspense boundaries
- Dynamic menu loading from backend (stored in localStorage)
5. Form Management
- React Hook Form: Form state and submission
- Zod: Schema validation (type-safe)
- Modal Pattern: Most forms are in modal dialogs using Radix UI Dialog
6. Styling
- TailwindCSS: Utility-first CSS framework
- Ant Design: Used for complex components (Table, Form, etc.)
- Radix UI: Headless UI for modals, dialogs, popover, etc.
- shadcn/ui: Pre-built components built on Radix UI
Key Development Patterns
HTTP Requests with Error Handling
All HTTP requests automatically:
- Include Bearer token from localStorage
- Handle 401 responses (logout and redirect to /login)
- Display error toast notifications
- Return typed data or reject with standardized error structure
Type-Safe API Responses
interface Response<T> {
code: number;
message: string;
data: T;
success: boolean;
}
Common Hooks
useTableData: Fetch and manage table data with paginationusePageData: Generic page data fetchinguseSelector/useDispatch: Redux integration
Form Pattern Example
// Use Zod for schema
const schema = z.object({
name: z.string().min(1),
email: z.string().email(),
});
// Use React Hook Form with Zod resolver
const form = useForm({
resolver: zodResolver(schema),
});
Important Files Reference
src/utils/request.ts: HTTP client - read this to understand API communicationsrc/store/index.ts: Redux store configurationsrc/router/index.tsx: All routing configurationsrc/layouts/BasicLayout.tsx: Main application layoutvite.config.ts: Build configuration (Monaco Editor asset copying, code splitting)tsconfig.json: TypeScript configuration with@/*path alias
Code Splitting & Performance
The Vite build config includes manual chunks for the System module to optimize loading:
// System pages grouped in separate bundle
manualChunks: {
'system': [
'./src/pages/System/User/index.tsx',
'./src/pages/System/Role/index.tsx',
// ... other system pages
]
}
Environment & Backend Integration
- Dev Server: Runs on port 3000 with Vite HMR
- API Proxy:
/api/*requests proxy tohttp://localhost:8080(configured in vite.config.ts) - LocalStorage: Stores token, userInfo, menus, tenantId for persistence
Common Tasks
Adding a New CRUD Page
Use the page generator:
node dist/scripts/generate-page.js myFeature "My Feature" "/api/v1/my-feature"
This generates complete page structure with types, schema, service, and components.
Making an API Call
import http from '@/utils/request';
// GET request
const users = await http.get<User[]>('/api/users');
// POST with data
const newUser = await http.post<User>('/api/users', userData);
// PUT/DELETE
await http.put<User>('/api/users/1', updatedData);
await http.delete('/api/users/1');
// File upload
await http.upload('/api/upload', file);
// File download
await http.download('/api/export', 'export.xlsx');
Form Validation with Zod
import { z } from 'zod';
import { useForm } from 'react-hook-form';
import { zodResolver } from '@hookform/resolvers/zod';
const schema = z.object({
username: z.string().min(1, 'Required'),
email: z.string().email('Invalid email'),
});
const { register, handleSubmit, formState: { errors } } = useForm({
resolver: zodResolver(schema),
});
Known Patterns & Conventions
- Prefixes: Type files are named
types.ts, validation schemasschema.ts, API servicesservice.ts - Components: UI components in
components/ui/, page-specific components in page folders - Async Operations: Use async/await, error handling via request interceptor
- Imports: Use
@/*path alias extensively - Chinese Locale: Ant Design configured for zh_CN, toast messages in Chinese
- Modules: Pages are organized by business module first, then by feature (List, Detail, Design, etc.)
Notes for Future Development
- The page generator tool is powerful for rapid CRUD page creation
- Monaco Editor assets need to be copied at build time (see vite.config.ts)
- Token authentication is automatically handled; focus on feature logic
- All error handling is centralized; individual components don't need error boundaries for HTTP calls
- Form state is separate from Redux; Redux only for user/auth data
- The architecture supports adding new Redux slices as the app grows