From 5a7c7170d0e08317387c6ff0707593e9ac02eab4 Mon Sep 17 00:00:00 2001 From: aaron <> Date: Tue, 7 Jan 2025 11:01:44 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E8=87=AA=E5=8A=A8=E5=8F=91?= =?UTF-8?q?=E6=94=BE=E6=96=B0=E4=BA=BA=E5=88=B8=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/api/endpoints/coupon.py | 3 +-- app/api/endpoints/point.py | 9 ++++++--- app/api/endpoints/user.py | 11 +++++++++-- app/models/coupon.py | 6 +++--- app/models/order.py | 19 +++++++++++++------ app/models/point.py | 1 + app/models/user.py | 10 +++++++--- 7 files changed, 40 insertions(+), 19 deletions(-) diff --git a/app/api/endpoints/coupon.py b/app/api/endpoints/coupon.py index 7eeb52c..d72e93d 100644 --- a/app/api/endpoints/coupon.py +++ b/app/api/endpoints/coupon.py @@ -136,8 +136,7 @@ async def get_user_coupons( async def get_all_coupons( skip: int = 0, limit: int = 10, - db: Session = Depends(get_db), - admin: UserDB = Depends(get_admin_user) + db: Session = Depends(get_db) ): """获取所有优惠券列表(管理员)""" coupons = db.query(CouponDB).order_by( diff --git a/app/api/endpoints/point.py b/app/api/endpoints/point.py index 63c7d1f..2b90550 100644 --- a/app/api/endpoints/point.py +++ b/app/api/endpoints/point.py @@ -14,14 +14,17 @@ router = APIRouter() async def add_points( record: PointRecordCreate, db: Session = Depends(get_db), - current_user: UserDB = Depends(get_admin_user) # 仅管理员可操作 + admin: UserDB = Depends(get_admin_user) # 仅管理员可操作 ): """增加用户积分""" - user = db.query(UserDB).filter(UserDB.userid == current_user.userid).first() + user = db.query(UserDB).filter(UserDB.userid == record.user_id).first() + + if not user: + return error_response(code=404, message="用户不存在") # 创建积分记录 point_record = PointRecordDB( - user_id=user.userid, + user_id=record.user_id, points=record.points, description=record.description ) diff --git a/app/api/endpoints/user.py b/app/api/endpoints/user.py index bf24a78..6a43aaf 100644 --- a/app/api/endpoints/user.py +++ b/app/api/endpoints/user.py @@ -15,6 +15,7 @@ from app.core.security import create_access_token, set_jwt_cookie, clear_jwt_coo from app.core.response import success_response, error_response, ResponseModel from pydantic import BaseModel, Field from typing import List +from datetime import datetime router = APIRouter() @@ -87,7 +88,7 @@ async def login( user = db.query(UserDB).filter(UserDB.phone == phone).first() if not user: # 生成用户编码 - user_code = generate_user_code() + user_code = generate_user_code(db) user = UserDB( username=f"user_{phone[-4:]}", @@ -144,7 +145,7 @@ async def mock_login( user = db.query(UserDB).filter(UserDB.phone == request.phone).first() if not user: # 生成用户编码 - user_code = generate_user_code() + user_code = generate_user_code(db) user = UserDB( username=f"user_{request.phone[-4:]}", @@ -309,6 +310,9 @@ def issue_register_coupons(db: Session, user_id: int): """ register_coupons = settings.REGISTER_COUPONS + # 设置过期时间为3个月后 + expire_time = datetime.now() + timedelta(days=90) + for config in register_coupons: coupon = db.query(CouponDB).filter( CouponDB.id == config["coupon_id"] @@ -319,6 +323,9 @@ def issue_register_coupons(db: Session, user_id: int): user_coupon = UserCouponDB( user_id=user_id, coupon_id=coupon.id, + coupon_name=coupon.name, + coupon_amount=coupon.amount, + expire_time=expire_time, status="unused" ) db.add(user_coupon) \ No newline at end of file diff --git a/app/models/coupon.py b/app/models/coupon.py index 6d4563c..45798d4 100644 --- a/app/models/coupon.py +++ b/app/models/coupon.py @@ -7,9 +7,9 @@ from .database import Base import enum class CouponStatus(str, enum.Enum): - UNUSED = "未使用" - USED = "已使用" - EXPIRED = "已过期" + UNUSED = "UNUSED" + USED = "USED" + EXPIRED = "EXPIRED" # 数据库模型 class CouponDB(Base): diff --git a/app/models/order.py b/app/models/order.py index b995258..473d044 100644 --- a/app/models/order.py +++ b/app/models/order.py @@ -7,11 +7,15 @@ from .database import Base import enum class OrderStatus(str, enum.Enum): - PENDING = "pending" - ACCEPTED = "accepted" - UNPAID = "unpaid" - COMPLETED = "completed" - CANCELLED = "cancelled" + CREATED = "created" # 已下单 + ACCEPTED = "accepted" # 已接单 + UNPAID = "unpaid" # 未支付 + COMPLETED = "completed" # 已完成 + CANCELLED = "cancelled" # 已取消 + +class DeliveryMethod(str, enum.Enum): + DELIVERY_TO_DOOR = "delivery_to_door" # 放在门口 + DELIVERY_TO_ROOM = "delivery_to_room" # 投递到家 # 数据库模型 class ShippingOrderDB(Base): @@ -25,10 +29,11 @@ class ShippingOrderDB(Base): coupon_discount_amount = Column(Float, default=0) coupon_id = Column(Integer, ForeignKey("user_coupons.id"), nullable=True) final_amount = Column(Float, nullable=False) - status = Column(Enum(OrderStatus), nullable=False, default=OrderStatus.PENDING) + status = Column(Enum(OrderStatus), nullable=False, default=OrderStatus.CREATED) cancel_reason = Column(String(200), nullable=True) # 取消原因 complete_images = Column(String(1000), nullable=True) # 完成订单的图片URL,多个URL用逗号分隔 create_time = Column(DateTime(timezone=True), server_default=func.now()) + delivery_method = Column(Enum(DeliveryMethod), nullable=False, default=DeliveryMethod.DELIVERY_TO_DOOR) class ShippingOrderPackageDB(Base): __tablename__ = "shipping_order_packages" @@ -50,6 +55,7 @@ class OrderCreate(BaseModel): original_amount: float = Field(..., ge=0) coupon_id: Optional[int] = None packages: List[OrderPackage] + delivery_method: DeliveryMethod = Field(default=DeliveryMethod.DELIVERY_TO_DOOR) class OrderInfo(BaseModel): orderid: str @@ -63,6 +69,7 @@ class OrderInfo(BaseModel): status: OrderStatus complete_images: Optional[List[str]] = None create_time: datetime + delivery_method: DeliveryMethod def __init__(self, **data): super().__init__(**data) diff --git a/app/models/point.py b/app/models/point.py index 845f276..7069877 100644 --- a/app/models/point.py +++ b/app/models/point.py @@ -15,6 +15,7 @@ class PointRecordDB(Base): create_time = Column(DateTime(timezone=True), server_default=func.now()) class PointRecordCreate(BaseModel): + user_id: int = Field(..., description="用户ID") points: float = Field(..., description="积分变动值,可为正或负") description: str = Field(..., min_length=1, max_length=200) diff --git a/app/models/user.py b/app/models/user.py index f80699f..42d0573 100644 --- a/app/models/user.py +++ b/app/models/user.py @@ -2,7 +2,7 @@ from sqlalchemy import Column, String, DateTime, Integer, Boolean, Enum, Foreign from sqlalchemy.sql import func from sqlalchemy.dialects.mysql import JSON from pydantic import BaseModel, Field -from .database import Base +from .database import Base, get_db from typing import Optional, List, Union from datetime import datetime import enum @@ -71,13 +71,17 @@ class UserPasswordLogin(BaseModel): phone: str = Field(..., pattern="^1[3-9]\d{9}$") password: str = Field(..., min_length=6, max_length=20) -def generate_user_code() -> str: +def generate_user_code(db=None) -> str: """生成6位大写字母+数字的用户编码""" chars = string.ascii_uppercase + string.digits while True: code = ''.join(random.choices(chars, k=6)) # 检查是否已存在 - exists = UserDB.query.filter_by(user_code=code).first() + if db: + exists = db.query(UserDB).filter(UserDB.user_code == code).first() + else: + db = next(get_db()) + exists = db.query(UserDB).filter(UserDB.user_code == code).first() if not exists: return code