尚未收集仓库信息。
尚未检测到更新。GitHub 发布版本后会显示在这里。
制作者的介绍仅有上面的一句话。 更多详情请阅读仓库 README。 仓库 README ↗
正在加载完整 README。
查看完整 README ↗Live: shifokor-site.vercel.app · Code: github.com/Jaloliddin-Kulmatov/shifokor-site
Find a good doctor, know the price before you go, and ask a specialist online. Built first for people living in villages, in Uzbek, Russian and English.
State polyclinic queues, medical records and prescriptions belong to DMED and my.gov.uz; Shifokor points people there instead of competing with it. It focuses on what DMED doesn't do: choosing the right specialist (state or private), checked credentials, prices up front, and online consultation in Uzbek.
Status: prototype. Accounts, consultations and visit requests use the server when a database is configured, otherwise a demo saved in the browser. The clinic directory uses real open data.
app_files), and only that consultation's patient and doctor can open them. While an application is still open, a doctor who could accept it can open them too. The server checks each file's first bytes and accepts only JPEG, PNG or WebP up to 1.5 MB. In demo mode, smaller copies stay in the browser.#/prices): every service and consultation price that doctors and clinics entered, searchable by service (with common synonyms, e.g. UZI / узи / ultratovush), region, maximum price and "available online", each with the date it was updated.#/ona: a pregnant woman saves her due date (or the first day of her last period) and, if she likes, her gynaecologist. She sees her week of pregnancy and the WHO schedule of 8 antenatal check-ups, and checks in every week, on the page or with Telegram buttons, with nine danger signs. A danger sign tells her to call 103 or go to the maternity hospital at once and messages her doctor and one family member she linked by a Telegram link. Telegram also reminds her before each check-up. For six weeks after the birth the check-in also asks about the baby. Doctors see the pregnant patients who chose them, with their last check-in, and can mark themselves as a woman doctor ("Faqat ayol shifokorlar" filter). Data: app_preg, app_preg_checks; the weekly messages come from the daily job. Shifokor never diagnoses./api/daily once a day at 10:00 Tashkent time (vercel.json); set CRON_SECRET in Vercel so only Vercel's own call is accepted.site/img in 640 and 1200 px widths and credited at the bottom of the home page. Use them only in general, friendly roles, never to show the people in them as patients with an illness. The logo and browser icon (site/icon.svg) are a black Chust do‘ppi with white almond motifs and a medical cross.app_payments), so a paid consultation can't be faked from the browser, and refunds made in the Payme cabinet show as "To‘lov qaytarilgan". Free consultations, and every consultation while no payment keys are set, work as before without payment. In demo mode a test button shows the flow.#/admin?tab=import), downloads the blank template, fills one row per doctor in Excel or Google Sheets, saves it as CSV (;, , or tab between cells; UTF-8 or Windows-1251) and uploads it. The page checks every row first (name, phone, specialty, region, phone listed twice) and adds only rows without errors, after the admin ticks that the doctors agreed. Columns: ism* (name), telefon* (phone), email, mutaxassislik* (specialty, e.g. Ginekolog), viloyat (region), litsenziya (licence), tajriba (years), tillar (uz, ru, en), ish_joyi (workplace), matn_narx, audio_narx, video_narx (online prices in soums; empty means not offered), onlayn (ha if they consult online), haqida (bio); English names (name, phone, specialty, region, …) work too. Each added doctor gets a personal invite link (/#/claim/…, valid 30 days, shown once). Send it to that doctor by Telegram or SMS: they set a password, confirm the profile, and can edit it. Until then they show in the directory with a note and take no online consultations or payments. The same tab lists doctors who haven't opened their link, with "new link" and "remove" (for a doctor who withdraws consent).PLATFORM_FEE_PERCENT, recorded when the patient paid) for each paid consultation once it's finished; refunded ones don't count. Admins see Tekshiruv → Shifokorlarga to‘lov (#/admin?tab=pay): totals, what each doctor is owed, and a form to record each bank transfer after making it (amount, date, payment order number). It can't record more than the doctor is owed, and a transfer recorded by mistake can be deleted. The doctor gets a Telegram message and sees "Daromadingiz" (earnings and transfers) on their account page. Both lists export to CSV for the accountant. Doctors' bank details aren't stored on the site; get them from the doctor directly.app_signals, deleted after 10 minutes). Either side can mute, turn the camera off, switch to the back camera on a phone (to show a rash), or shrink the call to a small box and keep using the chat. If one side drops out, the call reconnects when they come back. In demo mode a call can be tried between two tabs of one browser.No build step. From the site folder:
python3 -m http.server 8765
Then open http://127.0.0.1:8765. Without Supabase settings the site runs in demo mode (everything saved in the browser).
Import the repository with the root directory left as the repository root. vercel.json sets the build (node scripts/write-config.mjs), serves the site folder, and api/app.js runs as a server function.
Add one environment variable (Project → Settings → Environment Variables):
| Name | Value |
|---|---|
DATABASE_URL | your Postgres connection string (POSTGRES_URL or SUPABASE_DB_URL also work) |
For Supabase, copy it from Connect → Connection string → Method: Transaction pooler (host …pooler.supabase.com, port 6543) and replace [YOUR-PASSWORD] with the database password. The "Direct connection" string (db.<project>.supabase.co) works over IPv6 only, which Vercel functions can't reach. If the password has special characters, percent-encode them.
Optional variables (add them, then redeploy):
| Name | What it turns on |
|---|---|
ADMIN_EMAILS / ADMIN_PHONES | Comma-separated emails or 998… phone numbers of the people who check clinics and doctors. Signed in, they see Menyu → Tekshiruv (#/admin). |
TELEGRAM_BOT_TOKEN | Telegram notices. Create a bot with @BotFather and paste its token. Production deploys point the bot at /api/app?tg=hook by themselves; an admin can also press "Telegram botni shu saytga ulash" on the Tekshiruv page. |
TURN_URLS with TURN_SECRET, or with TURN_USERNAME + TURN_CREDENTIAL | A TURN relay for calls on networks that block direct connections (many mobile and office networks). Without it calls use public STUN only and some won't connect. TURN_URLS is comma-separated, e.g. turn:turn.example.uz:3478,turns:turn.example.uz:5349. With your own coturn server (use-auth-secret), set TURN_SECRET to its static-auth-secret, and each user gets a password that expires in 12 hours. For a hosted TURN service, set its fixed username and credential instead. A coturn server in Uzbekistan also keeps relayed call traffic in the country. |
PAYME_MERCHANT_ID, PAYME_KEY (+ PAYME_TEST=1 while testing) | Payme payments. In the Payme business cabinet, set the cashbox endpoint to https://<site>/api/app?pay=payme and the account field to consult. Test first with the test key and PAYME_TEST=1 in Payme's sandbox (test.paycom.uz), then switch to the real key and remove PAYME_TEST. Optional PAYME_IKPU and PAYME_PACKAGE_CODE add the service's IKPU (MXIK) code to the fiscal receipt. |
CLICK_SERVICE_ID, CLICK_MERCHANT_ID, CLICK_SECRET_KEY | Click payments. In the Click merchant cabinet, set both the Prepare and Complete URLs to https://<site>/api/app?pay=click. |
CRON_SECRET | Any long random text. Vercel sends it with the daily follow-up job, and other callers are refused. Without it the job still works, since it only ever sends what's due. |
Then redeploy. On the first request the server creates its tables (app_users, app_sessions, app_consults, app_messages, app_appts, app_reviews, app_files, app_signals, app_payments, app_payouts, app_preg, app_preg_checks) by itself, including new ones added later. Without DATABASE_URL the site runs in demo mode.
api/app.js); the browser gets nothing but a sign-in token.Use test data only on servers outside Uzbekistan. Real patient data must be stored on servers in Uzbekistan.
site/clinics.js is a derived database and stays under ODbL.data-build/build.py rebuilds site/clinics.js; see site/README.md for details.Shifokor is a directory and scheduling tool, not a medical provider. In an emergency, call 103.
PLATFORM_FEE_PERCENT | The platform's share of each paid consultation, 0 to 50 (default 0). It's recorded on each consultation when it's paid, so changing it later doesn't change past ones. |
ESKIZ_EMAIL, ESKIZ_PASSWORD, ESKIZ_FROM | SMS through Eskiz.uz for patients without Telegram (visit confirmed or declined). Eskiz must approve the message texts first; ESKIZ_FROM defaults to 4546. |