基于SSM实现个性化健康饮食推荐系统

简介: 本项目基于SSM框架开发实现了一针对个人体质情况进行日常食谱推荐的信息化管理系统。系统分为前端信息展示页面和后台信息管理操作,用户登陆前端系统,可以查看相关饮食信息,热点资讯等,并可以对个人的体质信息进行相应的管理操作,也可以根据系统推荐的饮食方案来进行查看,并可以在线查看美食介绍的相关视频。后台管理操作主要包含用户管理、饮食方案管理,用户饮食方案定制,资讯信息管理,反馈管理,轮插图管理等相关功能。系统整个体功能完整,结构清晰,适合做毕业设计和课程设计使用。...

项目编号:BS-XX-123

一,项目简介

本项目基于SSM框架开发实现了一针对个人体质情况进行日常食谱推荐的信息化管理系统。系统分为前端信息展示页面和后台信息管理操作,用户登陆前端系统,可以查看相关饮食信息,热点资讯等,并可以对个人的体质信息进行相应的管理操作,也可以根据系统推荐的饮食方案来进行查看,并可以在线查看美食介绍的相关视频。后台管理操作主要包含用户管理、饮食方案管理,用户饮食方案定制,资讯信息管理,反馈管理,轮插图管理等相关功能。系统整个体功能完整,结构清晰,适合做毕业设计和课程设计使用。

二,环境介绍

语言环境:Java:  jdk1.8

数据库:Mysql: mysql5.7

应用服务器:Tomcat:  tomcat8.5.31

开发工具:IDEA或eclipse

后台开发技术:SSM框架

前端开发技术:JSP+BootStrap+Jquery+Echart等

三,系统展示

前端页面功能展示:

image.gif编辑

健康饮食

image.gif编辑

饮食详情:可在线播放美食介绍视频

image.gif编辑

在线反馈

image.gif编辑

个人中心

image.gif编辑

个人后台管理

image.gif编辑

管理员登陆操作:

image.gif编辑

用户管理

image.gif编辑

饮食分类管理:

image.gif编辑

健康饮食管理

image.gif编辑

饮食方案推荐:

image.gif编辑

意见反馈管理

image.gif编辑

轮播图管理

image.gif编辑

资讯管理

image.gif编辑

四,核心代码展示

package com.controller;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.lang3.StringUtils;
import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.annotation.IgnoreAuth;
import com.baidu.aip.face.AipFace;
import com.baidu.aip.face.MatchRequest;
import com.baidu.aip.util.Base64Util;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.entity.ConfigEntity;
import com.service.CommonService;
import com.service.ConfigService;
import com.utils.BaiduUtil;
import com.utils.FileUtil;
import com.utils.R;
/**
 * 通用接口
 */
