@mashka818/exam-de-template 1.0.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.
Files changed (131) hide show
  1. package/exam-guides/COMMENTS_GUIDE.md +53 -0
  2. package/exam-guides/EXAM_COMMANDS.txt +47 -0
  3. package/exam-guides/GUIDE_PAGES.md +529 -0
  4. package/exam-guides/NPM_PACKAGE.md +206 -0
  5. package/exam-guides/README.md +40 -0
  6. package/exam-guides/RESPONSIVE.md +224 -0
  7. package/exam-guides/TECH_STACK.txt +142 -0
  8. package/exam-guides/THEME_BANQUETAM_NET.md +106 -0
  9. package/exam-guides/commented-code/README.txt +5 -0
  10. package/exam-guides/commented-code/client/index.html +14 -0
  11. package/exam-guides/commented-code/client/package-lock.json +2298 -0
  12. package/exam-guides/commented-code/client/package.json +21 -0
  13. package/exam-guides/commented-code/client/public/images/README.txt +26 -0
  14. package/exam-guides/commented-code/client/public/images/about-cleaning.svg +4 -0
  15. package/exam-guides/commented-code/client/public/images/admin-banner.svg +1 -0
  16. package/exam-guides/commented-code/client/public/images/empty-requests.svg +1 -0
  17. package/exam-guides/commented-code/client/public/images/footer-photo-1.svg +4 -0
  18. package/exam-guides/commented-code/client/public/images/footer-photo-2.svg +4 -0
  19. package/exam-guides/commented-code/client/public/images/footer-photo-3.svg +4 -0
  20. package/exam-guides/commented-code/client/public/images/home-hero.svg +4 -0
  21. package/exam-guides/commented-code/client/public/images/login-banner.svg +1 -0
  22. package/exam-guides/commented-code/client/public/images/logo.svg +4 -0
  23. package/exam-guides/commented-code/client/public/images/new-request-banner.svg +1 -0
  24. package/exam-guides/commented-code/client/public/images/register-banner.svg +1 -0
  25. package/exam-guides/commented-code/client/public/images/requests-banner.svg +1 -0
  26. package/exam-guides/commented-code/client/public/images/slide-1.svg +6 -0
  27. package/exam-guides/commented-code/client/public/images/slide-2.svg +5 -0
  28. package/exam-guides/commented-code/client/public/images/slide-3.svg +5 -0
  29. package/exam-guides/commented-code/client/src/App.jsx +72 -0
  30. package/exam-guides/commented-code/client/src/api.js +71 -0
  31. package/exam-guides/commented-code/client/src/components/FormField.jsx +25 -0
  32. package/exam-guides/commented-code/client/src/components/Layout.jsx +83 -0
  33. package/exam-guides/commented-code/client/src/components/PageImage.jsx +38 -0
  34. package/exam-guides/commented-code/client/src/components/ProtectedRoute.jsx +35 -0
  35. package/exam-guides/commented-code/client/src/components/UserNav.jsx +33 -0
  36. package/exam-guides/commented-code/client/src/components/landing/HeroSlider.jsx +103 -0
  37. package/exam-guides/commented-code/client/src/components/landing/LandingLayout.jsx +76 -0
  38. package/exam-guides/commented-code/client/src/components/landing/SiteFooter.jsx +74 -0
  39. package/exam-guides/commented-code/client/src/config/images.js +104 -0
  40. package/exam-guides/commented-code/client/src/constants/services.js +19 -0
  41. package/exam-guides/commented-code/client/src/context/AuthContext.jsx +72 -0
  42. package/exam-guides/commented-code/client/src/index.css +73 -0
  43. package/exam-guides/commented-code/client/src/main.jsx +28 -0
  44. package/exam-guides/commented-code/client/src/pages/AdminPage.jsx +151 -0
  45. package/exam-guides/commented-code/client/src/pages/LandingPage.jsx +131 -0
  46. package/exam-guides/commented-code/client/src/pages/LoginPage.jsx +81 -0
  47. package/exam-guides/commented-code/client/src/pages/RegisterPage.jsx +117 -0
  48. package/exam-guides/commented-code/client/src/pages/RequestFormPage.jsx +196 -0
  49. package/exam-guides/commented-code/client/src/pages/RequestsPage.jsx +112 -0
  50. package/exam-guides/commented-code/client/src/utils/validation.js +71 -0
  51. package/exam-guides/commented-code/client/vite.config.js +31 -0
  52. package/exam-guides/commented-code/server/db/init.js +67 -0
  53. package/exam-guides/commented-code/server/db/pool.js +23 -0
  54. package/exam-guides/commented-code/server/db/schema.sql +53 -0
  55. package/exam-guides/commented-code/server/db/seed.sql +15 -0
  56. package/exam-guides/commented-code/server/index.js +45 -0
  57. package/exam-guides/commented-code/server/middleware/auth.js +38 -0
  58. package/exam-guides/commented-code/server/package-lock.json +1084 -0
  59. package/exam-guides/commented-code/server/package.json +17 -0
  60. package/exam-guides/commented-code/server/routes/admin.js +96 -0
  61. package/exam-guides/commented-code/server/routes/auth.js +128 -0
  62. package/exam-guides/commented-code/server/routes/requests.js +115 -0
  63. package/exam-guides/commented-code/server/routes/services.js +31 -0
  64. package/exam-guides/commented-code/server/utils/validation.js +81 -0
  65. package/exam-guides/exam-starter/README.txt +22 -0
  66. package/exam-guides/exam-starter/package.json +13 -0
  67. package/exam-guides//320/243/320/224/320/220/320/233/320/230/320/242/320/254-/320/237/320/225/320/240/320/225/320/224-/320/241/320/224/320/220/320/247/320/225/320/231.txt +9 -0
  68. package/exam-project/README.md +16 -0
  69. package/exam-project/client/index.html +14 -0
  70. package/exam-project/client/package-lock.json +2298 -0
  71. package/exam-project/client/package.json +21 -0
  72. package/exam-project/client/public/images/README.txt +26 -0
  73. package/exam-project/client/public/images/about-cleaning.svg +4 -0
  74. package/exam-project/client/public/images/admin-banner.svg +1 -0
  75. package/exam-project/client/public/images/empty-requests.svg +1 -0
  76. package/exam-project/client/public/images/footer-photo-1.svg +4 -0
  77. package/exam-project/client/public/images/footer-photo-2.svg +4 -0
  78. package/exam-project/client/public/images/footer-photo-3.svg +4 -0
  79. package/exam-project/client/public/images/home-hero.svg +4 -0
  80. package/exam-project/client/public/images/login-banner.svg +1 -0
  81. package/exam-project/client/public/images/logo.svg +4 -0
  82. package/exam-project/client/public/images/new-request-banner.svg +1 -0
  83. package/exam-project/client/public/images/register-banner.svg +1 -0
  84. package/exam-project/client/public/images/requests-banner.svg +1 -0
  85. package/exam-project/client/public/images/slide-1.svg +6 -0
  86. package/exam-project/client/public/images/slide-2.svg +5 -0
  87. package/exam-project/client/public/images/slide-3.svg +5 -0
  88. package/exam-project/client/src/App.jsx +52 -0
  89. package/exam-project/client/src/api.js +50 -0
  90. package/exam-project/client/src/components/FormField.jsx +11 -0
  91. package/exam-project/client/src/components/Layout.jsx +61 -0
  92. package/exam-project/client/src/components/PageImage.jsx +22 -0
  93. package/exam-project/client/src/components/ProtectedRoute.jsx +20 -0
  94. package/exam-project/client/src/components/UserNav.jsx +20 -0
  95. package/exam-project/client/src/components/landing/HeroSlider.jsx +89 -0
  96. package/exam-project/client/src/components/landing/LandingLayout.jsx +61 -0
  97. package/exam-project/client/src/components/landing/SiteFooter.jsx +61 -0
  98. package/exam-project/client/src/config/images.js +83 -0
  99. package/exam-project/client/src/constants/services.js +7 -0
  100. package/exam-project/client/src/context/AuthContext.jsx +55 -0
  101. package/exam-project/client/src/index.css +54 -0
  102. package/exam-project/client/src/main.jsx +17 -0
  103. package/exam-project/client/src/pages/AdminPage.jsx +128 -0
  104. package/exam-project/client/src/pages/LandingPage.jsx +115 -0
  105. package/exam-project/client/src/pages/LoginPage.jsx +63 -0
  106. package/exam-project/client/src/pages/RegisterPage.jsx +97 -0
  107. package/exam-project/client/src/pages/RequestFormPage.jsx +178 -0
  108. package/exam-project/client/src/pages/RequestsPage.jsx +94 -0
  109. package/exam-project/client/src/utils/validation.js +54 -0
  110. package/exam-project/client/vite.config.js +17 -0
  111. package/exam-project/package.json +18 -0
  112. package/exam-project/scripts/init-project.js +86 -0
  113. package/exam-project/scripts/prepack.js +27 -0
  114. package/exam-project/scripts/unpack-template.js +105 -0
  115. package/exam-project/server/db/init.js +50 -0
  116. package/exam-project/server/db/pool.js +11 -0
  117. package/exam-project/server/db/schema.sql +41 -0
  118. package/exam-project/server/db/seed.sql +12 -0
  119. package/exam-project/server/index.js +29 -0
  120. package/exam-project/server/middleware/auth.js +24 -0
  121. package/exam-project/server/package-lock.json +1084 -0
  122. package/exam-project/server/package.json +17 -0
  123. package/exam-project/server/routes/admin.js +76 -0
  124. package/exam-project/server/routes/auth.js +109 -0
  125. package/exam-project/server/routes/requests.js +99 -0
  126. package/exam-project/server/routes/services.js +18 -0
  127. package/exam-project/server/utils/validation.js +63 -0
  128. package/package.json +25 -0
  129. package/scripts/init-project.js +86 -0
  130. package/scripts/prepack.js +27 -0
  131. package/scripts/unpack-template.js +105 -0
