SPRING/IceWater Community

[스프링] 커뮤니티 관리자 페이지

간펴니 2021. 10. 24. 21:31
728x90

Spring farmework로 구현한 , 

커뮤니티 IceWater의 마지막 기능이다.

 

이제 AWS를 이용해 배포를 하면 끝이다.

 

처음부터 관리자페이지는 회원관리 외의 기능을 생각하지 않고 구현해서 간단하다.

 

회원목록,

회원정지 (기간설정) ,

포인트부여,

관리자 지정,

회원삭제,

공지사항 목록,

공지사항 등록 , 해제

 

기능이다.

 

따로 어려운 부분은 없고, 그냥 쿼리에 입력값을 받아서 처리하는 부분뿐이라 설명은 생략하겠다..

 


Mapper.xml

<!--  회원정지 -->
<update id="memberSanction">
<![CDATA[
update MP_MEMBER set MEMBER_RANK = 2 , MEMBER_SANCTIONTIME = TO_CHAR(SYSDATE + #{sanctionTime}, 'yyyy/mm/dd') where MEMBER_ID = #{memberId}
]]>
</update>

<!-- 정지해제 -->
<update id="memberSanctionCancel">
update MP_MEMBER set MEMBER_RANK = 1 where MEMBER_ID = #{memberId}
</update>

<!-- 정지된 회원인지 확인 -->
<select id="memberRankCheck" resultType="int">
<![CDATA[
select count(*) from MP_MEMBER where MEMBER_ID = #{memberId} AND MEMBER_RANK = 2 AND MEMBER_SANCTIONTIME > SYSDATE 
]]>
</select>

<!-- 정지기간 확인 -->
<select id="memberSanctionTime" resultType="date">
select MEMBER_SANCTIONTIME from MP_MEMBER where MEMBER_ID = #{memberId}
</select>



<!-- 회원목록 -->
<select id="memberList" resultMap="MemberVOResultMap" parameterType="kr.co.vo.SearchCriteria">
select * from
(select MEMBER_ID , MEMBER_NAME, MEMBER_EMAIL, MEMBER_POINT, MEMBER_DEVPOINT ,MEMBER_JOIN_DATE, MEMBER_RANK,MEMBER_SANCTIONTIME, ROW_NUMBER () 
OVER ( ORDER by MEMBER_ID DESC) AS RNUM FROM MP_MEMBER <include refid="search" />)
where RNUM BETWEEN #{rowStart} AND #{rowEnd} 


</select>

<!-- 회원목록 페이징-->

<select id="memberListCount" parameterType="kr.co.vo.SearchCriteria"
		resultType="int">
		SELECT COUNT(*)
		FROM MP_MEMBER
</select>

<!-- 회원포인트 부여 -->
<update id="insertPoint">
update MP_MEMBER SET MEMBER_POINT = MEMBER_POINT + #{memberPoint} 
where MEMBER_ID = #{memberId}
</update>

<update id="insertDevPoint">
update MP_MEMBER SET MEMBER_DEVPOINT = MEMBER_DEVPOINT + #{memberPoint} 
where MEMBER_ID = #{memberId}
</update>

<!-- 공지사항 지정-->
<update id="insertNotice">
update MP_BOARD SET NOTICE ='Y' where bno = #{bno}
</update>

<update id="deleteNotice">
update MP_BOARD SET NOTICE ='N' where bno = #{bno}
</update>

<!-- 공지사항 목록 -->
<select id="noticeView" resultType="kr.co.vo.BoardVO">
select BNO , TITLE , REGDATE from MP_BOARD where bgno = 2 AND NOTICE = 'Y'
</select>

<!-- 관리자 지정 -->
<update id="memberMaster">
update MP_MEMBER SET MEMBER_RANK = 3 where MEMBER_ID = #{memberId}
</update>

<update id="memberMasterCancel">
update MP_MEMBER SET MEMBER_RANK = 1 where MEMBER_ID = #{memberId}
</update>




	<sql id="search">
		<if test="keyword != ''">
			WHERE MEMBER_NAME = #{keyword}
		</if>
	</sql>

회원정지는 입력받은 일 수 대로 현재 시간에 +해서 DB에 insert 하고,

 

해당 시간이 현재시간보다 크고, RANK가 2면 회원 로그인을 막는다.

 

회원정지 해제는 시간은 그대로 두고 , RANK를 1로 update해서 정지를 해제한다.

 

* 1 = 일반사용자 , 2= 정지회원 , 3=관리자

 

공지사항 지정엔 공지사항여부 칼럼을 만들어서 Y , N으로 구분한다.

 

공지사항 목록에 해당칼럼이 Y인 것만 출력되게 만들어서 공지사항을 구현했다.

 


Controller

	//관리자페이지
	@RequestMapping(value="/master", method=RequestMethod.GET)
	public String memberSanctionView(HttpSession session, Model model,@ModelAttribute("scri") SearchCriteria scri) throws Exception{
		MemberVO memberVO = (MemberVO)session.getAttribute("login");
		
		if(memberVO.getMemberRank() != 3 || memberVO == null) {
			session.invalidate();
			return "/member/loginView";
		}
		
		
		PageMaker pageMaker = new PageMaker();
		pageMaker.setCri(scri);
		pageMaker.setTotalCount(memberService.memberListCount());
		
		model.addAttribute("list", memberService.memberList(scri));
		model.addAttribute("pageMaker", pageMaker);
		model.addAttribute("notice", memberService.noticeView());
		return "/member/master";
	}
	
	@RequestMapping(value="/memberSanction", method=RequestMethod.POST)
	public String memberSanction(Model model,String memberName,int sanctionTime) throws Exception{
		
		memberService.memberSanction(memberName,sanctionTime);	
		
		
		return "redirect:/member/master";
	}
	
	@RequestMapping(value="/memberSanctionCancel", method=RequestMethod.POST)
	public String memberSanction(Model model,String memberId) throws Exception{
		
		memberService.memberSanctionCancel(memberId);	
		
		
		return "redirect:/member/master";
	}
	
	
	@RequestMapping(value="/memberDelete", method=RequestMethod.POST)
	public String memberDelete(String memberId) throws Exception{
		
		memberService.delete(memberId);	
		
		
		return "redirect:/member/master";
	}
	
	@RequestMapping(value="/insertPoint", method=RequestMethod.POST)
	public String insertPoint(String memberId, String memberPoint) throws Exception{
		memberService.insertPoint(memberId, memberPoint);
		return "redirect:/member/master";
	}
	
	@RequestMapping(value="/insertDevPoint", method=RequestMethod.POST)
	public String insertDevPoint(String memberId, String memberPoint) throws Exception{
		memberService.insertDevPoint(memberId, memberPoint);
		return "redirect:/member/master";
	}
	
	@RequestMapping(value="/insertNotice", method=RequestMethod.POST)
	public String insertNotice(int bno)throws Exception{
		memberService.insertNotice(bno);
		return "redirect:/member/master";
	}
	
	@RequestMapping(value="/deleteNotice", method=RequestMethod.POST)
	public String deleteNotice(int bno)throws Exception{
		memberService.deleteNotice(bno);
		return "redirect:/member/master";
	}
	
	@RequestMapping(value="/memberMaster", method=RequestMethod.POST)
	public String memberMaster(String memberId)throws Exception{
		memberService.memberMaster(memberId);
		return "redirect:/member/master";
	}
	
	@RequestMapping(value="/memberMasterCancel", method=RequestMethod.POST)
	public String memberMasterCancel(String memberId)throws Exception{
		memberService.memberMasterCancel(memberId);
		return "redirect:/member/master";
	}

뒤에 작성한 네이버 로그인보다 훨씬 간단하지만 코드가 훨씬 많다..

 

하지만 네이버 로그인보다 훨씬 빠르게 구현했다.

 

아는 것이 힘이다 역시..ㅜㅜ

 


 

                       <div class="col-lg-6">

                            <!-- Circle Buttons -->
                            <div class="card shadow mb-4">
                                <div class="card-header py-3">
                                    <h6 class="m-0 font-weight-bold text-primary">회원정지</h6>
                                </div>
                                <div class="card-body">
                                    
                                         <form id="memberSanction" action="/member/memberSanction" method="POST" class="form-signup form-user panel-body"  autocomplete="off">                                         
                
                    <div class="form-group">
                        <label class="control-label" for="fullName">ID입력</label>
                        <input type="text" name="memberName" class="form-control input-sm" >
                        <select name="sanctionTime">
                        <option value="1">1일</option>
                        <option value="7">7일</option>
                        <option value="30">30일</option>
                        <option value="90">90일</option>
                        <option value="300">300일</option>
                        </select>
                    </div>
                    
                <button class="btn btn-primary btn-block" type="submit" >정지</button>
            </form>
                                  
                                </div>
                            </div>
</div>

뷰는 이런느낌으로 input값을 받을 수 있게 해줬다.

 


Controller (로그인 부분)

		if(memberService.memberRankCheck(loginVO.getMemberId()) == 1) {
			logger.info("들어옴?? ");
			httpSession.invalidate();
			model.addAttribute("sanctionTime", memberService.memberSanctionTime(memberVO.getMemberId()));
			return "/member/sanction";
		}

정지회원인지 여부를 로그인컨트롤러에 추가해준다.

 


 

 

결과

 

012345
슬라이드쇼 6장

 

1. 회원목록

 

2.밑에서 두번째의 'ssss' 회원을 300일 정지

 

3.랭크2로 변경, 현재시간에서 +300일

 

4.로그인시 정지페이지로 이동, 로그인 불가

 

5.공지사항 1408번글 해제

 

6. 커뮤니티 게시판에서 공지사항이 없어짐

 

 

728x90