@RestController
public class CommonController{
  @Autowired
  private CommonService commonService;
    private static AipFace client = null;
    @Autowired
    private ConfigService configService;    
  /**
   * 获取table表中的column列表(联动接口)
   * @param table
   * @param column
   * @return
   */
  @RequestMapping("/option/{tableName}/{columnName}")
  @IgnoreAuth
  public R getOption(@PathVariable("tableName") String tableName, @PathVariable("columnName") String columnName,String level,String parent) {
    Map<String, Object> params = new HashMap<String, Object>();
    params.put("table", tableName);
    params.put("column", columnName);
    if(StringUtils.isNotBlank(level)) {
      params.put("level", level);
    }
    if(StringUtils.isNotBlank(parent)) {
      params.put("parent", parent);
    }
    List<String> data = commonService.getOption(params);
    return R.ok().put("data", data);
  }
  /**
   * 根据table中的column获取单条记录
   * @param table
   * @param column
   * @return
   */
  @RequestMapping("/follow/{tableName}/{columnName}")
  @IgnoreAuth
  public R getFollowByOption(@PathVariable("tableName") String tableName, @PathVariable("columnName") String columnName, @RequestParam String columnValue) {
    Map<String, Object> params = new HashMap<String, Object>();
    params.put("table", tableName);
    params.put("column", columnName);
    params.put("columnValue", columnValue);
    Map<String, Object> result = commonService.getFollowByOption(params);
    return R.ok().put("data", result);
  }
  /**
   * 修改table表的sfsh状态
   * @param table
   * @param map
   * @return
   */
  @RequestMapping("/sh/{tableName}")
  public R sh(@PathVariable("tableName") String tableName, @RequestBody Map<String, Object> map) {
    map.put("table", tableName);
    commonService.sh(map);
    return R.ok();
  }
  /**
   * 获取需要提醒的记录数
   * @param tableName
   * @param columnName
   * @param type 1:数字 2:日期
   * @param map
   * @return
   */
  @RequestMapping("/remind/{tableName}/{columnName}/{type}")
  @IgnoreAuth
  public R remindCount(@PathVariable("tableName") String tableName, @PathVariable("columnName") String columnName, 
             @PathVariable("type") String type,@RequestParam Map<String, Object> map) {
    map.put("table", tableName);
    map.put("column", columnName);
    map.put("type", type);
    if(type.equals("2")) {
      SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
      Calendar c = Calendar.getInstance();
      Date remindStartDate = null;
      Date remindEndDate = null;
      if(map.get("remindstart")!=null) {
        Integer remindStart = Integer.parseInt(map.get("remindstart").toString());
        c.setTime(new Date()); 
        c.add(Calendar.DAY_OF_MONTH,remindStart);
        remindStartDate = c.getTime();
        map.put("remindstart", sdf.format(remindStartDate));
      }
      if(map.get("remindend")!=null) {
        Integer remindEnd = Integer.parseInt(map.get("remindend").toString());
        c.setTime(new Date());
        c.add(Calendar.DAY_OF_MONTH,remindEnd);
        remindEndDate = c.getTime();
        map.put("remindend", sdf.format(remindEndDate));
      }
    }
    int count = commonService.remindCount(map);
    return R.ok().put("count", count);
  }
  /**
   * 单列求和
   */
  @RequestMapping("/cal/{tableName}/{columnName}")
  @IgnoreAuth
  public R cal(@PathVariable("tableName") String tableName, @PathVariable("columnName") String columnName) {
    Map<String, Object> params = new HashMap<String, Object>();
    params.put("table", tableName);
    params.put("column", columnName);
    Map<String, Object> result = commonService.selectCal(params);
    return R.ok().put("data", result);
  }
  /**
   * 分组统计
   */
  @RequestMapping("/group/{tableName}/{columnName}")
  @IgnoreAuth
  public R group(@PathVariable("tableName") String tableName, @PathVariable("columnName") String columnName) {
    Map<String, Object> params = new HashMap<String, Object>();
    params.put("table", tableName);
    params.put("column", columnName);
    List<Map<String, Object>> result = commonService.selectGroup(params);
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    for(Map<String, Object> m : result) {
      for(String k : m.keySet()) {
        if(m.get(k) instanceof Date) {
          m.put(k, sdf.format((Date)m.get(k)));
        }
      }
    }
    return R.ok().put("data", result);
  }
  /**
   * (按值统计)
   */
  @RequestMapping("/value/{tableName}/{xColumnName}/{yColumnName}")
  @IgnoreAuth
  public R value(@PathVariable("tableName") String tableName, @PathVariable("yColumnName") String yColumnName, @PathVariable("xColumnName") String xColumnName) {
    Map<String, Object> params = new HashMap<String, Object>();
    params.put("table", tableName);
    params.put("xColumn", xColumnName);
    params.put("yColumn", yColumnName);
    List<Map<String, Object>> result = commonService.selectValue(params);
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    for(Map<String, Object> m : result) {
      for(String k : m.keySet()) {
        if(m.get(k) instanceof Date) {
          m.put(k, sdf.format((Date)m.get(k)));
        }
      }
    }
    return R.ok().put("data", result);
  }
  /**
   * (按值统计)时间统计类型
   */
  @IgnoreAuth
  @RequestMapping("/value/{tableName}/{xColumnName}/{yColumnName}/{timeStatType}")
  public R valueDay(@PathVariable("tableName") String tableName, @PathVariable("yColumnName") String yColumnName, @PathVariable("xColumnName") String xColumnName, @PathVariable("timeStatType") String timeStatType) {
    Map<String, Object> params = new HashMap<String, Object>();
    params.put("table", tableName);
    params.put("xColumn", xColumnName);
    params.put("yColumn", yColumnName);
    params.put("timeStatType", timeStatType);
    List<Map<String, Object>> result = commonService.selectTimeStatValue(params);
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    for(Map<String, Object> m : result) {
      for(String k : m.keySet()) {
        if(m.get(k) instanceof Date) {
          m.put(k, sdf.format((Date)m.get(k)));
        }
      }
    }
    return R.ok().put("data", result);
  }
    /**
     * 人脸比对
     * 
     * @param face1 人脸1
     * @param face2 人脸2
     * @return
     */
    @RequestMapping("/matchFace")
    @IgnoreAuth
    public R matchFace(String face1, String face2,HttpServletRequest request) {
        if(client==null) {
            /*String AppID = configService.selectOne(new EntityWrapper<ConfigEntity>().eq("name", "AppID")).getValue();*/
            String APIKey = configService.selectOne(new EntityWrapper<ConfigEntity>().eq("name", "APIKey")).getValue();
            String SecretKey = configService.selectOne(new EntityWrapper<ConfigEntity>().eq("name", "SecretKey")).getValue();
            String token = BaiduUtil.getAuth(APIKey, SecretKey);
            if(token==null) {
                return R.error("请在配置管理中正确配置APIKey和SecretKey");
            }
            client = new AipFace(null, APIKey, SecretKey);
            client.setConnectionTimeoutInMillis(2000);
            client.setSocketTimeoutInMillis(60000);
        }
        JSONObject res = null;
        try {
            File file1 = new File(request.getSession().getServletContext().getRealPath("/upload")+"/"+face1);
            File file2 = new File(request.getSession().getServletContext().getRealPath("/upload")+"/"+face2);
            String img1 = Base64Util.encode(FileUtil.FileToByte(file1));
            String img2 = Base64Util.encode(FileUtil.FileToByte(file2));
            MatchRequest req1 = new MatchRequest(img1, "BASE64");
            MatchRequest req2 = new MatchRequest(img2, "BASE64");
            ArrayList<MatchRequest> requests = new ArrayList<MatchRequest>();
            requests.add(req1);
            requests.add(req2);
            res = client.match(requests);
            System.out.println(res.get("result"));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            return R.error("文件不存在");
        } catch (IOException e) {
            e.printStackTrace();
        } 
        return R.ok().put("score", com.alibaba.fastjson.JSONObject.parse(res.getJSONObject("result").get("score").toString()));
    }
}