@@ -0,0 +1,41 @@
1
+ -- СХЕМА БД — при смене темы переименуйте БД и таблицы по смыслу предметной области
2
+ -- Тема сейчас: клининг «Мой Не Сам» → заявки на уборку (requests)
3
+ -- Другая тема: заявки → orders / bookings / applications
4
+
5
+ CREATE TABLE IF NOT EXISTS users (
6
+ id SERIAL PRIMARY KEY,
7
+ login VARCHAR(64) NOT NULL UNIQUE,
8
+ password_hash VARCHAR(255) NOT NULL,
9
+ full_name VARCHAR(255) NOT NULL,
10
+ phone VARCHAR(32) NOT NULL,
11
+ email VARCHAR(255) NOT NULL,
12
+ role VARCHAR(20) NOT NULL DEFAULT 'user' CHECK (role IN ('user', 'admin')),
13
+ created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
14
+ );
15
+
16
+ -- Справочник видов услуг — при другой теме замените названия и список в seed
17
+ CREATE TABLE IF NOT EXISTS service_types (
18
+ id SERIAL PRIMARY KEY,
19
+ name VARCHAR(255) NOT NULL UNIQUE
20
+ );
21
+
22
+ -- Заявки заказчика — ядро предметной области
23
+ -- Поля: address (адрес/комментарий), scheduled_at (дата услуги), payment_type cash|card
24
+ -- status: new → админ меняет на in_progress / completed (подписи в requests.js STATUS_LABELS)
25
+ CREATE TABLE IF NOT EXISTS requests (
26
+ id SERIAL PRIMARY KEY,
27
+ user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,
28
+ address TEXT NOT NULL,
29
+ contact_phone VARCHAR(32) NOT NULL,
30
+ service_type_id INTEGER REFERENCES service_types(id),
31
+ custom_service TEXT,
32
+ scheduled_at TIMESTAMPTZ NOT NULL,
33
+ payment_type VARCHAR(20) NOT NULL CHECK (payment_type IN ('cash', 'card')),
34
+ status VARCHAR(20) NOT NULL DEFAULT 'new'
35
+ CHECK (status IN ('new', 'in_progress', 'completed', 'cancelled')),
36
+ cancel_reason TEXT, -- БАНКЕТАМ.НЕТ: поле можно не использовать (в задании нет «отмены»)
37
+ created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
38
+ );
39
+
40
+ CREATE INDEX IF NOT EXISTS idx_requests_user_id ON requests(user_id);
41
+ CREATE INDEX IF NOT EXISTS idx_requests_status ON requests(status);
@@ -0,0 +1,12 @@
1
+ -- SEED — начальные записи в service_types (справочник для формы п.4)
2
+ -- Выполняется из init.js при npm run db:init
3
+ -- ON CONFLICT DO NOTHING — повторный init не дублирует строки
4
+ --
5
+ -- Синхронизируйте с client/src/constants/services.js (лендинг)
6
+ -- ('Банкетный зал'), ('Ресторан'), ('Летняя веранда'), ('Закрытая веранда')
7
+ INSERT INTO service_types (name) VALUES
8
+ ('Общий клининг'),
9
+ ('Генеральная уборка'),
10
+ ('Послестроительная уборка'),
11
+ ('Химчистка ковров и мебели')
12
+ ON CONFLICT (name) DO NOTHING;
@@ -0,0 +1,29 @@
1
+
2
+ import express from 'express';
3
+ import cors from 'cors';
4
+ import dotenv from 'dotenv';
5
+
6
+ import authRoutes from './routes/auth.js';
7
+ import servicesRoutes from './routes/services.js';
8
+ import requestsRoutes from './routes/requests.js';
9
+ import adminRoutes from './routes/admin.js';
10
+
11
+ dotenv.config();
12
+
13
+ const app = express();
14
+ const PORT = process.env.PORT || 3001;
15
+
16
+ app.use(cors({ origin: true, credentials: true }));
17
+ app.use(express.json());
18
+
19
+ // --- Подключение API (при смене темы файлы можно переименовать, пути оставить) ---
20
+ app.use('/api/auth', authRoutes);
21
+ app.use('/api/services', servicesRoutes);
22
+ app.use('/api/requests', requestsRoutes);
23
+ app.use('/api/admin', adminRoutes);
24
+
25
+ app.get('/api/health', (_req, res) => res.json({ ok: true }));
26
+
27
+ app.listen(PORT, () => {
28
+ console.log(`API: http://localhost:${PORT}`);
29
+ });
@@ -0,0 +1,24 @@
1
+
2
+ import jwt from 'jsonwebtoken';
3
+
4
+ export function authRequired(req, res, next) {
5
+ const header = req.headers.authorization;
6
+ if (!header?.startsWith('Bearer ')) {
7
+ return res.status(401).json({ message: 'Требуется авторизация' });
8
+ }
9
+
10
+ try {
11
+ const token = header.slice(7);
12
+ req.user = jwt.verify(token, process.env.JWT_SECRET);
13
+ next();
14
+ } catch {
15
+ return res.status(401).json({ message: 'Сессия истекла, войдите снова' });
16
+ }
17
+ }
18
+
19
+ export function adminRequired(req, res, next) {
20
+ if (req.user?.role !== 'admin') {
21
+ return res.status(403).json({ message: 'Доступ только для администратора' });
22
+ }
23
+ next();
24
+ }