当前位置: 首页 > news >正文

订餐后台项目-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(自动更新)

设计特点

  1. 继承结构: 所有模型继承BaseModel,统一包含id和created_at字段

  2. 时间管理: 多个模型包含updated_at字段,自动记录最后更新时间

  3. 状态管理: 使用status字段和常量映射管理记录状态

  4. 关系映射: 使用外键和relationship建立表间关联

  5. 统计功能: 包含多层次统计表(全站、会员、食品)

使用建议

  1. 在查询状态时使用status_desc属性获取可读状态

  2. 注意外键关联的表间关系

  3. 利用自动时间戳功能追踪数据变化

  4. 统计表适合生成报表和分析数据趋势

这个数据库设计适合电商类食品销售平台,涵盖了用户管理、商品管理、日志记录和数据分析等核心功能。

最终代码

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='最后更新时间')
​

http://www.dtcms.com/a/357399.html

相关文章:

  • DAY16-新世纪DL(DeepLearning/深度学习)战士:Q(机器学习策略)1
  • Go语言入门(13)-map
  • 科学融智学引领人机协同教育新范式
  • 吴恩达机器学习作业七:方差与偏差
  • 【上位机数据转换】数据结构原理及大小端
  • 《WINDOWS 环境下32位汇编语言程序设计》第8章 通用对话框
  • ssh端口转发的几种常用使用方式【本地端口转发、远程端口转发、反向端口转发、动态端口转发】
  • Jenkins 全方位指南:安装、配置、部署与实战应用(含图解)
  • Two-Twer模型做歌曲智能推荐与规则算法对比的优缺点分析
  • 对比rerank模型和embedding模型
  • 订餐后台管理系统 - day04退出登录与账号管理模块
  • C#简单组态软件开发
  • AlexNet:点燃深度学习革命的「卷积神经网络之王」
  • 50etf期权与现货套利是什么意思?
  • position属性
  • Linux学习:线程控制
  • FastAPI 入门科普:下一代高性能 Python Web 框架
  • 一般纳税人
  • 上海市赛/磐石行动2025决赛awd web2-python 4个漏洞详解
  • 漫谈《数字图像处理》之浅析图割分割
  • Java IO 流-详解
  • @GitLab 介绍部署使用详细指南
  • [Godot] C#获取MenuButton节点索引
  • 回车换行、缓冲区刷新、倒计时小程序
  • Woody:开源Java应用性能诊断分析工具
  • 智慧工地源码
  • STM32 USBx Device MSC standalone 移植示例 LAT1488
  • sr04模块总结
  • YOLO v11 目标检测+关键点检测 实战记录
  • 面向企业级产品开发的自动化脚本实战