image.gif

package com.controller;
import java.util.Arrays;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.annotation.IgnoreAuth;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.entity.ConfigEntity;
import com.service.ConfigService;
import com.utils.MPUtil;
import com.utils.PageUtils;
import com.utils.R;
import com.utils.ValidatorUtils;
/**
 * 登录相关
 */
@RequestMapping("config")
@RestController
public class ConfigController{
  @Autowired
  private ConfigService configService;
  /**
     * 列表
     */
    @RequestMapping("/page")
    public R page(@RequestParam Map<String, Object> params,ConfigEntity config){
        EntityWrapper<ConfigEntity> ew = new EntityWrapper<ConfigEntity>();
      PageUtils page = configService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, config), params), params));
        return R.ok().put("data", page);
    }
  /**
     * 列表
     */
    @IgnoreAuth
    @RequestMapping("/list")
    public R list(@RequestParam Map<String, Object> params,ConfigEntity config){
        EntityWrapper<ConfigEntity> ew = new EntityWrapper<ConfigEntity>();
      PageUtils page = configService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, config), params), params));
        return R.ok().put("data", page);
    }
    /**
     * 信息
     */
    @RequestMapping("/info/{id}")
    public R info(@PathVariable("id") String id){
        ConfigEntity config = configService.selectById(id);
        return R.ok().put("data", config);
    }
    /**
     * 详情
     */
    @IgnoreAuth
    @RequestMapping("/detail/{id}")
    public R detail(@PathVariable("id") String id){
        ConfigEntity config = configService.selectById(id);
        return R.ok().put("data", config);
    }
    /**
     * 根据name获取信息
     */
    @RequestMapping("/info")
    public R infoByName(@RequestParam String name){
        ConfigEntity config = configService.selectOne(new EntityWrapper<ConfigEntity>().eq("name", "faceFile"));
        return R.ok().put("data", config);
    }
    /**
     * 保存
     */
    @PostMapping("/save")
    public R save(@RequestBody ConfigEntity config){
//      ValidatorUtils.validateEntity(config);
      configService.insert(config);
        return R.ok();
    }
    /**
     * 修改
     */
    @RequestMapping("/update")
    public R update(@RequestBody ConfigEntity config){
//        ValidatorUtils.validateEntity(config);
        configService.updateById(config);//全部更新
        return R.ok();
    }
    /**
     * 删除
     */
    @RequestMapping("/delete")
    public R delete(@RequestBody Long[] ids){
      configService.deleteBatchIds(Arrays.asList(ids));
        return R.ok();
    }
}

