med-cms 1.0.0-beta.5 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.txt +13 -0
- package/README.md +121 -0
- package/env_init.js +55 -0
- package/index.d.ts +38 -24
- package/index.js +5 -5
- package/package.json +3 -3
- package/public/icon/icon.png +0 -0
- package/server/server.js +27 -0
- package/README +0 -161
- package/test.js +0 -16
package/LICENSE.txt
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
Copyright 2026 RPM-programmer (github) / prm-programmer (npmjs)
|
|
2
|
+
|
|
3
|
+
Permission to use, copy, modify, and/or distribute this software for any purpose with or
|
|
4
|
+
without fee is hereby granted, provided that the above copyright notice and this permission
|
|
5
|
+
notice appear in all copies.
|
|
6
|
+
|
|
7
|
+
THE SOFTWARE IS PROVIDED “AS IS” AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
8
|
+
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
9
|
+
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
10
|
+
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
11
|
+
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
12
|
+
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
|
|
13
|
+
IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
# MED-CMS (v1.1.0)
|
|
2
|
+
|
|
3
|
+
> ## `med-cms` — Это автономный медецинский движок для управления сетями клиник, персоналом и расписание приймов и т.д. Написан `med-cms` на node.js с использованием **express**, **sequelize**
|
|
4
|
+
|
|
5
|
+
<p align="center">
|
|
6
|
+
<img src="public/icon/icon.png" alt="MED-CMS Logo" width="200"/>
|
|
7
|
+
</p>
|
|
8
|
+
|
|
9
|
+
### Модуль поставляется со встроенной базой данных, системой разграничения прав доступа на основе **34 медицинских специальностей** и готовым веб-интерфейсом (АРМ Врача, Личный Кабинет Пациента, Панель Суперадминистратора), а также готовой главной страницей
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## Ключевые возможности
|
|
14
|
+
|
|
15
|
+
- **Автономность** База данных SQLite3 не требует установки тяжелых серверов (PostgreSQL/MySQL/MongoDB). Файл БД и таблицы создаются автоматически прямо в папке проекта.
|
|
16
|
+
- **Безопасность и Сессии:** Авторизация реализована через зашифрованные JWT-токены, хранящиеся в защищенных **HttpOnly Cookie**. JS на клиенте не имеет доступа к токену.
|
|
17
|
+
- **Матрица прав доступа (34 специальности):** Гибкое разграничение возможностей врачей. Стоматолог или Эндокринолог не смогут получить доступ к эндпоинтам назначения нейрохирургических операций — то-есть не к своим данным
|
|
18
|
+
- **Автоматический расчет участков:** При регистрации или изменении адреса проживания пациента система сама вычисляет номер его терапевтического участка и закрепленный кабинет врача. Участки настраиваются админом.
|
|
19
|
+
- **Статистика болезней и МКБ-10:** Выделенный независимый справочник заболеваний в базе данных с возможностью автономной миграции и автоматическим инкрементом счетчиков заболеваемости при закрытии приемов врачами.
|
|
20
|
+
- **Возможность управлять новостями** А админ панеле есть форма позволяющая выкладывать новости.
|
|
21
|
+
- **Автозапись в `.env`** При запуске проекта код проверяет есть ли `.env` и настройки в нём, если то записывает настройки в него.
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## Установка и быстрая настройка
|
|
26
|
+
|
|
27
|
+
### 1. Установка модуля
|
|
28
|
+
|
|
29
|
+
#### Установите пакет в ваше Node.js приложение:
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
npm install med-cms
|
|
33
|
+
# или
|
|
34
|
+
yarn add med-cms
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
> **Важно для пользователей Linux:** Пакетам `sequelize` и `sqlite3` иногда требуются компиляторы C++ для сборки бинарных файлов под вашу архитектуру ядра. Перед развертыванием убедитесь, что в системе установлены базовые утилиты сборки:
|
|
38
|
+
>
|
|
39
|
+
> ```bash
|
|
40
|
+
> sudo apt update && sudo apt install -y build-essential python3
|
|
41
|
+
> ```
|
|
42
|
+
|
|
43
|
+
### 2. Подключение в Express
|
|
44
|
+
|
|
45
|
+
#### Для интеграции CMS в ваш Express-сервер импортируйте функцию инициализации и передайте туда ваш инстанс `app`:
|
|
46
|
+
|
|
47
|
+
```javascript
|
|
48
|
+
const express = require("express");
|
|
49
|
+
require("dotenv").config();
|
|
50
|
+
|
|
51
|
+
const app = express();
|
|
52
|
+
|
|
53
|
+
// Импортируем инициализатор нашего npm-модуля
|
|
54
|
+
const MI = require("med-cms");
|
|
55
|
+
|
|
56
|
+
// здесь ваши роуты ...
|
|
57
|
+
app.get("/", async (req, res) => {
|
|
58
|
+
res.end("HELLO!");
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
(async function startServer() {
|
|
62
|
+
// Запускаем медицинский движок med-cms
|
|
63
|
+
// требуется асинхронность из-за запросов в к бд
|
|
64
|
+
await MI(app);
|
|
65
|
+
|
|
66
|
+
app.listen(3000, () => {
|
|
67
|
+
console.log(`Сервер успешно запущен!`);
|
|
68
|
+
});
|
|
69
|
+
})();
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
---
|
|
73
|
+
|
|
74
|
+
## Миграция расширенного справочника болезней (РБ)
|
|
75
|
+
|
|
76
|
+
### Справочник заболеваний полностью изолирован от кода ядра CMS. Для наполнения пустой таблицы `Diseases` актуальными и социально значимыми кодами МКБ-10 для Республики Беларусь, запустите команду миграции перед стартом основного сервера:
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
node node_modules/med-cms/migrate-diseases.js
|
|
80
|
+
# или
|
|
81
|
+
node node_modules\med-cms\migrate-diseases.js
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
### Это наполнит отдельную таблицу базы данных 18 распространенными диагнозами (ОРВИ, Острый бронхит, Внебольничная пневмония, Артериальная гипертензия, Остеохондроз, Эндемический зоб и др.), которые автоматически начнут подтягиваться в HTML-тег `<select>` на рабочем месте врача.
|
|
85
|
+
|
|
86
|
+
---
|
|
87
|
+
|
|
88
|
+
## Роли и Маршрутизация (API & Web)
|
|
89
|
+
|
|
90
|
+
### Архитектура роутера жестко разделяет отдачу интерфейсов и данных, исключая ошибки парсинга `JSON.parse` в браузере:
|
|
91
|
+
|
|
92
|
+
- **Интерфейс (Web-страницы):** `http://localhost:3000/med/...`
|
|
93
|
+
- **Данные (JSON API):** `http://localhost:3000/med/api/...`
|
|
94
|
+
|
|
95
|
+
### Матрица маршрутов
|
|
96
|
+
|
|
97
|
+
| Действие | Метод | Маршрут (URL) | Доступ (Роль) |
|
|
98
|
+
| :--------------------------- | :---- | :---------------------------------------- | :------------ |
|
|
99
|
+
| Страница авторизации и входа | `GET` | `/med/html/login.html` (или `/med/login`) | Публичный |
|
|
100
|
+
| Главная страница | `GET` | `/med/html/home.html` (или `/med/home`) | Публичный |
|
|
101
|
+
|
|
102
|
+
---
|
|
103
|
+
|
|
104
|
+
### Алгоритм проведения инициялизации:
|
|
105
|
+
|
|
106
|
+
1. Выполните миграцию справочника болезней: `node node_modules/med-cms/migrate-diseases.js` или `node node_modules\med-cms\migrate-diseases.js`.
|
|
107
|
+
2. Откройте браузер на `http://localhost:3000/med/home` и нажмите на кнопку **`вход`**.
|
|
108
|
+
3. Авторизируйтесь (заполните поля почты и пароля) (данные можно узнать в настройках `.env`)
|
|
109
|
+
4. В левой форме добавьте поликлинику. Она запишется в SQLite под числовым `ID: 1`.
|
|
110
|
+
5. Кликните на карточку «Всего клиник», чтобы развернуть интерактивную таблицу и проверить числовой ID.
|
|
111
|
+
6. В правой форме зарегистрируйте аккаунт врача, выбрав созданную поликлинику №1 из выпадающего списка.
|
|
112
|
+
7. Выйдите из админки, нажмите «Зарегистрироваться как пациент» и создайте профиль.
|
|
113
|
+
8. В кабинете пациента выберите созданного врача, дату, время и нажмите **«Забронировать талон»**. Талон мгновенно отобразится в блоке предстоящих приемов.
|
|
114
|
+
9. Авторизуйтесь под созданным врачом. Пациент появится в вашей очереди. Нажмите «Принять», заполните жалобы, выберите из подгрузившегося справочника диагноз _«Острый бронхит»_ и закройте прием. Системные счетчики зафиксируют визит, а статистика болезни обновится в SQLite.
|
|
115
|
+
10. Также можете с аккаунта админа настроить участки и новости!
|
|
116
|
+
|
|
117
|
+
---
|
|
118
|
+
|
|
119
|
+
## Лицензия
|
|
120
|
+
|
|
121
|
+
### Проект распространяется на условиях открытой лицензии [**ISC**](LICENSE.txt). Разработано [RPM-programmer](https://github.com/RPM-programmer/) для создания масштабируемых и отказоустойчивых медицинских информационных систем.
|
package/env_init.js
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
const fs = require("fs");
|
|
2
|
+
const path = require("path");
|
|
3
|
+
const process = require("process");
|
|
4
|
+
const envPath = path.resolve(process.cwd(), ".env");
|
|
5
|
+
const logger = require("custom-color-logs").print;
|
|
6
|
+
const defaultEnvContent = `
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
# ==============================================================================
|
|
10
|
+
# MED-CMS (v1.0.0)
|
|
11
|
+
# ==============================================================================
|
|
12
|
+
|
|
13
|
+
# Специяльный тег инициализации (значение не меняйте)
|
|
14
|
+
MED_CMS_INITIALIZED = true
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
# Код который будет хешироваться в куки
|
|
18
|
+
JWT_SECRET = 0000
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
# Данные админа
|
|
22
|
+
# Почта админестратора
|
|
23
|
+
ADMIN_GMAIL = x@gmail.com
|
|
24
|
+
|
|
25
|
+
# Телефон админестратора
|
|
26
|
+
ADMIN_PHONE = +375 00 00000000
|
|
27
|
+
|
|
28
|
+
# Пароль аккаунта админестратора
|
|
29
|
+
ADMIN_PASSWORD = 1234
|
|
30
|
+
`;
|
|
31
|
+
|
|
32
|
+
function initializeEnvironment() {
|
|
33
|
+
try {
|
|
34
|
+
if (!fs.existsSync(envPath)) {
|
|
35
|
+
fs.writeFileSync(envPath, defaultEnvContent, "utf8");
|
|
36
|
+
} else {
|
|
37
|
+
const currentEnv = fs.readFileSync(envPath, "utf8");
|
|
38
|
+
if (currentEnv.includes("MED_CMS_INITIALIZED")) {
|
|
39
|
+
require("dotenv").config({ path: envPath });
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
fs.appendFileSync(envPath, `\n\n${defaultEnvContent}`, "utf8");
|
|
43
|
+
}
|
|
44
|
+
} catch (err) {
|
|
45
|
+
console.log(
|
|
46
|
+
logger.ServerMedError(
|
|
47
|
+
"Не удалось проверить или обновить .env:",
|
|
48
|
+
err.message,
|
|
49
|
+
),
|
|
50
|
+
);
|
|
51
|
+
}
|
|
52
|
+
require("dotenv").config({ path: envPath });
|
|
53
|
+
}
|
|
54
|
+
initializeEnvironment();
|
|
55
|
+
module.exports = { envPath };
|
package/index.d.ts
CHANGED
|
@@ -1,25 +1,39 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
export interface MedCmsConfig {
|
|
4
|
-
jwtSecret: string;
|
|
5
|
-
dbPath?: string;
|
|
6
|
-
}
|
|
7
|
-
|
|
1
|
+
import { Express } from "express";
|
|
8
2
|
export type DoctorSpecialty =
|
|
9
|
-
|
|
10
|
-
|
|
|
11
|
-
|
|
|
12
|
-
|
|
|
13
|
-
|
|
|
14
|
-
|
|
|
15
|
-
|
|
|
16
|
-
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
3
|
+
| "Терапевт"
|
|
4
|
+
| "Педиатр"
|
|
5
|
+
| "Врач общей практики"
|
|
6
|
+
| "Кардиолог"
|
|
7
|
+
| "Невролог"
|
|
8
|
+
| "Эндокринолог"
|
|
9
|
+
| "Гастроэнтеролог"
|
|
10
|
+
| "Пульмонолог"
|
|
11
|
+
| "Нефролог"
|
|
12
|
+
| "Ревматолог"
|
|
13
|
+
| "Гематолог"
|
|
14
|
+
| "Хирург"
|
|
15
|
+
| "Травматолог-ортопед"
|
|
16
|
+
| "Сосудистый хирург"
|
|
17
|
+
| "Нейрохирург"
|
|
18
|
+
| "Кардиохирург"
|
|
19
|
+
| "Пластический хирург"
|
|
20
|
+
| "Офтальмолог"
|
|
21
|
+
| "Отоларинголог"
|
|
22
|
+
| "Дерматолог"
|
|
23
|
+
| "Стоматолог"
|
|
24
|
+
| "Гинеколог"
|
|
25
|
+
| "Уролог"
|
|
26
|
+
| "Онколог"
|
|
27
|
+
| "Инфекционист"
|
|
28
|
+
| "Аллерголог-иммунолог"
|
|
29
|
+
| "Психиатр"
|
|
30
|
+
| "Психотерапевт"
|
|
31
|
+
| "Нарколог"
|
|
32
|
+
| "Анестезиолог-реаниматолог"
|
|
33
|
+
| "Рентгенолог"
|
|
34
|
+
| "Врач УЗД"
|
|
35
|
+
| "Эндоскопист"
|
|
36
|
+
| "Патологоанатом";
|
|
37
|
+
export type UserRole = "patient" | "doctor" | "admin";
|
|
38
|
+
declare function init(app: Express): void;
|
|
39
|
+
export default init;
|
package/index.js
CHANGED
|
@@ -5,7 +5,7 @@ const chalk = require("chalk-palette");
|
|
|
5
5
|
const logger = require("custom-color-logs").print;
|
|
6
6
|
const path = require("path");
|
|
7
7
|
const fs = require("fs");
|
|
8
|
-
|
|
8
|
+
require(path.join(__dirname, "env_init.js"));
|
|
9
9
|
// Оставляем только импорт самого модуля базы данных
|
|
10
10
|
const dbConfig = require(
|
|
11
11
|
path.join(__dirname, "database", "config", "db-init.js"),
|
|
@@ -57,20 +57,20 @@ async function init(app) {
|
|
|
57
57
|
if (!adminExists) {
|
|
58
58
|
console.log(
|
|
59
59
|
logger.ServerMedInfo(
|
|
60
|
-
"Администратор не найден.
|
|
60
|
+
"Администратор не найден. Создание аккаунта по умолчанию...",
|
|
61
61
|
),
|
|
62
62
|
);
|
|
63
|
-
const adminPassword =
|
|
63
|
+
const adminPassword = process.env.ADMIN_PASSWORD;
|
|
64
64
|
const hashedPassword = await bcrypt.hash(adminPassword, 10);
|
|
65
65
|
await User.create({
|
|
66
|
-
email:
|
|
66
|
+
email: process.env.ADMIN_GMAIL,
|
|
67
67
|
password: hashedPassword,
|
|
68
68
|
fullName: "Главный Администратор",
|
|
69
69
|
role: "admin",
|
|
70
70
|
specialty: null,
|
|
71
71
|
});
|
|
72
72
|
console.log(
|
|
73
|
-
logger.ServerMedInfo(`Аккаунт суперадмина успешно создан in SQLite
|
|
73
|
+
logger.ServerMedInfo(`Аккаунт суперадмина успешно создан in SQLite.`),
|
|
74
74
|
);
|
|
75
75
|
} else {
|
|
76
76
|
console.log(
|
package/package.json
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "med-cms",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"description": "Медицинская мультитендантная CMS на Express и Sequelize (SQLite3) с системой ролей и автоматическим расчетом участков",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"types": "index.d.ts",
|
|
7
7
|
"scripts": {
|
|
8
|
-
"test": "
|
|
8
|
+
"test": "node test.js"
|
|
9
9
|
},
|
|
10
10
|
"keywords": [
|
|
11
11
|
"medical",
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"cookies"
|
|
18
18
|
],
|
|
19
19
|
"author": "prm-programmmer",
|
|
20
|
-
"license": "
|
|
20
|
+
"license": "ICS",
|
|
21
21
|
"dependencies": {
|
|
22
22
|
"bcrypt": "^6.0.0",
|
|
23
23
|
"chalk-palette": "^3.0.0",
|
|
Binary file
|
package/server/server.js
CHANGED
|
@@ -575,6 +575,33 @@ function createMedRouter(jwtSecret) {
|
|
|
575
575
|
phone: process.env.ADMIN_PHONE,
|
|
576
576
|
});
|
|
577
577
|
});
|
|
578
|
+
web.get("/home", async (req, res) => {
|
|
579
|
+
res.redirect("/med/html/home.html");
|
|
580
|
+
});
|
|
581
|
+
web.get("/general", async (req, res) => {
|
|
582
|
+
res.redirect("/med/html/home.html");
|
|
583
|
+
});
|
|
584
|
+
web.get("/h", async (req, res) => {
|
|
585
|
+
res.redirect("/med/html/home.html");
|
|
586
|
+
});
|
|
587
|
+
web.get("/главная", async (req, res) => {
|
|
588
|
+
res.redirect("/med/html/home.html");
|
|
589
|
+
});
|
|
590
|
+
web.get("/Главная", async (req, res) => {
|
|
591
|
+
res.redirect("/med/html/home.html");
|
|
592
|
+
});
|
|
593
|
+
web.get("/Home", async (req, res) => {
|
|
594
|
+
res.redirect("/med/html/home.html");
|
|
595
|
+
});
|
|
596
|
+
web.get("/login", async (req, res) => {
|
|
597
|
+
res.redirect("/med/html/login.html");
|
|
598
|
+
});
|
|
599
|
+
web.get("/вход", async (req, res) => {
|
|
600
|
+
res.redirect("/med/html/login.html");
|
|
601
|
+
});
|
|
602
|
+
web.get("/med-login", async (req, res) => {
|
|
603
|
+
res.redirect("/med/html/login.html");
|
|
604
|
+
});
|
|
578
605
|
|
|
579
606
|
return { web: web, api: api };
|
|
580
607
|
}
|
package/README
DELETED
|
@@ -1,161 +0,0 @@
|
|
|
1
|
-
# MED-CMS (v1.0.0-beta.1) 🚀
|
|
2
|
-
|
|
3
|
-
`med-cms` — это автономный, монолитный медицинский движок (МИС/SaaS) «всё в одном» на базе **Express**, **Sequelize** и **SQLite3**, разработанный для управления сетями клиник, медицинским персоналом, расписанием приемов и электронными картами пациентов.
|
|
4
|
-
|
|
5
|
-
Модуль поставляется со встроенной базой данных, системой разграничения прав доступа на основе **34 медицинских специальностей** и готовым веб-интерфейсом (АРМ Врача, Личный Кабинет Пациента, Панель Суперадминистратора).
|
|
6
|
-
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
## 🌟 Ключевые возможности
|
|
10
|
-
|
|
11
|
-
* **📦 Автономность «из коробки»:** База данных SQLite3 не требует установки тяжелых серверов (PostgreSQL/MySQL/MongoDB). Файл БД и таблицы создаются автоматически прямо в папке проекта.
|
|
12
|
-
* **🔐 Безопасность и Сессии:** Авторизация реализована через зашифрованные JWT-токены, хранящиеся в защищенных **HttpOnly Cookie** (жесткая защита от XSS и CSRF атак). JS на клиенте не имеет доступа к токену.
|
|
13
|
-
* **🩺 Матрица прав доступа (34 специальности):** Гибкое разграничение возможностей врачей (Терапевт, Хирург, Кардиохирург, Патологоанатом и др.) через кастомные Middleware. Стоматолог или Эндокринолог не смогут получить доступ к эндпоинтам назначения нейрохирургических операций.
|
|
14
|
-
* **📍 Автоматический расчет участков:** При регистрации или изменении адреса проживания пациента система сама вычисляет номер его терапевтического участка и закрепленный кабинет врача.
|
|
15
|
-
* **📊 Статистика болезней и МКБ-10:** Выделенный независимый справочник заболеваний в базе данных с возможностью автономной миграции и автоматическим инкрементом счетчиков заболеваемости при закрытии приемов врачами.
|
|
16
|
-
|
|
17
|
-
---
|
|
18
|
-
|
|
19
|
-
## 📂 Структура проекта
|
|
20
|
-
|
|
21
|
-
Архитектура построена по принципу **Clean Architecture (Чистая архитектура)** с полной изоляцией слоев бэкенда и раздачей статики:
|
|
22
|
-
|
|
23
|
-
```text
|
|
24
|
-
med-cms/
|
|
25
|
-
├── package.json # Зависимости движка (express, sequelize, sqlite3, bcryptjs)
|
|
26
|
-
├── index.js # Главная точка входа (Инициализация и контроль гонки процессов)
|
|
27
|
-
├── index.d.ts # TypeScript декларации для автокомплита 34 специальностей
|
|
28
|
-
├── test.js # Скрипт локального запуска тестового сервера
|
|
29
|
-
├── migrate-diseases.js # Скрипт независимой миграции справочника МКБ-10 в SQLite
|
|
30
|
-
│
|
|
31
|
-
├── database/
|
|
32
|
-
│ ├── config/
|
|
33
|
-
│ │ └── db-init.js # Инициализация и синхронизация таблиц/связей Sequelize
|
|
34
|
-
│ ├── models/
|
|
35
|
-
│ │ ├── users.js # Таблица пользователей (Числовые автоинкрементные ID)
|
|
36
|
-
│ │ ├── clinics.js # Таблица медицинских учреждений (Больницы, Поликлиники)
|
|
37
|
-
│ │ ├── user-addresses.js # Адреса пациентов с авторасчетом участков и кабинетов
|
|
38
|
-
│ │ ├── diseases.js # Изолированная таблица болезней и статистики
|
|
39
|
-
│ │ └── appointments.js # Журнал приемов (осмотры, жалобы, статусы)
|
|
40
|
-
│ └── services/ # Атомарная бизнес-логика (Разделена по ролям)
|
|
41
|
-
│ ├── admin/ # (create-clinic.js, manage-staff.js, db-analytics.js)
|
|
42
|
-
│ ├── doctor/ # (get-schedule.js, patient-access.js, conduct-exam.js)
|
|
43
|
-
│ └── patient/ # (get-profile.js, calc-district.js, book-appointment.js)
|
|
44
|
-
│
|
|
45
|
-
├── server/
|
|
46
|
-
│ ├── server.js # Раздельные маршрутизаторы Express (web-страницы и api)
|
|
47
|
-
│ ├── midleware.js # Валидация HttpOnly кук сессий и проверка матрицы разрешений
|
|
48
|
-
│ └── permissions.js # Карта соответствия медицинских специальностей и прав
|
|
49
|
-
│
|
|
50
|
-
└── public/ # Статические файлы фронтенда (HTML, CSS, JS)
|
|
51
|
-
├── css/ # (auth.css, admin.css, doctor.css)
|
|
52
|
-
├── js/ # (auth.js, admin.js, doctor.js, patient.js)
|
|
53
|
-
└── html/ # (login.html, dashboard-admin.html, dashboard-doctor.html, ...)
|
|
54
|
-
```
|
|
55
|
-
|
|
56
|
-
---
|
|
57
|
-
|
|
58
|
-
## 🛠️ Установка и быстрая настройка
|
|
59
|
-
|
|
60
|
-
### 1. Установка модуля
|
|
61
|
-
Установите пакет в ваше Node.js приложение:
|
|
62
|
-
```bash
|
|
63
|
-
npm install med-cms@1.0.0-beta.1
|
|
64
|
-
```
|
|
65
|
-
|
|
66
|
-
> **Важно для пользователей Linux:** Пакетам `sequelize` и `sqlite3` требуются компиляторы C++ для сборки бинарных файлов под вашу архитектуру ядра. Перед развертыванием убедитесь, что в системе установлены базовые утилиты сборки:
|
|
67
|
-
> ```bash
|
|
68
|
-
> sudo apt update && sudo apt install -y build-essential python3
|
|
69
|
-
> ```
|
|
70
|
-
|
|
71
|
-
### 2. Подключение в Express
|
|
72
|
-
Для интеграции CMS в ваш Express-сервер импортируйте функцию инициализации и передайте туда ваш инстанс `app`:
|
|
73
|
-
|
|
74
|
-
```javascript
|
|
75
|
-
const express = require('express');
|
|
76
|
-
require("dotenv").config();
|
|
77
|
-
|
|
78
|
-
const app = express();
|
|
79
|
-
const PORT = process.env.PORT || 3000;
|
|
80
|
-
|
|
81
|
-
// Импортируем инициализатор нашего npm-модуля
|
|
82
|
-
const initMedCms = require('med-cms');
|
|
83
|
-
|
|
84
|
-
async function startServer() {
|
|
85
|
-
// Запускаем медицинский движок med-cms (он сам настроит БД, роуты и статику)
|
|
86
|
-
await initMedCms(app);
|
|
87
|
-
|
|
88
|
-
app.listen(PORT, () => {
|
|
89
|
-
console.log(`🚀 Основной сервер успешно запущен на http://localhost:${PORT}`);
|
|
90
|
-
});
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
startServer();
|
|
94
|
-
```
|
|
95
|
-
|
|
96
|
-
---
|
|
97
|
-
|
|
98
|
-
## 📊 Миграция расширенного справочника болезней (РБ)
|
|
99
|
-
|
|
100
|
-
Справочник заболеваний полностью изолирован от кода ядра CMS. Для наполнения пустой таблицы `Diseases` актуальными и социально значимыми кодами МКБ-10 для Республики Беларусь, запустите команду миграции перед стартом основного сервера:
|
|
101
|
-
|
|
102
|
-
```bash
|
|
103
|
-
node node_modules/med-cms/migrate-diseases.js
|
|
104
|
-
# или
|
|
105
|
-
node node_modules\med-cms\migrate-diseases.js
|
|
106
|
-
```
|
|
107
|
-
Это наполнит отдельную таблицу базы данных 18 распространенными диагнозами (ОРВИ, Острый бронхит, Внебольничная пневмония, Артериальная гипертензия, Остеохондроз, Эндемический зоб и др.), которые автоматически начнут подтягиваться в HTML-тег `<select>` на рабочем месте врача.
|
|
108
|
-
|
|
109
|
-
---
|
|
110
|
-
|
|
111
|
-
## 👥 Роли и Маршрутизация (API & Web)
|
|
112
|
-
|
|
113
|
-
Архитектура роутера жестко разделяет отдачу интерфейсов и данных, исключая ошибки парсинга `JSON.parse` в браузере:
|
|
114
|
-
|
|
115
|
-
* **Интерфейс (Web-страницы):** `http://localhost:3000/med/...`
|
|
116
|
-
* **Данные (JSON API):** `http://localhost:3000/med/api/...`
|
|
117
|
-
|
|
118
|
-
### Матрица маршрутов
|
|
119
|
-
|
|
120
|
-
| Действие | Метод | Маршрут (URL) | Доступ (Роль) |
|
|
121
|
-
| :--- | :--- | :--- | :--- |
|
|
122
|
-
| Страница авторизации и входа | `GET` | `/med/med-login` | Публичный |
|
|
123
|
-
| API Аутентификации (Вход) | `POST` | `/med/api/auth/login` | Публичный |
|
|
124
|
-
| API Завершения сессии (Выход) | `POST` | `/med/api/auth/logout` | Публичный |
|
|
125
|
-
| Личный кабинет Пациента | `GET` | `/med/med-patient` | `patient` |
|
|
126
|
-
| Выгрузка полной медицинской карты | `GET` | `/med/api/patient/me` | `patient` |
|
|
127
|
-
| Бронирование талона к врачу | `POST` | `/med/api/patient/book` | `patient` |
|
|
128
|
-
| АРМ (Рабочее место) Врача | `GET` | `/med/med-doctor` | `doctor` |
|
|
129
|
-
| Загрузка справочника МКБ-10 | `GET` | `/med/api/doctor/diseases-list` | `doctor`, `admin` |
|
|
130
|
-
| Закрытие приема и фиксация осмотра | `POST` | `/med/api/doctor/complete-examination` | `doctor` |
|
|
131
|
-
| Панель Суперадминистратора | `GET` | `/med/med-admin` | `admin` |
|
|
132
|
-
| Создание новой больницы/поликлиники | `POST` | `/med/api/admin/clinics` | `admin` |
|
|
133
|
-
| Регистрация врача (выдача аккаунта) | `POST` | `/med/api/admin/staff` | `admin` |
|
|
134
|
-
| Мониторинг таблиц и аналитика БД | `GET` | `/med/api/admin/stats` | `admin` |
|
|
135
|
-
|
|
136
|
-
---
|
|
137
|
-
|
|
138
|
-
## 🛡️ Инструкция к проведению Гипертеста (Тестирование)
|
|
139
|
-
|
|
140
|
-
В модуле подготовлен файл `test.js` для развертывания локальной среды. При самом первом запуске и создании чистой базы данных `db/med-cms.sqlite` скрипт автоматически генерирует мастер-аккаунт **Суперадминистратора** системы:
|
|
141
|
-
|
|
142
|
-
* **Логин (Email):** `admin@medcms.ru`
|
|
143
|
-
* **Пароль:** `SuperAdminPassword2026`
|
|
144
|
-
* **Физический ID в базе:** `1`
|
|
145
|
-
|
|
146
|
-
### Алгоритм проведения сквозного теста:
|
|
147
|
-
1. Выполните миграцию справочника МКБ-10: `node migrate-diseases.js`.
|
|
148
|
-
2. Запустите тестовую среду: `node test.js`.
|
|
149
|
-
3. Откройте браузер на `http://localhost:3000/med/med-login` и войдите под аккаунтом админа.
|
|
150
|
-
4. В левой форме добавьте поликлинику. Она запишется в SQLite под числовым `ID: 1`.
|
|
151
|
-
5. Кликните на карточку «Всего клиник», чтобы развернуть интерактивную таблицу и проверить числовой ID.
|
|
152
|
-
6. В правой форме зарегистрируйте аккаунт врача, выбрав созданную поликлинику №1 из выпадающего списка.
|
|
153
|
-
7. Выйдите из админки, нажмите «Зарегистрироваться как пациент» и создайте профиль.
|
|
154
|
-
8. В кабинете пациента выберите созданного врача, дату, время и нажмите **«Забронировать талон»**. Талон мгновенно отобразится в блоке предстоящих приемов.
|
|
155
|
-
9. Авторизуйтесь под созданным врачом. Пациент появится в вашей очереди. Нажмите «Принять», заполните жалобы, выберите из подгрузившегося справочника диагноз *«Острый бронхит»* и закройте прием. Системные счетчики зафиксируют визит, а статистика болезни обновится в SQLite!
|
|
156
|
-
|
|
157
|
-
---
|
|
158
|
-
|
|
159
|
-
## 📄 Лицензия
|
|
160
|
-
|
|
161
|
-
Проект распространяется на условиях открытой лицензии **MIT**. Разработано для создания масштабируемых и отказоустойчивых медицинских информационных систем. 🇧🇾
|
package/test.js
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
const express = require("express");
|
|
2
|
-
const path = require("path");
|
|
3
|
-
const initMedCms = require("./index.js"); // Импортируем наш модуль через главную точку входа
|
|
4
|
-
const chalk = require("chalk-palette");
|
|
5
|
-
const app = express();
|
|
6
|
-
const PORT = process.env.PORT || 3000;
|
|
7
|
-
|
|
8
|
-
(async () => {
|
|
9
|
-
await initMedCms(app);
|
|
10
|
-
app.use((req, res) => {
|
|
11
|
-
res
|
|
12
|
-
.status(404)
|
|
13
|
-
.send("<h1>404 | Медицинский модуль: Страница не найдена</h1>");
|
|
14
|
-
});
|
|
15
|
-
app.listen(PORT, () => {});
|
|
16
|
-
})();
|