Add SNS Marketing Campaign feature
- Add cash_cc_balance to User model (withdrawable CC) - Create SnsShareSubmission model for SNS share verification - Add marketing campaign settings to SystemSettings - Add reward_type to ReferralReward model - Create /api/sns-share endpoints for submission and verification - Add referral signup reward logic (10CC on signup) - Create /sns-share user page for SNS sharing - Create /admin/sns-shares management page - Add marketing settings UI to admin settings page - Add SNS Shares menu to admin sidebar 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -11,6 +11,7 @@ from .vehicle_share import VehicleShare, ShareReward
|
||||
from .withdrawal import WithdrawalRequest
|
||||
from .referral import ReferralReward
|
||||
from .notification import Notification
|
||||
from .sns_share import SnsShareSubmission
|
||||
from .push_subscription import PushSubscription, UserNotificationPreference
|
||||
from .performance_check import CarPerformanceCheck
|
||||
from .car_specification import CarSpecification
|
||||
@@ -52,6 +53,7 @@ __all__ = [
|
||||
"WithdrawalRequest",
|
||||
"ReferralReward",
|
||||
"Notification",
|
||||
"SnsShareSubmission",
|
||||
"PushSubscription",
|
||||
"UserNotificationPreference",
|
||||
"ExchangeRate",
|
||||
|
||||
@@ -16,10 +16,13 @@ class ReferralReward(Base):
|
||||
# 피추천인 (추천받아 가입한 사람)
|
||||
referred_user_id = Column(Integer, ForeignKey("users.id"), nullable=False, index=True)
|
||||
|
||||
# 결제 금액 (피추천인이 충전한 금액 USD)
|
||||
payment_amount = Column(Float, nullable=False)
|
||||
# 보상 유형: "signup" (가입 시), "payment" (결제 시)
|
||||
reward_type = Column(String(20), default="payment")
|
||||
|
||||
# 보상 금액 (결제 금액의 X%)
|
||||
# 결제 금액 (피추천인이 충전한 금액 USD, signup인 경우 0)
|
||||
payment_amount = Column(Float, default=0.0)
|
||||
|
||||
# 보상 금액 (결제 금액의 X% 또는 고정 CC)
|
||||
reward_amount = Column(Float, nullable=False)
|
||||
|
||||
# 보상 상태: pending(대기), credited(적립), withdrawn(출금)
|
||||
|
||||
@@ -47,6 +47,22 @@ class SystemSettings(Base):
|
||||
exchange_rate_weight_rub = Column(Float, default=0.0) # RUB (러시아 루블) 가중치
|
||||
exchange_rate_weight_cny = Column(Float, default=0.0) # CNY (중국 위안) 가중치
|
||||
|
||||
# 마케팅 캠페인 설정
|
||||
marketing_enabled = Column(Boolean, default=False) # 마케팅 캠페인 활성화
|
||||
marketing_start_date = Column(DateTime(timezone=True), nullable=True) # 캠페인 시작일
|
||||
marketing_end_date = Column(DateTime(timezone=True), nullable=True) # 캠페인 종료일
|
||||
|
||||
# SNS 공유 보상 설정
|
||||
sns_share_reward_cc = Column(Float, default=3.0) # SNS 공유 보상 CC (기본 3CC)
|
||||
referral_signup_reward_cc = Column(Float, default=10.0) # 레퍼럴 가입 보상 CC (기본 10CC)
|
||||
|
||||
# 이벤트 CC 유효기간 (개월)
|
||||
event_cc_validity_months = Column(Integer, default=6) # 이벤트 CC 유효기간 (기본 6개월)
|
||||
|
||||
# 출금 설정
|
||||
withdrawal_enabled = Column(Boolean, default=True) # 출금 기능 활성화
|
||||
min_withdrawal_usd = Column(Float, default=10.0) # 최소 출금 금액 (USD)
|
||||
|
||||
# 타임스탬프
|
||||
created_at = Column(DateTime(timezone=True), server_default=func.now())
|
||||
updated_at = Column(DateTime(timezone=True), server_default=func.now(), onupdate=func.now())
|
||||
|
||||
35
backend/app/models/sns_share.py
Normal file
35
backend/app/models/sns_share.py
Normal file
@@ -0,0 +1,35 @@
|
||||
from sqlalchemy import Column, Integer, String, Float, DateTime, ForeignKey, Text
|
||||
from sqlalchemy.orm import relationship
|
||||
from sqlalchemy.sql import func
|
||||
from ..database import Base
|
||||
|
||||
|
||||
class SnsShareSubmission(Base):
|
||||
"""SNS 공유 제출 및 검증 모델"""
|
||||
__tablename__ = "sns_share_submissions"
|
||||
|
||||
id = Column(Integer, primary_key=True, index=True)
|
||||
user_id = Column(Integer, ForeignKey("users.id"), nullable=False)
|
||||
car_id = Column(Integer, ForeignKey("cars.id"), nullable=False)
|
||||
|
||||
# SNS 정보
|
||||
platform = Column(String(20), nullable=False) # twitter, instagram, facebook
|
||||
sns_url = Column(String(500), nullable=False) # 공유 게시물 URL
|
||||
|
||||
# 상태
|
||||
status = Column(String(20), default="pending") # pending, approved, rejected
|
||||
rejected_reason = Column(Text, nullable=True) # 거부 사유
|
||||
|
||||
# CC 보상
|
||||
reward_cc = Column(Float, default=3.0) # 기본 3CC 보상
|
||||
rewarded_at = Column(DateTime(timezone=True), nullable=True) # 보상 지급 시각
|
||||
|
||||
# 타임스탬프
|
||||
submitted_at = Column(DateTime(timezone=True), server_default=func.now())
|
||||
verified_at = Column(DateTime(timezone=True), nullable=True) # 검증 시각
|
||||
verified_by = Column(Integer, ForeignKey("users.id"), nullable=True) # 검증한 관리자
|
||||
|
||||
# Relationships
|
||||
user = relationship("User", foreign_keys=[user_id], backref="sns_submissions")
|
||||
car = relationship("Car", backref="sns_shares")
|
||||
verifier = relationship("User", foreign_keys=[verified_by])
|
||||
@@ -24,7 +24,8 @@ class User(Base):
|
||||
is_active = Column(Boolean, default=True)
|
||||
is_admin = Column(Boolean, default=False)
|
||||
is_dealer = Column(Boolean, default=False) # Dealer status
|
||||
cc_balance = Column(Float, default=3.0) # CC coin balance, 3 free on signup
|
||||
cc_balance = Column(Float, default=3.0) # 프로모션 CC (출금 불가) - 가입보너스, SNS공유, 레퍼럴
|
||||
cash_cc_balance = Column(Float, default=0.0) # 현금성 CC (출금 가능) - 딜러수수료 88%
|
||||
referral_code = Column(String(8), unique=True, index=True) # Unique referral code for sharing
|
||||
referred_by = Column(String(8), nullable=True) # Referral code of the user who referred this user
|
||||
|
||||
|
||||
Reference in New Issue
Block a user