Project Portfolio
유저 피드백 반영하기(채팅, 마이페이지 업그레이드, 주문취소와 환불처리)
츄98
2023. 7. 7. 21:03
- 포인트 통계
- 원래는 이번달 리워드, 총 포인트 이렇게 되어있었는데, 사용자 중 이해하기 어렵다는 피드백이 있었다.
- 그래서 이번달 획득포인트, 이용포인트, 현재포인트총액으로 직관적으로 이해할 수 있도록 바꾸었다.

- 채팅
- 비밀채팅방 기능: 비밀채팅방 기능이 있으면 좋겠다는 평이 있어서 추가했다.
- make_password을 사용하여 비밀번호 해싱
- check_password을 사용해 프론트 요청 온 비밀번호와 db에 담긴 해싱된 비밀번호 비교
- super(): 파이썬에서 부모 클래스의 메소드나 속성을 직접 참조하기 위해 사용하는 내장함수
- super(ChatRoom, self)는 ChatRoom 클래스의 부모클래스를 의미한다.
- super(ChatRoom, self).save(*args,**kwargs)는 ChatRoom클래스의 부모클래스인 Model 클래스의 save()메소드를 호출한다. 즉, 코드에서 save() 메소드가 호출되면 먼저 password 필드에 저장된 값을 암호화하고, 부모클래스인 Model 클래스의 save()를 호출하여 해당 ChatRoom 객체를 데이터베이스에 저장한다.
- 코드중복을 줄이고 상속 구조에 따른 코드의 확장성과 유연성을 제공할 수 있다.
# 모델
class ChatRoom(CommonModel):
author = models.ForeignKey(User, on_delete=models.CASCADE)
name = models.CharField(unique=True, max_length=10, blank=False, null=False)
desc = models.CharField(max_length=50, blank=False)
password = models.CharField(max_length=128, null=True, blank=True)
class Meta:
ordering = ['-created_at']
def __str__(self):
return self.name
def save(self, *args, **kwargs):
if self.password:
self.password = make_password(self.password)
super(ChatRoom, self).save(*args, **kwargs)
# views.py
def checkpassword(self, request, room_id, password):
room = get_object_or_404(ChatRoom, pk=room_id)
if check_password(password, room.password):
return Response(status=status.HTTP_200_OK)
else:
return Response(status=status.HTTP_403_FORBIDDEN)


- 마이페이지 팔로우한 스토어 오류 수정
- 팔로우한 스토어가 제대로 작동하지 않았고, 페이지네이션도 존재하지 않았다.
- 페이지네이션 및 오류를 해결하고, css와 모바일 반응형도 추가했다.

- 주문취소와 환불처리 구현
- 원래는 주문취소와 환불처리 기능이 없었다.
- 유저피드백에서 구현요청이 있어서 추가로 구현을 했다.
- 주문 상태 카테고리를 추가하여 구현하였다.
def order_point_refund(user: object, total_buy_price: int):
"""환불 포인트 생성"""
Point.objects.create(user=user, point_type_id=9, point=total_buy_price)
def product_amount_restock(product: object, buy_amount: int):
"""환불 시 상품 재고량 복구"""
product.amount += buy_amount
product.item_state = 1 # 판매중(1)상태로 변경
product.save()
class StatusChangeView(UpdateAPIView):
"""주문 상태 변경"""
'''결제대기(1) 주문확인중(2) 배송준비중(3) 발송완료(4) 배송완료(5) 구매확정(6) 주문취소(7) 환불요청중(8) 환불완료(9)'''
permission_classes = [IsAuthenticated]
serializer_class = OrderStatusSerializer
queryset = OrderItem.objects.all()
def perform_update(self, serializer):
order_item = self.get_object()
cur_status = order_item.order_status.id
new_status = self.request.data.get("order_status")
# 배송완료(5)상태에서 구매확정(6)이 되었을 때
if cur_status == 5 and new_status == 6:
seller = order_item.seller.user
total_point = order_item.amount * order_item.price
# 유저 포인트 적립 및 판매자 포인트 지급
order_point_create(self.request.user, seller, total_point)
# 주문취소(7), 환불완료(9) 되었을 때
if new_status in [7,9] :
# 유저 포인트 환불
total_point = order_item.amount * order_item.price
order_point_refund(self.request.user, total_point)
# 상품 수량 복구
product = get_object_or_404(Product, id=order_item.product_id)
product_amount_restock(product=product, buy_amount=order_item.amount)
serializer.save()