오늘은 포인트 적립,사용 내역을 보여주는 페이지와 지금까지 작성한 리뷰를 관리할수 있는
페이지를 구현해보겠습니다 일단 여기까지 진행하면서 수정사항도 많고 빠진 부분도 있어서
지금까지 진행하면서 생성한 모든 css, js, jsp 파일을 올려두었습니다
기존 파일에 덮어쓰기 하시면 됩니다. 이번 포스팅에서 진행할 point, myPage, myReview도
포함되어 있습니다 크게 바뀐건 없고 js에서 리뷰수정 관련코드 몇가지를 수정하였습니다
시작하기전에 기존 StoreService에 reviewModify메서드를 수정해주세요
//리뷰수정
@Transactional
public boolean reviewModify(ReviewDto reviewDto) {
if(reviewDto.getFile() == null) {
if(reviewDto.getReviewImg() == null || reviewDto.getReviewImg()=="")
reviewDto.setReviewImg("");
}
else {
if(!fileUpload.uploadReviewImg(reviewDto))
return false;
}
storeMapper.reviewModify(reviewDto);
return true;
}
utils패키지안에 FileUpload.java에서 제일 밑 setReviewImg 부분을 수정해주세요
//기존
reviewDto.setReviewImg("upload\\"+imageUploadForder+"\\"+reviewImgName);
//수정
reviewDto.setReviewImg("\\upload\\"+imageUploadForder+"\\"+reviewImgName);
reviewModify메서드를 수정한 이유는 확인해보니 이미지를 첨부한 리뷰를
수정할때 이미지는 그대로 놔두고 다른부분만 수정하게 되면 이미지가 삭제되는 오류가
있었습니다 그 이유는 이미지를 업로드 할때는 MultipartFile을 이용하는데
이미지를 화면에 뿌려줄때는 서버에 저장된 이미지 주소를 img src를 사용하여 보여주고
있었습니다. 따라서 이미지가 첨부된 리뷰를 수정하게 되면 당연히 MultipartFile은
존재하지 않기 때문에 reviewDto.getFile() == null
을 타고
reviewDto.setReviewImg("");
로 이미지가 저장된 주소를 지워버리고 있었습니다
따라서 if(reviewDto.getReviewImg() == null || reviewDto.getReviewImg()=="")
를
추가해 MultipartFile이 존재하지 않을시(이미지를 교체하지 않았을경우)
ReviewImg에 주소가 존재하는지 확인해서 주소가 존재하지 않는다면
리뷰이미지를 삭제했거나 리뷰이미지를 등록하지 않은 리뷰이므로 주소를 비우고
ReviewImg가 존재하는 경우 리뷰이미지가 존재하지만 이미지교체를 하지 않은 경우이므로
기존 ReviewImg를 유지하도록 하였습니다
FileUpload.java에서 앞에 역슬래시만 추가해줬습니다. 역슬래시를 추가하지 않을 경우
서버 최상위 주소가 아닌 현재 페이지에 이미지주소를 붙여 정상출력되지 않습니다
무슨소리냐면 앞에 역슬래시를 추가하지 않았을때 주문목록 페이지에서 이미지를 불러올경우
localhost:8080/orderList/이미지주소로 불러오게 됩니다
역슬래시를 추가해줘야 localhost:8080/이미지주소로 정상적으로 이미지를 불러올수 있습니다
이제 myPage, point, myReview 페이지를 구현하기 위한 클래스를 추가해줍니다
@Data
public class PointDto {
private long userId;
private Date usedDate;
private String info;
private int point;
}
@Controller
public class UserController {
@Autowired
UserService userService;
@GetMapping("/myPage")
public String myPage() {
return "user/myPage";
}
@GetMapping("/user/point")
public String point(@AuthenticationPrincipal CustomUserDetails principal, Model model) {
long id = principal.getId();
List<PointDto> myPoint = userService.myPoint(id);
model.addAttribute("myPoint", myPoint);
model.addAttribute("point", principal.getPoint());
return "user/point";
}
@GetMapping("/user/myReview")
public String myreView(@AuthenticationPrincipal CustomUserDetails principal, Model model) {
long id = principal.getId();
List<ReviewDto> myReviewList = userService.myReviewList(id);
model.addAttribute("myReviewList", myReviewList);
return "user/myReview";
}
}
@RestController
public class UserApiController {
@Autowired
UserService userService;
//리뷰 삭제
@DeleteMapping("/api/user/review")
public ResponseEntity<String> deleteReview(@AuthenticationPrincipal CustomUserDetails principal, String orderNum) {
long id = principal.getId();
userService.deleteReview(id, orderNum);
return ResponseEntity.ok().body("리뷰 삭제 완료");
}
}
@Service
public class UserService {
@Autowired
UserMapper userMapper;
public List<PointDto> myPoint(long id) {
return userMapper.myPoint(id);
}
public List<ReviewDto> myReviewList(long id) {
return userMapper.myReviewList(id);
}
public void deleteReview(long id, String orderNum) {
Map<String, Object> map = new HashMap<>();
map.put("userId", id);
map.put("orderNum", orderNum);
userMapper.deleteReview(map);
}
}
@Mapper
public interface UserMapper {
// 포인트 내역
public List<PointDto> myPoint(long id);
// 리뷰내역
public List<ReviewDto> myReviewList(long id);
// 리뷰삭제
public void deleteReview(Map<String, Object> map);
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.han.delivery.dao.UserMapper">
<select id="myPoint" resultType="com.han.delivery.dto.PointDto">
SELECT
USER_ID
,USED_DATE
,INFO
,POINT
FROM
DL_POINT
WHERE
USER_ID = #{id }
ORDER BY
USED_DATE DESC
</select>
<select id="myReviewList" resultType="com.han.delivery.dto.ReviewDto">
SELECT ORDER_NUM
,STORE_ID
,REVIEW_CONTENT
,BOSS_COMMENT
,REGI_DATE
,SCORE
,REVIEW_IMG
,USER_ID
FROM DL_REVIEW
WHERE USER_ID = #{id }
ORDER BY REGI_DATE DESC
</select>
<delete id="deleteReview">
DELETE DL_REVIEW
WHERE USER_ID = #{userId }
AND ORDER_NUM = #{orderNum }
</delete>
</mapper>
리뷰수정의 경우 기존에 StoreApiController.java에 추가한걸 그대로 쓸것이기에
따로 추가하지 않았습니다 코드가 간단하고 이미 했던것들의 반복이므로 따로 설명은
하지 않겠습니다