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