forked from qq1244/java-beta
16 KiB
16 KiB
餐厅管理系统实体类设计文档
项目概述
本项目是一个基于Spring Boot + MyBatis-Plus的餐厅管理系统,采用分层架构设计,支持多角色权限管理。系统主要面向三种用户角色:系统管理员(admin)、分店管理员(branch)和普通用户(user)。
技术栈
- 框架: Spring Boot
- ORM: MyBatis-Plus
- 注解工具: Lombok
- JSON序列化: Jackson
- 数据库: MySQL
实体类架构设计
1. 包结构设计
实体类按照业务角色进行模块化分包:
src/main/java/com/example/javatest/Entity/
├── admin/ # 系统管理员相关实体
├── branch/ # 分店管理员相关实体
└── user/ # 普通用户相关实体
2. 通用注解说明
所有实体类都使用了以下通用注解:
@Data
: Lombok注解,自动生成getter/setter/toString/equals/hashCode方法@NoArgsConstructor
: 生成无参构造函数@AllArgsConstructor
: 生成全参构造函数@Alias
: MyBatis别名,用于区分不同包下的同名实体@TableName
: 指定数据库表名@TableId
: 标识主键字段,使用AUTO自增策略@TableField
: 映射数据库字段@TableLogic
: 逻辑删除标识@JsonFormat
: JSON序列化时间格式化@FieldFill
: 字段自动填充策略
核心实体类详解
1. 账户实体类 (Account/Customer)
1.1 管理员账户 (Account.java
)
表名: account
别名: AdminAccount
字段名 | 数据类型 | 数据库字段 | 是否必填 | 说明 | 示例值 |
---|---|---|---|---|---|
accountId | Long | account_id | ✓ | 账户ID(主键,自增) | 1001 |
accountName | String | account_name | ✓ | 账户名称 | "张三" |
accountPassword | String | account_password | ✓ | 账户密码 | "******" |
accountPhone | String | account_phone | ○ | 手机号码 | "13888888888" |
accountType | String | account_type | ✓ | 账户类型 | admin/manager/customer |
accountImg | String | account_img | ○ | 头像图片URL | "https://example.com/avatar.jpg" |
accountGender | String | account_gender | ○ | 性别 | male/female |
accountTag | String | account_tag | ○ | 账户标签 | "VIP用户" |
salary | BigDecimal | salary | ○ | 薪资(员工用) | 5000.00 |
isDeleted | Integer | is_deleted | ✓ | 逻辑删除标识 | 0-未删除,1-已删除 |
deletedAt | LocalDateTime | deleted_at | ○ | 删除时间 | 2024-01-01 12:00:00 |
createdAt | LocalDateTime | created_at | ✓ | 创建时间(自动填充) | 2024-01-01 10:00:00 |
updatedAt | LocalDateTime | updated_at | ✓ | 更新时间(自动填充) | 2024-01-01 11:00:00 |
1.2 用户账户 (Customer.java
)
表名: account
别名: UserCustomer
用户账户实体与管理员账户实体结构完全相同,字段定义参考上表。区别在于使用不同的别名以区分业务上下文。
设计特点:
- 统一的账户表设计,通过
account_type
字段区分角色 - 支持员工薪资管理
- 完整的用户画像信息(头像、性别、标签)
2. 分店实体类 (Branch.java
)
表名: branch
别名: BranchBranch
字段名 | 数据类型 | 数据库字段 | 是否必填 | 说明 | 示例值 |
---|---|---|---|---|---|
branchId | Long | branch_id | ✓ | 分店ID(主键,自增) | 2001 |
branchName | String | branch_name | ✓ | 分店名称 | "北京朝阳店" |
branchAddress | String | branch_address | ✓ | 分店地址 | "北京市朝阳区三里屯路1号" |
branchPhone | String | branch_phone | ○ | 分店电话 | "010-12345678" |
branchStart | String | branch_start | ○ | 营业开始时间 | "09:00" |
branchEnd | String | branch_end | ○ | 营业结束时间 | "22:00" |
branchStatus | String | branch_status | ✓ | 营业状态 | open-营业中,closed-已停业 |
branchBoss | Long | branch_boss | ○ | 负责人ID(关联account表) | 1001 |
province | String | province | ○ | 所属省份 | "北京市" |
latitude | Double | latitude | ○ | 纬度 | 39.9042 |
longitude | Double | longitude | ○ | 经度 | 116.4074 |
isDeleted | Integer | is_deleted | ✓ | 逻辑删除标识 | 0-未删除,1-已删除 |
deletedAt | LocalDateTime | deleted_at | ○ | 删除时间 | 2024-01-01 12:00:00 |
createdAt | LocalDateTime | created_at | ✓ | 创建时间(自动填充) | 2024-01-01 10:00:00 |
updatedAt | LocalDateTime | updated_at | ✓ | 更新时间(自动填充) | 2024-01-01 11:00:00 |
设计特点:
- 支持地理位置信息(经纬度),便于地图功能
- 灵活的营业时间管理(HH:mm格式)
- 分店负责人关联设计
- 营业状态动态管理
3. 菜品实体类 (Dish.java
)
表名: dishes
别名: UserDish
字段名 | 数据类型 | 数据库字段 | 是否必填 | 说明 | 示例值 |
---|---|---|---|---|---|
dishId | Integer | dish_id | ✓ | 菜品ID(主键,自增) | 3001 |
dishName | String | dish_name | ✓ | 菜品名称 | "宫保鸡丁" |
category | String | category | ○ | 菜品分类 | "川菜" |
price | BigDecimal | price | ✓ | 菜品价格 | 28.00 |
stock | Integer | stock | ○ | 当前库存数量 | 50 |
status | String | status | ✓ | 菜品状态 | "在售"/"停售" |
description | String | description | ○ | 菜品描述 | "经典川菜,麻辣鲜香" |
imageUrl | String | image_url | ○ | 菜品图片URL | "https://example.com/dish.jpg" |
sales | Integer | sales | ○ | 累计销售数量 | 156 |
tag | String | tag | ○ | 菜品标签 | "招牌菜,辣" |
isDeleted | Integer | is_deleted | ✓ | 逻辑删除标识 | 0-未删除,1-已删除 |
deletedAt | LocalDateTime | deleted_at | ○ | 删除时间 | 2024-01-01 12:00:00 |
createdAt | LocalDateTime | created_at | ✓ | 创建时间(自动填充) | 2024-01-01 10:00:00 |
updatedAt | LocalDateTime | updated_at | ✓ | 更新时间(自动填充) | 2024-01-01 11:00:00 |
设计特点:
- 完整的商品信息管理(价格、库存、销量)
- 支持图片展示功能
- 灵活的分类和标签系统
- 状态管理(在售/停售)
4. 订单实体类 (Order.java
)
表名: order
(使用反引号处理MySQL保留字)
别名: UserOrder
字段名 | 数据类型 | 数据库字段 | 是否必填 | 说明 | 示例值 |
---|---|---|---|---|---|
orderId | Long | order_id | ✓ | 订单ID(主键,自增) | 4001 |
accountId | Long | account_id | ✓ | 下单用户ID(关联account表) | 1001 |
orderTime | LocalDateTime | order_time | ✓ | 下单时间 | 2024-01-01 14:30:00 |
branchId | Long | branch_id | ✓ | 分店ID(关联branch表) | 2001 |
orderMoney | BigDecimal | order_money | ✓ | 订单总金额 | 86.50 |
orderRemarks | String | order_remarks | ○ | 订单备注 | "少盐,不要香菜" |
orderStatus | Integer | order_status | ✓ | 订单状态 | 1-待处理,2-已完成,-1-已取消 |
isDeleted | Integer | is_deleted | ✓ | 逻辑删除标识 | 0-未删除,1-已删除 |
deletedAt | LocalDateTime | deleted_at | ○ | 删除时间 | 2024-01-01 12:00:00 |
createdAt | LocalDateTime | created_at | ✓ | 创建时间(自动填充) | 2024-01-01 10:00:00 |
updatedAt | LocalDateTime | updated_at | ✓ | 更新时间(自动填充) | 2024-01-01 11:00:00 |
设计特点:
- 关联用户和分店信息
- 完整的订单流程状态管理
- 支持订单备注功能
- 使用反引号处理MySQL保留字
order
5. 订单明细实体类 (OrderList.java
)
表名: order_list
别名: UserOrderList
字段名 | 数据类型 | 数据库字段 | 是否必填 | 说明 | 示例值 |
---|---|---|---|---|---|
orderListId | Long | order_list_id | ✓ | 订单明细ID(主键,自增) | 5001 |
orderId | Long | order_id | ✓ | 订单ID(关联order表) | 4001 |
dishId | Long | dish_id | ✓ | 菜品ID(关联dishes表) | 3001 |
number | Integer | number | ✓ | 菜品数量 | 2 |
createdAt | LocalDateTime | created_at | ✓ | 创建时间(自动填充) | 2024-01-01 10:00:00 |
updatedAt | LocalDateTime | updated_at | ✓ | 更新时间(自动填充) | 2024-01-01 11:00:00 |
设计特点:
- 订单与菜品的多对多关系处理
- 简洁的明细记录设计
- 支持同一订单多种菜品
- 仅包含核心业务字段,无逻辑删除功能
6. 评论实体类 (Comment.java
)
表名: comments
别名: UserComment
字段名 | 数据类型 | 数据库字段 | 是否必填 | 说明 | 示例值 |
---|---|---|---|---|---|
commentId | Long | comment_id | ✓ | 评论ID(主键,自增) | 6001 |
commentText | String | comment_text | ✓ | 评论内容 | "味道很不错,分量足够" |
commentDishId | Long | comment_dish_id | ✓ | 评论的菜品ID(关联dishes表) | 3001 |
commentAccountId | Long | comment_account_id | ✓ | 评论用户ID(关联account表) | 1001 |
commentRating | Integer | comment_rating | ○ | 评分 | 1-5分(5为最高分) |
parentCommentId | Long | parent_comment_id | ○ | 父评论ID(用于回复功能) | 6000 |
isDeleted | Integer | is_deleted | ✓ | 逻辑删除标识 | 0-未删除,1-已删除 |
deletedAt | LocalDateTime | deleted_at | ○ | 删除时间 | 2024-01-01 12:00:00 |
createdAt | LocalDateTime | created_at | ✓ | 创建时间(自动填充) | 2024-01-01 10:00:00 |
updatedAt | LocalDateTime | updated_at | ✓ | 更新时间(自动填充) | 2024-01-01 11:00:00 |
设计特点:
- 支持评分系统(1-5分)
- 嵌套评论功能(回复功能)
- 关联菜品和用户信息
- 支持评论内容的逻辑删除
通用字段设计
1. 逻辑删除机制
字段名 | 数据类型 | 数据库字段 | 注解 | 说明 | 可选值 |
---|---|---|---|---|---|
isDeleted | Integer | is_deleted | @TableLogic | 逻辑删除标识 | 0-未删除,1-已删除 |
deletedAt | LocalDateTime | deleted_at | @JsonFormat | 删除时间戳 | 2024-01-01 12:00:00 |
特点说明:
- 使用
@TableLogic
注解实现逻辑删除 - 删除操作不会物理删除数据,而是更新
is_deleted
字段 - 查询时自动过滤已删除数据
deletedAt
记录具体删除时间
2. 时间戳管理
字段名 | 数据类型 | 数据库字段 | 填充策略 | 说明 | 示例值 |
---|---|---|---|---|---|
createdAt | LocalDateTime | created_at | FieldFill.INSERT | 创建时间(插入时自动填充) | 2024-01-01 10:00:00 |
updatedAt | LocalDateTime | updated_at | FieldFill.INSERT_UPDATE | 更新时间(插入和更新时自动填充) | 2024-01-01 11:00:00 |
特点说明:
- 使用MyBatis-Plus自动填充功能
@JsonFormat
统一时间格式化为yyyy-MM-dd HH:mm:ss
- 创建时间仅在插入时填充,更新时间在插入和更新时都会填充
- 时间戳字段为审计功能提供基础支持
3. 主键设计
特性 | 说明 | 注解配置 | 示例 |
---|---|---|---|
主键类型 | 自增长整型 | @TableId(type = IdType.AUTO) | account_id, branch_id |
命名规范 | {表名}_id 格式 | @TableId(value = "table_id") | order_id, dish_id |
数据类型 | Long (大部分) / Integer (菜品) | private Long/Integer xxxId | 支持大数据量 |
数据库设计规范
1. 命名规范
- 表名: 使用复数形式或业务名称(如
dishes
、comments
、order_list
) - 字段名: 使用下划线命名法(如
account_name
、branch_address
) - 主键: 统一使用
{表名}_id
格式(如account_id
、branch_id
)
2. 数据类型选择
- 主键:
BIGINT AUTO_INCREMENT
- 金额:
DECIMAL
类型,保证精度 - 时间:
DATETIME
类型,支持毫秒级精度 - 状态字段:
VARCHAR
或INT
,根据业务需求选择 - 布尔值:
TINYINT
,0表示false,1表示true
3. 外键关系
主表 | 主键字段 | 从表 | 外键字段 | 关系类型 | 业务含义 |
---|---|---|---|---|---|
Account | account_id | Branch | branch_boss | 一对一 | 分店负责人 |
Account | account_id | Order | account_id | 一对多 | 用户订单 |
Branch | branch_id | Order | branch_id | 一对多 | 分店订单 |
Order | order_id | OrderList | order_id | 一对多 | 订单明细 |
Dish | dish_id | OrderList | dish_id | 一对多 | 菜品订购 |
Dish | dish_id | Comment | comment_dish_id | 一对多 | 菜品评论 |
Account | account_id | Comment | comment_account_id | 一对多 | 用户评论 |
Comment | comment_id | Comment | parent_comment_id | 一对多 | 评论回复 |
关系特点:
- 使用逻辑外键,不设置物理外键约束
- 通过应用层保证数据一致性
- 支持分布式数据库部署
- 便于数据迁移和维护
业务流程设计
1. 用户注册登录
- 用户通过
Customer
实体注册账户 - 系统根据
accountType
字段分配权限 - 支持多种账户类型:admin、manager、customer
2. 分店管理
- 系统管理员创建
Branch
记录 - 指定分店负责人(
branchBoss
字段) - 设置营业时间和地理位置信息
3. 菜品管理
- 分店管理员维护
Dish
信息 - 管理库存、价格、状态等
- 用户可以浏览菜品并查看评价
4. 订单流程
5. 评价系统
- 用户完成订单后可对菜品进行评价
- 通过
Comment
实体记录评价信息 - 支持评分和文字评价
- 支持评论回复功能
扩展性考虑
1. 多租户支持
当前设计通过分包实现了基础的多角色支持,未来可以考虑:
- 添加租户ID字段
- 实现数据隔离机制
2. 缓存策略
对于频繁查询的实体(如菜品信息),可以考虑:
- Redis缓存热点数据
- 实现缓存失效机制
3. 审计功能
当前的时间戳字段为审计功能提供了基础,可以进一步扩展:
- 操作人记录
- 操作类型记录
- 详细的变更历史
总结
本餐厅管理系统的实体类设计具有以下特点:
- 模块化设计: 按角色分包,职责清晰
- 统一规范: 使用一致的注解和命名规范
- 完整功能: 覆盖餐厅业务的核心流程
- 扩展性好: 预留了扩展字段和机制
- 数据安全: 实现逻辑删除和时间戳管理
这种设计既满足了当前的业务需求,又为未来的功能扩展提供了良好的基础。通过MyBatis-Plus的强大功能,大大简化了数据访问层的开发工作。