main
Architecture fixes: - CCA4_0100_pg: removed SecurityContext.getRoleCode(req) from controller (architecture violation — controller should not access security context beyond requireLogin). Removed 'currentRoleCode' model attribute. HTML btnCreate now always visible — Filter handles permission via SYS_ROLE_FUNCTION. - CCA4_0100.html: removed ROLE_CODE check + display:none on btnCreate. Nút Create luôn hiện — USER sẽ bị 403 khi gọi API create. Consistency fixes: - MenuService.str(): changed return null → return '' (consistent with all 33 other str() helpers) - CCA8_0100_mod.str(): changed return null → return '' (consistent) - CCA1_0200.html: removed UPPERCASE key fallbacks (data.MESSAGE_ID, r.CNT) — DataSet always returns lowercase keys, these were dead code branches. Code cleanup: - CCA3_0100_mod.get(): removed convId2 workaround — reuse :convId (DataSet allows same param name multiple times in one SQL). - CCA4_0100_mod.get(): same convId2 cleanup. - ChatMessageController.presence(): implemented actual heartbeat — update CC_PRESENCE + SYS_USER.LAST_SEEN_AT (was dead code with TODO comment). - ChatWebSocketService: added getRegistry() getter for ChatMessageController. Test results (no regression): - CC/A1: 14/14 PASS - CC/A4+A5: 23/23 PASS - CC/A6+A8: 22/22 PASS - Total: 59/59 PASS - Build: SUCCESS
ChimCuGay — Telegram-like Fullstack Chat System
Hệ thống Web Chat Fullstack giống Telegram, viết bằng Java Spring Boot, tuân thủ tuyệt đối kiến trúc ChimCuGay Skills.
Mục lục
- Giới thiệu
- Công nghệ
- Cấu trúc Project
- Quickstart
- Cấu hình
- Tài khoản mặc định
- Module & Quyền
- Roadmap & Trạng thái
- Quy trình đóng góp
Giới thiệu
ChimCuGay là hệ thống chat fullstack (Web) có thiết kế tương đương Telegram Web, với mục tiêu:
- Hiệu năng cao, có khả năng mở rộng
- Module hóa rõ ràng theo convention ChimCuGay (controller / trx / mod / html)
- RBAC qua Filter, menu động từ
SYS_FUNCTION - Không sử dụng JPA / Repository / Hibernate — toàn bộ DB access qua
DataSetRegistry
Công nghệ
| Thành phần | Công nghệ |
|---|---|
| Backend | Java 21 + Spring Boot 3.3 |
| Web | Spring MVC + Embedded Tomcat |
| Security | Spring Security + JWT + BCrypt |
| Realtime | Spring WebSocket + STOMP + SockJS |
| Template | Thymeleaf |
| Database | MySQL 8.x |
| DB Access | DataSetRegistry (KHÔNG JPA) |
| Build | Maven |
Cấu trúc Project
chimcugay/
├── pom.xml
├── README.md
├── Dockerfile
├── docker-compose.yml
├── .env.example
├── skills/
│ └── skill.md ← Architecture rules (BẮT BUỘC đọc)
├── PROMPT.md ← Yêu cầu dự án
├── ROADMAP.md ← Lộ trình + trạng thái (xem trước khi code)
├── sql/
│ ├── init.sql ← Schema MySQL
│ └── seed.sql ← Dữ liệu SYS_FUNCTION, quyền, config mặc định
├── work_reports/
│ └── report_YYYY-MM-DD_sessionN.md ← Báo cáo theo session
└── src/main/
├── java/com/chimcugay/io/vn/
│ ├── Application.java
│ ├── config/ ← Security, WebSocket, AppConfig, SeedRunner
│ ├── constant/ ← SystemConstants
│ ├── controller/
│ │ ├── BaseController.java
│ │ ├── ZZ/A0/ ← Mỗi function 1 folder: ZZA0_XXXX
│ │ │ ├── ZZA0_0001/ZZA0_0001_pg.java
│ │ │ └── ...
│ │ └── CC/A0/
│ ├── api/ ← trx + mod
│ │ ├── ZZ/A0/ZZA0_XXXX/
│ │ │ ├── ZZA0_XXXX_trx.java
│ │ │ └── ZZA0_XXXX_mod.java
│ │ └── CC/A0/CCA0_XXXX/
│ ├── filter/
│ │ └── MultiSystemPermissionFilter.java
│ ├── security/ ← JwtService, SecurityContext, PasswordEncoder
│ ├── service/ ← DataSet, DataSetRegistry, MenuService, UploadService
│ ├── exception/ ← BusinessException, GlobalExceptionHandler
│ └── util/ ← ApiResponse
└── resources/
├── application.yml
├── application-prod.yml
├── static/{css,js,img}/
└── templates/
├── layout/main.html ← Layout chung (sidebar động từ SYS_FUNCTION)
├── error/error.html
├── ZZ/A0/ZZA0_XXXX/*.html
└── CC/A0/CCA0_XXXX/*.html
Quickstart
Yêu cầu
- Java 21+
- Maven 3.8+
- MySQL 8.x
Chạy local
# 1. Tạo database và seed
mysql -u root -p < sql/init.sql
mysql -u root -p chimcugay < sql/seed.sql
# 2. Cấu hình (copy và chỉnh sửa nếu cần)
cp .env.example .env
# 3. Build & run
mvn clean install
mvn spring-boot:run
# Hoặc chạy class Application trong IDE
Truy cập: http://localhost:8080
Chạy bằng Docker
docker compose up -d --build
Service:
- App: http://localhost:8080
- MySQL: localhost:3306
Cấu hình
Toàn bộ cấu hình trong application.yml, override bằng env vars:
| Env | Mặc định | Mô tả |
|---|---|---|
DB_HOST |
localhost | MySQL host |
DB_PORT |
3306 | MySQL port |
DB_NAME |
chimcugay | Tên database |
DB_USER |
root | MySQL user |
DB_PASSWORD |
root | MySQL password |
JWT_SECRET |
(xem .env.example) | JWT signing secret (≥32 bytes) |
UPLOAD_DEFAULT |
LOCAL | LOCAL / S3 / MINIO |
UPLOAD_LOCAL_DIR |
./uploads | Thư mục upload local |
UPLOAD_PUBLIC_URL |
http://localhost:8080/static/uploads | URL public cho file upload |
SPRING_PROFILES_ACTIVE |
dev | dev / prod |
Tài khoản mặc định
Sau khi chạy seed (tự động khi app khởi động lần đầu), hệ thống có sẵn:
| Username | Password | Role |
|---|---|---|
| admin | admin123 | SUPER_ADMIN |
Ngoài ra còn 2 role mặc định (chưa gán user): ADMIN, USER.
Module & Quyền
ZZ — Hệ thống Quản trị (Admin)
| Function ID | Tên | Mô tả |
|---|---|---|
| ZZA0_0001 | Đăng nhập | Login/Logout/Refresh Token (public, không có menu) |
| ZZA0_0100 | Quản lý User | CRUD user, reset password, lock/unlock |
| ZZA0_0200 | Quản lý Role | CRUD role |
| ZZA0_0300 | Quản lý Function | CRUD SYS_FUNCTION |
| ZZA0_0400 | Phân quyền | Gán ROLE ↔ FUNCTION |
| ZZA0_0500 | Dashboard | Thống kê hệ thống |
| ZZA0_0600 | Cấu hình Upload | CRUD SYS_UPLOAD_CONFIG |
CC — Hệ thống Chat
| Function ID | Tên | Mô tả |
|---|---|---|
| CCA0_0100 | Tài khoản chat | CRUD CC_CHAT_ACCOUNT |
| CCA0_0200 | Phân quyền chat | CRUD CC_CHAT_PERMISSION theo role |
| CCA0_0300 | Cấu hình chat | CRUD CC_CHAT_CONFIG |
Phân quyền mặc định (sau seed)
| Role | Quyền |
|---|---|
| SUPER_ADMIN | Toàn quyền ZZ + CC |
| ADMIN | Toàn quyền ZZ + CC, trừ ZZA0_0300 (Function) và ZZA0_0400 (Permission) |
| USER | Chỉ Dashboard + CCA0_0100 (Chat Account của mình) + CCA0_0300 (Chat Config xem) |
Roadmap & Trạng thái
Xem chi tiết trong ROADMAP.md.
Tóm tắt trạng thái hiện tại (Session 1):
- Core infrastructure: HOÀN THÀNH (DataSetRegistry, Filter, Menu, JWT, Upload, WebSocket)
- ZZ module A0: HOÀN THÀNH 7/7 function (Login, User, Role, Function, Permission, Dashboard, Upload Config)
- CC module A0: HOÀN THÀNH 3/3 function (Chat Account, Chat Permission, Chat Config)
- CC module A1 (Chat realtime): CHƯA BẮT ĐẦU (cần làm tiếp ở session 2)
- Chat features (1-1, group, channel, message, reaction...): CHƯA BẮT ĐẦU
Quy trình đóng góp
Khi tiếp tục phát triển (cho AI/agent kế tiếp):
- Đọc theo thứ tự bắt buộc:
skills/skill.md— architecture rulesROADMAP.md— trạng thái + roadmap- Báo cáo session gần nhất trong
work_reports/
- Tuân thủ 100% Skills:
- Controller (_pg): chỉ mapping URL + trả HTML
- trx: chỉ nhận request + validate + gọi mod
- mod: toàn bộ business
- Dữ liệu: chỉ qua
DataSetRegistry(KHÔNG JPA/Repository) - Quyền: chỉ kiểm tra ở
MultiSystemPermissionFilter - Menu: chỉ render từ
SYS_FUNCTION
- Mỗi module mới sinh đủ: _pg + _trx + _mod + .html + INSERT SYS_FUNCTION + (nếu cần) INSERT SYS_ROLE_FUNCTION
- Sau mỗi session: append báo cáo vào
work_reports/report_YYYY-MM-DD_sessionN.mdvà cập nhậtROADMAP.md
Quy ước function
ZZA0_0100 ← FUNCTION_CODE (có dấu _)
ZZA00100 ← FUNCTION_ID (bỏ dấu _)
/api/ZZ/A0/ZZA0_0100/prompt?TxRequest=ACTION ← INVOKED_URL
/ZZ/A0/ZZA0_0100 ← MENU_URL
Languages
Java
62%
HTML
31.9%
Python
5%
JavaScript
0.5%
Shell
0.4%
Other
0.1%