This commit is contained in:
2025-11-20 21:42:20 +08:00
parent e2d2b0b75b
commit 150d45e3eb
10 changed files with 491 additions and 126 deletions

View File

@@ -16,7 +16,7 @@ class Shop(Model):
shop_number (CharField): 店铺号码,最大长度 255 nullable 为 True
"""
id = fields.UUIDField(pk=True, default=uuid.uuid4, description="ID")
province = fields.CharField(max_length=255, index=True, description="省份")
province = fields.CharField(max_length=255, null=True, index=True, description="省份")
city = fields.CharField(max_length=255, index=True, description="城市")
street = fields.CharField(max_length=255, index=True, description="街道")
shop_name = fields.CharField(max_length=255, index=True, description="店铺名称")

View File

@@ -13,7 +13,7 @@ class Base(BaseModel):
包含店铺相关的通用字段,供创建与输出模型复用
"""
province: str = Field(..., description='省份')
province: str | None = Field(None, description='省份')
city: str = Field(..., description='城市')
street: str = Field(..., description='街道')
shop_name: str = Field(..., description='店铺名称')

View File

@@ -6,6 +6,8 @@ from ..models import Shop
from utils.decorators import handle_exceptions_unified
from utils.time_tool import parse_time
from utils.out_base import CommonOut
from tortoise.transactions import in_transaction
import random
app = APIRouter()
@@ -17,6 +19,9 @@ async def post(item: Create = Body(..., description='创建数据')):
"""
创建店铺记录
"""
res = await Shop.filter(street=item.street).first()
if res:
raise HTTPException(status_code=400, detail='店铺已存在')
res = await Shop.create(**item.model_dump())
if not res:
raise HTTPException(status_code=400, detail='创建失败')
@@ -132,3 +137,19 @@ async def delete(id: UUID = Query(..., description='主键ID'),
# Tortoise ORM 单个实例的 delete() 方法返回 None而不是删除的记录数
# 删除成功时手动返回 1如果有异常会被装饰器捕获
return CommonOut(count=1)
# 随机取一个店铺
@app.get("/random", response_model=Out, description='随机取一个店铺', summary='随机取一个店铺')
@handle_exceptions_unified()
async def get_random_shop():
"""
随机取一个店铺(事务内计数与偏移选择,避免数据库不稳定的随机排序)
"""
async with in_transaction() as conn:
q = Shop.all().using_db(conn)
total = await q.count()
if total == 0:
raise HTTPException(status_code=404, detail='店铺不存在')
pick_index = random.choice(range(total))
item = await q.order_by('create_time').offset(pick_index).first()
return item

View File

@@ -13,28 +13,30 @@ async def upgrade(db: BaseDBAsyncClient) -> str:
) CHARACTER SET utf8mb4 COMMENT='食物表';
CREATE TABLE IF NOT EXISTS `info` (
`id` CHAR(36) NOT NULL PRIMARY KEY COMMENT 'ID',
`firstname` VARCHAR(255) NOT NULL COMMENT '',
`lastname` VARCHAR(255) NOT NULL COMMENT '',
`full_name` VARCHAR(255) NOT NULL COMMENT '全名',
`first_name` VARCHAR(255) NOT NULL COMMENT '',
`last_name` VARCHAR(255) NOT NULL COMMENT '',
`birthday` VARCHAR(32) NOT NULL COMMENT '生日',
`street_address` VARCHAR(255) NOT NULL COMMENT '街道地址',
`current_address` VARCHAR(255) NOT NULL COMMENT '街道地址',
`city` VARCHAR(255) NOT NULL COMMENT '城市',
`phone` VARCHAR(64) NOT NULL COMMENT '电话',
`zip_code` VARCHAR(20) NOT NULL COMMENT '邮编',
`state_fullname` VARCHAR(255) NOT NULL COMMENT '州全称',
`postal_code` VARCHAR(20) NOT NULL COMMENT '邮编',
`province` VARCHAR(255) NOT NULL COMMENT '州全称',
`status` BOOL NOT NULL COMMENT '状态' DEFAULT 0,
`email` VARCHAR(255) NOT NULL UNIQUE COMMENT '邮箱',
`email_content` LONGTEXT COMMENT '邮件内容',
`text` LONGTEXT COMMENT '文本内容',
`create_time` DATETIME(6) NOT NULL COMMENT '创建时间' DEFAULT CURRENT_TIMESTAMP(6),
`update_time` DATETIME(6) NOT NULL COMMENT '更新时间' DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),
KEY `idx_info_firstna_11312f` (`firstname`),
KEY `idx_info_lastnam_c1f2c2` (`lastname`),
KEY `idx_info_full_na_bc9dc4` (`full_name`),
KEY `idx_info_street__632b0d` (`street_address`),
KEY `idx_info_first_n_6c5ff4` (`first_name`),
KEY `idx_info_last_na_34b807` (`last_name`),
KEY `idx_info_current_86bcd7` (`current_address`),
KEY `idx_info_city_7b94a7` (`city`),
KEY `idx_info_zip_cod_7d259e` (`zip_code`),
KEY `idx_info_state_f_58c986` (`state_fullname`),
KEY `idx_info_postal__54d88d` (`postal_code`),
KEY `idx_info_provinc_58581b` (`province`),
KEY `idx_info_email_653be4` (`email`),
KEY `idx_info_create__3bea91` (`create_time`),
KEY `idx_info_city_014fff` (`city`, `zip_code`, `state_fullname`),
KEY `idx_info_firstna_8d37ca` (`firstname`, `lastname`)
KEY `idx_info_city_5d54c4` (`city`, `postal_code`, `province`),
KEY `idx_info_first_n_2c2b2d` (`first_name`, `last_name`)
) CHARACTER SET utf8mb4 COMMENT='信息表';
CREATE TABLE IF NOT EXISTS `shop` (
`id` CHAR(36) NOT NULL PRIMARY KEY COMMENT 'ID',

View File

@@ -0,0 +1,11 @@
from tortoise import BaseDBAsyncClient
async def upgrade(db: BaseDBAsyncClient) -> str:
return """
ALTER TABLE `shop` MODIFY COLUMN `province` VARCHAR(255) COMMENT '省份';"""
async def downgrade(db: BaseDBAsyncClient) -> str:
return """
ALTER TABLE `shop` MODIFY COLUMN `province` VARCHAR(255) NOT NULL COMMENT '省份';"""