尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证正在加载完整 README。 以下为已保存的摘录。
Web app/PWA hỗ trợ chẩn đoán sàng lọc và quản lý bệnh mạn tính chủ động theo ba tầng: phả hệ PGRS × thể trạng BRS × biến thiên sinh hiệu. Hệ thống kết hợp hồ sơ gia đình, Google Gemini, Web Bluetooth và luồng tài khoản riêng để theo dõi dài hạn. Lưu ý y tế: Đây là phần mềm minh họa, không phải thiết bị y tế. Kết quả không dùng để chẩn đoán, kê đơn hoặc thay thế nhân viên y tế. Với đau ngực, khó thở, lú lẫn, yếu liệt hoặc dấu hiệu cấp cứu, hãy liên hệ dịch vụ cấp cứu tại nơi bạn sống.查看完整 README ↗
Web app/PWA hỗ trợ chẩn đoán sàng lọc và quản lý bệnh mạn tính chủ động theo ba tầng: phả hệ PGRS × thể trạng BRS × biến thiên sinh hiệu. Hệ thống kết hợp hồ sơ gia đình, Google Gemini, Web Bluetooth và luồng tài khoản riêng để theo dõi dài hạn.
Lưu ý y tế: Đây là phần mềm minh họa, không phải thiết bị y tế. Kết quả không dùng để chẩn đoán, kê đơn hoặc thay thế nhân viên y tế. Với đau ngực, khó thở, lú lẫn, yếu liệt hoặc dấu hiệu cấp cứu, hãy liên hệ dịch vụ cấp cứu tại nơi bạn sống.
GeneSense/
├── backend/
│ ├── app/
│ │ ├── main.py # FastAPI, API, bảo vệ request, phục vụ PWA
│ │ ├── auth.py # Google OIDC, phiên đăng nhập, đăng xuất
│ │ ├── config.py # Cấu hình môi trường
│ │ ├── database.py # SQLAlchemy async + Neon
│ │ ├── migrations.py # Nâng cấp schema tối thiểu khi khởi động
│ │ ├── models.py # User, phiên, lần đo, tài liệu sức khỏe
│ │ ├── schemas.py # Kiểm tra request/response
│ │ └── services/
│ │ ├── risk_engine.py # PGRS, BRS, sinh hiệu, ngưỡng động
│ │ └── ai_service.py # Google Gemini JSON Schema + fallback quy tắc
│ ├── tests/
│ │ ├── test_accounts.py
│ │ └── test_risk_engine.py
│ └── requirements.txt
├── frontend/
│ ├── index.html # Đăng nhập, onboarding, dashboard, lịch sử
│ ├── assets/styles.css # Medical UI responsive
│ ├── js/
│ │ ├── app.js # Tài khoản, UI, form, luồng đo
│ │ ├── api.js # API client có cookie phiên
│ │ ├── ble.js # BLE + Moving Average Filter
│ │ ├── chart.js # Biểu đồ Canvas
│ │ └── icons.js # Biểu tượng SVG nội tuyến
│ ├── manifest.webmanifest
│ └── sw.js
├── .env.example
├── .gitignore
├── docker-compose.yml
└── README.md
Yêu cầu: Python 3.11+; Chrome hoặc Edge mới nếu thử Bluetooth.
cd "C:\duong-dan\GeneSense"
python -m venv .venv
.\.venv\Scripts\Activate.ps1
python -m pip install -r backend\requirements.txt
Copy-Item .env.example .env
python -m uvicorn backend.app.main:app --reload --host 127.0.0.1 --port 8000
cd "/duong-dan/GeneSense"
python3 -m venv .venv
source .venv/bin/activate
python -m pip install -r backend/requirements.txt
cp .env.example .env
python -m uvicorn backend.app.main:app --reload --host 127.0.0.1 --port 8000
Mở duy nhất http://localhost:8000. Khi chưa cấu hình Google, chọn Khám phá với tài khoản demo, hoàn tất hồ sơ lần đầu rồi ghi một lần đo. API docs dành cho phát triển ở http://localhost:8000/docs.
Nếu PowerShell báo không tìm thấy Activate.ps1, hãy kiểm tra terminal đang đứng đúng thư mục dự án và .venv đã được tạo ở đó. Không gửi thư mục .venv cho người khác; mỗi máy phải tự tạo môi trường Python.
Khóa Google AI Studio không phải thông tin đăng nhập Google. OAuth bắt buộc có
GOOGLE_CLIENT_IDvàGOOGLE_CLIENT_SECRETriêng từ Google Cloud Console.
http://localhost:8000http://localhost:8000/api/auth/google/callback.env.example thành .env, rồi điền:APP_BASE_URL=http://localhost:8000
GOOGLE_CLIENT_ID=your-client-id.apps.googleusercontent.com
GOOGLE_CLIENT_SECRET=your-google-client-secret
SESSION_SECRET=thay-bang-chuoi-ngau-nhien-dai-it-nhat-32-ky-tu
ENABLE_DEMO_LOGIN=true
Tạo SESSION_SECRET an toàn bằng:
python -c "import secrets; print(secrets.token_urlsafe(48))"
http://localhost:8000; không đổi sang 127.0.0.1 giữa luồng đăng nhập vì cookie OAuth gắn với hostname.Khi triển khai thật, dùng domain HTTPS, đặt callback chính xác là https://TEN-MIEN/api/auth/google/callback, đồng thời đặt:
APP_ENV=production
APP_BASE_URL=https://TEN-MIEN
ENABLE_DEMO_LOGIN=false
Mặc định nút Dùng thử với hồ sơ mẫu chỉ hoạt động trên chính máy chạy server. Để ai có đường link cũng dùng thử được, đặt trong .env:
DEMO_PUBLIC=true
DEMO_ACCOUNTS_PER_HOUR=10
DEMO_RETENTION_DAYS=3
DEMO_PUBLIC=true.127.0.0.1 (--host 0.0.0.0) và APP_BASE_URL, CORS_ORIGINS trỏ đúng địa chỉ họ mở. Khi đưa lên mạng công khai, dùng HTTPS với APP_ENV=production và SESSION_SECRET dài từ 32 ký tự.Không cần thẻ thanh toán. Cả ứng dụng chạy như một hàm serverless (api/index.py, vercel.json).
postgresql://..., không chọn "Pooled connection").DATABASE_URL=postgresql://... # chuỗi của Neon
SESSION_SECRET=... # python -c "import secrets; print(secrets.token_urlsafe(48))"
APP_ENV=production
DEMO_PUBLIC=true
https://ten-du-an.vercel.app và bấm Dùng thử với hồ sơ mẫu.Ghi chú:
APP_BASE_URL tự lấy theo địa chỉ production của Vercel. Chỉ cần đặt tay khi dùng tên miền riêng.public/ trống là có chủ ý: nó ngăn Vercel phát mã nguồn như file tĩnh.Dùng khi cần cho người khác xem nhanh mà chưa đưa lên hosting. Máy phải bật suốt thời gian đó và đường link đổi sau mỗi lần chạy.
Cần có cloudflared-windows-amd64.exe (tải từ cloudflare/cloudflared) trong thư mục .tools. Sau đó, trong PowerShell tại thư mục dự án:
.\start-public.ps1
Script mở tunnel, ghi địa chỉ https://....trycloudflare.com vào .env.public, in địa chỉ đó ra màn hình rồi chạy server thứ hai trên cổng 8001. Bấm Ctrl+C để dừng cả server lẫn tunnel.
Server này dùng database riêng public-trial.db, nên khách dùng thử không đụng vào dữ liệu trong healthpredict.db. Cấu hình genesense-public trong .claude/launch.json chạy cùng server đó khi .env.public đã có sẵn.
Không commit .env, Google Client Secret, SESSION_SECRET hoặc API key. Nút Google tự bị vô hiệu hóa nếu server chưa có đủ thông tin OAuth.
Tạo database Neon, rồi đặt trong .env:
DATABASE_URL=postgresql://USER:PASSWORD@HOST/DBNAME?sslmode=require
Ứng dụng tự chuẩn hóa URL cho asyncpg và tạo năm bảng users, login_sessions, assessments, feedback, medical_records. Muốn dùng PostgreSQL local:
docker compose up -d postgres
Sau đó đặt DATABASE_URL=postgresql://healthpredict:healthpredict@localhost:5432/healthpredict.
((1 + PGRS/100) × (1 + BRS/100) × (1 + Vitals/100) - 1) / 7 × 100.AI chỉ diễn giải kết quả đã khóa. Nếu thiếu API key, người dùng vẫn nhận lời khuyên theo quy tắc.
Chỉ đặt khóa ở file .env phía backend; không chèn vào HTML/JavaScript và không gửi .env cho người khác:
AI_PROVIDER=google
GOOGLE_AI_API_KEY=your-google-ai-studio-key
GOOGLE_AI_MODEL=gemini-3.6-flash
GOOGLE_AI_FALLBACK_MODEL=gemini-3.1-flash-lite
ai_service.py gọi Gemini API từ backend, yêu cầu đầu ra JSON theo schema, timeout 45 giây và fallback an toàn. Backend tự thử lại với backoff khi Google trả 429/5xx, sau đó chuyển sang model dự phòng. Nếu AI lỗi, thuật toán nguy cơ ba tầng vẫn hoạt động bằng bộ quy tắc. Hồ sơ chỉ được gửi để diễn giải khi người dùng đã bật đồng ý AI trong hồ sơ.
Với ảnh hồ sơ sức khỏe, ứng dụng chỉ nhận JPG/PNG/WebP tối đa 8 MB, kiểm tra chữ ký tệp, yêu cầu đồng ý riêng cho từng lần phân tích và không ghi ảnh vào cơ sở dữ liệu hay kho tệp ứng dụng. Ảnh được gửi đến Google Gemini cho lần phân tích đó; file tạm phía GeneSense được đóng ngay sau khi đọc. AI chỉ trích xuất nội dung nhìn thấy, không chẩn đoán. Kết quả được hiển thị để người dùng đối chiếu trước khi gọi API lưu. Chỉ JSON đã xác nhận được lưu theo user_id; người dùng có thể xóa từng bản ghi.
Model khả dụng phụ thuộc tài khoản Google AI Studio. Nếu Google thay model, gọi API danh sách model hoặc cập nhật GOOGLE_AI_MODEL. Có thể chuyển lại OpenAI bằng AI_PROVIDER=openai và các biến OPENAI_* trong .env.example.
| Chỉ số | Service | Characteristic |
|---|---|---|
| Nhịp tim | 0x180D | 0x2A37 |
| Huyết áp | 0x1810 | 0x2A35 |
| Pulse Oximeter | 0x1822 | 0x2A5F |
| Glucose | 0x1808 | 0x2A18 |
MovingAverage(5); dữ liệu BLE cũ quá 30 giây không được dùng cho lần đánh giá mới.| Method | Endpoint | Mục đích |
|---|---|---|
GET | /api/auth/config | Trạng thái Google/demo |
GET | /api/auth/google | Bắt đầu đăng nhập Google |
GET | /api/auth/me | Tài khoản hiện tại |
POST | /api/auth/logout | Thu hồi phiên hiện tại |
GET/PUT | /api/profile | Đọc/cập nhật hồ sơ sức khỏe |
POST | /api/assessments | Tính và lưu kết quả của tài khoản |
GET | /api/assessments | Lịch sử của tài khoản |
GET | /api/assessments/{id} | Chi tiết thuộc tài khoản |
DELETE | /api/assessments/{id} | Xóa lần đo thuộc tài khoản |
POST | /api/feedback | Lưu phản hồi thuộc tài khoản |
POST | /api/medical-records/analyze | Phân tích ảnh trong bộ nhớ, chưa lưu |
GET/POST | /api/medical-records | Xem hoặc lưu JSON đã xác nhận |
DELETE | /api/medical-records/{id} | Xóa bản ghi thuộc tài khoản |
POST | /api/care/invites | Tạo mã chia sẻ dùng một lần (24 giờ) |
POST | /api/care/links | Nhập mã để theo dõi người thân (chỉ xem) |
GET | /api/care/links | Danh sách người thân đang theo dõi và người đang xem hồ sơ của tôi |
DELETE | /api/care/links/{id} | Thu hồi hoặc ngừng theo dõi |
GET | /api/care/patients/{id}/profile |
Các API thay đổi dữ liệu yêu cầu cookie phiên cùng header X-Requested-With; dữ liệu được giới hạn theo user_id ở backend.
Ảnh trong frontend/assets/tips/ lấy từ Pexels (miễn phí, không bắt buộc ghi nguồn) và được lưu cùng ứng dụng để không gửi yêu cầu ra bên thứ ba: 54326, 7129126, 8088865, 17072088, 30834708, 34889040, 10894046, 34199673, 3771069, 6648542, 7580256, 6520070, 11643228, 13637225.
python -m pytest backend\tests -q
Bộ test gồm thuật toán nguy cơ, trường hợp cấp cứu, tách dữ liệu giữa tài khoản, thu hồi/timeout phiên, validation hồ sơ, migration dữ liệu cũ và callback Google mô phỏng. Google thật vẫn cần kiểm thử trên OAuth Client/domain của bạn.
| Hồ sơ và tiền sử gia đình của người thân đã liên kết |
GET | /api/care/patients/{id}/assessments | Số đo của người thân đã liên kết |