A full-stack task management solution built with modern web technologies. Features role-based access control, real-time analytics, and secure file management.
Frontend:
- HTML5, CSS3, Vanilla JavaScript
- Chart.js for analytics
- Font Awesome icons
- Inter font family
Backend:
- Node.js + Express.js
- SQLite3 database
- JWT authentication
- bcryptjs password hashing
- Multer for file uploads
Security:
- Helmet.js security headers
- Rate limiting
- CORS protection
- Input validation & sanitization
# Clone repository
git clone <repository-url>
cd taskflow-enterprise
# Install dependencies
npm install
# Start server
npm start
# Access application
# http://localhost:3000Default Admin Account:
- Email:
admin@taskflow.com - Password:
Admin123!
taskflow-enterprise/
├── index.html # Main application
├── styles.css # Complete styling
├── app.js # Frontend logic
├── server.js # Express server
├── package.json # Dependencies
└── uploads/ # File storage
- JWT-based authentication
- Role-based access (Admin/Manager/Employee)
- Session management with automatic logout
- Secure password hashing (bcrypt, 12 rounds)
{
id: number,
title: string,
description: string,
priority: 'low' | 'medium' | 'high',
status: 'pending' | 'in-progress' | 'completed',
due_date: string,
assignee_id: number,
estimated_hours: number,
actual_hours: number
}- Multi-role system with granular permissions
- Department and position tracking
- Active/inactive user status
- Profile management with avatars
- Secure file uploads (50MB max)
- File type validation
- Permission-based access control
- Download tracking
- Real-time dashboard metrics
- Task completion charts
- Team performance tracking
- Custom report periods
CREATE TABLE users (
id INTEGER PRIMARY KEY,
email VARCHAR(255) UNIQUE,
password_hash TEXT,
name VARCHAR(255),
role VARCHAR(50),
department VARCHAR(100),
position VARCHAR(100),
avatar_url TEXT,
is_active BOOLEAN DEFAULT 1,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);CREATE TABLE tasks (
id INTEGER PRIMARY KEY,
title VARCHAR(500),
description TEXT,
priority VARCHAR(20),
status VARCHAR(20),
due_date DATE,
assignee_id INTEGER,
created_by INTEGER,
estimated_hours DECIMAL(5,2),
actual_hours DECIMAL(5,2),
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);activity_logs- Audit trailfiles- File metadatarole_permissions- Permission configurationsuser_sessions- Active sessions
POST /api/auth/login // User login
POST /api/auth/logout // User logoutGET /api/tasks // List tasks
POST /api/tasks // Create task
PUT /api/tasks/:id // Update task
DELETE /api/tasks/:id // Delete taskGET /api/users // List users (Admin only)
POST /api/users // Create user (Admin only)
PUT /api/users/:id // Update user (Admin only)GET /api/files // List files
POST /api/files/upload // Upload file
GET /api/files/:id/download // Download file
DELETE /api/files/:id // Delete fileGET /api/dashboard/stats // Dashboard metrics
GET /api/reports // Analytics data
GET /api/activities // Activity logsclass TaskFlowEnterprise {
constructor() {
this.currentUser = null;
this.token = null;
this.users = [];
this.tasks = [];
this.files = [];
}
// Core methods
initializeApp()
handleLogin()
loadTasks()
loadUsers()
loadDashboard()
// ... more methods
}const PORT = process.env.PORT || 3000;
const JWT_SECRET = process.env.JWT_SECRET || 'your-secret-key';
app.use(helmet());
app.use(cors());
app.use(rateLimit({
windowMs: 15 * 60 * 1000, // 15 minutes
max: 100 // limit each IP to 100 requests per windowMs
}));
## Security Implementation
### Authentication Middleware
```javascript
const authenticateToken = async (req, res, next) => {
const token = req.headers['authorization']?.split(' ')[1];
if (!token) return res.status(401).json({ error: 'Access token required' });
try {
const decoded = jwt.verify(token, JWT_SECRET);
const user = await dbGet('SELECT * FROM users WHERE id = ?', [decoded.userId]);
if (!user) return res.status(401).json({ error: 'Invalid token' });
req.user = user;
next();
} catch (error) {
return res.status(403).json({ error: 'Invalid token' });
}
};const passwordHash = await bcrypt.hash(password, 12);
const validPassword = await bcrypt.compare(password, user.password_hash);# Set environment variables
export JWT_SECRET=your-production-secret
export NODE_ENV=production
# Start application
npm start- Automatic SQLite database creation
- Schema versioning included
- Backup procedures recommended for production
- Extend database schema if needed
- Create API endpoints
- Implement frontend components
- Add permission checks
- Update activity logging
- ES6+ JavaScript features
- Modular function organization
- Comprehensive error handling
- Security-first implementation
- SQLite optimized with proper indexing
- Frontend uses efficient DOM updates
- File uploads streamed to disk
- JWT tokens for stateless authentication
- Rate limiting prevents abuse
- Database locks: Ensure proper connection handling
- File upload fails: Check uploads directory permissions
- JWT errors: Verify secret key consistency
- CORS issues: Review frontend-backend URL alignment
- Activity logs track all user actions
- Error logging to console
- Performance metrics available