[해설 3] 프로젝트 해설3: 전체 코드 기능 설명 3

오레오·2023년 12월 6일
0

오픈SW플랫폼

목록 보기
8/8

[해설 2]에 이어지는 글입니다.
✨해설 2 보러가기

💡 9 ~ 12 [해설3] : 백_윤소민
회원가입, 아이디 중복확인, 닉네임 중복확인, 로그인 및 로그아웃, 상품 구매시 포인트, 랭킹포인트 증감 기능, 사용자 포인트별 랭킹 정렬 기능

9. 회원가입 – Session을 이용한 새로고침 시 값 소실 방지

[app.py]

  • Tip : 닉네임, 비밀번호확인시 session 사용하면 새로고침을 하여도 값이 날아가지 않는다.
  • 세션(Session): 쿠키와 같은 고객의 데이터 값, 클라이언트의 브라우저에 저장해놓는다.
@application.route("/signup_post",methods=['POST'])
def register_user():
    data=request.form
	  id=request.form['id']
	  pw=request.form['pw']
	  pw2=request.form['PWconfirm']
	  nname=request.form['nickname']
	  pw_hash=hashlib.sha256(pw.encode('utf-8')).hexdigest()
	  pw_hash2=hashlib.sha3_256(pw.encode('utf-8')).hexdigest()
	  session['id_'] = id
	  session['pw']=pw
	  session['pw2']=pw2
    session['nickname']=nname
    session['email']=request.form['email']
    session['HP']=request.form['HP']
    session['college']=request.form['dropdown1']
    session['major']=request.form['dropdown2']
  • 이처럼 우선 form에 입력한 클라이언트의 정보를 변수에 저장한다.
  • session[‘’]안에 session이름으로 사용할 변수를 적고 session에 넣고 싶은 값을 이전에 저장한 변수를 이용해 대입한다.
return render_template("8~10/signup.html",
    id=session.get('id_', ''),pw=session.get('pw',''),nickname=session.get('nickname',''),hp=session.get('HP',''),pw2=session.get('pw2',''),
    email=session.get('email',''),college=session.get('college',''),major=session.get('major',''))
  • 이후에 화면을 넘길 때 값이 유지되도록 render_template()안에 session 값들을 모두 넣는다.

10. 회원가입 – 중복확인 및 비밀번호 확인 기능

[app.py]

#아이디중복확인
    if 'check_duplicate_id' in request.form:
        if DB.id_duplicate_check(id):
            flash('사용할 수 있는 아이디입니다.')
            return render_template("8~10/signup.html",
            id=session.get('id_', ''),pw=session.get('pw',''),nickname=session.get('nickname',''),hp=session.get('HP',''),pw2=session.get('pw2',''),
            email=session.get('email',''),college=session.get('college',''),major=session.get('major',''))
        else:
            flash('이미 존재하는 아이디입니다.')
            return render_template("8~10/signup.html",
            id=session.get('id_', ''),pw=session.get('pw',''),nickname=session.get('nickname',''),hp=session.get('HP',''),pw2=session.get('pw2',''),
            email=session.get('email',''),college=session.get('college',''),major=session.get('major',''))
  • Tip : flash값을 사용해서 백에서 전달하는 메시지를 프론트에 넘긴다.
  • py에서 검증을 거친 후 나온 결과를 flash(‘’)안에 메시지 값을 넣어주고 프론트에서 이를 화면에 표시한다. 예시로는

[signup.html]

{% extends "index.html" %}
    {% block section %}
    {% with mesg = get_flashed_messages() %}
    {% if mesg !=[]%}
    <script>alert("{{ mesg[0] }}")</script>
    {% endif %}
    {% endwith %}
  • Html에 이렇게 flash값이 있을 때 mesg안에 값을 넣고 alert를 통해 알림창에 메시지가 뜨는 방식으로 구현할 수 있다.

[database.py]

# 회원가입 시 아이디 중복확인
    def id_duplicate_check(self, id_string):
        users = self.db.child("user").get()
        
        print("users###",users.val())
        if str(users.val()) == "None": # first registration
            return True
        else:
            for res in users.each():
                value = res.val()
                if value['id'] == id_string:
                    return False
            return True
  • 중복을 검증하는 방법은 db에서 아이디에 해당하는 정보들을 모두 찾은 후, 이것이 사용자가 입력한 아이디와 같을 시 false값을 리턴하고 존재하지 않을 경우 true값을 넘겨준다. 넘겨받은 이 값을 py에서 flash값으로 프론트에 메시지를 넘겨준다.

11. 유저 포인트 증감 구현

[app.py]

