前言
✨ **博主介绍:**一线全栈工程师,毕设实战引路人。技术栈覆盖Java、Python、C#、PHP、Node.js及UniApp跨端开发,擅长多语言项目落地与架构设计。持续分享毕设源码、开题报告、技术选型心得与职场踩坑经验。用工程化思维写代码,帮你把毕设做成作品集。👍👍
👇精彩专栏 推荐订阅👇
✅获取源码请私信✅
感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以找我咨询,希望帮助更多的人❤️
系统实现
用户功能实现
美食信息推荐功能实现
用户登录后首页展示个性化美食推荐列表。系统依据用户历史浏览、点赞、收藏等行为筛选匹配内容,推荐区域随刷新动态更新。
美食信息推荐界面
美食信息功能实现
用户进入模块可浏览已审核美食列表,点击卡片查看详情。详情页支持点赞、收藏操作,评论区可发表观点,搜索框支持关键词查询。
美食信息界面
特色食材功能实现
用户浏览食材列表后点击查看详情,可在详情页执行点赞、收藏操作,评论区可发表评论,搜索框支持名称或产地查询。
特色食材界面
个人首页功能实现
用户点击发布美食填写表单提交,内容进入待审核状态。收藏记录模块展示已收藏内容,点赞记录模块展示点赞历史,评论管理模块可查看并删除本人评论。
个人首页界面
管理员功能实现
后台首页功能实现
首页提供快捷操作入口,可快速跳转至核心管理模块。中部展示美食分类统计饼图,反映平台内容分布情况。
后台首页界面
系统用户管理功能实现
模块支持按条件查询用户,重置清空查询条件。可添加新用户账号,删除现有用户,查看用户详细信息。
系统用户管理界面
美食分类管理功能实现
模块支持按名称查询分类,重置查询条件。可添加新分类,删除无关联内容的分类,查看分类详细信息。
美食分类管理界面
美食信息管理功能实现
模块支持多条件查询美食,重置查询条件。可添加新美食直接通过,删除违规内容,查看详情。待审核条目可执行通过或驳回操作,可查看并删除评论。
美食信息管理界面
特色食材管理功能实现
模块支持按条件查询食材,重置查询条件。可添加新食材直接显示,删除无效条目,查看详情。可查看并删除关联评论。
特色食材管理界面
数据库参考
sql
CREATE TABLE `upload` (
`upload_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '上传ID',
`name` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '文件名',
`path` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '访问路径',
`file` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '文件路径',
`display` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '显示顺序',
`father_id` int(11) DEFAULT '0' COMMENT '父级ID',
`dir` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '文件夹',
`type` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '文件类型',
PRIMARY KEY (`upload_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='文件上传';
insert into `upload` values ('1','movie.mp4','/upload/movie.mp4','',null,'0',null,'video');
DROP TABLE IF EXISTS `score`;
CREATE TABLE `score` (
`score_id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '评分ID',
`user_id` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '评分人',
`nickname` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '昵称',
`score_num` double(5,2) unsigned NOT NULL DEFAULT '0.00' COMMENT '评分',
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`source_table` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '来源表',
`source_field` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '来源字段',
`source_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '来源ID',
PRIMARY KEY (`score_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='评分';
insert into `score` values ('1','0',null,'5.0','2026-02-12 14:11:39','2026-02-12 14:11:39','article','article_id','6');
insert into `score` values ('2','0',null,'3.0','2026-02-12 14:11:39','2026-02-12 14:11:39','article','article_id','6');
insert into `score` values ('3','0',null,'3.5','2026-02-12 14:11:39','2026-02-12 14:11:39','news','news_id','1');
insert into `score` values ('4','0',null,'100.0','2026-02-12 14:11:39','2026-02-12 14:11:39','news','news_id','2');
DROP TABLE IF EXISTS `message_inform`;
CREATE TABLE `message_inform` (
`inform_id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '通知ID',
`user_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '通知人ID',
`title` varchar(255) DEFAULT NULL COMMENT '标题',
`state` varchar(255) DEFAULT NULL COMMENT '状态',
`type` varchar(64) DEFAULT NULL COMMENT '分类',
`content` varchar(255) DEFAULT NULL COMMENT '内容',
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`inform_id`) USING BTREE,
KEY `user_id` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='通知记录';
DROP TABLE IF EXISTS `user_group`;
CREATE TABLE `user_group` (
`group_id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT COMMENT '用户组ID',
`display` smallint(4) unsigned NOT NULL DEFAULT '100' COMMENT '显示顺序',
`name` varchar(16) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '名称',
`description` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '描述',
`source_table` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '来源表',
`source_field` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '来源字段',
`source_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '来源ID',
`register` smallint(1) unsigned DEFAULT '0' COMMENT '注册位置',
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`group_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='用户组';
DROP TABLE IF EXISTS `article`;
CREATE TABLE `article` (
`article_id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT COMMENT '文章id',
`title` varchar(125) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '标题',
`type` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '0' COMMENT '文章分类',
`hits` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '点击数',
`praise_len` int(11) NOT NULL DEFAULT '0' COMMENT '点赞数',
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`source` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '来源',
`url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '来源地址',
`tag` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '标签',
`content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '正文',
`img` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '封面图',
`description` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '文章描述',
PRIMARY KEY (`article_id`,`title`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='文章';
代码参考
java
package com.project.demo.controller;
import com.project.demo.entity.FoodClassNameification;
import com.project.demo.service.FoodClassNameificationService;
import com.alibaba.fastjson.JSON;
import com.project.demo.controller.base.BaseController;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import org.springframework.util.StringUtils;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import javax.persistence.Query;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
/**
* 美食分类:(FoodClassNameification)表控制层
*
*/
@RestController
@RequestMapping("/food_class_nameification")
public class FoodClassNameificationController extends BaseController<FoodClassNameification, FoodClassNameificationService> {
/**
* 美食分类对象
*/
@Autowired
public FoodClassNameificationController(FoodClassNameificationService service) {
setService(service);
}
@PostMapping("/add")
@Transactional
public Map<String, Object> add(HttpServletRequest request) throws IOException {
Map<String,Object> paramMap = service.readBody(request.getReader());
paramMap.entrySet().removeIf(entry -> {
Object value = entry.getValue();
return value instanceof String && ((String) value).isEmpty();
});
FoodClassNameification food_class_nameification = new FoodClassNameification();
food_class_nameification.setType_of_food(paramMap.get("type_of_food")==null?null:String.valueOf(paramMap.get("type_of_food")));
food_class_nameification.setCreate_by(paramMap.get("create_by")==null?null:Integer.valueOf(String.valueOf(paramMap.get("create_by"))));
this.addEntity(food_class_nameification);
System.out.println("美食分类新增成功");
return success(1);
}
@PostMapping("/set")
@Transactional
public Map<String, Object> set(HttpServletRequest request) throws IOException {
Map<String,String> queryMap = service.readQuery(request);
Map<String,String> configMap = service.readConfig(request);
Map<String,Object> paramMap = service.readBody(request.getReader());
paramMap.entrySet().removeIf(entry -> {
Object value = entry.getValue();
return value instanceof String && ((String) value).isEmpty();
});
FoodClassNameification food_class_nameification = new FoodClassNameification();
food_class_nameification.setType_of_food(paramMap.get("type_of_food")==null?null:String.valueOf(paramMap.get("type_of_food")));
this.setEntity(queryMap,configMap,food_class_nameification);
System.out.println("美食分类修改成功");
return success(1);
}
}
package com.project.demo.controller;
import com.project.demo.entity.SpecialtyIngredients;
import com.project.demo.service.SpecialtyIngredientsService;
import com.alibaba.fastjson.JSON;
import com.project.demo.controller.base.BaseController;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import org.springframework.util.StringUtils;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import javax.persistence.Query;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
/**
* 特色食材:(SpecialtyIngredients)表控制层
*
*/
@RestController
@RequestMapping("/specialty_ingredients")
public class SpecialtyIngredientsController extends BaseController<SpecialtyIngredients, SpecialtyIngredientsService> {
/**
* 特色食材对象
*/
@Autowired
public SpecialtyIngredientsController(SpecialtyIngredientsService service) {
setService(service);
}
@PostMapping("/add")
@Transactional
public Map<String, Object> add(HttpServletRequest request) throws IOException {
Map<String,Object> paramMap = service.readBody(request.getReader());
paramMap.entrySet().removeIf(entry -> {
Object value = entry.getValue();
return value instanceof String && ((String) value).isEmpty();
});
SpecialtyIngredients specialty_ingredients = new SpecialtyIngredients();
specialty_ingredients.setIngredient_name(paramMap.get("ingredient_name")==null?null:String.valueOf(paramMap.get("ingredient_name")));
specialty_ingredients.setOrigin_of_ingredients(paramMap.get("origin_of_ingredients")==null?null:String.valueOf(paramMap.get("origin_of_ingredients")));
specialty_ingredients.setCharacteristics_of_ingredients(paramMap.get("characteristics_of_ingredients")==null?null:String.valueOf(paramMap.get("characteristics_of_ingredients")));
specialty_ingredients.setSeasonal_ingredients(paramMap.get("seasonal_ingredients")==null?null:String.valueOf(paramMap.get("seasonal_ingredients")));
specialty_ingredients.setImage_of_ingredients(paramMap.get("image_of_ingredients")==null?null:String.valueOf(paramMap.get("image_of_ingredients")));
specialty_ingredients.setUse_of_ingredients(paramMap.get("use_of_ingredients")==null?null:String.valueOf(paramMap.get("use_of_ingredients")));
specialty_ingredients.setHits(paramMap.get("hits")==null?null:Integer.valueOf(String.valueOf(paramMap.get("hits"))));
specialty_ingredients.setPraise_len(paramMap.get("praise_len")==null?null:Integer.valueOf(String.valueOf(paramMap.get("praise_len"))));
specialty_ingredients.setCollect_len(paramMap.get("collect_len")==null?null:Integer.valueOf(String.valueOf(paramMap.get("collect_len"))));
specialty_ingredients.setComment_len(paramMap.get("comment_len")==null?null:Integer.valueOf(String.valueOf(paramMap.get("comment_len"))));
specialty_ingredients.setCreate_by(paramMap.get("create_by")==null?null:Integer.valueOf(String.valueOf(paramMap.get("create_by"))));
this.addEntity(specialty_ingredients);
System.out.println("特色食材新增成功");
return success(1);
}
@PostMapping("/set")
@Transactional
public Map<String, Object> set(HttpServletRequest request) throws IOException {
Map<String,String> queryMap = service.readQuery(request);
Map<String,String> configMap = service.readConfig(request);
Map<String,Object> paramMap = service.readBody(request.getReader());
paramMap.entrySet().removeIf(entry -> {
Object value = entry.getValue();
return value instanceof String && ((String) value).isEmpty();
});
SpecialtyIngredients specialty_ingredients = new SpecialtyIngredients();
specialty_ingredients.setIngredient_name(paramMap.get("ingredient_name")==null?null:String.valueOf(paramMap.get("ingredient_name")));
specialty_ingredients.setOrigin_of_ingredients(paramMap.get("origin_of_ingredients")==null?null:String.valueOf(paramMap.get("origin_of_ingredients")));
specialty_ingredients.setCharacteristics_of_ingredients(paramMap.get("characteristics_of_ingredients")==null?null:String.valueOf(paramMap.get("characteristics_of_ingredients")));
specialty_ingredients.setSeasonal_ingredients(paramMap.get("seasonal_ingredients")==null?null:String.valueOf(paramMap.get("seasonal_ingredients")));
specialty_ingredients.setImage_of_ingredients(paramMap.get("image_of_ingredients")==null?null:String.valueOf(paramMap.get("image_of_ingredients")));
specialty_ingredients.setUse_of_ingredients(paramMap.get("use_of_ingredients")==null?null:String.valueOf(paramMap.get("use_of_ingredients")));
specialty_ingredients.setHits(paramMap.get("hits")==null?null:Integer.valueOf(String.valueOf(paramMap.get("hits"))));
specialty_ingredients.setPraise_len(paramMap.get("praise_len")==null?null:Integer.valueOf(String.valueOf(paramMap.get("praise_len"))));
specialty_ingredients.setCollect_len(paramMap.get("collect_len")==null?null:Integer.valueOf(String.valueOf(paramMap.get("collect_len"))));
specialty_ingredients.setComment_len(paramMap.get("comment_len")==null?null:Integer.valueOf(String.valueOf(paramMap.get("comment_len"))));
this.setEntity(queryMap,configMap,specialty_ingredients);
System.out.println("特色食材修改成功");
return success(1);
}
}
**前端:**基于Vue.js框架构建用户界面,使用HTML5、CSS3和JavaScript实现页面结构与交互逻辑,通过Vue Router管理路由,Vuex或Pinia维护全局状态。采用Element UI或Vant组件库快速搭建界面,Axios封装HTTP请求实现与后端的数据通信。
后端: 基于springboot框架搭建,遵循Controller-Service-Mapper三层架构。Controller层接收前端请求并校验参数,Service层处理核心业务逻辑,Mapper层通过MyBatis或MyBatis-Plus完成数据库操作。使用Spring Security或Shiro结合JWT实现用户认证与权限控制。
数据库: 采用MySQL存储持久化数据,Redis缓存热点信息以提升系统性能。
开发工具: 使用IDEA开发后端,VSCode或HBuilderX开发前端,Git进行版本管理,Maven和npm分别管理前后端依赖。
源码获取
私信联系我即可~
大家点赞、收藏、关注、评论啦
👇精彩专栏 推荐订阅👇
✅获取源码请私信✅
感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以找我咨询,希望帮助更多的人❤️