고객 주문 사이트 구현 및 회원변경(비밀번호 encoder)

HUGO·2022년 9월 22일
0

mybatis

목록 보기
3/6

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 />
나이 : input type="text" name="age" th:value="${obj.age}" />
연락처 : input type="text" name="phone" th:value="${obj.phone}" />
성별 : <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>
profile
갓 신생아 개발자 이야기

0개의 댓글