基于SpringBoot及PostgreSQL的国家减肥食谱管理项目(上):区域与省份安装搭建

news/2025/9/26 12:00:14/文章来源:https://www.cnblogs.com/slgkaifa/p/19113219

基于SpringBoot及PostgreSQL的国家减肥食谱管理项目(上):区域与省份安装搭建

目录

前言

一、项目背景需求

1、需求简介

2、本次实现需求

二、SpringBoot后台实现

1、Model层实现

2、控制层实现

三、基于Thymeleaf的前端实现

1、前端实现方式

2、饮食区域前端实现

3、关联省份管理实现

四、总结


前言

        在当今社会,健康意识的觉醒促使越来越多的人关注减肥与营养均衡。减肥不仅关乎外在形象,更是关乎内在健康的重要课题。一个科学合理的减肥食谱对于减肥者来说至关重要,它能够帮助人们在减少热量摄入的同时,保证身体获取足够的营养。然而,不同地区的人们由于生活习惯、饮食文化以及可获取食材的差异,对于减肥食谱有着各自独特的需求。基于此,开发一个国家减肥食谱管理系统显得尤为必要,它能够根据不同区域和省份的特点,为用户提供个性化的减肥食谱方案。

        本项目旨在构建一个基于 SpringBoot 和 PostgreSQL 的国家减肥食谱管理系统。SpringBoot 作为目前流行的 Java 开发框架,以其简洁、高效的特性,能够快速搭建起稳定、可扩展的后端服务架构。它整合了众多优秀的技术组件,如 Spring MVC 用于处理 Web 请求,MybatisPlus用于简化数据库操作等,大大提高了开发效率,降低了开发成本。PostgreSQL 则是一种功能强大的开源关系型数据库,它支持复杂的数据类型和高级的查询功能,能够很好地满足本项目对于数据存储和管理的需求,尤其是在处理大量减肥食谱数据以及用户信息时,能够保证数据的完整性和一致性。

        区域和省份配置搭建还需要考虑到系统的用户体验。用户在使用减肥食谱管理系统时,希望能够方便地选择自己所在的地区,并获取到与之匹配的减肥食谱。因此,我们将设计一个简洁、直观的用户界面,让用户能够轻松地进行区域和省份的选择。同时,系统将根据用户的地理位置信息,自动推荐最合适的减肥食谱,提高用户的使用便利性和满意度。总之,区域和省份配置搭建是国家减肥食谱管理系统的关键一步。通过基于 SpringBoot 和 PostgreSQL 的技术实现,我们有信心能够构建出一个稳定、高效、用户友好的系统,为全国不同地区的减肥者提供科学、个性化的减肥食谱服务。在接下来的章节中,我们将详细介绍区域和省份配置的具体实现过程,包括数据库设计、后端服务开发以及前端用户界面设计等方面的内容,让我们一起开启这段精彩的开发之旅吧。

一、项目背景需求

         本节将重点介绍国家减肥食谱项目的背景要求,分别从需求简介和本次需要实现的需求两个方面进行介绍,通过本节让大家可以了解一些背景信息,更好的去参与后期的项目建设。

1、需求简介

        在本项目的上篇中,我们将重点聚焦于区域和省份的配置搭建。区域和省份配置是整个减肥食谱管理系统的基础,它决定了系统能够覆盖的地理范围以及能够根据不同地区特点提供服务的能力。通过精心设计的区域和省份配置,系统可以针对不同地区的饮食偏好、食材供应情况等因素,生成更具针对性和实用性的减肥食谱。例如,在沿海地区,海鲜资源丰富,减肥食谱可以充分利用这一优势,设计出以海鲜为主的低热量、高蛋白的菜品;而在内陆地区,蔬菜和肉类的搭配则可能成为减肥食谱的重点。

        在搭建区域和省份配置的过程中,我们首先需要对国家的行政区划进行详细的梳理和分析。这包括确定各个省份的边界以及各个地区的特色食材等信息。这些信息将作为系统的基础数据,存储在 PostgreSQL 数据库中。然后,我们将利用 SpringBoot 框架的强大功能,开发出一套灵活、高效的区域和省份配置管理模块。该模块将允许系统管理员方便地添加、修改和删除区域和省份信息,确保系统能够及时更新以适应国家行政区划的任何变化。同时,该模块还将提供数据校验和权限管理功能,保证数据的准确性和系统的安全性。