#구매하기 버튼 누르면
@application.route("/1~4/order_item/<item_name>/")
def view_order_confirmation(item_name):

    point=DB.get_price(str(item_name))
    seller=DB.get_seller(str(item_name))

    					… 추가 코드 …

        DB.update_point(session['id'], point) #구매자 포인트 감소
        DB.update_ranking_point(session['id'], point) #구매자 랭킹 포인트 증가
        DB.update_point_2(seller,point) #판매자 포인트 증가
        DB.update_ranking_point(seller,point) #판매자 랭킹 포인트 증가

        flash('포인트가 차감되었습니다')

        data=DB.get_item_byname(str(item_name))
        session['user_point'] = DB.get_user_point(session['id'])

    return render_template("1~4/order_item.html", data=data, item_name=item_name, seller_email=seller_email, download_count=download_count)
  • 구매하기 버튼을 눌렀을 때 db에서 구매자와 판매자의 포인트가 변하도록 구현한다.

[database.py]

#구매하기
    #가격 가져오기
    def get_price(self, item_name):

        data = self.db.child("item").child(item_name).get().val()
        point=int(self.db.child("item").child(item_name).get().val()['price'])
        return point
    #판매자 가져오기
    def get_seller(self, name):
        seller=self.db.child("item").child(name).get().val()['writer']
  • 우선 아이템의 가격과 판매자를 가져온다.
#구매자 포인트 감소
    def update_point(self, user_id, point):
        user_data = self.db.child("user").child(user_id).get().val()
        if user_data is not None and 'point' in user_data:
            b_point = int(user_data['point'])
            a_point = b_point - point
            point_info = {
                "point": a_point
            }
            self.db.child("user").child(user_id).update(point_info)
        return True

    #판매자 포인트 증가
    def update_point_2(self, user_id, point):
        user_data = self.db.child("user").child(user_id).get().val()
        if user_data is not None and 'point' in user_data:
            b_point = int(user_data['point'])
            a_point = b_point + point
            point_info = {
                "point": a_point
            }
            self.db.child("user").child(user_id).update(point_info)
        return True
  • 이후 구매자는 session에 있는 현재 로그인된 유저의 정보를 이용해 DB에 있는 유저의 포인트를 감소시켜준다. 판매자는 get_seller를 통해 가져온 판매자 정보를 이용해 DB에 있는 판매자의 포인트를 증가시켜준다.
#사용자 포인트 가져오기
    def get_user_point(self, name):
        point=int(self.db.child("user").child(name).get().val()['point'])
        return point
  • 이를 이용하여 헤더나 다른 곳에 유저의 포인트를 표시해주고 싶다면, 위 함수를 사용하여 사용자의 포인트를 가져와서 표시해준다.

12. 유저 포인트 랭킹 구현

: 사용자의 랭킹 포인트를 가져와서 랭킹 포인트가 큰 순서대로 정렬한다.

[app.py]

#랭킹
@application.route("/ranking")
def ranking():
    page = request.args.get("page", 0, type=int)
    per_page=int(10) 
    per_row=int (1) 
    college = request.args.get("category", "all")
    row_count=int(per_page/per_row)
    start_idx=per_page*page
    end_idx=per_page*(page+1)

    if college=="all":
        data = DB.get_users() #전체상품조회 그대로
    else:
        data = DB.get_items_bycollege(college)
    data = dict(sorted(data.items(), key=lambda x: x[1]['rankingpoint'], reverse=True))
    item_counts = len(data)
    if item_counts<=per_page:
        data = dict(list(data.items())[:item_counts])
    else:
        data = dict(list(data.items())[start_idx:end_idx])
    tot_count = len(data)
    for i in range(row_count): 
        if (i == row_count-1) and (tot_count%per_row != 0):
            locals()['data_{}'.format(i)] = dict(list(data.items())[i*per_row:])
        else: 
            locals()['data_{}'.format(i)] = dict(list(data.items())[i*per_row:(i+1)*per_row])
    
    if 'id' in session:
        user_id = session['id']  
        user_ranking_point=DB.get_user_ranking_point(user_id)
    else: 
        user_ranking_point=0
  • 한페이지에 표시하고 싶은 인원수를 perpage안에 넣어주고 랭킹포인트대로 배열하는 것을 data = dict(sorted(data.items(), key=lambda x: x[1]['rankingpoint'], reverse=True)) 로 구현한다.
  • 여기서 x[1]['rankingpoint']는 랭킹 포인트 순서대로 표시한다는 것이고 reverse=True를 통해 내림차순으로 만들어준다.

  • 위 화면과 같이 화면에 보유 포인트 순으로 정렬됨을 확인할 수 있다.
profile
2023-2 오소플

0개의 댓글