[구현 기능 요약]
1. 회원가입/로그인페이지 회원정보 CRUD
- 회원가입 - 아이디 중복확인(x) / 회원가입규정 / (null 상태로 submit 하면 에러페이지) -> 수정필요
- 로그인 - (null 상태로 submit 하면 그냥 그대로) -> alert 띄우기
- 회원가입 - 로그인 이동 링크
- 회원정보수정 - 아이디 변경불가 / 비밀번호 주민번호 비밀번호화로 매번 다시 입력되게 해야함. / 사진 꼭 첨부 필수로 / 입력 빈칸 다 채우게 되어있음 / 이메일 @ 필요
- 로그아웃 - 세션 나가기 가능
- 회원탈퇴 - 데이터없음으로 업데이트되며, 정보 삭제되면 복구 불가
2. 마이페이지 /쉐프 전용페이지 CRUD
- 정보count - 숫자 세기 완료 / 단, 별점 필수
- 회원정보출력 - 세션scope로 잘 가져옴
- 프로필 사진 수정 - 이미지 첨부 및 저장 / 단, 다시 로그인해야 적용됨
- 최근 레시피 목록 출력 - 페이징 걸고 페이징 번호만 숨김. 따라서 최근 5개만 출력되도록 함
- 요리 클래스는 갯수가 한정적이라 페이징 안걸고 전부 출력
- (쉐프)클래스 - 쉐프 클래스는 자기가 운영하는 클래스로, 각각의 승인 상태가 표시됨. 상태값 데이터 가져와서 아이콘으로 표시
3. 내 레시피목록 / 내 스크랩목록 / 나에게 달린 리뷰 목록
- 내 레시피 - 메뉴바와 함께 사진이 나오고 페이징 처리됨. 클릭하면 이동
- 내 스크랩 - 메뉴바없음 / 클릭하면 이동됨
- 내 코멘트 - 그냥 rowlist로 쭉 찍힘. 최대 10개까지 보여지고 페이징처리
4. 기타 기능 구현
- contact_us - 아이콘 통일하게 삽입, 회사 위치 지도 삽입
5. admin 페이지 대쉬보드
1. DB 데이터를 불러와서 회원가입자, 요리클래스 신청자 등을 테이블에 표시
2. 테이블에 표시된 데이터를 이용해서 chart.js를 이용해 그래프로 표시
6. admin 페이지 회원권한수정
1. 회원가입자의 정보를 표시하고 해당 회원의 정보를 수정/삭제 할 수 있도록 함
2. 그 회원의 게시글 리스트를 출력하고 클릭 시 해당 게시글로 이동함.
7. 데이터 스크래핑
1. Ui-Path로 스크린 스크랩핑을 하여 해당 사이트의 Text를 스크랩핑 -> 요리정보 데이터 수집
2. 요리 순위에 대해 데이터를 생성하기 어려워 BeautifulSoup 으로 사이트 요리순위 웹크롤링함.
1. 회원정보 CRUD
1) Membership - 회원가입 / 로그인 / 아이디중복확인(x) / 회원정보수정 / 로그아웃 / 회원탈퇴(x)
MembershipVO / MembershipMapper.xml / MembershipService / MembershipServiceImpl / MembershipDAO/ MembershipDAOImpl / MembershipController
- MembershipVO
package kr.co.ikosmo.mvc.vo;
/* 멤버테이블
MEM_NO NUMBER(5,0)
MEM_ID VARCHAR2(15 BYTE)
MEM_PWD VARCHAR2(15 BYTE)
MEM_NAME VARCHAR2(15 BYTE)
MEM_NICKNAME VARCHAR2(20 BYTE)
MEM_JUMINNUM CHAR(13 BYTE)
MEM_EMAIL VARCHAR2(30 BYTE)
MEM_PHONE CHAR(11 BYTE)
MEM_REGDATE DATE
MEM_PIC VARCHAR2(90 BYTE)
MEM_GRADE_NO VARCHAR2(10 BYTE)
KIND_TAG_NO NUMBER(2,0)
*/
import java.io.File;
import java.io.IOException;
import org.springframework.web.multipart.MultipartFile;
public class MembershipVO {
private int mem_no;
private String mem_id,mem_pwd,mem_name,mem_nickname,
mem_juminnum,mem_email,mem_phone,mem_regdate,mem_pic,mem_grade_no;
/* 프로필 사진 업로드를 위한 파일 업로드 */
MultipartFile file;
public MultipartFile getFile() {
return file;
}
public void setFile(MultipartFile file) {
this.file = file;
// 업로드 파일 접근
if(! file.isEmpty()) {
this.mem_pic = file.getOriginalFilename();
File f = new File("C:\\Users\\Kosmo_02\\Downloads\\타일즈완료\\RecipePrj_01\\RecipePrj_01\\WebContent\\resources\\image\\member_upload\\"+mem_pic);
try {
file.transferTo(f);
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/* 프로필 사진 업로드를 위한 파일 업로드 */
public int getMem_no() {
return mem_no;
}
public void setMem_no(int mem_no) {
this.mem_no = mem_no;
}
public String getMem_id() {
return mem_id;
}
public void setMem_id(String mem_id) {
this.mem_id = mem_id;
}
public String getMem_pwd() {
return mem_pwd;
}
public void setMem_pwd(String mem_pwd) {
this.mem_pwd = mem_pwd;
}
public String getMem_name() {
return mem_name;
}
public void setMem_name(String mem_name) {
this.mem_name = mem_name;
}
public String getMem_nickname() {
return mem_nickname;
}
public void setMem_nickname(String mem_nickname) {
this.mem_nickname = mem_nickname;
}
public String getMem_juminnum() {
return mem_juminnum;
}
public void setMem_juminnum(String mem_juminnum) {
this.mem_juminnum = mem_juminnum;
}
public String getMem_email() {
return mem_email;
}
public void setMem_email(String mem_email) {
this.mem_email = mem_email;
}
public String getMem_phone() {
return mem_phone;
}
public void setMem_phone(String mem_phone) {
this.mem_phone = mem_phone;
}
public String getMem_regdate() {
return mem_regdate;
}
public void setMem_regdate(String mem_regdate) {
this.mem_regdate = mem_regdate;
}
public String getMem_pic() {
return mem_pic;
}
public void setMem_pic(String mem_pic) {
this.mem_pic = mem_pic;
}
public String getMem_grade_no() {
return mem_grade_no;
}
public void setMem_grade_no(String mem_grade_no) {
this.mem_grade_no = mem_grade_no;
}
}
- MembershipMapper.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="membership">
<!-- member_info 테이블
private int mem_no;
private String mem_id,mem_pwd,mem_name,mem_nickname,
mem_juminnum,mem_email,mem_phone,mem_regdate,mem_pic;
-->
<!-- 로그인 -->
<select id="memberlogin" parameterType="membership" resultType="membership">
SELECT *
FROM member_info
WHERE mem_id = #{mem_id}
AND mem_pwd = #{mem_pwd}
</select>
<!-- 회원가입 -->
<insert id="memberinsert" parameterType="membership">
INSERT INTO member_info
VALUES(member_info_seq.nextval,#{mem_id},#{mem_pwd}, #{mem_name},#{mem_nickname},
#{mem_juminnum},#{mem_email}, #{mem_phone},sysdate,0,0,0,0,10)
</insert>
<!-- 아이디체크 -->
<select id="idchk" resultType="int" parameterType="String">
select count(*) cnt from member_info where mem_id=#{mem_id}
</select>
<!-- 로그인 회원가입 완료 -->
<!-- 회원정보수정 -->
<update id="updateMember" parameterType="membership">
UPDATE member_info SET
mem_name=#{mem_name}, mem_nickname = #{mem_nickname} ,
mem_email = #{mem_email}, mem_phone = #{mem_phone},
mem_pwd = #{mem_pwd},mem_juminnum = #{mem_juminnum}, <if test="mem_pic != null">mem_pic = #{mem_pic}</if>
WHERE mem_id=#{mem_id}
</update>
<!-- 회원탈퇴 -->
<update id="memberDelete" parameterType="membership">
UPDATE member_info SET
mem_id= '데이터 없음', mem_name='데이터 없음', mem_nickname = '데이터 없음',
mem_email = '데이터 없음', mem_phone = '데이터 없음',
mem_pwd = '데이터 없음',mem_juminnum = '데이터 없음', mem_pic = '데이터 없음'
WHERE mem_no=#{mem_no}
</update>
</mapper>
- MembershipService
package kr.co.ikosmo.mvc.service;
import kr.co.ikosmo.mvc.vo.MembershipVO;
import kr.co.ikosmo.mvc.vo.ReviewVO;
public interface MembershipService {
public int insertmembership (MembershipVO vo); //회원가입
public MembershipVO loginmembership( MembershipVO vo);//로그인
public void updateMember(MembershipVO vo); //회원정보수정
public void memberDelete(MembershipVO vo, Integer mem_no); //회원탈퇴
//----------------------------------------------------------------
}
- MembershipServiceImpl
package kr.co.ikosmo.mvc.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import kr.co.ikosmo.mvc.dao.MembershipDAOImpl;
import kr.co.ikosmo.mvc.dao.MypageDAOImple;
import kr.co.ikosmo.mvc.vo.MembershipVO;
@Service("MembershipService")
public class MembershipServiceImpl implements MembershipService {
@Autowired
MembershipDAOImpl membershipDAOImpl;
//회원가입
@Override
public int insertmembership(MembershipVO vo) {
return membershipDAOImpl.memberInsert(vo);
}
//로그인
@Override
public MembershipVO loginmembership(MembershipVO vo) {
return membershipDAOImpl.memberlogin(vo);
}
//회원정보수정
@Override
public void updateMember(MembershipVO vo) {
membershipDAOImpl.updateMember(vo);
}
//회원탈퇴
@Override
public void memberDelete(MembershipVO vo, Integer mem_no){
membershipDAOImpl.memberDelete(vo, mem_no);
}
//로그인 회원가입 완료 --------------------------------------
}
- MembershipDAO
package kr.co.ikosmo.mvc.dao;
import java.util.List;
import kr.co.ikosmo.mvc.vo.MembershipVO;
public interface MembershipDAO {
MembershipVO memberlogin(MembershipVO vo);
public int memberInsert(MembershipVO vo);
//로그인 회원가입 완료 -------------------------------------------------------
public int memberIdchk(String mem_id); // 아이디 중복 처리
public void updateMember(MembershipVO vo);//회원정보수정
public void memberDelete(MembershipVO vo, Integer mem_no); // 회원 탈퇴
}
- MembershipDAOImpl
package kr.co.ikosmo.mvc.dao;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import kr.co.ikosmo.mvc.vo.MembershipVO;
@Repository("MembershipDAO")
public class MembershipDAOImpl implements MembershipDAO {
@Autowired
private SqlSessionTemplate ss;
@Override
public MembershipVO memberlogin(MembershipVO vo) {
MembershipVO mv = ss.selectOne("membership.memberlogin", vo);
return mv;
}
@Override
public int memberInsert(MembershipVO vo) {
return ss.insert("membership.memberinsert", vo);
}
//로그인 회원가입 완료 -------------------------------------------------------
@Override
public int memberIdchk(String mem_id) {
return ss.selectOne("membership.idchk",mem_id);
}
//회원정보수정
@Override
public void updateMember(MembershipVO vo) {
ss.update("membership.updateMember", vo);
}
//회원탈퇴
@Override
public void memberDelete(MembershipVO vo, Integer mem_no){
ss.update("membership.memberDelete", mem_no);
}
}
- MembershipController
package kr.co.ikosmo.mvc.controller;
import javax.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
import kr.co.ikosmo.mvc.dao.MembershipDAOImpl;
import kr.co.ikosmo.mvc.service.MembershipService;
import kr.co.ikosmo.mvc.vo.MembershipVO;
@Controller
public class MembershipController {
@Autowired
private MembershipService membershipService;
@Autowired
private MembershipDAOImpl membershipDAOImpl;
// 로그인 세션 매핑
@RequestMapping("/login.do")
public String login(MembershipVO vo, HttpSession session ) {
MembershipVO result = membershipService.loginmembership(vo);
if(result == null) {
return "tiles/login";
}else {
//정보 출력을 위한 세션 매핑
session.setAttribute("memNo", result.getMem_no()); //회원번호
session.setAttribute("memId", result.getMem_id()); //회원id
//session.setAttribute("memPwd", result.getMem_pwd()); //회원pwd
session.setAttribute("memName", result.getMem_name()); //회원이름
session.setAttribute("memNickname", result.getMem_nickname()); //회원별명
//session.setAttribute("memJuminnum", result.getMem_juminnum()); //회원주민번호
session.setAttribute("memEmail", result.getMem_email()); //회원메일
session.setAttribute("memPhone", result.getMem_phone()); //회원전화번호
session.setAttribute("memPic", result.getMem_pic()); //회원사진
session.setAttribute("memGrade_no", result.getMem_grade_no()); //쉐프또는 일반인
}
return "aaa/bbb/index"; //마이페이지에 로그인 이름 뜨는지 확인하기
}
// 회원가입 매핑
@RequestMapping("/register")
public ModelAndView membership(MembershipVO vo) {
int result = membershipService.insertmembership(vo);
ModelAndView mv = new ModelAndView();
mv.setViewName("aaa/bbb/index");
return mv; //회원가입 되면 index로 이동
}
//로그인 회원가입 완료 -------------------------------------------------------
//아이디 중복 확인을 구현합시다.
@RequestMapping("idChk")
public String idchk(String mem_id, Model m) {
// Dao와 연결해서 아이디값이 존재하면 1, 없으면 0 을 반환한다.
int cnt = membershipDAOImpl.memberIdchk(mem_id);
//Model을 사용해서 View로 값을 전달한다.
m.addAttribute("cnt", cnt);
return "tiles/idChk";
}
//아이디 중복체크 완료 -------------------------------------------------------
// 회원정보수정
@RequestMapping("memberupdate")
public String registerUpdate(MembershipVO vo){
membershipService.updateMember(vo);
return "tiles/Mypage";
}
// 로그아웃
@RequestMapping(value = "/logout", method = RequestMethod.GET)
public String logout(HttpSession session) throws Exception{
session.invalidate();
return "redirect:/index";
}
//업데이트 로그아웃 완료 -----------------------------------------------------
// 회원 탈퇴 -> 회원정보를 없음 처리한다.
@RequestMapping("memberDelete")
public String registerDelete(MembershipVO vo, HttpSession session){
Integer mem_no = (Integer)session.getAttribute("memNo");
System.out.println("회원탈퇴시 사용되는 mem번호 : "+ mem_no); //콘솔확인
membershipDAOImpl.memberDelete(vo, mem_no); //delete 지만 없음 처리로 업데이트한 것.
session.invalidate(); //회원탈퇴 누르면 로그인도 함께 됨
return "redirect:/index";
}
}
- 프로필 사진의 경우 회원가입이 아닌 회원정보수정에서만 업데이트 가능(null일 경우 에러남 -> 해결방안)
- 프로필사진 업데이트를 위한 info_change.jsp 의 경우 vo에 등록한 파일 업로드 기능 구현을 위해 name값은 "file"로 한다. / 그 외에 상단 form 태그에 " enctype="multipart/form-data" 추가.
2) jsp - 회원가입, 로그인, 회원정보수정, 마이페이지의 로그아웃, 회원탈퇴 버튼
signup.jsp / login.jsp / info_chage.jsp / Mypage.jsp(일부)
- signup.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>signup</title>
<!-- <base href=""> -->
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="icon" type="image/x-icon" href="./resources/img/favicon.ico">
<script type="text/javascript" src="./resources/js/jquery-1.7.1.js"></script>
<script src="./resources/js/Membership.js"></script>
<link rel="stylesheet" type="text/css" href="./resources/css/header.css" media="all" />
<link rel="stylesheet" type="text/css" href="./resources/css/main.css" media="all" />
<link rel="stylesheet" type="text/css" href="./resources/css/style.css" media="all" />
<link rel="stylesheet" type="text/css" href="./resources/css/plugins/magnific-popup.css" media="all" />
<link rel="stylesheet" type="text/css" href="./resources/css/plugins/slick.css" media="all" />
<link rel="stylesheet" type="text/css" href="./resources/css/plugins/slick-theme.css" media="all" />
<!--
<link rel="stylesheet" type="text/css" href="./resources/css/primary-skin.css" media="all" />
<link rel="stylesheet" type="text/css" href="./resources/css/plugins/bootstrap.min.css" media="all" />
<link rel="stylesheet" type="text/css" href="./resources/css/plugins/animate.min.css" media="all" />
<link rel="stylesheet" type="text/css" href="./resources/css/plugins/magnific-popup.css" media="all" />
<link rel="stylesheet" type="text/css" href="./resources/css/plugins/slick.css" media="all" />
<link rel="stylesheet" type="text/css" href="./resources/css/plugins/slick-theme.css" media="all" />
-->
<!--********** 【 js 링크 걸기 】********** -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/bxslider/4.2.12/jquery.bxslider.min.js"></script>
<script src="./resources/js/main.js" type="text/javascript" charset="utf-8"></script>
<script src="./resources/js/plugins/bootstrap.min.js" type="text/javascript" charset="utf-8"></script>
<script src="./resources/js/plugins/isotope.pkgd.min.js" type="text/javascript" charset="utf-8"></script>
<script src="./resources/js/plugins/jquery.countdown.min.js" type="text/javascript" charset="utf-8"></script>
<script src="./resources/js/plugins/jquery.magnific-popup.min.js" type="text/javascript" charset="utf-8"></script>
<script src="./resources/js/plugins/jquery.slimScroll.min.js" type="text/javascript" charset="utf-8"></script>
<script src="./resources/js/plugins/jquery.steps.min.js" type="text/javascript" charset="utf-8"></script>
<script src="./resources/js/plugins/jquery-3.4.1.min.js" type="text/javascript" charset="utf-8"></script>
<script src="./resources/js/plugins/popper.min.js" type="text/javascript" charset="utf-8"></script>
<script src="./resources/js/plugins/slick.min.js" type="text/javascript" charset="utf-8"></script>
<script src="./resources/js/plugins/waypoint.js" type="text/javascript" charset="utf-8"></script>
<!--
-->
</head>
<body>
<app-root>
<!-- Login FormStart -->
<section class="section auth-section bg-cover" style="background-image: url('assets/img/bg/3.jpg')">
<div class="container">
<form name = "userinput" id="userinput" class="auth-form light-bg" action = "register" method="post" style="background-image: url('assets/img/bg/5.jpg')">
<h1>Sign Up</h1>
<div class="form-group">
<label>이름</label>
<input type="text" class="form-control" placeholder="이름" name="mem_name" value="">
</div>
<div class="form-group">
<label>별명</label>
<input type="text" class="form-control" placeholder="별명" name="mem_nickname" value="">
</div>
<div class="form-group">
<label>ID</label>
<input type="text" class="form-control" placeholder="ID" name="mem_id" id="mem_id" value="">
</div>
<td>
<input type="button" value="중복확인" id="idChkBtn" style="width: 150px; font-size: 10px; height: 30px;">
<span class="box" id="target"></span>
<td>
<div class="form-group">
<label>Password</label>
<input type="password" class="form-control" placeholder="Password" name="mem_pwd" value="">
</div>
<div class="form-group">
<label>주민번호</label>
<input type="text" class="form-control" placeholder="주민번호" name="mem_juminnum" value="">
</div>
<div class="form-group">
<label>Email</label>
<input type="email" class="form-control" placeholder="Email Address" name="mem_email" value="">
</div>
<div class="form-group">
<label>핸드폰번호</label>
<input type="text" class="form-control" placeholder="핸드폰번호" name="mem_phone" value="">
</div>
<div class="auth-controls form-group">
<div class="custom-control custom-checkbox">
<input type="checkbox" class="custom-control-input" id="rememberMe">
<label class="custom-control-label fw-400" for="rememberMe">회원가입 규정에 <a href="https://kto.visitkorea.or.kr/kor/helpDesk/policy/memberPolicy.kto" onclick="window.open(this.href,'_blank','toolbar=no,scrollbars=yes'); return false;" class="btn-link">동의합니다.</a> </label>
</div>
</div>
<div class="form-group">
<button type="submit" class="btn-custom primary btn-block">sign up</button>
</div>
<p class="form-group text-center">계정이 있으십니까? <a href="login" class="btn-link">로그인</a> </p>
</form>
</div>
</section>
<!-- Login Form End -->
</app-root>
<!-- 제이쿼리를 가져오자. -->
<!-- // jQury에서 id => #, class => . Element => E-->
<script src = "http://code.jquery.com/jquery-3.5.1.min.js"></script>
<!-- 콘솔창에 띄워보자. 크롬 F12 누르기 -->
<script>
$(function(){
//확인 다 했으니 버튼에 기능을 입혀보자.
//jQury에서 id => #, class => . Element => E
$('#idChkBtn').click(function(){
// 아이디 값이 있는 지 없는지 if문 확인 return
$.ajax({
url:'idChk?mem_id=' + $('#mem_id').val(),
success: function(data){
//console.log(data);
//$.trim : 공백제거 함수
//== 안씀. === 쓴다.
var msg = '';
if($.trim(data)==='1'){
msg = "<span style='color:red'>중복된 아이디입니다.</span>";
}
else{
msg = "<span style='color:blue'>사용가능한 아이디입니다.</span>";
}
//console.log(msg)
$('#target').html(msg);
}
});
});
});
</script>
</body>
</html>
- login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>login</title>
<!-- <base href=""> -->
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="icon" type="image/x-icon" href="./resources/img/favicon.ico">
<link rel="stylesheet" type="text/css" href="./resources/css/header.css" media="all" />
<link rel="stylesheet" type="text/css" href="./resources/css/main.css" media="all" />
<link rel="stylesheet" type="text/css" href="./resources/css/style.css" media="all" />
<link rel="stylesheet" type="text/css" href="./resources/css/plugins/magnific-popup.css" media="all" />
<link rel="stylesheet" type="text/css" href="./resources/css/plugins/slick.css" media="all" />
<link rel="stylesheet" type="text/css" href="./resources/css/plugins/slick-theme.css" media="all" />
<!--
<link rel="stylesheet" type="text/css" href="./resources/css/primary-skin.css" media="all" />
<link rel="stylesheet" type="text/css" href="./resources/css/plugins/bootstrap.min.css" media="all" />
<link rel="stylesheet" type="text/css" href="./resources/css/plugins/animate.min.css" media="all" />
<link rel="stylesheet" type="text/css" href="./resources/css/plugins/magnific-popup.css" media="all" />
<link rel="stylesheet" type="text/css" href="./resources/css/plugins/slick.css" media="all" />
<link rel="stylesheet" type="text/css" href="./resources/css/plugins/slick-theme.css" media="all" />
<!--
-->
<!--********** 【 js 링크 걸기 】********** -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/bxslider/4.2.12/jquery.bxslider.min.js"></script>
<script src="./resources/js/main.js" type="text/javascript" charset="utf-8"></script>
<script src="./resources/js/plugins/bootstrap.min.js" type="text/javascript" charset="utf-8"></script>
<script src="./resources/js/plugins/isotope.pkgd.min.js" type="text/javascript" charset="utf-8"></script>
<script src="./resources/js/plugins/jquery.countdown.min.js" type="text/javascript" charset="utf-8"></script>
<script src="./resources/js/plugins/jquery.magnific-popup.min.js" type="text/javascript" charset="utf-8"></script>
<script src="./resources/js/plugins/jquery.slimScroll.min.js" type="text/javascript" charset="utf-8"></script>
<script src="./resources/js/plugins/jquery.steps.min.js" type="text/javascript" charset="utf-8"></script>
<script src="./resources/js/plugins/jquery-3.4.1.min.js" type="text/javascript" charset="utf-8"></script>
<script src="./resources/js/plugins/popper.min.js" type="text/javascript" charset="utf-8"></script>
<script src="./resources/js/plugins/slick.min.js" type="text/javascript" charset="utf-8"></script>
<script src="./resources/js/plugins/waypoint.js" type="text/javascript" charset="utf-8"></script>
<!--
-->
</head>
<body>
<app-root>
<!-- Login FormStart -->
<section class="section auth-section bg-cover" style="background-image: url('')">
<div class="container">
<form name="form" class="auth-form light-bg" method="post" action ="login.do" style="background-image: url('')">
<h1>Login</h1>
<div class="form-group">
<label>ID</label>
<input type="text" class="form-control" placeholder="ID" name="mem_id" value="">
</div>
<div class="form-group">
<label>Password</label>
<input type="password" class="form-control" placeholder="Password" name="mem_pwd" value="">
</div>
<div class="auth-controls form-group">
<!-- <div class="custom-control custom-checkbox">
<input type="checkbox" class="custom-control-input" id="rememberMe">
<label class="custom-control-label fw-400" for="rememberMe">Remember Me</label>
</div> -->
<!-- <a href="info_change" class="btn-link fw-400">Forgot Password?(수정예정)</a>
</div> -->
<div class="form-group">
<button type="submit" id="loginSubmit" name="loginSubmit" class="btn-custom primary btn-block">login</button>
</div>
<p class="form-group text-center">계정이 없으십니까? <a href="signup" class="btn-link">회원가입</a> </p>
</form>
</div>
</section>
<!-- Login Form End -->
</app-root>
</body>
<script>
window.onload = function(){
document.getElementById('loginSubmit').onclick = check;
}
function check(){
if(document.form.MEM_ID.value==""){
alert("ID를 입력하세요.")
document.form.MEM_ID.focus();
return false;
}
if(document.form.MEM_PWD.value==""){
alert("비밀번호를 입력하세요.")
document.form.MEM_PWD.focus();
return false;
}
document.form.submit();//전송
}
</script>
</html>
- info_change.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>회원정보수정</title>
<!-- <base href=""> -->
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="icon" type="image/x-icon" href="./resources/img/favicon.ico">
<!-- 인포 추가 -->
<link href="/maxcdn.bootstrapcdn.com/bootstrap/4.1.1/css/bootstrap.min.css" rel="stylesheet" id="bootstrap-css">
<script src="//maxcdn.bootstrapcdn.com/bootstrap/4.1.1/js/bootstrap.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<link rel="stylesheet" type="text/css" href="./resources/css/info_change.css" media="all" />
<script src="./resources/js/info_change.js" type="text/javascript" charset="utf-8"></script>
<!-- 인포 추가끝 -->
<link rel="stylesheet" type="text/css" href="./resources/css/header.css" media="all" />
<link rel="stylesheet" type="text/css" href="./resources/css/main.css" media="all" />
<link rel="stylesheet" type="text/css" href="./resources/css/style.css" media="all" />
<!--
<link rel="stylesheet" type="text/css" href="./resources/css/plugins/bootstrap.min.css" media="all" />
<link rel="stylesheet" type="text/css" href="./resources/css/primary-skin.css" media="all" />
<link rel="stylesheet" type="text/css" href="./resources/css/plugins/animate.min.css" media="all" />
<link rel="stylesheet" type="text/css" href="./resources/css/plugins/magnific-popup.css" media="all" />
<link rel="stylesheet" type="text/css" href="./resources/css/plugins/slick.css" media="all" />
<link rel="stylesheet" type="text/css" href="./resources/css/plugins/slick-theme.css" media="all" />
<!--
-->
<!--********** 【 js 링크 걸기 】********** -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/bxslider/4.2.12/jquery.bxslider.min.js"></script>
<script src="./resources/js/main.js" type="text/javascript" charset="utf-8"></script>
<script src="./resources/js/plugins/bootstrap.min.js" type="text/javascript" charset="utf-8"></script>
<script src="./resources/js/plugins/isotope.pkgd.min.js" type="text/javascript" charset="utf-8"></script>
<script src="./resources/js/plugins/jquery.countdown.min.js" type="text/javascript" charset="utf-8"></script>
<script src="./resources/js/plugins/jquery.magnific-popup.min.js" type="text/javascript" charset="utf-8"></script>
<script src="./resources/js/plugins/jquery.slimScroll.min.js" type="text/javascript" charset="utf-8"></script>
<script src="./resources/js/plugins/jquery.steps.min.js" type="text/javascript" charset="utf-8"></script>
<script src="./resources/js/plugins/jquery-3.4.1.min.js" type="text/javascript" charset="utf-8"></script>
<script src="./resources/js/plugins/popper.min.js" type="text/javascript" charset="utf-8"></script>
<script src="./resources/js/plugins/slick.min.js" type="text/javascript" charset="utf-8"></script>
<script src="./resources/js/plugins/waypoint.js" type="text/javascript" charset="utf-8"></script>
<!--
-->
</head>
<body>
<app-root>
<!-- info_change Start -->
<div class="container" style="margin-top: 1em;">
<!-- Sign up form -->
<form name="form" method="post" action ="memberupdate" enctype="multipart/form-data">
<!-- Sign up card -->
<div class="card person-card">
<div class="card-body">
<!-- Sex image -->
<img id="img_sex" class="person-img"
src="https://visualpharm.com/assets/217/Life%20Cycle-595b40b75ba036ed117d9ef0.svg">
<h2 id="who_message" class="card-title">회원정보수정</h2>
<!-- First row (on medium screen) -->
<div class="row">
<div class="form-group col-md-2">
<input id="mem_id" name="mem_id" value="${sessionScope.memId}" type="text" class="form-control" readonly="readonly" >
</div>
<div class="form-group col-md-5">
<input id="mem_name" name="mem_name" value="${sessionScope.memName}" type="text" class="form-control" placeholder="Name" required>
<div id="first_name_feedback" class="invalid-feedback">
</div>
</div>
<div class="form-group col-md-5">
<input id="mem_nickname" name="mem_nickname" value="${sessionScope.memNickname}" type="text" class="form-control" placeholder="Nickname" reqired>
<div id="last_name_feedback" class="invalid-feedback">
</div>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-md-6" style="padding=0.5em;">
<div class="card">
<div class="card-body">
<h2 class="card-title">연락처수정</h2>
<div class="form-group">
<label for="email" class="col-form-label">Email</label>
<input type="email" class="form-control" id="mem_email" name="mem_email" value="${sessionScope.memEmail}" placeholder="example@gmail.com" required>
<div class="email-feedback">
</div>
</div>
<div class="form-group">
<label for="tel" class="col-form-label">Phone number</label>
<input type="text" class="form-control" id="mem_phone" name="mem_phone" value="${sessionScope.memPhone}" placeholder="01000000000" required>
<div class="phone-feedback">
</div>
</div>
<!-- <div class="form-group">
<label for="tel" class="col-form-label">Address</label>
<input type="text" class="form-control" id="addr" placeholder="서울특별시 구로구..." required>
</div> -->
</div>
</div>
</div>
<div class="col-md-6">
<div class="card">
<div class="card-body">
<h2 class="card-title">비밀번호수정</h2>
<div class="form-group">
<label for="password" class="col-form-label">비밀번호</label>
<input type="password" class="form-control" id="mem_pwd" name="mem_pwd" placeholder="Type your password" required="">
<div class="password-feedback">
</div>
</div>
<div class="form-group">
<label for="password_conf" class="col-form-label">주민번호</label>
<input type="text" class="form-control" id="mem_juminnum" name="mem_juminnum" value="${sessionScope.memJuminnum}" placeholder="Type your personal num" required>
<div class="password_conf-feedback">
</div>
</div>
</div>
</div>
</div>
<div class="col-md-12">
<div class="card">
<div class="row">
<div class="form-group col-md-8">
<label for="tel" class="col-form-label"> Profile Picture</label>
<!-- 사진업로드 -->
<input id="mem_pic" name="file" type="file" class="form-control">
</div>
</div>
</div>
</div>
</div>
<br>
<div style="margin-top: 1em;">
<button type="submit" class="btn-custom primary btn-block">회원정보수정</button>
</div>
<br>
</form>
</div>
</app-root>
</body>
</html>
- Mypage.jsp(일부)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>마이페이지</title>
<!-- <base href=""> -->
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="icon" type="image/x-icon" href="./resources/img/favicon.ico">
<link rel="stylesheet" type="text/css" href="./resources/css/header.css" media="all" />
<link rel="stylesheet" type="text/css" href="./resources/css/main.css" media="all" />
<link rel="stylesheet" type="text/css" href="./resources/css/style.css" media="all" />
<!-- 따로 추가 -->
<script src="//maxcdn.bootstrapcdn.com/bootstrap/4.1.1/js/bootstrap.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<link href="https://fonts.googleapis.com/css?family=Open+Sans:300,400,600,700" rel="stylesheet">
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.3.1/css/all.min.css" rel="stylesheet">
<!------ Include the above in your HEAD tag ---------->
<!--
<link rel="stylesheet" type="text/css" href="./resources/css/plugins/bootstrap.min.css" media="all" />
<link rel="stylesheet" type="text/css" href="./resources/css/primary-skin.css" media="all" />
<link rel="stylesheet" type="text/css" href="./resources/css/plugins/animate.min.css" media="all" />
<link rel="stylesheet" type="text/css" href="./resources/css/plugins/magnific-popup.css" media="all" />
<link rel="stylesheet" type="text/css" href="./resources/css/plugins/slick.css" media="all" />
<link rel="stylesheet" type="text/css" href="./resources/css/plugins/slick-theme.css" media="all" />
<!--
-->
<!--********** 【 js 링크 걸기 】********** -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/bxslider/4.2.12/jquery.bxslider.min.js"></script>
<script src="./resources/js/main.js" type="text/javascript" charset="utf-8"></script>
<script src="./resources/js/plugins/bootstrap.min.js" type="text/javascript" charset="utf-8"></script>
<!--
<script src="./resources/js/plugins/isotope.pkgd.min.js" type="text/javascript" charset="utf-8"></script>
<script src="./resources/js/plugins/jquery.countdown.min.js" type="text/javascript" charset="utf-8"></script>
<script src="./resources/js/plugins/jquery.magnific-popup.min.js" type="text/javascript" charset="utf-8"></script>
<script src="./resources/js/plugins/jquery.slimScroll.min.js" type="text/javascript" charset="utf-8"></script>
<script src="./resources/js/plugins/jquery.steps.min.js" type="text/javascript" charset="utf-8"></script>
<script src="./resources/js/plugins/jquery-3.4.1.min.js" type="text/javascript" charset="utf-8"></script>
<script src="./resources/js/plugins/popper.min.js" type="text/javascript" charset="utf-8"></script>
<script src="./resources/js/plugins/slick.min.js" type="text/javascript" charset="utf-8"></script>
<script src="./resources/js/plugins/waypoint.js" type="text/javascript" charset="utf-8"></script>
-->
<!--
-->
</head>
<body>
<app-root>
<!-- 마이페이지 Start -->
<section id="about-us" class="py-5">
<div class="container">
<div class="row">
<!--left sidebar-->
<div class="col-md-3 pr-md-4">
<div class="sidebar-left">
<!--sidebar menu-->
<ul class="list-unstyled sidebar-menu pl-md-2 pr-md-0">
<li>
<a class="sidebar-item active d-flex justify-content-between align-items-center" href="Myrecipe_list">
내가 쓴 레시피 보기
<span class="fas fa-copy"></span>
</a>
</li>
<li>
<a class="sidebar-item d-flex justify-content-between align-items-center" href="My_bigdata">
내 레시피 정보(빅데이터)
<span class="fas fa-chart-line"></span>
</a>
</li>
<li>
<a class="sidebar-item d-flex justify-content-between align-items-center" href="review">
나에게 달린 코멘트
<span class="side-notif" title="1 new comment"></span>
<span class="fas fa-comment"></span>
</a>
</li>
<li>
<a class="sidebar-item d-flex justify-content-between align-items-center" href="Myscrap">
레시피 스크랩
<span class="fas fa-bookmark"></span>
</a>
</li>
<li>
<a class="sidebar-item d-flex justify-content-between align-items-center" href="storeCart">
장바구니
<span class="fas fa-cart-arrow-down"></span>
</a>
</li>
<li>
<a class="sidebar-item d-flex justify-content-between align-items-center" href="chat_us2">
고객센터 챗봇
<span class="side-notif" title="1 new messages"></span>
<span class="fas fa-headset"></span>
</a>
</li>
<li>
<a class="sidebar-item d-flex justify-content-between align-items-center" href="info_change">
회원정보수정
<span class="fas fa-user-cog"></span>
</a>
</li>
<li>
<a class="sidebar-item d-flex justify-content-between align-items-center" href="logout">
로그아웃
<span class="fas fa-sign-out-alt"></span>
</a>
</li>
<li>
<a class="sidebar-item d-flex justify-content-between align-items-center" href="memberDelete">
회원탈퇴
<span class="fas fa-user-slash"></span>
</a>
</li>
</ul>
</div>
</div>
2. 마이페이지 tab 정보
1) Mypage - 정보 count / 회원정보출력 / 레시피 / 클래스
Mypage_ingVO(페이징처리)/ 클래스 resultmap(classVO) / MypageMapper / MypageDAOInter / MypageDAOImple / MypageController
- Mypage_ingVO(페이징처리)
package kr.co.ikosmo.mvc.vo;
//아직 안쓰는 VO -> 안됨
public class Mypage_ingVO {
// nowPage - 현재페이지
// startPage - 시작페이지
// endPage - 끝페이지
// total - 게시글 총 갯수
// cntPerPage - 페이지당 글 갯수, 마지막페이지
// lastPage - 마지막페이지
// start, end - 페이지 분할 값
private int nowPage, startPage, endPage, total, cntPerPage, lastPage, start, end;
private int cntPage = 6;
//-------------------------------------------------
//세션값 받아오기
public String getSessionId() {
return sessionId;
}
public void setSessionId(String sessionId) {
this.sessionId = sessionId;
}
private String sessionId;
//-------------------------------------------------
public Mypage_ingVO() {
}
public Mypage_ingVO(int total, int nowPage, int cntPerPage) {
this.nowPage=nowPage;
this.cntPerPage=cntPerPage;
this.total=total;
memberLastPage(total, cntPerPage);
memberStartEndPage(nowPage, cntPage);
memberStartEnd(nowPage, cntPerPage);
}
// 제일 마지막 페이지 계산
private void memberLastPage(int total, int cntPerPage) {
// 1.1page 올림처리 -> 2페이지 , 갯수 10 당 -> 11 개라면
lastPage = (int) Math.ceil((double)total / (double)cntPerPage);
}
// 시작, 끝 페이지 계산
private void memberStartEndPage(int nowPage, int cntPage) {
endPage = ((int)Math.ceil((double)nowPage / (double)cntPage)) * cntPage;
if (getLastPage() < getEndPage()) {
endPage = getLastPage();
}
startPage =getEndPage() - cntPage + 1;
if (getStartPage() < 1) {
startPage = 1;
}
}
private void memberStartEnd(int nowPage, int cntPerPage) {
end = nowPage * cntPerPage;
start = end - cntPerPage + 1;
}
public int getNowPage() {
return nowPage;
}
public void setNowPage(int nowPage) {
this.nowPage = nowPage;
}
public int getStartPage() {
return startPage;
}
public void setStartPage(int startPage) {
this.startPage = startPage;
}
public int getEndPage() {
return endPage;
}
public void setEndPage(int endPage) {
this.endPage = endPage;
}
public int getTotal() {
return total;
}
public void setTotal(int total) {
this.total = total;
}
public int getCntPerPage() {
return cntPerPage;
}
public void setCntPerPage(int cntPerPage) {
this.cntPerPage = cntPerPage;
}
public int getLastPage() {
return lastPage;
}
public void setLastPage(int lastPage) {
this.lastPage = lastPage;
}
public int getStart() {
return start;
}
public void setStart(int start) {
this.start = start;
}
public int getEnd() {
return end;
}
public void setEnd(int end) {
this.end = end;
}
public int setCntPage() {
return cntPage;
}
public void getCntPage(int cntPage) {
this.cntPage = cntPage;
}
@Override
public String toString() {
return "PagingVO [nowPage=" + nowPage + ", startPage=" + startPage + ", endPage=" + endPage + ", total=" + total
+ ", cntPerPage=" + cntPerPage + ", lastPage=" + lastPage + ", start=" + start + ", end=" + end
+ ", cntPage=" + cntPage + "]";
}
}
- 클래스 목록 resultmap
public class ClassVO {
//이거 추가
private ClassPayInfoVO payinfo;
- MypageMapper
<?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="mpp">
<!-- ==========
레시피 목록 띄우기
============= -->
<!-- 페이징 처리 -->
<select id="list" resultType="recipeinfo" parameterType="hashMap">
select * from (select rownum r_num, a.* from (select * from recipe_info
where recipe_info.mem_no=(select mem_no from member_info where mem_no=#{sessionNo} )order by recipe_no desc ) a)
where r_num between #{start} and #{end}
</select><!-- 시작점과 끝점(한페이지에 몇개의 목록만 나올것인지 -->
<!-- 페이징 처리 할 때 몇개씩 끊을지 갯수 세기 -->
<select id="totalCount" resultType="int">
select count(*) cnt from recipe_info
</select>
<!-- ==========
클래스 고객 목록 띄우기
============= -->
<!-- 3. classlist_resultmap -->
<resultMap type="classvo" id="classlist_resultmap">
<id property="class_no" column="class_no" javaType="int"/>
<result property="mem_no" column="mem_no"/>
<result property="class_price" column="class_price"/>
<result property="class_title" column="class_title"/>
<result property="class_thumbnail" column="class_thumbnail"/>
<result property="class_price" column="class_price"/>
<!-- payinfo-> classpay_info -->
<association property="payinfo" column="pay_info_no" javaType="classpayinfovo">
<id property="pay_info_no" column="pay_info_no"/>
<result property="mem_no" column="mem_no"/>
<result property="class_no" column="class_no"/>
<result property="pay_info_date" column="pay_info_date"/>
</association>
</resultMap>
<!-- 고객이 듣는 클래스 목록 띄우기 -->
<select id="classlist" resultMap="classlist_resultmap" parameterType="int">
select * from class_info c join pay_info p
on c.class_no = p.class_no
where p.mem_no=#{mem_no} order by c.class_no desc
</select>
<!-- =============
statistic 숫자 카운트
================ -->
<!-- 내레시피 -->
<select id="myRecipeCount" resultType="int" parameterType="int">
select count(*) from recipe_info
where mem_no = #{sessionNo}
</select>
<!-- 내레시피에 달린 코멘트 갯수 -->
<select id="myReviewCount" resultType="int" parameterType="int">
select count(*) from review v join recipe_info r
on v.recipe_no = r.recipe_no
where r.mem_no =#{sessionNo}
</select>
<!-- (고객)내가 듣는 클래스 갯수 -->
<select id="myClassCount" resultType="int" parameterType="int">
select count(*) from class_info c join pay_info p
on c.class_no = p.class_no
where p.mem_no=#{sessionNo}
</select>
<!-- 스크랩한 레시피 갯수 -->
<select id="myScrapCount" resultType="int" parameterType="int">
select count(*) from scrap s join recipe_info r
on s.recipe_no = r.recipe_no
where s.mem_no=#{sessionNo}
</select>
<!-- 내가 쓴 레시피의 별점 평균 -->
<select id="myStarAvgCount" resultType="int" parameterType="int">
select avg(star_rate) from review v join recipe_info r
on v.recipe_no = r.recipe_no
where r.mem_no = #{sessionNo}
</select>
<!-- ====================================== 카테고리Mapper ====================================================== -->
- MypageDAOInter
package kr.co.ikosmo.mvc.dao;
import java.util.List;
import java.util.Map;
import kr.co.ikosmo.mvc.vo.ClassVO;
import kr.co.ikosmo.mvc.vo.Recipe_infoVO;
import kr.co.ikosmo.mvc.vo.ReviewVO;
import kr.co.ikosmo.mvc.vo.ScrapVO;
public interface MypageDAOInter {
//---------------
//레시피 목록 - 페이징
//---------------
public List<Recipe_infoVO> getList(Map<String,Integer> map); //페이징 처리
public int getTotalCount();//페이징 카운트
//------------
//클래스 목록 출력
//------------
public List<ClassVO> getClassList(int mem_no);//클래스 리스트
//------------------
//statistic 숫자 카운트
//------------------
public int getMyRecipeCount(Map<String,Integer> map); //내 레시피 갯수
public int getMyReviewCount(Map<String,Integer> map); //내 레시피에 달린 리뷰 갯수
public int getMyClassCount(Map<String,Integer> map); //수강중인 클래스 갯수
public int getMyScrapCount(Map<String,Integer> map); //스크랩한 레시피 갯수
public int getMyStarAvgCount(Map<String,Integer> map); //내가 쓴 레시피의 별점 평균
- MypageDAOImple
package kr.co.ikosmo.mvc.dao;
import java.util.List;
import java.util.Map;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import kr.co.ikosmo.mvc.vo.ClassVO;
import kr.co.ikosmo.mvc.vo.Recipe_infoVO;
import kr.co.ikosmo.mvc.vo.ReviewVO;
import kr.co.ikosmo.mvc.vo.ScrapVO;
@Repository
public class MypageDAOImple implements MypageDAOInter{
@Autowired
private SqlSessionTemplate ss;
//---------------
//레시피 목록 - 페이징
//---------------
@Override
public List<Recipe_infoVO> getList(Map<String,Integer> map){ //nowPage등으로 연산이 된 start,end
return ss.selectList("mpp.list",map);
}
@Override
public int getTotalCount() {//전체 데이터를 기준으로 페이지를 나눌것이기 때문에..
return ss.selectOne("mpp.totalCount");
}
//------------
//클래스 목록 출력
//------------
@Override
public List<ClassVO> getClassList(int mem_no) { //클래스 리스트 출력
return ss.selectList("mpp.classlist", mem_no);
}
//------------------
//statistic 숫자 카운트
//------------------
@Override
public int getMyRecipeCount(Map<String,Integer> map) { //내 레시피 갯수
return ss.selectOne("mpp.myRecipeCount", map);
}
@Override
public int getMyReviewCount(Map<String,Integer> map) { //내 레시피에 달린 리뷰 갯수
return ss.selectOne("mpp.myReviewCount", map);
}
@Override
public int getMyClassCount(Map<String,Integer> map) { //수강중인 클래스 갯수
return ss.selectOne("mpp.myClassCount", map);
}
@Override
public int getMyScrapCount(Map<String,Integer> map) { //스크랩한 레시피 갯수
return ss.selectOne("mpp.myScrapCount", map);
}
@Override
public int getMyStarAvgCount(Map<String,Integer> map) { //내가 쓴 레시피의 별점 평균
return ss.selectOne("mpp.myStarAvgCount", map);
}
- MypageController
package kr.co.ikosmo.mvc.controller;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import kr.co.ikosmo.mvc.dao.MypageDAOInter;
import kr.co.ikosmo.mvc.vo.ClassVO;
import kr.co.ikosmo.mvc.vo.Mypage_ingVO;
import kr.co.ikosmo.mvc.vo.Recipe_infoVO;
import kr.co.ikosmo.mvc.vo.ReviewVO;
@Controller
public class MypageController {
@Autowired
private MypageDAOInter mypageDAOInter;
//-----------------------
//레시피 최근 5개 목록(페이징x)
//-----------------------
@RequestMapping(value="/Mypage")
public String listSearch(Mypage_ingVO vo, Model model, HttpSession session,
@RequestParam(value="nowPage", required=false ,defaultValue="1")
String nowPage,
@RequestParam(value="cntPerPage", required=false , defaultValue="5")
String cntPerPage){
int total = mypageDAOInter.getTotalCount();
vo = new Mypage_ingVO(total, Integer.parseInt(nowPage), Integer.parseInt(cntPerPage));
System.out.println("Start :"+vo.getStart());
System.out.println("End :"+vo.getEnd());
Integer sessionNo = (Integer)session.getAttribute("memNo");
Map<String,Integer> map = new HashMap();
map.put("start",vo.getStart());
map.put("end",vo.getEnd());
map.put("sessionNo",sessionNo);
model.addAttribute("paging", vo);
model.addAttribute("list", mypageDAOInter.getList(map));
//--------------------
//클래스 리스트 목록(동일페이지)
//--------------------
//클래스 리스트출력-------------------------------------------------
int mem_no = Integer.parseInt(session.getAttribute("memNo").toString());
System.out.println("클래스 리스트에 출력되는 mem번호 : "+ mem_no); //콘솔확인
List<ClassVO> classlist = mypageDAOInter.getClassList(mem_no);
model.addAttribute("classlist", classlist);
//클래스 리스트출력 끝-------------------------------------------------
//--------------------
//statistic 숫자 카운트
//--------------------
//statistic 숫자출력-------------------------------------------------
//map.put("class_no",class_no);
//map.put("recipe_no",recipe_no);
model.addAttribute("myRecipeCount", mypageDAOInter.getMyRecipeCount(map)); //내 레시피 갯수
model.addAttribute("myReviewCount", mypageDAOInter.getMyReviewCount(map)); //내 레시피에 달린 리뷰 갯수
model.addAttribute("myClassCount", mypageDAOInter.getMyClassCount(map)); //수강중인 클래스 갯수
model.addAttribute("myScrapCount", mypageDAOInter.getMyScrapCount(map)); //스크랩한 레시피 갯수
model.addAttribute("myStarAvgCount", mypageDAOInter.getMyStarAvgCount(map)); //내가 쓴 레시피의 별점 평균
//statistic 숫자출력 끝-------------------------------------------------
return "tiles/Mypage";
}
2) jsp - Mypage.jsp(전체)
Mypage.jsp
- Mypage.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>마이페이지</title>
<!-- <base href=""> -->
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="icon" type="image/x-icon" href="./resources/img/favicon.ico">
<link rel="stylesheet" type="text/css" href="./resources/css/header.css" media="all" />
<link rel="stylesheet" type="text/css" href="./resources/css/main.css" media="all" />
<link rel="stylesheet" type="text/css" href="./resources/css/style.css" media="all" />
<!-- 따로 추가 -->
<script src="//maxcdn.bootstrapcdn.com/bootstrap/4.1.1/js/bootstrap.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<link href="https://fonts.googleapis.com/css?family=Open+Sans:300,400,600,700" rel="stylesheet">
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.3.1/css/all.min.css" rel="stylesheet">
<!------ Include the above in your HEAD tag ---------->
<!--
<link rel="stylesheet" type="text/css" href="./resources/css/plugins/bootstrap.min.css" media="all" />
<link rel="stylesheet" type="text/css" href="./resources/css/primary-skin.css" media="all" />
<link rel="stylesheet" type="text/css" href="./resources/css/plugins/animate.min.css" media="all" />
<link rel="stylesheet" type="text/css" href="./resources/css/plugins/magnific-popup.css" media="all" />
<link rel="stylesheet" type="text/css" href="./resources/css/plugins/slick.css" media="all" />
<link rel="stylesheet" type="text/css" href="./resources/css/plugins/slick-theme.css" media="all" />
<!--
-->
<!--********** 【 js 링크 걸기 】********** -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/bxslider/4.2.12/jquery.bxslider.min.js"></script>
<script src="./resources/js/main.js" type="text/javascript" charset="utf-8"></script>
<script src="./resources/js/plugins/bootstrap.min.js" type="text/javascript" charset="utf-8"></script>
<!--
<script src="./resources/js/plugins/isotope.pkgd.min.js" type="text/javascript" charset="utf-8"></script>
<script src="./resources/js/plugins/jquery.countdown.min.js" type="text/javascript" charset="utf-8"></script>
<script src="./resources/js/plugins/jquery.magnific-popup.min.js" type="text/javascript" charset="utf-8"></script>
<script src="./resources/js/plugins/jquery.slimScroll.min.js" type="text/javascript" charset="utf-8"></script>
<script src="./resources/js/plugins/jquery.steps.min.js" type="text/javascript" charset="utf-8"></script>
<script src="./resources/js/plugins/jquery-3.4.1.min.js" type="text/javascript" charset="utf-8"></script>
<script src="./resources/js/plugins/popper.min.js" type="text/javascript" charset="utf-8"></script>
<script src="./resources/js/plugins/slick.min.js" type="text/javascript" charset="utf-8"></script>
<script src="./resources/js/plugins/waypoint.js" type="text/javascript" charset="utf-8"></script>
-->
<!--
-->
</head>
<body>
<app-root>
<!-- 마이페이지 Start -->
<section id="about-us" class="py-5">
<div class="container">
<div class="row">
<!--left sidebar-->
<div class="col-md-3 pr-md-4">
<div class="sidebar-left">
<!--sidebar menu-->
<ul class="list-unstyled sidebar-menu pl-md-2 pr-md-0">
<li>
<a class="sidebar-item active d-flex justify-content-between align-items-center" href="Myrecipe_list">
내가 쓴 레시피 보기
<span class="fas fa-copy"></span>
</a>
</li>
<li>
<a class="sidebar-item d-flex justify-content-between align-items-center" href="My_bigdata">
내 레시피 정보(빅데이터)
<span class="fas fa-chart-line"></span>
</a>
</li>
<li>
<a class="sidebar-item d-flex justify-content-between align-items-center" href="review">
나에게 달린 코멘트
<span class="side-notif" title="1 new comment"></span>
<span class="fas fa-comment"></span>
</a>
</li>
<li>
<a class="sidebar-item d-flex justify-content-between align-items-center" href="Myscrap">
레시피 스크랩
<span class="fas fa-bookmark"></span>
</a>
</li>
<li>
<a class="sidebar-item d-flex justify-content-between align-items-center" href="storeCart">
장바구니
<span class="fas fa-cart-arrow-down"></span>
</a>
</li>
<li>
<a class="sidebar-item d-flex justify-content-between align-items-center" href="chat_us2">
고객센터 챗봇
<span class="side-notif" title="1 new messages"></span>
<span class="fas fa-headset"></span>
</a>
</li>
<li>
<a class="sidebar-item d-flex justify-content-between align-items-center" href="info_change">
회원정보수정
<span class="fas fa-user-cog"></span>
</a>
</li>
<li>
<a class="sidebar-item d-flex justify-content-between align-items-center" href="logout">
로그아웃
<span class="fas fa-sign-out-alt"></span>
</a>
</li>
<li>
<a class="sidebar-item d-flex justify-content-between align-items-center" href="memberDelete">
회원탈퇴
<span class="fas fa-user-slash"></span>
</a>
</li>
</ul>
</div>
</div>
<!--Content-->
<div class="col-md-9">
<div class="dashboard-area">
<div class="row">
<div class="col-12">
<div class="mb-3 bg-dark">
<div class="row">
<div class="col-12">
<a class="position-absolute ml-3 mt-3 text-white" href="info_change" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="Edit cover images"><i class="fas fa-cog"></i></a>
<div class="row">
<div class="col-md-6 ml-auto mr-auto">
<div class="profiles p-3 my-4 rounded text-center shadow-sm">
<div class="avatars">
<img src="${pageContext.request.contextPath}/resources/image/member_upload/${sessionScope.memPic}" style="height: 100px; width: 100px;"
alt="Circle Image" class="avatar-lg rounded-circle img-fluid" data-toggle="tooltip" data-placement="bottom" title="mem_pic" data-original-title="Edit avatar images">
</div>
<div class="names">
<h3 class="title text-light">"${sessionScope.memNickname}"님 <br>환영합니다.</h3>
<a href="#" class="btn btn-link btn-facebook"><i class="fab fa-facebook"></i></a>
<a href="#" class="btn btn-link btn-twitter"><i class="fab fa-twitter"></i></a>
<a href="#" class="btn btn-link btn-gplus"><i class="fab fa-google-plus"></i></a>
<a href="#" class="btn btn-link btn-instagram"><i class="fab fa-instagram"></i></a>
<a href="#" class="btn btn-link btn-youtube"><i class="fab fa-youtube"></i></a>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-12">
<ul class="nav nav-pills mb-5" id="pills-tab" role="tablist">
<li class="nav-item">
<a class="nav-link active show" id="pills-home-tab" data-toggle="pill" href="#pills-home" role="tab" aria-controls="pills-home" aria-selected="true">Statistic</a>
</li>
<li class="nav-item">
<a class="nav-link" id="pills-profile-tab" data-toggle="pill" href="#pills-profile" role="tab" aria-controls="pills-profile" aria-selected="false">Profile</a>
</li>
<li class="nav-item">
<a class="nav-link" id="pills-contact-tab" data-toggle="pill" href="#pills-contact" role="tab" aria-controls="pills-contact" aria-selected="false">Lastest Post</a>
</li>
<li class="nav-item">
<a class="nav-link" id="pills-class-tab" data-toggle="pill" href="#pills-class" role="tab" aria-controls="pills-class" aria-selected="false">Class</a>
</li>
</ul>
<div class="tab-content" id="pills-tabContent">
<div class="tab-pane fade active show" id="pills-home" role="tabpanel" aria-labelledby="pills-home-tab">
<div class="row">
<div class="col-lg-4 col-sm-6">
<a class="member-item" href="">
<div class="card mb-2 mb-md-5 py-3">
<div class="content">
<div class="row">
<div class="col-6 d-flex justify-content-center align-items-center">
<div class="icon-big text-warning text-center">
<i class="fas fa-copy"></i>
</div>
</div>
<div class="col-6 d-flex justify-content-center align-items-center">
<div class="numbers">
<p>내 레시피</p>
${myRecipeCount}
</div>
</div>
</div>
</div>
</div>
</a>
</div>
<div class="col-lg-4 col-sm-6">
<a class="member-item" href="">
<div class="card mb-2 mb-md-5 py-3">
<div class="content">
<div class="row">
<div class="col-6 d-flex justify-content-center align-items-center">
<div class="icon-big text-info text-center" title="1 new comment">
<div class="notif"></div>
<i class="fas fa-comment"></i>
</div>
</div>
<div class="col-6 d-flex justify-content-center align-items-center">
<div class="numbers">
<p>코멘트</p>
${myReviewCount}
</div>
</div>
</div>
</div>
</div>
</a>
</div>
<div class="col-lg-4 col-sm-6">
<a class="member-item" href="">
<div class="card mb-2 mb-md-5 py-3">
<div class="content">
<div class="row">
<div class="col-6 d-flex justify-content-center align-items-center">
<div class="icon-big text-danger text-center">
<i class="fas fa-bookmark"></i>
</div>
</div>
<div class="col-6 d-flex justify-content-center align-items-center">
<div class="numbers">
<p>레시피 스크랩</p>
${myScrapCount}
</div>
</div>
</div>
</div>
</div>
</a>
</div>
<div class="col-lg-4 col-sm-6">
<a class="member-item" href="">
<div class="card mb-2 mb-md-5 py-3">
<div class="content">
<div class="row">
<div class="col-6 d-flex justify-content-center align-items-center">
<div class="icon-big text-success text-center">
<i class="fas fa-utensils"></i>
</div>
</div>
<div class="col-6 d-flex justify-content-center align-items-center">
<div class="numbers">
<p>수강중인 클래스</p>
${myClassCount}
</div>
</div>
</div>
</div>
</div>
</a>
</div>
<div class="col-lg-4 col-sm-6">
<a class="member-item" href="">
<div class="card mb-2 mb-md-5 py-3">
<div class="content">
<div class="row">
<div class="col-6 d-flex justify-content-center align-items-center">
<div class="icon-big text-facebook text-center">
<i class="fas fa-star"></i>
</div>
</div>
<div class="col-6 d-flex justify-content-center align-items-center">
<div class="numbers">
<p>???</p>
뭐넣지?
</div>
</div>
</div>
</div>
</div>
</a>
</div>
<div class="col-lg-4 col-sm-6">
<a class="member-item" href="">
<div class="card mb-2 mb-md-5 py-3">
<div class="content">
<div class="row">
<div class="col-6 d-flex justify-content-center align-items-center">
<div class="icon-big text-warning text-center">
<i class="fas fa-star"></i>
</div>
</div>
<div class="col-6 d-flex justify-content-center align-items-center">
<div class="numbers">
<p>내 평균 별점</p>
${myStarAvgCount}
</div>
</div>
</div>
</div>
</div>
</a>
</div>
</div>
</div>
<div class="tab-pane fade" id="pills-profile" role="tabpanel" aria-labelledby="pills-profile-tab">
<div class="p-3 border mb-3">
<a class="position-absolute" style="right: 25px" href="info_change" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="Edit profile"><i class="fas fa-user-cog"></i></a>
<h3>"${sessionScope.memNickname}"님의 정보입니다.</h3>
<p><b>아이디: </b>${sessionScope.memId}</p>
<p><b>이름: </b>${sessionScope.memName}</p>
<p><b>닉네임: </b>${sessionScope.memNickname}</p>
<p><b>이메일: </b>${sessionScope.memEmail}</p>
<p><b>핸드폰번호: </b>${sessionScope.memPhone}</p>
</div>
</div>
<div class="tab-pane fade" id="pills-review" role="tabpanel" aria-labelledby="pills-review-tab">
<div class="p-3 border mb-3">
<h5>최근 달린 리뷰 보기</h5>
<div class="row">
<div class="col-12">
<ul class="list-unstyled statistics">
<table>
<thead>
<tr>
<th colspan="6">내 레시피에 달린 리뷰</th>
</tr>
<tr>
<td>번호</td>
<td>섬네일</td>
<td>제목</td>
<td>리뷰작성자</td>
<td>리뷰내용</td>
<td>리뷰작성일자</td>
</tr>
</thead>
<tbody>
<c:forEach var="reviewRecipelist" items="${reviewRecipelist}">
<tr>
<!-- 세션값을 여기에서 mem_no로 숨겨받아서 다시 Controller로 -->
<input type="hidden" name="mem_no" id="mem_no" value="${sessionScope.memNo}"/>
<td>${reviewRecipelist.review_no}</td>
<td><a href="recipe_detail?recipe_no=${reviewRecipelist.recipe2_asso.recipe_no}"><img src="${pageContext.request.contextPath}/resources\image\recipe_upload/${reviewRecipelist.recipe2_asso.recipe_thumbnail}"
style="height: 100px; width: 100px;"/></a></td>
<td><a href="recipe_detail?recipe_no=${reviewRecipelist.recipe2_asso.recipe_no}">${reviewRecipelist.recipe2_asso.recipe_title}</a></td>
<td>${reviewRecipelist.mem_no}</td>
<td>${reviewRecipelist.review_content}</td>
<td>${reviewRecipelist.review_date}</td>
</tr>
</c:forEach>
</tbody>
</table>
</ul>
</div>
</div>
</div>
</div>
<div class="tab-pane fade" id="pills-class" role="tabpanel" aria-labelledby="pills-class-tab">
<div class="p-3 border mb-3">
<h5>수강중인 클래스 보기</h5>
<div class="row">
<div class="col-12">
<ul class="list-unstyled statistics">
<table>
<thead>
<tr>
<th colspan="5">클래스 리스트</th>
</tr>
<tr>
<td>번호</td>
<td>섬네일</td>
<td>제목</td>
<td>가격</td>
<td>구매일자</td>
</tr>
</thead>
<tbody>
<c:forEach var="classlist" items="${classlist}">
<tr>
<!-- 세션값을 여기에서 mem_no로 숨겨받아서 다시 Controller로 -->
<input type="hidden" name="mem_no" id="mem_no" value="${sessionScope.memNo}"/>
<td>${classlist.class_no}</td>
<td><a href="class_detail?class_no=${classlist.class_no}"><img src="${pageContext.request.contextPath}/resources\image\FoodImg/${classlist.class_thumbnail}"
style="height: 100px; width: 100px;"/></a></td>
<td><a href="class_detail?class_no=${classlist.class_no}">${classlist.class_title}</a></td>
<td>${classlist.class_price}</td>
<td>${classlist.payinfo.pay_info_date}</td>
</tr>
</c:forEach>
</tbody>
</table>
</ul>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
<!--마이페이지 End -->
</app-root>
</body>
</html>
3. 카테고리 정보
1) Mypage - 내 레시피 / 코멘트 / 스크랩
코멘트,스크랩 esultmap(review/scrapVO) / MypageMapper / MypageDAOInter / MypageDAOImple / MypageController
- 코멘트 / 스크랩 목록 resultmap
public class ReviewVO {
//--------------------------------------
//리뷰 페이지에서 레시피 부문 가져오기 위함.
private Recipe_infoVO recipe2_asso; //이거 추가
//--------------------------------------
public class ScrapVO {
//--------------------------------
//스크랩 페이지에서 레시피 부문 가져오기 위함.
private Recipe_infoVO recipe_asso;
private Mypage_ingVO paging_asso;
//--------------------------------
- MypageMapper
<!-- ====================================== 카테고리Mapper ====================================================== -->
<!-- ==========
코멘트 목록 띄우기
============= -->
<!-- 2. review_resultmap -->
<resultMap type="reviewvo" id="review_resultmap">
<id property="review_no" column="review_no" javaType="int"/>
<result property="mem_no" column="mem_no"/>
<result property="class_no" column="class_no"/>
<result property="recipe_no" column="recipe_no"/>
<result property="star_rate" column="star_rate"/>
<result property="review_declare" column="review_declare"/>
<result property="type" column="type"/>
<result property="review_content" column="review_content"/>
<result property="review_date" column="review_date"/>
<!-- 리뷰가 레시피랑 멤버를 가져와야한다. -->
<association property="recipe2_asso" column="recipe_no" javaType="recipeinfo">
<id property="recipe_no" column="recipe_no"/>
<result property="recipe_title" column="recipe_title"/><!-- 값 -->
<result property="recipe_thumbnail" column="recipe_thumbnail"/>
<result property="recipe_video" column="recipe_video"/>
<result property="recipe_content" column="recipe_content"/>
<result property="recipe_time" column="recipe_time"/>
<result property="recipe_level" column="recipe_level"/>
<result property="recipe_uploadtime" column="recipe_uploadtime"/>
</association>
</resultMap>
<!-- 코멘트(리뷰) 목록 띄우기 -->
<select id="reviewlist" parameterType="hashMap" resultMap="review_resultmap">
select * from (select rownum r_num, a.* from (
select * from review v join recipe_info r
on v.recipe_no = r.recipe_no
where r.mem_no = #{sessionNo} order by v.review_no desc
) a)
where r_num between #{start} and #{end}
</select>
<!-- 끊을 갯수 -->
<select id="totalreviewCount" resultType="int">
select count(*) cnt from review
</select>
<!-- ==========
스크랩 목록 띄우기
============= -->
<!-- 1. scrap_resultmap -->
<resultMap type="scrapvo" id="scrap_resultmap"><!-- resultmap을 부르는 id -->
<id property="scrap_no" column="scrap_no" javaType="int"/>
<result property="mem_no" column="mem_no" javaType="int"/>
<result property="recipe_no" column="recipe_no" javaType="int"/>
<result property="scrap_cnt" column="scrap_cnt" javaType="int"/>
<result property="scrap_uploadtime" column="scrap_uploadtime"/>
<!-- private Recipe_infoVO recipe_asso;
private Mypage_ingVO paging_asso;-->
<association property="recipe_asso" column="recipe_no" javaType="recipeinfo">
<id property="recipe_no" column="recipe_no"/>
<result property="recipe_title" column="recipe_title"/><!-- 값 -->
<result property="recipe_thumbnail" column="recipe_thumbnail"/>
<result property="recipe_video" column="recipe_video"/>
<result property="recipe_content" column="recipe_content"/>
<result property="recipe_time" column="recipe_time"/>
<result property="recipe_level" column="recipe_level"/>
<result property="recipe_uploadtime" column="recipe_uploadtime"/>
</association>
<association property="paging_asso" column="total" javaType="pvo">
<id property="total" column="total"/>
<result property="nowPage" column="nowPage"/><!-- 값 -->
<result property="startPage" column="startPage"/>
<result property="endPage" column="endPage"/>
<result property="total" column="total"/>
<result property="cntPerPage" column="cntPerPage"/>
<result property="lastPage" column="lastPage"/>
<result property="start" column="start"/>
<result property="end" column="end"/>
<result property="cntPage" column="cntPage"/>
</association>
</resultMap>
<!-- 스크랩 목록 띄우기 -->
<select id="scrapList" parameterType="hashMap" resultMap="scrap_resultmap">
select * from (select rownum r_num, a.* from (
select * from scrap s join recipe_info r on s.recipe_no = r.recipe_no
where s.mem_no=(select mem_no from member_info where mem_no=#{sessionNo} )order by scrap_no desc
) a)
where r_num between #{start} and #{end}
</select>
<!-- 끊을 갯수 -->
<select id="totalscrapCount" resultType="int">
select count(*) cnt from scrap
</select>
<!-- ==========
레시피 목록 띄우기
============= -->
<!-- 페이징 처리 -->
<select id="listr" resultType="recipeinfo" parameterType="hashMap">
select * from (select rownum r_num, a.* from (select * from recipe_info
where recipe_info.mem_no=(select mem_no from member_info where mem_no=#{sessionNo} )order by recipe_no desc ) a)
where r_num between #{start} and #{end}
</select><!-- 시작점과 끝점(한페이지에 몇개의 목록만 나올것인지 -->
<!-- 페이징 처리 할 때 몇개씩 끊을지 갯수 세기 -->
<select id="totalMyrecipeCount" resultType="int">
select count(*) cnt from recipe_info
</select>
</mapper>
- MypageDAOInter
//========================================= 카테고리 ===============================================
//------------
//리뷰 목록 출력
//------------
public List<ReviewVO> getReviewlist(Map<String,Integer> map);//리뷰 리스트 출력
public int getTotalReviewList();//페이징 카운트
//------------
//스크랩 목록 출력
//------------
public List<ScrapVO> getscrapList(Map<String,Integer> map); //스크랩 리스트 출력
public int getTotalscrapList();//페이징 카운트
//---------------
//레시피 목록 - 페이징
//---------------
public List<Recipe_infoVO> getMyrecipeList(Map<String,Integer> map); //페이징 처리
public int getMyrecipeTotalCount();//페이징 카운트
}
- MypageDAOImple
//========================================= 카테고리 ===============================================
//------------
//리뷰 목록 출력
//------------
@Override //레시피 리스트 출력
public List<ReviewVO> getReviewlist(Map<String,Integer> map){//리뷰 리스트 출력
return ss.selectList("mpp.reviewlist", map);
}
@Override
public int getTotalReviewList() {//페이징 카운트
return ss.selectOne("mpp.totalreviewCount");
}
//------------
//스크랩 목록 출력
//------------
@Override
public List<ScrapVO> getscrapList(Map<String,Integer> map){ //nowPage등으로 연산이 된 start,end
return ss.selectList("mpp.scrapList",map);
}
@Override
public int getTotalscrapList() {//전체 데이터를 기준으로 페이지를 나눌것이기 때문에..
return ss.selectOne("mpp.totalscrapCount");
}
//---------------
//레시피 목록 - 페이징
//---------------
@Override
public List<Recipe_infoVO> getMyrecipeList(Map<String,Integer> map){ //nowPage등으로 연산이 된 start,end
return ss.selectList("mpp.listr",map);
}
@Override
public int getMyrecipeTotalCount() {//전체 데이터를 기준으로 페이지를 나눌것이기 때문에..
return ss.selectOne("mpp.totalMyrecipeCount");
}
}
- MypageController
/* =================================== 카테고리 =================================== */
//--------------------
//리뷰 리스트 목록(resultmap)
//--------------------
@RequestMapping(value="/review")
public String listMyComment(Mypage_ingVO vo, Model model, HttpSession session,
@RequestParam(value="nowPage", required=false ,defaultValue="1")
String nowPage,
@RequestParam(value="cntPerPage", required=false , defaultValue="10")
String cntPerPage){
int total = mypageDAOInter.getTotalReviewList();
vo = new Mypage_ingVO(total, Integer.parseInt(nowPage), Integer.parseInt(cntPerPage));
System.out.println("Start :"+vo.getStart());
System.out.println("End :"+vo.getEnd());
Integer sessionNo = (Integer)session.getAttribute("memNo");
Map<String,Integer> map = new HashMap<String, Integer>();
map.put("start",vo.getStart());
map.put("end",vo.getEnd());
map.put("sessionNo",sessionNo);
model.addAttribute("paging", vo);
model.addAttribute("reviewlist", mypageDAOInter.getReviewlist(map));
return "tiles/review";
}
//--------------------
//스크랩 리스트 목록(페이징)
//--------------------
@RequestMapping(value="/Myscrap")
public String listScrap(Mypage_ingVO vo, Model model, HttpSession session,
@RequestParam(value="nowPage", required=false ,defaultValue="1")
String nowPage,
@RequestParam(value="cntPerPage", required=false , defaultValue="5")
String cntPerPage){
int total = mypageDAOInter.getTotalscrapList();
vo = new Mypage_ingVO(total, Integer.parseInt(nowPage), Integer.parseInt(cntPerPage));
System.out.println("Start :"+vo.getStart());
System.out.println("End :"+vo.getEnd());
Integer sessionNo = (Integer)session.getAttribute("memNo");
Map<String,Integer> map = new HashMap<String, Integer>();
map.put("start",vo.getStart());
map.put("end",vo.getEnd());
map.put("sessionNo",sessionNo);
model.addAttribute("paging", vo);
model.addAttribute("scrapList", mypageDAOInter.getscrapList(map));
return "tiles/Myscrap";
}
//--------------------
//레시피 리스트 목록(페이징)
//--------------------
@RequestMapping(value="/Myrecipe_list")
public String listMyrecipe(Mypage_ingVO vo, Model model, HttpSession session,
@RequestParam(value="nowPage", required=false ,defaultValue="1")
String nowPage,
@RequestParam(value="cntPerPage", required=false , defaultValue="6")
String cntPerPage){
int total = mypageDAOInter.getMyrecipeTotalCount();
vo = new Mypage_ingVO(total, Integer.parseInt(nowPage), Integer.parseInt(cntPerPage));
System.out.println("Start :"+vo.getStart());
System.out.println("End :"+vo.getEnd());
Integer sessionNo = (Integer)session.getAttribute("memNo");
Map<String,Integer> map = new HashMap();
map.put("start",vo.getStart());
map.put("end",vo.getEnd());
map.put("sessionNo",sessionNo);
model.addAttribute("paging", vo);
model.addAttribute("listr", mypageDAOInter.getMyrecipeList(map));
return "tiles/Myrecipe_list";
}
}
2) jsp - 내 레시피목록 / 내 스크랩목록 / 나에게 달린 리뷰 목록
Myrecipe_list.jsp / Myscrap.jsp / review.jsp
- Myrecipe_list.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>나의 레시피</title>
<!-- <base href=""> -->
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="icon" type="image/x-icon" href="./resources/img/favicon.ico">
<link rel="stylesheet" type="text/css" href="./resources/css/header.css" media="all" />
<link rel="stylesheet" type="text/css" href="./resources/css/main.css" media="all" />
<link rel="stylesheet" type="text/css" href="./resources/css/style.css" media="all" />
<!-- 따로 추가 -->
<script src="//maxcdn.bootstrapcdn.com/bootstrap/4.1.1/js/bootstrap.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<link href="https://fonts.googleapis.com/css?family=Open+Sans:300,400,600,700" rel="stylesheet">
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.3.1/css/all.min.css" rel="stylesheet">
<!------ Include the above in your HEAD tag ---------->
<!--
<link rel="stylesheet" type="text/css" href="./resources/css/plugins/bootstrap.min.css" media="all" />
<link rel="stylesheet" type="text/css" href="./resources/css/primary-skin.css" media="all" />
<link rel="stylesheet" type="text/css" href="./resources/css/plugins/animate.min.css" media="all" />
<link rel="stylesheet" type="text/css" href="./resources/css/plugins/magnific-popup.css" media="all" />
<link rel="stylesheet" type="text/css" href="./resources/css/plugins/slick.css" media="all" />
<link rel="stylesheet" type="text/css" href="./resources/css/plugins/slick-theme.css" media="all" />
<!--
-->
<!--********** 【 js 링크 걸기 】********** -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/bxslider/4.2.12/jquery.bxslider.min.js"></script>
<script src="./resources/js/main.js" type="text/javascript" charset="utf-8"></script>
<script src="./resources/js/plugins/bootstrap.min.js" type="text/javascript" charset="utf-8"></script>
<!--
<script src="./resources/js/plugins/isotope.pkgd.min.js" type="text/javascript" charset="utf-8"></script>
<script src="./resources/js/plugins/jquery.countdown.min.js" type="text/javascript" charset="utf-8"></script>
<script src="./resources/js/plugins/jquery.magnific-popup.min.js" type="text/javascript" charset="utf-8"></script>
<script src="./resources/js/plugins/jquery.slimScroll.min.js" type="text/javascript" charset="utf-8"></script>
<script src="./resources/js/plugins/jquery.steps.min.js" type="text/javascript" charset="utf-8"></script>
<script src="./resources/js/plugins/jquery-3.4.1.min.js" type="text/javascript" charset="utf-8"></script>
<script src="./resources/js/plugins/popper.min.js" type="text/javascript" charset="utf-8"></script>
<script src="./resources/js/plugins/slick.min.js" type="text/javascript" charset="utf-8"></script>
<script src="./resources/js/plugins/waypoint.js" type="text/javascript" charset="utf-8"></script>
-->
<!--
-->
</head>
<body>
<app-root>
<!-- 마이페이지 Start -->
<section id="about-us" class="py-5">
<div class="container">
<div class="row">
<!--left sidebar-->
<div class="col-md-3 pr-md-4">
<div class="sidebar-left">
<!--sidebar menu-->
<ul class="list-unstyled sidebar-menu pl-md-2 pr-md-0">
<li>
<a class="sidebar-item active d-flex justify-content-between align-items-center" href="Myrecipe_list">
내가 쓴 레시피 보기
<span class="fas fa-copy"></span>
</a>
</li>
<li>
<a class="sidebar-item d-flex justify-content-between align-items-center" href="My_bigdata">
내 레시피 정보(빅데이터)
<span class="fas fa-chart-line"></span>
</a>
</li>
<li>
<a class="sidebar-item d-flex justify-content-between align-items-center" href="review">
나에게 달린 코멘트
<span class="side-notif" title="1 new comment"></span>
<span class="fas fa-comment"></span>
</a>
</li>
<li>
<a class="sidebar-item d-flex justify-content-between align-items-center" href="Myscrap">
레시피 스크랩
<span class="fas fa-bookmark"></span>
</a>
</li>
<li>
<a class="sidebar-item d-flex justify-content-between align-items-center" href="storeCart">
장바구니
<span class="fas fa-cart-arrow-down"></span>
</a>
</li>
<li>
<a class="sidebar-item d-flex justify-content-between align-items-center" href="chat_us2">
고객센터 챗봇
<span class="side-notif" title="1 new messages"></span>
<span class="fas fa-headset"></span>
</a>
</li>
<li>
<a class="sidebar-item d-flex justify-content-between align-items-center" href="info_change">
회원정보수정
<span class="fas fa-user-cog"></span>
</a>
</li>
<li>
<a class="sidebar-item d-flex justify-content-between align-items-center" href="logout">
로그아웃
<span class="fas fa-sign-out-alt"></span>
</a>
</li>
<li>
<a class="sidebar-item d-flex justify-content-between align-items-center" href="memberDelete">
회원탈퇴
<span class="fas fa-user-slash"></span>
</a>
</li>
</ul>
</div>
</div>
<div class="col-md-9">
<div class="dashboard-area">
<!--Content-->
<!-- Blog Posts Start -->
<div class="section section-padding posts">
<div class="container">
<div class="row">
<div class="col-lg-10">
<div class="row masonry">
<!-- Post Start -->
<c:forEach var="listr" items="${listr}">
<div class="col-lg-6 col-md-6 masonry-item">
<article class="post">
<div class="post-thumbnail">
<a href="recipe_detail?recipe_no=${listr.recipe_no}"><img src="${pageContext.request.contextPath}/resources/image/recipe_upload/${listr.recipe_thumbnail}"
style="height: 200px; width: 300px;"/></a>
<div class="post-meta">
<span>${listr.recipe_uploadtime}</span>
<span>조회 ${listr.visit_cnt}회</span>
</div>
</div>
<div class="post-categories">
<a href="recipe_list">{한식등 태그걸기}</a>
</div>
<div class="post-body">
<h5 class="post-title"> <a href="recipe_detail?recipe_no={listc.recipe_no}">${listr.recipe_title}</a> </h5>
<p class="post-text">${listr.recipe_content}</p>
</div>
</article>
</div>
</c:forEach>
<!-- Post End -->
</div>
</div>
</div>
<!-- Pagination Start -->
<ul class="pagination" id="pageTd">
<%-- page 처리 --%>
<%@include file="pageProcess_myRecipe.jsp" %>
</ul>
<!-- Pagination End -->
</div>
</div>
<!-- Blog Posts End -->
<!--Content End-->
</div>
</div>
</div>
</div>
</section>
<!--마이페이지 End -->
</app-root>
</body>
</html>
- Myscrap.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>스크랩</title>
<!-- <base href=""> -->
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="icon" type="image/x-icon" href="./resources/img/favicon.ico">
<link rel="stylesheet" type="text/css" href="./resources/css/header.css" media="all" /><!-- 글씨가 작아지네..?
<link rel="stylesheet" type="text/css" href="./resources/css/main.css" media="all" />
<link rel="stylesheet" type="text/css" href="./resources/css/style.css" media="all" />-->
<!------ Include the above in your HEAD tag ---------->
<link href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.0/css/bootstrap.min.css" rel="stylesheet" id="bootstrap-css">
<script src="//maxcdn.bootstrapcdn.com/bootstrap/3.3.0/js/bootstrap.min.js"></script>
<script src="//code.jquery.com/jquery-1.11.1.min.js"></script>
<link rel="stylesheet" type="text/css" href="./resources/css/Myscrap.css" media="all" />
<!------ Include the above in your HEAD tag ---------->
<!--
<link rel="stylesheet" type="text/css" href="./resources/css/plugins/bootstrap.min.css" media="all" />
<link rel="stylesheet" type="text/css" href="./resources/css/primary-skin.css" media="all" />
<link rel="stylesheet" type="text/css" href="./resources/css/plugins/animate.min.css" media="all" />
<link rel="stylesheet" type="text/css" href="./resources/css/plugins/magnific-popup.css" media="all" />
<link rel="stylesheet" type="text/css" href="./resources/css/plugins/slick.css" media="all" />
<link rel="stylesheet" type="text/css" href="./resources/css/plugins/slick-theme.css" media="all" />
<!--
-->
<!--********** 【 js 링크 걸기 】********** -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/bxslider/4.2.12/jquery.bxslider.min.js"></script>
<script src="./resources/js/main.js" type="text/javascript" charset="utf-8"></script>
<script src="./resources/js/plugins/bootstrap.min.js" type="text/javascript" charset="utf-8"></script>
<!--
<script src="./resources/js/plugins/isotope.pkgd.min.js" type="text/javascript" charset="utf-8"></script>
<script src="./resources/js/plugins/jquery.countdown.min.js" type="text/javascript" charset="utf-8"></script>
<script src="./resources/js/plugins/jquery.magnific-popup.min.js" type="text/javascript" charset="utf-8"></script>
<script src="./resources/js/plugins/jquery.slimScroll.min.js" type="text/javascript" charset="utf-8"></script>
<script src="./resources/js/plugins/jquery.steps.min.js" type="text/javascript" charset="utf-8"></script>
<script src="./resources/js/plugins/jquery-3.4.1.min.js" type="text/javascript" charset="utf-8"></script>
<script src="./resources/js/plugins/popper.min.js" type="text/javascript" charset="utf-8"></script>
<script src="./resources/js/plugins/slick.min.js" type="text/javascript" charset="utf-8"></script>
<script src="./resources/js/plugins/waypoint.js" type="text/javascript" charset="utf-8"></script>
-->
<style>
.scrap {
background-color: #bbdefb;
}
</style>
</head>
<body>
<!-- 빅데이터 Start -->
<div class="container">
<div class="row">
<section class="content">
<h1>My Scrap Box</h1>
<div class="col-md-8 col-md-offset-2">
<div class="panel panel-default">
<div class="panel-body">
<div class="table-container">
<table class="table table-filter" name="scrap">
<tbody>
<tr>
<th>스크랩 리스트</th>
</tr>
<c:forEach var="scrapList" items="${scrapList}">
<tr data-status="filter1">
<td>
<div class="media">
<a href="recipe_detail?recipe_no=${scrapList.recipe_asso.recipe_no}" class="pull-left">
<img src="${pageContext.request.contextPath}/resources/image/recipe_upload/${scrapList.recipe_asso.recipe_thumbnail}" class="media-photo" style="height: 100px; width: 100px;">
</a>
<div class="media-body">
<span class="media-meta pull-right">${scrapList.scrap_uploadtime}</span>
<h4 class="title">
${scrapList.recipe_asso.recipe_title}
<span class="pull-right pagado">${scrapList.recipe_asso.recipe_time} / ${scrapList.recipe_asso.recipe_level} </span>
</h4>
<p class="summary"><br> ${scrapList.recipe_asso.recipe_content} </p>
</div>
</div>
</td>
</tr>
</c:forEach>
</tbody>
<tfoot>
<tr>
<td colspan="4" id="pageTd">
<%-- page 처리 --%>
<%@include file="pageProcess_scrap.jsp" %>
</td>
</tr>
</tfoot>
</table>
</div>
</div>
</div>
</div>
</section>
</div>
</div>
</body>
</html>
- review.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>reviews</title>
<!-- <base href=""> -->
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="icon" type="image/x-icon" href="./resources/img/favicon.ico">
<link rel="stylesheet" type="text/css" href="./resources/css/header.css" media="all" />
<link rel="stylesheet" type="text/css" href="./resources/css/main.css" media="all" />
<link rel="stylesheet" type="text/css" href="./resources/css/style.css" media="all" />
<!-- 따로 추가 -->
<script src="//maxcdn.bootstrapcdn.com/bootstrap/4.1.1/js/bootstrap.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<link href="https://fonts.googleapis.com/css?family=Open+Sans:300,400,600,700" rel="stylesheet">
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.3.1/css/all.min.css" rel="stylesheet">
<!------ Include the above in your HEAD tag ---------->
<!-- <link rel="stylesheet" type="text/css" href="./a_기타/css/collection.css" media="all" />
<link rel="stylesheet" type="text/css" href="./a_기타/css/custom.css" media="all" /> -->
<!-- <link rel="stylesheet" type="text/css" href="./resources/css/plugins/bootstrap.min.css" media="all" />
<link rel="stylesheet" type="text/css" href="./resources/css/primary-skin.css" media="all" />
<link rel="stylesheet" type="text/css" href="./resources/css/plugins/animate.min.css" media="all" />
<link rel="stylesheet" type="text/css" href="./resources/css/plugins/magnific-popup.css" media="all" />
<link rel="stylesheet" type="text/css" href="./resources/css/plugins/slick.css" media="all" />
<link rel="stylesheet" type="text/css" href="./resources/css/plugins/slick-theme.css" media="all" /> -->
<!--********** 【 js 링크 걸기 】********** -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/bxslider/4.2.12/jquery.bxslider.min.js"></script>
<script src="./resources/js/main.js" type="text/javascript" charset="utf-8"></script>
<script src="./resources/js/plugins/bootstrap.min.js" type="text/javascript" charset="utf-8"></script>
<script src="./resources/js/plugins/isotope.pkgd.min.js" type="text/javascript" charset="utf-8"></script>
<script src="./resources/js/plugins/jquery.countdown.min.js" type="text/javascript" charset="utf-8"></script>
<script src="./resources/js/plugins/jquery.magnific-popup.min.js" type="text/javascript" charset="utf-8"></script>
<script src="./resources/js/plugins/jquery.slimScroll.min.js" type="text/javascript" charset="utf-8"></script>
<script src="./resources/js/plugins/jquery.steps.min.js" type="text/javascript" charset="utf-8"></script>
<script src="./resources/js/plugins/jquery-3.4.1.min.js" type="text/javascript" charset="utf-8"></script>
<script src="./resources/js/plugins/popper.min.js" type="text/javascript" charset="utf-8"></script>
<script src="./resources/js/plugins/slick.min.js" type="text/javascript" charset="utf-8"></script>
<script src="./resources/js/plugins/waypoint.js" type="text/javascript" charset="utf-8"></script>
<!--
-->
</head>
<body>
<app-root>
<!-- 마이페이지 Start -->
<section id="about-us" class="py-5">
<div class="container">
<div class="row">
<!--left sidebar-->
<div class="col-md-3 pr-md-4">
<div class="sidebar-left">
<!--sidebar menu-->
<ul class="list-unstyled sidebar-menu pl-md-2 pr-md-0">
<li>
<a class="sidebar-item active d-flex justify-content-between align-items-center" href="Myrecipe_list">
내가 쓴 레시피 보기
<span class="fas fa-copy"></span>
</a>
</li>
<li>
<a class="sidebar-item d-flex justify-content-between align-items-center" href="My_bigdata">
내 레시피 정보(빅데이터)
<span class="fas fa-chart-line"></span>
</a>
</li>
<li>
<a class="sidebar-item d-flex justify-content-between align-items-center" href="review">
나에게 달린 코멘트
<span class="side-notif" title="1 new comment"></span>
<span class="fas fa-comment"></span>
</a>
</li>
<li>
<a class="sidebar-item d-flex justify-content-between align-items-center" href="Myscrap">
레시피 스크랩
<span class="fas fa-bookmark"></span>
</a>
</li>
<li>
<a class="sidebar-item d-flex justify-content-between align-items-center" href="storeCart">
장바구니
<span class="fas fa-cart-arrow-down"></span>
</a>
</li>
<li>
<a class="sidebar-item d-flex justify-content-between align-items-center" href="chat_us2">
고객센터 챗봇
<span class="side-notif" title="1 new messages"></span>
<span class="fas fa-headset"></span>
</a>
</li>
<li>
<a class="sidebar-item d-flex justify-content-between align-items-center" href="info_change">
회원정보수정
<span class="fas fa-user-cog"></span>
</a>
</li>
<li>
<a class="sidebar-item d-flex justify-content-between align-items-center" href="logout">
로그아웃
<span class="fas fa-sign-out-alt"></span>
</a>
</li>
<li>
<a class="sidebar-item d-flex justify-content-between align-items-center" href="memberDelete">
회원탈퇴
<span class="fas fa-user-slash"></span>
</a>
</li>
</ul>
</div>
</div>
<div class="col-md-9">
<div class="dashboard-area">
<!--Content-->
<!-- Blog Posts Start -->
<div class="section section-padding posts">
<div class="container">
<table>
<thead>
<tr>
<th colspan="6">내 레시피에 달린 리뷰</th>
</tr>
<tr>
<td>번호</td>
<td>섬네일</td>
<td>제목</td>
<td>리뷰작성자</td>
<td>리뷰내용</td>
<td>리뷰작성일자</td>
</tr>
</thead>
<tbody>
<c:forEach var="reviewlist" items="${reviewlist}">
<tr>
<!-- 세션값을 여기에서 mem_no로 숨겨받아서 다시 Controller로 -->
<input type="hidden" name="mem_no" id="mem_no" value="${sessionScope.memNo}"/>
<td>${reviewlist.review_no}</td>
<td><a href="recipe_detail?recipe_no=${reviewlist.recipe2_asso.recipe_no}"><img src="${pageContext.request.contextPath}/resources\image\recipe_upload/${reviewlist.recipe2_asso.recipe_thumbnail}"
style="height: 100px; width: 100px;"/></a></td>
<td><a href="recipe_detail?recipe_no=${reviewlist.recipe2_asso.recipe_no}">${reviewlist.recipe2_asso.recipe_title}</a></td>
<td>${reviewlist.mem_no}</td>
<td>${reviewlist.review_content}</td>
<td>${reviewlist.review_date}</td>
</tr>
</c:forEach>
</tbody>
</table>
</div>
</div>
</div>
<!-- Post End -->
</div>
</div>
</div>
<!-- Pagination Start -->
<ul class="pagination" id="pageTd">
<%-- page 처리 --%>
<%@include file="pageProcess_Review.jsp" %>
</ul>
<!-- Pagination End -->
</div>
</div>
<!-- Blog Posts End -->
<!--Content End-->
</div>
</div>
</div>
</div>
</section>
<!--마이페이지 End -->
</app-root>
</body>
</html>
4. 마이페이지 쉐프 tab 정보
1) Mypage_chef - 정보 count / 회원정보출력 / 레시피 / 클래스
클래스 resultmap(classVO) / MypageChefMapper / MypageChefDAOInter / MypageChefDAOImple / MypageChefController
- 클래스 목록 resultmap
public class ClassVO {
//이거 추가
private ClassPayInfoVO payinfo;
- MypageChefmapper.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="mppc">
<!-- ==========
레시피 목록 띄우기
============= -->
<!-- 페이징 처리 -->
<select id="listc" resultType="recipeinfo" parameterType="hashMap">
select * from (select rownum r_num, a.* from (select * from recipe_info
where recipe_info.mem_no=(select mem_no from member_info where mem_no=#{sessionNo} )order by recipe_no desc ) a)
where r_num between #{start} and #{end}
</select><!-- 시작점과 끝점(한페이지에 몇개의 목록만 나올것인지 -->
<!-- 페이징 처리 할 때 몇개씩 끊을지 갯수 세기 -->
<select id="totalCountc" resultType="int">
select count(*) cnt from recipe_info
</select>
<!-- ==========
클래스 목록 띄우기
============= -->
<!-- 내 클래스 목록 띄우기 -->
<select id="classlistC" resultType="classvo" parameterType="int">
select * from class_info
where class_info.mem_no=(select distinct mem_no from member_info where mem_no = #{mem_no}) order by class_no desc
</select>
<!-- 쉐프가 수강중인 classlist_resultmap -->
<resultMap type="classvo" id="classlist_resultmap">
<id property="class_no" column="class_no" javaType="int"/>
<result property="mem_no" column="mem_no"/>
<result property="class_price" column="class_price"/>
<result property="class_title" column="class_title"/>
<result property="class_thumbnail" column="class_thumbnail"/>
<result property="class_price" column="class_price"/>
<association property="payinfo" column="pay_info_no" javaType="classpayinfovo">
<id property="pay_info_no" column="pay_info_no"/>
<result property="mem_no" column="mem_no"/>
<result property="class_no" column="class_no"/>
<result property="pay_info_date" column="pay_info_date"/>
</association>
</resultMap>
<!-- 수강중인 클래스 목록 띄우기 -->
<select id="classlist_std" resultMap="classlist_resultmap" parameterType="int">
select * from class_info c join pay_info p
on c.class_no = p.class_no
where p.mem_no=#{mem_no} order by c.class_no desc
</select>
<!-- =============
statistic 숫자 카운트
================ -->
<!-- 내레시피 -->
<select id="myRecipeCount" resultType="int" parameterType="int">
select count(*) from recipe_info
where mem_no = #{sessionNo}
</select>
<!-- 내코멘트 -->
<select id="myReviewCount" resultType="int" parameterType="int">
select count(*) from review
where mem_no = #{sessionNo}
</select>
<!-- (고객)수강중인 클래스 갯수 -->
<select id="myClassCount" resultType="int" parameterType="int">
select count(*) from class_info c join pay_info p
on c.class_no = p.class_no
where p.mem_no=#{sessionNo}
</select>
<!-- (쉐프)내 클래스를 구매한 사람의 수 -->
<select id="myClientCount" resultType="int" parameterType="int">
select count(*) from pay_info p join class_info c
on p.class_no = c.class_no
where c.mem_no=#{sessionNo}
</select>
<!-- 스크랩한 레시피 갯수 -->
<select id="myScrapCount" resultType="int" parameterType="int">
select count(*) from scrap s join recipe_info r
on s.recipe_no = r.recipe_no
where s.mem_no=#{sessionNo}
</select>
<!-- 내가 쓴 레시피의 별점 평균 -->
<select id="myStarAvgCount" resultType="int" parameterType="int">
select avg(star_rate) from review v join recipe_info r
on v.recipe_no = r.recipe_no
join member_info m
on r.mem_no = m.mem_no
where m.mem_no = #{sessionNo}
</select>
</mapper>
-MypageChefDAOInter
package kr.co.ikosmo.mvc.dao;
import java.util.List;
import java.util.Map;
import kr.co.ikosmo.mvc.vo.ClassVO;
import kr.co.ikosmo.mvc.vo.Recipe_infoVO;
public interface MypageChefDAOInter {
//--------------------
//(쉐프)레시피 목록 - 페이징
//--------------------
public List<Recipe_infoVO> getList(Map<String,Integer> map); //페이징 처리
public int getTotalCount();//페이징 카운트
//-----------------
//(쉐프)클래스 목록 출력
//-----------------
public List<ClassVO> getClassList(int mem_no);//클래스 리스트
//---------------------------
//(쉐프)가 수강중인 클래스 목록 출력
//---------------------------
public List<ClassVO> getClassList_std(int mem_no);//쉐프가 수강중인 클래스 리스트
//-----------------------
//(쉐프)statistic 숫자 카운트
//-----------------------
public int getMyRecipeCount(Map<String,Integer> map); //내 레시피 갯수
public int getMyReviewCount(Map<String,Integer> map); //내 레시피에 달린 리뷰 갯수
public int getMyClassCount(Map<String,Integer> map); //쉐프가 수강중인 클래스 갯수
public int getMyClientCount(Map<String,Integer> map); //내가 진행중인 클래스를 듣는 고객의 수
public int getMyScrapCount(Map<String,Integer> map); //스크랩한 레시피 갯수
public int getMyStarAvgCount(Map<String,Integer> map); //내가 쓴 레시피의 별점 평균
}
- MypageChefDAOImple
package kr.co.ikosmo.mvc.dao;
import java.util.List;
import java.util.Map;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import kr.co.ikosmo.mvc.vo.ClassVO;
import kr.co.ikosmo.mvc.vo.Recipe_infoVO;
@Repository
public class MypageChefDAOImple implements MypageChefDAOInter{
@Autowired
private SqlSessionTemplate ss;
//--------------------
//(쉐프)레시피 목록 - 페이징
//--------------------
@Override
public List<Recipe_infoVO> getList(Map<String,Integer> map){ //nowPage등으로 연산이 된 start,end
return ss.selectList("mppc.listc",map);
}
@Override
public int getTotalCount() {//전체 데이터를 기준으로 페이지를 나눌것이기 때문에..
return ss.selectOne("mppc.totalCountc");
}
//-----------------
//(쉐프)클래스 목록 출력
//-----------------
@Override
public List<ClassVO> getClassList(int mem_no) { //클래스 리스트 출력
return ss.selectList("mppc.classlistC", mem_no);
}
//---------------------------
//(쉐프)가 수강중인 클래스 목록 출력
//---------------------------
public List<ClassVO> getClassList_std(int mem_no) {//쉐프가 수강중인 클래스 리스트
return ss.selectList("mppc.classlist_std", mem_no);
}
//-----------------------
//(쉐프)statistic 숫자 카운트
//-----------------------
@Override
public int getMyRecipeCount(Map<String,Integer> map) { //내 레시피 갯수
return ss.selectOne("mppc.myRecipeCount", map);
}
@Override
public int getMyReviewCount(Map<String,Integer> map) { //내 레시피에 달린 리뷰 갯수
return ss.selectOne("mppc.myReviewCount", map);
}
@Override
public int getMyClassCount(Map<String,Integer> map) { //쉐프가 수강중인 클래스 갯수
return ss.selectOne("mppc.myClassCount", map);
}
@Override
public int getMyClientCount(Map<String,Integer> map) { //내가 진행중인 클래스를 듣는 고객의 수
return ss.selectOne("mppc.myClientCount", map);
}
@Override
public int getMyScrapCount(Map<String,Integer> map) { //스크랩한 레시피 갯수
return ss.selectOne("mppc.myScrapCount", map);
}
@Override
public int getMyStarAvgCount(Map<String,Integer> map) { //내가 쓴 레시피의 별점 평균
return ss.selectOne("mppc.myStarAvgCount", map);
}
}
- MypageChefController
package kr.co.ikosmo.mvc.controller;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import kr.co.ikosmo.mvc.dao.MypageChefDAOInter;
import kr.co.ikosmo.mvc.dao.MypageDAOInter;
import kr.co.ikosmo.mvc.vo.ClassVO;
import kr.co.ikosmo.mvc.vo.Mypage_ingVO;
@Controller
public class MypageChefController {
@Autowired
private MypageChefDAOInter mypageChefDAOInter;
//-----------------------
//(쉐프)레시피 리스트 목록(페이징x)
//-----------------------
@RequestMapping(value="/Mypage_chef")
public String listSearch(Mypage_ingVO vo, Model model, HttpSession session,
@RequestParam(value="nowPage", required=false ,defaultValue="1")
String nowPage,
@RequestParam(value="cntPerPage", required=false , defaultValue="5")
String cntPerPage){
int total = mypageChefDAOInter.getTotalCount();
vo = new Mypage_ingVO(total, Integer.parseInt(nowPage), Integer.parseInt(cntPerPage));
System.out.println("Start :"+vo.getStart());
System.out.println("End :"+vo.getEnd());
Integer sessionNo = (Integer)session.getAttribute("memNo");
Map<String,Integer> map = new HashMap();
map.put("start",vo.getStart());
map.put("end",vo.getEnd());
map.put("sessionNo",sessionNo); //세션 넘버가 같은걸로 개인 레시피를 불러온다.
model.addAttribute("paging", vo);
model.addAttribute("listc", mypageChefDAOInter.getList(map));
//-------------------------
//(쉐프)클래스 리스트 목록(동일페이지)
//-------------------------
//클래스 리스트출력-------------------------------------------------
int mem_no = Integer.parseInt(session.getAttribute("memNo").toString());
System.out.println("클래스 리스트에 출력되는 mem번호 : "+ mem_no); //콘솔확인
List<ClassVO> classlistC = mypageChefDAOInter.getClassList(mem_no); //쉐프가 가르치는 클래스 목록
List<ClassVO> classlist_std = mypageChefDAOInter.getClassList_std(mem_no);//쉐프가 수강중인 클래스 목록 띄우기
model.addAttribute("classlistC", classlistC); //쉐프가 가르치는 클래스 목록
model.addAttribute("classlist_std", classlist_std); //쉐프가 수강중인 클래스 목록 띄우기
//클래스 리스트출력 끝-------------------------------------------------
//-------------------------
//(쉐프)statistic 숫자 카운트
//-------------------------
//statistic 숫자출력-------------------------------------------------
model.addAttribute("myRecipeCount", mypageChefDAOInter.getMyRecipeCount(map)); //내 레시피 갯수
model.addAttribute("myReviewCount", mypageChefDAOInter.getMyReviewCount(map)); //내 레시피에 달린 리뷰 갯수
model.addAttribute("myClassCount", mypageChefDAOInter.getMyClassCount(map)); //쉐프가 수강중인 클래스 갯수
model.addAttribute("myClientCount", mypageChefDAOInter.getMyClientCount(map)); //내가 진행중인 클래스를 듣는 고객의 수
model.addAttribute("myScrapCount", mypageChefDAOInter.getMyScrapCount(map)); //스크랩한 레시피 갯수
model.addAttribute("myStarAvgCount", mypageChefDAOInter.getMyStarAvgCount(map)); //내가 쓴 레시피의 별점 평균
//statistic 숫자출력 끝-------------------------------------------------
return "tiles/Mypage_chef";
}
}
2) jsp - Mypage_Chef.jsp(전체)
Mypage_chef.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>마이페이지</title>
<!-- <base href=""> -->
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="icon" type="image/x-icon" href="./resources/img/favicon.ico">
<link rel="stylesheet" type="text/css" href="./resources/css/header.css" media="all" />
<link rel="stylesheet" type="text/css" href="./resources/css/main.css" media="all" />
<link rel="stylesheet" type="text/css" href="./resources/css/style.css" media="all" />
<!-- 따로 추가 -->
<script src="//maxcdn.bootstrapcdn.com/bootstrap/4.1.1/js/bootstrap.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<link href="https://fonts.googleapis.com/css?family=Open+Sans:300,400,600,700" rel="stylesheet">
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.3.1/css/all.min.css" rel="stylesheet">
<!------ Include the above in your HEAD tag ---------->
<!--
<link rel="stylesheet" type="text/css" href="./resources/css/plugins/bootstrap.min.css" media="all" />
<link rel="stylesheet" type="text/css" href="./resources/css/primary-skin.css" media="all" />
<link rel="stylesheet" type="text/css" href="./resources/css/plugins/animate.min.css" media="all" />
<link rel="stylesheet" type="text/css" href="./resources/css/plugins/magnific-popup.css" media="all" />
<link rel="stylesheet" type="text/css" href="./resources/css/plugins/slick.css" media="all" />
<link rel="stylesheet" type="text/css" href="./resources/css/plugins/slick-theme.css" media="all" />
<!--
-->
<!--********** 【 js 링크 걸기 】********** -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/bxslider/4.2.12/jquery.bxslider.min.js"></script>
<script src="./resources/js/main.js" type="text/javascript" charset="utf-8"></script>
<script src="./resources/js/plugins/bootstrap.min.js" type="text/javascript" charset="utf-8"></script>
<!--
<script src="./resources/js/plugins/isotope.pkgd.min.js" type="text/javascript" charset="utf-8"></script>
<script src="./resources/js/plugins/jquery.countdown.min.js" type="text/javascript" charset="utf-8"></script>
<script src="./resources/js/plugins/jquery.magnific-popup.min.js" type="text/javascript" charset="utf-8"></script>
<script src="./resources/js/plugins/jquery.slimScroll.min.js" type="text/javascript" charset="utf-8"></script>
<script src="./resources/js/plugins/jquery.steps.min.js" type="text/javascript" charset="utf-8"></script>
<script src="./resources/js/plugins/jquery-3.4.1.min.js" type="text/javascript" charset="utf-8"></script>
<script src="./resources/js/plugins/popper.min.js" type="text/javascript" charset="utf-8"></script>
<script src="./resources/js/plugins/slick.min.js" type="text/javascript" charset="utf-8"></script>
<script src="./resources/js/plugins/waypoint.js" type="text/javascript" charset="utf-8"></script>
-->
<!--
-->
</head>
<body>
<app-root>
<!-- 마이페이지 Start -->
<section id="about-us" class="py-5">
<div class="container">
<div class="row">
<!--left sidebar-->
<div class="col-md-3 pr-md-4">
<div class="sidebar-left">
<!--sidebar menu-->
<ul class="list-unstyled sidebar-menu pl-md-2 pr-md-0">
<li>
<a class="sidebar-item active d-flex justify-content-between align-items-center" href="Myrecipe_list">
내가 쓴 레시피 보기
<span class="fas fa-copy"></span>
</a>
</li>
<li>
<a class="sidebar-item d-flex justify-content-between align-items-center" href="My_bigdata">
내 레시피 정보(빅데이터)
<span class="fas fa-chart-line"></span>
</a>
</li>
<li>
<a class="sidebar-item d-flex justify-content-between align-items-center" href="review">
나에게 달린 코멘트
<span class="side-notif" title="1 new comment"></span>
<span class="fas fa-comment"></span>
</a>
</li>
<li>
<a class="sidebar-item d-flex justify-content-between align-items-center" href="">
레시피 스크랩
<span class="fas fa-bookmark"></span>
</a>
</li>
<li>
<a class="sidebar-item d-flex justify-content-between align-items-center" href="storeCart">
장바구니
<span class="fas fa-cart-arrow-down"></span>
</a>
</li>
<li>
<a class="sidebar-item d-flex justify-content-between align-items-center" href="chat_us2">
고객센터 챗봇
<span class="side-notif" title="1 new messages"></span>
<span class="fas fa-headset"></span>
</a>
</li>
<li>
<a class="sidebar-item d-flex justify-content-between align-items-center" href="info_change">
회원정보수정
<span class="fas fa-user-cog"></span>
</a>
</li>
<li>
<a class="sidebar-item d-flex justify-content-between align-items-center" href="logout">
로그아웃
<span class="fas fa-sign-out-alt"></span>
</a>
</li>
<li>
<a class="sidebar-item d-flex justify-content-between align-items-center" href="memberDelete">
회원탈퇴
<span class="fas fa-user-slash"></span>
</a>
</li>
</ul>
</div>
</div>
<!--Content-->
<div class="col-md-9">
<div class="dashboard-area">
<div class="row">
<div class="col-12">
<div class="mb-3 bg-dark">
<div class="row">
<div class="col-12">
<a class="position-absolute ml-3 mt-3 text-white" href="info_change" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="Edit cover images"><i class="fas fa-cog"></i></a>
<div class="row">
<div class="col-md-6 ml-auto mr-auto">
<div class="profiles p-3 my-4 rounded text-center shadow-sm">
<div class="avatars">
<img src="${pageContext.request.contextPath}/resources/image/member_upload/${sessionScope.memPic}" style="height: 100px; width: 100px;"
alt="Circle Image" class="avatar-lg rounded-circle img-fluid" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="Edit avatar images">
</div>
<div class="names">
<h3 class="title text-light">"${sessionScope.memNickname}" 쉐프님 <br>환영합니다.</h3>
<a href="#" class="btn btn-link btn-facebook"><i class="fab fa-facebook"></i></a>
<a href="#" class="btn btn-link btn-twitter"><i class="fab fa-twitter"></i></a>
<a href="#" class="btn btn-link btn-gplus"><i class="fab fa-google-plus"></i></a>
<a href="#" class="btn btn-link btn-instagram"><i class="fab fa-instagram"></i></a>
<a href="#" class="btn btn-link btn-youtube"><i class="fab fa-youtube"></i></a>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-12">
<ul class="nav nav-pills mb-4" id="pills-tab" role="tablist">
<li class="nav-item">
<a class="nav-link active show" id="pills-home-tab" data-toggle="pill" href="#pills-home" role="tab" aria-controls="pills-home" aria-selected="true">Statistic</a>
</li>
<li class="nav-item">
<a class="nav-link" id="pills-profile-tab" data-toggle="pill" href="#pills-profile" role="tab" aria-controls="pills-profile" aria-selected="false">Profile</a>
</li>
<li class="nav-item">
<a class="nav-link" id="pills-contact-tab" data-toggle="pill" href="#pills-contact" role="tab" aria-controls="pills-contact" aria-selected="false">Lastest Post</a>
</li>
<li class="nav-item">
<a class="nav-link" id="pills-class-tab" data-toggle="pill" href="#pills-class" role="tab" aria-controls="pills-class" aria-selected="false">Class</a>
</li>
<li class="nav-item">
<a class="nav-link" id="pills-class_std-tab" data-toggle="pill" href="#pills-class_std" role="tab" aria-controls="pills-class_std" aria-selected="false">Class_std</a>
</li>
</ul>
<div class="tab-content" id="pills-tabContent">
<div class="tab-pane fade active show" id="pills-home" role="tabpanel" aria-labelledby="pills-home-tab">
<div class="row">
<div class="col-lg-4 col-sm-6">
<a class="member-item" href="">
<div class="card mb-2 mb-md-5 py-3">
<div class="content">
<div class="row">
<div class="col-6 d-flex justify-content-center align-items-center">
<div class="icon-big text-warning text-center">
<i class="fas fa-copy"></i>
</div>
</div>
<div class="col-6 d-flex justify-content-center align-items-center">
<div class="numbers">
<p>내 레시피</p>
${myRecipeCount}
</div>
</div>
</div>
</div>
</div>
</a>
</div>
<div class="col-lg-4 col-sm-6">
<a class="member-item" href="">
<div class="card mb-2 mb-md-5 py-3">
<div class="content">
<div class="row">
<div class="col-6 d-flex justify-content-center align-items-center">
<div class="icon-big text-info text-center" title="1 new comment">
<div class="notif"></div>
<i class="fas fa-comment"></i>
</div>
</div>
<div class="col-6 d-flex justify-content-center align-items-center">
<div class="numbers">
<p>코멘트</p>
${myReviewCount}
</div>
</div>
</div>
</div>
</div>
</a>
</div>
<div class="col-lg-4 col-sm-6">
<a class="member-item" href="">
<div class="card mb-2 mb-md-5 py-3">
<div class="content">
<div class="row">
<div class="col-6 d-flex justify-content-center align-items-center">
<div class="icon-big text-danger text-center">
<i class="fas fa-bookmark"></i>
</div>
</div>
<div class="col-6 d-flex justify-content-center align-items-center">
<div class="numbers">
<p>레시피 스크랩</p>
${myScrapCount}
</div>
</div>
</div>
</div>
</div>
</a>
</div>
<div class="col-lg-4 col-sm-6">
<a class="member-item" href="">
<div class="card mb-2 mb-md-5 py-3">
<div class="content">
<div class="row">
<div class="col-6 d-flex justify-content-center align-items-center">
<div class="icon-big text-success text-center">
<i class="fas fa-utensils"></i>
</div>
</div>
<div class="col-6 d-flex justify-content-center align-items-center">
<div class="numbers">
<p>수강중인 클래스</p>
${myClassCount}
</div>
</div>
</div>
</div>
</div>
</a>
</div>
<div class="col-lg-4 col-sm-6">
<a class="member-item" href="">
<div class="card mb-2 mb-md-5 py-3">
<div class="content">
<div class="row">
<div class="col-6 d-flex justify-content-center align-items-center">
<div class="icon-big text-facebook text-center">
<i class="fas fa-users"></i>
</div>
</div>
<div class="col-6 d-flex justify-content-center align-items-center">
<div class="numbers">
<p>클래스 구독자</p>
${myClientCount}
</div>
</div>
</div>
</div>
</div>
</a>
</div>
<div class="col-lg-4 col-sm-6">
<a class="member-item" href="">
<div class="card mb-2 mb-md-5 py-3">
<div class="content">
<div class="row">
<div class="col-6 d-flex justify-content-center align-items-center">
<div class="icon-big text-warning text-center">
<i class="fas fa-star"></i>
</div>
</div>
<div class="col-6 d-flex justify-content-center align-items-center">
<div class="numbers">
<p>내 평균 별점</p>
${myStarAvgCount}
</div>
</div>
</div>
</div>
</div>
</a>
</div>
</div>
</div>
<div class="tab-pane fade" id="pills-profile" role="tabpanel" aria-labelledby="pills-profile-tab">
<div class="p-3 border mb-3">
<a class="position-absolute" style="right: 25px" href="info_change" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="Edit profile"><i class="fas fa-user-cog"></i></a>
<h3>"${sessionScope.memNickname}" 쉐프님의 정보입니다.</h3>
<p><b>아이디: </b>${sessionScope.memId}</p>
<p><b>이름: </b>${sessionScope.memName}</p>
<p><b>닉네임: </b>${sessionScope.memNickname}</p>
<p><b>이메일: </b>${sessionScope.memEmail}</p>
<p><b>핸드폰번호: </b>${sessionScope.memPhone}</p>
</div>
</div>
<div class="tab-pane fade" id="pills-contact" role="tabpanel" aria-labelledby="pills-contact-tab">
<div class="p-3 border mb-3">
<h5>최근 등록한 레시피 보기</h5>
<div class="row">
<div class="col-12">
<ul class="list-unstyled statistics">
<table>
<thead>
<tr>
<th colspan="5">최근 등록한 레시피</th>
</tr>
<tr>
<td>번호</td>
<td>섬네일</td>
<td>제목</td>
<td>조회수</td>
<td>등록일자</td>
</tr>
</thead>
<tbody>
<c:forEach var="listc" items="${listc}">
<tr>
<td>${listc.recipe_no}</td>
<td><a href="recipe_detail?recipe_no=${listc.recipe_no}"><img src="${pageContext.request.contextPath}/resources/image/recipe_upload/${listc.recipe_thumbnail}"
style="height: 100px; width: 100px;"/></a></td>
<td><a href="recipe_detail?recipe_no=${listc.recipe_no}">${listc.recipe_title}</a></td>
<td>${listc.visit_cnt}</td>
<td>${listc.recipe_uploadtime}</td>
</tr>
</c:forEach>
</tbody>
</table>
</ul>
</div>
</div>
</div>
</div>
<div class="tab-pane fade" id="pills-class" role="tabpanel" aria-labelledby="pills-class-tab">
<div class="p-3 border mb-3">
<h5>쉐프의 클래스 수업 목록 보기</h5>
<div class="row">
<div class="col-12">
<ul class="list-unstyled statistics">
<table>
<thead>
<tr>
<th colspan="5">나의 클래스 리스트</th>
</tr>
<tr>
<td>번호</td>
<td>섬네일</td>
<td>제목</td>
<td>가격</td>
<td>상태</td>
</tr>
</thead>
<tbody>
<c:forEach var="classlistC" items="${classlistC}">
<tr>
<!-- 세션값을 여기에서 mem_no로 숨겨받아서 다시 Controller로 -->
<input type="hidden" name="mem_no" id="mem_no" value="${sessionScope.memNo}"/>
<td>${classlistC.class_no}</td>
<td><a href="class_detail?class_no=${classlistC.class_no}"><img src="${pageContext.request.contextPath}/resources\image\FoodImg/${classlistC.class_thumbnail}"
style="height: 100px; width: 100px;"/></a></td>
<td><a href="class_detail?class_no=${classlistC.class_no}">${classlistC.class_title}</a></td>
<td>${classlistC.class_price}</td>
<td>
<c:set var="admin_app" value="${classlistC.admin_app}" />
<c:if test="${admin_app eq 0}">
<p style="color:green;">대기중</p>
</c:if>
<c:if test="${admin_app eq 1}">
<p style="color:blue;"> 승인됨</p>
</c:if>
<c:if test="${admin_app eq 3}">
<p style="color:red;"> 반려</p>
</c:if>
</td>
</tr>
</c:forEach>
</tbody>
</table>
</ul>
</div>
</div>
</div>
</div><!-- 클래스 끝 -->
<div class="tab-pane fade" id="pills-class_std" role="tabpanel" aria-labelledby="pills-class_std-tab">
<div class="p-3 border mb-3">
<h5>수강중인 클래스 보기</h5>
<div class="row">
<div class="col-12">
<ul class="list-unstyled statistics">
<table>
<thead>
<tr>
<th colspan="5">클래스 리스트</th>
</tr>
<tr>
<td>번호</td>
<td>섬네일</td>
<td>제목</td>
<td>가격</td>
<td>구매일자</td>
</tr>
</thead>
<tbody>
<c:forEach var="classlist_std" items="${classlist_std}">
<tr>
<!-- 세션값을 여기에서 mem_no로 숨겨받아서 다시 Controller로 -->
<input type="hidden" name="mem_no" id="mem_no" value="${sessionScope.memNo}"/>
<td>${classlist_std.class_no}</td>
<td><a href="class_detail?class_no=${classlist_std.class_no}"><img src="${pageContext.request.contextPath}/resources\image\FoodImg/${classlist_std.class_thumbnail}"
style="height: 100px; width: 100px;"/></a></td>
<td><a href="class_detail?class_no=${classlist_std.class_no}">${classlist_std.class_title}</a></td>
<td>${classlist_std.class_price}</td>
<td>${classlist_std.payinfo.pay_info_date}</td>
</tr>
</c:forEach>
</tbody>
</table>
</ul>
</div>
</div>
</div>
</div><!-- 수강클래스 끝 -->
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
<!--마이페이지 End -->
</app-root>
</body>
</html>
5. 기타 기능 구현
1) 로그인 시 쉐프와 일반인 마이페이지 분기 나누기
- tiles의 header와 aaa/bbb/index 에서 분기 나누기
header.jsp / index.jsp
<li _ngcontent-efm-c6="" class="menu-item">
<c:choose>
<c:when test="${sessionScope.memGrade_no == '일반인'}"><a ngcontent-efm-c6="" href="Mypage">MyPage</a></c:when>
<c:when test="${sessionScope.memGrade_no == '쉐프'}"><a ngcontent-efm-c6="" href="Mypage_chef">Mypage_chef</a></c:when>
</c:choose>
</li>
2) 로그인 안하면 마이페이지 안뜨게 하기 -> 확인해보기
3)contact_us 페이지 구현 - 지도
contact_us.jsp
- contact_us.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>contact_us</title>
<!-- <base href=""> -->
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="icon" type="image/x-icon" href="./resources/img/favicon.ico">
<link rel="stylesheet" type="text/css" href="./resources/css/header.css" media="all" />
<link rel="stylesheet" type="text/css" href="./resources/css/main.css" media="all" />
<link rel="stylesheet" type="text/css" href="./resources/css/style.css" media="all" />
<!-- 따로 추가 -->
<script src="//maxcdn.bootstrapcdn.com/bootstrap/4.1.1/js/bootstrap.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<link href="https://fonts.googleapis.com/css?family=Open+Sans:300,400,600,700" rel="stylesheet">
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.3.1/css/all.min.css" rel="stylesheet">
<!------ Include the above in your HEAD tag ---------->
<!--
<link rel="stylesheet" type="text/css" href="./resources/css/plugins/bootstrap.min.css" media="all" />
<link rel="stylesheet" type="text/css" href="./resources/css/primary-skin.css" media="all" />
<link rel="stylesheet" type="text/css" href="./resources/css/plugins/animate.min.css" media="all" />
<link rel="stylesheet" type="text/css" href="./resources/css/plugins/magnific-popup.css" media="all" />
<link rel="stylesheet" type="text/css" href="./resources/css/plugins/slick.css" media="all" />
<link rel="stylesheet" type="text/css" href="./resources/css/plugins/slick-theme.css" media="all" />
<!--
-->
<!--********** 【 js 링크 걸기 】********** -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/bxslider/4.2.12/jquery.bxslider.min.js"></script>
<script src="./resources/js/main.js" type="text/javascript" charset="utf-8"></script>
<script src="./resources/js/plugins/bootstrap.min.js" type="text/javascript" charset="utf-8"></script>
<script src="./resources/js/plugins/isotope.pkgd.min.js" type="text/javascript" charset="utf-8"></script>
<script src="./resources/js/plugins/jquery.countdown.min.js" type="text/javascript" charset="utf-8"></script>
<script src="./resources/js/plugins/jquery.magnific-popup.min.js" type="text/javascript" charset="utf-8"></script>
<script src="./resources/js/plugins/jquery.slimScroll.min.js" type="text/javascript" charset="utf-8"></script>
<script src="./resources/js/plugins/jquery.steps.min.js" type="text/javascript" charset="utf-8"></script>
<script src="./resources/js/plugins/jquery-3.4.1.min.js" type="text/javascript" charset="utf-8"></script>
<script src="./resources/js/plugins/popper.min.js" type="text/javascript" charset="utf-8"></script>
<script src="./resources/js/plugins/slick.min.js" type="text/javascript" charset="utf-8"></script>
<script src="./resources/js/plugins/waypoint.js" type="text/javascript" charset="utf-8"></script>
<!--
-->
</head>
<body>
<app-root>
<!-- Subheader Start -->
<div class="subheader bg-cover dark-overlay dark-overlay-2" style="background-image: url('${pageContext.request.contextPath}/resources/img/bg/1.jpg')">
<div class="container">
<div class="subheader-inner">
<h1>Contact Us</h1>
<nav aria-label="breadcrumb">
<ol class="breadcrumb">
<li class="breadcrumb-item"><a href="index">Home</a></li>
<li class="breadcrumb-item active" aria-current="page">Contact Us</li>
</ol>
</nav>
</div>
</div>
</div>
<!-- Subheader End -->
<!-- Contact Info Start -->
<div class="section section-padding">
<div class="container">
<div class="row">
<div class="col-lg-6 col-md-6 col-sm-6">
<div class="ct-info-box">
<div class="ct-info-box-icon">
<i class="flaticon-call"><span class="fas fa-phone"></span></i>
<h5>Call Me</h5>
<span>02-2025-8523</span>
</div>
</div>
</div>
<div class="col-lg-6 col-md-6 col-sm-6">
<div class="ct-info-box">
<div class="ct-info-box-icon">
<i class="flaticon-email"><span class="fas fa-mail-bulk"></span></i>
<h5>Mail Me</h5>
<span>swkosmo@daum.net</span>
</div>
</div>
</div>
<div class="col-lg-12 col-md-12 col-sm-12">
<div class="ct-info-box">
<div class="ct-info-box-icon">
<i class="flaticon-location"><span class="fas fa-map-marked-alt"></span></i>
<h5>Find Me</h5>
<span>(153-759) 서울시 금천구 가산동 426-5 월드메르디앙 2차 413호</span>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Contact Info End -->
<!--Contact Form Start -->
<section class="section pt-0">
<div class="container">
<div class="contact__map">
<iframe
src="https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d3166.2302750067292!2d126.87673151530922!3d37.4788919798144!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x357b61e3354204f9%3A0x12b02f6401815f80!2z7ZWc6rWt7IaM7ZSE7Yq47Juo7Ja07J247J6s6rCc67Cc7JuQ!5e0!3m2!1sko!2skr!4v1609583631078!5m2!1sko!2skr"
height="500" width="1100" style="border:0" allowfullscreen="">
</iframe>
</div>
</div>
</section>
<!--Contact Form End -->
</app-root>
</body>
</html>
'Project > 레시피 프로젝트' 카테고리의 다른 글
[레시피프로젝트] 첫페이지 연결하기(실패) (0) | 2020.11.18 |
---|---|
[project] 11/18 주제확정, 로직설계(간트차트짜기, 역할분담, trello, git) (0) | 2020.11.18 |