image.gif

package com.controller;
import java.io.File;
import java.io.IOException;
import java.util.Date;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import com.annotation.IgnoreAuth;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.entity.ConfigEntity;
import com.entity.EIException;
import com.service.ConfigService;
import com.utils.R;
/**
 * 上传文件映射表
 */
@RestController
@RequestMapping("file")
@SuppressWarnings({"unchecked","rawtypes"})
public class FileController{
  @Autowired
    private ConfigService configService;
  /**
   * 上传文件
   */
  @RequestMapping("/upload")
  public R upload(@RequestParam("file") MultipartFile file, String type,HttpServletRequest request) throws Exception {
    if (file.isEmpty()) {
      throw new EIException("上传文件不能为空");
    }
    String fileExt = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".")+1);
    String fileName = new Date().getTime()+"."+fileExt;
    File dest = new File(request.getSession().getServletContext().getRealPath("/upload")+"/"+fileName);
    file.transferTo(dest);
    /**
    * 如果使用idea或者eclipse重启项目,发现之前上传的图片或者文件丢失,将下面一行代码注释打开
    * 请将以下的"D:\\ssmpiv99\\src\\main\\webapp\\upload"替换成你本地项目的upload路径,
    * 并且项目路径不能存在中文、空格等特殊字符
    */
    //FileUtils.copyFile(dest, new File("D:\\ssmpiv99\\src\\main\\webapp\\upload"+"/"+fileName)); /**修改了路径以后请将该行最前面的//注释去掉**/
    if(StringUtils.isNotBlank(type) && type.equals("1")) {
      ConfigEntity configEntity = configService.selectOne(new EntityWrapper<ConfigEntity>().eq("name", "faceFile"));
      if(configEntity==null) {
        configEntity = new ConfigEntity();
        configEntity.setName("faceFile");
        configEntity.setValue(fileName);
      } else {
        configEntity.setValue(fileName);
      }
      configService.insertOrUpdate(configEntity);
    }
    return R.ok().put("file", fileName);
  }
  /**
   * 下载文件
   */
  @IgnoreAuth
  @RequestMapping("/download")
  public void download(@RequestParam String fileName, HttpServletRequest request, HttpServletResponse response) {
    try {
      File file = new File(request.getSession().getServletContext().getRealPath("/upload")+"/"+fileName);
      if (file.exists()) {
        response.reset();
        response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName+"\"");
        response.setHeader("Cache-Control", "no-cache");
        response.setHeader("Access-Control-Allow-Credentials", "true");
        response.setContentType("application/octet-stream; charset=UTF-8");
        IOUtils.write(FileUtils.readFileToByteArray(file), response.getOutputStream());
      }
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}

image.gif

五,项目总结

  整个项目功能结构完整清晰,前后端交互流流畅,系统运行无BUG,适合做毕业设计使用。

