💡 1 ~ 6 [해설1] : 백_양지원
상품 등록, 등록한 상품 조회, 전체 상품 리스트 조회, 상품 상세보기 화면, 좋아요 및 다운로드 횟수 카운팅 기능, 구매 완료 화면 연결
💡 7 ~ 8 [해설2] : 백_황혜진
리뷰 작성, 등록한 리뷰 조회, 상품별 리뷰 조회 화면, 리뷰 상세보기 화면, 회원별 마이페이지 구현
💡 9 ~ 12 [해설3] : 백_윤소민
회원가입, 아이디 중복확인, 닉네임 중복확인, 로그인 및 로그아웃, 상품 구매시 포인트, 랭킹포인트 증감 기능, 사용자 포인트별 랭킹 정렬 기능
[app.py]
@application.route("/1~4/item_reg")
def view_reg_items():
if 'id' not in session or not session['id']:
flash('상품을 등록하려면 로그인을 해주세요.')
return redirect(url_for('login'))
else:
return render_template("1~4/item_reg.html")
[item_reg.html]
<div id="regitem-container">
<form id="regitem" action="/submit_item_post" method="post" enctype="multipart/form-data">
… 입력 내용 … </form>
[app.py]
@application.route("/submit_item_post", methods=['POST'])
def reg_item_submit_post():
if 'id' not in session or not session['id']:
flash('상품을 등록하려면 로그인을 해주세요.')
return redirect(url_for('login'))
else:
item_file=request.files['item_upload']
item_file.save("static/items/{}".format(item_file.filename))
photo_file=request.files.getlist("photo_upload[]")
data=request.form
writer = session['id']
for f in photo_file:
f.save('static/photos/' + f.filename)
DB.insert_item(data['item_name'], data, item_file.filename, [f.filename for f in photo_file], session['id'])
return render_template("1~4/item_detail.html", data=data, item_path="static/items/{}".format(item_file.filename), photo_paths=["static/photos/{}".format(f.filename) for f in photo_file])
[database.py]
#상품 정보 등록하기
def insert_item(self, item_name, data, item_path, photo_path, user_id):
item_info = {
"writer": user_id,
"item_name": data['item_name'],
"item_type": data['item_type'],
"price": data['price'],
"course_type": data.get('course_type'),
"faculty": data.get('faculty'),
"major": data['major'],
"course_number": data['course_number'],
"professor": data['professor'],
"description": data['description'],
"tag": data['tag'],
"item_path": item_path,
"photo_path": photo_path,
"download_count": 0
}
user_and_item = user_id + '_' + data['item_name']
self.db.child("item").child(user_and_item).set(item_info)
print(data, item_path)
for path in photo_path:
print("사진 경로:", path)
return True
[app.py]
#### 맨 처음 화면이 이 view_items()함수로 옴.
@application.route("/1~4/view_item")
def view_items():
page = request.args.get("page", 0, type=int)
per_page=5 # item count to display per page
per_row=1 # item count to display per row
row_count=int(per_page/per_row)
start_idx=per_page*page
end_idx=per_page*(page+1)
data = DB.get_items()
item_counts = len(data)
data = dict(list(data.items())[start_idx:end_idx])
tot_count = len(data)
for i in range(row_count): #last row
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])
return render_template("1~4/view_item.html", datas=data.items(), row1=locals()['data_0'].items(), row2=locals()['data_1'].items(), limit=per_page, page=page, page_count=int((item_counts/per_page) +1), total = item_counts)
[view_item.html]
<div class="item-card" onclick="location.href='/1~4/view_item_detail/{{key}}/';" style="cursor:pointer;">
… 추가 내용 … </div>
[app.py]
#전체 리스트에서 상품 클릭 시 세부정보 볼 수 있음
@application.route("/1~4/view_item_detail/<item_name>/")
def view_item_detail(item_name):
data=DB.get_item_byname(str(item_name))
return render_template("1~4/detail.html", item_name=item_name, data=data)
[database.py]
#상품 이름으로 상품 정보 가져오기
def get_item_byname(self, name):
items = self.db.child("item").get()
target_value=""
for res in items.each():
key_value = res.key()
if key_value == name:
target_value=res.val()
return target_value
화면에서 좋아요 기능 구현
[Detail.html]
<script>
function showHeart() {
$.ajax({
type: 'GET',
url: '/show_heart/{{item_name}}/',
data: {},
success: function (response){
let my_heart = response['my_heart'];
if (my_heart['interested'] == 'Y')
{
$("#heart").css("color","red");
$("#heart").attr("onclick","unlike()");
}
else
{
$("#heart").css("color","grey");
$("#heart").attr("onclick","like()");
}
//alert("showheart!")
}
});
}
function like() {
$.ajax({
type: 'POST',
url: '/like/{{item_name}}/',
data: {
interested : "Y"
},
success: function (response) {
alert(response['msg']);
window.location.reload()
}
});
}
function unlike() {
$.ajax({
type: 'POST',
url: '/unlike/{{item_name}}/',
data: {
interested : "N"
},
success: function (response) {
alert(response['msg']);
window.location.reload()
}
});
}
$(document).ready(function () {
showHeart();
});
</script>
[app.py]
#좋아요 관련 기능
@application.route('/show_heart/<item_name>/', methods=['GET'])
def show_heart(item_name):
if 'id' not in session or not session['id']:
flash('상품을 찜하려면 로그인을 해주세요.')
return redirect(url_for('login'))
else:
my_heart = DB.get_heart_byname(session['id'],item_name)
return jsonify({'my_heart': my_heart})
@application.route('/like/<item_name>/', methods=['POST'])
def like(item_name):
if 'id' not in session or not session['id']:
flash('상품을 찜하려면 로그인을 해주세요.')
return redirect(url_for('login'))
else:
my_heart = DB.update_heart(session['id'],'Y',item_name)
return jsonify({'msg': '좋아요 완료!'})
@application.route('/unlike/<item_name>/', methods=['POST'])
def unlike(item_name):
if 'id' not in session or not session['id']:
flash('상품을 찜하려면 로그인을 해주세요.')
return redirect(url_for('login'))
else:
my_heart = DB.update_heart(session['id'],'N',item_name)
return jsonify({'msg': '안좋아요 완료!'})
[database.py]
#heart 정보 가져오기
def get_heart_byname(self, uid, name):
hearts = self.db.child("heart").child(uid).get()
target_value=""
if hearts.val() == None:
return target_value
for res in hearts.each():
key_value = res.key()
if key_value == name:
target_value=res.val()
return target_value
#heart 값 변경하기
def update_heart(self, user_id, isHeart, item):
heart_info ={
"interested": isHeart
}
self.db.child("heart").child(user_id).child(item).set(heart_info)
[Detail.html]
<div>
<button onclick="location.href='/1~4/order_item/{{item_name}}/';" title="to-payment" id="order-btn" class="button btnFade btnDefaultblue">바로 구매하기</button>
[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))
if 'id' not in session or not session['id']:
flash('구매하시려면 로그인을 해주세요.')
return redirect(url_for('login'))
else:
download_count = DB.increase_download_count(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) #판매자 랭킹 포인트 증가
DB.insert_purchase_history(item_name, session['id'])
seller_email = DB.get_seller_email(item_name)
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)
[database.py]
def insert_item(self, item_name, data, item_path, photo_path, user_id):
item_info = {
… 추가 내용들 …
"download_count": 0
}
#사용자별 구매내역 저장하기
def insert_purchase_history(self, item_name, user_id):
timestamp = int(time.time())
purchase_info = {
"item_name": item_name,
"timestamp": timestamp
}
self.db.child("user_purchase_history").child(user_id).set(purchase_info)
return True
#구매 버튼 누를 때마다 download 횟수 하나씩 늘려 저장
def increase_download_count(self, item_name):
current_count = self.db.child("item").child(item_name).child("download_count").get().val()
new_count = current_count + 1
self.db.child("item").child(item_name).update({"download_count": new_count})
return new_count
#판매자 이메일 가져오기
def get_seller_email(self, item_name):
writer = self.db.child("item").child(item_name).get().val().get('writer')
if writer:
user_data = self.db.child("user").child(writer).get().val()
if user_data:
email = user_data.get('email')
return email return None