admin: 로그인 후 메인화면 정상 진입 및 관리자 관리 권한 등록 드롭다운 추가

This commit is contained in:
geonhos 2024-05-24 11:06:14 +09:00
parent 3902af57e3
commit 9370aaa1df
21 changed files with 124 additions and 39 deletions

View File

@ -0,0 +1,26 @@
package com.bpgroup.poc.admin.web.common;
import com.bpgroup.poc.admin.web.common.dropdown.RoleCombo;
import com.querydsl.core.types.Projections;
import com.querydsl.jpa.impl.JPAQueryFactory;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;
import java.util.List;
import static com.bpgroup.poc.admin.domain.role.entity.QRole.role;
@Repository
@RequiredArgsConstructor
public class CommonQueryRepository {
private final JPAQueryFactory queryFactory;
public List<RoleCombo> findRoles() {
return queryFactory.select(Projections.fields(RoleCombo.class,
role.id,
role.name))
.from(role)
.fetch();
}
}

View File

@ -0,0 +1,19 @@
package com.bpgroup.poc.admin.web.common;
import com.bpgroup.poc.admin.web.common.dropdown.RoleCombo;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
@RequiredArgsConstructor
public class CommonWebService {
private final CommonQueryRepository queryRepository;
public List<RoleCombo> findRoleForCombo() {
return queryRepository.findRoles();
};
}

View File

@ -0,0 +1,9 @@
package com.bpgroup.poc.admin.web.common.dropdown;
import lombok.Getter;
@Getter
public class RoleCombo {
private Long id;
private String name;
}

View File

@ -1,4 +1,4 @@
package com.bpgroup.poc.admin.web.common; package com.bpgroup.poc.admin.web.common.reqres;
import lombok.Getter; import lombok.Getter;

View File

