Files
nanocode/urinecheck/CLAUDE.md
T
Ubuntu 32b43f85bd a
2026-07-03 16:58:28 +08:00

107 lines
5.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
## Project overview
Urine test strip recognition system (尿检识别系统) — a full-stack web app that analyzes photos of medical urine reagent strips. Two analysis modes:
- **Image mode**: Upload a strip photo → OpenCV computer vision pipeline locates reagent pads and extracts color values in RGB/HSV/LAB.
- **JSON data mode**: Upload pre-extracted color data → OpenCV Random Trees ML models infer semi-quantitative results (negative, +, ++, etc.) per analyte.
The system was ported from a C++ HarmonyOS app (`/home/ubuntu/nanocode/UrineCheck/`).
## Commands
```bash
# Backend (Python/FastAPI)
cd backend
pip install -r requirements.txt
uvicorn app:app --host 0.0.0.0 --port 8904
# OR: python app.py
# Frontend (React/Vite)
cd frontend
npm install
npm run dev # dev server on :8905, proxies /api → :8904
npm run build # production build to dist/
```
There are **no application-level tests** (no pytest, no Jest/Vitest).
## Architecture
```
Browser → :8905 (Vite/React) ──/api──proxy──→ :8904 (FastAPI/Uvicorn)
│
SSO Center (:9000) ←── JWT cookie verification
```
### Backend (`backend/`)
- **`app.py`** — FastAPI entry point. Creates SQLite tables on startup, registers `auth` and `urinecheck` routers, CORS configured for localhost + `129.211.173.87`.
- **`routers/auth.py`** — Dual-mode auth: local username/password (JWT bearer token, 30-day expiry, stored in localStorage) and SSO cookie validation (decodes JWT from `access_token` cookie using a shared secret). Default admin `admin`/`admin123` created on first startup.
- **`routers/urinecheck.py`** — Two endpoints: `POST /api/urinecheck/analyze` (multipart image upload → CV recognition) and `POST /api/urinecheck/analyze-json` (JSON body → ML inference).
- **`database.py`** / **`models.py`** — SQLAlchemy + SQLite. Single `admins` table (id, username, password_hash, created_at). Database file: `backend/urinecheck.db`.
- **`schemas.py`** — Pydantic request/response models for both endpoints.
- **`sso_client.py`** — Reads `access_token` cookie, decodes JWT locally with a shared secret key. Validates against external SSO at `http://129.211.173.87:9000`.
### Two recognition pipelines
#### Image-based CV pipeline (`urine_recognizer.py`, ~1180 lines — the largest file)
`UrineStripRecognizer` class implements a 7-step algorithm:
1. Preprocess (BGR/HSV/Gray conversion, Gaussian blur)
2. Detect locator blocks (HSV color segmentation, contour finding with Canny fallback)
3. Filter candidates (area, aspect ratio, rectangularity, Y-clustering, pair validation by color + RGB distance + area ratio)
4. Blur assessment (Laplacian variance → 3 sharpness levels)
5. Spec matching (distance ratio + area ratio → matches one of 6 PaperConfigs)
6. Calculate color block centers (edge-to-edge interpolation)
7. Read colors (white balance, circular ROI sampling → RGB/HSV/LAB output)
`PaperConfig` holds the geometric layout for 6 strip specifications (8/11/14 pads × S-type 10mm / L-type 15mm locators). `ColorReader` handles white balancing and color-space extraction.
#### JSON-based ML pipeline (`json_recognizer.py`, ~430 lines)
`UrineJsonRecognizer` class:
- Loads OpenCV RTrees models from `/usr/local/Models/*.data`
- Processes multi-frame data and takes majority vote across frames
- Applies analyte-specific result index corrections (14 correction functions per strip color type)
- Enforces PRO/MAU and SG/pH cross-correlation rules
### ML model configuration (`ml_config.py`)
`MLConfigLoader` singleton parses `/usr/local/Models/ml.json` which defines model files, positions, algorithms, and result index maps for 21 paper types × 15 positions.
### Frontend (`frontend/src/`)
- **React 18 + React Router 6 + Vite 5 + Tailwind CSS 3**
- `App.jsx` — Route definitions with `PrivateRoute` auth wrapper.
- `pages/Login.jsx` — Local auth form + SSO redirect support.
- `pages/UrineCheck.jsx` — Image upload + results display.
- `pages/JsonDataCheck.jsx` — JSON/paste upload + ML results table.
- `api/config.js` — Axios instance configured with `baseURL` from `import.meta.env.VITE_API_BASE_URL` (falls back to current origin).
## Ports
| Service | Port |
|---------|------|
| Frontend (Vite dev) | 8905 |
| Backend (Uvicorn) | 8904 |
| SSO Center | 9000 |
Frontend dev server proxies `/api/*` to `http://localhost:8904`.
## Deployment
systemd units in `deploy/`:
- `urinecheck-backend.service` — runs uvicorn as user `ubuntu` from `backend/`
- `urinecheck-frontend.service` — runs `npm run dev` as user `ubuntu` from `frontend/`
The ML model files (`/usr/local/Models/ml.json` and `/usr/local/Models/*.data`) must be present on the server — they are not in this repository.
## Key dependencies
Backend: `fastapi`, `uvicorn`, `sqlalchemy` (SQLite), `python-jose` (JWT), `passlib[bcrypt]`, `opencv-python-headless`, `numpy`
Frontend: `react` 18, `react-router-dom` 6, `axios`, `vite` 5, `tailwindcss` 3, `preline` (UI component library)