This commit is contained in:
aaron 2025-03-09 23:37:33 +08:00
parent b1b7e05b99
commit 1dabf231b1
9 changed files with 406 additions and 2 deletions

View File

@ -164,4 +164,19 @@ async def delete_community(
return error_response(code=404, message="社区不存在") return error_response(code=404, message="社区不存在")
db.commit() db.commit()
return success_response(message="社区已删除") return success_response(message="社区已删除")
#查询小区
@router.get("/search_by_name/{name}", response_model=ResponseModel)
async def search_community_by_name(
name: str,
db: Session = Depends(get_db)
):
"""通过小区名称搜索小区"""
communities = db.query(CommunityDB).filter(CommunityDB.name.ilike(f"%{name}%")).all()
results=[]
for community in communities:
results.append(CommunityInfo.model_validate(community))
return success_response(data=results)

View File

@ -0,0 +1,172 @@
from fastapi import APIRouter, Depends, HTTPException, Query, Path
from sqlalchemy.orm import Session
from typing import List, Optional
from pydantic import BaseModel, Field
from app.models.database import get_db
from app.models.community_set import CommunitySet
from app.api.deps import get_current_user, get_admin_user
from app.models.user import UserDB
from app.models.community import CommunityDB
from app.models.community_set_mapping import CommunitySetMapping
from datetime import datetime
from app.core.response import success_response, error_response
router = APIRouter()
# 请求和响应模型
class CommunitySetCreate(BaseModel):
set_name: str = Field(..., min_length=1, max_length=100, description="集合名称")
user_id: int = Field(..., description="用户ID")
class CommunitySetUpdate(BaseModel):
set_name: str = Field(..., min_length=1, max_length=100, description="集合名称")
user_id: int = Field(..., description="用户ID")
class CommunitySetInfo(BaseModel):
id: int
set_name: str
user_id: int
create_time: datetime
update_time: datetime
user_name: Optional[str] = None
class Config:
from_attributes = True
# 创建社区集合
@router.post("/", response_model=CommunitySetInfo)
async def create_community_set(
community_set: CommunitySetCreate,
db: Session = Depends(get_db),
current_user: UserDB = Depends(get_admin_user)
):
"""创建社区集合"""
new_set = CommunitySet(
set_name=community_set.set_name,
user_id=community_set.user_id
)
db.add(new_set)
db.commit()
db.refresh(new_set)
return success_response(data=CommunitySetInfo.model_validate(new_set))
# 获取当前用户的所有社区集合
@router.get("/list/user", response_model=List[CommunitySetInfo])
async def get_user_community_sets(
db: Session = Depends(get_db),
current_user: UserDB = Depends(get_current_user),
skip: int = Query(0, ge=0),
limit: int = Query(100, ge=1, le=100)
):
"""获取当前用户的所有社区集合"""
sets = db.query(CommunitySet).filter(
CommunitySet.user_id == current_user.userid
).offset(skip).limit(limit).all()
results = [CommunitySetInfo.model_validate(set) for set in sets]
total = db.query(CommunitySet).filter(
CommunitySet.user_id == current_user.userid
).count()
return success_response(data={"total": total, "items": results})
# 获取特定社区集合
@router.get("/{set_id}", response_model=CommunitySetInfo)
async def get_community_set(
set_id: int = Path(..., ge=1),
db: Session = Depends(get_db),
current_user: UserDB = Depends(get_current_user)
):
"""获取特定社区集合"""
community_set = db.query(CommunitySet).filter(
CommunitySet.id == set_id,
CommunitySet.user_id == current_user.userid
).first()
if not community_set:
raise HTTPException(status_code=404, detail="社区集合不存在")
result = CommunitySetInfo.model_validate(community_set)
return success_response(data=result)
# 管理员获取所有社区集合
@router.get("/list/all", response_model=List[CommunitySetInfo])
async def get_all_community_sets(
skip: int = Query(0, ge=0),
limit: int = Query(20, ge=1, le=100),
db: Session = Depends(get_db),
current_user: UserDB = Depends(get_admin_user)
):
"""管理员获取所有社区集合"""
# 获取所有社区集合, join 社区名字和 用户名字
sets = db.query(CommunitySet, UserDB.nickname.label("user_name")).join(UserDB, CommunitySet.user_id == UserDB.userid).offset(skip).limit(limit).all()
results = []
for set in sets:
# 查询集合下有多少个社区
community_count = db.query(CommunitySetMapping).filter(
CommunitySetMapping.set_id == set.CommunitySet.id
).count()
result= {
"id": set.CommunitySet.id,
"set_name": set.CommunitySet.set_name,
"user_id": set.CommunitySet.user_id,
"user_name": set.user_name,
"create_time": set.CommunitySet.create_time,
"update_time": set.CommunitySet.update_time,
"community_count": community_count
}
results.append(result)
total = db.query(CommunitySet).count()
return success_response(data={"total": total, "items": results})
# 更新社区集合
@router.put("/{set_id}", response_model=CommunitySetInfo)
async def update_community_set(
community_set: CommunitySetUpdate,
set_id: int = Path(..., ge=1),
db: Session = Depends(get_db),
current_user: UserDB = Depends(get_admin_user)
):
"""更新社区集合"""
db_set = db.query(CommunitySet).filter(
CommunitySet.id == set_id
).first()
if not db_set:
return error_response(code=404, message="社区集合不存在")
db_set.set_name = community_set.set_name
db_set.user_id = community_set.user_id
db.commit()
db.refresh(db_set)
return success_response(data= CommunitySetInfo.model_validate(db_set))
# 删除社区集合
@router.delete("/{set_id}", response_model=dict)
async def delete_community_set(
set_id: int = Path(..., ge=1),
db: Session = Depends(get_db),
current_user: UserDB = Depends(get_current_user)
):
"""删除社区集合"""
db_set = db.query(CommunitySet).filter(
CommunitySet.id == set_id,
CommunitySet.user_id == current_user.userid
).first()
if not db_set:
return error_response(code=404, message="社区集合不存在")
db.delete(db_set)
db.commit()
return success_response(data={"message": "社区集合已删除"})

View File

@ -0,0 +1,163 @@
from fastapi import APIRouter, Depends, HTTPException, Query, Path
from sqlalchemy.orm import Session
from typing import List, Optional
from pydantic import BaseModel, Field
from app.models.database import get_db
from app.models.community_set_mapping import CommunitySetMapping
from app.models.community_set import CommunitySet
from app.models.community import CommunityDB
from app.api.deps import get_current_user, get_admin_user
from app.models.user import UserDB
from datetime import datetime
from app.core.response import success_response, error_response
router = APIRouter()
# 请求和响应模型
class CommunitySetMappingCreate(BaseModel):
set_id: int = Field(..., ge=1, description="社区集合ID")
community_id: int = Field(..., ge=1, description="社区ID")
class CommunitySetMappingResponse(BaseModel):
id: int
set_id: int
community_id: int
create_time: datetime
update_time: datetime
# 包含社区集合名称和社区名称
set_name: Optional[str] = None
community_name: Optional[str] = None
address: Optional[str] = None
class Config:
from_attributes = True
# 创建社区集合映射
@router.post("/", response_model=CommunitySetMappingResponse)
async def create_community_set_mapping(
mapping: CommunitySetMappingCreate,
db: Session = Depends(get_db),
current_user: UserDB = Depends(get_admin_user)
):
"""创建社区集合映射"""
# 检查社区集合是否存在
community_set = db.query(CommunitySet).filter(CommunitySet.id == mapping.set_id).first()
if not community_set:
return error_response(code=404, message="社区集合不存在")
# 检查社区是否存在
community = db.query(CommunityDB).filter(CommunityDB.id == mapping.community_id).first()
if not community:
return error_response(code=404, message="社区不存在")
# 检查映射是否已存在
existing_mapping = db.query(CommunitySetMapping).filter(
CommunitySetMapping.set_id == mapping.set_id,
CommunitySetMapping.community_id == mapping.community_id
).first()
if existing_mapping:
return error_response(code=400, message="该映射关系已存在")
# 创建新映射
new_mapping = CommunitySetMapping(
set_id=mapping.set_id,
community_id=mapping.community_id
)
db.add(new_mapping)
db.commit()
db.refresh(new_mapping)
# 添加社区集合名称和社区名称
result = CommunitySetMappingResponse.model_validate(new_mapping)
result.set_name = community_set.set_name
result.community_name = community.name
return success_response(data=result)
# 获取社区集合的所有社区
@router.get("/set/{set_id}/communities", response_model=List[CommunitySetMappingResponse])
async def get_communities_by_set(
set_id: int = Path(..., ge=1),
db: Session = Depends(get_db),
current_user: UserDB = Depends(get_current_user),
skip: int = Query(0, ge=0),
limit: int = Query(100, ge=1, le=100)
):
"""获取社区集合的所有社区"""
# 检查社区集合是否存在
community_set = db.query(CommunitySet).filter(CommunitySet.id == set_id).first()
if not community_set:
return error_response(code=404, message="社区集合不存在")
# 获取映射
mappings = db.query(CommunitySetMapping).filter(
CommunitySetMapping.set_id == set_id
).offset(skip).limit(limit).all()
# 添加社区集合名称和社区名称
results = []
for mapping in mappings:
community = db.query(CommunityDB).filter(CommunityDB.id == mapping.community_id).first()
result = CommunitySetMappingResponse.model_validate(mapping)
result.set_name = community_set.set_name
result.community_name = community.name if community else None
result.address = community.address if community else None
results.append(result)
total = db.query(CommunitySetMapping).filter(
CommunitySetMapping.set_id == set_id
).count()
return success_response(data={"total": total, "items": results})
# 获取社区所属的所有集合
@router.get("/community/{community_id}/sets", response_model=List[CommunitySetMappingResponse])
async def get_sets_by_community(
community_id: int = Path(..., ge=1),
db: Session = Depends(get_db),
current_user: UserDB = Depends(get_current_user),
skip: int = Query(0, ge=0),
limit: int = Query(100, ge=1, le=100)
):
"""获取社区所属的所有集合"""
# 检查社区是否存在
community = db.query(CommunityDB).filter(CommunityDB.id == community_id).first()
if not community:
return error_response(code=404, message="社区不存在")
# 获取映射
mappings = db.query(CommunitySetMapping).filter(
CommunitySetMapping.community_id == community_id
).offset(skip).limit(limit).all()
# 添加社区集合名称和社区名称
results = []
for mapping in mappings:
community_set = db.query(CommunitySet).filter(CommunitySet.id == mapping.set_id).first()
result = CommunitySetMappingResponse.model_validate(mapping)
result.set_name = community_set.set_name if community_set else None
result.community_name = community.name
results.append(result)
return success_response(data=results)
# 删除社区集合映射
@router.delete("/{mapping_id}", response_model=dict)
async def delete_community_set_mapping(
mapping_id: int = Path(..., ge=1),
db: Session = Depends(get_db),
current_user: UserDB = Depends(get_admin_user)
):
"""删除社区集合映射"""
mapping = db.query(CommunitySetMapping).filter(CommunitySetMapping.id == mapping_id).first()
if not mapping:
return error_response(code=404, message="映射关系不存在")
db.delete(mapping)
db.commit()
return success_response(data={"message": "映射关系已删除"})

View File

@ -527,3 +527,23 @@ async def get_user_auth(
auth_info.id_number = masked_id_number auth_info.id_number = masked_id_number
return success_response(data=auth_info) return success_response(data=auth_info)
#通过手机号搜索用户
@router.get("/search_by_phone/{phone}", response_model=ResponseModel)
async def search_user_by_phone(
phone: str,
role: Optional[str] = None,
db: Session = Depends(get_db)
):
"""通过手机号搜索用户"""
user = db.query(UserDB).filter(UserDB.phone == phone).first()
if not user:
return error_response(code=404, message="用户不存在")
if role:
user.roles = list(set(user.roles)) # 去重
if role not in user.roles:
return error_response(code=404, message="该用户没有运营商权限")
return success_response(data=UserInfo.model_validate(user))

View File

@ -1,6 +1,6 @@
from fastapi import FastAPI from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware from fastapi.middleware.cors import CORSMiddleware
from app.api.endpoints import wechat,user, address, community, station, order, coupon, community_building, upload, merchant, merchant_product, merchant_order, point, config, merchant_category, log, account,merchant_pay_order, message, bank_card, withdraw, mp, point_product, point_product_order, coupon_activity, dashboard, wecom, feedback, timeperiod, community_timeperiod, order_additional_fee, ai from app.api.endpoints import wechat,user, address, community, station, order, coupon, community_building, upload, merchant, merchant_product, merchant_order, point, config, merchant_category, log, account,merchant_pay_order, message, bank_card, withdraw, mp, point_product, point_product_order, coupon_activity, dashboard, wecom, feedback, timeperiod, community_timeperiod, order_additional_fee, ai, community_set, community_set_mapping
from app.models.database import Base, engine from app.models.database import Base, engine
from fastapi.exceptions import RequestValidationError from fastapi.exceptions import RequestValidationError
from fastapi.responses import JSONResponse from fastapi.responses import JSONResponse
@ -59,6 +59,8 @@ app.include_router(account.router, prefix="/api/account", tags=["账户"])
app.include_router(address.router, prefix="/api/address", tags=["配送地址"]) app.include_router(address.router, prefix="/api/address", tags=["配送地址"])
app.include_router(community.router, prefix="/api/community", tags=["社区"]) app.include_router(community.router, prefix="/api/community", tags=["社区"])
app.include_router(community_building.router, prefix="/api/community/building", tags=["社区楼栋"]) app.include_router(community_building.router, prefix="/api/community/building", tags=["社区楼栋"])
app.include_router(community_set.router, prefix="/api/community-sets", tags=["社区集合"])
app.include_router(community_set_mapping.router, prefix="/api/community-set-mappings", tags=["社区集合映射"])
app.include_router(timeperiod.router, prefix="/api/time-periods", tags=["配送时段"]) app.include_router(timeperiod.router, prefix="/api/time-periods", tags=["配送时段"])
app.include_router(community_timeperiod.router, prefix="/api/community-time-periods", tags=["社区配送时段"]) app.include_router(community_timeperiod.router, prefix="/api/community-time-periods", tags=["社区配送时段"])
app.include_router(station.router, prefix="/api/station", tags=["驿站"]) app.include_router(station.router, prefix="/api/station", tags=["驿站"])

View File

@ -4,7 +4,9 @@ from sqlalchemy import Column, Integer, String, DECIMAL, DateTime, Enum
from sqlalchemy.sql import func from sqlalchemy.sql import func
from pydantic import BaseModel, Field from pydantic import BaseModel, Field
from .database import Base from .database import Base
from sqlalchemy.orm import relationship
from app.core.imageprocessor import process_image, ImageFormat from app.core.imageprocessor import process_image, ImageFormat
class CommunityStatus(str, enum.Enum): class CommunityStatus(str, enum.Enum):
UNOPEN = "UNOPEN" # 未运营 UNOPEN = "UNOPEN" # 未运营
OPENING = "OPENING" # 已运营 OPENING = "OPENING" # 已运营

View File

@ -0,0 +1,14 @@
from sqlalchemy import Column, Integer, String, ForeignKey, DateTime
from sqlalchemy.orm import relationship
from app.models.database import Base
import datetime
class CommunitySet(Base):
"""社区集合模型"""
__tablename__ = "community_sets"
id = Column(Integer, primary_key=True, index=True, autoincrement=True)
set_name = Column(String(100), nullable=False, comment="集合名称")
user_id = Column(Integer, ForeignKey("users.userid"), nullable=False, comment="创建用户ID")
create_time = Column(DateTime, default=datetime.datetime.now, comment="创建时间")
update_time = Column(DateTime, default=datetime.datetime.now, onupdate=datetime.datetime.now, comment="更新时间")

View File

@ -0,0 +1,14 @@
from sqlalchemy import Column, Integer, String, ForeignKey, DateTime
from sqlalchemy.orm import relationship
from app.models.database import Base
import datetime
class CommunitySetMapping(Base):
"""社区集合映射模型,用于保存社区集合和社区的一对多关系"""
__tablename__ = "community_set_mappings"
id = Column(Integer, primary_key=True, index=True, autoincrement=True)
set_id = Column(Integer, ForeignKey("community_sets.id"), nullable=False, comment="社区集合ID")
community_id = Column(Integer, ForeignKey("communities.id"), nullable=False, comment="社区ID")
create_time = Column(DateTime, default=datetime.datetime.now, comment="创建时间")
update_time = Column(DateTime, default=datetime.datetime.now, onupdate=datetime.datetime.now, comment="更新时间")

View File

@ -9,6 +9,8 @@ import enum
import random import random
import string import string
from app.core.imageprocessor import process_image, ImageFormat from app.core.imageprocessor import process_image, ImageFormat
from sqlalchemy.orm import relationship
class UserRole(str, enum.Enum): class UserRole(str, enum.Enum):
USER = "user" USER = "user"
DELIVERYMAN = "deliveryman" DELIVERYMAN = "deliveryman"