med-cms 1.0.0-beta.2 → 1.0.0-beta.5
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/database/config/db-init.js +67 -53
- package/database/models/appointments.js +35 -20
- package/database/models/clinics.js +25 -13
- package/database/models/diseases.js +21 -13
- package/database/models/districts.js +55 -0
- package/database/models/news.js +25 -0
- package/database/models/user-addresses.js +21 -14
- package/database/models/users.js +69 -26
- package/database/services/admin/create-clinic.js +18 -6
- package/database/services/admin/db-analytics.js +42 -16
- package/database/services/admin/index.js +6 -6
- package/database/services/admin/manage-staff.js +47 -17
- package/database/services/doctor/conduct-exam.js +26 -20
- package/database/services/doctor/get-schedule.js +26 -18
- package/database/services/doctor/index.js +6 -6
- package/database/services/doctor/patient-access.js +34 -25
- package/database/services/patient/book-appointment.js +37 -17
- package/database/services/patient/calc-district.js +70 -21
- package/database/services/patient/get-profile.js +49 -21
- package/database/services/patient/index.js +5 -5
- package/index.js +45 -22
- package/migrate-diseases.js +192 -120
- package/package.json +1 -1
- package/public/css/admin.css +80 -80
- package/public/css/auth.css +52 -44
- package/public/css/doctor.css +131 -125
- package/public/css/home.css +155 -0
- package/public/html/dashboard-admin.html +423 -101
- package/public/html/dashboard-doctor.html +155 -66
- package/public/html/dashboard-patient.html +199 -94
- package/public/html/home/about.html +0 -0
- package/public/html/home/contact.html +0 -0
- package/public/html/home/info.html +0 -0
- package/public/html/home.html +159 -0
- package/public/html/login.html +73 -43
- package/public/js/admin.js +329 -165
- package/public/js/auth.js +45 -41
- package/public/js/doctor.js +117 -103
- package/public/js/home.js +113 -0
- package/public/js/patient.js +130 -108
- package/server/midleware.js +33 -13
- package/server/permissions.js +105 -43
- package/server/server.js +493 -176
- package/test.js +12 -23
package/index.js
CHANGED
|
@@ -1,22 +1,28 @@
|
|
|
1
|
-
require("dotenv").config({debug:false});
|
|
2
|
-
const express = require(
|
|
3
|
-
const cookieParser = require(
|
|
1
|
+
require("dotenv").config({ debug: false });
|
|
2
|
+
const express = require("express");
|
|
3
|
+
const cookieParser = require("cookie-parser");
|
|
4
4
|
const chalk = require("chalk-palette");
|
|
5
5
|
const logger = require("custom-color-logs").print;
|
|
6
|
-
const path = require(
|
|
7
|
-
const fs = require(
|
|
6
|
+
const path = require("path");
|
|
7
|
+
const fs = require("fs");
|
|
8
8
|
|
|
9
9
|
// Оставляем только импорт самого модуля базы данных
|
|
10
|
-
const dbConfig = require(
|
|
11
|
-
|
|
12
|
-
|
|
10
|
+
const dbConfig = require(
|
|
11
|
+
path.join(__dirname, "database", "config", "db-init.js"),
|
|
12
|
+
);
|
|
13
|
+
const server = require("./server/server");
|
|
14
|
+
const bcrypt = require("bcrypt");
|
|
13
15
|
|
|
14
16
|
async function init(app) {
|
|
15
17
|
await chalk.animation.textShimmer("MED-CMS");
|
|
16
18
|
console.log(logger.ServerMedInfo("Запуск сервера..."));
|
|
17
|
-
await chalk.animation.retroLines({
|
|
19
|
+
await chalk.animation.retroLines({
|
|
20
|
+
duration: 4000,
|
|
21
|
+
linesCount: 4,
|
|
22
|
+
offset: 3,
|
|
23
|
+
});
|
|
18
24
|
|
|
19
|
-
if (app && typeof app ===
|
|
25
|
+
if (app && typeof app === "function" && typeof app.handle === "function") {
|
|
20
26
|
console.log(logger.ServerMedInfo("Проверка на app пройдена успешно!"));
|
|
21
27
|
} else {
|
|
22
28
|
console.log(logger.ServerMedError("app не передан или повреждён!"));
|
|
@@ -26,40 +32,57 @@ async function init(app) {
|
|
|
26
32
|
try {
|
|
27
33
|
const dbPath = path.join(__dirname, "db", "med-cms.sqlite");
|
|
28
34
|
const dbDir = path.dirname(dbPath);
|
|
29
|
-
if (!fs.existsSync(dbDir)){
|
|
30
|
-
|
|
35
|
+
if (!fs.existsSync(dbDir)) {
|
|
36
|
+
fs.mkdirSync(dbDir, { extended: true });
|
|
31
37
|
}
|
|
32
|
-
|
|
38
|
+
|
|
33
39
|
// Инициализируем БД
|
|
34
40
|
await dbConfig.initDatabase(dbPath);
|
|
35
41
|
console.log(logger.ServerMedInfo("База данных успешно инициализирована"));
|
|
36
42
|
} catch (err) {
|
|
37
|
-
console.log(
|
|
43
|
+
console.log(
|
|
44
|
+
logger.DatabaseError(
|
|
45
|
+
"Критическая ошибка запуска базы данных med-cms:",
|
|
46
|
+
err,
|
|
47
|
+
),
|
|
48
|
+
);
|
|
38
49
|
return;
|
|
39
50
|
}
|
|
40
51
|
|
|
41
52
|
try {
|
|
42
53
|
// ИСПРАВЛЕНИЕ: Достаем User из проинициализированного объекта базы данных ОНЛАЙН
|
|
43
|
-
const User = dbConfig.User;
|
|
54
|
+
const User = dbConfig.User;
|
|
44
55
|
|
|
45
|
-
const adminExists = await User.findOne({ where: { role:
|
|
56
|
+
const adminExists = await User.findOne({ where: { role: "admin" } });
|
|
46
57
|
if (!adminExists) {
|
|
47
|
-
console.log(
|
|
58
|
+
console.log(
|
|
59
|
+
logger.ServerMedInfo(
|
|
60
|
+
"Администратор не найден. Создаю аккаунт по умолчанию...",
|
|
61
|
+
),
|
|
62
|
+
);
|
|
48
63
|
const adminPassword = "SuperAdminPassword2026";
|
|
49
64
|
const hashedPassword = await bcrypt.hash(adminPassword, 10);
|
|
50
65
|
await User.create({
|
|
51
66
|
email: "admin@medcms.ru",
|
|
52
67
|
password: hashedPassword,
|
|
53
68
|
fullName: "Главный Администратор",
|
|
54
|
-
role: "admin",
|
|
55
|
-
specialty: null
|
|
69
|
+
role: "admin",
|
|
70
|
+
specialty: null,
|
|
56
71
|
});
|
|
57
|
-
console.log(
|
|
72
|
+
console.log(
|
|
73
|
+
logger.ServerMedInfo(`Аккаунт суперадмина успешно создан in SQLite!`),
|
|
74
|
+
);
|
|
58
75
|
} else {
|
|
59
|
-
console.log(
|
|
76
|
+
console.log(
|
|
77
|
+
logger.ServerMedInfo("Администратор уже существует в базе данных."),
|
|
78
|
+
);
|
|
60
79
|
}
|
|
61
80
|
} catch (error) {
|
|
62
|
-
console.log(
|
|
81
|
+
console.log(
|
|
82
|
+
logger.ServerMedError(
|
|
83
|
+
"Ошибка при автоматическом создании админа: " + error.message,
|
|
84
|
+
),
|
|
85
|
+
);
|
|
63
86
|
}
|
|
64
87
|
|
|
65
88
|
console.log(logger.ServerMedInfo("Подключение роутов..."));
|
package/migrate-diseases.js
CHANGED
|
@@ -1,134 +1,206 @@
|
|
|
1
|
-
const
|
|
2
|
-
const
|
|
3
|
-
const
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
const path = require("path");
|
|
2
|
+
const fs = require("fs"); // ИСПРАВЛЕНИЕ: Добавлен обязательный импорт fs
|
|
3
|
+
const logger = require("custom-color-logs").print;
|
|
4
|
+
|
|
5
|
+
// Импортируем синглтон конфигурации базы данных
|
|
6
|
+
const dbConfig = require(
|
|
7
|
+
path.join(__dirname, "database", "config", "db-init.js"),
|
|
8
|
+
);
|
|
9
|
+
|
|
10
|
+
// Расширенный список распространенных в РБ диагнозов
|
|
6
11
|
const externalDiseasesList = [
|
|
7
|
-
{
|
|
8
|
-
name:
|
|
9
|
-
code:
|
|
10
|
-
treatmentRecommendations:
|
|
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
|
-
recommendedMedications:
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
recommendedMedications:
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
},
|
|
91
|
-
{
|
|
92
|
-
name:
|
|
93
|
-
code:
|
|
94
|
-
treatmentRecommendations:
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
12
|
+
{
|
|
13
|
+
name: "Острая респираторная вирусная инфекция (ОРВИ) верхних дыхательных путей",
|
|
14
|
+
code: "J06.9",
|
|
15
|
+
treatmentRecommendations:
|
|
16
|
+
"Домашний режим, обильное теплое питье, проветривание помещения, промывание носа изотоническими растворами.",
|
|
17
|
+
recommendedMedications:
|
|
18
|
+
"Ибупрофен (при лихорадке), Ксилометазолин (капли в нос), Витамин C",
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
name: "Острый бронхит",
|
|
22
|
+
code: "J20.9",
|
|
23
|
+
treatmentRecommendations:
|
|
24
|
+
"Постельный режим, ингаляции при отсутствии лихорадки, отказ от курения, теплое щелочное питье.",
|
|
25
|
+
recommendedMedications: "Амброксол, Ацетилцистеин (АЦЦ), Парацетамол",
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
name: "Внебольничная пневмония бактериальная",
|
|
29
|
+
code: "J15.9",
|
|
30
|
+
treatmentRecommendations:
|
|
31
|
+
"Строгий постельный режим, контроль сатурации, повторный осмотр врача через 48 часов, при тяжелом течении — госпитализация.",
|
|
32
|
+
recommendedMedications:
|
|
33
|
+
"Амоксициллин + Клавулановая кислота, Азитромицин, Левофлоксацин",
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
name: "Острый тонзиллит (Ангина стрептококковая)",
|
|
37
|
+
code: "J03.0",
|
|
38
|
+
treatmentRecommendations:
|
|
39
|
+
"Щадящая диета (жидкая и теплая пища), полоскание зева антисептиками, строгий постельный режим во избежание осложнений на сердце и почки.",
|
|
40
|
+
recommendedMedications:
|
|
41
|
+
"Феноксиметилпенициллин, Цефуроксим, Хлоргексидин (спрей)",
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
name: "Артериальная гипертензия (Гипертоническая болезнь II стадии)",
|
|
45
|
+
code: "I11.9",
|
|
46
|
+
treatmentRecommendations:
|
|
47
|
+
"Ограничение поваренной соли до 5 г/сутки, снижение веса, отказ от алкоголя и курения, ежедневный пожизненный прием препаратов под контролем АД.",
|
|
48
|
+
recommendedMedications: "Лизиноприл, Амлодипин, Бисопролол, Индапамид",
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
name: "Стабильная стенокардия напряжения (ИБС), II функциональный класс",
|
|
52
|
+
code: "I20.8",
|
|
53
|
+
treatmentRecommendations:
|
|
54
|
+
"Ограничение интенсивных физических нагрузок, диета с низким содержанием животных жиров, контроль уровня холестерина.",
|
|
55
|
+
recommendedMedications:
|
|
56
|
+
"Ацетилсалициловая кислота (Аспирин-Кардио), Аторвастатин, Нитроглицерин (при приступе)",
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
name: "Хроническая ишемическая болезнь сердца (Атеросклеротический кардиосклероз)",
|
|
60
|
+
code: "I25.1",
|
|
61
|
+
treatmentRecommendations:
|
|
62
|
+
"Умеренная физическая активность (ходьба), контроль веса, терапия сопутствующей гипертензии.",
|
|
63
|
+
recommendedMedications: "Периндоприл, Розувастатин, Клопидогрел",
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
name: "Остеохондроз позвоночника (Радикулопатия, люмбалгия)",
|
|
67
|
+
code: "M42.1",
|
|
68
|
+
treatmentRecommendations:
|
|
69
|
+
"Покой на жестком матрасе в острый период, ограничение наклонов и подъема тяжестей. После стихания болей — ЛФК и плавание.",
|
|
70
|
+
recommendedMedications:
|
|
71
|
+
"Диклофенак (инъекции/гель), Мидокалм (толперизон), Комбилипен",
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
name: "Первичный гонартроз двусторонний (Артроз коленных суставов)",
|
|
75
|
+
code: "M17.0",
|
|
76
|
+
treatmentRecommendations:
|
|
77
|
+
"Снижение нагрузки на суставы (снижение веса), использование трости при ходьбе, лечебная гимнастика для укрепления мышц бедра.",
|
|
78
|
+
recommendedMedications: "Мелоксикам, Хондроитина сульфат, Нимесулид гель",
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
name: "Хронический гастрит, обострение. Ассоциированный с Helicobacter pylori",
|
|
82
|
+
code: "K29.5",
|
|
83
|
+
treatmentRecommendations:
|
|
84
|
+
"Диета №1 по Певзнеру (исключить острое, жареное, копченое, газировку). Дробное питание 5-6 раз в день.",
|
|
85
|
+
recommendedMedications:
|
|
86
|
+
"Омепразол (или Эзомепразол), Кларитромицин, Амоксициллин",
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
name: "Язвенная болезнь двенадцатиперстной кишки, стадия обострения",
|
|
90
|
+
code: "K26.4",
|
|
91
|
+
treatmentRecommendations:
|
|
92
|
+
"Строгий отказ от курения и алкоголя, постельный или щадящий режим, контроль стула (исключить скрытое кровотечение).",
|
|
93
|
+
recommendedMedications:
|
|
94
|
+
"Рабепразол, Де-Нол (висмута трикалия дицитрат), Фамотидин",
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
name: "Хронический панкреатит в стадии неполной ремиссии",
|
|
98
|
+
code: "K86.1",
|
|
99
|
+
treatmentRecommendations:
|
|
100
|
+
"Диета №5п (полное исключение жирной, острой пищи и алкоголя). Дробный прием пищи.",
|
|
101
|
+
recommendedMedications: "Панкреатин (Креон/Мезим), Спазмалгон",
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
name: "Сахарный диабет 2-го типа без осложнений",
|
|
105
|
+
code: "E11.9",
|
|
106
|
+
treatmentRecommendations:
|
|
107
|
+
"Низкоуглеводная диета (Стол №9), строгое исключение сахара, регулярный контроль глюкозы крови натощак и через 2 часа после еды.",
|
|
108
|
+
recommendedMedications: "Метформин, Гликлазид",
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
name: "Эндемический зоб, связанный с йодной недостаточностью (Очень актуально для РБ)",
|
|
112
|
+
code: "E01.0",
|
|
113
|
+
treatmentRecommendations:
|
|
114
|
+
"Использование в пищу исключительно йодированной соли, употребление морепродуктов, контроль уровня ТТГ раз в год.",
|
|
115
|
+
recommendedMedications: "Калия йодид (Йодомарин)",
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
name: "Острый аппендицит (Подозрение, направление на госпитализацию)",
|
|
119
|
+
code: "K35.8",
|
|
120
|
+
treatmentRecommendations:
|
|
121
|
+
"Экстренная госпитализация скорой помощью в хирургический стационар. Категорически запрещено прикладывать грелку к животу и принимать обезболивающие до осмотра хирурга.",
|
|
122
|
+
recommendedMedications:
|
|
123
|
+
"Медикаментозное лечение противопоказано. Показана экстренная операция.",
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
name: "Почечная колика (Мочекаменная болезнь)",
|
|
127
|
+
code: "N20.1",
|
|
128
|
+
treatmentRecommendations:
|
|
129
|
+
"Теплые ванны (при отсутствии макрогематурии и лихорадки), обильное питье при стихании боли для отхождения конкремента.",
|
|
130
|
+
recommendedMedications:
|
|
131
|
+
"Дротаверин (Но-Шпа) внутримышечно, Кеторолак, Тамсулозин",
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
name: "Острый цистит бактериальный",
|
|
135
|
+
code: "N30.0",
|
|
136
|
+
treatmentRecommendations:
|
|
137
|
+
"Обильное питье (до 2.5 литров в сутки, предпочтительно клюквенный морс), сухое тепло на низ живота, исключение половой жизни на время лечения.",
|
|
138
|
+
recommendedMedications:
|
|
139
|
+
"Фосфомицин (Монурал), Канефрон Н, Фуразидин (Фурамаг)",
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
name: "Соматоформная дисфункция вегетативной нервной системы (НЦД / ВСД)",
|
|
143
|
+
code: "F45.3",
|
|
144
|
+
treatmentRecommendations:
|
|
145
|
+
"Нормализация режима сна и бодрствования, контрастный душ, регулярные кардионагрузки (бег, велосипед), психотерапия.",
|
|
146
|
+
recommendedMedications: "Адаптол (Мебикар), Магний B6, пустырника экстракт",
|
|
147
|
+
},
|
|
115
148
|
];
|
|
149
|
+
|
|
116
150
|
async function runMigration() {
|
|
117
151
|
try {
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
152
|
+
const dbPath = path.join(__dirname, "db", "med-cms.sqlite");
|
|
153
|
+
|
|
154
|
+
// Проверяем и создаем папку для базы, если её нет
|
|
155
|
+
const dbDir = path.dirname(dbPath);
|
|
156
|
+
if (!fs.existsSync(dbDir)) {
|
|
157
|
+
fs.mkdirSync(dbDir, { recursive: true });
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
console.log(
|
|
161
|
+
logger.ServerMedInfo(
|
|
162
|
+
"MIGRATION: Подключение к базе данных для импорта справочника...",
|
|
163
|
+
),
|
|
164
|
+
);
|
|
165
|
+
|
|
166
|
+
// Инициализируем фабричную БД
|
|
167
|
+
await dbConfig.initDatabase(dbPath);
|
|
168
|
+
|
|
169
|
+
// ИСПРАВЛЕНИЕ: Достаем проинициализированную модель Disease из синглтона базы данных онлайн
|
|
170
|
+
const Disease = dbConfig.models.Disease || dbConfig.Disease;
|
|
171
|
+
|
|
172
|
+
console.log(
|
|
173
|
+
logger.ServerMedInfo(
|
|
174
|
+
"MIGRATION: Проверка текущего состояния таблицы Diseases...",
|
|
175
|
+
),
|
|
176
|
+
);
|
|
121
177
|
const count = await Disease.count();
|
|
178
|
+
|
|
122
179
|
if (count === 0) {
|
|
180
|
+
// Массово заливаем массив в чистую таблицу
|
|
123
181
|
await Disease.bulkCreate(externalDiseasesList);
|
|
124
|
-
console.log(
|
|
182
|
+
console.log(
|
|
183
|
+
logger.ServerMedInfo(
|
|
184
|
+
`🌱 MIGRATION: УСПЕШНО! В отдельную таблицу Diseases импортировано ${externalDiseasesList.length} диагнозов РБ.`,
|
|
185
|
+
),
|
|
186
|
+
);
|
|
125
187
|
} else {
|
|
126
|
-
console.log(
|
|
188
|
+
console.log(
|
|
189
|
+
logger.ServerMedInfo(
|
|
190
|
+
`ℹ️ MIGRATION: Таблица Diseases уже содержит записи (${count} шт.). Импорт пропущен.`,
|
|
191
|
+
),
|
|
192
|
+
);
|
|
127
193
|
}
|
|
194
|
+
|
|
128
195
|
process.exit(0);
|
|
129
196
|
} catch (error) {
|
|
130
|
-
console.log(
|
|
197
|
+
console.log(
|
|
198
|
+
logger.ServerMedError(
|
|
199
|
+
"MIGRATION: Критическая ошибка миграции справочника: " + error.stack,
|
|
200
|
+
),
|
|
201
|
+
);
|
|
131
202
|
process.exit(1);
|
|
132
203
|
}
|
|
133
204
|
}
|
|
134
|
-
|
|
205
|
+
|
|
206
|
+
runMigration();
|
package/package.json
CHANGED