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 | ✓ | 账户类型 | 管理员/负责人/顾客 |
| 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的强大功能,大大简化了数据访问层的开发工作。