相关文章
|
7月前
|
数据可视化 数据挖掘 数据管理
问卷调查数据分析指南!掌握方法,精准把握用户需求!
本文介绍了如何利用自定义报表、交叉报表和过滤器进行问卷调查数据分析。文章首先区分了定量和定性数据,强调了定量数据在分析中的重要性,并列举了客户体验(CSAT、CES、NPS)和市场调研的关键指标。接着,提到了定性数据分析方法,如情感分析和词云图。文章还讨论了自定义报表、交叉报表和过滤器在数据筛选和相关性探索中的作用,以及收集器在多源数据收集上的应用。最后,强调了仪表板在数据可视化和比较中的优势,并推荐了Zoho Survey作为综合的数据管理平台。
418 0
问卷调查数据分析指南!掌握方法,精准把握用户需求!
|
7月前
|
存储 分布式计算 搜索推荐
基于hdoop的短视频用户画像研究_kaic
基于hdoop的短视频用户画像研究_kaic
|
2月前
|
机器学习/深度学习 人工智能 搜索推荐
用AI技术打造个性化新闻推荐系统
【10月更文挑战第7天】本文将介绍如何使用AI技术构建一个个性化的新闻推荐系统。我们将从数据收集、处理,到模型训练和优化,最后实现推荐系统的全过程进行讲解。通过这篇文章,你将了解到如何利用机器学习和深度学习技术,为用户提供精准的新闻推荐。
49 0
|
3月前
|
存储 安全 搜索推荐
基因编辑:精准医疗与生物进化的新篇章
【9月更文挑战第11天】基因编辑技术作为精准医疗与生物进化的新篇章,正以前所未有的速度改变着我们的世界。它为我们提供了治疗遗传性疾病、实现个性化医疗、探索生物进化奥秘的新途径。然而,在享受技术带来的便利的同时,我们也需要清醒地认识到其面临的挑战和伦理考量。只有以开放、审慎的态度面对这一技术,充分发挥其潜力并避免潜在风险,我们才能确保基因编辑技术的健康发展,为人类带来更多的福祉和改变。
|
4月前
|
机器学习/深度学习 数据采集 搜索推荐
打造个性化新闻推荐系统
【8月更文挑战第31天】在这个信息爆炸的时代,个性化新闻推荐系统成为了连接用户与海量资讯的桥梁。本文将引导你通过Python编程语言和机器学习技术,搭建一个简单的新闻推荐模型。我们将从数据预处理开始,逐步深入到模型的训练与评估,最终实现一个能够根据用户兴趣推荐新闻的系统。无论你是编程新手还是有一定基础的学习者,这篇文章都将为你打开一扇通往智能推荐世界的大门。
|
4月前
|
开发框架 搜索推荐 API
打造个性化天气应用:从零到一的旅程
【8月更文挑战第31天】本文将带领读者踏上一段技术之旅,从无到有构建一个个性化的天气应用。我们将探索如何通过编程和设计思维,结合用户的实际需求,打造一个既实用又具有个人风格的天气预报工具。文章中不仅分享代码示例,还讨论了在开发过程中遇到的挑战以及解决方案,旨在启发读者思考如何在技术创造中融入个人特色,实现自我表达。
|
4月前
|
数据采集 机器学习/深度学习 人工智能
利用AI技术实现个性化新闻推荐系统
【8月更文挑战第31天】 本文将介绍如何利用AI技术实现一个个性化的新闻推荐系统。我们将使用Python语言和一些常用的机器学习库,如scikit-learn和pandas,来构建一个简单的推荐系统。这个系统可以根据用户的阅读历史和兴趣偏好,为他们推荐相关的新闻文章。我们将从数据预处理、特征提取、模型训练和结果评估等方面进行详细的讲解。
|
5月前
|
搜索推荐 数据挖掘 定位技术
商场定位导航系统:为用户提供的智能化与个性化服务
在现代社会,商场不仅是购物之地,也是休闲社交之所。但庞大的规模常导致顾客迷路,影响体验。商场定位导航系统通过精准室内定位技术,帮助顾客轻松找到目的地,显著提升便捷性与满意度。系统还具备实时位置共享及智能路径规划功能,加强互动营销;同时,数据分析工具助力商场优化管理,提高效率。核心功能包括:高精度电子地图、智能路径规划、实时定位导航、位置共享及基础设施快速查找。这些特性不仅能增加顾客满意度与忠诚度,还能提高商场运营的数据化水平,扩大品牌影响力,是商场智慧化转型的关键。
95 0
商场定位导航系统:为用户提供的智能化与个性化服务
|
5月前
|
机器学习/深度学习 搜索推荐 算法
智能推荐系统:个性化体验的背后
【7月更文第18天】在互联网的汪洋大海中,智能推荐系统就像一位贴心的向导,总能在浩瀚的信息中找到你最感兴趣的那一部分。它在电商平台上让你轻松发现心仪商品,在视频平台上为你连播下一集你欲罢不能的剧集。这背后的秘密,就是那些神奇的智能推荐算法。今天,咱们就来扒一扒电商、视频平台中的智能推荐系统,看看它是如何为你我打造出个性化的数字体验的。
296 0
|
7月前
|
存储 数据采集 搜索推荐
旅游推荐系统
旅游推荐系统
490 0