当前位置: 首页 > 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.xdnf.cn/news/1389349.html

相关文章:

  • 从0开始学习Java+AI知识点总结-28.Linux部署
  • Java 8核心特性详解:从Lambda到Stream的革命性升级
  • lesson49:HTML基础标签全解析:从入门到精通的网页构建指南
  • SQL Server 查看备份计划
  • Cursor不能读取.env文件解决办法(**/.env、**/env.*)
  • 华为认证全解析:价值详解、含金量解读(2025最新版)
  • 安全月报 | 傲盾DDoS攻击防御2025年8月简报
  • CRYPT32!CryptMsgUpdate函数分析之CRYPT32!PkiAsn1Decode函数的作用是得到pci
  • 达梦数据库-归档日志(一)
  • JavaScript 入门教程
  • 《Linux 网络编程六:数据存储与SQLite应用指南》
  • TF-IDF:文本分析的“火眼金睛”
  • PCIe 6.0 TLP路由机制:解密高效数据传输的核心架构
  • 【微知】如何撤销一个git的commit?以及撤销的3种方式?
  • 在本地获取下载chrome,然后离线搬运到 ECS
  • 最小生成树——Kruskal
  • go 使用rabbitMQ
  • 【谷歌浏览器】浏览器实用自用版——谷歌浏览器(Google Chrome)离线纯净版安装 官方版无任何捆绑及广告 【离线安装谷歌浏览器】
  • 通过 KafkaMQ 接入Skywalking 数据最佳实践
  • R ggplot2学习Nature子刊一张图,换数据即可用!
  • leetcode 338 比特位计数
  • 04数据库约束实战:从入门到精通
  • Linux下的网络编程SQLITE3详解
  • 算法题打卡力扣第1004. 最大连续1的个数 III(mid)
  • 技术速递|新手指南:如何在 Foundry Local 中使用自定义模型
  • 百度后端岗位--面试真题分析
  • CCS的诡异报错合集1(以C2000为例)
  • MAC spotlight 搜不到应用程序和 tags 生效
  • ZooKeeper 安装配置
  • C++基础(②VS2022创建项目)