앞서서, 회원가입 시 유저 등급을 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라는 항목을 더 넣었다. 이걸 가지고 유저 활성/비활성화 그리고 일반계정인지 관리자 계정인지를 구분시켜 주면 된다.
글을 삭제하는 부분은 우선 상세페이지가 어떻게 구성되어있는지부터 설명한 뒤 소개하고자 한다.
'Projects > Flask + MongoDB K리그 일정서비스' 카테고리의 다른 글
#5. 경기정보 삭제, 댓글 삭제 (0) | 2021.06.13 |
---|---|
#4. 상세페이지 구현 | 경기 상세정보와 댓글 (0) | 2021.06.13 |
#2. 회원가입 및 로그인 (0) | 2021.06.13 |
#1. 홈페이지 화면 설계 (0) | 2021.06.13 |
#0. 프로젝트 개요 (0) | 2021.06.13 |