feat: Add Review (사용후기) board system with CC reward

- Backend: Review model, full API (public/user/admin endpoints)
- Frontend: list, detail, write/edit pages, admin management
- 1 CC reward for writing a review on completed vehicle requests
- Navigation updates (Header + admin sidebar)
- "Write Review" button on my-request page for completed requests

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
AutonetSellCar Deploy
2026-02-18 08:42:35 +09:00
parent 30888c1434
commit 8e230c537c
12 changed files with 1674 additions and 3 deletions

View File

@@ -19,6 +19,7 @@ from .exchange_rate import ExchangeRate, ExchangeRateHistory
from .cc_package import CCPackage, DEFAULT_CC_PACKAGES
from .visitor import VisitorLog, VisitorDailyStats, VisitorSession
from .bulletin import BoardCategory, BoardPost
from .review import Review
__all__ = [
"CarMaker",
@@ -66,4 +67,5 @@ __all__ = [
"VisitorSession",
"BoardCategory",
"BoardPost",
"Review",
]

View File

@@ -0,0 +1,29 @@
from sqlalchemy import Column, Integer, String, Text, Boolean, DateTime, ForeignKey, CheckConstraint
from sqlalchemy.orm import relationship
from sqlalchemy.sql import func
from ..database import Base
class Review(Base):
"""User reviews for completed vehicle requests"""
__tablename__ = "reviews"
__table_args__ = (
CheckConstraint('rating >= 1 AND rating <= 5', name='check_rating_range'),
)
id = Column(Integer, primary_key=True, index=True)
request_id = Column(Integer, ForeignKey("vehicle_requests.id"), nullable=False, unique=True)
author_id = Column(Integer, ForeignKey("users.id"), nullable=False, index=True)
rating = Column(Integer, nullable=False)
title = Column(String(255), nullable=False)
content = Column(Text, nullable=False)
cc_rewarded = Column(Boolean, default=False)
is_published = Column(Boolean, default=True, index=True)
view_count = Column(Integer, default=0)
created_at = Column(DateTime(timezone=True), server_default=func.now(), index=True)
updated_at = Column(DateTime(timezone=True), onupdate=func.now())
# Relationships
request = relationship("VehicleRequest", backref="review")
author = relationship("User", backref="reviews")