@RequiredArgsConstructor
@Controller
public class AdminTakeCourseController extends BaseController{
private final TakeCourseService takeCourseService;
@GetMapping("/admin/takecourse/list.do")
public String list(Model model, TakeCourseParam parameter) {
parameter.init();
List<TakeCourseDto> courseList = takeCourseService.list(parameter);
long totalCount = 0;
if (courseList != null && courseList.size() > 0) {
totalCount = courseList.get(0).getTotalCount();
}
String queryString = parameter.getQueryString();
String pagerHtml = getPaperHtml(totalCount,parameter.getPageSize(), parameter.getPageIndex(), queryString);
model.addAttribute("list", courseList);
model.addAttribute("totalCount", totalCount);
model.addAttribute("pager", pagerHtml);
return "admin/takecourse/list";
}
}
List<TakeCourseDto> list(TakeCourseParam parameter);
@RequiredArgsConstructor
@Service
public class TakeCourseServiceImpl implements TakeCourseService{
private final TakeCourseMapper takeCourseMapper;
@Override
public List<TakeCourseDto> list(TakeCourseParam parameter) {
long totalCount = takeCourseMapper.selectListCount(parameter);
List<TakeCourseDto> list = takeCourseMapper.selectList(parameter);
if (!CollectionUtils.isEmpty(list)) {
int i = 0;
// 리스트가 비어있지 않으면
for (TakeCourseDto x : list) {
x.setTotalCount(totalCount);
x.setSeq(totalCount - parameter.getPageStart() - i);
i++;
}
}
return list;
}
}
@Mapper
public interface TakeCourseMapper {
long selectListCount(TakeCourseParam parameter); // 멤버 수 구하기
List<TakeCourseDto> selectList(TakeCourseParam parameter);
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.kdew.dewlms.course.mapper.TakeCourseMapper">
<sql id="selectListWhere">
</sql>
<select id="selectListCount"
parameterType="com.kdew.dewlms.course.model.CourseParam"
resultType="long">
SELECT count(*)
FROM take_course
WHERE 1 = 1
<include refid="selectListWhere"></include>
</select>
<select id="selectList"
parameterType="com.kdew.dewlms.course.model.TakeCourseParam"
resultType="com.kdew.dewlms.course.dto.TakeCourseDto">
SELECT tc.*, c.subject, m.user_name, m.phone
FROM take_course tc
JOIN course c ON tc.course_id = c.id
JOIN member m ON tc.user_id = m.user_id
WHERE 1=1
ORDER BY reg_dt DESC
limit #{pageStart}, #{pageEnd}
</select>
</mapper>
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Entity
@Data
public class TakeCourseDto {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
Long id;
long courseId;
String userId;
long payPrice; // 결제 금액(할인된 금액으로)
String status; // 상태(수강신청,결제완료, 수강취소)
LocalDateTime regDt; // 신청일
// Join
String userName;
String phone;
String subject;
// 추가 컬럼
long totalCount;
long seq;
}
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>관리자 화면</title>
<style>
.list table {
margin-top: 20px;
width: 100%;
border-collapse: collapse;
}
.list table th, .list table td {
border: solid 1px #000;
}
p.nothing {
text-align: center;
padding: 100px;
}
.pager {
margin-top: 20px;
text-align: center;
}
.pager a.on {
font-weight: bold;
color: red;
}
.list .buttons {
position: relative;
padding: 10px 0;
}
.list .buttons a, .list .buttons button {
border-width: 0;
background-color: transparent;
text-decoration: underline;
font-size: 14px;
line-height: 20px;
height: 20px;
color: #000;
cursor: pointer;
}
.list .buttons .total-count {
text-align: right;
}
.list .row-buttons {
text-align: center;
}
</style>
<script src="https://code.jquery.com/jquery-3.6.4.min.js" integrity="sha256-oP6HI9z1XaZNBrJURtCoUT5SUnxFr8s3BzRl+cbzUq8=" crossorigin="anonymous"></script>
<script>
$(document).ready(function () {
$('.row-buttons button').on('click', function () {
var status = $(this).val();
var id = $(this).closest('div').find('input[name=id]').val();
var msg = status == 'COMPLETE' ? '결제완료 처리 하시겠습니까?' : '수강취소 처리 하시겠습니까?';
if (!confirm(msg)) {
return false;
}
var $procForm = $('#procForm');
$procForm.find('input[name=id]').val(id);
$procForm.find('input[name=status]').val(status);
$procForm.submit();
});
});
</script>
</head>
<body>
<h1>수강 관리</h1>
<div th:replace="/fragments/layout.html :: fragment-admin-body-menu"></div>
<div class="list">
<div class="buttons">
<p class="total-count">전체 <span th:text="${totalCount}"></span>개</p>
</div>
<table>
<thead>
<tr>
<th> NO </th>
<th>
등록일
</th>
<th>
강좌명
</th>
<th colspan="3">
신청인
</th>
<th>
상태
</th>
<th>
비고
</th>
</tr>
</thead>
<tbody id="dataList">
<tr th:each="x : ${list}">
<td th:text="${x.seq}">1</td>
<td>
<p th:text="${x.regDt}">2021.01.01</p>
</td>
<td>
<p th:href="'edit.do?id=' + ${x.id}" th:text="${x.subject}">강좌명</p>
</td>
<td>
<p th:text="${x.userName}"></p>
</td>
<td>
<p th:text="${x.userId}"></p>
</td>
<td>
<p th:text="${x.phone}"></p>
</td>
<td>
<p th:if="${x.status eq 'REQ'}">수강신청</p>
<p th:if="${x.status eq 'COMPLETE'}">결제완료</p>
<p th:if="${x.status eq 'CANCEL'}">수강취소</p>
</td>
<td>
<div class="row-buttons" th:if="${x.status eq 'REQ'}">
<input type="hidden" name="id" th:value="${x.id}">
<button value="COMPLETE" type="button"> 결제완료 처리 </button>
<button value="CANCEL" type="button"> 수강취소 처리 </button>
</div>
</td>
</tr>
</tbody>
</table>
<div class="pager" th:utext="${pager}"></div>
</div>
<form id="procForm" method="post" action="/admin/takecourse/status.do">
<input type="hidden" name="id">
<input type="hidden" name="status">
</form>
</body>
</html>
@GetMapping("/admin/takecourse/list.do")
public String list(Model model, TakeCourseParam parameter) {
ServiceResult result = takeCourseService.updateStatus(parameter.getId(), parameter.getStatus());
if (!result.isResult()) {
model.addAttribute("message", result.getMessage());
return "common/error";
}
return "redirect:/admin/takecourse/list.do";
}
ServiceResult updateStatus(long id, String status);
@Override
public ServiceResult updateStatus(long id, String status) {
Optional<TakeCourse> optionalTakeCourse = takeCourseRepository.findById(id);
if (optionalTakeCourse.isPresent()) {
return new ServiceResult(false,"수강 정보가 존재하지 않습니다.");
}
TakeCourse takeCourse = optionalTakeCourse.get();
takeCourse.setStatus(status);
takeCourseRepository.save(takeCourse);
return new ServiceResult(true);
}
public ServiceResult() {
}
public ServiceResult(boolean result, String message) {
this.result = result;
this.message = message;
}
public ServiceResult(boolean result) {
this.result = result;
}
String status;
에러가 발생한다면 에러 페이지로 이동
public String getRegDtText() {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy.MM.dd HH.mm");
return regDt != null ? regDt.format(formatter) : "";
}
<p th:text="${x.RegDtText}">2021.01.01</p>
등록일 부분 수정