2、本次实现需求

        作为面向数据库的应用开发,数据库的设计直观重要。在之前的博文中对数据库表进行了深入的分析和讨论,详见:面向国家健康食谱指南的PostgreSQL物理表设计及数据存储实践方案。大家可以通过点击查看之前的博文。由于食谱的管理内容较多,设计到食谱区域、区域关联省份、餐次即食谱详情等,本文介绍最开始的两个内容,即食谱区域以及食谱区域对应的省份信息,做好这个基础工作,也将为后续的工作提供基础。本次实现的需求如下图中的红框中的数据库表所示:

        其中,食谱信息、餐别信息和菜单相关配置与管理将在后面的博客中进行深入讲解。

二、SpringBoot后台实现

        本节将以Ruoyi开发框架为例,重点讲解在SpringBoot后台中如何实现健康食谱的区域管理以及区域对应的省份信息管理。主要包括以下两个层的实现,即Model模型层和控制层。

1、Model层实现

        根据的数据库设计,在SpringBoot中主要新增两个类,即食谱区域信息类和区域省份关联信息类。饮食区域信息类关键的代码如下:

package com.yelang.project.extend.earthquake.domain;
import java.io.Serializable;
import java.util.Date;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
/**
* - 用于保存饮食区域信息表,用来记录饮食的区域和饮食特点信息
*/
@TableName(value = "biz_food_area")
@NoArgsConstructor
@AllArgsConstructor
@Setter
@Getter
@ToString
public class FoodArea implements Serializable {
private static final long serialVersionUID = -7130567191600063766L;
@TableId(value = "pk_id")
private Long pkId;// 主键
private String name;// 区域名称
@TableField(value = "food_characteristic")
private String foodCharacteristic;// 区域饮食特点
@TableField(value = "create_by")
private String createBy;// 创建人
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@TableField(value = "create_time")
private Date createTime;// 创建时间
@TableField(value = "update_by")
private String updateBy;// 更新人
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@TableField(value = "update_time")
private Date updateTime;// 更新时间
public FoodArea(String name, String foodCharacteristic, String createBy, Date createTime, String updateBy,
Date updateTime) {
super();
this.name = name;
this.foodCharacteristic = foodCharacteristic;
this.createBy = createBy;
this.createTime = createTime;
this.updateBy = updateBy;
this.updateTime = updateTime;
}
}

        饮食区域省份类的代码如下:

package com.yelang.project.extend.earthquake.domain;
import java.io.Serializable;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
/**
* - 饮食区域省份表
* @author 夜郎king
*/
@TableName(value = "biz_food_area_province")
@NoArgsConstructor
@AllArgsConstructor
@Setter
@Getter
@ToString
public class FoodAreaProvince implements Serializable {
private static final long serialVersionUID = 3070373050198422865L;
@TableId(value = "pk_id")
private Long pkId;// 主键
@TableField(value = "food_id")
private Long foodId;// 区域饮食主键
@TableField(value = "province_code")
private String provinceCode;// 省级行政区划code
@TableField(exist= false)
private String name;//区域名称
@TableField(value = "province_name" ,exist= false)
private String provinceName;//省份名称
public FoodAreaProvince(Long foodId, String provinceCode) {
super();
this.foodId = foodId;
this.provinceCode = provinceCode;
}
}

        这里需要注意的是,在食区域省份对象中增加了两个数据库中并不存在的属性,但是在列表展示时是需要用到的。因此在MybatisPlus中使用exist=false来进行标注,表示是在数据库中不存在的字段。在实际业务中,对于同一个地区,比如东北地区,在数据库中只允许出现一次,因此我需要对地区名称进行查询匹配,在对应食谱区域信息表中增加以下查询:

package com.yelang.project.extend.earthquake.mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yelang.project.extend.earthquake.domain.FoodArea;
public interface FoodAreaMapper extends BaseMapper{
static final String FIND_BYNAME_SQL=""
+ "select * from biz_food_area where name = #{name} limit 1 "
+ "";
@Select(FIND_BYNAME_SQL)
FoodArea findByName(@Param("name")String name);
}

        同时为了在展示区域省份信息时,能同时将地区名称和省份名称进行集中展示,这里就需要关联省份信息表、食谱区域信息、食谱区域省份信息,查询方法如下:

