订餐后台项目-day02数据库模型定义笔记
概述
这是一个使用Flask-SQLAlchemy定义的数据库模型,包含用户管理、食品管理、访问日志和统计功能等多个模块。
模型结构
1. 基类模型 (BaseModel)
抽象模型(不会创建实际表)
字段:
id
: 主键,自增整数created_at
: 记录创建时间,自动设置为当前时间
2. 用户表 (User)
表名: user
功能: 存储用户基本信息
字段:
基础信息: nickname, mobile, email, sex, avatar
登录凭证: login_name(唯一), login_pwd, login_salt
状态管理: status(1有效/0无效)
时间戳: created_at, updated_at(自动更新)
3. 访问日志表 (AccessLog)
表名: access_log
功能: 记录用户访问信息
字段:
用户关联: uid
访问信息: referer_url, target_url, query_params
设备信息: ua, ip
备注: note(JSON格式)
4. 错误日志表 (ErrorLog)
表名: error_log
功能: 记录系统错误信息
字段:
类似AccessLog,增加content字段存储详细错误内容
5. 食品表 (Food)
表名: food
功能: 存储食品信息
字段:
基本信息: name, price, main_image, summary
库存与状态: stock, status(1有效/0无效), tags
统计信息: month_count, total_count, view_count, comment_count
分类关联: cat_id(外键关联FoodCat)
时间戳: created_at, updated_at(自动更新)
6. 食品分类表 (FoodCat)
表名: food_cat
功能: 食品分类管理
字段:
分类信息: name, weight(权重)
状态: status(1有效/0无效)
时间戳: created_at, updated_at(自动更新)
特殊属性:
status_desc: 返回状态描述(通过constants.STATUS_MAPPING映射)
7. 食品销售记录表 (FoodSaleChangeLog)
表名: food_sale_change_log
功能: 记录食品销售情况
字段:
关联信息: food_id, member_id
销售数据: quantity, price
8. 库存变更表 (FoodStockChangeLog)
表名: food_stock_change_log
功能: 记录库存变化
字段:
关联信息: food_id
库存数据: unit(变更数量), total_stock(变更后总量)
备注: note
9. 文件记录表 (Files)
表名: files
功能: 记录上传的文件
字段:
file_key: 文件名称/标识
10. 全站日统计表 (StatDailySite)
表名: stat_daily_site
功能: 记录全站每日统计数据
字段:
日期: date
财务数据: total_pay_monet(应收总金额)
用户数据: total_member_count, total_new_member_count
业务数据: total_order_count, total_shared_count
时间戳: created_at, updated_at(自动更新)
11. 会员日统计表 (StatDailyMember)
表名: stat_daily_member
功能: 记录会员每日活动数据
字段:
关联信息: member_id, date
活动数据: total_pay_money, total_shared_count
时间戳: created_at, updated_at(自动更新)
12. 食品日统计表 (StatDailyFood)
表名: stat_daily_food
功能: 记录食品每日销售数据
字段:
关联信息: food_id, date
销售数据: total_count, total_pay_money
时间戳: created_at, updated_at(自动更新)
设计特点
继承结构: 所有模型继承BaseModel,统一包含id和created_at字段
时间管理: 多个模型包含updated_at字段,自动记录最后更新时间
状态管理: 使用status字段和常量映射管理记录状态
关系映射: 使用外键和relationship建立表间关联
统计功能: 包含多层次统计表(全站、会员、食品)
使用建议
在查询状态时使用
status_desc
属性获取可读状态注意外键关联的表间关系
利用自动时间戳功能追踪数据变化
统计表适合生成报表和分析数据趋势
这个数据库设计适合电商类食品销售平台,涵盖了用户管理、商品管理、日志记录和数据分析等核心功能。
最终代码
from application import db
from config import constants
from datetime import datetime
# 基类,用于添加id和创建时间的字段
class BaseModel(db.Model):__abstract__ = True# 创建数据库时不创建该模型
id = db.Column(db.Integer, primary_key=True, autoincrement=True, comment='表di')created_at = db.Column(db.DateTime, default=datetime.now, comment='创建时间')
class User(BaseModel):# 用户表__tablename__ = 'user'
nickname = db.Column(db.String(100), nullable=False, default='匿名', comment='昵称')mobile = db.Column(db.String(20), nullable=False, comment='手机号码')email = db.Column(db.String(100), nullable=False, comment='邮箱地址')sex = db.Column(db.SmallInteger, nullable=False, default=0, comment='1:男;2:女;0:未填写')avatar = db.Column(db.String(1024), comment='头像')login_name = db.Column(db.String(20), nullable=False, unique=True, comment='登录名')login_pwd = db.Column(db.String(128), nullable=False, comment='登陆密码')login_salt = db.Column(db.String(32), nullable=False, comment='登陆密码的随机加密密钥')status = db.Column(db.SmallInteger, nullable=False, default=1, comment='1:有效;0:无效')updated_at = db.Column(db.DateTime, default=datetime.now, onupdate=datetime.now, comment='最后操作时间')
class AccessLog(BaseModel):# 用户访问记录表__tablename__ = 'access_log'
uid = db.Column(db.Integer, nullable=False, default=0, comment='用户id')referer_url = db.Column(db.String(255), nullable=False, default='', comment='当前访问的refer')target_url = db.Column(db.String(255), nullable=False, default='', comment='访问的URL')query_params = db.Column(db.Text, nullable=False, default='', comment='请求参数')ua = db.Column(db.String(255), nullable=False, default='', comment='访问ua')ip = db.Column(db.String(32), nullable=False, default='', comment='访问IP')note = db.Column(db.String(1024), nullable=False, default='', comment='json格式备注字段')
class ErrorLog(BaseModel):# 错误日志表__tablename__ = 'error_log'
uid = db.Column(db.Integer, comment='用户id')referer_url = db.Column(db.String(255), nullable=False, default='', comment='当前访问的refer')target_url = db.Column(db.String(255), nullable=False, default='', comment='访问的URL')query_params = db.Column(db.Text, nullable=False, default='', comment='请求参数')ua = db.Column(db.String(255), nullable=False, default='', comment='访问ua')ip = db.Column(db.String(32), nullable=False, default='', comment='访问IP')content = db.Column(db.Text, nullable=False, default='', comment='日志内容')
class Food(BaseModel):# 食物表__tablename__ = 'food'
name = db.Column(db.String(100), nullable=False, comment='食物名称')price = db.Column(db.DECIMAL(10, 2), nullable=False, comment='售卖金额')main_image = db.Column(db.String(100), comment='主图')summary = db.Column(db.Text, nullable=False, comment='描述')stock = db.Column(db.Integer, nullable=False, comment='库存量')tags = db.Column(db.String(200), nullable=False, default='', comment='tag关键字,以”,“连接')status = db.Column(db.SmallInteger, nullable=False, default='1', comment='状态:1、有效,0、无效')month_count = db.Column(db.Integer, default='0', comment='月销售数量')total_count = db.Column(db.Integer, default='0', comment='总销售量')view_count = db.Column(db.Integer, default='0', comment='总浏览次数')comment_count = db.Column(db.Integer, default='0', comment='总评论量')updated_at = db.Column(db.DateTime, default=datetime.now, onupdate=datetime.now, comment='最后更新时间')cat_id = db.Column(db.Integer, db.ForeignKey('food_cat.id'), nullable=False)cat = db.relationship('FoodCat', backref='food')
class FoodCat(BaseModel):# 食物分类表__tablename__ = 'food_cat'
name = db.Column(db.String(100), nullable=False, comment='类别名称')weight = db.Column(db.SmallInteger, default=1, comment='权重')status = db.Column(db.SmallInteger, nullable=False, default='1', comment='状态:1、有效,0、无效')updated_at = db.Column(db.DateTime, default=datetime.now, onupdate=datetime.now, comment='最后更新时间')
@propertydef status_desc(self):return constants.STATUS_MAPPING[str(self.status)]
class FoodSaleChangeLog(BaseModel):# 食物销售情况表__tablename__ = 'food_sale_change_log'
food_id = db.Column(db.Integer, nullable=False, comment='商品ID')quantity = db.Column(db.Integer, default=0, comment='售卖数量')price = db.Column(db.DECIMAL(10, 2), nullable=False, comment='售卖金额')member_id = db.Column(db.Integer, nullable=False, comment='用户ID')
class FoodStockChangeLog(BaseModel):# 库存数据变更表__tablename__ = 'food_stock_change_log'
food_id = db.Column(db.Integer, nullable=False, comment='食物ID')unit = db.Column(db.Integer, default=0, comment='变更多少')total_stock = db.Column(db.Integer, nullable=False, comment='变更之后总量')note = db.Column(db.String(256), comment='备注字段')
class Files(BaseModel):# 文件上传记录表__tablename__ = 'files'
file_key = db.Column(db.String(128), nullable=False, comment='文件名称')
class StatDailySite(BaseModel):# 全站日统计数据表__tablename__ = 'stat_daily_site'
date = db.Column(db.DateTime, default=datetime.now, comment='日期')total_pay_monet = db.Column(db.DECIMAL(10, 2), comment='当日应收总金额')total_member_count = db.Column(db.Integer, default=0, comment='会员总数')total_new_member_count = db.Column(db.Integer,default=0,comment='当日新增会员数')total_order_count = db.Column(db.Integer,default=0, comment='当日订单数')total_shared_count = db.Column(db.Integer, default=0, comment='当日分享总数')updated_at = db.Column(db.DateTime, default=datetime.now, onupdate=datetime.now, comment='最后更新时间')
class StatDailyMember(BaseModel):# 会员日统计数据表__tablename__ = 'stat_daily_member'
date = db.Column(db.DateTime, default=datetime.now, comment='日期')member_id = db.Column(db.Integer, comment='会员ID')total_pay_money = db.Column(db.DECIMAL(10,2), comment='当日付款总金额')total_shared_count = db.Column(db.Integer, default=0, comment='当日分享总次数')updated_at = db.Column(db.DateTime, default=datetime.now, onupdate=datetime.now, comment='最后更新时间')
class StatDailyFood(BaseModel):# 菜品日统计数据表__tablename__ = 'stat_daily_food'
date = db.Column(db.DateTime, default=datetime.now, comment='日期')food_id = db.Column(db.Integer, comment='菜品ID')total_count = db.Column(db.Integer, default=0, comment='售卖总数量')total_pay_money = db.Column(db.DECIMAL(10,2), comment='总售卖金额')updated_at = db.Column(db.DateTime, default=datetime.now, onupdate=datetime.now, comment='最后更新时间')