"Рекорд" — Ош шаарындагы ЖРТ/ОРТ (Жалпы Республикалык Тестирлөө) даярдоо борборунун толук функционалдуу веб-тиркемеси.
Директор: Нишанов Шекербек | 8+ жыл тажрыйба | 200+ балл алган окуучулар
| Бет | Мазмуну |
|---|---|
| Башкы бет | Hero-блок, статистика (жыл, окуучулар, сертификаттар), акция/тизме (админден түзөтүлөт), тез байланыш |
| Биз жөнүндө | Борбордун тарыхы, миссиясы, директор жөнүндө |
| Курстар | Категория боюнча фильтр, ар бир курстун баасы/узактыгы/башталыш датасы |
| Расписание | Жума боюнча сабактардын таблицасы |
| Окутуучулар | Сүрөт, аты-жөнү, предмети, тажрыйбасы |
| Жетишкендиктер | Статистика + 200+ балл алган окуучулардын тизмеси |
| Отзывдар | Жарыяланган отзывдар + окуучу пикирин калтыруу формасы (модерация админде) |
| Жаңылыктар | Акциялар, жаңы курстар, ЖРТ жаңылыктары |
| Байланыштар | Филиалдар (Google / 2GIS карталар — embed же share link), дарек, телефон, WhatsApp, жазылуу формасы |
/panel/login дареги аркылуу кирүү. Техникалык билим талап кылбайт.
| Бөлүм | Мүмкүнчүлүк |
|---|---|
| Dashboard | Жалпы статистика: жаңы кайрылуулар, күтүүдөгү пикирлер |
| Акция / тизме | Башкы беттеги промо-тизмени текст менен түзөтүү |
| Курстар | Курс кошуу/өзгөртүү/жок кылуу, категория башкаруу |
| Окутуучулар | Мугалим кошуу/өзгөртүү/жок кылуу |
| Расписание | Күн/убакыт/аудитория боюнча сабак кошуу |
| Отзывдар (ЖРТ) | Сайтта көрүнгөн отзывдарды башкаруу (жарыяланган отзывдар) |
| Окуучу пикири | Форма аркылуу келген пикирлер — жарыялоо/четке кагуу |
| Жетишкендиктер | Сайттагы статистиканы өзгөртүү |
| Жаңылыктар | Жаңылык/акция жарыялоо |
| Кайрылуулар | Жазылуу формаларын көрүү, WhatsApp/чалуу |
| Филиалдар | Филиал + Google Maps / 2GIS embed URL (share link сервер тараптан чечилет) |
- 3 тилдик колдоо: Кыргызча, Орусча, Англисче (тил которгуч)
- WhatsApp интеграция: Даяр билдирүү менен WhatsApp ачылат
- Email билдирүүлөр: Жаңы кайрылуу/отзыв келгенде админге email жөнөтүлөт
- Мобильдик версия: Бардык беттер телефондо да иштейт
- JWT аутентификация: Коопсуз админ кирүү системасы
- API throttling (продакшн): коомдук суроолор үчүн лимит (
anon/user);manage.py testучурунда өчүрүлөт (тесттер 429 албайт)
| Катмар | Технология |
|---|---|
| Frontend | React 19, Vite, Tailwind CSS, React Router, react-i18next |
| Backend | Django 5.1, Django REST Framework, SimpleJWT |
| Database | SQLite (локалдык), PostgreSQL (продакшн) |
| Тил колдоо | react-i18next (frontend), Django i18n (backend) |
| Контейнер | Docker, Docker Compose, Nginx |
| CI/CD | GitHub Actions → Docker Hub |
| Тесттер | Django TestCase (backend), Vitest (frontend) |
record-education/
├── backend/ # Django backend
│ ├── config/ # Settings, URLs
│ ├── courses/ # Курстар + расписание
│ ├── teachers/ # Окутуучулар
│ ├── reviews/ # Отзывдар + жетишкендиктер + студент feedback
│ ├── news/ # Жаңылыктар
│ ├── contacts/ # Байланыш формасы + филиалдар
│ ├── admin_api/ # Админ панелдин API'си (JWT менен)
│ ├── Dockerfile # Backend Docker image
│ ├── entrypoint.sh # Миграция + сервер баштоо
│ ├── requirements.txt
│ └── manage.py
├── frontend/ # React frontend
│ ├── src/
│ │ ├── components/ # Navbar, Footer, WhatsApp button
│ │ ├── pages/ # Коомдук беттер (9 бет)
│ │ ├── admin/ # Админ панель (login, dashboard, CRUD pages)
│ │ ├── locales/ # Которуулар (ky, ru, en)
│ │ ├── hooks/ # useLocalized
│ │ ├── utils/ # API client (axios), mapEmbeds (карта URL'дери)
│ │ └── test/ # Vitest тесттери
│ ├── Dockerfile # Frontend Docker image (multi-stage)
│ ├── nginx.conf # Nginx конфигурациясы
│ ├── package.json
│ └── vite.config.js
├── .github/workflows/ci.yml # GitHub Actions CI/CD
├── docker-compose.yml # Бир команда менен иштетүү
├── .gitignore
└── README.md
- Docker жана Docker Compose орнотулган болушу керек
git clone https://github.com/alidin000/record-education.git
cd record-education
# .env файлын түзүү (backend үчүн)
cp backend/.env.example backend/.env
# Бардыгын иштетүү
docker compose up --buildДаяр! Сайт ачылат:
- http://localhost — Коомдук сайт
- http://localhost/panel/login — Админ панель
- http://localhost:8000/admin/ — Django admin
docker compose exec backend python manage.py createsuperuserdocker compose down- Python 3.12 (же 3.10+; CI — 3.12)
- Node.js 18 же жогору (npm менен)
- Git
git clone https://github.com/alidin000/record-education.git
cd record-educationcd backend
# Виртуалдык чөйрө түзүү
python -m venv venv
# Активдештирүү
# Linux/Mac:
source venv/bin/activate
# Windows:
venv\Scripts\activate
# Зарыл пакеттерди орнотуу
pip install -r requirements.txt
# Environment файлын түзүү
cp .env.example .env
# .env файлын ачып SECRET_KEY'ди өзгөртүңүз (каалаган текст жаз)
# Маалымат базасын даярдоо
python manage.py migrate
# Админ аккаунт түзүү (логин/пароль сурайт)
python manage.py createsuperuser
# Серверди иштетүү
python manage.py runserverBackend иштеп жатат: http://localhost:8000 Django admin: http://localhost:8000/admin/
cd frontend
# Пакеттерди орнотуу
npm install
# Dev серверди иштетүү
npm run devFrontend иштеп жатат: http://localhost:5173
| URL | Эмне |
|---|---|
| http://localhost:5173 | Коомдук сайт (студенттер көрөт) |
| http://localhost:5173/panel/login | Админ панель (кызматкерлер) |
| http://localhost:5173/panel/promo | Акция / башкы бет тизмеси (логин кийин) |
| http://localhost:8000/admin/ | Django admin (программист үчүн) |
| http://localhost:8000/api/ | API endpoint тизмеси |
Админ панелге кирип (/panel/login), createsuperuser'дагы логин/пароль менен кириңиз.
Курстар → "Категориялар" баскычы → Категория кошуңуз:
- "ЖРТ Математика" / "ОРТ Математика"
- "ЖРТ Кыргыз тили" / "ОРТ Кыргызский язык"
- "Интенсив" / "Интенсив"
Курстар → "Жаңы курс" → Маалыматтарды толтуруңуз:
- Аталышы (Кыргызча жана Русча — милдеттүү, Англисче — каалоо боюнча)
- Категория, узактык, баа, башталыш датасы
Окутуучулар → "Жаңы окутуучу" → Аты, предмети, тажрыйбасы
Расписание → "Кошуу" → Курсту тандап, күн/убакыт/аудитория
Жетишкендиктер → "Кошуу" → Маани (мис. "200+") жана аталыш
Баары! Сайт автоматтуу жаңыланат.
| Метод | Endpoint | Сүрөттөмө |
|---|---|---|
| GET | /api/courses/ |
Курстар (фильтр: ?category=slug) |
| GET | /api/categories/ |
Категориялар |
| GET | /api/schedule/ |
Расписание |
| GET | /api/teachers/ |
Окутуучулар |
| GET | /api/reviews/ |
Отзывдар (фильтр: ?featured=true) |
| GET | /api/achievements/ |
Жетишкендиктер |
| GET | /api/news/ |
Жаңылыктар (фильтр: ?category=promo) |
| GET | /api/branches/ |
Филиалдар (карта embed талаалары менен) |
| GET | /api/site-promo/ |
Башкы беттеги акция/тизме тексти |
| GET | /api/resolve-map-link/?url=... |
Google/2GIS share linkти embed URLге айлантуу (коопсуз host текшерүү менен) |
| POST | /api/contact/ |
Жазылуу формасы |
| GET/POST | /api/feedback/ |
Студент отзывдары (POST — жөнөтүү, GET — жарыяланган) |
| Метод | Endpoint | Сүрөттөмө |
|---|---|---|
| POST | /api/admin/token/ |
Логин (username + password → access + refresh token) |
| POST | /api/admin/token/refresh/ |
Token жаңылоо |
| GET | /api/admin/me/ |
Учурдагы колдонуучу |
| GET | /api/admin/dashboard/ |
Статистика |
| GET/PATCH | /api/admin/site-promo/ |
Башкы бет акциясы / тизме |
| CRUD | /api/admin/courses/ |
Курстар башкаруу |
| CRUD | /api/admin/categories/ |
Категориялар |
| CRUD | /api/admin/teachers/ |
Окутуучулар |
| CRUD | /api/admin/schedule/ |
Расписание |
| CRUD | /api/admin/feedbacks/ |
Окуучу пикири + approve/reject |
| CRUD | /api/admin/reviews/ |
Жарыяланган отзывдар (ЖРТ) |
| CRUD | /api/admin/achievements/ |
Жетишкендиктер |
| CRUD | /api/admin/news/ |
Жаңылыктар |
| CRUD | /api/admin/branches/ |
Филиалдар |
| CRUD | /api/admin/contacts/ |
Кайрылуулар + mark_processed |
cd backend
source venv/bin/activate
python manage.py test --verbosity=2Тесттер бардык апптарды камтыйт:
admin_api/tests.py— JWT агымы, dashboard, сайт промосу, рейтинг валидациясыcourses/tests.py— Курстар, категориялар, расписание (модель + API + админ)teachers/tests.py— Окутуучулар (модель + көрүнүштүлүк + админ уруксаттар)reviews/tests.py— Отзывдар, feedback жөнөтүү/жарыялоо/четке кагууnews/tests.py— Жаңылыктар жарыялоо, фильтрлөөcontacts/tests.py— Кайрылуулар, филиалдар, карта талаалары,resolve-map-link, сайт промосу (коомдук API)
cd frontend
npm test -- --runPush кылганда автоматтуу иштейт (.github/workflows/ci.yml):
┌─────────────────┐ ┌─────────────────┐
│ test-backend │ │ test-frontend │
│ (Python 3.12) │ │ (Node.js 20) │
│ manage.py test │ │ vitest + build │
└────────┬────────┘ └────────┬─────────┘
│ │
└───────────┬───────────┘
▼
┌───────────────────────┐
│ build-and-push │
│ (main branch гана) │
│ Docker Hub'ка push │
└───────────────────────┘
| Image | Тег |
|---|---|
alidin000/record-backend |
latest, <commit-sha> |
alidin000/record-frontend |
latest, <commit-sha> |
- hub.docker.com/settings/security → New Access Token түзүү
- GitHub репозиторийде: Settings → Secrets → Actions →
DOCKER_HUB_TOKENкошуу
docker pull alidin000/record-backend:latest
docker pull alidin000/record-frontend:latest
docker compose up-
render.com/dashboard → New → Blueprint
-
GitHub репозиторийиңизди тандаңыз (
alidin000/record-education) -
Render автоматтуу
render.yamlфайлын окуп, 3 сервис түзөт:- record-backend — Django API (Python web service)
- record-frontend — React статик сайт
- record-db — PostgreSQL маалымат базасы (бекер)
-
Deploy бүткөндө, админ аккаунт түзүү:
- Render Dashboard → record-backend → Shell табын ачуу
python manage.py createsuperuserжазуу
1. PostgreSQL түзүү:
- Render Dashboard → New → PostgreSQL → Free plan
Internal Database URLкөчүрүү
2. Backend (Web Service):
- New → Web Service → GitHub репо тандоо
- Root Directory:
backend - Build Command:
./build.sh - Start Command:
gunicorn config.wsgi:application --bind 0.0.0.0:$PORT - Environment Variables:
Key Value DATABASE_URL(PostgreSQL'ден көчүргөн URL) SECRET_KEY(каалаган узун текст) DEBUGFalseALLOWED_HOSTS.onrender.comCORS_ALLOWED_ORIGINShttps://record-frontend.onrender.comPYTHON_VERSION3.12.0
3. Frontend (Static Site):
- New → Static Site → GitHub репо тандоо
- Root Directory:
frontend - Build Command:
npm ci && npm run build - Publish Directory:
dist - Redirect/Rewrite rules:
Source Destination Type /api/*https://record-backend.onrender.com/api/*Rewrite /media/*https://record-backend.onrender.com/media/*Rewrite /*/index.htmlRewrite
- Бекер план: сервис 15 мүнөт активсиздиктен кийин "уктайт", кийинки суроо 30-50 сек көбүрөөк алат
- PostgreSQL бекер пландын 90 күн мөөнөтү бар, андан кийин $7/ай
- Media файлдар (сүрөттөр) үчүн эгер көп сүрөт жүктөсө, Cloudinary же AWS S3 колдонуу сунушталат
# .env файлында:
DEBUG=False
SECRET_KEY=<чыныгы-коопсуз-ачкыч>
DATABASE_URL=postgres://user:pass@host:5432/dbname
ALLOWED_HOSTS=record-edu.kg,www.record-edu.kg
CORS_ALLOWED_ORIGINS=https://record-edu.kg
# Email (Gmail мисал):
EMAIL_BACKEND=django.core.mail.backends.smtp.EmailBackend
EMAIL_HOST=smtp.gmail.com
EMAIL_PORT=587
EMAIL_USE_TLS=True
EMAIL_HOST_USER=your-email@gmail.com
EMAIL_HOST_PASSWORD=your-app-password
ADMIN_EMAIL=director@record-edu.kg
# Иштетүү
docker compose up -d| Вариант | Баасы | Жакшы жагы |
|---|---|---|
| Render.com | Бекер | Blueprint менен автоматтык деплой |
| Railway.app | $5/ай | Backend + DB бирге, оңой |
| DigitalOcean Droplet | $6/ай | Толук контроль, Docker менен |
| Vercel (frontend) + Railway (backend) | $5/ай | Тез, масштабдуу |
frontend/src/components/WhatsAppButton.jsx файлында:
const WHATSAPP_NUMBER = '996555000000'; // ← Бул жерди өзгөртүңүзMIT
Abylkasym uulu Alidin — @alidin000