diff --git a/README.md b/README.md index e69de29..1eb4be3 100644 --- a/README.md +++ b/README.md @@ -0,0 +1 @@ +docker run -d -p 1025:1025 -p 8025:8025 --name mailhog mailhog/mailhog \ No newline at end of file diff --git a/src/main/java/ru/mcs/diary/common/email/EmailService.java b/src/main/java/ru/mcs/diary/common/email/EmailService.java new file mode 100644 index 0000000..f173838 --- /dev/null +++ b/src/main/java/ru/mcs/diary/common/email/EmailService.java @@ -0,0 +1,51 @@ +package ru.mcs.diary.common.email; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.mail.javamail.JavaMailSender; +import org.springframework.mail.javamail.MimeMessageHelper; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; + +@Slf4j +@Service +@RequiredArgsConstructor +public class EmailService { + + private final JavaMailSender mailSender; + + @Value("${spring.mail.username:noreply@teacher-diary.local}") + private String fromEmail; + + @Value("${app.mail.enabled:false}") + private boolean mailEnabled; + + @Async + public void sendEmail(String to, String subject, String htmlContent) { + if (!mailEnabled) { + // В режиме разработки просто логируем + log.info("=== EMAIL (mock mode) ==="); + log.info("To: {}", to); + log.info("Subject: {}", subject); + log.info("Content: {}", htmlContent); + log.info("========================="); + return; + } + + try { + var message = mailSender.createMimeMessage(); + var helper = new MimeMessageHelper(message, true, "UTF-8"); + + helper.setFrom(fromEmail); + helper.setTo(to); + helper.setSubject(subject); + helper.setText(htmlContent, true); + + mailSender.send(message); + log.info("Email sent to: {}", to); + } catch (Exception e) { + log.error("Failed to send email to {}: {}", to, e.getMessage()); + } + } +} diff --git a/src/main/java/ru/mcs/diary/dashboard/DashboardController.java b/src/main/java/ru/mcs/diary/dashboard/DashboardController.java new file mode 100644 index 0000000..4cd3950 --- /dev/null +++ b/src/main/java/ru/mcs/diary/dashboard/DashboardController.java @@ -0,0 +1,41 @@ +package ru.mcs.diary.dashboard; + +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import ru.mcs.diary.auth.CurrentUser; +import ru.mcs.diary.auth.CustomUserDetails; +import ru.mcs.diary.parent.ParentRepository; +import ru.mcs.diary.student.StudentRepository; + +@Controller +@RequestMapping("/teacher") +@RequiredArgsConstructor +public class DashboardController { + + private final StudentRepository studentRepository; + private final ParentRepository parentRepository; + // Позже добавим GroupRepository и LessonRepository + + @GetMapping("/dashboard") + public String dashboard(@CurrentUser CustomUserDetails user, Model model) { + Long teacherId = user.getTeacherId(); + + model.addAttribute("user", user); + model.addAttribute("activeMenu", "dashboard"); + model.addAttribute("pageTitle", "Главная"); + + // Статистика + model.addAttribute("studentCount", studentRepository.countByTeacherId(teacherId)); + model.addAttribute("parentCount", parentRepository.countByTeacherId(teacherId)); + model.addAttribute("groupCount", 0); // TODO: добавить после создания групп + model.addAttribute("todayLessonsCount", 0); // TODO: добавить после создания расписания + + // Занятия на сегодня (пока пустой список) + model.addAttribute("todayLessons", java.util.Collections.emptyList()); + + return "dashboard/index"; + } +} diff --git a/src/main/java/ru/mcs/diary/parent/ParentRepository.java b/src/main/java/ru/mcs/diary/parent/ParentRepository.java index f431384..d280cf9 100644 --- a/src/main/java/ru/mcs/diary/parent/ParentRepository.java +++ b/src/main/java/ru/mcs/diary/parent/ParentRepository.java @@ -20,5 +20,9 @@ List findAllByTeacherIdOrderByLastNameAsc(Long teacherId); + Optional findByEmail(String email); + boolean existsByEmailAndTeacherId(String email, Long teacherId); + + long countByTeacherId(Long teacherId); } diff --git a/src/main/java/ru/mcs/diary/teacher/TeacherController.java b/src/main/java/ru/mcs/diary/teacher/TeacherController.java deleted file mode 100644 index 1fabd84..0000000 --- a/src/main/java/ru/mcs/diary/teacher/TeacherController.java +++ /dev/null @@ -1,21 +0,0 @@ -package ru.mcs.diary.teacher; - -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Controller; -import org.springframework.ui.Model; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import ru.mcs.diary.auth.CurrentUser; -import ru.mcs.diary.auth.CustomUserDetails; - -@Controller -@RequestMapping("/teacher") -@RequiredArgsConstructor -public class TeacherController { - - @GetMapping("/dashboard") - public String dashboard(@CurrentUser CustomUserDetails user, Model model) { - model.addAttribute("user", user); - return "teacher/dashboard"; - } -} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 559378e..15dd520 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -41,22 +41,25 @@ encoding: UTF-8 mode: HTML - # Mail + # Email конфигурация +# mail: +# host: smtp.gmail.com +# port: 587 +# username: ${MAIL_USERNAME:malexple@gmail.com} +# password: ${MAIL_PASSWORD:poqw09123} +# properties: +# mail: +# smtp: +# auth: true +# starttls: +# enable: true +# required: true +# transport: +# protocol: smtp + # Email - отключено для разработки mail: - host: ${MAIL_HOST:smtp.gmail.com} - port: ${MAIL_PORT:587} - username: ${MAIL_USER:} - password: ${MAIL_PASSWORD:} - properties: - mail: - smtp: - auth: true - starttls: - enable: true - required: true - connectiontimeout: 5000 - timeout: 5000 - writetimeout: 5000 + host: localhost + port: 1025 # Messages messages: diff --git a/src/main/resources/templates/dashboard/index.html b/src/main/resources/templates/dashboard/index.html new file mode 100644 index 0000000..ca34703 --- /dev/null +++ b/src/main/resources/templates/dashboard/index.html @@ -0,0 +1,94 @@ + + + + + +
+
+
+
+
+ +
+
0
+
Учеников
+
+
+
+
+
+
+
+ +
+
0
+
Групп
+
+
+
+
+
+
+
+ +
+
0
+
Занятий сегодня
+
+
+
+
+
+
+
+ +
+
0
+
Родителей
+
+
+
+
+ +
+ +
+
+
+
Занятия на сегодня
+
+
+

Нет запланированных занятий

+
+
    +
  • + +
  • +
+
+
+ + + +
+
+ +