회원 아이디를 클릭하면 상세로 이동하도록 처리
- admin/list.html
<td>
<a th:text="${x.userId}"
th:href="${'detail?userId=' + x.userId}">
ktw5026@naver.com
</a>
</td>
- AdminMemberController
@GetMapping("/admin/member/detail")
public String detail(Model model, MemberParam param){
param.init();
MemberDto member = memberService.detail(param.getUserId());
model.addAttribute("member", member);
return "admin/member/list";
}
}
- MemberService
// 회원 상세정보보
MemberDto detail(String userId);
- MemberServiceImpl
MemberRepository를 사용하니 값은 Member에서 꺼내온다
하지만 엔티티를 그대로 쓰는것은 좋지 않기에 MemberDto로 변환해서 값을 가져올 것임
비즈니스 로직과 관계가 없기때문에 모든 값을 가져오기 위해 Dto에 of 메소드를 만듬
이러면 아래 return값처럼 of 메서드에 멤버정보만 내려주면 된다
@Override
public MemberDto detail(String userId) {
Optional<Member> optionalMember = memberRepository.findById(userId);
if(!optionalMember.isPresent()){
return null;
}
Member member = optionalMember.get();
return MemberDto.of(member);
}
- MemberDto
public static MemberDto of(Member member){
return MemberDto.builder()
.userId(member.getUserId())
.userName(member.getUserName())
.phone(member.getPhone())
.regDt(member.getRegDt())
.emailAuthYn(member.isEmailAuthYn())
.emailAuthDt(member.getEmailAuthDt())
.emailAuthKey(member.getEmailAuthKey())
.restPasswordKey(member.getResetPasswordKey())
.resetPasswordLimitDt(member.getResetPasswordLimitDt())
.adminYn(member.isAdminYn())
.build();
}
- detail.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.detail table{
width: 100%;
border-collapse: collapse;
}
.detail table th, .detail table td{
border: solid 1px #000;
}
</style>
</head>
<body>
<h1>관리자 회원 관리 - 회원 상세보기</h1>
<div>
<a href="/admin/main">관리자 메인</a>
|
<a href="/admin/member/list">회원 관리</a>
|
<a href="#">카테고리 관리</a>
|
<a href="#">강의 관리</a>
|
<a href="/member/logout">로그아웃</a>
</div>
<div class="detail">
<table>
<tbody>
<tr>
<th>아이디</th>
<td>
<p th:text="${member.userId}"></p>
</td>
</tr>
<tr>
<th>이름</th>
<td>
<p th:text="${member.userName}"></p>
</td>
</tr>
<tr>
<th>연락처</th>
<td>
<p th:text="${member.phone}"></p>
</td>
</tr>
<tr>
<th>가입일</th>
<td>
<p th:text="${member.regDt}"></p>
</td>
</tr>
<tr>
<th>이메일 인증</th>
<td>
<p th:text="${member.emailAuthYn}"></p>
</td>
</tr>
<tr>
<th>관리자 여부</th>
<td>
<p th:text="${member.adminYn}"></p>
</td>
</tr>
</tbody>
</table>
</div>
</body>
</html>
여기서 값이 아래처럼 정상적으로 나오지만
다시 리스트로 돌아가면 에러가 발생한다
++ 트러블 슈팅)
이 문제는 타임존에 대한 설정이 아니라 생성자에 대한 문제였다
- MemberDto
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class MemberDto {
생성자 문제... 생성자 값을 넣지 않아서 몇시간을 버린지 모르겠다..
알고나니 진짜 너무 허무하다 평소에는 잘 넣었는데;
회원 상태: 유저가 로그인이 가능한지 불가능한지 상태
- Member
// 이용가능한 상태 , 정지상태태
private String userStatus;
- MemberCode
userStatus의 상태를 체크하기 위해 사용
public interface MemberCode {
// 현재 이용중인 상태
String MEMBER_STATUS_ING = "ING";
// 현재 정지
String MEMBER_STATUS_STOP = "STOP";
}
- MemberServiceImpl
회원가입할 떄 기본적으로 회원의 status를 넣어주는 로직 필요
@Override
public boolean register(MemberRequestDto requestDto) {
...
Member member = Member.builder()
.userId(requestDto.getUserId())
.userName(requestDto.getUserName())
.phone(requestDto.getPhone())
.password(encPassword)
.regDt(LocalDateTime.now())
.emailAuthYn(false)
.emailAuthKey(uuid)
// 처음 가입하면 메일 인증 중인 상태
.userStatus(Member.MEMBER_STATUS_REQ)
.build();
memberRepository.save(member);
@Override
public boolean emailAuth(String uuid) {
...
// 이메일 활성화가 되었다면 이용중인 상태로 변경
member.setUserStatus(Member.MEMBER_STATUS_ING);
member.setEmailAuthYn(true);
member.setEmailAuthDt(LocalDateTime.now());
memberRepository.save(member);
return true;
}
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
...
// 이메일 인증절차에 관한 로직
// true가 아닐때 예외처리
if(Member.MEMBER_STATUS_REQ.equals(member.getUserStatus())){
throw new MemberNotEmailAuthException("이메일 활성화 이후에 로그인 진행해주세요");
}
if(Member.MEMBER_STATUS_STOP.equals(member.getUserStatus())){
throw new MemberStopUserlAuthException("정지된 회원입니다");
}
- MemberCode
이와 같이 멤버 이메일 관련해서도 현재 이메일 체크 여부 상태를 보여줘야 한다
처음 회원 가입시 메일인증을 하면 이용중인 상태로 넘어가게 할 것
public interface MemberCode {
// 현재 회원가입 요청중
String MEMBER_STATUS_REQ = "REQ";
// 현재 이용중인 상태
String MEMBER_STATUS_ING = "ING";
// 현재 정지
String MEMBER_STATUS_STOP = "STOP";
}
이제 상태변경에 대한 로직을 본격적으로 짜보겠다
- detail.html
+ MemberDto에도 String userStatus; 필드 추가
<tr>
<th>회원 상태</th>
<td>
<p th:text="${member.userStatus}"></p>
</td>
</tr>
- detail.html
서버로 날라가야 하니 form태그로 감싸고
상태만 전달되어서는 어떤 값인지 모르니 hidden으로 id값 전송
전송된 정보(이메일, Id) 값을 통해 상태를 변경하면 된다
<tr>
<th>회원 상태</th>
<td>
<p>
현재상태 : <span th:text="${member.userStatus}"></span>
</p>
<div>
<form method="post" action="/admin/member/status">
<input th:value="${member.userId}" type="hidden" name="userId">
<select name="userStatus">
<option value="REQ">가입승인용</option>
<option value="ING">항상이용중</option>
<option value="STOP">정지중</option>
</select>
<button type="submit">상태 변경</button>
</form>
</div>
</td>
</tr>
- AdminMemberController
@PostMapping("/admin/member/status")
public String status(Model model, MemberStatusDto parameter){
boolean result = memberService.updateStatus(parameter.getUserId(), parameter.getUserStatus());
return "redirect:/admin/member/detail?userId=" + parameter.getUserId();
}
- MemberStatusDto
@Data
public class MemberStatusDto {
String userId;
String userStatus;
}
- MemberServiceImpl
@Override
public boolean updateStatus(String userId, String userStatus) {
Optional<Member> optionalMember = memberRepository.findById(userId);
if(!optionalMember.isPresent()){
throw new UsernameNotFoundException("회원정보가 존재하지 않습니다");
}
Member member = optionalMember.get();
member.setUserStatus(userStatus);
memberRepository.save(member);
return true;
}
이렇게 하면 상태처리 로직이 끝났고 이제 비밀번호 초기화를 진행하겠다
비밀번호를 알려주진 못하고 기존 비밀번호를 초기화 하는 작업 진행
(회원관리에서 관리자가 입력한 비밀번호로 초기화)
- detail.html
<tr>
<th>회원 비밀번호 초기화</th>
<td>
<div>
<form method="post" action="/admin/member/password">
<input th:value="${member.userId}" type="hidden" name="userId">
<input type="text" name="password">
<button type="submit">비밀번호 초기화</button>
</form>
</div>
</td>
</tr>
- AdminMemberController
@PostMapping("/admin/member/password")
public String password(Model model, MemberPasswordDto parameter){
boolean result = memberService.updatePassword(parameter.getUserId(), parameter.getPassword());
return "redirect:/admin/member/detail?userId=" + parameter.getUserId();
}
- MemberService
// 회원비밀번호 초기화
boolean updatePassword(String userId, String password);
- MemberServiceImpl
@Override
public boolean updatePassword(String userId, String password) {
Optional<Member> optionalMember = memberRepository.findById(userId);
if(!optionalMember.isPresent()){
throw new UsernameNotFoundException("회원정보가 존재하지 않습니다");
}
Member member = optionalMember.get();
String encPassword = BCrypt.hashpw(password, BCrypt.gensalt());
member.setPassword(encPassword);
member.setPassword(encPassword);
memberRepository.save(member);
return true;
}
'개인프로젝트(수강프로그램)' 카테고리의 다른 글
강좌목록 (0) | 2022.04.20 |
---|---|
카테고리 화면 (0) | 2022.04.19 |
회원목록 (0) | 2022.04.18 |
관리자 로그인 (0) | 2022.04.16 |
비밀번호 초기화 요청 및 메일 링크를 통한 초기화 (0) | 2022.04.15 |