홈페이지 게시판 순서변경

This commit is contained in:
pjs
2026-02-19 21:01:36 +09:00
parent ae1ac1ea0f
commit 836c8031c0
7 changed files with 303 additions and 7 deletions

View File

@@ -442,6 +442,76 @@ public class ContentsBbsController extends ManagerDraftAction {
return HttpUtil.makeHashToJsonModelAndView(map);
}
/**
* 출력순서 일괄 업데이트
*
* @param paramMap
* @param session
* @param request
* @param response
* @return
*/
@PostMapping(value = "/contentsBbs/updateOrdNo.do")
public ModelAndView updateOrdNo(@RequestBody HashMap<String, Object> paramMap, HttpSession session,
HttpServletRequest request, HttpServletResponse response) {
log.debug("ContentsBbsController updateOrdNo START");
HashMap<String, Object> map = new HashMap<String, Object>();
StringBuffer errorMsg = new StringBuffer();
try {
if (!webCheckLogin(session)) {
return null;
} else {
paramMap.put("loginMemberId", String.valueOf(session.getAttribute("loginMemberId")));
paramMap.put("modId", String.valueOf(session.getAttribute("loginMemberId")));
map = contentsBbsService.updateContentsBbsOrdNo(paramMap);
}
} catch (Exception e) {
e.printStackTrace();
errorMsg.append(e);
} finally {
if (Constants.OK == map.get("msgCode")) {
} else {
map.put("msgCode", Constants.FAIL);
map.put("success", false);
if (null == map.get("msgDesc") || ("").equals(map.get("msgDesc"))) {
map.put("msgDesc", "정상적으로 수행되지 않았습니다. 관리자에게 문의하시기 바랍니다.");
}
}
try {
HashMap<String, Object> visitLogParamMap = RequestLogUtil.getVisitLogParameterMap(request);
HashMap<String, Object> insertMap = new HashMap<String, Object>();
insertMap.put("url", "/contentsBbs/updateOrdNo.do");
insertMap.put("func", "updateOrdNo");
insertMap.put("funcName", "출력순서 변경");
insertMap.put("service", "contentsBbsService");
insertMap.put("serviceName", "출력순서 변경");
insertMap.put("requestValue", String.valueOf(paramMap));
insertMap.put("responseValue", String.valueOf(map));
insertMap.put("tId", map.get("tId"));
if ((String.valueOf(errorMsg)).equals("") || (String.valueOf(errorMsg) == null)
|| String.valueOf(errorMsg).length() == 0) {
insertMap.put("resultCode", "SUCCESS");
} else {
insertMap.put("resultCode", "ERROR");
}
insertMap.put("resultMsg", String.valueOf(errorMsg));
insertMap.put("muMemberId", paramMap.get("loginMemberId"));
webLogHistoryService.insertLogHistory(insertMap, visitLogParamMap);
} catch (Exception e) {
e.printStackTrace();
}
}
log.debug("ContentsBbsController updateOrdNo END");
return HttpUtil.makeHashToJsonModelAndView(map);
}
/**
* 시술 정보 리스트 조회 (option)
* 시술등록 팝업

View File

@@ -6,14 +6,24 @@ import java.util.HashMap;
public interface ContentsBbsService {
public HashMap<String, Object> selectListWebTreatmentPetitIntro(HashMap<String, Object> paramMap) throws Exception;
public HashMap<String, Object> getContentsBbsList(HashMap<String, Object> paramMap) throws Exception;
public HashMap<String, Object> getContentsBbs(HashMap<String, Object> paramMap) throws Exception;
public HashMap<String, Object> insertWebTreatmentPetitIntro(HashMap<String, Object> paramMap) throws Exception;
public HashMap<String, Object> putContentsBbs(HashMap<String, Object> paramMap, MultipartFile file, MultipartFile content_file) throws Exception;
public HashMap<String, Object> putContentsBbs(HashMap<String, Object> paramMap, MultipartFile file,
MultipartFile content_file) throws Exception;
public HashMap<String, Object> moveContentsBbs(HashMap<String, Object> paramMap) throws Exception;
public HashMap<String, Object> modContentsBbs(HashMap<String, Object> paramMap, MultipartFile file, MultipartFile content_file) throws Exception;
public HashMap<String, Object> modContentsBbs(HashMap<String, Object> paramMap, MultipartFile file,
MultipartFile content_file) throws Exception;
public HashMap<String, Object> delContentsBbs(HashMap<String, Object> paramMap) throws Exception;
public HashMap<String, Object> selectListTreatmentOption(HashMap<String, Object> paramMap) throws Exception;
public HashMap<String, Object> updateContentsBbsOrdNo(HashMap<String, Object> paramMap) throws Exception;
}

View File

@@ -930,4 +930,86 @@ public class ContentsBbsServiceImpl implements ContentsBbsService {
log.debug("WebTreatmentPetitServiceImpl selectListTreatmentOption END");
return map;
}
/**
* 출력순서 일괄 업데이트
*
* @param paramMap
* @return
* @throws Exception
*/
@Override
@Transactional(rollbackFor = { Exception.class }, propagation = Propagation.REQUIRES_NEW)
public HashMap<String, Object> updateContentsBbsOrdNo(
HashMap<String, Object> paramMap) throws Exception {
log.debug("ContentsBbsServiceImpl updateContentsBbsOrdNo START");
HashMap<String, Object> map = new HashMap<String, Object>();
try {
boolean check = true;
if (true == check) {
// 사용자 확인
List<Map<String, Object>> userListMap = webMemberSqlMapDAO.checkMember(paramMap);
int userListMapSize = userListMap.size();
if (1 == userListMapSize) {
paramMap.put("menuClassAuthId", userListMap.get(0).get("muAuthId"));
} else {
check = false;
map.put("msgCode", Constants.FAIL);
map.put("msgDesc", "사용자 정보가 올바르지 않습니다.");
}
}
if (true == check) {
// 권한 조회
HashMap<String, Object> authCheckParamMap = new HashMap<String, Object>();
authCheckParamMap.put("menuClass", paramMap.get("menuClass"));
authCheckParamMap.put("muAuthId", paramMap.get("menuClassAuthId"));
List<Map<String, Object>> authMenuRelationlistMap = webAuthMenuRelationSqlMapDAO
.selectAuthMenuRelation(authCheckParamMap);
int authMenuRelationlistMapSize = authMenuRelationlistMap.size();
if (1 == authMenuRelationlistMapSize) {
if (("Y").equals(authMenuRelationlistMap.get(0).get("updateUseYn"))) {
} else {
check = false;
map.put("msgCode", Constants.FAIL);
map.put("msgDesc", "수정 권한 정보가 없습니다.");
}
} else {
check = false;
map.put("msgCode", Constants.FAIL);
map.put("msgDesc", "권한 정보가 없습니다.");
}
}
if (true == check) {
List<Map<String, Object>> orderList = (List<Map<String, Object>>) paramMap.get("orderList");
int updCnt = 0;
for (Map<String, Object> item : orderList) {
HashMap<String, Object> updateParam = new HashMap<String, Object>();
updateParam.put("categoryDivCd", paramMap.get("categoryDivCd"));
updateParam.put("categoryNo", item.get("categoryNo"));
updateParam.put("postNo", item.get("postNo"));
updateParam.put("ordNo", item.get("ordNo"));
updateParam.put("modId", paramMap.get("loginMemberId"));
cmmnDAO.update("ContentsBbsSql.updateContentsBbsOrdNo", updateParam);
updCnt++;
}
map.put("msgCode", Constants.OK);
map.put("msgDesc", updCnt + "건 순서가 변경되었습니다.");
}
} catch (Exception e) {
e.printStackTrace();
throw e;
}
log.debug("ContentsBbsServiceImpl updateContentsBbsOrdNo END");
return map;
}
}

