1)개인정보퇴학
1-1) 자퇴신청 폼(deleteUser) , delete(자퇴신청 처리)
1-2) 퇴학처리부분 Controller의 delete
2) 성적확인
3) 임시비밀번호 알고리즘 변경
1) 개인정보(userInfo)퇴학 부분
2025.05.14 - [프로젝트] - 프로젝트중간 (개인정보(userInfo) 내용들 , index매핑과정 controller변경)
프로젝트중간 (개인정보(userInfo) 내용들 , index매핑과정 controller변경)
1) 회원가입(registerUser) 시 테이블의전공이 모두 나타나게!!!! 2) 개인정보관련 (userInfo)2-1) 수정버튼 클릭시2-2) 비밀번호변경버튼 클릭시2-3) 수정완료버튼 3) index부분 변경!!!(크게바뀜) 4)오늘의시
ddkk1120.tistory.com
여기서 개인정보에 대해서다루긴했지만
퇴학부분은완료되지않은 상황이었을것임
userInfo.jsp
퇴학버튼 부분만
<c:if test="${fn:contains(sessionScope.login, 'S')}"> <%--학생만선택가능 --%>
<button class="btn btn-danger" type="button" onclick="deleteUser()">자퇴신청</button>
</c:if>
function deleteUser() {
if (confirm("정말 퇴학하시겠습니까? 이 작업은 되돌릴 수 없습니다.")) {
let op = "width=500,height=500,top=50,left=150";
window.open("deleteUser", "", op);
}
}
sessionScope.login이 S를 포함한경우(학생인경우)
sessionScope.login이 S를 포함하지 않은 경우(교수)
자퇴신청 부분자체가 나오지않게 됨
1-1) 자퇴신청 폼(deleteUser) , delete(자퇴신청 처리)
//로그인없이접근막기 + 학생만 ( get방식사용하지않으므로 이쪽에선 파라미터값을 막을필욘없음)
public String loginStuCheck(HttpServletRequest request, HttpServletResponse response) {
HttpSession session = request.getSession();
String login = (String)session.getAttribute("login");
if(login==null ) {
request.setAttribute("msg", "로그인하세요");
request.setAttribute("url", "doLogin");
return "alert";
}
else if(login.contains("P")) {
request.setAttribute("msg", "교수는접근불가능합니다");
request.setAttribute("url", "index");
return "alert";
}
return null; //정상인경우
}
@MSLogin("loginStuCheck")
@RequestMapping("deleteUser")
public String deleteUser(HttpServletRequest request, HttpServletResponse response) {
List<Dept> list = new DeptDao().selectAll();
request.setAttribute("dept", list);
return "mypage/deleteUser";
}
다음과같이 교수라면 애초에접근을 막아놓고 시작함
(버튼이사라졌어도 url로 접근하려는것을 방지)
dept(전공)를 모두 불러온 후 request속성으로 넘겨준다
<div class="card">
<h4 class="text-center mb-4">자퇴 form</h4>
<form action="delete" method="post" >
<div class="mb-3">
<label for="id" class="form-label">아이디</label>
<input type="text" class="form-control" id="id" name="id" >
</div>
<div class="mb-3">
<label for="name" class="form-label">이름</label>
<input type="text" class="form-control" id="name" name="name" >
</div>
<div class="mb-3">
<label for="pw" class="form-label">비밀번호</label>
<input type="password" class="form-control" id="pw" name="pw" >
</div>
<div class="mb-3">
<label for="email" class="form-label">이메일</label>
<input type="email" class="form-control" id="email" name="email" >
</div>
<div class="mb-3">
<label for="major" class="form-label">전공선택</label>
<select class="form-select" id="major" name="deptId">
<option selected value="none">전공</option>
<c:forEach items="${dept}" var="s">
<option value="${s.deptId}">${s.deptName}</option>
</c:forEach>
</select>
</div>
<button class="btn btn-custom w-100 mb-3">자퇴신청</button>
<div class="text-center">
<a href="close" class="btn btn-link-custom">취소하고 싶으면 클릭!</a>
</div>
</form>
</div>
다음과같이
아이디,이름,비밀번호,이메일, 전공을입력받아
form을 이용해 delete로 넘기게될거임
1-2) 퇴학처리부분 Controller의 delete
MypageController.java
delete
(입력한 모든정보가 일치해야 퇴학이 이루어짐)
@MSLogin("loginStuCheck")
@RequestMapping("delete")
public String delete(HttpServletRequest request, HttpServletResponse response) {
String id = (String)request.getSession().getAttribute("login");
String inputId= request.getParameter("id");
String pw = request.getParameter("pw");
String name = request.getParameter("name");
String email = request.getParameter("email");
String deptId = request.getParameter("deptId");
if(id.equals(inputId)) {
String dbId = new ProStuDao().findPw(inputId, email);
//db의비밀번호와 입력한비밀번호비교
//암호화때문에 equals로 비교불가능
boolean checkpw = BCrypt.checkpw(pw, dbId);
System.out.println("비밀번호 검증 성공여부 : "+checkpw);
boolean result = new StudentDao().deleteUser(inputId,deptId,name);
//비밀번호검증 , delete여부 모두 true일 시
if(checkpw&&result) {
EmailUtil.sendDeleteMsg(email, name); // 자퇴성공시 메일발송
request.setAttribute("logout", "logout");
request.setAttribute("msg", "자퇴성공");
}
else {
request.setAttribute("msg", "변경실패");
}
}
//id가 로그인한정보와 일치하지않을 시
else {
request.setAttribute("msg", "입력한 아이디가 로그인한 아이디와 일치하지않아요");
}
return "mypage/close";
}
모든정보가 일치 시
이메일로도 자퇴여부가 전송됨
퇴학 -> 로그인시도 시
2)성적확인
//성적확인
@MSLogin("loginStuCheck")
@RequestMapping("getCourseScores")
public String getCourseScores (HttpServletRequest request, HttpServletResponse response) {
String id = (String)request.getSession().getAttribute("login");
//String id = "S001";
try {
List<GetScoresDto> score = new GetScoreDao().getScore(id);
request.setAttribute("score", score);
return "mypage/getCourseScores";
}
catch (Exception e) {
e.printStackTrace();
}
request.setAttribute("msg", "오류발생");
request.setAttribute("url", "index");
return "alert";
}
학생만 들어갈 수 있게 위에함수로 처리를 해놓은 후
login세션 (id) 을 이용해 필요한 값들을 list로 가져온 후
(정상인경우 : getCourseScores 폼으로이동)
(비정상인경우 : 오류발생 출력 후 index로 되돌아감)
GetScoreDao.java
getScore메서드
(id를 이용해 성적확인에 필요한 모든정보를 가져온다)
public List<GetScoresDto> getScore(String id) {
SqlSession conn = MyBatisConnection.getConnection();
GetScoresDto dto = new GetScoresDto();
dto.setStudentId(id);
try {
List<GetScoresDto> list = conn.selectList("getScore.getScore",id);
return list;
}
catch (Exception e) {
e.printStackTrace();
}
finally {
MyBatisConnection.close(conn);
}
return null;
}
ScoreMapper.xml
교수명,강좌id,강좌이름,학점,중간고사점수,기말고사점수,총점,학기
등을 가져오게됨
<select id="getScore" parameterType="String" resultType="GetScoresDto">
SELECT p.professor_name , c.course_id , c.course_name , c.course_score , s.score_mid , s.score_final , s.score_total , s.score_grade
,c.course_period
FROM score s JOIN professor p ON(s.professor_id = p.professor_id)
JOIN course c ON (s.course_id = c.course_id)
WHERE s.student_id=#{val};
</select>
getCourseScores.jsp
body부분만
<body>
<!-- 성적 확인 -->
<div class="card">
<h2 class="text-xl font-semibold mb-4">성적 확인</h2>
<form method="get" action="">
<div class="flex items-center mb-4">
<select name="semester" class="border rounded p-2 mr-2" onchange="this.form.submit()">
<option value="all" ${param.semester == 'all' || empty param.semester ? 'selected' : ''}>전체</option>
<option value="1학기" ${param.semester == '1학기' ? 'selected' : ''}>1학기</option>
<option value="2학기" ${param.semester == '2학기' ? 'selected' : ''}>2학기</option>
</select>
<button type="submit" class="btn btn-primary">조회</button>
</div>
</form>
<table class="table">
<thead>
<tr>
<th>#</th>
<th>학기(coursePeriod)</th>
<th>과목번호(courseId)</th>
<th>과목명(courseName)</th>
<th>담당교수(professorName)</th>
<th>학점(courseScore)</th>
<th>중간점수(scoreMid)</th>
<th>기말점수(scoreFinal)</th>
<th>취득 점수(scoreTotal)</th>
<th>평가(scoreGrade)</th>
</tr>
</thead>
<tbody>
<c:set var="totalCourseScore" value="0" />
<c:set var="totalGradePoints" value="0" />
<c:set var="courseCount" value="0" />
<c:forEach items="${score}" var="sc" varStatus="a">
<!-- 학기 필터링 -->
<c:if test="${param.semester == 'all' || empty param.semester || sc.coursePeriod == param.semester}">
<tr>
<td>${a.count}</td>
<td>${sc.coursePeriod}</td>
<td>${sc.courseId}</td>
<td>${sc.courseName}</td>
<td>${sc.professorName}</td>
<td>${sc.courseScore}</td>
<td>${sc.scoreMid}</td>
<td>${sc.scoreFinal}</td>
<td>${sc.scoreTotal}</td>
<td class="score-grade ${fn:replace(sc.scoreGrade, '+', '-plus')}">${sc.scoreGrade}</td>
</tr>
<!-- 총 학점 합산 -->
<c:set var="totalCourseScore" value="${totalCourseScore + sc.courseScore}" />
<!-- 학점 등급을 숫자로 변환 -->
<c:choose>
<c:when test="${sc.scoreGrade == 'A+'}">
<c:set var="gradePoint" value="4.5" />
</c:when>
<c:when test="${sc.scoreGrade == 'A'}">
<c:set var="gradePoint" value="4.0" />
</c:when>
<c:when test="${sc.scoreGrade == 'B+'}">
<c:set var="gradePoint" value="3.5" />
</c:when>
<c:when test="${sc.scoreGrade == 'B'}">
<c:set var="gradePoint" value="3.0" />
</c:when>
<c:when test="${sc.scoreGrade == 'C+'}">
<c:set var="gradePoint" value="2.5" />
</c:when>
<c:when test="${sc.scoreGrade == 'C'}">
<c:set var="gradePoint" value="2.0" />
</c:when>
<c:when test="${sc.scoreGrade == 'F'}">
<c:set var="gradePoint" value="0.0" />
</c:when>
<c:otherwise>
<c:set var="gradePoint" value="0.0" />
</c:otherwise>
</c:choose>
<c:set var="totalGradePoints" value="${totalGradePoints + gradePoint}" />
<c:set var="courseCount" value="${courseCount + 1}" />
</c:if>
</c:forEach>
</tbody>
</table>
<!-- 요약 섹션 -->
<div class="summary-card">
<div class="summary-item">
<div class="summary-label">총 이수 학점</div>
<div class="summary-value total-credits">${totalCourseScore}</div>
</div>
<div class="summary-item">
<div class="summary-label">평균 학점 (GPA)</div>
<div class="summary-value gpa">
<fmt:formatNumber value="${courseCount > 0 ? totalGradePoints / courseCount : 0}" pattern="0.00" />
</div>
</div>
</div>
</div>
</body>
결과
3) 임시비밀번호 알고리즘변경
통상적인 사이트들의 임시비밀번호방식을 참고해 바꿨다
(영문자,특수문자,숫자)가 적절히섞인 6자리 숫자
//임시비밀번호를 만드는 알고리즘(비밀번호찾기 시에만 발급이 될것임)
public String getTempPw() {
List<String> lowerList = Arrays.asList
("a" ,"b" ,"c" ,"d" ,"e" ,"f" ,"g" ,"h" ,"i" ,"j" ,"k" ,"l" ,"m" ,"n" ,"o" ,"p","q","r","s","t");
List<String> upperList = new ArrayList<>();
for (String string : lowerList) {
upperList.add(string.toUpperCase());
}
List<String> specialList = Arrays.asList("%","@","#","^","&","*","!");
List<Object> combineList = new ArrayList<>();
combineList.addAll(specialList);
combineList.addAll(lowerList);
combineList.addAll(upperList);
for (int i = 0; i < 15; i++) { //랜덤한0~9 숫자 10개집어넣기
combineList.add(new Random().nextInt(10));
}
Collections.shuffle(combineList);
String tempNum = "";
for (int i = 0; i < 6; i++) {
int num = new Random().nextInt(combineList.size());
tempNum += combineList.get(num);
}
return tempNum;
}
테스트결과!!!!
'프로젝트' 카테고리의 다른 글
비밀번호암호화 , 비밀번호찾기(임시비밀번호발급 및 메일전송) , 회원가입->인증번호인증->완료 순으로 바꿈 , 회원가입 ,pw찾기 , 개인정보수정 시 유효성검사추가 (1) | 2025.05.16 |
---|---|
프로젝트중간 (개인정보(userInfo) 내용들 , index매핑과정 controller변경) (0) | 2025.05.14 |
프로젝트진행중 ( 로그인시 index에 정보몇개전달 , id/pw찾기) (0) | 2025.05.13 |
프로젝트진행중 - 회원가입 , 로그인? (0) | 2025.05.12 |
주말에 프로젝트조금해보기(회원가입만 해보자...!) (1) | 2025.05.10 |