马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
基于SpringBoot Vue膳食营养健康网站 前后端分离架构 完整源码+论文1w字 技术深度解析 SpringBoot | Vue.js | 前后端分离 | MySQL | 膳食营养 | 健康管理 | 在线商城 | 毕业设计 一、项目概览 这是一套完整的基于SpringBoot + Vue的膳食营养健康网站毕业设计项目,采用前后端分离架构,后端使用SpringBoot框架提供RESTful API接口,前端使用Vue.js构建单页应用。系统集膳食信息查询、食材管理、营养资讯、在线客服、食材商城、个人中心等功能于一体,是学习Java Web全栈开发和健康管理类网站设计的优质参考项目。
2 y: N& j9 U/ s$ l* o项目包含完整的前后端源码、数据库脚本、1万字以上的毕业论文,以及调试教程、开发文档、技术架构讲解和答疑服务。开发环境基于JDK 8 + Tomcat 8.5 + MySQL 5.7,使用IntelliJ IDEA作为开发工具,技术栈主流且成熟,适合作为计算机相关专业的课程设计和毕业设计参考。2 E t9 l5 i6 d: Q+ t1 d
表1-1 项目基本信息 项目 | 内容 | 项目名称 | 基于SpringBoot Vue膳食营养健康网站 | 项目编号 | 770 | 专业方向 | 计算机科学与技术 / 软件工程 / Web开发 | 架构模式 | 前后端分离(RESTful API) | 后端框架 | SpringBoot 2.x + MyBatis | 前端框架 | Vue.js + Element UI / Vue Router + Axios | 数据库 | MySQL 5.7+ | 开发工具 | IntelliJ IDEA + Navicat | 运行环境 | JDK 8 + Tomcat 8.5 + Node.js | 论文字数 | 约10000字以上 | 配套资料 | 源码 + 数据库脚本 + 论文 + 调试教程 + 开发文档 | 核心功能 | 膳食信息、食材管理、营养资讯、在线客服、购物商城、个人中心 | ( w! H2 i: q. {( U
图1-1 二、技术架构详解( ]3 |, S( |% Z- A
2.1 前后端分离架构 项目采用经典的前后端分离架构,后端SpringBoot应用负责业务逻辑处理和数据持久化,通过RESTful API向前端提供JSON格式数据;前端Vue.js应用负责页面渲染和用户交互,通过Axios发起HTTP请求调用后端接口。这种架构的优势是前后端职责清晰、可独立开发和部署、便于团队协作和后期维护。
" X# b- N% h" a/ F% h6 A% u【系统分层架构】
5 r% t( r. i$ N/ \* \# I0 E6 n▸ 前端表现层:Vue.js + Element UI,负责页面展示、表单验证、路由管理、状态管理% g" Q$ P6 M6 m$ T8 z- R
▸ 接口层:RESTful API,统一返回格式,支持跨域访问(CORS)
' e! b5 _, }% V▸ 控制层(Controller):接收请求,参数校验,调用Service,返回响应 X; G& X0 k1 x
▸ 业务逻辑层(Service):核心业务处理,事务管理,数据组装
3 P6 ]. b+ w; ]4 |▸ 数据访问层(Mapper/DAO):MyBatis映射,SQL执行,数据库交互
; J# P5 `- \! e( [+ X& y▸ 数据存储层:MySQL数据库,持久化存储业务数据
/ L8 G! ~" `- M) n
* A* _7 u/ ]3 G& K$ h2.2 核心技术栈2 b7 }; V# j0 z
表2-1 核心技术栈 技术领域 | 技术选型 | 说明 | 后端框架 | SpringBoot 2.x | 简化Spring配置,自动装配,内嵌Tomcat | 持久层框架 | MyBatis | 灵活的SQL映射,支持XML和注解两种方式 | 数据库连接池 | Druid / HikariCP | 高性能数据库连接池,监控SQL执行 | 前端框架 | Vue.js 2.x | 渐进式JavaScript框架,响应式数据绑定 | 前端UI库 | Element UI | 基于Vue的桌面端组件库,开箱即用 | 前端路由 | Vue Router | 单页应用路由管理,支持懒加载 | HTTP客户端 | Axios | 基于Promise的HTTP库,支持拦截器 | 状态管理 | Vuex(可选) | 全局状态管理,共享用户登录信息 | 构建工具 | Maven(后端)+ Webpack(前端) | 项目构建和依赖管理 | 数据库 | MySQL 5.7+ | 关系型数据库,存储业务数据 | ! y; D! i% Y3 I) ?2 a& W7 r
0 `8 b+ k* ~- W" o
2.3 项目目录结构 后端项目采用标准的Maven目录结构,按功能模块分层组织:
. d" ]8 R7 T2 z" b; X' ?0 I Inutrition-site/
5 e0 V4 h' r$ {5 m" B├── src/main/java/com/nutrition/) ~0 M4 E/ ?$ D' u) f. p' \& D
│ ├── NutritionApplication.java // 启动类 h* N3 \- X1 G# m( ]
│ ├── controller/ // 控制层
* g0 I' q( U* o) ` F│ │ ├── UserController.java // 用户管理接口) A3 `5 |% q, u5 B
│ │ ├── FoodController.java // 食材管理接口4 u( q2 F+ @9 c
│ │ ├── ArticleController.java // 资讯管理接口
: H+ x; f) l' B7 @5 |│ │ ├── OrderController.java // 订单管理接口" F% O1 Y5 W: c |6 y# ~' N5 U* s
│ │ └── ChatController.java // 在线客服接口0 U1 A6 W `5 @: q2 d
│ ├── service/ // 业务逻辑层
! S' R1 W( o! E+ o│ │ ├── UserService.java& A% Z3 o7 P$ t; Y+ C' t% L
│ │ ├── FoodService.java/ w: _1 `( ]4 Z! _4 f: s; v2 x
│ │ └── ...) `: B" U% m) g: |* [( i/ \- S. v9 X
│ ├── mapper/ // 数据访问层+ l: `2 p3 e$ i- ^. [
│ │ ├── UserMapper.java
( X. [6 o' P( [' m# ^0 \/ Z│ │ ├── FoodMapper.java
# [4 p9 p% S h│ │ └── ...
% `/ d5 l! D- q* C- m│ ├── entity/ // 实体类
1 M/ @) ?0 c& a) @! t5 o. S│ │ ├── User.java
7 T9 X: r Q% z' {! k# M0 H│ │ ├── Food.java+ q. k4 R' ?/ y8 e& b- e
│ │ └── ...
8 X! v' Z. z; c) Y* J9 M│ ├── dto/ // 数据传输对象
# ~! s3 V" q9 G/ S' E+ Q" x- B│ ├── config/ // 配置类(跨域、拦截器等)
) \# n! G- l; d6 W6 f# C8 G│ └── util/ // 工具类
% N: Z# d, w: N├── src/main/resources/1 @7 o9 C1 O9 X* P
│ ├── application.yml // 应用配置文件
# ^! `# [3 ~/ ?& l7 |│ └── mapper/ // MyBatis XML映射文件
( L- u) a4 T- i5 F└── pom.xml // Maven依赖配置
: b* b5 R6 W# A( z; c# G. H& Y6 z4 J三、功能模块详解
8 M' y$ }6 w& G6 i2 p3.1 前台用户功能 前台面向普通用户,提供膳食营养信息浏览、食材选购、资讯阅读、在线咨询等服务。主要功能模块如下:, Z7 n1 \8 c3 u: k* }* i- n$ ^
【前台功能模块】1 \- ^6 q1 X. a: u! r% H
▸ 首页:轮播图展示、热门食材推荐、营养资讯精选、关于我们介绍" {/ F# R- H! j# P8 `
▸ 膳食信息:膳食搭配方案展示、营养成分分析、适用人群说明7 U a0 b5 o) f0 ~; H
▸ 膳食食材:食材分类浏览、食材详情查看、食材搜索、加入购物车
0 B9 A4 X! h0 ]* R▸ 膳食资讯:营养健康文章列表、文章详情阅读、分类筛选、搜索
; K0 r* d# s. b! r$ g▸ 在线客服:实时在线咨询、常见问题解答、留言反馈; y# T# ?( k8 q& t
▸ 购物车:食材添加/删除、数量修改、金额计算、结算下单
6 e- C& g- U L2 k2 y) W▸ 个人中心:个人信息管理、订单管理、收藏管理、地址管理
4 l4 B$ b# n% _: _5 j& \: H; n% j$ N▸ 用户注册登录:账号注册、登录验证、密码找回、头像上传
& W9 t$ H! B* X- J
( n: A" ~$ W$ x4 Y# [3.2 后台管理功能( v' M! u) Y- M% `: v2 u- r
后台面向管理员,提供网站内容和用户的管理功能。主要包括:
- Z" o+ x% F1 Z4 X. x+ J【后台管理功能】
8 c$ m! G6 ~& a4 j+ w1 X1 s8 g3 f▸ 用户管理:用户列表查看、用户信息修改、用户状态管理、权限分配
7 g; H7 F$ H' |# a▸ 食材管理:食材增删改查、分类管理、库存管理、上下架操作+ J7 z: j% [% @: v7 O5 z) O; z
▸ 资讯管理:文章发布、编辑、删除、分类管理、置顶推荐
9 d& A1 a: B9 r/ {* j" d▸ 订单管理:订单列表查看、订单状态更新、发货处理、退款处理
+ d! A8 T$ [3 |8 v6 {, I* ?: T* N▸ 客服管理:客服消息查看、回复管理、常见问题维护$ C% S+ Q9 z+ R6 k, i
▸ 数据统计:用户注册统计、订单销售统计、食材热度统计& K( o' K$ w0 Q. O9 l; D
▸ 系统设置:轮播图管理、网站配置、管理员账号管理7 W6 B& _; A7 ^) v. R; s/ }: Q
5 i9 h1 P" B& P& k( I7 ^8 ~3 e
图3-1 $ x4 J# n1 F7 k1 L# U
3.3 在线客服模块 在线客服模块支持用户与管理员之间的实时消息沟通。可采用WebSocket实现全双工通信,或采用轮询方式简化实现。用户发送的消息实时推送给管理员,管理员回复后即时展示在用户端。同时支持常见问题自动回复,提高客服效率。0 J! d" r0 s8 L/ t
四、数据库设计: Q( Q8 n4 w# |
4.1 数据库概览 系统使用MySQL数据库,设计了用户表、食材表、食材分类表、资讯表、资讯分类表、订单表、订单明细表、购物车表、收藏表、地址表、客服消息表、管理员表等核心数据表。以下是几张核心表的结构设计:9 r& N8 W3 `0 s( d. b
4.2 核心数据表
6 K* n; F$ B7 t: z2 X(1)用户表(user)6 f0 ?* D# f/ n0 [8 {: y
CREATE TABLE `user` (
6 C( E8 ]3 ^) a; k; _. N3 E ]( j `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户ID',1 s+ C' j# Y1 r N5 w
`username` varchar(50) NOT NULL COMMENT '用户名',8 S$ @, f( D1 e$ n2 i
`password` varchar(100) NOT NULL COMMENT '密码(MD5加密)',
6 q4 P+ B! _; ?: p `nickname` varchar(50) DEFAULT NULL COMMENT '昵称',! k/ q5 @5 l0 O# e9 E9 e
`gender` varchar(10) DEFAULT NULL COMMENT '性别',
9 q1 f8 h8 Q) _; |" I `avatar` varchar(255) DEFAULT NULL COMMENT '头像URL',2 _3 Q* [9 |% O+ x& E4 c
`phone` varchar(20) DEFAULT NULL COMMENT '手机号',& S( S+ M( W0 d" j
`id_card` varchar(20) DEFAULT NULL COMMENT '身份证号',& d6 h3 {" {9 d0 T5 w- s8 I( t; U
`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '注册时间',% }" I4 l8 n* O% S3 Z. s
`status` int(1) DEFAULT 1 COMMENT '状态(1正常0禁用)',
]; s; U5 ^3 n( g0 ^ PRIMARY KEY (`id`),
% c: F* l/ D* Z' N UNIQUE KEY `username` (`username`)- m, d1 i& A+ I# N1 y S ~
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户表';
; {6 i/ \7 H6 K9 J: w9 \! s(2)食材表(food)4 V3 [' i+ ~/ A% ~
CREATE TABLE `food` (4 v* s+ ?% C: S1 Y' q* x q# _' [
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '食材ID', B& Y% p6 ~, e( ] R# a
`name` varchar(100) NOT NULL COMMENT '食材名称',& b: E0 [* b( |/ J6 T) g( O/ s1 ~
`category_id` int(11) DEFAULT NULL COMMENT '分类ID', d& d7 {& C; T t- v' V* V' J
`price` decimal(10,2) DEFAULT NULL COMMENT '价格',
" _! P: M0 a0 }3 X+ o8 G" J" ^ `stock` int(11) DEFAULT 0 COMMENT '库存',) \& Q& C3 J l2 ?0 Y. u
`image` varchar(255) DEFAULT NULL COMMENT '图片URL',
7 Z) ^* ]6 E# r `description` text COMMENT '食材描述',
; {( O/ I) k: | `nutrition` text COMMENT '营养成分说明',/ Z* G5 S0 D o3 m* _% C8 U
`calorie` int(11) DEFAULT NULL COMMENT '热量(千卡/100g)',
6 ^! a: [4 h3 [; {, I+ X `protein` decimal(5,2) DEFAULT NULL COMMENT '蛋白质(g/100g)',2 n: H3 p5 z- E- M$ F9 w! W4 I( ^" r
`fat` decimal(5,2) DEFAULT NULL COMMENT '脂肪(g/100g)',
6 g5 i( W5 A% Z: {+ }/ U `carbohydrate` decimal(5,2) DEFAULT NULL COMMENT '碳水化合物(g/100g)',
$ B2 t$ B1 |9 R' G8 w0 } `status` int(1) DEFAULT 1 COMMENT '状态(1上架0下架)',4 N# u% }6 i, k* h
`create_time` datetime DEFAULT CURRENT_TIMESTAMP,
, b6 F- t0 A2 T3 l) ~ PRIMARY KEY (`id`)
A! W; l! R! f# ? F% @) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='食材表';
' N3 Y) }& b( B4 r- J) S. E. r(3)订单表(orders)7 ]& e4 w3 m, d
CREATE TABLE `orders` (* l: D) S2 _' _2 Z/ W
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '订单ID',
3 J# X. o* k$ F: F5 C `order_no` varchar(32) NOT NULL COMMENT '订单编号',6 z2 G7 _: @1 \
`user_id` int(11) NOT NULL COMMENT '用户ID',
$ |* A6 \ i4 m `total_amount` decimal(10,2) NOT NULL COMMENT '订单总金额',
) n1 ^4 y! w/ s/ S+ ^ `status` int(1) DEFAULT 0 COMMENT '状态(0待付款1已付款2已发货3已完成4已取消)',
" U, M5 K$ m; {1 J: n `address` varchar(255) DEFAULT NULL COMMENT '收货地址',
, E* B$ D* d7 E. R9 Q! F2 o `receiver` varchar(50) DEFAULT NULL COMMENT '收货人',* A* {: T! t& Z7 G8 }1 c0 O6 W
`phone` varchar(20) DEFAULT NULL COMMENT '联系电话',% s# o% V, k+ d4 Y& m
`remark` varchar(255) DEFAULT NULL COMMENT '订单备注',
. S) n, |6 A/ Y# p# E& z; h" e8 m `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '下单时间',; f2 ` w8 H' Z7 n% f- w- w
`pay_time` datetime DEFAULT NULL COMMENT '付款时间',
* [, r" y7 C1 Y/ F0 d! |* H' d `delivery_time` datetime DEFAULT NULL COMMENT '发货时间',
0 z4 ^. H& n+ T PRIMARY KEY (`id`),
9 ]4 o: e& {5 [) l t2 b2 }1 s UNIQUE KEY `order_no` (`order_no`)" F* m4 @$ P; X5 |
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='订单表';
. a3 m& K% T g' q五、核心代码示例
5 F4 `6 _# T8 I' H+ W; y! S3 _; T' }5.1 后端统一返回结果封装 前后端分离项目中,统一的返回结果格式是良好实践。通过封装Result类,统一状态码、消息和数据,便于前端统一处理。
2 M6 N' u$ p/ i" J7 cpublic class Result<T> {! w, l; k! s; e+ K) k5 H
private int code; // 状态码:200成功,500失败
3 p- p* E$ Q; m private String message; // 提示消息1 {. r( ^' v4 h( z7 ~( Q
private T data; // 返回数据2 s6 F4 n0 |/ j' F
, P2 M6 @; C: w0 o, t4 k2 H public static <T> Result<T> success(T data) {
/ b4 v+ r6 l/ g# A3 Q2 X Result<T> result = new Result<>();1 _ L$ I- \ ?
result.setCode(200);
8 B" @' R3 `6 U. J4 `' E; K/ { result.setMessage("操作成功");( g) i/ u1 h6 ~' |6 @. Y3 b
result.setData(data);
, k# J2 e/ D# a+ S3 ? return result;
' H% p3 l ^: z9 u0 x. B }1 |6 C- `; K: g. \2 l! F( `* S9 Y
1 n' P/ n8 ?. J! n public static <T> Result<T> error(String message) {
- V3 y. r* f& I Result<T> result = new Result<>();( ~: Y5 b2 C8 t% B
result.setCode(500);
' x5 c1 y# W G! [ result.setMessage(message);
9 [: Q% `# J1 g- i return result; o' k( ]2 A2 ^, k& Y3 e) C/ `8 v
}
# C) R& ~: `5 c // getter/setter省略
' V! ?; e8 y7 u: Y8 p, `$ i}2 P! N+ n; N8 [5 ~
5.2 用户登录Controller' F* A3 n, A: Y* r
@RestController6 }" ^# `) I9 q
@RequestMapping("/api/user")
4 Z4 f7 }: @' ppublic class UserController {
) O* n6 {5 n( P m) f
/ y1 k$ l2 F( \- B @Autowired8 g4 _% `- J+ Z# U( l2 @" `
private UserService userService;+ p5 T* i2 X, }/ u2 p$ K
s5 ^/ c( j( p/ F1 A2 t9 o0 U
@PostMapping("/login")5 N2 A8 w# j0 v- G- I, J
public Result<Map<String, Object>> login(@RequestBody User loginUser) {3 A7 ]7 \1 S4 x
User user = userService.findByUsername(loginUser.getUsername());9 E. B- J# a4 ^% H
if (user == null) {4 D0 ^; L8 U# u: r
return Result.error("用户不存在");! i w' J- P2 R7 x8 b
}- r! d, a/ o6 \ S) Z7 j; k
// MD5密码校验4 j8 ]9 \8 {! q
String md5Password = DigestUtils.md5DigestAsHex($ c6 v- x( Z' c, ^ F
loginUser.getPassword().getBytes());
) T' q4 O2 Y7 i# Z) x if (!user.getPassword().equals(md5Password)) {
/ |! z( F, l2 v. w( H return Result.error("密码错误");: F8 s6 w# @; w, q+ u( M
}- M* o2 T% \8 ~* ?1 N4 c
if (user.getStatus() == 0) {
: W$ t7 A! j5 X' y% ~( L9 T: y return Result.error("账号已被禁用");, E* d# o0 y- _+ ^/ Y8 ^# _
}
) f0 U- Q, w, n. _( c# C9 h // 生成Token(简化版,实际可使用JWT)0 T# T O1 ?1 F% H
String token = UUID.randomUUID().toString().replace("-", "");9 z g$ e# J7 i% k; \9 d9 p9 `
Map<String, Object> data = new HashMap<>();# C$ F+ F# d+ x0 o+ Y* d
data.put("token", token);* v9 X8 v6 _8 P2 k; i1 ?
data.put("userId", user.getId());
; F5 K0 E: R7 k" J9 c5 s8 w data.put("username", user.getUsername());4 \. i, B! J" V2 O+ P) M
data.put("nickname", user.getNickname());! @7 a8 Z% J$ C! s$ d2 A3 |
data.put("avatar", user.getAvatar());
8 h f' r4 b2 p* E& a return Result.success(data);
: y+ a& Z( l! z8 t% Z }# m x Z0 h$ o9 `6 E( b3 J) \( j
7 X4 F$ P" n4 p( I
@PostMapping("/register")3 n, }+ w: s' w' x- E4 }& g# K
public Result<String> register(@RequestBody User user) {+ H! ^4 t0 _5 v9 X9 a8 f8 W
// 检查用户名是否已存在! T- O6 h7 y/ G
if (userService.findByUsername(user.getUsername()) != null) {
0 W! a) \% Z/ r" v5 J: k0 Q, J/ V return Result.error("用户名已存在"); {: s" u% e& m5 J+ z
}
/ g( `' u$ q( _* j! k1 h // 密码MD5加密) Q: n: N, H3 T0 J* }- x: u* |, @
user.setPassword(DigestUtils.md5DigestAsHex() v. h% M4 J2 X. K, K, u) h
user.getPassword().getBytes()));
* y. X* V5 J: o: G2 a5 m userService.save(user);) D& m6 T9 P x0 i1 k
return Result.success("注册成功");
& v" k" d" Q b* b8 v }
* d P, J. n: f% j- l8 O}
: @9 `; K- @/ g1 W" u0 e: D* P f- r5.3 前端Axios请求封装
8 r8 o( S% F7 w4 P5 w* f' c/ x// src/utils/request.js# [8 y; {' o5 C* @5 d+ c
import axios from 'axios'
+ j' I: Y9 F3 ]0 }7 N8 z- m. U8 T1 r+ I3 ]import { Message } from 'element-ui'
$ Y1 A( f$ ?/ Vimport router from '@/router'0 p+ q6 x; J! T4 [) |
& E W& A! i) E$ F// 创建axios实例
) N% e% b' Q9 z9 u8 Iconst service = axios.create({5 g" _3 l9 M4 H2 s" v
baseURL: 'http://localhost:8080/api',
9 X" G. U% w* l3 G8 m8 ]6 P timeout: 10000/ U' x$ G# R' ~* M M) T
})( I% _4 p! c' l0 k9 K% G) K8 m4 w( Y
' S( v+ b T: b0 U
// 请求拦截器:添加Token
. M" }6 i; B8 L7 F1 M# z7 ]service.interceptors.request.use(
, D8 Z* u+ k, h- { config => {
! L0 y7 U/ |6 U6 H# n$ s, E$ C const token = localStorage.getItem('token')( V' A) z$ W c, C* Q" G5 c
if (token) {
, f9 ^0 B3 ?% _+ h config.headers['Authorization'] = token
, W+ O/ D* C; W# r8 Y/ B0 T5 Z }6 `7 F, ?: e# K# M8 E* z! L. T
return config/ ]2 H5 C2 `" l! _9 d" q
},
( Z" U5 H# w I1 d) ]6 r S( G error => Promise.reject(error)
! e2 \5 Q: [4 _1 A |( N# X)
; _2 e2 t8 I+ V1 ^+ L+ A
, P0 q! i' S5 H- v// 响应拦截器:统一处理错误
" P- R9 G: e% C( l4 x( Sservice.interceptors.response.use(# h6 f Y, s2 R2 c& {: P9 r1 @# G8 E
response => { `0 T( m6 J# g2 c0 R
const res = response.data/ p- r V: l" N0 i5 T- }+ M
if (res.code !== 200) {8 Q# k4 m# M# P: O
Message.error(res.message || '请求失败')
" I7 L. V. t! g4 ^' t0 f% } O // 401未登录,跳转到登录页
+ A9 N A: u! v' N4 l% c if (res.code === 401) {
% h' Z* u. |; _, c% c9 n router.push('/login')
$ i; H& F4 B) y( ?# m( t }+ ~2 O8 [1 `9 a2 ?) [! C
return Promise.reject(new Error(res.message || 'Error'))
* |6 |. _3 M) K" E. f' N* | }/ l: b O: p; F
return res8 ?7 H; C6 Q' Y V5 A* t- l
},
0 D) L( m% z# X+ t% p error => {
% _5 ~" d3 c: Z, f; s3 i5 F4 l" ?1 b# ?3 j Message.error(error.message || '网络错误')% j6 k8 M8 O+ r% L b
return Promise.reject(error)6 s, ?# k' h7 i* D/ Z5 f% w
}
]- d, F( v; u)5 M( ]' g2 c n3 g
% a" a+ G9 B: a0 Y2 I
export default service
3 U- W4 Z5 H; o5.4 跨域配置(CORS)
! S+ H# g& X& z! Y前后端分离项目中,前端和后端运行在不同端口,需要配置跨域访问。SpringBoot中通过配置类实现CORS:
J* S9 X) p6 p3 ?% l@Configuration8 f2 G& K Z1 k7 r1 e- i: Y
public class CorsConfig implements WebMvcConfigurer {
3 [& A$ J1 J8 c" G+ l8 Y @Override
C+ O/ O; ]" x2 H9 o7 q/ F# ` public void addCorsMappings(CorsRegistry registry) { L( G/ }, @" W/ M' h5 K. j
registry.addMapping("/**"): W& Q5 L' c9 ?8 j `0 K; ^1 `5 {2 i
.allowedOriginPatterns("*")) _! B( V& Q0 T6 C- d% C6 O
.allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
- T& X* i5 ~9 X/ t7 k .allowedHeaders("*")* L: q, X1 r* m. K
.allowCredentials(true)" Q7 o# X) |$ e( ~" G! ^6 I4 v: u
.maxAge(3600);2 w* F* T9 H/ t9 l: k
}) d8 s' I* s+ {# H3 u7 I
}6 f3 D' v4 I5 |# J7 w
六、部署与运行
# x% M- J3 I1 F5 {6.1 开发环境配置
$ [ X; f: f3 Y4 W, M. n【环境要求】
, x8 y1 D! \! P- G6 W: w& n▸ JDK 1.8(Java开发工具包,配置JAVA_HOME环境变量)
K* j& m( e9 T8 S9 x▸ MySQL 5.7+(关系型数据库,设置root密码)
; F4 U. X& X; F" J, n! n. k▸ Node.js 12+(前端构建工具,自带npm包管理器)/ u& t5 e7 {* ~) }" T
▸ IntelliJ IDEA(后端开发IDE,社区版即可)
" h( V9 [' E: G0 k' l/ {/ @$ D5 ^▸ VS Code / WebStorm(前端开发IDE)! w' W6 \( F, J k/ F
▸ Navicat / DBeaver(数据库可视化管理工具)
1 f/ i8 C/ B* L( J▸ Maven 3.6+(后端项目构建工具,IDEA已内置)
# L% m0 B# |/ i+ P7 F
8 s5 F' t* H. p9 g, y* p6.2 后端部署步骤+ I2 @- f2 v. A# n- Z" X% ?* J7 W6 t
【后端启动步骤】' d3 q% p0 q4 A6 _$ Y, K5 x( o: N
▸ 第一步:创建MySQL数据库,执行项目提供的SQL脚本初始化表结构和测试数据 k+ R9 D: h8 ?+ j d: G% \
▸ 第二步:使用IDEA打开后端项目,等待Maven自动下载依赖
& q) ^) A! M. [# T, ?* u3 e▸ 第三步:修改application.yml配置文件,填入数据库连接地址、用户名和密码- ?1 O+ t i; L, z
▸ 第四步:找到启动类NutritionApplication.java,右键Run启动% h* [. F5 F1 |2 @/ |) Q
▸ 第五步:后端默认运行在8080端口,访问 http://localhost:8080/api 验证4 y! E. n" K5 N- L/ E; e
$ J0 H9 v: y+ [: Y2 z6.3 前端部署步骤
3 C- ]/ T+ R. l4 n- q" i1 u0 G. b【前端启动步骤】. c* `9 t% Q2 h: s" v* c( \- s
▸ 第一步:使用VS Code打开前端项目目录
0 D3 Z& P' T7 K% {1 G▸ 第二步:打开终端,执行 npm install 安装项目依赖(首次运行需要)
) q% W1 k( F7 Z* f. Y5 ~9 \▸ 第三步:修改src/utils/request.js中的baseURL为后端实际地址
( N. Y2 o5 U/ C$ J- m▸ 第四步:执行 npm run dev 启动开发服务器(默认端口8081或9528)) J1 }4 C9 p7 J! B4 Q! k; S" Y
▸ 第五步:浏览器访问 http://localhost:8081 即可打开网站前台" F( x: }8 X o
▸ 第六步:执行 npm run build 打包生产环境,生成dist目录部署到Nginx
2 U) {0 ?# u4 K" I( { 图6-1 七、适用场景与学习建议( D+ \/ S" h! T" h% P# y5 \
7.1 适用人群 表7-1 适用人群及学习价值 人群类型 | 适用场景 | 学习价值 | 计算机/软件专业学生 | 课程设计、毕业设计、课程作业 | 学习SpringBoot+Vue全栈开发完整流程 | Java后端开发者 | 前后端分离学习、项目实战 | 掌握RESTful API设计、MyBatis、SpringBoot | 前端开发者 | Vue.js项目实战、全栈入门 | 学习Vue组件化开发、Axios封装、Element UI | 全栈开发初学者 | 全栈项目入门、技术栈学习 | 理解前后端分离架构,掌握完整开发流程 | 毕业设计指导教师 | 教学参考、项目库 | 作为Web方向毕业设计的参考案例和评分标准 |
0 r P: D; }# E
7 a1 w! a/ g, C8 Y7.2 学习路径建议
$ W! P* z/ q" x7 ]2 z! N( F( a【入门级(运行与修改)】- q! J' j5 Y6 B; Q4 F d
▸ 搭建开发环境,按照部署步骤成功运行项目
7 [: _$ p+ _& y! M( w▸ 熟悉项目目录结构,理解前后端分离的工作原理- q! d9 ~6 L- G; P) u7 j4 H
▸ 修改前端页面文字、颜色、图片,定制界面外观8 e, a! A7 H, e' u4 p
▸ 学习MySQL基本操作,修改数据库中的测试数据
9 X! o; t& E1 D9 W( ~▸ 学习目标:能独立运行项目,进行简单的界面和数据修改5 i0 M! ^5 J; d$ ?) L
- n6 M9 L$ B& w! c2 _/ j
【进阶级(功能开发)】
6 D0 i0 [6 m9 a# @/ y▸ 学习SpringBoot核心注解:@RestController、@Service、@Autowired- O; T/ x; S" I+ e7 [, m/ O9 d
▸ 学习MyBatis的XML映射和注解方式,编写SQL查询8 ]; y4 q0 j4 G! @( P# `* a
▸ 学习Vue组件化开发,掌握props、emit、生命周期钩子
6 V8 q9 G, B+ i" c- t▸ 学习Axios请求封装和前后端联调,实现新功能接口3 J Y6 T2 R d3 k8 O, A
▸ 学习目标:理解核心代码,能独立开发简单的增删改查功能* y) |/ C0 ?+ E! e4 k
) x" G+ z3 t" b1 T t【高级级(架构优化)】
" f/ o' x) s! N% [- k' l▸ 引入JWT实现无状态登录认证,替代简单Token
1 ~9 n2 `& C- ]3 V6 N▸ 引入Redis缓存热门数据,提升系统性能, D9 K+ b' y0 `1 B$ J# J: E# |$ y
▸ 引入Spring Security实现权限控制和接口鉴权. @3 Q/ |+ u: H! K0 C/ V) g( g, o
▸ 引入Elasticsearch实现全文搜索,提升搜索体验6 D4 b- t9 z$ u! [. W! X
▸ 学习Docker容器化部署,实现一键部署和扩容
: F4 B0 }, s* F% L! @0 Z1 }▸ 学习目标:掌握企业级技术栈,能独立设计和开发完整Web系统/ T7 u, y. w. z% `; Q
八、常见问题 FAQ
2 h$ i8 P1 n4 UQ1:前后端分离项目如何解决跨域问题? 跨域是前后端分离项目最常见的问题。解决方案主要有三种:一是后端配置CORS(跨域资源共享),通过@CrossOrigin注解或全局配置类允许指定域名访问,这是最简单的方式,本项目即采用此方案;二是前端配置代理(Proxy),在vue.config.js中配置devServer.proxy,将API请求代理到后端地址,仅适用于开发环境;三是使用Nginx反向代理,生产环境将前端和后端部署在同一域名下,通过路径区分,从根本上避免跨域。建议开发环境用代理,生产环境用Nginx。' b. x& s1 L) M3 @, d: F
Q2:SpringBoot项目启动失败,提示数据库连接错误怎么办?
" A& c& T$ X: w数据库连接错误是最常见的启动失败原因。排查步骤:一是确认MySQL服务是否启动,Windows在服务中查看MySQL服务状态;二是确认数据库是否已创建,SQL脚本是否已执行;三是检查application.yml中的数据库连接地址、端口、用户名、密码是否正确;四是确认MySQL版本与驱动版本是否兼容,MySQL 8.0需要使用com.mysql.cj.jdbc.Driver驱动并设置时区;五是检查防火墙是否拦截了3306端口。建议先使用Navicat测试数据库连接,确认能正常连接后再启动项目。
2 s7 ]( d, E" F6 {) M+ l- V5 A oQ3:前端npm install安装依赖很慢或失败怎么办?7 F9 I" e4 N0 {% L/ p' c0 a
npm安装慢通常是因为默认的npm源在国外,网络访问不稳定。解决方法:一是切换为淘宝镜像源,执行 npm config set registry https://registry.npmmirror.com;二是使用cnpm替代npm,先执行 npm install -g cnpm --registry=https://registry.npmmirror.com,然后用cnpm install安装;三是使用yarn包管理器,速度比npm快且有缓存。如果安装过程中某个包失败,可以尝试删除node_modules目录和package-lock.json后重新安装,或使用npm cache clean --force清理缓存。
% `3 j/ u5 O% H1 ~6 QQ4:这个项目可以直接用于毕业设计吗?, x& v, i5 y8 b
本项目包含完整的前后端源码、数据库脚本和1万字以上的论文,功能完整,架构清晰,可以作为毕业设计的参考基础。但建议在使用时进行一定的修改和扩展,避免与他人重复。可以从以下几个方面进行改进:一是增加营养评估功能,根据用户身高体重计算BMI并推荐膳食;二是增加膳食记录功能,用户记录每日饮食并统计营养摄入;三是优化UI界面,采用更现代的设计风格;四是引入推荐算法,根据用户偏好推荐食材和资讯;五是增加移动端适配,开发微信小程序版本。
* b! m, q$ f: k( b' ~9 ~0 D" I! ?4 YQ5:学习SpringBoot + Vue全栈开发需要掌握哪些知识?
- Y2 [: J* H) v' h8 k全栈开发需要同时掌握后端和前端技术。后端方面:Java基础、SpringBoot核心注解和自动配置、MyBatis持久层框架、MySQL数据库和SQL编写、RESTful API设计、Maven项目管理。前端方面:HTML/CSS/JavaScript基础、Vue.js核心概念(数据绑定、组件、路由、状态管理)、Element UI组件库使用、Axios网络请求、Webpack构建工具。此外还需要了解前后端分离架构、跨域处理、用户认证(JWT/Session)、接口联调、项目部署等工程化知识。建议先学后端基础,再学前端基础,最后通过完整项目练习掌握全栈开发。' l6 i$ {% p6 @ M+ I s
资料获取 以上为基于SpringBoot Vue膳食营养健康网站的资料整理与技术解析。项目采用主流的前后端分离架构,功能完整,代码规范,涵盖了Java Web全栈开发的核心技术点,是学习SpringBoot和Vue.js开发的优质参考项目。无论是用于课程设计、毕业设计,还是作为全栈开发学习的实战项目,都能提供很好的技术参考。
; }( c0 m, o$ _【完整资料包含】8 ~8 ~1 x/ W2 \$ w
▸ ☕ SpringBoot后端完整源码(Controller/Service/Mapper/Entity全分层)
$ L, ? D5 @. u: K" n a: t, f▸ 💚 Vue.js前端完整源码(组件/路由/请求封装/状态管理)' n! z& z1 w) h' ~( a: b! L! ^$ v, I
▸ 💾 MySQL数据库脚本(建表语句+测试数据)) \( [' `7 t v+ H8 S- a% ^5 ^
▸ 📝 毕业论文(约10000字以上,含需求分析、设计、实现、测试)
q4 I" t3 y% [1 I) {▸ 🎬 调试运行教程视频(环境配置+项目部署+功能演示)
6 p4 f* R( B4 ]9 v8 j3 I) r▸ 📋 开发文档和技术架构讲解
8 \6 F- O! j4 H' `▸ 🛠️ 技术栈:SpringBoot + MyBatis + Vue.js + Element UI + MySQL: \9 O& |( |! ~# `
▸ 🎯 核心功能:膳食信息、食材商城、营养资讯、在线客服、个人中心
& I% V( D* n: F6 v4 n! n
% F* W, Q5 V* J( N3 j. V . F. S7 \2 q# I; m! f
📦 获取完整项目源码和论文资料,立即下载 SpringBoot+Vue前后端分离 | 完整源码 | 1w字论文 | 调试教程 | 可运行可修改 & w |# R* j N* e# F
|