View File

@@ -38,6 +38,7 @@
,HC.CATEGORY_NO
,HCB.THUMBNAIL_BOTTOM_TXT
,HCB.HASHTAG
,HCB.ORD_NO
,DATE_FORMAT(HCB.REG_DATE, '%Y-%m-%d') as REG_DT
,MM.NAME as REG_NM
,DATE_FORMAT(HCB.EVENT_START_DT, '%Y-%m-%d') as START_DT
@@ -65,7 +66,7 @@
ORDER BY ${webTreatmentPetitSort}
</when>
<otherwise>
ORDER BY CATEGORY_NO, POST_NO ASC
ORDER BY HCB.ORD_NO DESC
</otherwise>
</choose>
LIMIT 18446744073709551615
@@ -315,4 +316,16 @@
AND HC.CATEGORY_DIV_CD = #{categoryDivCd}
ORDER BY HC.CATEGORY_NO ASC
</select>
<update id="updateContentsBbsOrdNo" parameterType="hashmap">
/** ContentsBbsSql.updateContentsBbsOrdNo **/
UPDATE HP_CONTENTS_BBS
SET ORD_NO = #{ordNo}
,MOD_ID = #{modId}
,MOD_DATE = NOW()
WHERE USE_YN = 'Y'
AND CATEGORY_DIV_CD = #{categoryDivCd}
AND CATEGORY_NO = #{categoryNo}
AND POST_NO = #{postNo}
</update>
</mapper>

View File

