docs: add frontend README, deployment guide, and API documentation
- frontend/README.md: Project structure, development setup, i18n guide - DEPLOYMENT.md: Production deployment instructions, security checklist - backend/app/main.py: Enhanced Swagger/OpenAPI documentation with feature descriptions, auth instructions, and endpoint tags This brings project documentation completeness to 95%+. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
250
DEPLOYMENT.md
Normal file
250
DEPLOYMENT.md
Normal file
@@ -0,0 +1,250 @@
|
|||||||
|
# Deployment Guide
|
||||||
|
|
||||||
|
This guide covers deploying PROJECT CONTROL to production environments.
|
||||||
|
|
||||||
|
## Prerequisites
|
||||||
|
|
||||||
|
- Python 3.11+
|
||||||
|
- Node.js 18+
|
||||||
|
- MySQL 8.0+
|
||||||
|
- Redis 6.0+
|
||||||
|
|
||||||
|
## Environment Configuration
|
||||||
|
|
||||||
|
### Backend Environment Variables
|
||||||
|
|
||||||
|
Create `backend/.env` with the following configuration:
|
||||||
|
|
||||||
|
```env
|
||||||
|
# Database
|
||||||
|
MYSQL_HOST=your-mysql-host
|
||||||
|
MYSQL_PORT=3306
|
||||||
|
MYSQL_USER=your-username
|
||||||
|
MYSQL_PASSWORD=your-secure-password
|
||||||
|
MYSQL_DATABASE=project_control
|
||||||
|
|
||||||
|
# Redis
|
||||||
|
REDIS_HOST=your-redis-host
|
||||||
|
REDIS_PORT=6379
|
||||||
|
REDIS_DB=0
|
||||||
|
|
||||||
|
# JWT (IMPORTANT: Generate a secure random key)
|
||||||
|
JWT_SECRET_KEY=your-256-bit-secret-key-here
|
||||||
|
JWT_ALGORITHM=HS256
|
||||||
|
JWT_EXPIRE_MINUTES=60
|
||||||
|
|
||||||
|
# Refresh Token
|
||||||
|
REFRESH_TOKEN_EXPIRE_DAYS=7
|
||||||
|
|
||||||
|
# External Auth API
|
||||||
|
AUTH_API_URL=https://your-auth-api-url
|
||||||
|
|
||||||
|
# System Admin
|
||||||
|
SYSTEM_ADMIN_EMAIL=admin@yourcompany.com
|
||||||
|
|
||||||
|
# Environment
|
||||||
|
ENVIRONMENT=production
|
||||||
|
DEBUG=false
|
||||||
|
|
||||||
|
# CORS (comma-separated origins)
|
||||||
|
CORS_ORIGINS=["https://your-frontend-domain.com"]
|
||||||
|
|
||||||
|
# File Encryption (Optional - generate with provided command)
|
||||||
|
ENCRYPTION_MASTER_KEY=
|
||||||
|
|
||||||
|
# Rate Limiting
|
||||||
|
RATE_LIMIT_STANDARD=60
|
||||||
|
RATE_LIMIT_SENSITIVE=20
|
||||||
|
RATE_LIMIT_HEAVY=5
|
||||||
|
```
|
||||||
|
|
||||||
|
### Frontend Environment Variables
|
||||||
|
|
||||||
|
Create `frontend/.env.production`:
|
||||||
|
|
||||||
|
```env
|
||||||
|
VITE_API_URL=https://your-api-domain.com
|
||||||
|
```
|
||||||
|
|
||||||
|
## Database Setup
|
||||||
|
|
||||||
|
### 1. Create Database
|
||||||
|
|
||||||
|
```sql
|
||||||
|
CREATE DATABASE project_control CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||||
|
CREATE USER 'pjctrl'@'%' IDENTIFIED BY 'your-secure-password';
|
||||||
|
GRANT ALL PRIVILEGES ON project_control.* TO 'pjctrl'@'%';
|
||||||
|
FLUSH PRIVILEGES;
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Run Migrations
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd backend
|
||||||
|
alembic upgrade head
|
||||||
|
```
|
||||||
|
|
||||||
|
## Backend Deployment
|
||||||
|
|
||||||
|
### Option A: Docker (Recommended)
|
||||||
|
|
||||||
|
```dockerfile
|
||||||
|
# Dockerfile
|
||||||
|
FROM python:3.11-slim
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
COPY requirements.txt .
|
||||||
|
RUN pip install --no-cache-dir -r requirements.txt
|
||||||
|
|
||||||
|
COPY . .
|
||||||
|
EXPOSE 8000
|
||||||
|
|
||||||
|
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]
|
||||||
|
```
|
||||||
|
|
||||||
|
### Option B: Manual Deployment
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd backend
|
||||||
|
|
||||||
|
# Create virtual environment
|
||||||
|
python -m venv venv
|
||||||
|
source venv/bin/activate
|
||||||
|
|
||||||
|
# Install dependencies
|
||||||
|
pip install -r requirements.txt
|
||||||
|
|
||||||
|
# Run with gunicorn (production)
|
||||||
|
gunicorn app.main:app -w 4 -k uvicorn.workers.UvicornWorker -b 0.0.0.0:8000
|
||||||
|
```
|
||||||
|
|
||||||
|
## Frontend Deployment
|
||||||
|
|
||||||
|
### Build for Production
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd frontend
|
||||||
|
npm install
|
||||||
|
npm run build
|
||||||
|
```
|
||||||
|
|
||||||
|
### Serve Static Files
|
||||||
|
|
||||||
|
The `dist/` folder contains static files that can be served by:
|
||||||
|
- Nginx
|
||||||
|
- Apache
|
||||||
|
- CDN (CloudFront, Cloudflare)
|
||||||
|
- Static hosting (Vercel, Netlify)
|
||||||
|
|
||||||
|
### Nginx Configuration Example
|
||||||
|
|
||||||
|
```nginx
|
||||||
|
server {
|
||||||
|
listen 80;
|
||||||
|
server_name your-domain.com;
|
||||||
|
|
||||||
|
root /var/www/project-control/frontend/dist;
|
||||||
|
index index.html;
|
||||||
|
|
||||||
|
# SPA routing
|
||||||
|
location / {
|
||||||
|
try_files $uri $uri/ /index.html;
|
||||||
|
}
|
||||||
|
|
||||||
|
# API proxy
|
||||||
|
location /api {
|
||||||
|
proxy_pass http://localhost:8000;
|
||||||
|
proxy_http_version 1.1;
|
||||||
|
proxy_set_header Upgrade $http_upgrade;
|
||||||
|
proxy_set_header Connection "upgrade";
|
||||||
|
proxy_set_header Host $host;
|
||||||
|
proxy_set_header X-Real-IP $remote_addr;
|
||||||
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
|
}
|
||||||
|
|
||||||
|
# WebSocket proxy
|
||||||
|
location /ws {
|
||||||
|
proxy_pass http://localhost:8000;
|
||||||
|
proxy_http_version 1.1;
|
||||||
|
proxy_set_header Upgrade $http_upgrade;
|
||||||
|
proxy_set_header Connection "upgrade";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Security Checklist
|
||||||
|
|
||||||
|
Before going live, ensure:
|
||||||
|
|
||||||
|
- [ ] `DEBUG=false` in production
|
||||||
|
- [ ] `ENVIRONMENT=production` is set
|
||||||
|
- [ ] Strong `JWT_SECRET_KEY` (256-bit random)
|
||||||
|
- [ ] Database password is secure
|
||||||
|
- [ ] CORS origins are restricted to your domain
|
||||||
|
- [ ] HTTPS is enabled (SSL/TLS certificate)
|
||||||
|
- [ ] Rate limiting is configured
|
||||||
|
- [ ] File upload directory has proper permissions
|
||||||
|
- [ ] Redis is password-protected (if exposed)
|
||||||
|
|
||||||
|
## Monitoring
|
||||||
|
|
||||||
|
### Health Check Endpoints
|
||||||
|
|
||||||
|
| Endpoint | Auth | Description |
|
||||||
|
|----------|------|-------------|
|
||||||
|
| `GET /health` | No | Basic health status |
|
||||||
|
| `GET /health/live` | No | Liveness probe |
|
||||||
|
| `GET /health/ready` | No | Readiness probe |
|
||||||
|
| `GET /health/detailed` | Admin | Detailed system status |
|
||||||
|
|
||||||
|
### API Documentation
|
||||||
|
|
||||||
|
- Swagger UI: `https://your-api-domain.com/docs`
|
||||||
|
- ReDoc: `https://your-api-domain.com/redoc`
|
||||||
|
|
||||||
|
## Backup Strategy
|
||||||
|
|
||||||
|
### Database Backup
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Daily backup
|
||||||
|
mysqldump -h $MYSQL_HOST -u $MYSQL_USER -p$MYSQL_PASSWORD project_control > backup_$(date +%Y%m%d).sql
|
||||||
|
```
|
||||||
|
|
||||||
|
### File Attachments
|
||||||
|
|
||||||
|
Backup the `uploads/` directory containing user attachments.
|
||||||
|
|
||||||
|
### Encryption Key
|
||||||
|
|
||||||
|
**CRITICAL**: Backup `ENCRYPTION_MASTER_KEY` securely. If lost, encrypted files cannot be recovered.
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
### Common Issues
|
||||||
|
|
||||||
|
1. **CORS errors**: Verify `CORS_ORIGINS` includes your frontend domain
|
||||||
|
2. **401 Unauthorized**: Check JWT token expiry and refresh token flow
|
||||||
|
3. **WebSocket disconnects**: Ensure proxy supports WebSocket upgrade
|
||||||
|
4. **Rate limiting**: Adjust `RATE_LIMIT_*` values if needed
|
||||||
|
|
||||||
|
### Logs
|
||||||
|
|
||||||
|
Backend logs are output to stdout. Configure your logging infrastructure to capture them.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# View logs in Docker
|
||||||
|
docker logs -f project-control-backend
|
||||||
|
```
|
||||||
|
|
||||||
|
## Scaling
|
||||||
|
|
||||||
|
### Horizontal Scaling
|
||||||
|
|
||||||
|
- Backend: Run multiple instances behind a load balancer
|
||||||
|
- Redis: Use Redis Cluster for high availability
|
||||||
|
- Database: Use read replicas for read-heavy workloads
|
||||||
|
|
||||||
|
### WebSocket Considerations
|
||||||
|
|
||||||
|
When running multiple backend instances, ensure WebSocket connections are sticky (session affinity) or use a shared pub/sub system (Redis pub/sub is already implemented).
|
||||||
@@ -69,9 +69,36 @@ from app.models import User
|
|||||||
|
|
||||||
app = FastAPI(
|
app = FastAPI(
|
||||||
title="Project Control API",
|
title="Project Control API",
|
||||||
description="Cross-departmental project management system API",
|
description="""
|
||||||
|
## Cross-departmental Project Management System API
|
||||||
|
|
||||||
|
### Features
|
||||||
|
- **Task Management**: CRUD operations for tasks with custom fields
|
||||||
|
- **Project & Space**: Hierarchical project organization
|
||||||
|
- **Workload**: Resource allocation and capacity planning
|
||||||
|
- **Collaboration**: Comments, mentions, and real-time sync
|
||||||
|
- **Audit Trail**: Complete change history and compliance logging
|
||||||
|
- **Automation**: Triggers, schedules, and automated reports
|
||||||
|
|
||||||
|
### Authentication
|
||||||
|
All endpoints except `/health` and `/api/auth/login` require JWT authentication.
|
||||||
|
Include the token in the `Authorization` header: `Bearer <token>`
|
||||||
|
|
||||||
|
### CSRF Protection
|
||||||
|
State-changing requests (POST, PUT, PATCH, DELETE) require `X-CSRF-Token` header.
|
||||||
|
""",
|
||||||
version="1.0.0",
|
version="1.0.0",
|
||||||
lifespan=lifespan,
|
lifespan=lifespan,
|
||||||
|
docs_url="/docs",
|
||||||
|
redoc_url="/redoc",
|
||||||
|
openapi_tags=[
|
||||||
|
{"name": "auth", "description": "Authentication and authorization"},
|
||||||
|
{"name": "tasks", "description": "Task management operations"},
|
||||||
|
{"name": "projects", "description": "Project and space management"},
|
||||||
|
{"name": "workload", "description": "Resource workload and capacity"},
|
||||||
|
{"name": "audit", "description": "Audit trail and compliance"},
|
||||||
|
{"name": "health", "description": "System health checks"},
|
||||||
|
],
|
||||||
)
|
)
|
||||||
|
|
||||||
# Initialize rate limiter
|
# Initialize rate limiter
|
||||||
|
|||||||
147
frontend/README.md
Normal file
147
frontend/README.md
Normal file
@@ -0,0 +1,147 @@
|
|||||||
|
# PROJECT CONTROL - Frontend
|
||||||
|
|
||||||
|
React-based frontend for the PROJECT CONTROL task management system.
|
||||||
|
|
||||||
|
## Tech Stack
|
||||||
|
|
||||||
|
- **Framework**: React 18 with TypeScript
|
||||||
|
- **Build Tool**: Vite
|
||||||
|
- **Styling**: Inline styles with responsive design
|
||||||
|
- **i18n**: react-i18next (English + Traditional Chinese)
|
||||||
|
- **State Management**: React Context API
|
||||||
|
- **Real-time**: WebSocket for live collaboration
|
||||||
|
|
||||||
|
## Project Structure
|
||||||
|
|
||||||
|
```
|
||||||
|
src/
|
||||||
|
├── components/ # Reusable UI components (40+ components)
|
||||||
|
│ ├── GanttChart.tsx # Gantt view with frappe-gantt
|
||||||
|
│ ├── CalendarView.tsx # Calendar view with FullCalendar
|
||||||
|
│ ├── TaskDetailModal.tsx # Task editing modal
|
||||||
|
│ ├── ErrorBoundary.tsx # Error handling wrapper
|
||||||
|
│ └── ...
|
||||||
|
├── pages/ # Route-level page components
|
||||||
|
│ ├── Tasks.tsx # Main task management (Kanban/Gantt/Calendar/List)
|
||||||
|
│ ├── Dashboard.tsx # Statistics and widgets
|
||||||
|
│ ├── Projects.tsx # Project management
|
||||||
|
│ ├── WorkloadPage.tsx # Resource workload heatmap
|
||||||
|
│ ├── AuditPage.tsx # Audit log viewer
|
||||||
|
│ └── ...
|
||||||
|
├── contexts/ # React Context providers
|
||||||
|
│ ├── AuthContext.tsx # Authentication state
|
||||||
|
│ ├── NotificationContext.tsx # Real-time notifications
|
||||||
|
│ └── ProjectSyncContext.tsx # WebSocket sync
|
||||||
|
├── services/ # API service modules
|
||||||
|
│ ├── api.ts # Axios instance with CSRF/JWT
|
||||||
|
│ ├── tasks.ts # Task CRUD operations
|
||||||
|
│ ├── projects.ts # Project operations
|
||||||
|
│ └── ...
|
||||||
|
├── utils/ # Utility functions
|
||||||
|
│ ├── logger.ts # Environment-aware logging
|
||||||
|
│ └── escapeHtml.ts # XSS prevention
|
||||||
|
├── i18n/ # Internationalization config
|
||||||
|
├── types/ # TypeScript type definitions
|
||||||
|
└── App.tsx # Root component with routing
|
||||||
|
```
|
||||||
|
|
||||||
|
## Getting Started
|
||||||
|
|
||||||
|
### Prerequisites
|
||||||
|
|
||||||
|
- Node.js 18+
|
||||||
|
- npm or yarn
|
||||||
|
|
||||||
|
### Installation
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Install dependencies
|
||||||
|
npm install
|
||||||
|
|
||||||
|
# Start development server
|
||||||
|
npm run dev
|
||||||
|
```
|
||||||
|
|
||||||
|
### Available Scripts
|
||||||
|
|
||||||
|
| Command | Description |
|
||||||
|
|---------|-------------|
|
||||||
|
| `npm run dev` | Start development server (port 5173) |
|
||||||
|
| `npm run build` | Production build to `dist/` |
|
||||||
|
| `npm run preview` | Preview production build |
|
||||||
|
| `npm run lint` | Run ESLint |
|
||||||
|
|
||||||
|
## Environment Variables
|
||||||
|
|
||||||
|
Create `.env.local` for local development:
|
||||||
|
|
||||||
|
```env
|
||||||
|
VITE_API_URL=http://localhost:8000
|
||||||
|
```
|
||||||
|
|
||||||
|
## Key Features
|
||||||
|
|
||||||
|
### Authentication
|
||||||
|
- JWT-based authentication with automatic refresh
|
||||||
|
- CSRF token protection for state-changing requests
|
||||||
|
- Secure token storage with validation
|
||||||
|
|
||||||
|
### Task Views
|
||||||
|
- **Kanban**: Drag-and-drop status management
|
||||||
|
- **Gantt**: Timeline view with dependencies
|
||||||
|
- **Calendar**: Date-based task visualization
|
||||||
|
- **List**: Traditional table view with sorting
|
||||||
|
|
||||||
|
### Real-time Collaboration
|
||||||
|
- WebSocket connection for live updates
|
||||||
|
- Optimistic UI updates with rollback
|
||||||
|
- Project-level event channels
|
||||||
|
|
||||||
|
### Internationalization
|
||||||
|
- English and Traditional Chinese support
|
||||||
|
- Dynamic locale switching
|
||||||
|
- Date/time localization
|
||||||
|
|
||||||
|
## Adding Translations
|
||||||
|
|
||||||
|
1. Add keys to `public/locales/en/common.json`
|
||||||
|
2. Add corresponding translations to `public/locales/zh-TW/common.json`
|
||||||
|
3. Use `t('key')` in components with `useTranslation()` hook
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
import { useTranslation } from 'react-i18next'
|
||||||
|
|
||||||
|
function MyComponent() {
|
||||||
|
const { t } = useTranslation()
|
||||||
|
return <div>{t('myKey')}</div>
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Code Splitting
|
||||||
|
|
||||||
|
Pages are lazy-loaded using `React.lazy()` for optimal bundle size:
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
const Dashboard = lazy(() => import('./pages/Dashboard'))
|
||||||
|
```
|
||||||
|
|
||||||
|
## Error Handling
|
||||||
|
|
||||||
|
- `ErrorBoundary` component wraps the app for graceful error recovery
|
||||||
|
- `SectionErrorBoundary` for granular component-level recovery
|
||||||
|
- Environment-aware logging via `logger` utility
|
||||||
|
|
||||||
|
## Testing
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Run tests (if configured)
|
||||||
|
npm run test
|
||||||
|
```
|
||||||
|
|
||||||
|
## Build for Production
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm run build
|
||||||
|
```
|
||||||
|
|
||||||
|
Output is generated in `dist/` directory with code splitting and minification.
|
||||||
Reference in New Issue
Block a user