基于SpringBoot+mybatisplus+vueJS的健康食材订购系统设计和实现 ,7000字论文
节能设备和系统的采购,往往基于审计后的需求和建议。 #生活常识# #环保节能技巧# #能源审计#
摘要本文设计并实现了一个基于 SpringBoot、MyBatis-Plus 和 VueJS 的健康食材订购系统,旨在为用户提供便捷、安全的健康食材购买平台。系统采用前后端分离架构,后端使用 SpringBoot 框架,结合 MyBatis-Plus 实现高效的数据访问,前端采用 VueJS 技术栈实现响应式用户界面。系统实现了用户管理、食材管理、订单管理、购物车、配送管理等核心功能,并通过 RESTful API 实现各模块间的交互。测试结果表明,该系统能够有效满足用户对健康食材的订购需求,提升用户体验。
1 引言 1.1 研究背景与意义随着人们生活水平的提高和健康意识的增强,对健康食材的需求日益增长。传统的食材购买方式存在以下问题:
信息不透明,难以了解食材的来源和质量购买渠道有限,选择范围小价格不透明,存在价格虚高现象配送不及时,影响食材新鲜度开发一套高效的健康食材订购系统具有重要的现实意义,能够提升用户购买体验、促进健康饮食普及、推动食材供应链的优化。
1.2 国内外研究现状目前,国内外针对食材订购系统的研究已经取得了一定进展:
国外:以 Amazon Fresh、Instacart 等为代表的大型电商平台提供了食材订购服务,但针对健康食材的专业化平台较少国内:涌现出了一批食材订购平台,如盒马鲜生、每日优鲜等,但在健康食材的筛选和推荐方面仍存在不足技术层面:SpringBoot、MyBatis-Plus、VueJS 等技术在 Web 开发中得到了广泛应用然而,现有的食材订购系统在健康食材的筛选、个性化推荐和配送服务方面仍存在不足。
1.3 研究内容与目标本文研究内容包括:
健康食材订购系统的需求分析与功能设计基于 SpringBoot+MyBatis-Plus 的后端架构设计与实现基于 VueJS 的前端界面开发与交互实现数据库设计与优化系统测试与性能评估研究目标是开发一个功能完善、操作简便、性能稳定的健康食材订购系统,满足用户对健康食材的订购需求。
2 相关技术与理论基础 2.1 SpringBoot 框架SpringBoot 是基于 Spring 的快速应用开发框架,具有以下特点:
自动配置,减少 XML 配置文件内嵌 Tomcat 等服务器,简化部署提供 Actuator 组件,便于监控系统运行状态支持各种数据库和缓存技术 2.2 MyBatis-PlusMyBatis-Plus 是 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生,具有以下特点:
无侵入:只做增强不做改变,引入它不会对现有工程产生影响损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper、Model、Service、Controller 层代码内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询分页插件支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库内置性能分析插件:可输出 SQL 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询内置全局拦截插件:提供全表 delete、update 操作智能分析阻断,也可自定义拦截规则 2.3 VueJS 框架VueJS 是一个轻量级的 JavaScript 框架,用于构建用户界面,具有以下特点:
响应式数据绑定组件化开发虚拟 DOM 技术,提升渲染性能丰富的生态系统和工具链 2.4 RESTful API 设计RESTful 是一种 API 设计风格,具有以下特点:
基于 HTTP 协议使用 URL 定位资源使用 HTTP 方法 (GET/POST/PUT/DELETE) 操作资源返回 JSON 格式数据 2.5 数据库技术本系统采用 MySQL 作为关系型数据库,具有以下优势:
开源免费,成本低支持事务处理高性能,适合中小型应用丰富的工具和社区支持 3 系统需求分析 3.1 功能需求 3.1.1 用户管理模块 用户注册与登录个人信息管理收货地址管理账户安全管理 3.1.2 食材管理模块 食材分类管理食材信息维护食材标签管理食材搜索与筛选 3.1.3 购物车模块 购物车添加与删除购物车商品数量修改购物车商品结算 3.1.4 订单管理模块 订单创建订单支付订单查询与跟踪订单评价 3.1.5 配送管理模块 配送信息管理配送时间设置配送状态跟踪 3.1.6 健康食谱推荐模块 食谱管理食材搭配推荐个性化推荐 3.1.7 系统管理模块 管理员账号管理系统参数配置数据统计分析日志管理 3.2 非功能需求 3.2.1 性能需求 系统响应时间不超过 3 秒支持至少 1000 个并发用户订单处理时间不超过 1 秒 3.2.2 安全需求 用户密码加密存储数据传输加密支付安全保障防止 SQL 注入和 XSS 攻击 3.2.3 可用性需求 系统 7×24 小时可用故障恢复时间不超过 30 分钟操作界面友好,易于使用 3.2.4 兼容性需求 兼容主流浏览器支持移动端访问 4 系统设计 4.1 总体架构设计系统采用前后端分离的三层架构:
用户表 (users)
sql
CREATE TABLE `users` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '用户ID',
`username` varchar(50) NOT NULL COMMENT '用户名',
`password` varchar(100) NOT NULL COMMENT '密码(加密存储)',
`nickname` varchar(50) DEFAULT NULL COMMENT '昵称',
`avatar` varchar(255) DEFAULT NULL COMMENT '头像URL',
`email` varchar(100) DEFAULT NULL COMMENT '邮箱',
`phone` varchar(20) DEFAULT NULL COMMENT '手机号',
`gender` tinyint(1) DEFAULT NULL COMMENT '性别(0:未知,1:男,2:女)',
`birthday` date DEFAULT NULL COMMENT '出生日期',
`health_status` varchar(255) DEFAULT NULL COMMENT '健康状况',
`dietary_habits` varchar(255) DEFAULT NULL COMMENT '饮食习惯',
`allergy_info` varchar(255) DEFAULT NULL COMMENT '过敏信息',
`role` varchar(20) NOT NULL DEFAULT 'user' COMMENT '角色(user/admin)',
`status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态(0:禁用,1:启用)',
`create_time` datetime NOT NULL COMMENT '创建时间',
`update_time` datetime NOT NULL COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `idx_username` (`username`),
UNIQUE KEY `idx_email` (`email`),
UNIQUE KEY `idx_phone` (`phone`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';
收货地址表 (user_addresses)
sql
CREATE TABLE `user_addresses` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '地址ID',
`user_id` bigint(20) NOT NULL COMMENT '用户ID',
`consignee` varchar(50) NOT NULL COMMENT '收货人姓名',
`phone` varchar(20) NOT NULL COMMENT '联系电话',
`province` varchar(50) NOT NULL COMMENT '省份',
`city` varchar(50) NOT NULL COMMENT '城市',
`district` varchar(50) NOT NULL COMMENT '区/县',
`address` varchar(255) NOT NULL COMMENT '详细地址',
`postal_code` varchar(10) DEFAULT NULL COMMENT '邮政编码',
`is_default` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否默认地址(0:否,1:是)',
`status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态(0:禁用,1:启用)',
`create_time` datetime NOT NULL COMMENT '创建时间',
`update_time` datetime NOT NULL COMMENT '更新时间',
PRIMARY KEY (`id`),
KEY `idx_user_id` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='收货地址表';
食材分类表 (food_categories)
sql
CREATE TABLE `food_categories` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '分类ID',
`name` varchar(50) NOT NULL COMMENT '分类名称',
`parent_id` bigint(20) DEFAULT NULL COMMENT '父分类ID',
`level` int(11) NOT NULL DEFAULT '1' COMMENT '分类级别',
`sort` int(11) NOT NULL DEFAULT '0' COMMENT '排序',
`icon` varchar(255) DEFAULT NULL COMMENT '分类图标',
`description` varchar(255) DEFAULT NULL COMMENT '分类描述',
`status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态(0:禁用,1:启用)',
`create_time` datetime NOT NULL COMMENT '创建时间',
`update_time` datetime NOT NULL COMMENT '更新时间',
PRIMARY KEY (`id`),
KEY `idx_parent_id` (`parent_id`),
UNIQUE KEY `idx_name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='食材分类表';
食材标签表 (food_tags)
sql
CREATE TABLE `food_tags` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '标签ID',
`name` varchar(50) NOT NULL COMMENT '标签名称',
`color` varchar(20) DEFAULT NULL COMMENT '标签颜色',
`description` varchar(255) DEFAULT NULL COMMENT '标签描述',
`status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态(0:禁用,1:启用)',
`create_time` datetime NOT NULL COMMENT '创建时间',
`update_time` datetime NOT NULL COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `idx_name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='食材标签表';
食材表 (foods)
sql
CREATE TABLE `foods` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '食材ID',
`name` varchar(100) NOT NULL COMMENT '食材名称',
`category_id` bigint(20) NOT NULL COMMENT '分类ID',
`price` decimal(10,2) NOT NULL COMMENT '价格',
`market_price` decimal(10,2) DEFAULT NULL COMMENT '市场价',
`stock` int(11) NOT NULL DEFAULT '0' COMMENT '库存',
`unit` varchar(20) NOT NULL COMMENT '单位',
`weight` decimal(10,2) DEFAULT NULL COMMENT '重量',
`origin` varchar(100) DEFAULT NULL COMMENT '产地',
`brand` varchar(100) DEFAULT NULL COMMENT '品牌',
`description` text COMMENT '描述',
`nutrition_info` text COMMENT '营养信息',
`storage_method` varchar(255) DEFAULT NULL COMMENT '储存方法',
`cooking_suggestions` text COMMENT '烹饪建议',
`is_recommend` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否推荐(0:否,1:是)',
`is_new` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否新品(0:否,1:是)',
`is_hot` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否热销(0:否,1:是)',
`status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态(0:下架,1:上架)',
`create_time` datetime NOT NULL COMMENT '创建时间',
`update_time` datetime NOT NULL COMMENT '更新时间',
PRIMARY KEY (`id`),
KEY `idx_category_id` (`category_id`),
KEY `idx_is_recommend` (`is_recommend`),
KEY `idx_is_new` (`is_new`),
KEY `idx_is_hot` (`is_hot`),
KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='食材表';
食材图片表 (food_images)
sql
CREATE TABLE `food_images` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '图片ID',
`food_id` bigint(20) NOT NULL COMMENT '食材ID',
`image_url` varchar(255) NOT NULL COMMENT '图片URL',
`sort` int(11) NOT NULL DEFAULT '0' COMMENT '排序',
`is_cover` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否封面(0:否,1:是)',
`create_time` datetime NOT NULL COMMENT '创建时间',
PRIMARY KEY (`id`),
KEY `idx_food_id` (`food_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='食材图片表';
食材 - 标签关联表 (food_tag_relations)
sql
CREATE TABLE `food_tag_relations` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '关联ID',
`food_id` bigint(20) NOT NULL COMMENT '食材ID',
`tag_id` bigint(20) NOT NULL COMMENT '标签ID',
`create_time` datetime NOT NULL COMMENT '创建时间',
PRIMARY KEY (`id`),
UNIQUE KEY `idx_food_tag` (`food_id`,`tag_id`),
KEY `idx_tag_id` (`tag_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='食材-标签关联表';
购物车表 (shopping_carts)
sql
CREATE TABLE `shopping_carts` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '购物车ID',
`user_id` bigint(20) NOT NULL COMMENT '用户ID',
`food_id` bigint(20) NOT NULL COMMENT '食材ID',
`quantity` int(11) NOT NULL DEFAULT '1' COMMENT '数量',
`selected` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否选中(0:否,1:是)',
`create_time` datetime NOT NULL COMMENT '创建时间',
`update_time` datetime NOT NULL COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `idx_user_food` (`user_id`,`food_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='购物车表';
订单表 (orders)
sql
CREATE TABLE `orders` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '订单ID',
`order_no` varchar(50) NOT NULL COMMENT '订单编号',
`user_id` bigint(20) NOT NULL COMMENT '用户ID',
`address_id` bigint(20) NOT NULL COMMENT '收货地址ID',
`payment_method` varchar(20) NOT NULL COMMENT '支付方式',
`payment_time` datetime DEFAULT NULL COMMENT '支付时间',
`total_amount` decimal(10,2) NOT NULL COMMENT '订单总金额',
`discount_amount` decimal(10,2) DEFAULT '0.00' COMMENT '优惠金额',
`shipping_fee` decimal(10,2) DEFAULT '0.00' COMMENT '运费',
`actual_amount` decimal(10,2) NOT NULL COMMENT '实际支付金额',
`order_status` varchar(20) NOT NULL COMMENT '订单状态',
`shipping_status` varchar(20) NOT NULL COMMENT '配送状态',
`payment_status` varchar(20) NOT NULL COMMENT '支付状态',
`remark` varchar(255) DEFAULT NULL COMMENT '订单备注',
`delivery_time` datetime DEFAULT NULL COMMENT '配送时间',
`delivery_man` varchar(50) DEFAULT NULL COMMENT '配送员',
`delivery_phone` varchar(20) DEFAULT NULL COMMENT '配送员电话',
`complete_time` datetime DEFAULT NULL COMMENT '完成时间',
`cancel_time` datetime DEFAULT NULL COMMENT '取消时间',
`cancel_reason` varchar(255) DEFAULT NULL COMMENT '取消原因',
`create_time` datetime NOT NULL COMMENT '创建时间',
`update_time` datetime NOT NULL COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `idx_order_no` (`order_no`),
KEY `idx_user_id` (`user_id`),
KEY `idx_order_status` (`order_status`),
KEY `idx_shipping_status` (`shipping_status`),
KEY `idx_payment_status` (`payment_status`),
KEY `idx_create_time` (`create_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单表';
订单明细表 (order_items)
sql
CREATE TABLE `order_items` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '订单明细ID',
`order_id` bigint(20) NOT NULL COMMENT '订单ID',
`food_id` bigint(20) NOT NULL COMMENT '食材ID',
`food_name` varchar(100) NOT NULL COMMENT '食材名称',
`food_image` varchar(255) DEFAULT NULL COMMENT '食材图片',
`price` decimal(10,2) NOT NULL COMMENT '单价',
`quantity` int(11) NOT NULL COMMENT '数量',
`amount` decimal(10,2) NOT NULL COMMENT '金额',
`create_time` datetime NOT NULL COMMENT '创建时间',
PRIMARY KEY (`id`),
KEY `idx_order_id` (`order_id`),
KEY `idx_food_id` (`food_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单明细表';
食谱表 (recipes)
sql
CREATE TABLE `recipes` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '食谱ID',
`title` varchar(100) NOT NULL COMMENT '食谱标题',
`description` text COMMENT '食谱描述',
`image` varchar(255) DEFAULT NULL COMMENT '食谱图片',
`cooking_time` int(11) DEFAULT NULL COMMENT '烹饪时间(分钟)',
`difficulty` varchar(20) DEFAULT NULL COMMENT '难度等级',
`calories` decimal(10,2) DEFAULT NULL COMMENT '卡路里',
`protein` decimal(10,2) DEFAULT NULL COMMENT '蛋白质(g)',
`fat` decimal(10,2) DEFAULT NULL COMMENT '脂肪(g)',
`carbohydrates` decimal(10,2) DEFAULT NULL COMMENT '碳水化合物(g)',
`steps` text COMMENT '烹饪步骤',
`tips` text COMMENT '烹饪小贴士',
`status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态(0:禁用,1:启用)',
`create_time` datetime NOT NULL COMMENT '创建时间',
`update_time` datetime NOT NULL COMMENT '更新时间',
PRIMARY KEY (`id`),
KEY `idx_status` (`status`),
KEY `idx_create_time` (`create_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='食谱表';
食谱食材关联表 (recipe_food_relations)
sql
CREATE TABLE `recipe_food_relations` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '关联ID',
`recipe_id` bigint(20) NOT NULL COMMENT '食谱ID',
`food_id` bigint(20) NOT NULL COMMENT '食材ID',
`quantity` varchar(50) DEFAULT NULL COMMENT '数量',
`unit` varchar(20) DEFAULT NULL COMMENT '单位',
`create_time` datetime NOT NULL COMMENT '创建时间',
PRIMARY KEY (`id`),
UNIQUE KEY `idx_recipe_food` (`recipe_id`,`food_id`),
KEY `idx_food_id` (`food_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='食谱食材关联表';
用户评价表 (product_reviews)
sql
CREATE TABLE `product_reviews` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '评价ID',
`user_id` bigint(20) NOT NULL COMMENT '用户ID',
`order_id` bigint(20) NOT NULL COMMENT '订单ID',
`food_id` bigint(20) NOT NULL COMMENT '食材ID',
`rating` tinyint(1) NOT NULL COMMENT '评分(1-5)',
`content` text COMMENT '评价内容',
`images` text COMMENT '评价图片',
`reply` text COMMENT '回复内容',
`reply_time` datetime DEFAULT NULL COMMENT '回复时间',
`status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态(0:禁用,1:启用)',
`create_time` datetime NOT NULL COMMENT '创建时间',
`update_time` datetime NOT NULL COMMENT '更新时间',
PRIMARY KEY (`id`),
KEY `idx_user_id` (`user_id`),
KEY `idx_order_id` (`order_id`),
KEY `idx_food_id` (`food_id`),
KEY `idx_status` (`status`),
KEY `idx_create_time` (`create_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户评价表';
4.3 系统架构图首页展示系统概览信息,包括推荐食材、热门分类、健康食谱等。
4.6.2 食材列表页面展示食材列表,支持按分类、标签、价格等条件筛选。
4.6.3 食材详情页面展示食材详细信息,包括名称、价格、图片、营养信息、烹饪建议等。
4.6.4 购物车页面展示用户购物车中的食材,支持修改数量、删除、结算等操作。
4.6.5 订单确认页面展示订单信息,包括收货地址、配送方式、支付方式等,支持提交订单。
4.6.6 订单列表页面展示用户订单列表,支持按状态筛选,支持查看订单详情。
4.6.7 食谱详情页面展示食谱详细信息,包括食材清单、烹饪步骤、营养信息等。
4.6.8 个人中心页面展示用户个人信息、收货地址、订单记录、收藏等内容。
5 系统实现 5.1 后端实现 5.1.1 项目结构plaintext
health-food-ordering-system/
├── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── healthfood/
│ │ │ ├── HealthFoodApplication.java
│ │ │ ├── config/ # 配置类
│ │ │ ├── controller/ # 控制器
│ │ │ ├── service/ # 服务层
│ │ │ ├── repository/ # 数据访问层
│ │ │ ├── model/ # 实体类
│ │ │ ├── dto/ # 数据传输对象
│ │ │ ├── exception/ # 异常处理
│ │ │ └── util/ # 工具类
│ │ └── resources/
│ │ ├── application.yml # 配置文件
│ │ ├── mapper/ # MyBatis映射文件
│ │ ├── static/ # 静态资源
│ │ └── templates/ # 模板文件
│ └── test/ # 测试代码
└── pom.xml # Maven配置文件
5.1.2 核心代码实现食材管理服务实现
java
@Service
@Transactional
public class FoodServiceImpl implements FoodService {
@Autowired
private FoodMapper foodMapper;
@Autowired
private FoodCategoryMapper categoryMapper;
@Autowired
private FoodImageMapper imageMapper;
@Autowired
private FoodTagRelationMapper tagRelationMapper;
@Override
public Page<FoodDTO> getFoods(FoodQueryDTO queryDTO, Pageable pageable) {
// 构建查询条件
QueryWrapper<Food> queryWrapper = new QueryWrapper<>();
if (queryDTO.getCategoryId() != null) {
queryWrapper.eq("category_id", queryDTO.getCategoryId());
}
if (queryDTO.getTagId() != null) {
// 关联查询带标签的食材
queryWrapper.inSql("id",
"SELECT food_id FROM food_tag_relations WHERE tag_id = " + queryDTO.getTagId());
}
if (queryDTO.getKeyword() != null && !queryDTO.getKeyword().isEmpty()) {
queryWrapper.like("name", queryDTO.getKeyword())
.or()
.like("description", queryDTO.getKeyword());
}
if (queryDTO.getMinPrice() != null) {
queryWrapper.ge("price", queryDTO.getMinPrice());
}
if (queryDTO.getMaxPrice() != null) {
queryWrapper.le("price", queryDTO.getMaxPrice());
}
if (queryDTO.getIsRecommend() != null) {
queryWrapper.eq("is_recommend", queryDTO.getIsRecommend());
}
if (queryDTO.getIsNew() != null) {
queryWrapper.eq("is_new", queryDTO.getIsNew());
}
if (queryDTO.getIsHot() != null) {
queryWrapper.eq("is_hot", queryDTO.getIsHot());
}
queryWrapper.eq("status", 1); // 只查询上架的食材
// 排序
if (queryDTO.getSortField() != null && !queryDTO.getSortField().isEmpty()) {
if ("price".equals(queryDTO.getSortField())) {
queryWrapper.orderBy(true, "asc".equals(queryDTO.getSortOrder()), "price");
} else if ("createTime".equals(queryDTO.getSortField())) {
queryWrapper.orderBy(true, "asc".equals(queryDTO.getSortOrder()), "create_time");
} else if ("sales".equals(queryDTO.getSortField())) {
// 按销量排序需要关联订单表,这里简化处理
queryWrapper.orderBy(true, "asc".equals(queryDTO.getSortOrder()), "id");
}
} else {
queryWrapper.orderByDesc("create_time");
}
// 分页查询
Page<Food> foodPage = foodMapper.selectPage(
new Page<>(pageable.getPageNumber(), pageable.getPageSize()),
queryWrapper
);
// 转换为DTO
return foodPage.convert(this::convertToDTO);
}
@Override
public FoodDTO getFoodById(Long id) {
Food food = foodMapper.selectById(id);
if (food == null || food.getStatus() == 0) {
throw new ResourceNotFoundException("食材不存在");
}
return convertToDTO(food);
}
@Override
public FoodDTO createFood(FoodCreateDTO foodDTO) {
// 验证分类是否存在
FoodCategory category = categoryMapper.selectById(foodDTO.getCategoryId());
if (category == null) {
throw new ResourceNotFoundException("分类不存在");
}
// 转换为实体类
Food food = convertToEntity(foodDTO);
food.setStatus(1); // 上架
food.setCreateTime(new Date());
food.setUpdateTime(new Date());
// 保存食材
foodMapper.insert(food);
// 保存图片
if (foodDTO.getImages() != null && !foodDTO.getImages().isEmpty()) {
List<FoodImage> images = foodDTO.getImages().stream()
.map(imageUrl -> {
FoodImage image = new FoodImage();
image.setFoodId(food.getId());
image.setImageUrl(imageUrl);
image.setCreateTime(new Date());
return image;
})
.collect(Collectors.toList());
// 设置封面
if (!images.isEmpty()) {
images.get(0).setIsCover(true);
}
imageMapper.insertBatch(images);
}
// 保存标签关联
if (foodDTO.getTagIds() != null && !foodDTO.getTagIds().isEmpty()) {
List<FoodTagRelation> relations = foodDTO.getTagIds().stream()
.map(tagId -> {
FoodTagRelation relation = new FoodTagRelation();
relation.setFoodId(food.getId());
relation.setTagId(tagId);
relation.setCreateTime(new Date());
return relation;
})
.collect(Collectors.toList());
tagRelationMapper.insertBatch(relations);
}
return convertToDTO(food);
}
@Override
public FoodDTO updateFood(Long id, FoodUpdateDTO foodDTO) {
Food food = foodMapper.selectById(id);
if (food == null) {
throw new ResourceNotFoundException("食材不存在");
}
// 验证分类是否存在
if (foodDTO.getCategoryId() != null) {
FoodCategory category = categoryMapper.selectById(foodDTO.getCategoryId());
if (category == null) {
throw new ResourceNotFoundException("分类不存在");
}
}
// 更新食材信息
BeanUtils.copyProperties(foodDTO, food);
food.setUpdateTime(new Date());
// 保存食材
foodMapper.updateById(food);
// 更新图片
if (foodDTO.getImages() != null) {
// 删除旧图片
QueryWrapper<FoodImage> imageQueryWrapper = new QueryWrapper<>();
imageQueryWrapper.eq("food_id", food.getId());
imageMapper.delete(imageQueryWrapper);
// 添加新图片
List<FoodImage> images = foodDTO.getImages().stream()
.map(imageUrl -> {
FoodImage image = new FoodImage();
image.setFoodId(food.getId());
image.setImageUrl(imageUrl);
image.setCreateTime(new Date());
return image;
})
.collect(Collectors.toList());
// 设置封面
if (!images.isEmpty()) {
images.get(0).setIsCover(true
博主介绍:硕士研究生,专注于信息化技术领域开发与管理,会使用java、标准c/c++等开发语言,以及毕业项目实战✌
从事基于java BS架构、CS架构、c/c++ 编程工作近16年,拥有近12年的管理工作经验,拥有较丰富的技术架构思想、较扎实的技术功底和资深的项目管理经验。
先后担任过技术总监、部门经理、项目经理、开发组长、java高级工程师及c++工程师等职位,在工业互联网、国家标识解析体系、物联网、分布式集群架构、大数据通道处理、接口开发、远程教育、办公OA、财务软件(工资、记账、决策、分析、报表统计等方面)、企业内部管理软件(ERP、CRM等)、arggis地图等信息化建设领域有较丰富的实战工作经验;拥有BS分布式架构集群、数据库负载集群架构、大数据存储集群架构,以及高并发分布式集群架构的设计、开发和部署实战经验;拥有大并发访问、大数据存储、即时消息等瓶颈解决方案和实战经验。
拥有产品研发和发明专利申请相关工作经验,完成发明专利构思、设计、编写、申请等工作,并获得发明专利1枚。
-----------------------------------------------------------------------------------
大家在毕设选题、项目升级、论文写作,就业毕业等相关问题都可以给我留言咨询,非常乐意帮助更多的人或加w 908925859。
相关博客地址:
csdn专业技术博客:https://blog.csdn.net/mr_lili_1986?type=blog
Iteye博客: https://www.iteye.com/blog/user/mr-lili-1986-163-com
门户:http://www.petsqi.cn
七、其他案例:
网址:基于SpringBoot+mybatisplus+vueJS的健康食材订购系统设计和实现 ,7000字论文 https://www.yuejiaxmz.com/news/view/1188586
相关内容
基于 SpringBoot+Vue 的健康饮食信息管理系统的设计与实现(需求文档)JAVA计算机毕业设计基于springboot的居家健身系统的设计与实现(附源码+springboot+开题+论文)
基于小程序的健康食谱推荐系统设计与实现(源码+文档+指导)
springboot+vue基于springboot的居家健身系统的设计与实现【开题+程序+论文】
基于Vue的在线购物系统的设计与实现(论文+源码)
基于springboot的C2C二手交易系统的设计与实现(源码+论文)
基于SpringBoot+Vue社区老人健康管理系统设计和实现(源码+LW+部署讲解)
JAVA计算机毕业设计基于SpringBoot的个人健康管理系统(附源码+springboot+开题+论文)
【附源码】springboot 轻院网购商城管理系统设计与实现
springboot岚柏健康管理系统的设计和实现源码毕设+论文