@@ -391,6 +391,58 @@ function fn_deleteWebTreatmentPetit() {
});
}
/****************************************************************************
* 출력순서 저장
****************************************************************************/
function fn_saveOrdNo() {
if ("Y" != updateUseYn) {
modalEvent.warning("", "수정 권한이 없습니다.");
return false;
}
let orderList = [];
let totalRows = webTreatmentPetitGridOptions.api.getDisplayedRowCount();
for (let i = 0; i < totalRows; i++) {
let rowNode = webTreatmentPetitGridOptions.api.getDisplayedRowAtIndex(i);
orderList.push({
categoryNo: rowNode.data.categoryNo,
postNo: rowNode.data.postNo,
ordNo: totalRows - i // 상단이 큰 값 (DESC 정렬)
});
}
modalEvent.info("순서저장", "변경된 출력순서를 저장하시겠습니까?", function () {
let data = {
menuClass: menuClass,
categoryDivCd: categoryDivCd,
orderList: orderList
};
$.ajax({
url: encodeURI('/contentsBbs/updateOrdNo.do'),
data: JSON.stringify(data),
dataType: "json",
contentType: 'application/json; charset=utf-8',
type: 'POST',
async: true,
success: function (data) {
if ('0' == data.msgCode) {
modalEvent.success("순서저장 성공", data.msgDesc, function () {
$("#btnSaveOrdNo").prop("disabled", true).css("opacity", "0.5");
fn_selectListWebTreatmentPetitJson();
});
} else {
modalEvent.danger("순서저장 오류", data.msgDesc);
}
},
error: function (xhr, status, error) {
modalEvent.danger("순서저장 오류", "순서 저장 중 오류가 발생하였습니다. 잠시후 다시시도하십시오.");
}
});
});
}
/****************************************************************************
* 검색 엔터 이벤트
****************************************************************************/
@@ -504,7 +556,7 @@ function fn_updateWebTreatmentPetitIntro(postNo, categoryNo) {
let webTreatmentPetitColumnDefs = [
{ field: "checkbox", headerName: "", minWidth: 55, maxWidth: 55, headerCheckboxSelection: true, checkboxSelection: true },
{ field: "checkbox", headerName: "", minWidth: 55, maxWidth: 55, rowDrag: true, headerCheckboxSelection: true, checkboxSelection: true },
{ field: "rowNum", headerName: "번호", minWidth: 60, maxWidth: 60, sortable: false, cellStyle: { textAlign: 'center' } },
{ field: "categoryNm", headerName: "카테고리", minWidth: 120, maxWidth: 130, cellStyle: { textAlign: 'center' } },
{ field: "title", headerName: "제목", minWidth: 150, cellStyle: { cursor: 'pointer', color: '#3985EA' } },
@@ -517,7 +569,7 @@ let webTreatmentPetitColumnDefs = [
console.log('Current categoryDivCd:', categoryDivCd);
if (categoryDivCd === '02' || categoryDivCd === '04') {
webTreatmentPetitColumnDefs = [
{ field: "checkbox", headerName: "", minWidth: 55, maxWidth: 55, headerCheckboxSelection: true, checkboxSelection: true },
{ field: "checkbox", headerName: "", minWidth: 55, maxWidth: 55, rowDrag: true, headerCheckboxSelection: true, checkboxSelection: true },
{ field: "rowNum", headerName: "번호", minWidth: 60, maxWidth: 60, sortable: false, cellStyle: { textAlign: 'center' } },
{ field: "categoryNm", headerName: "카테고리", minWidth: 120, maxWidth: 130, cellStyle: { textAlign: 'center' } },
{ field: "title", headerName: "제목", minWidth: 150, cellStyle: { cursor: 'pointer', color: '#3985EA' } },
@@ -533,6 +585,8 @@ if (categoryDivCd === '02' || categoryDivCd === '04') {
// let the grid know which columns and what data to use
let webTreatmentPetitGridOptions = {
suppressRowTransform: true,
rowDragManaged: true,
animateRows: true,
columnDefs: webTreatmentPetitColumnDefs,
defaultColDef: { // 리스트 기본 설정
flex: 1,
@@ -562,6 +616,10 @@ let webTreatmentPetitGridOptions = {
fn_updateWebTreatmentPetitIntro(cell.data.postNo, cell.data.categoryNo);
}
},
onRowDragEnd: function (event) {
// 드래그 완료 시 순서저장 버튼 활성화
$("#btnSaveOrdNo").prop("disabled", false).css("opacity", "1");
},
onSelectionChanged: function (treatmentpetit) { //체크박스 선택
delList = treatmentpetit.api.getSelectedRows();
console.log(delList);
@@ -679,6 +737,11 @@ function fn_pageTreatmentPetit() {
fn_deleteWebTreatmentPetit();
});
// 순서저장 버튼
$("#btnSaveOrdNo").click(function () {
fn_saveOrdNo();
});
// 기간 선택 콤보 이벤트
const target = $("#webTreatmentPetitSearchDateType").siblings("ul.select_option_list");
target.find("li.option_list_item").click(function () {

View File

@@ -73,6 +73,10 @@
</div>
<div class="right_btn_box">
<button id="btnSaveOrdNo" class="treatmentpetit_btn" disabled
style="opacity: 0.5; margin-right: 5px;">
<img src="/image/web/notice_btn_icon.svg" alt="순서저장">순서저장
</button>
<button id="btnInsertWebTreatmentPetit" class="treatmentpetit_btn">
<img src="/image/web/notice_btn_icon.svg" alt="등록">등록
</button>
@@ -98,7 +102,7 @@
</th:block>
<th:block layout:fragment="layout_script">
<script src="/js/web/ag-grid-community-29.3.5.min.js"></script>
<script src="/js/web/contentsBbs/ContentsBbsSelectList.js?v=3"></script>
<script src="/js/web/contentsBbs/ContentsBbsSelectList.js?v=4"></script>
</th:block>
</html>