mpay
테이블에 저장된다.마이페이지의 결제내역 섹션은 위와 같은 프로세스로 작동하도록 설계하였다.
<select id="sel">
<th:block th:if="${payType == null}">
<option value="all" selected>전체</option>
<option value="membership">회원권</option>
<option value="daily">일일권</option>
<option value="pt">PT</option>
</th:block>
<th:block th:unless="${payType == null}">
<th:block th:switch="${payType}">
<th:block th:case="gpay">
<option value="all">전체</option>
<option value="membership" selected>회원권</option>
<option value="daily">일일권</option>
<option value="pt">PT</option>
</th:block>
<th:block th:case="dgpay">
<option value="all">전체</option>
<option value="membership">회원권</option>
<option value="daily" selected>일일권</option>
<option value="pt">PT</option>
</th:block>
<th:block th:case="tpay">
<option value="all">전체</option>
<option value="membership">회원권</option>
<option value="daily">일일권</option>
<option value="pt" selected>PT</option>
</th:block>
</th:block>
</th:block>
</select>
이런식으로..! selected에 따라 다른 페이지로 이동이 돼서 케이스별로 메뉴를 전부 다 적어줘야했다..ㅠ
<div id="content" class="content">
<div class="content-all">
<table style="width: 100%", id="mtable">
<tbody>
<thead>
<tr>
<th>결제일</th>
<th>헬스장</th>
<th>트레이너</th>
<th>이용기간</th>
<th>가격</th>
<th>후기</th>
</tr>
</thead>
<tbody id="tb">
<div th:unless="${#lists.isEmpty(mPList)}">
<div th:each=" MPitem,status: ${mPList}">
<tr class="payNreview">
<td th:text="${MPitem.mpaydate}"></td>
<td th:text="${MPitem.mpaygym}"></td>
<td th:text="${MPitem.trainername}"></td>
<td th:text="${MPitem.mpayperiod}"></td>
<td th:text="${#numbers.formatInteger(MPitem.mpayprice, 3, 'COMMA') + '원'}"></td>
</tr>
</div>
</div>
<div th:if="${#lists.isEmpty(mPList)}">
<td colspan="6">결제 내역이 없습니다.</td>
</div>
</tbody>
</table>
</div>
</div>
<div class="paging-area">
<div class="paging" th:utext="${paging}"></div>
</div>
결제내역은 테이블 형식으로 불러온다.
원래는 후기를 등록하거나 삭제하는 후기관련 코드도 있는데 너무 길어져서..생략!
<script th:inline="javascript">
//셀렉트박스 선택
$("#sel").change(function () {
let select = $("#sel").val();
console.log(select); //daily, membership, pt
let mpayType = "";
if (select === "daily") {
mpayType = "dgpay";
} else if (select === "membership") {
mpayType = "gpay";
} else if (select === "pt") {
mpayType = "tpay";
}
sendObj = { "mpayType": mpayType,
"membernum": [[${member.membernum}]],
"pageNum": 1
};
console.log(sendObj);
//controller에 전송(ajax)
$.ajax({
url: "myPayList",
type: "post",
data: JSON.stringify(sendObj),
contentType: "application/json",
success: function (res) {
let mPList = res.mPList;
console.log(mPList);
let paging = res.paging;
console.log(paging);
$(".paging").html(paging);
let ritem = res.rList;
console.log(ritem);
// let mpaynumR = ritem.mpaynum;
// console.log(mpaynumR);
if (res != null && mPList.length != 0) {
// 서버에서 받은 데이터를 처리하고 출력하는 로직을 여기에 작성
// 예시: 테이블의 tbody에 결과 데이터를 추가하는 방식으로 출력
var tbody = $("#tb");
console.log(tbody);
tbody.empty(); // 기존 데이터 삭제
for (var i = 0; i < mPList.length; i++) {
var mpayItem = mPList[i];
var member = [[${session.member}]];
var row = "<tr class='payNreview'>" +
"<td>" + mpayItem.mpaydate + "</td>" +
"<td>" + mpayItem.mpaygym + "</td>" +
"<td>" + mpayItem.trainername + "</td>" +
"<td>" + mpayItem.mpayperiod + "</td>" +
"<td>" + mpayItem.mpayprice.toLocaleString('ko-KR') + '원' + "</td>";
tbody.append(row);
}
} else {
var tbody = $("#tb");
tbody.empty(); // 기존 데이터 삭제
var row = "<tr>" +
"<td colspan='5'>" + "결제 내역이 없습니다." + "</td>" +
"</tr>";
tbody.append(row);
}
},
error: function (err) {
console.log(err);
alert("오류가 발생했습니다.");
}
});
});
</script>
여기에도 후기등록 및 삭제 관련 이벤트가 포함되어 있는데 생략했다.
mpayType
자바스크립트는 위와 같은 이벤트를 처리하고 ajax로 컨트롤러에 값을 넘겨준다.
그럼 이제 컨트롤러에서는 이 값들을 어떻게 처리할까?
컨트롤러 속으로 고고! 고고!
(추억의 개콘 고고 예술속으로...)
//결제 내역 가져오기
@GetMapping("myPayList")
public ModelAndView mPay(SearchDto search, HttpSession session){
log.info("myPayList()");
mv = mServ.mPay(search,session);
return mv;
}
마이페이지에서 결제내역 메뉴를 눌렀을 때 회원정보를 기준으로 전체 결제내역을 보여주는 메소드
//결제내역 조회(회원권, 일일권, PT)
@PostMapping("myPayList")
@ResponseBody
public Map<String, Object> selectedMpay(@RequestBody SearchDto search){
log.info("selectedMpay()");
Map<String, Object> rmap = mServ.selectedMpay(search);
return rmap;
}
회원권, 일일권 등 메뉴를 선택했을 때 정보를 필터링하여 내보내는 메소드
public ModelAndView mPay(SearchDto search, HttpSession session) {
log.info("GetMypayList()");
mv = new ModelAndView();
int num = search.getPageNum();
// limit 0, 5 - 1페이지
//출력할 게시물 수가 설정되지 않으면 기본값(5)로 설정
if (search.getListCnt() == 0) {
search.setListCnt(listCnt);
}
if(num == 0) num = 1;
search.setPageNum((num - 1) * search.getListCnt()); // 보여질 게시글 목록의 수
//결제내역 가져오기
List<MPayDto> mPList = mDao.GetMypayList(search);
//회원정보 가져오기
MemberDto member = mDao.selectMemberSearch(search);
mv.addObject("mPList", mPList);
mv.addObject("member", member);
//페이징 처리
search.setPageNum(num);
String pageHtml = null;
String payKind = null;
if(search.getMpayType() == null || search.getMpayType().equals("")){
pageHtml = getPaging(search);
}else {
pageHtml = getMpayPaging(search);
payKind = search.getMpayType();
}
mv.addObject("paging", pageHtml);
mv.addObject("payType", payKind);
//세션에 필요 정보 저장(pageNum)
session.setAttribute("pageNum", num);
mv.setViewName("myPayList");
return mv;
}
전체 결제내역만 가져오는 건 비교적 간단하다.
페이징 처리하고, 결제내역 가져오고, 회원정보 가져오고...
필요한 것들 다 가져왔으면 ModelAndView
에 담고..
세션에 페이징 넘버 저장하고..
뷰 설정하고 리턴!
그럼 이제 선택 옵션을 추가하면 어떻게 될까?
//결제내역 조회(회원권, 일일권, PT)
public Map<String, Object> selectedMpay(SearchDto search) {
log.info("selectedMpay()");
List<MPayDto> mPList = null;
Map<String, Object> rmap = new HashMap<>();
int num = search.getPageNum();
//출력할 게시물 수가 설정되지 않으면 기본값(5)로 설정
if (search.getListCnt() == 0) {
search.setListCnt(listCnt);
}
if(num == 0) num = 1;
search.setPageNum((num - 1) * search.getListCnt());
try{
mPList = mDao.selectedMpay(search);
rmap.put("mPList", mPList);
//페이징
search.setPageNum(num);
String pageHtml = getMpayPaging(search);
rmap.put("paging", pageHtml);
}
} catch (Exception e){
e.printStackTrace();
}
return rmap;
메뉴에 맞게 결제내역을 가져오는 건 살짝 더 복잡하다.
필요한 것들 가져오고 리턴시켜주는 건 동일한데,
Map
으로 받아서 그 안에 결제내역, 페이징 넘버, 리뷰를 담아 리턴한다.
비동기방식 ajax로 데이터를 넘기기 때문에 셀렉트박스에서 메뉴를 선택하면 화면전환없이 실시간으로 메뉴에 맞게 결과가 바뀐다.
결제한 적 없는 일일권을 선택했더니 정상적으로 결제 내역이 없다고 뜬다.
//회원 결제내역 가져오기
<select id="GetMypayList" resultType="MPayDto" parameterType="SearchDto">
select * from MPay where membernum=#{membernum}
<if test="mpayType != null">
and mpaynum like concat(#{mpayType},'%')
</if>
LIMIT #{pageNum}, #{listCnt}
</select>
//회원 정보 가져오기
<select id="selectMemberSearch" resultType="MemberDto" parameterType="SearchDto">
select * from member where membernum=#{membernum}
</select>
//메뉴 선택에 따라 결제내역 가져오기
<select id="selectedMpay" resultType="MPayDto" parameterType="SearchDto">
select * from mpay
where membernum = #{membernum} and mpaynum like concat(#{mpayType},'%')
LIMIT #{pageNum}, #{listCnt}
</select>
결제번호인 mpaynum
은 운동권 종류에 따라 형식이 달라져서 운동권을 기준으로 mpayType
을 설정해주었다.
페이징과 리뷰 메소드 처리한 것도 포함되어야 하는데 여기에서는 결제내역 위주의 메소드를 보여주고, 다음 포스팅에서는 페이징과 리뷰 관련 메소드를 다루겠습니다.😊~
2023.08.14 작성