package com.yelang.project.extend.earthquake.mapper;
import java.util.List;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yelang.project.extend.earthquake.domain.FoodAreaProvince;
public interface FoodAreaProvinceMapper extends BaseMapper{
String FIND_BYNAME_SQL=""
+ "SELECT t1.pk_id,t1.food_id,t1.province_code,t2.name,t3.name province_name "
+ " FROM biz_food_area_province t1, biz_food_area t2, biz_province t3 "
+ " WHERE t1.food_id = t2.pk_id AND t1.province_code = t3.code and t1.food_id = ${foodId} "
+ " and t3.name like concat('%', #{name}, '%')"
+ " order by t1.province_code "
+ "";
@Select(FIND_BYNAME_SQL)
List findListByName(@Param("name")String name,@Param("foodId") Long foodId);
static final String FIND_BYPROVINCECODE_SQL=""
+ "select * from biz_food_area_province where province_code = #{provinceCode} limit 1 "
+ "";
@Select(FIND_BYPROVINCECODE_SQL)
FoodAreaProvince findByProvinceCode(@Param("provinceCode")String provinceCode);
}

        在Ruoyi中实现重复校验的方式其实还比较好,而且区分了新增和编辑两种方式,即新增和编辑的处理方式不一样。这样就能解决了不同的操作情况的验证处理。下面以食谱区域为例,简要介绍如何进行实现的,关键代码如下:

@Override
public String checkFoodAreaName(FoodArea foodArea) {
Long pkId = null == foodArea.getPkId() ? -1L : foodArea.getPkId();
FoodArea dbArea = this.baseMapper.findByName(foodArea.getName());
if (com.yelang.common.utils.StringUtils.isNotNull(dbArea) && dbArea.getPkId().longValue() != pkId.longValue())
{
return UserConstants.FOOD_AREA_NAME_NOT_UNIQUE;
}
return UserConstants.FOOD_AREA_NAME_UNIQUE;
}

        判断的逻辑及,如果有主键表示是修改,反之赋值-1,通过这种方式就轻松的将新增和编辑进行了区分。

2、控制层实现

        在Ruoyi中,控制层的实现也是比较简单的。我们在Controller中直接实现自己的控制器即可,这里简单讲解两个需要注意的地方。第一个是重复的校验逻辑,在控制层中,重复的校验一般包含两次,前端使用ajax发送校验请求是一次,但是在执行新增或者保存的时候还是会再次进行验证,这样应该说是双保险的。方法实现如下:

@Log(title = "区域省份", businessType = BusinessType.INSERT)
@RequiresPermissions("eq:foodarea:province:add")
@PostMapping("/add")
@ResponseBody
public AjaxResult addSave(@Validated FoodAreaProvince foodAreaProvince)
{
if (UserConstants.FOOD_AREA_PROVINCECODE_NOT_UNIQUE.equals(areaProvinceService.checkAreaProvinceName(foodAreaProvince)))
{
return error("新增区域省份'" + foodAreaProvince.getProvinceCode() + "'失败,省份已存在");
}
return toAjax(areaProvinceService.insertEntity(foodAreaProvince));
}

        上面是在调用add新增方法时就会进行校验的。除此之外,还会有一个专门的ajax方法来进行实现。

/**
* -校验区域名称
*/
@PostMapping("/checkNameUnique")
@ResponseBody
public String checkLoginNameUnique(FoodArea foodArea)
{
return foodAreaService.checkFoodAreaName(foodArea);
}

        其它的实现方法比较简单,这里不再进行赘述。

三、基于Thymeleaf的前端实现

        在完成了SpringBoot的后端程序设计与实现之后,下面我们就需要使用Thymeleaf的方式来进行前端界面的实现。我们的用户最直接使用的就是前端操作界面,因此是我们跟用户的链接载体。事先申明,这里的Ruoyi框架我们采用的最原始的单体架构版本,如果您用的其它架构,可以针对性的学习即可。

1、前端实现方式

        前端的实现方式比较简单,使用列表加tab弹出的展示方式。由于我们使用的Ruoyi的单体版本,其使用的模板引擎是Thymeleaf,因此我们这里的前端讲解几乎都是按照这种模式去介绍的。为了在食谱区域中可以关联管理区域对应的省份信息,因此我们需要使用直接打开标签的方式,核心代码如下:

/*省份配置*/
function provinceConfig(foodId) {
var url = prefix + '/detail/' + foodId;
$.modal.openTab("食谱区域省份", url);
}

在Thymeleaf中实现ajax数据校验的方式比较统一,基本都是讲参数请求提交到后台,方法如下:

var prefix = ctx + "eq/foodarea"
$("#form-foodarea-add").validate({
onkeyup: false,
rules:{
name:{
remote: {
url: prefix + "/checkNameUnique",
type: "post",
dataType: "json",
data: {
"name": function() {
return $.common.trim($("#name").val());
}
},
dataFilter: function(data, type) {
return $.validate.unique(data);
}
}
}
},
messages: {
"name": {
remote: "区域名称已经存在"
}
},
focusCleanup: true
});
function submitHandler() {
if ($.validate.form()) {
$.operate.save(prefix + "/add", $('#form-foodarea-add').serialize());
}
}

        食谱区域信息关联省份的信息处理与区域信息处理业务相似,因此对于数据的获取和校验,大家可以参考之前的内容或者直接修改相应注解即可。

2、饮食区域前端实现

        在饮食区域中,我们不仅要实现饮食区域的规定,而且在全国范围内,区域名称还不能重复,否则就是有问题的。本小节将简单讲解饮食区域的实现,如果感兴趣,可以阅读参考ruoyi的技术文档,也可以给博主在评论区留言。

        饮食区域列表查询。

        饮食区域修改

3、关联省份管理实现

        关联省份是基于食谱区域信息来实现的,我们首先需要在食谱区域中点击“省份”按钮跳转到具体的省份列表中。点击跳转后的界面展示如下:

        同样的,区域关联的省份信息,在这里时进行查询和删除的。对于省份,与区域也是一对一的关系,因此不会出现多个对一个的情况。如果信息填报有误,提示信息如下:

        经过以上步骤,我们基本就实现了本博客的最初需求。

四、总结

        以上就是本文的主要内容,本项目旨在构建一个基于 SpringBoot 和 PostgreSQL 的国家减肥食谱管理系统。SpringBoot 作为目前流行的 Java 开发框架,以其简洁、高效的特性,能够快速搭建起稳定、可扩展的后端服务架构。通过基于 SpringBoot 和 PostgreSQL 的技术实现,我们能够构建出一个稳定、高效、用户友好的系统,为全国不同地区的减肥者提供科学、个性化的减肥食谱服务。本文详细介绍了项目的背景需求、SpringBoot的后台实现和Thymeleaf的具体设计与实现,希望对家有所帮助。行文仓促,定有不足之处,欢迎各位朋友在评论区批评指正,不胜感激。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/918219.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于BP神经网络的激光焊接数据预测

基于BP神经网络的激光焊接数据预测的系统化方法,结合核心原理、实现步骤及工程优化策略,适用于焊接质量控制和工艺参数优化: 一、BP神经网络原理与激光焊接预测适配性核心机制 BP神经网络通过误差反向传播调整权重,…

重要公式 - Emi

