Ứng dụng web sử dụng React để quản lý yêu cầu thanh toán với phân quyền người dùng và giao diện hiện đại.
- Frontend Framework: React với TypeScript
- Build Tool: Vite
- Quản Lý State: Redux Toolkit với Redux Persist
- CSS Framework: Tailwind CSS
- Thư Viện UI:
- Material-UI
- Radix UI
- Ant Design
- Kiểm Tra Kiểu Dữ Liệu: TypeScript
- Định Tuyến: React Router v6
team2-claimrequest-reactjs/
├── src/ # Mã nguồn
│ ├── apps/ # Mã nguồn chính của ứng dụng
│ ├── assets/ # Tài nguyên tĩnh (hình ảnh, font chữ)
│ ├── components/ # Components React có thể tái sử dụng
│ │ ├── ui/ # Components giao diện
│ │ ├── auth/ # Components xác thực
│ │ ├── Sidebar/ # Thanh điều hướng bên
│ │ ├── Navbar/ # Thanh điều hướng trên
│ │ └── Footer/ # Chân trang
│ ├── hooks/ # Custom React hooks
│ ├── interfaces/ # Định nghĩa kiểu dữ liệu TypeScript
│ ├── layouts/ # Các layout
│ ├── lib/ # Cấu hình thư viện
│ ├── page/ # Các trang
│ ├── routers/ # Cấu hình định tuyến
│ ├── services/ # Dịch vụ API và store
│ │ ├── store/ # Cấu hình Redux store
│ │ ├── features/ # Redux slices
│ │ └── constant/ # Hằng số và enums
│ └── utils/ # Hàm tiện ích
├── public/ # Tài nguyên công khai
└── config files # Các file cấu hình
Khi chạy lệnh npm run dev, các bước sau sẽ diễn ra:
-
Khởi Động Vite Development Server
- Vite đọc cấu hình từ
vite.config.ts - Server phát triển khởi động (mặc định: http://localhost:5173)
- Vite đọc cấu hình từ
-
Tải Điểm Khởi Đầu
// src/main.tsx import React from 'react'; import ReactDOM from 'react-dom'; import App from './apps/App'; import { Provider } from 'react-redux'; import { store, persistor } from './services/store/store'; ReactDOM.render( <React.StrictMode> <Provider store={store}> <PersistGate loading={null} persistor={persistor}> <App /> </PersistGate> </Provider> </React.StrictMode>, document.getElementById('root') );
-
Khởi Tạo Redux Store
- Store được cấu hình với các reducers
- Redux Persist thiết lập đồng bộ với local storage
-
Khởi Tạo Router
- React Router thiết lập các routes
- AuthGuard kiểm tra xác thực người dùng
-
Render Cây Component
- Components layout được tải dựa trên vai trò người dùng
- Components trang được render trong layout
- Mục đích: Logic nghiệp vụ, tiện ích và định nghĩa kiểu
- Vị trí: Thường trong
services/,utils/, vàinterfaces/ - Ví dụ:
// interfaces/auth.interface.ts export interface User { id: string; name: string; role: UserRole; } // services/api.ts export const fetchUser = async (id: string): Promise<User> => { // Logic API }
- Mục đích: Components UI và trang
- Vị trí: Trong
components/,pages/, vàlayouts/ - Ví dụ:
// components/auth/Login.tsx const Login: React.FC = () => { return ( <form> {/* Giao diện form đăng nhập */} </form> ); }
-
Định Nghĩa Kiểu → Components
// interfaces/claim.interface.ts interface Claim { id: string; amount: number; status: ClaimStatus; } // components/claims/ClaimCard.tsx const ClaimCard: React.FC<Claim> = ({ id, amount, status }) => { // Component sử dụng interface Claim }
-
Services → Components
// services/claimService.ts export const fetchClaims = async (): Promise<Claim[]> => { // Logic API } // pages/ClaimList.tsx const ClaimList: React.FC = () => { const claims = useQuery('claims', fetchClaims); // Render danh sách claims }
Ứng dụng hỗ trợ nhiều vai trò người dùng:
- Nhân viên: Gửi và xem yêu cầu thanh toán của họ
- Người duyệt: Xem xét và phê duyệt yêu cầu
- Tài chính: Xử lý các yêu cầu đã được phê duyệt
- Quản trị viên: Quản lý người dùng và cài đặt hệ thống
-
Cài đặt dependencies:
npm install
-
Khởi động server phát triển:
npm run dev
-
Build cho production:
npm run build
Dự án sử dụng nhiều file cấu hình TypeScript:
tsconfig.json: Cấu hình cơ bảntsconfig.app.json: Cài đặt cho ứng dụngtsconfig.node.json: Cài đặt cho môi trường Node.js
-
Quản Lý State:
- Sử dụng Redux cho state toàn cục
- Sử dụng local state cho UI components
- Redux Persist lưu trữ dữ liệu quan trọng
-
Xử Lý API:
- Tập trung xử lý API trong thư mục
services - Sử dụng Axios cho HTTP requests
- Xử lý lỗi thống nhất
- Tập trung xử lý API trong thư mục
-
Bảo Mật:
- Kiểm tra xác thực ở mỗi route bảo vệ
- Không lưu trữ thông tin nhạy cảm ở client
- Sử dụng HTTPS cho môi trường production