15. 백오피스

kdew0308·2023년 4월 26일
0

학습 관리 시스템

목록 보기
14/17
post-thumbnail

1. 강좌신청 처리

1-1) 기본 뼈대

1) AdminTakeCourseController.java 생성

@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";
    }


}

TakeCourseService.java 생성

List<TakeCourseDto> list(TakeCourseParam parameter);

TakeCourseServiceImpl.java 생성

@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;
    }
}

TakeCourseMapper.java 생성

@Mapper
public interface TakeCourseMapper {

    long selectListCount(TakeCourseParam parameter); // 멤버 수 구하기
    List<TakeCourseDto> selectList(TakeCourseParam parameter);
}

TakeCourseMapper.xml 생성

<?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>

TakeCourseDto.java

@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;
}

list.html 생성

<!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>



2-2). 서버에서 받기

1) AdminTakeCourseController.java 추가

@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";
    }

2) TakeCourseService.java 추가

ServiceResult updateStatus(long id, String status);

3) TakeCourseServiceImpl implements.java 추가

@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);
    }

4) ServiceResult.java 추가

public ServiceResult() {
    }

    public ServiceResult(boolean result, String message) {
        this.result = result;
        this.message = message;
    }

    public ServiceResult(boolean result) {
        this.result = result;
    }

5) TakeCourseParam.java 추가

String status;

에러가 발생한다면 에러 페이지로 이동

2-3) 등록일 다듬기

1) TakeCourseDto.java 추가

public String getRegDtText() {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy.MM.dd HH.mm");
        return regDt != null ? regDt.format(formatter) : "";
    }

2) list.html 수정

<p th:text="${x.RegDtText}">2021.01.01</p>

등록일 부분 수정

0개의 댓글

관련 채용 정보