重要的三角函数公式 \[sin\alpha cos\beta=\frac{sin(\alpha+\beta)+sin(\alpha-\beta)}{2} \]\[cos\alpha cos\beta=\frac{cos(\alpha+\beta)+cos(\alpha-\beta)}{2} \]\[sin\alpha sin\beta=-\frac{cos(\alpha+\beta…

Pandawiki:企业知识管理的全能管家

Pandawiki:企业知识管理的全能管家在当今这个信息爆炸的时代,每个企业都面临着一个共同的挑战:如何有效地管理和利用内部积累的海量知识资产?从产品文档到技术规范,从客户问答到项目经验,这些宝贵的信息往往散落…

珠宝网站建设做网站项目流程图模板

Spring的开发要点总结 文章目录 【JavaEE】Spring的开发要点总结(1)1. DI 和 DL1.1 DI 依赖注入1.2 DL 依赖查询1.3 DI 与 DL的区别1.4 IoC 与 DI/DL 的区别 2. Spring项目的创建2.1 创建Maven项目2.2 设置国内源2.2.1 勾选2.2.2 删除本地jar包2.2.3 re…

apt 还是 uv

一句话结论装系统级软件(C/CUDA、驱动、编译链) → 用 apt 纯 Python 项目/虚拟环境/依赖锁文件 → 用 uv;它比 apt 里的 python3-xxx 新、快、隔离,但不能装非 Python 组件下面给你展开对比,按“能干什么、不能干…

软件构造中的数据处理(sql) 6章

JDBC编程步骤 1.加载数据库驱动 2.建立数据库连接 3.创建Statement/PreparedStatement 4.执行SQL语句 5.处理查询结果(ResultSet) 6.关闭资源(Connection/Statement/ResultSet)

鹿鼎记豪侠传:Rust 重塑 iOS 江湖(下) - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

US$39 CAS Mileage Reset Authorization for CGDI Prog BMW MSV80 CAS1 CAS2 CAS3 CAS3+ via OBD

CAS Mileage Reset Authorization for CGDI Prog BMW MSV80 CAS1 CAS2 CAS3 CAS3+ via OBDWith this authorization, you can change mileage on BMW CAS1 CAS2 CAS3 CAS3+ CAS3++ via OBD.No need shipping. Please p…

是普通网站地图好还是rss地图好一点九江 网站建设

为增强安全性,平台可安装ssl证书。对于平台不同的组成部分需要采用不同的方式,使用不同的证书格式: 一、前端 前端采用nginx部署,安装证书步骤如下(linux window版一样): 1、conf目录下增加cert…

树的重心(邻接表)

输入样例:9 1 2 1 7 1 4 2 8 2 5 4 3 3 9 4 6期望输出:4代码实现:#include<bits/stdc++.h> using namespace std;const int N =1e5+10 , M=2*N;int n,m; int h[N],e[M],ne[M],idx; bool vis[N]; int ans=N ;v…

语音芯片怎样接? 语音芯片有哪些常见接口类型?

目录: 语音芯片怎样接? 语音芯片有哪些常见接口类型? UART接口如何实现数据传输? UART与I2C接口有何不同? UART通讯的常见故障有哪些? UART通信中时钟同步的原理: 语音芯片怎样接? 语音芯片的连接方式取决于其…

详细介绍:2025华为杯A题B题C题D题E题F题选题建议思路数学建模研研究生数学建模思路代码文章成品

详细介绍:2025华为杯A题B题C题D题E题F题选题建议思路数学建模研研究生数学建模思路代码文章成品pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !i…

上饶市住房和城乡建设局网站电商培训视频教程

一、分类任务 构建分类网络模型 必须继承nn.Module且在其构造函数中需调用nn.Module的构造函数无需写反向传播函数&#xff0c;nn.Module能够利用autograd自动实现反向传播Module中的可学习参数可以通过named_parameters()返回迭代器 from torch import nn import torch.nn.f…

Gitee vs. GitLab:中国开发者为何选择本土代码托管平台?

Gitee vs. GitLab:中国开发者为何选择本土代码托管平台? 在数字化转型和信创产业蓬勃发展的背景下,中国开发者正面临一个关键选择:是继续依赖国际化的GitLab,还是拥抱本土化的Gitee?作为国内最大的代码托管平台,…

AtCoder Beginner Contest 424

Atcoder 424 A-F题解A - Isosceles 核心代码: signed main() {ios::sync_with_stdio(0);cin.tie(0); cout.tie(0);int a, b, c;cin >> a >> b >> c;if(a == b || b == c || a == c) cout << …

US$39 BAV-Key Adapter for Yanhua Mini ACDP

BAV-Key Adapter for Yanhua Mini ACDPBAV-Key Adapter will be needed for Module 1 BMW CAS1-CAS4+, Modul 9 Land Rover and Module10 for Porsche.Package List:1pc x BAV-Key Adapter for Yanhua Mini ACDP Pictu…

可以放钓鱼网站的免费空间做一个网站以及app多少钱

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景与意义 孤立词识别是语音识别领域的一个重要分支&#xff0c;其目标是将输入的语音信号转换为计算机可…

ClkLog埋点分析系统-私有化部署+轻量灵活

ClkLog 自发布以来已有两年时间。从最初的社区版,到如今不断迭代出专业版与企业版,我们一直紧跟用户需求,不断优化产品,只为做出真正“小而美、好上手、落地快”的用户行为分析系统。在ClkLog 2.0 版本发布之际,我…

级数 - Emi

几何级数定义:每一项乘以一个固定的数得到下一项(不就是等比级数?) 求和: $$S_n=\frac{a(1-r^n)}{1-r}$$ 这里\(S_n\)是前\(n\)项的和, \(a\) 是第一项, r 是公比. 然后呢,整个级数的和就是前\(n\)项和取\(n\)趋近…

基于 Docker 的 Nginx + OpenSSL 自签名证书启用 HTTPS

基于 Docker 的 Nginx + OpenSSL 自签名证书启用 HTTPS(按步骤、可直接复制)目标:在没有域名的情况下,基于 Docker 部署 Nginx,使用 OpenSSL 生成自签名证书,启用 https://<你的公网IP> 访问。 适用:开发…