Files
DjangoAdmin_FastAPI_EleVue/modules/member/service.py
T
ClaudeandClaude 64a5504396 feat(phase4): 全部业务模块迁移到 modules/(结构迁移)
- 21 个模块目录(auth/system/dictionary/configuration/cms/member/region/link/notice/job/log/upload/index)
- 每个模块 router.py(合并模块导出多个 router)/schemas.py/service.py/repository.py/models.py
- routers/v1.py 与 routers/__init__.py 改为直接引用 modules,前缀与权限串原样保留
- core/middleware.py 懒加载指向 modules.system.menu / modules.log;core/redis_client.py 指向 modules.job.scheduler
- apps/views|services|forms 全部改为 re-export 垫片
- 迁移后 grep 守门通过:modules/core 无 apps/extensions 残留引用
- 实测登录、27+ 模块接口、写操作 commit、操作日志落库均正常

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-07 10:13:30 +08:00

359 lines
12 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
from datetime import datetime, timezone
from fastapi.logger import logger
from sqlalchemy import and_
from shared.enums import GENDER_LIST, MEMBER_SOURCE_LIST
from shared.constants import PAGE_SIZE
from modules.member.schemas import MemberForm, MemberStatusForm
from modules.member.models import Member
from modules.member.models import MemberLevel
from core.database import get_db_session
from core import R
from core import password
from utils.rich_text import get_file_url, save_file
from utils.request import like_contains
from core.security import get_user_id
# 查询会员分页数据
def get_member_page(request):
db = get_db_session()
# 页码
page = int(request.query_params.get("pageNo", 1))
# 每页数
limit = int(request.query_params.get("pageSize", PAGE_SIZE))
# 实例化查询对象
query = db.query(Member).filter(Member.is_delete == 0)
# 会员账号
username = request.query_params.get('username')
if username:
query = query.filter(Member.username == username)
# 注册来源:1-网站注册 2-客户端注册 3-小程序注册 4-手机站注册 5-后台添加
source = request.query_params.get('source')
if source:
query = query.filter(Member.source == source)
# 性别
gender = request.query_params.get('gender')
if gender:
query = query.filter(Member.gender == gender)
# 会员状态
status = request.query_params.get('status')
if status:
query = query.filter(Member.status == status)
# 排序
query = query.order_by(Member.id.desc())
# 记录总数
count = query.count()
# 分页查询
member_list = query.limit(limit).offset((page - 1) * limit).all()
# 若当前页超出末页(数据被并发删除),自动回退到第一页
if page > 1 and not member_list:
page = 1
count = query.count()
member_list = query.limit(limit).offset(0).all()
# 实例化结果
result = []
# 遍历数据源
if len(member_list) > 0:
# 仅查询当前页用到的会员等级ID
level_ids = {item.member_level for item in member_list if item.member_level}
member_level_list = {}
if level_ids:
for ml in db.query(MemberLevel).filter(MemberLevel.id.in_(level_ids), MemberLevel.is_delete == 0).all():
member_level_list[ml.id] = ml.name
# 遍历会员数据源
for item in member_list:
# 对象转字典
data = item.to_dict()
# 性别
data['gender_name'] = GENDER_LIST.get(item.gender)
# 头像
data['avatar'] = get_file_url(item.avatar) if item.avatar else ""
# 会员等级描述
data['member_level_name'] = member_level_list.get(item.member_level) if member_level_list else ""
# 会员来源描述
data['source_name'] = MEMBER_SOURCE_LIST.get(item.source)
# 加入列表
result.append(data)
# 返回结果
return R.ok(data=result, count=count)
# 根据ID查看会员详情
def get_member_detail(member_id):
db = get_db_session()
# 根据ID查询会员
member = db.query(Member).filter(and_(Member.id == member_id, Member.is_delete == 0)).first()
# 查询结果判空
if not member:
return None
# 城市编码
cityList = []
# 省份编号
cityList.append(member.province_code)
# 城市编码
cityList.append(member.city_code)
# 县区编码
cityList.append(member.district_code)
# 对象转字典
data = member.to_dict()
# 头像
data['avatar'] = get_file_url(member.avatar) if member.avatar else ""
# 行政区划
data['city'] = cityList
# 返回结果
return data
# 添加会员
def add_member(request, data: MemberForm):
db = get_db_session()
# 唯一性校验
if db.query(Member).filter(and_(Member.username == data.username, Member.is_delete == 0)).first():
return R.failed("登录账号不能重复")
# 获取表单数据
form_data = data.model_dump(exclude={'id'})
# 图片处理
avatar = form_data.get('avatar')
if avatar:
form_data['avatar'] = save_file(avatar, "member")
# 密码加密
pwd = form_data.get('password')
if pwd:
salt = password.generate_salt()
form_data['password'] = password.encrypt_password(pwd, salt)
form_data['salt'] = salt
# 行政区划处理
citys = form_data.get('city')
# 从表单中移除行政区划
del form_data['city']
if citys and len(citys) == 3:
# 省份编码
form_data['province_code'] = citys[0]
# 城市编码
form_data['city_code'] = citys[1]
# 县区编码
form_data['district_code'] = citys[2]
# 表单数据赋值给对象
member = Member(**form_data)
member.create_user = get_user_id(request)
# 插入数据
member.save()
# 返回结果
return R.ok(msg="添加成功")
# 更新会员
def update_member(request, data: MemberForm):
db = get_db_session()
# 记录ID判空
if not data.id or data.id <= 0:
return R.failed("记录ID不能为空")
# 唯一性校验(排除自身)
if db.query(Member).filter(and_(Member.username == data.username, Member.id != data.id, Member.is_delete == 0)).first():
return R.failed("登录账号不能重复")
# 根据ID查询记录
user = db.query(Member).filter(and_(Member.id == data.id, Member.is_delete == 0)).first()
# 查询结果判空
if not user:
return R.failed("记录不存在")
# 获取表单数据(排除密码字段,避免None覆盖原值)
form_data = data.model_dump(exclude={'id', 'password'})
# 图片处理
avatar = form_data.get('avatar')
if avatar:
form_data['avatar'] = save_file(avatar, "member")
# 密码加密:仅传入新密码时才更新
pwd = data.password
if pwd:
salt = password.generate_salt()
form_data['password'] = password.encrypt_password(pwd, salt)
form_data['salt'] = salt
# 行政区划处理
citys = form_data.get('city')
# 从表单中移除行政区划
del form_data['city']
if citys and len(citys) == 3:
# 省份编码
form_data['province_code'] = citys[0]
# 城市编码
form_data['city_code'] = citys[1]
# 县区编码
form_data['district_code'] = citys[2]
form_data['update_user'] = get_user_id(request)
form_data['update_time'] = datetime.now(tz=timezone.utc)
# 更新数据
result = db.query(Member).filter_by(id=data.id).update(form_data)
# 提交数据
if not result:
return R.failed("更新失败")
# 返回结果
return R.ok(msg="更新成功")
# 删除会员
def delete_member(member_id):
return Member.batch_delete_r(member_id)
# 设置状态
def update_member_status(request, data: MemberStatusForm):
db = get_db_session()
# 根据ID查询记录
user = db.query(Member).filter(and_(Member.id == data.id, Member.is_delete == 0)).first()
# 查询结果判空
if not user:
return R.failed("记录不存在")
# 更新记录
result = db.query(Member).filter_by(id=data.id).update({
"status": data.status,
"update_user": get_user_id(request),
"update_time": datetime.now(tz=timezone.utc)
})
# 提交数据
if not result:
return R.failed("设置失败")
# 返回结果
return R.ok(msg="设置成功")
from datetime import datetime, timezone
from fastapi.logger import logger
from sqlalchemy import and_
from shared.constants import PAGE_SIZE
from modules.member.schemas import MemberLevelForm
from modules.member.models import MemberLevel
from core.database import get_db_session
from core import R
from core.security import get_user_id
from utils.request import like_contains
# 查询会员登记分页数据
def get_member_level_page(request):
db = get_db_session()
# 页码
page = int(request.query_params.get("pageNo", 1))
# 每页数
limit = int(request.query_params.get("pageSize", PAGE_SIZE))
# 实例化查询对象
query = db.query(MemberLevel).filter(MemberLevel.is_delete == 0)
# 会员等级名称
name = request.query_params.get('name')
if name:
query = query.filter(MemberLevel.name.like(like_contains(name), escape='\\'))
# 排序
query = query.order_by(MemberLevel.sort.asc())
# 记录总数
count = query.count()
# 分页查询
member_level_list = query.limit(limit).offset((page - 1) * limit).all()
# 若当前页超出末页(数据被并发删除),自动回退到第一页
if page > 1 and not member_level_list:
page = 1
count = query.count()
member_level_list = query.limit(limit).offset(0).all()
# 实例化结果
result = []
# 遍历数据源
if len(member_level_list) > 0:
for item in member_level_list:
# 对象转字典
data = item.to_dict()
# 加入列表
result.append(data)
# 返回结果
return R.ok(data=result, count=count)
# 根据会员等级ID查询详情
def get_member_level_detail(member_level_id):
db = get_db_session()
# 根据ID查询会员等级
member_level = db.query(MemberLevel).filter(
and_(MemberLevel.id == member_level_id, MemberLevel.is_delete == 0)).first()
# 查询结果判空
if not member_level:
return None
# 对象转字典
data = member_level.to_dict()
# 返回结果
return data
# 添加会员等级
def add_member_level(request, data: MemberLevelForm):
db = get_db_session()
# 唯一性校验
if db.query(MemberLevel).filter(and_(MemberLevel.name == data.name, MemberLevel.is_delete == 0)).first():
return R.failed("会员等级名称不能重复")
# 表单数据赋值给对象
member_level = MemberLevel(**data.model_dump(exclude={'id'}))
member_level.create_user = get_user_id(request)
# 插入数据
member_level.save()
# 返回结果
return R.ok(msg="添加成功")
# 更新会员等级
def update_member_level(request, data: MemberLevelForm):
db = get_db_session()
# 记录ID判空
if not data.id or data.id <= 0:
return R.failed("记录ID不能为空")
# 唯一性校验(排除自身)
if db.query(MemberLevel).filter(and_(MemberLevel.name == data.name, MemberLevel.id != data.id, MemberLevel.is_delete == 0)).first():
return R.failed("会员等级名称不能重复")
# 根据ID查询记录
member_level = db.query(MemberLevel).filter(and_(MemberLevel.id == data.id, MemberLevel.is_delete == 0)).first()
# 查询结果判空
if not member_level:
return R.failed("记录不存在")
# 构造更新数据(排除 id)
updData = data.model_dump(exclude={'id'})
updData['update_user'] = get_user_id(request)
updData['update_time'] = datetime.now(tz=timezone.utc)
result = db.query(MemberLevel).filter_by(id=data.id).update(updData)
# 提交数据
if not result:
return R.failed("更新失败")
# 返回结果
return R.ok(msg="更新成功")
# 删除会员等级
def delete_member_level(member_level_id):
return MemberLevel.batch_delete_r(member_level_id)
# 获取会员等级列表
def get_member_level_list():
db = get_db_session()
member_level_list = db.query(MemberLevel).filter(MemberLevel.is_delete == 0).order_by(MemberLevel.sort.asc()).all()
# 实例化对象
result = []
# 遍历数据源
for v in member_level_list:
# 对象转字典
item = v.to_dict()
# 加入列表
result.append(item)
# 返回结果
return result