@ -1,15 +1,23 @@
package com.bpgroup.poc.admin.web.main.admin.management; package com.bpgroup.poc.admin.web.main.admin.management;
import com.bpgroup.poc.admin.web.common.CommonWebService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Controller; import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
@Controller @Controller
@RequiredArgsConstructor
@RequestMapping("/admin/management") @RequestMapping("/admin/management")
public class AdminManagementController { public class AdminManagementController {
private final CommonWebService commonWebService;
@GetMapping @GetMapping
public String adminManagementPage() { public String adminManagementPage(Model model) {
model.addAttribute("roles", commonWebService.findRoleForCombo());
return "main/admin/management/list"; return "main/admin/management/list";
} }

View File

@ -18,11 +18,15 @@ public class AdminManagementQueryRepository {
private final JPAQueryFactory queryFactory; private final JPAQueryFactory queryFactory;
public List<AdminFind.Response> findAll() { public List<AdminFind.Response> findAll() {
return queryFactory.select(Projections.fields(AdminFind.Response.class, return queryFactory.select(
Projections.fields(
AdminFind.Response.class,
admin.id, admin.id,
admin.loginId, admin.loginId,
admin.email, admin.email,
admin.name)) admin.name
)
)
.from(admin) .from(admin)
.fetch(); .fetch();
} }

View File

@ -1,6 +1,6 @@
package com.bpgroup.poc.admin.web.main.admin.management.reqres; package com.bpgroup.poc.admin.web.main.admin.management.reqres;
import com.bpgroup.poc.admin.web.common.CommonResponse; import com.bpgroup.poc.admin.web.common.reqres.CommonResponse;
import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.NotNull;
import lombok.Builder; import lombok.Builder;

View File

@ -1,6 +1,6 @@
package com.bpgroup.poc.admin.web.main.admin.management.reqres; package com.bpgroup.poc.admin.web.main.admin.management.reqres;
import com.bpgroup.poc.admin.web.common.CommonResponse; import com.bpgroup.poc.admin.web.common.reqres.CommonResponse;
import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.NotNull;
import lombok.Builder; import lombok.Builder;
import lombok.Data; import lombok.Data;

View File

@ -1,6 +1,6 @@
package com.bpgroup.poc.admin.web.main.admin.management.reqres; package com.bpgroup.poc.admin.web.main.admin.management.reqres;
import com.bpgroup.poc.admin.web.common.CommonResponse; import com.bpgroup.poc.admin.web.common.reqres.CommonResponse;
import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.NotNull;
import lombok.Builder; import lombok.Builder;

View File

@ -1,6 +1,6 @@
package com.bpgroup.poc.admin.web.main.admin.menu.reqres; package com.bpgroup.poc.admin.web.main.admin.menu.reqres;
import com.bpgroup.poc.admin.web.common.CommonResponse; import com.bpgroup.poc.admin.web.common.reqres.CommonResponse;
import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.NotNull;
import lombok.Builder; import lombok.Builder;

View File

@ -1,6 +1,6 @@
package com.bpgroup.poc.admin.web.main.admin.menu.reqres; package com.bpgroup.poc.admin.web.main.admin.menu.reqres;
import com.bpgroup.poc.admin.web.common.CommonResponse; import com.bpgroup.poc.admin.web.common.reqres.CommonResponse;
import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.NotNull;
import lombok.Builder; import lombok.Builder;
import lombok.Data; import lombok.Data;

View File

@ -1,6 +1,6 @@
package com.bpgroup.poc.admin.web.main.admin.menu.reqres; package com.bpgroup.poc.admin.web.main.admin.menu.reqres;
import com.bpgroup.poc.admin.web.common.CommonResponse; import com.bpgroup.poc.admin.web.common.reqres.CommonResponse;
import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.NotNull;
import lombok.Builder; import lombok.Builder;

View File

@ -1,6 +1,6 @@
package com.bpgroup.poc.admin.web.main.admin.menu.reqres; package com.bpgroup.poc.admin.web.main.admin.menu.reqres;
import com.bpgroup.poc.admin.web.common.CommonResponse; import com.bpgroup.poc.admin.web.common.reqres.CommonResponse;
import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.NotNull;
import lombok.Builder; import lombok.Builder;
import lombok.Data; import lombok.Data;

View File

@ -1,6 +1,6 @@
package com.bpgroup.poc.admin.web.main.admin.menu.reqres; package com.bpgroup.poc.admin.web.main.admin.menu.reqres;
import com.bpgroup.poc.admin.web.common.CommonResponse; import com.bpgroup.poc.admin.web.common.reqres.CommonResponse;
import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.NotNull;
import lombok.Builder; import lombok.Builder;

View File

@ -1,6 +1,6 @@
package com.bpgroup.poc.admin.web.main.admin.menu.reqres; package com.bpgroup.poc.admin.web.main.admin.menu.reqres;
import com.bpgroup.poc.admin.web.common.CommonResponse; import com.bpgroup.poc.admin.web.common.reqres.CommonResponse;
import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.NotNull;
import lombok.Builder; import lombok.Builder;

View File

@ -1,7 +1,7 @@
package com.bpgroup.poc.admin.web.main.admin.role.reqres; package com.bpgroup.poc.admin.web.main.admin.role.reqres;
import com.bpgroup.poc.admin.domain.role.RoleMenuType; import com.bpgroup.poc.admin.domain.role.RoleMenuType;
import com.bpgroup.poc.admin.web.common.CommonResponse; import com.bpgroup.poc.admin.web.common.reqres.CommonResponse;
import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size; import jakarta.validation.constraints.Size;
import lombok.Builder; import lombok.Builder;

View File

@ -1,6 +1,6 @@
package com.bpgroup.poc.admin.web.main.admin.role.reqres; package com.bpgroup.poc.admin.web.main.admin.role.reqres;
import com.bpgroup.poc.admin.web.common.CommonResponse; import com.bpgroup.poc.admin.web.common.reqres.CommonResponse;
import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotBlank;
import lombok.Builder; import lombok.Builder;
import lombok.Data; import lombok.Data;

View File

@ -1,6 +1,6 @@
package com.bpgroup.poc.admin.web.main.admin.role.reqres; package com.bpgroup.poc.admin.web.main.admin.role.reqres;
import com.bpgroup.poc.admin.web.common.CommonResponse; import com.bpgroup.poc.admin.web.common.reqres.CommonResponse;
import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.NotNull;
import lombok.Builder; import lombok.Builder;
import lombok.Data; import lombok.Data;

View File

@ -1,6 +1,6 @@
package com.bpgroup.poc.admin.web.main.admin.role.reqres; package com.bpgroup.poc.admin.web.main.admin.role.reqres;
import com.bpgroup.poc.admin.web.common.CommonResponse; import com.bpgroup.poc.admin.web.common.reqres.CommonResponse;
import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.NotNull;
import lombok.Builder; import lombok.Builder;

View File

@ -1,29 +1,34 @@
INSERT INTO `role` (`name`, `description`, `create_date`, `update_date`) INSERT INTO `role` (`name`, `description`, `create_date`, `update_date`)
VALUES ('SUPER_ADMIN', '최고 관리자', CURDATE(), CURDATE()), VALUES ('SUPER_ADMIN', '최고 관리자', CURDATE(), CURDATE()),
('ADMIN', '관리자', CURDATE(), CURDATE()), ('ADMIN', '관리자', CURDATE(), CURDATE()),
('CLIENT', '고객', CURDATE(), CURDATE()); ('CLIENT', '고객', CURDATE(), CURDATE())
;
INSERT INTO `admin` (`login_id`, `password`, `email`, `name`, `role_id`, `create_date`, `update_date`) INSERT INTO `admin` (`login_id`, `password`, `email`, `name`, `role_id`, `create_date`, `update_date`)
VALUES ('admin', '$2a$10$g6UOrQ/OS8o5r5CJk7C5juVFaItQ62U3EIn8zLPzkFplM3wVLvKZ2', 'admin@admin.com', '홍길동', 1, CURDATE(), CURDATE()); VALUES ('admin', '$2a$10$g6UOrQ/OS8o5r5CJk7C5juVFaItQ62U3EIn8zLPzkFplM3wVLvKZ2', 'admin@admin.com', '홍길동', 1, CURDATE(),
CURDATE());
INSERT INTO `menu_group` (`uri`, `name`, `sort_order`, `create_date`, `update_date`) INSERT INTO `menu_group` (`uri`, `name`, `sort_order`, `create_date`, `update_date`)
VALUES ('/admin', '관리자 관리', 2, CURDATE(), CURDATE()), VALUES ('/main', '메인', 1, CURDATE(), CURDATE()),
('/settings', '설정', 3, CURDATE(), CURDATE()), ('/admin', '관리자 관리', 2, CURDATE(), CURDATE()),
('/temp', '임시', 1, CURDATE(), CURDATE()); ('/settings', '설정', 3, CURDATE(), CURDATE())
INSERT INTO `menu` (`uri`, `name`, `sort_order`, `menu_group_id`, `create_date`, `update_date`)
VALUES ('/admin/management', '관리자 관리', 1, 1, CURDATE(), CURDATE()),
('/admin/role', '권한 관리', 2, 1, CURDATE(), CURDATE())
; ;
INSERT INTO `menu` (`uri`, `name`, `sort_order`, `menu_group_id`, `create_date`, `update_date`) INSERT INTO `menu` (`uri`, `name`, `sort_order`, `menu_group_id`, `create_date`, `update_date`)
VALUES ('/settings/code', '코드 관리', 1, 2, CURDATE(), CURDATE()) VALUES ('/main', '메인화면', 1, 1, CURDATE(), CURDATE()),
('/admin/management', '관리자 관리', 2, 2, CURDATE(), CURDATE()),
('/admin/role', '권한 관리', 3, 2, CURDATE(), CURDATE())
;
INSERT INTO `menu` (`uri`, `name`, `sort_order`, `menu_group_id`, `create_date`, `update_date`)
VALUES ('/settings/code', '코드 관리', 1, 3, CURDATE(), CURDATE())
; ;
INSERT INTO `role_menu` (`role_id`, `menu_id`, `create_date`, `update_date`) INSERT INTO `role_menu` (`role_id`, `menu_id`, `create_date`, `update_date`)
VALUES ('1', '1', CURDATE(), CURDATE()), VALUES ('1', '1', CURDATE(), CURDATE()),
('1', '2', CURDATE(), CURDATE()), ('1', '2', CURDATE(), CURDATE()),
('1', '3', CURDATE(), CURDATE()) ('1', '3', CURDATE(), CURDATE()),
('1', '4', CURDATE(), CURDATE())
; ;

View File

@ -10,11 +10,16 @@
<label for="iptCreatePassword">비밀번호: </label><input type="password" id="iptCreatePassword" name="password"> <label for="iptCreatePassword">비밀번호: </label><input type="password" id="iptCreatePassword" name="password">
<label for="iptCreateEmail">이메일: </label><input type="text" id="iptCreateEmail" name="email"> <label for="iptCreateEmail">이메일: </label><input type="text" id="iptCreateEmail" name="email">
<label for="iptCreateNAme">이름: </label><input type="text" id="iptCreateNAme" name="name"> <label for="iptCreateNAme">이름: </label><input type="text" id="iptCreateNAme" name="name">
<button type="button" id="btnCreate" class="btn_confirm" data-bs-dismiss="modal">등록</button> <label for="selCreateRole">권한: </label>
<button type="button" id="btnCheckDuplication" class="btn_confirm" data-bs-dismiss="modal">아이디 중복체크</button> <select id="selCreateRole" class="table_select_box">
<option value="">선택</option>
<option th:each="role : ${roles}" th:value="${role.getId()}" th:text="${role.getName()}"></option>
</select>
<button type="button" id="btnCreate" class="btn_blue posi_right" data-bs-dismiss="modal">등록</button>
<button type="button" id="btnCheckDuplication" class="btn_blue posi_right" data-bs-dismiss="modal">중복체크</button>
</div> </div>
<h4>관리자 조회</h4> <h2>관리자 조회</h2>
<div class="tb_wrapper"> <div class="tb_wrapper">
<label for="selAdmin">관리자: </label> <label for="selAdmin">관리자: </label>
<select id="selAdmin" class="table_select_box"> <select id="selAdmin" class="table_select_box">
@ -23,17 +28,23 @@
<button type="button" id="btnFindAll" class="btn_confirm" data-bs-dismiss="modal">조회</button> <button type="button" id="btnFindAll" class="btn_confirm" data-bs-dismiss="modal">조회</button>
</div> </div>
<h4>관리자 수정</h4> <h2>관리자 수정</h2>
<div class="tb_wrapper"> <div class="tb_wrapper">
<input type="hidden" id="iptUpdateId" name="id"> <input type="hidden" id="iptUpdateId" name="id">
<label for="iptUpdateLoginId">아이디: </label><input type="text" id="iptUpdateLoginId" name="loginId" readonly> <label for="iptUpdateLoginId">아이디: </label><input type="text" id="iptUpdateLoginId" name="loginId" readonly>
<label for="iptUpdatePassword">비밀번호: </label><input type="password" id="iptUpdatePassword" name="password"> <label for="iptUpdatePassword">비밀번호: </label><input type="password" id="iptUpdatePassword" name="password">
<label for="iptUpdateEmail">이메일: </label><input type="text" id="iptUpdateEmail" name="email"> <label for="iptUpdateEmail">이메일: </label><input type="text" id="iptUpdateEmail" name="email">
<label for="iptUpdateName">이름: </label><input type="text" id="iptUpdateName" name="name"> <label for="iptUpdateName">이름: </label><input type="text" id="iptUpdateName" name="name">
<label for="selUpdateRole">권한: </label>
<select id="selUpdateRole" class="table_select_box">
<option value="">선택</option>
<option th:each="role : ${roles}" th:value="${role.getId()}" th:text="${role.getName()}"></option>
</select>
<button type="button" id="btnUpdate" class="btn_confirm" data-bs-dismiss="modal">수정</button> <button type="button" id="btnUpdate" class="btn_confirm" data-bs-dismiss="modal">수정</button>
</div> </div>
<h4>관리자 삭제</h4> <h2>관리자 삭제</h2>
<div class="tb_wrapper"> <div class="tb_wrapper">
<input type="hidden" id="iptDeleteId" name="id"> <input type="hidden" id="iptDeleteId" name="id">
<label for="iptUpdateLoginId">아이디: </label><input type="text" id="iptDeleteLoginId" name="loginId" readonly> <label for="iptUpdateLoginId">아이디: </label><input type="text" id="iptDeleteLoginId" name="loginId" readonly>
@ -85,7 +96,8 @@
loginId: document.getElementById('iptCreateLoginId').value, loginId: document.getElementById('iptCreateLoginId').value,
password: document.getElementById('iptCreatePassword').value, password: document.getElementById('iptCreatePassword').value,
email: document.getElementById('iptCreateEmail').value, email: document.getElementById('iptCreateEmail').value,
name: document.getElementById('iptCreateEmail').value name: document.getElementById('iptCreateEmail').value,
roleId: document.getElementById('selCreateRole').value
}; };
const requestUri = /*[[@{/admin/management/create}]]*/ ''; const requestUri = /*[[@{/admin/management/create}]]*/ '';
@ -133,14 +145,16 @@
id: document.getElementById('iptUpdateId').value, id: document.getElementById('iptUpdateId').value,
password: document.getElementById('iptUpdatePassword').value, password: document.getElementById('iptUpdatePassword').value,
email: document.getElementById('iptUpdateEmail').value, email: document.getElementById('iptUpdateEmail').value,
name: document.getElementById('iptUpdateName').value name: document.getElementById('iptUpdateName').value,
roleId: document.getElementById('selUpdateRole').value
}; };
const requestUri = /*[[@{/admin/management/update}]]*/ ''; const requestUri = /*[[@{/admin/management/update}]]*/ '';
Reqhelper.reqPostJson(requestUri, data, () => { Reqhelper.reqPostJson(requestUri, data, () => {
PageHelper.showAlertModal({title: '수정 완료', message: '수정이 완료되었습니다.'}); PageHelper.showAlertModal({title: '수정 완료', message: '수정이 완료되었습니다.'});
}, () => { }, () => {
PageHelper.showErrorModal('수정에 실패했습니다.'); // PageHelper.showErrorModal('수정에 실패했습니다.');
alert('수정에 실패했습니다.');
}); });
}); });