Cảm ơn bạn quan tâm đến việc đóng góp cho dự án CityLens! Tài liệu này cung cấp hướng dẫn và quy tắc để đóng góp vào dự án.
- Quy tắc ứng xử
- Bắt đầu
- Quy trình phát triển
- Chuẩn code
- Quy tắc commit
- Quy trình Pull Request
- Báo cáo lỗi
- Đề xuất tính năng
- Tài liệu
- Cộng đồng
Dự án này và tất cả mọi người tham gia đều tuân theo Quy tắc ứng xử. Bằng việc tham gia, bạn cam kết tuân thủ các quy tắc này. Vui lòng báo cáo hành vi không phù hợp cho người duy trì dự án.
Đảm bảo bạn đã cài đặt các công cụ sau:
Backend:
- Python 3.11 trở lên
- PostgreSQL 15 trở lên với extension PostGIS
- Redis 7 trở lên
- Apache Jena Fuseki hoặc GraphDB
- MongoDB 6 trở lên
Web Dashboard:
- Node.js 18 trở lên
- npm 9 trở lên
Mobile App:
- Flutter 3.x
- Dart 3.x
-
Fork repository trên GitHub
-
Clone fork của bạn về máy:
git clone https://github.com/TEN_BAN/CityLens.git cd CityLens -
Thêm upstream repository:
git remote add upstream https://github.com/CHU_DU_AN_GOC/CityLens.git
-
Thiết lập backend:
cd backend python -m venv venv source venv/bin/activate # Windows: venv\Scripts\activate pip install -r requirements.txt cp .env.example .env # Chỉnh sửa file .env với cấu hình của bạn alembic upgrade head
-
Thiết lập web dashboard:
cd web-dashboard npm install cp .env.example .env # Chỉnh sửa file .env với cấu hình của bạn
-
Thiết lập mobile app:
cd mobile-app flutter pub get
Luôn tạo branch mới cho công việc của bạn:
git checkout -b feature/ten-tinh-nang
# hoặc
git checkout -b fix/sua-loi
# hoặc
git checkout -b docs/cap-nhat-tai-lieuQuy tắc đặt tên branch:
feature/- Tính năng mớifix/- Sửa lỗidocs/- Cập nhật tài liệurefactor/- Tái cấu trúc codetest/- Thêm hoặc cập nhật testschore/- Công việc bảo trì
- Thực hiện thay đổi trong branch của bạn
- Viết hoặc cập nhật tests nếu cần
- Đảm bảo tất cả tests đều pass
- Cập nhật tài liệu nếu cần thiết
- Tuân thủ chuẩn code được nêu dưới đây
Backend:
cd backend
pytest tests/ -v
pytest tests/ --cov=app --cov-report=htmlWeb Dashboard:
cd web-dashboard
npm test
npm run lintMobile App:
cd mobile-app
flutter test
flutter analyze- Tuân theo hướng dẫn phong cách PEP 8
- Sử dụng Black để format code
- Sử dụng isort để sắp xếp imports
- Sử dụng mypy để kiểm tra type
- Viết docstrings cho tất cả functions và classes công khai (phong cách Google)
- Độ dài dòng tối đa: 100 ký tự
Ví dụ:
from typing import List, Optional
def xu_ly_bao_cao(
bao_cao_id: int,
nguoi_dung_id: int,
trang_thai: Optional[str] = None
) -> dict:
"""Xử lý báo cáo từ người dân và cập nhật trạng thái.
Args:
bao_cao_id: ID của báo cáo cần xử lý
nguoi_dung_id: ID của người dùng xử lý báo cáo
trang_thai: Trạng thái mới cho báo cáo (tùy chọn)
Returns:
Dictionary chứa dữ liệu báo cáo đã cập nhật
Raises:
ValueError: Nếu bao_cao_id không hợp lệ
PermissionError: Nếu người dùng không có quyền
"""
# Triển khai ở đây
passChạy formatters:
black app/
isort app/
mypy app/- Tuân theo Airbnb JavaScript Style Guide
- Sử dụng Prettier để format code
- Sử dụng ESLint để kiểm tra code
- Viết JSDoc comments cho các hàm phức tạp
- Sử dụng functional components với hooks
- Sử dụng TypeScript strict mode
Ví dụ:
interface DuLieuBaoCao {
id: string;
tieu_de: string;
muc_do: 'thap' | 'trung_binh' | 'cao';
}
/**
* Lấy dữ liệu báo cáo từ API
* @param baoCaoId - ID của báo cáo cần lấy
* @returns Promise resolve về dữ liệu báo cáo
*/
async function layBaoCao(baoCaoId: string): Promise<DuLieuBaoCao> {
const response = await fetch(`/api/v1/reports/${baoCaoId}`);
return response.json();
}Chạy formatters:
npm run format
npm run lint- Tuân theo Effective Dart
- Sử dụng
dart formatđể format code - Sử dụng
dart analyzeđể phân tích tĩnh - Viết documentation comments cho public APIs
- Độ dài dòng tối đa: 80 ký tự
Ví dụ:
/// Đại diện cho một báo cáo từ người dân trong hệ thống.
class BaoCao {
/// Tạo instance báo cáo mới.
BaoCao({
required this.id,
required this.tieuDe,
required this.mucDo,
});
/// Mã định danh duy nhất cho báo cáo này.
final String id;
/// Tiêu đề của báo cáo.
final String tieuDe;
/// Mức độ nghiêm trọng của báo cáo.
final MucDo mucDo;
}Chạy formatters:
dart format lib/
dart analyzeChúng tôi tuân theo đặc tả Conventional Commits.
<loai>(<pham-vi>): <tieu-de>
<noi-dung>
<footer>
feat: Tính năng mớifix: Sửa lỗidocs: Chỉ thay đổi tài liệustyle: Thay đổi không ảnh hưởng đến ý nghĩa của coderefactor: Thay đổi code không sửa lỗi cũng không thêm tính năngperf: Thay đổi code cải thiện hiệu năngtest: Thêm tests thiếu hoặc sửa tests hiện cóbuild: Thay đổi ảnh hưởng đến hệ thống build hoặc dependenciesci: Thay đổi files và scripts cấu hình CIchore: Thay đổi khác không sửa src hoặc test files
Phạm vi nên là tên của module bị ảnh hưởng:
backendwebmobileapidbdocs
feat(backend): them endpoint tao entity NGSI-LD
Triển khai endpoint POST /ngsi-ld/v1/entities chấp nhận
dữ liệu entity tuân thủ NGSI-LD và lưu vào PostgreSQL
và GraphDB.
Closes #123
fix(web): sua loi hieu nang marker clustering
Sửa memory leak trong component marker clustering bằng cách
dọn dẹp event listeners đúng cách khi component unmount.
Fixes #456
docs(readme): cap nhat huong dan cai dat
Thêm các bước chi tiết để thiết lập GraphDB và làm rõ
yêu cầu extension PostGIS của PostgreSQL.
- Đảm bảo code của bạn tuân thủ chuẩn code
- Chạy tất cả tests và đảm bảo chúng pass
- Cập nhật tài liệu nếu cần
- Cập nhật CHANGELOG.md với thay đổi của bạn
- Rebase branch của bạn trên upstream main mới nhất:
git fetch upstream git rebase upstream/main
-
Push branch của bạn lên fork:
git push origin feature/ten-tinh-nang
-
Vào repository gốc trên GitHub
-
Click "New Pull Request"
-
Chọn fork và branch của bạn
-
Điền vào PR template với:
- Mô tả rõ ràng về thay đổi
- Số issue liên quan
- Screenshots (nếu có)
- Kiểm tra đã thực hiện
- Hoàn thành checklist
Tuân theo định dạng giống commit messages:
feat(backend): them he thong xac thuc nguoi dung
- Ít nhất một maintainer phải review và approve
- Tất cả CI checks phải pass
- Không có conflict với branch main
- Tất cả review comments phải được giải quyết
- Maintainers sẽ merge PR của bạn
- Branch của bạn sẽ bị xóa
- Thay đổi sẽ được đưa vào release tiếp theo
- Kiểm tra các issues hiện có
- Kiểm tra tài liệu
- Thử tái hiện với phiên bản mới nhất
Sử dụng template báo cáo lỗi và bao gồm:
- Tiêu đề: Tiêu đề rõ ràng, mô tả
- Mô tả: Mô tả chi tiết về lỗi
- Các bước tái hiện:
- Bước 1
- Bước 2
- Bước 3
- Hành vi mong đợi: Điều gì nên xảy ra
- Hành vi thực tế: Điều gì thực sự xảy ra
- Screenshots: Nếu có
- Môi trường:
- Hệ điều hành: [ví dụ: Ubuntu 22.04]
- Trình duyệt: [ví dụ: Chrome 120]
- Phiên bản: [ví dụ: v1.0.0]
- Thông tin bổ sung: Bất kỳ thông tin liên quan nào khác
- Kiểm tra xem tính năng đã tồn tại chưa
- Kiểm tra các đề xuất tính năng hiện có
- Xem xét xem nó có phù hợp với phạm vi dự án không
Sử dụng template đề xuất tính năng và bao gồm:
- Tiêu đề: Tiêu đề rõ ràng, mô tả
- Vấn đề: Tính năng này giải quyết vấn đề gì?
- Giải pháp đề xuất: Nó nên hoạt động như thế nào?
- Phương án thay thế: Các giải pháp khác bạn đã xem xét
- Lợi ích: Tại sao điều này có giá trị?
- Thông tin bổ sung: Mockups, ví dụ, v.v.
- Code Comments: Giải thích logic phức tạp
- API Documentation: Tài liệu hóa tất cả endpoints
- Hướng dẫn người dùng: Giúp người dùng hiểu tính năng
- Hướng dẫn developer: Giúp developers đóng góp
- Viết bằng tiếng Việt rõ ràng, đơn giản
- Sử dụng ngữ pháp và chính tả đúng
- Bao gồm ví dụ code
- Giữ tài liệu cập nhật với thay đổi code
- Sử dụng Markdown để format
# Backend API docs
cd backend
python -m mkdocs build
# Web dashboard docs
cd web-dashboard
npm run docs- GitHub Issues: Báo cáo lỗi và đề xuất tính năng
- GitHub Discussions: Câu hỏi và thảo luận chung
- Pull Requests: Review code và cộng tác
Nếu bạn cần trợ giúp:
- Kiểm tra tài liệu
- Tìm kiếm các issues hiện có
- Hỏi trong GitHub Discussions
- Tag maintainers nếu khẩn cấp
Contributors sẽ được:
- Liệt kê trong CONTRIBUTORS.md
- Đề cập trong release notes
- Ghi công trong project README
Bằng việc đóng góp cho CityLens, bạn đồng ý rằng các đóng góp của bạn sẽ được cấp phép dưới GNU General Public License v3.0 (GPL-3.0). Xem file LICENSE để biết chi tiết.
Nếu bạn có câu hỏi về việc đóng góp, vui lòng:
- Kiểm tra tài liệu này kỹ lưỡng
- Tìm kiếm các issues và discussions hiện có
- Tạo discussion mới nếu cần
Cảm ơn bạn đã đóng góp cho CityLens!