Compare commits
9 Commits
61da5163b0
...
a2b1922548
| Author | SHA1 | Date | |
|---|---|---|---|
| a2b1922548 | |||
| 1386f4b886 | |||
| d696d8f376 | |||
| 066d76148b | |||
| 603d0d083a | |||
| cbd5aa6a7d | |||
| 43740691b5 | |||
| 7719c002ff | |||
| 8884a74625 |
@@ -0,0 +1,7 @@
|
|||||||
|
package com.example.demo.app.domain.service;
|
||||||
|
|
||||||
|
import com.example.demo.app.presentation.form.PasswordResetForm;
|
||||||
|
|
||||||
|
public interface PasswordResetService {
|
||||||
|
boolean resetPassword(Long userId, PasswordResetForm passwordResetForm);
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
package com.example.demo.app.domain.service;
|
||||||
|
|
||||||
|
import com.example.demo.app.presentation.form.UserForm;
|
||||||
|
|
||||||
|
public interface UserService {
|
||||||
|
void register(UserForm userForm);
|
||||||
|
}
|
||||||
@@ -0,0 +1,63 @@
|
|||||||
|
package com.example.demo.app.domain.service.impl;
|
||||||
|
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import com.example.demo.app.domain.service.UserService;
|
||||||
|
import com.example.demo.app.infra.entity.CourseEntity;
|
||||||
|
import com.example.demo.app.infra.entity.GoalEntity;
|
||||||
|
import com.example.demo.app.infra.entity.QuestionEntity;
|
||||||
|
import com.example.demo.app.infra.entity.UserEntity;
|
||||||
|
import com.example.demo.app.infra.repository.CourseRepository;
|
||||||
|
import com.example.demo.app.infra.repository.GoalRepository;
|
||||||
|
import com.example.demo.app.infra.repository.QuestionRepository;
|
||||||
|
import com.example.demo.app.infra.repository.UserRepository;
|
||||||
|
import com.example.demo.app.presentation.form.UserForm;
|
||||||
|
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
|
||||||
|
|
||||||
|
@Service
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
public class UserServiceImpl implements UserService {
|
||||||
|
private final UserRepository userRepository;
|
||||||
|
private final QuestionRepository questionRepository;
|
||||||
|
private final GoalRepository goalRepository;
|
||||||
|
private final CourseRepository courseRepository;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void register(UserForm userForm) {
|
||||||
|
|
||||||
|
UserEntity userEntity = new UserEntity();
|
||||||
|
|
||||||
|
userEntity.setUserName(userForm.getUserName());
|
||||||
|
userEntity.setMailAddress(userForm.getMailAddress());
|
||||||
|
userEntity.setPassword(userForm.getPassword());
|
||||||
|
userEntity.setSecretQuestionAnswer(userForm.getSecretAnswer());
|
||||||
|
userEntity.setBirthDate(userForm.getBirthDate());
|
||||||
|
userEntity.setSaving(userForm.getSaving());
|
||||||
|
userEntity.setBirthDate(userForm. getBirthDate());
|
||||||
|
userEntity.setSaving(userForm.getSaving());
|
||||||
|
userEntity.setAnnualIncome(userForm.getAnnualIncome());
|
||||||
|
userEntity.setMonthlyBudget(userForm.getMonthlyBudget());
|
||||||
|
|
||||||
|
QuestionEntity questionEntity =
|
||||||
|
questionRepository.findById(userForm.getSecretQuestionId()).orElse(null);
|
||||||
|
|
||||||
|
GoalEntity goalEntity =
|
||||||
|
goalRepository.findById(userForm.getGoalId()).orElse(null);
|
||||||
|
|
||||||
|
CourseEntity courseEntity =
|
||||||
|
courseRepository.findById(userForm.getCourseId()).orElse(null);
|
||||||
|
|
||||||
|
userEntity.setQuestionEntity(questionEntity);
|
||||||
|
userEntity.setGoalEntity(goalEntity);
|
||||||
|
userEntity.setCourseEntity(courseEntity);
|
||||||
|
|
||||||
|
userEntity.setDeleteFlag(0);
|
||||||
|
|
||||||
|
userRepository.save(userEntity);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
package com.example.demo.app.presentation.controller;
|
||||||
|
|
||||||
|
import org.springframework.stereotype.Controller;
|
||||||
|
import org.springframework.web.bind.annotation.GetMapping;
|
||||||
|
|
||||||
|
@Controller
|
||||||
|
public class ErrorController {
|
||||||
|
@GetMapping("/error")
|
||||||
|
public String showError() {
|
||||||
|
return "error";
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
package com.example.demo.app.presentation.form;
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@AllArgsConstructor
|
||||||
|
@NoArgsConstructor
|
||||||
|
public class PasswordResetForm{
|
||||||
|
private String password;
|
||||||
|
private String passwordConfirm;
|
||||||
|
}
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
package com.example.demo.app.presentation.form;
|
||||||
|
|
||||||
|
import java.time.LocalDate;
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@AllArgsConstructor
|
||||||
|
@NoArgsConstructor
|
||||||
|
public class UserForm {
|
||||||
|
private String userName;
|
||||||
|
private String mailAddress;
|
||||||
|
private String password;
|
||||||
|
private Long secretQuestionId;
|
||||||
|
private String SecretAnswer;
|
||||||
|
private LocalDate birthDate;
|
||||||
|
private Integer saving;
|
||||||
|
private Integer annualIncome;
|
||||||
|
private Integer monthlyBudget;
|
||||||
|
private Long goalId;
|
||||||
|
private Long courseId;
|
||||||
|
}
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
package com.example.demo.exception;
|
||||||
|
|
||||||
|
import org.springframework.ui.Model;
|
||||||
|
import org.springframework.web.bind.annotation.ControllerAdvice;
|
||||||
|
import org.springframework.web.bind.annotation.ExceptionHandler;
|
||||||
|
|
||||||
|
@ControllerAdvice
|
||||||
|
public class GlobalExceptionHandler {
|
||||||
|
|
||||||
|
@ExceptionHandler(Exception.class)
|
||||||
|
public String handleException(
|
||||||
|
Exception e,
|
||||||
|
Model model) {
|
||||||
|
|
||||||
|
model.addAttribute(
|
||||||
|
"errorMessage",
|
||||||
|
"システムエラーが発生しました。"
|
||||||
|
+ "初めからやり直してください。");
|
||||||
|
|
||||||
|
return "error";
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -81,6 +81,9 @@
|
|||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
|
<div th:replace="~{footer :: footer}">
|
||||||
|
</div>
|
||||||
|
|
||||||
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.7/dist/js/bootstrap.bundle.min.js"></script>
|
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.7/dist/js/bootstrap.bundle.min.js"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
32
src/main/resources/templates/error.html
Normal file
32
src/main/resources/templates/error.html
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html xmlns:th="http://www.thymeleaf.org">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8" name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
<title>エラー</title>
|
||||||
|
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.7/dist/css/bootstrap.min.css" rel="stylesheet">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<div th:replace="~{header :: header}">
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="container text-center mt-5">
|
||||||
|
|
||||||
|
<h2 class="text-danger">
|
||||||
|
エラーが発生しました
|
||||||
|
</h2>
|
||||||
|
|
||||||
|
<p th:text="${errorMessage}"></p>
|
||||||
|
|
||||||
|
<a class="btn btn-primary" th:href="@{/login}">
|
||||||
|
ログイン画面へ
|
||||||
|
</a>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.7/dist/js/bootstrap.bundle.min.js"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
42
src/main/resources/templates/footer.html
Normal file
42
src/main/resources/templates/footer.html
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html xmlns:th="http://www.thymeleaf.org">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8" name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
<title>フッター</title>
|
||||||
|
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.7/dist/css/bootstrap.min.css" rel="stylesheet">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<footer th:fragment="footer" class="fixed-bottom border-top py-2" style="background-color:#E3F2FD;">
|
||||||
|
|
||||||
|
<nav data-bs-theme="light">
|
||||||
|
<div class="card-footer text-center">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col border-end">
|
||||||
|
<button type="button" class="btn btn-link text-black text-decoration-none">
|
||||||
|
<a th:href="@{/transaction/create}">入力</a>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
<div class="col border-end">
|
||||||
|
<button type="button" class="btn btn-link text-black text-decoration-none">
|
||||||
|
<a th:href="@{/transaction/list}">一覧</a>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
<div class="col border-end">
|
||||||
|
<button type="button" class="btn btn-link text-black text-decoration-none">
|
||||||
|
<a th:href="@{/analysis}">分析</a>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
<div class="col border-end">
|
||||||
|
<button type="button" class="btn btn-link text-black text-decoration-none">
|
||||||
|
<a th:href="@{/goal}">目標</a>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
</footer>
|
||||||
|
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.7/dist/js/bootstrap.bundle.min.js"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -13,9 +13,10 @@
|
|||||||
<div th:if="${errorMessage}" th:text="${errorMessage}"></div>
|
<div th:if="${errorMessage}" th:text="${errorMessage}"></div>
|
||||||
<form th:action="@{/login}" th:object="${loginForm}" method="post">
|
<form th:action="@{/login}" th:object="${loginForm}" method="post">
|
||||||
<div>
|
<div>
|
||||||
<label for="emailAddress">メールアドレス</label>
|
<label for="mailAddress">メールアドレス</label>
|
||||||
|
|
||||||
<input type="email"
|
<input type="email"
|
||||||
|
id="mailAddress"
|
||||||
th:field="*{mailAddress}"
|
th:field="*{mailAddress}"
|
||||||
required>
|
required>
|
||||||
</div>
|
</div>
|
||||||
@@ -24,6 +25,7 @@
|
|||||||
<label for="password">パスワード</label>
|
<label for="password">パスワード</label>
|
||||||
|
|
||||||
<input type="password"
|
<input type="password"
|
||||||
|
id="password"
|
||||||
th:field="*{password}"
|
th:field="*{password}"
|
||||||
required>
|
required>
|
||||||
</div>
|
</div>
|
||||||
@@ -34,11 +36,11 @@
|
|||||||
</form>
|
</form>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<a href="@{user/register}">新規会員登録</a>
|
<a th:href="@{user/register}">新規会員登録</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<a href="@{password/authentication}">パスワードを忘れた方</a>
|
<a th:href="@{/authentication}">パスワードを忘れた方</a>
|
||||||
</div>
|
</div>
|
||||||
</main>
|
</main>
|
||||||
</body>
|
</body>
|
||||||
|
|||||||
42
src/main/resources/templates/password_reset.html
Normal file
42
src/main/resources/templates/password_reset.html
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="ja"xmlns:th="http://www.thymeleaf.org">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>パスワード再設定</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<header></header>
|
||||||
|
|
||||||
|
<main>
|
||||||
|
<h1>パスワード再設定</h1>
|
||||||
|
|
||||||
|
<form th:action="@{/password_reset}" th:object="${passwordResetForm}" method="post">
|
||||||
|
<div>
|
||||||
|
<label for="password">新しいパスワード</label>
|
||||||
|
<input type="password"
|
||||||
|
id="password"
|
||||||
|
th:field="*{password}"
|
||||||
|
minlength="8"
|
||||||
|
maxlength="255"
|
||||||
|
required>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<label for="passwordConfirm">パスワード確認</label>
|
||||||
|
<input type="password"
|
||||||
|
id="passwordConfirm"
|
||||||
|
th:field="*{passwordConfirm}"
|
||||||
|
minlength="8"
|
||||||
|
maxlength="255"
|
||||||
|
required>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<button type="submit">再設定</button>
|
||||||
|
</form>
|
||||||
|
|
||||||
|
<div th:if="${errorMessage}">
|
||||||
|
<p th:text="${errorMessage}"></p>
|
||||||
|
</div>
|
||||||
|
</main>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
Reference in New Issue
Block a user