스프링부트+jsp로 배달사이트 만들기-29 관리자페이지(메뉴 삭제,수정, 답장하기)

2021. 12. 17. 15:23스프링부트

메뉴 수정하기

 

메뉴 수정 메서드를 추가합니다

@IsMyStore
@PatchMapping("/admin/management/menu")
public ResponseEntity<Food> updateMenu(Food food, String[] foodOption, Integer[] foodOptionPrice, Integer[] optionId, MultipartFile file) throws IOException {
	
	System.out.println(food);
	if(file.isEmpty()) {
		String img = File.separator + "img" + File.separator + "none.gif";
		food.setFoodImg(img);
		food.setFoodThumb(img);
	} else {
		String img = uploadFile.fildUpload(file);
		food.setFoodImg(img);
		food.setFoodThumb(img);
	}
	
	adminService.updateMenu(food, foodOption, foodOptionPrice, optionId);
	return new ResponseEntity<Food>(food, HttpStatus.OK);
}

addMenu()와 같지만 옵션이 있을 수 있기 때문에 Integer[] optionId를 추가했습니다

 

AdminServiceImp

@Transactional
@Override
public void updateMenu(Food food, String[] foodOption, Integer[] foodOptionPrice, Integer[] optionId) {
	Map<String, Object> map = new HashMap<>();
	if(foodOption == null) {
		adminDAO.deleteMenuOption(food.getId());
	} else {
		List<Map<String, Object>> optionList = new ArrayList<>();
		
		for(int i=0;i<foodOption.length;i++) {
			Map<String, Object> optionMap = new HashMap<>();
			long oid = -1;
			if(optionId.length != 0 && optionId[i] != null) {
				oid = optionId[i];
			}
			
			optionMap.put("optionId", oid);
			optionMap.put("optionName", foodOption[i]);
			optionMap.put("optionPrice", foodOptionPrice[i]);
			
			optionList.add(optionMap);
		}
		
		map.put("optionList", optionList);
	}
	map.put("food", food);
	adminDAO.updateMenu(map);
}

트랜잭션 처리를 위해 @Transactional를 붙여 주었습니다

옵션이 하나도 없을 경우 deleteMenuOption을 실행해 모든 옵션을 삭제합니다

 

옵션배열이 있는 경우엔 optionId가 있는 경우와 없는 경우로 나뉘어집니다

opionId가 있는 경우는 기존 메뉴에 옵션이 있을 때 이고 optionId가 없는 경우는 옵션 추가하기 버튼을 눌러 새로운 옵션을 추가했을 때 입니다

 

 optionId가 없다면 -1로 초기화하고 가격,이름담은 map을 list에 추가합니다

optionList와 food를 map에 담아 updateMenu()를 실행합니다

 

AdminDAOImp

@Override
public void updateMenu(Map<String, Object> map) {
	sql.update("admin.updateMenu", map);
}

 

AdminMapper

<delete id="deleteMenuOption">
	DELETE BM_FOOD_OPTION WHERE FOOD_ID = #{foodId }
</delete>

 

updateMenu의 경우엔 delete, update, inseret를 한꺼번에 처리해야 했기 때문에 pl/sql을 사용하였습니다

<update id="updateMenu">
DECLARE BEGIN
	UPDATE	BM_FOOD 
	SET		STORE_ID = #{food.storeId }
			,FOOD_NAME = #{food.foodName }
			,FOOD_PRICE = #{food.foodPrice }
			,FOOD_DEC = #{food.foodDec }
			,FOOD_IMG = #{food.foodImg }
			,FOOD_THUMB = #{food.foodThumb }
	WHERE	ID = #{food.id };

	<if test="optionList != null">
		DELETE BM_FOOD_OPTION WHERE FOOD_ID = #{food.id } AND ID NOT IN
	<foreach collection="optionList" item="item" open="(" close=");" separator=","  >
		${item.optionId }
	</foreach>
	
	<foreach collection="optionList" item="item" separator=";" close=";">
		<if test="item.optionId == -1">
			INSERT INTO	BM_FOOD_OPTION
			VALUES		(GET_OPTION_SEQ()
						,#{food.id }
						,#{item.optionName }
						,#{item.optionPrice }) 
		</if>
		
		<if test="item.optionId != -1">
			UPDATE	BM_FOOD_OPTION 
			SET		OPTION_NAME = #{item.optionName }
					,OPTION_PRICE = #{item.optionPrice }
			WHERE	FOOD_ID = #{food.id }
			AND		ID = #{item.optionId }		
		</if>
	</foreach>
	</if>
	
END;	
</update>

 

 

 

 

 


메뉴 삭제하기

 

메뉴 삭제 메서드를 추가합니다

@IsMyStore
@DeleteMapping("/admin/management/menu")
public ResponseEntity<Object> deleteMenu(long storeId, long[] deleteNumber) {
	adminService.deleteMenu(storeId, deleteNumber);
	return new ResponseEntity<>(HttpStatus.OK);
}

 

AdminServiceImp

@Override
public void deleteMenu(long storeId, long[] deleteNumber) {
	adminDAO.deleteMenu(storeId, deleteNumber);
}

 

AdminDAOImp

@Override
public void deleteMenuOption(long foodId) {
	sql.delete("admin.deleteMenuOption", foodId);
}

 

AdminMapper

<delete id="deleteMenu">
	DELETE BM_FOOD WHERE STORE_ID = ${storeId } AND ID IN 
	<foreach collection="deleteNumber" item="arr" open="(" close=")" separator="," >
		${arr }
	</foreach>
</delete>

 

 

 


댓글 답장하기

 

댓글 답장하기 메서드를 추가합니다

@IsMyStore
@PatchMapping("/admin/management/bossComment")
public ResponseEntity<String> bossComment(long storeId, String orderNum, String bossComment, HttpServletResponse response) throws IOException {
	String reviewContent = adminService.bossComment(storeId, orderNum, bossComment);
	return new ResponseEntity<String>(reviewContent, HttpStatus.OK);
}

 

adminDetail.js의 답장 등록하기 함수 ajax type을 수정합니다

 

 

AdminServiceImp

@Override
public String bossComment(long storeId, String orderNum, String bossComment) {
	bossComment = bossComment.replace("\n","<br>").replaceAll(" ", "&nbsp");
	adminDAO.bossComment(storeId, orderNum, bossComment);
	return bossComment; 
}

텍스트 에어리어의 값을 db에 저장하게 되면 줄바꿈은 무시되고 db에서 값을 불러올때 여러번의 띄어쓰기는 1번으로 변환 됩니다 그래서 저장하기 전에 댓글 내용의 개행문자를 <br>태그로, 띄어쓰기를 &nbsp로 변환 후 db에 저장합니다

 

AdminDAOImp

@Override
public void bossComment(long storeId, String orderNum, String bossComment) {
	Map<String, Object> map = new HashMap<>();
	map.put("storeId", storeId);
	map.put("bossComment", bossComment);
	map.put("orderNum", orderNum);
	sql.update("admin.bossComment", map);
}

 

AdminMapper

<update id="bossComment">
	UPDATE BM_REVIEW SET
		BOSS_COMMENT = #{bossComment }
	WHERE
		ORDER_NUM = #{orderNum }
	AND
		STORE_ID = #{storeId }
</update>