Java, Spring Bootで勉強時間管理アプリを作ってみた。
製作期間:2022年10月2日から
開発環境:Java, Spring Boot, Mybatis, HTML, CSS
・実装した画面
ユーザーがした課題を見るホーム画面
マイページ(自分の過去にした課題の一覧と課題の登録画面)
ログイン画面
会員登録画面
便利機能(就活の企業分析をする画面)
ログアウト
・LoginUserクラス
//packageは省略
//importは省略
@Data
public class LoginUser implements UserDetails{
private int id;
private String mailaddress;
private String username;
private String password;
private String roleName;
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
return AuthorityUtils.createAuthorityList(this.getRoleName());
}
@Override
public String getUsername() {
return username;
}
@Override
public String getPassword() {
return password;
}
@Override
public boolean isAccountNonExpired() {
return true;
}
@Override
public boolean isAccountNonLocked() {
return true;
}
@Override
public boolean isCredentialsNonExpired() {
return true;
}
@Override
public boolean isEnabled() {
return true;
}
}
このクラスはログインに使いたい情報、認可、その他アカウントをロックする条件などを決めるクラスである。
Lombokの@Dataを使うことによってゲッターやセッターを省略。
今回ではid, mailaddress, username(ログインに使用), password(ログインに使用), roleName(認可)。
・Controllerクラス
//packageは省略
//importは省略
@Controller
public class Controller {
@RequestMapping("/mypage/{username}")
public Object userPage(ModelAndView mav,
@PathVariable("username") String username,
@AuthenticationPrincipal LoginUser loginUser) {
if(loginUser == null) {
mav = new ModelAndView("userpage");
mav.addObject("TimeList", timekeepMapper.principalSelectAll(username));
return mav;
} else {
LoginUser record = loginUserMapper.findByUsername(username);
String principalUsername = loginUser.getUsername();
if (record == null) {
return "NullAccount";
} else if (username.equals(principalUsername)) {
mav = new ModelAndView("PrincipalUserPage");
mav.addObject("LoginList", principalUsername);
mav.addObject("PrincipalTimeList", timekeepMapper.principalSelectAll(username));
return mav;
} else {
mav = new ModelAndView("userpage");
mav.addObject("TimeList", timekeepMapper.principalSelectAll(username));
return mav;
}
}
}
解説:Controllerクラスでは、URLとそこでの処理を書いていく。
今回では
@RequestMapping("/")
これがURLの設定となる
これにより、URLに"/"を入力するとここで設定したHTMLのページに飛ばすということができる。
ModelAndView
これはHTMLに表示させる文字などを変数で登録したいときに使用する。
まず初めに "ModelAndView 付けたい名前(今回はmav)"を宣言
そして mav = new ModelAndView("表示させたいHTMLファイル");
これにより紐づけるHTMLファイルを設定することができる。
そしてmav.addObject("HTMLで設定する変数名", 変数名);
これによって変数とHTMLで紐づけることができる。
RequestMapping("/{変数のURL}")
@PathVariable("変数のURL") String 変数名
PathVariableはURLに変数を設定することができる。
何も設定しなければ、URLにどんな文字、数字を入れても設定したHTMLページに行くようになる。
今回では
"RequestMapping("/mypage/{username}")
@PathVariable("username") String username(変数名)"とし、
詳しくは後述するが、
if文によってusernameと現在ログインしているusernameが一致すれば、タスク等が編集が可能なユーザーページに飛ばし、
そうでなければ、usernameとデータベース上にあるusernameが一致するか確認し、一致すればタスク等の編集はできないがそのユーザーのページに飛ばし、
その両方に当てはまらないusernameが入力されると、アカウントが見つからないというページに飛ばすようにしている。
@AuthenticationPrincipal LoginUser loginuser
⇒このAuthenticationPrincipalアノテーションは、ログイン中のアカウントの情報を得ることができる。
初めのif文では、loginUserがnullかどうかによってログイン中かそうでないかを判別して、ログイン中でなければ匿名用のHTMLへ、そうでなければ次の分岐(ログインユーザー用のHTML)へ飛ばすようにしている。
さらに今回では、loginUser.getUsername()というゲッターによってログイン中のユーザーネームを確認している。
これによってログイン中のユーザーネームと入力されたユーザーネームが一致するか確認できる。つまり、本人しか入ることができないページを作ることができる。
その方法として、マイページに入る際URLに入力されたユーザーネームとログイン中のユーザーネームが一致する時、編集可能な特別なマイページに飛ばし、URLに入力されたユーザーネームとログイン中のユーザーネームが一致しない場合、編集不可能な閲覧のみのマイページに飛ばすということをしている。
最初のelse以下のif(record == null)は、入力されたユーザーネームが存在するかどうか確認し、それがnullであれば「アカウントが存在しない」という旨のページに飛ばすための文である。