CustomerController.java
@Controller
@RequestMapping(value="/customer")
public class CustomerController {
@Autowired OrderMapper orderMapper;
@Autowired ItemImageMapper iiMapper;
@Autowired MemberMapper memberMapper;
// 암호 변경 화면 표시
@GetMapping(value="/updatepw.do")
public String updatepwGET(){
return "customer/updatepw";
}
// 암호변경 수행
@PostMapping(value="/updatepw.do")
public String updatepwPOST(
@AuthenticationPrincipal User user, // @AuthenticationPrincipal 는 로그인한 사용자의 정보를 받고 싶을 때
@RequestParam Map<String, Object> map){
System.out.println("-----------------------------"); // map 에 들어 왔는지 확인
System.out.println(map.toString());
System.out.println("-----------------------------");
// 1. 아이디를 이용해서 기존아이디, 암호를 가져옴 (MemberMapper에 가서 확인후)
MemberDTO member = memberMapper.selectMemberOne(user.getUsername());
// 2. 기존DB의 암호와 현재암호를 비교
BCryptPasswordEncoder bcpe = new BCryptPasswordEncoder();
String userpw = (String) map.get("userpw"); // 현재 암호
String userpw1 = (String) map.get("userpw1"); // 변경 암호
if(bcpe.matches(userpw, member.getUserid())) {
// 3. 암호변경 수행
Map<String, Object> map1= new HashMap<>(); // 해쉬맵 초기화
map1.put("userid", member.getUserid()); // userid 키 값 지정후 . 유저 아이디 들고 오기
map1.put("userpw", bcpe.encode(userpw1)); // userpw 키 값 지정후 . 유저 비밀번호 들고 오기
memberMapper.updateMemberPassword(map1);
// memberMapper.xml 에 집어 넣을 오라클 쿼리값
// UPDATE MEMBERTBL SET USERPW=#{userpw} WHERE USERID=#{userid}
}
return "redirect:/customer/home.do";
}
@PostMapping(value="/update.do")
public String updatePOST(HttpServletRequest request,
Model model, @ModelAttribute MemberDTO member) {
int ret = memberMapper.updateMember(member);
if(ret == 1) {
model.addAttribute("msg", "정보가 변경됨"); // 성공했을때 alert.html에 쓸 model값을 msg 지정
model.addAttribute("url",
request.getContextPath() + "/customer/home.do"); // 성공했을때 alert.html에 쓸 url 지정
}
else {
model.addAttribute("msg", "정보 변경 실패");
model.addAttribute("url",
request.getContextPath() + "/customer/update.do");
}
// GET으로 되어있는 주소정보를 변경
return "alert";
}
@GetMapping(value="/update.do")
public String updateGET(
@AuthenticationPrincipal User user, // @AuthenticationPrincipal 는 로그인한 사용자의 정보를 받고 싶을 때
Model model){
// 로그인 정보를 읽어서 아이디, 나이, 연락처, 성별
// 지정 해놓은 MemberMapper에 가서 확인후 로그인 정보 가져오기
MemberDTO member = memberMapper.selectMemberOne(user.getUsername());
System.out.println(member.toString());
model.addAttribute("obj", member); // html에 쓸 obj값 정해놓기
return "customer/update";
}
// @RequestParam(name="chk") List<Long> chk, // @RequestParam 은 파라메터 값을 받을때
// @RequestParam(name="chk") Long[] chk
@PostMapping(value="/orderdelete.do")
public String orderDelete(
@RequestParam(name="chk") Long[] chk){
orderMapper.deleteOrder( chk ); // orderMapper에서 지정한 값으로 불러옴
return "redirect:/customer/orderlist.do";
}
@GetMapping(value="/orderlist.do")
public String orderListGET(
Model model,
@AuthenticationPrincipal User user){
// 주문내역목록
List<Map<String, Object>> map
= orderMapper.selectOrderList(user.getUsername());
// 주문내역을 반복한후에 대표이미지를 가져와서 map에 포함
for(Map<String, Object> tmp : map ){
// 물품번호 dto.getItemno()
Long itemno = (Long) tmp.get("ITEMNO");
// 물품번호 전달후 대표이미지 1개의 이미지 번호 반환
ItemImageDTO obj
= iiMapper.selectImageNoOne(itemno);
// map에 키가 IMAGE인 항목 추가함. dto.setImage(URL)
tmp.put("IMAGE", "/item_image?no=" + obj.getNo());
}
System.out.println("-------------------------------");
System.out.println(map.toString());
System.out.println("-------------------------------");
model.addAttribute("list", map);
return "customer/orderlist";
}
@GetMapping(value="/home.do")
public String homeGET(@AuthenticationPrincipal User user){
System.out.println("========================");
System.out.println(user.getUsername());
System.out.println("========================");
return "customer/home";
}
// form을 통해서 2개 전달 + 세션에서 사용자
@PostMapping(value="/order.do")
public String orderPOST(
@ModelAttribute OrderDTO order,
@AuthenticationPrincipal User user) {
order.setUserid( user.getUsername() );
orderMapper.insertOrder(order);
//redirect는 GET으로
return "redirect:/customer/orderlist.do";
}
}
MemberDTO.java
package com.example.dto;
import java.util.Date;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
@Getter // mybatis Mapper에서 사용함
@Setter // view에서 사용
@ToString() // 현재 객체의 내용 확인용
@NoArgsConstructor // 생성자
@AllArgsConstructor
public class MemberDTO {
private String userid;
private String userpw;
private int age;
private String phone;
private String gender;
private Date regdate;
private String role;
}
OrderDTO.java
package com.example.dto;
import java.sql.Date;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
@Getter // mybatis Mapper에서 사용함
@Setter // view에서 사용
@ToString() // 현재 객체의 내용 확인용
@NoArgsConstructor // 생성자
@AllArgsConstructor
public class OrderDTO {
private Long no;
private int cnt;
private Long itemno;
private String userid;
private Date regDate;
}
OrderMapper.java
package com.example.mapper;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.annotations.Mapper;
import com.example.dto.OrderDTO;
@Mapper
public interface OrderMapper {
public int insertOrder ( OrderDTO obj );
public int updateOrder( OrderDTO obj );
public int deleteOrder( Long[] chk );
public List<Map<String, Object>> selectOrderList(String userid);
}
MemberMapper.java
package com.example.mapper;
import java.util.Map;
import org.apache.ibatis.annotations.Mapper;
import com.example.dto.MemberDTO;
@Mapper
public interface MemberMapper {
// 정보 수정
public int updateMember(MemberDTO member);
// 암호 변경
public int updateMemberPassword(Map<String, Object> map1 );
// 여기를 생략했기 때문에 XML 에서 찾아서 자동으로 수행됨.
public int joinMember ( MemberDTO member );
public MemberDTO selectMemberOne(String userid);
}
resources에 mappers파일 생성 후 orderMapper.xml
<?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.example.mapper.OrderMapper">
<!-- SQL : DELETE FROM ORDERTBL WHERE NO IN( 1, 2, 3, 4, 5 ) -->
<delete id="deleteOrder" parameterType="list"> <!-- id는 OrderMapper.java 에서 지정한 값을 확실히 확인하고 적어야함 -->
<foreach collection="chk" item="tmp" separator=", "
open="DELETE FROM ORDERTBL WHERE NO IN( " close=") " >
#{tmp}
</foreach>
</delete>
<resultMap id="retMap1" type="map">
<result property="CONTENT" column="CONTENT"
jdbcType="VARCHAR" javaType="String" />
<result property="ITEMNO" column="ITEMNO"
jdbcType="NUMERIC" javaType="Long" />
</resultMap>
<select id="selectOrderList" parameterType="String"
resultMap="retMap1">
SELECT O.* FROM ORDER_VIEW O WHERE USERID=#{userid}
</select>
<insert id="insertOrder" parameterType="com.example.dto.OrderDTO"> <!-- parameterType은 orderDTO 파일 정확히 기명 -->
INSERT INTO ORDERTBL(NO, CNT, ITEMNO, USERID,REGDATE)
VALUES (SEQ_ORDER_NO.NEXTVAL, #{cnt}, #{itemno}, #{userid}, CURRENT_DATE)
</insert>
</mapper>
resources에 mappers/ MemberMapper.xml
<?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.example.mapper.MemberMapper"> <!--query문을 확실히 DB에서 확인하고 작성하기-->
<insert id="joinMember" parameterType="com.example.dto.MemberDTO">
INSERT INTO MEMBERTBL(USERID, USERPW, AGE, PHONE, GENDER, REGDATE, ROLE)
VALUES(#{userid}, #{userpw}, #{age}, #{phone}, #{gender}, CURRENT_DATE, #{role})
</insert>
<!--query문을 확실히 DB에서 확인하고 작성하기-->
<select id="selectMemberOne" parameterType="String"
resultType="com.example.dto.MemberDTO">
SELECT M.* FROM MEMBERTBL M WHERE M.USERID=#{userid}
</select>
<!--query문을 확실히 DB에서 확인하고 작성하기-->
<update id="updateMember" parameterType="com.example.dto.MemberDTO">
UPDATE MEMBERTBL SET
AGE=#{age}, PHONE=#{phone}, GENDER=#{gender}
WHERE USERID=#{userid}
</update>
<update id="updateMemberPassword" parameterType="com.example.dto.MemberDTO">
UPDATE MEMBERTBL SET USERPW=#{userpw} WHERE USERID=#{userid}
</update>
</mapper>
orderlist.html
<!DOCTYPE html>
<html lang="ko" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>주문목록</title>
</head>
<body>
주문목록
<hr />
<form th:action="@{/customer/orderdelete.do}" method="post" id="form">
<table border="1">
<tr>
<th>체크</th>
<th>물품대표이미지</th>
<th>주문번호</th>
<th>주문수량</th>
<th>주문일자</th>
<th>물품번호</th>
<th>물품명</th>
<th>물품내용</th>
<th>물품가격</th>
<th>판매자아이디</th>
<th>주문자아이디</th>
<th>주문자나이</th>
<th>주문자연락처</th>
<th>주문자성별</th>
</tr>
<tr th:each="obj, idx : ${list}"> <!--Controller에서 정한 model 키값이 맞는지 체크후 작성 -->
<td><input type="checkbox" name="chk" th:value="${obj.NO}"/></td>
<td><img th:src="@{ ${obj.IMAGE} }" style="width:50px; height:50px"/></td>
<!-- obj 역시 Controller에서 정한 키 값이 맞는지 체크후 작성-->
<td th:text="${obj.NO}"></td>
<td th:text="${obj.CNT}"></td>
<td th:text="${obj.REGDATE}"></td>
<td th:text="${obj.ITEMNO}"></td>
<td th:text="${obj.NAME}"></td>
<td th:text="${obj.CONTENT}"></td>
<td th:text="${obj.PRICE}"></td>
<td th:text="${obj.SELLER}"></td>
<td th:text="${obj.USERID}"></td>
<td th:text="${obj.AGE}"></td>
<td th:text="${obj.PHONE}"></td>
<td th:text="${obj.GENDER}"></td>
</tr>
</table>
<input type="button" value="일괄주문취소"
th:onclick="|javascript:deleteAction()|" />
</form>
<script>
const deleteAction = () => {
if(confirm('취소할까요?')){
// id가 form인것을 찾아서 submit() 수행
document.getElementById('form').submit();
}
}
</script>
</body>
</html>
update.html
<title>정보수정</title>
아이디 : input type="text" name="userid" th:value="${obj.userid}" readonly />성별 : <select name="gender">
<option th:value="M" th:text="남"
th:selected="${obj.gender == 'M'}">
<option th:value="F" th:text="여"
th:selected="${obj.gender == 'F'}">
</select><br />
<input type="submit" value="정보변경" />
updatepw.html
<!DOCTYPE html>
<html lang="ko" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>정보수정</title>
</head>
<body>
<form th:action="@{/customer/updatepw.do}" method="post">
기존 암호 : <input type="password" name="userpw" /><br />
변경 암호 : <input type="password" name="userpw1" /><br />
암호 확인 : <input type="password" name="userpw2" /><br />
<input type="submit" value="암호변경" />
</form>
</body>
</html>