본문 바로가기

Projects/Flask + MongoDB K리그 일정서비스

#3. 관리자 페이지 | 경기정보, 회원비활성화

앞서서, 회원가입 시 유저 등급을 grade라는 항목으로 설정해주었다. 이렇게 한 이유는 일반유저와 구분되는 관리자 계정을 위해서인데, 이 관리자 계정에서는 경기정보를 입력하고, 회원 활성화/비활성화를 가능하게 하며, 글도 삭제할 수 있는 권한을 주기 위해서이다. 그렇다면, 관리자 계정에서 이러한 기능들을 어떻게 수행하는지를 확인해보자.

 

# 관리자 페이지
//url에 파라미터를 설정하여, 각각의 기능을 수행하는 페이지로 이동하게 하였다.
@app.route("/admin/<manageType>", methods=['GET'])
def admin(manageType):
    # return render_template('adminSchedule.html')
    
    //request에 담긴 토큰을 확인한다. 즉, 관리자 계정으로 접속했는지를 체크한다.
    token_receive = request.cookies.get('mytoken')
    try:
    
    	//관리자 계정이 있는지 체크한 뒤
        payload = jwt.decode(token_receive, SECRET_KEY, algorithms=['HS256'])
        user_info = db.users.find_one({"user_id": payload["id"]})
        
        //파라미터가 경기일정이면, 경기일정 페이지로
        if manageType == 'schedule':
            return render_template('adminSchedule.html', user_info=user_info)
       
       //파라미터가 응원 내용에 대한 것이면, 응원페이지로
       elif manageType == 'contents':
            contents = list(db.contents.find().sort('cheer_datetime', -1))
            return render_template('adminContents.html', user_info=user_info, contents=contents)
        
        //파라미터가 유저비활성화에 대한 것이라면, 유저 페이지로 
        elif manageType == 'user':
            users = list(db.users.find().sort('join_date', -1))
            return render_template('adminUser.html', user_info=user_info, users=users)

    except jwt.ExpiredSignatureError:
        return redirect(url_for("login", msg="로그인 시간이 만료되었습니다."))
    except jwt.exceptions.DecodeError:
        return redirect(url_for("login", msg="로그인 정보가 존재하지 않습니다."))

파라미터를 사용하여, 각 관리자 기능에 해당하는 페이지로 렌더링 시켜준다. 이제 각 기능별로 어떠한 것이 필요한지 살펴보자. 먼저 가장 중요한 경기일정 입력 페이지 부터 확인한다.

 

# 경기 등록
@app.route("/api/set_match", methods=['POST'])
def set_match():

	//입력한 경기정보를 하나씩 꺼내고
    home_team = request.form['homeTeam']
    away_team = request.form['awayTeam']
    match_day = request.form['matchDay']
    stadium = request.form['stadium']
	
    //이를 객체에 담아
    doc = {
        'home_team': home_team,
        'away_team': away_team,
        'match_day': match_day,
        'stadium': stadium
    }
    
    //matches라는 collection에 저장한다
    db.matches.insert_one(doc)
    return jsonify({'msg': '저장완료'}, )

이렇게 경기 정보를 입력하여 db에 저장한다면, 홈화면으로 접속 시 저장되었던 경기정보들이 렌더링 될 것이다. 그 다음으로 유저 정보 비활성화 페이지를 살펴보자.

 

# 회원 삭제
//삭제하려는 회원의 인덱스를 파라미터로 받는다
//몽고DB에는 각 객체마다 id값을 갖는 것을 활용한다
@app.route("/delUser/<userIdx>", methods=['GET'])
def del_user(userIdx):
    
    //같은 id값을 가진 회원정보를 찾아 삭제한다
    db.users.delete_one({'_id': ObjectId(userIdx)})
    return jsonify('msg')



# 관리자 - 회원 비활성화/활성화
//id값을 파라미터로 받는다
@app.route("/updateUser/<userIdx>", methods=['GET'])
def update_user(userIdx):
    
    //해당하는 id값을 가진 유저정보를 찾고
    target_user = db.users.find_one({"_id": ObjectId(userIdx)})
    //토큰을 꺼낸다
    token_receive = request.cookies.get('mytoken')
    try:
    	//암호화된 토큰의 유저정보를 해독한 뒤,
        payload = jwt.decode(token_receive, SECRET_KEY, algorithms=['HS256'])
        //같은 유저 아이디를 가진 객체를 찾는다
        user_info = db.users.find_one({"user_id": payload["id"]})
		
        
        //회원등급을 온오프 해준다. 활성은 비활성화로, 비활성화는 활성으로
        //operator 연산자를 활용해서 정보를 변경해준다.
        if target_user['grade'] == 0:
            db.users.update_one({"_id": ObjectId(userIdx)}, {'$set': {"grade": -1}})
        elif target_user['grade'] == -1:
            db.users.update_one({"_id": ObjectId(userIdx)}, {'$set': {"grade": 0}})
        
        //다시 회원정보를 가입일자 기준으로 정렬해준다
        users = list(db.users.find().sort('join_date', -1))

        return render_template('adminUser.html', user_info=user_info, users=users)

    except jwt.ExpiredSignatureError:
        return redirect(url_for("login", msg="로그인 시간이 만료되었습니다."))
    except jwt.exceptions.DecodeError:
        return redirect(url_for("login", msg="로그인 정보가 존재하지 않습니다."))

몽고DB에 대한 이해가 필요한데, 두 가지를 응용했다.

 

1) 몽고DB는 각 객체마다 특정한 id값이 존재한다. 이것을 이용해, 특정 객체만 수정하고 삭제하면 된다. 

2) 회원등급을 위해 유저정보라는 객체 안에 grade라는 항목을 더 넣었다. 이걸 가지고 유저 활성/비활성화 그리고 일반계정인지 관리자 계정인지를 구분시켜 주면 된다.

 

글을 삭제하는 부분은 우선 상세페이지가 어떻게 구성되어있는지부터 설명한 뒤 소개하고자 한다.