基于协同过滤的个性化健康饮食推荐系统的设计与实现 计算机毕业设计源码68863
目 录
本系统基于协同过滤算法设计并实现了一个个性化健康饮食推荐系统,目标是为用户提供符合其健康需求和饮食喜好的定制化饮食建议。系统通过收集用户的饮食记录、健康状况和偏好数据,结合历史反馈,使用协同过滤技术分析用户之间的相似性,从而推荐最适合的健康食谱和饮食方案。这样不仅提升了饮食建议的准确性,也增加了其个性化程度。
系统采用SpringBoot框架进行开发,保证了高效的后端处理能力和良好的扩展性。SpringBoot的模块化设计使得系统在面对不同需求时能够灵活应变。系统结构包括用户管理、食谱管理、推荐算法等多个模块,并通过RESTful API与前端进行数据交互,确保了系统操作的流畅性和用户体验的连贯性。同时,系统还具备数据分析功能,定期更新推荐内容,帮助用户根据自己的健康状况调整饮食习惯,进一步优化健康效果。
该推荐系统不仅关注食物的营养价值,还结合了用户的口味和饮食习惯,为每个用户提供健康又符合其个人喜好的饮食建议。这种个性化的健康饮食方案有助于提升用户的整体健康水平及生活质量,确保长期的健康管理。
关键词:协同过滤,个性化推荐,健康饮食,SpringBoot。
Abstract
This system is based on collaborative filtering algorithm and has designed and implemented a personalized healthy diet recommendation system, with the goal of providing users with customized dietary recommendations that meet their health needs and dietary preferences. The system collects users' dietary records, health status, and preference data, combined with historical feedback, and uses collaborative filtering technology to analyze the similarity between users, in order to recommend the most suitable healthy recipes and dietary plans. This not only improves the accuracy of dietary advice, but also increases its personalization level.
The system is developed using the SpringBoot framework, ensuring efficient backend processing capabilities and good scalability. The modular design of SpringBoot enables the system to flexibly adapt to different requirements. The system architecture includes multiple modules such as user management, recipe management, and recommendation algorithms, and interacts with the front-end through RESTful APIs to ensure smooth system operations and coherent user experience. At the same time, the system also has data analysis capabilities, regularly updating recommended content to help users adjust their eating habits based on their health status and further optimize their health outcomes.
This recommendation system not only focuses on the nutritional value of food, but also combines users' tastes and dietary habits to provide healthy and personalized dietary recommendations for each user. This personalized healthy eating plan helps improve the overall health level and quality of life of users, ensuring long-term health management.
Keywords: collaborative filtering, personalized recommendation, healthy diet, SpringBoot.
1 绪论
1.1 课题背景
随着人们健康意识的提高,个性化饮食的需求不断增长。健康饮食不仅能改善身体健康,还被认为能够延缓衰老,延长寿命[1]。因此,基于用户需求提供个性化的饮食推荐成为了一个重要的研究课题。随着深度学习和推荐算法的快速发展,这些技术在饮食推荐系统中得到了广泛应用,从而提升了推荐的准确性和用户的参与度[2]。
在个性化饮食推荐领域,基于知识图谱的推荐方法逐渐受到关注。通过将食物、营养成分和健康效果等信息深度关联,知识图谱为推荐系统提供了更全面的支持,提升了推荐的多维度精度[3]。同时,随着信息技术的不断进步,Java Web等开发技术已广泛应用于饮食推荐系统中,为系统的高效运行和文件上传提供了坚实的技术保障[4]。这些技术的结合为基于协同过滤的个性化健康饮食推荐系统提供了理论依据和技术支持,推动了系统的智能化和精准化发展。
基于协同过滤的个性化健康饮食推荐系统的设计与实现旨在通过技术手段提升用户的健康饮食体验,改善个性化推荐的准确性与实用性。随着健康饮食需求的增长,饮食推荐系统的设计需聚焦用户体验和健康管理。因此,利用Garrett用户体验要素模型对个性化饮食推荐APP进行设计,旨在提升系统的用户友好性和互动性[5]。同时,健康饮食的知识图谱构建为系统提供了更加全面的支持,能够更精准地满足用户对营养成分和健康效果的需求[6]。
此外,针对慢性疾病管理领域,个性化饮食推荐的应用显得尤为重要。通过深入研究慢病患者的饮食需求与健康数据,饮食推荐系统能够提供针对性的饮食建议,有助于提升健康管理的效果[7]。在系统的开发和实现过程中,SpringBoot技术作为一种高效的开发框架,为Web前端和数据库接口的设计提供了技术保障,确保系统的高效运行和数据处理能力[8]。综上所述,本课题的研究不仅推动了个性化健康饮食推荐技术的发展,还为慢病管理和健康饮食领域的创新应用提供了理论支持和实践指导。
近年来,随着健康饮食理念的普及和人们生活水平的提高,个性化饮食推荐系统逐渐成为饮食健康领域的重要研究方向。这些系统通过分析用户的健康状况、饮食习惯和偏好,提供个性化的饮食方案,以帮助用户保持健康体重、改善饮食结构,甚至是管理慢性病和预防疾病。
在国外,许多研究者和机构已经开展了个性化饮食推荐系统的设计与实现,主要采用基于用户历史行为数据的协同过滤算法进行推荐。例如,国外的健康饮食平台通过收集用户的饮食记录、体重数据和健康指标,通过分析用户之间的相似性来推荐适合的食谱和饮食计划。美国和欧洲的一些研究机构和科技公司已经推出了相关应用,并在日常生活中取得了较为广泛的应用。这些平台的推荐不仅涉及饮食,还包括运动、营养补充等多个方面,旨在提供全方位的健康管理服务。
在国内,随着人们健康意识的提升,许多健康管理平台也逐步推出了基于协同过滤的个性化饮食推荐系统。国内一些健康应用已经通过分析用户的饮食偏好、过敏信息、健康目标等因素,提供个性化的饮食建议。这些平台利用用户的历史数据与其他相似用户的数据进行对比,从而推测最适合的食谱和饮食习惯。国内一些知名的健康管理公司和互联网企业也在积极推动这一技术的发展,并取得了良好的市场反响。此外,随着健身和饮食管理的普及,越来越多的用户希望通过智能化的手段来调整饮食结构,改善健康状况,这使得个性化饮食推荐系统成为未来发展的一大趋势。
总体来看,个性化健康饮食推荐系统在国内外均有一定的发展基础,并且随着健康需求的多样化和技术的不断进步,这一领域有着广阔的发展空间。通过进一步优化推荐算法和数据分析方法,未来的个性化饮食推荐系统将更加精准、智能,能够更好地满足用户在健康饮食方面的个性化需求。
1.4 论文组织结构
第一章:引言。主要介绍了课题研究的背景意义,国内目前相关研究现状以及本文的组织结构。
第二章:相关技术介绍。主要对本系统使用的相关技术和开发工具进行介绍。
第三章:系统需求分析。主要从系统的用户、功能等方面进行需求分析。
第四章:系统概要设计。主要对系统框架、系统功能模块、数据库进行功能设计。
第五章:系统实现。主要介绍了系统框架搭建、系统界面的实现。
第六章:系统测试。主要对系统的部分界面进行测试并对主要功能进行测试。
第七章:总结与展望。
2 相关技术介绍
2.1 Java语言
Java是一种跨平台的高级编程语言,具有广泛应用于各个领域的优势。它拥有简单易学、可靠稳定、安全性强和良好的性能等特点。在个性化健康饮食推荐系统中,Java将作为主要的后端编程语言来实现系统的核心功能。通过使用Java,我们可以实现数据的处理、业务逻辑的编写以及与前端界面的交互。同时,Java还提供了丰富的类库和开发工具,方便开发人员进行系统设计和开发。
2.2 Spring Boot框架
Spring Boot,作为Spring生态系统中一颗璀璨的明星,以其“约定优于配置”的核心理念,极大地简化了Java应用的开发、部署与管理流程。它并非是对Spring框架的颠覆,而是在其基础上进行了深度封装与优化,旨在快速搭建独立的、生产级别的Spring应用。Spring Boot通过自动配置功能,减少了大量繁琐的配置工作,让开发者能够更加专注于业务逻辑的实现。同时,它集成了众多常用库,如数据库连接池、缓存、消息队列等,为开发者提供了一站式的解决方案。此外,Spring Boot还支持多种部署方式,无论是传统的WAR包部署,还是现代的容器化部署,都能轻松应对。因此,选择Spring Boot作为度假管理系统的开发框架,不仅能够提升开发效率,还能确保系统的稳定性和可维护性。
2.3 HTML前端技术
HTML(超文本标记语言)是构建WEB页面的标准标记语言。它用于定义网页的结构和内容,通过标签(tag)来描述文本、图像、链接等元素。结合CSS和JavaScript,HTML可以实现丰富的用户界面和交互效果,是WEB前端开发的基础。
B/S(Browser/Server)结构是一种用于WEB应用程序的架构模式,用户通过浏览器与服务器进行交互。与传统的C/S(Client/Server)架构相比,B/S结构具有更好的普适性和简便性,用户无需安装客户端软件,只需通过浏览器即可访问应用,降低了维护和升级的成本。
MySQL数据库,作为开源关系型数据库管理系统的佼佼者,以其高性能、可靠性、易用性和灵活性,在全球范围内被广泛应用于各类企业级应用中。MySQL采用SQL(结构化查询语言)作为数据操作的标准语言,支持复杂的查询、数据更新、索引优化等功能,确保数据的高效存取和完整性。其强大的事务处理能力,为业务逻辑的原子性、一致性、隔离性和持久性提供了坚实保障。此外,MySQL还具备高度的可配置性和可扩展性,通过优化存储引擎、调整配置参数等手段,可以轻松应对高并发、大数据量的应用场景。在个性化健康饮食推荐系统中,MySQL作为后端数据存储的核心,不仅为系统提供了稳定可靠的数据支持,还通过其丰富的数据操作功能,助力系统实现复杂的业务逻辑和高效的数据管理。
协同过滤推荐系统是一种基于用户行为数据的个性化推荐技术,通过分析用户的历史行为和偏好,发现用户之间的相似性,进而为用户推荐与其兴趣相匹配的物品。在本系统中,协同过滤推荐算法通过对用户的饮食记录进行分析,计算用户之间的相似度,识别出具有相似饮食习惯的用户群体。系统根据这些相似用户的喜好,为当前用户推荐合适的食物,从而提供个性化的饮食建议。此外,系统还结合用户的健康数据和营养需求,进一步优化推荐结果,确保推荐的食物既符合用户的口味,又能满足其营养需求。通过这种方式,协同过滤推荐系统不仅提高了用户的饮食管理体验,还促进了健康生活方式的形成。
3 系统分析
3.1 可行性分析
可行性分析是系统分析的第一步,通过可行性分析我们可以得出系统是不是值得开发,如果系统的开发是不可信的,那么就没有必要再进行下面的操作,对于本个性化健康饮食推荐系统在可行性方面进行了技术、经济以及操作的分析。
3.1.1 技术可行性分析
个性化健康饮食推荐系统使用成熟的SpringBoot框架,具有良好的可扩展性和维护性。系统涉及到的技术,如Web开发、MySQL数据库管理、Java前端交互等,都是当前主流技术,开发团队具有丰富的经验。在推荐算法方面,我们采用了协同过滤方法,通过分析用户的饮食记录和偏好,计算用户之间的相似度,进而为用户推荐与其兴趣相匹配的食物。这些技术的选择和组合不仅确保了系统的高性能和可扩展性,还能够有效支持系统的各项功能需求,从而保证了系统的技术可行性。
经济可行性分析主要评估系统开发和实施的经济效益。在基于协同过滤的个性化健康饮食推荐系统中,初期投资包括技术开发、系统维护和硬件资源。然而,相比传统健康管理方式,个性化推荐系统能够通过精准的饮食建议降低健康问题和医疗成本,带来长期回报。此外,系统通过数据优化提高用户粘性,增加平台用户和收入来源,如订阅费和广告收入。虽然初期投入较高,但随着用户增长,运营成本将逐渐降低,整体具备较强的经济可行性。
操作可行性分析主要评估系统的实施和使用是否具备实际可行性。在基于协同过滤的健康饮食推荐系统中,技术实现依赖于现有的SpringBoot框架,具备成熟的开发工具和资源,便于快速搭建与维护。系统界面简洁易用,用户只需提供饮食偏好和健康数据,便可获得个性化推荐,操作门槛较低。此外,推荐算法基于现有的协同过滤技术,算法的实现和优化相对简单,易于维护和调整。用户数据收集和处理流程也较为简便,能够高效支持系统运行。考虑到平台的规模和技术可行性,系统在短期内可以顺利实施,并满足大部分用户的需求。因此,从操作角度来看,该系统具备较高的可行性,能够顺利投入使用。
3.2.1 功能性需求分析
功能性需求分析主要包括用户管理、食谱管理、推荐算法和数据分析模块。用户管理模块提供注册、登录和信息维护功能,确保用户数据的准确性和安全性;食谱管理模块支持食谱的创建、查询、更新和删除,确保食谱内容丰富和及时更新;推荐算法基于用户的饮食偏好和健康数据生成个性化推荐,提供精准的饮食建议;数据分析模块帮助用户跟踪饮食习惯并提供健康建议,支持饮食数据的可视化与反馈。整个系统应具有简洁易用的界面,确保用户操作流畅,同时具备高效的数据处理能力,保障用户体验与系统稳定性。具体功能描述如下:
养生用户模块:
(1)用户注册登录:用户可以通过邮箱或手机号注册新账号,注册后需进行邮箱验证。登录后可访问系统的更多功能。
首页:首页作为用户的起始页,整合了平台的核心内容。用户通过导航栏可以方便地进入各类功能模块,包括查看首页展示的轮播图、平台公告、最新饮食资讯、养生课程推荐和活动广场推荐等内容。用户也可以通过输入关键词快速搜索到感兴趣的内容,系统提供快捷操作入口,方便用户浏览与操作,同时也可在此页面修改个人资料。
网站公告:此功能允许用户查看平台发布的各类公告,包括关于平台的最新动态、功能更新、活动通知等信息。通过网站公告功能,用户可以了解平台的重大信息,及时获得相关更新内容,确保不遗漏任何重要动态。
饮食资讯:平台为用户提供各类饮食健康资讯,涵盖健康饮食、营养搭配、食材选择等多方面知识。用户可以通过筛选功能、下拉菜单、排序工具等快速找到感兴趣的资讯内容。同时,用户对感兴趣的资讯可以进行点赞、收藏、评论,参与平台互动,增加用户间的社交交流。
食谱阅览:用户可以查看平台提供的各类食谱,每道食谱包含名称、类型、主要食材、营养价值、以及其他用户的评价和分享。通过输入关键词或利用筛选功能,用户能够高效查找特定食谱。用户还可以对喜欢的食谱进行点赞、收藏、评论,甚至为食谱打分,增加互动性和用户参与感。
养生课程:平台提供各种养生课程,用户可以浏览每个课程的名称、类型、主讲老师信息等,帮助用户选择符合自己需求的课程。用户可以通过关键词搜索功能查找感兴趣的课程,喜欢的课程可以进行点赞、收藏、评论、评分等操作,增强平台的互动性,提升学习体验。
活动广场:活动广场模块展示平台组织的各类活动信息,包括活动名称、时间、地点等。用户可以通过关键词快速搜索到特定活动,查看活动详情并进行评论、点赞、收藏以及报名。用户也能看到活动的点赞数,增加参与感与社区互动。
饮食记录:用户可以记录每天的饮食内容,包括早餐、午餐和晚餐,并为每一餐选择记录日期进行提交。这一功能帮助用户养成良好的饮食习惯,并为后续的健康分析提供数据支持,方便用户跟踪自己的饮食状况。
用户反馈:用户可以在平台上提交自己的意见和建议,选择反馈日期并描述问题。提交后的反馈会由管理员审核并回复,确保用户的反馈得到重视和处理。此功能提供了与管理员之间的沟通桥梁,让平台能够持续优化服务。
我的账户:在个人账户中,用户可以随时修改个人资料,如昵称、头像、密码等,保证账户的安全性。同时,用户也可以查看自己的历史记录,方便管理个人信息并确保账户隐私保护。
个人中心:个人中心是用户操作的集成页面,整合了多个功能模块,如食谱阅览、活动报名、饮食记录、饮食分析、用户反馈等,用户可以快速访问这些功能,便捷地管理个人信息及活动记录。
食谱阅览:用户可以通过个人中心访问自己收藏的食谱,并且能够对每个食谱进行管理,比如删除不再需要的食谱,或再次查看喜欢的食谱内容。此功能让用户可以方便地管理食谱收藏,确保使用的便捷性。
活动报名:用户可以在个人中心查看自己已报名的活动,并能够查询活动的审核状态和报名详情。在活动通过管理员审核后,用户会被通知参与,便于用户管理活动参与记录。
饮食记录:通过个人中心,用户可以查看自己的饮食记录,便捷地查询过去的饮食内容。用户可以选择日期范围查看某段时间内的饮食记录,方便进行健康分析。
饮食分析:平台基于用户的饮食记录提供相应的健康分析报告,帮助用户了解自己的饮食习惯、营养摄入状况以及是否需要调整饮食结构。用户可在个人中心查看详细的饮食分析数据,帮助做出合理的健康决策。
用户反馈:用户在个人中心可以查看自己提交的反馈内容及管理员的回复,确保自己反馈的问题得到解决或被采纳。这一功能帮助用户跟踪反馈的进展,加强平台与用户之间的互动。
收藏:查看系统中所有收藏的内容,包括食谱阅览、网站公告、养生课程信息等,并对不喜欢的内容进行删除。
评论管理:查看用户在前台的所有评论信息详情和被回复情况,支持通过输入昵称、内容进行搜索、查询、重置和删除等操作,点击评论来源可以跳转至相关页面。
管理员管理模块:
登录:管理员使用后台账号进行登录,访问管理权限。
后台首页 ;管理员可在后台首页进行个人资料的修改,包括用户名、密码、联系方式等信息,确保管理员账户的安全性。通过这一功能,管理员可以方便地管理自己的账号信息。
系统用户:管理员可以管理平台上的所有用户,特别是养生用户和其他管理用户。通过输入用户姓名、手机号码等信息,管理员可以快速查找特定用户,查看、修改或删除其账户,维护平台的正常运营与秩序。
食谱阅览管理:管理员可以查看平台上的所有食谱内容,包括食谱的名称、类型、食材、营养价值以及用户评论等。管理员可通过关键词搜索来查找特定食谱,对不符合平台要求的内容进行修改或删除操作,确保食谱的质量和规范性。
食谱类型管理:管理员负责平台食谱类型的管理,能查看并修改食谱类型的列表。管理员可以新增、删除或修改食谱分类,确保食谱分类系统的合理性和便于用户查找。
养生课程管理:管理员可以查看和管理平台上发布的养生课程内容。管理员能够搜索特定课程,查看课程详情、评论等信息,修改课程内容或删除不合格的课程。管理员还可以添加新课程,提供课程名称、上传视频、选择课程类型和主讲教师等,确保课程内容的更新与丰富。
课程类型管理:管理员可管理课程类型信息。通过搜索课程类型名称,管理员可以查看所有课程分类,并对其进行修改、删除或新增操作,保证平台课程分类的精确与多样性。
活动广场管理:管理员负责管理平台上的活动信息,查看所有活动的详细数据,包括活动名称、时间、地点等。管理员可以对活动信息进行修改或删除操作,还可以为新的活动添加相关内容,如活动名称、简介、活动图片等,保证活动信息的准确与及时更新。
活动报名管理:管理员负责审核用户报名的活动信息。管理员通过查看活动报名详情,可以对用户的报名状态进行审核、删除等操作,确保活动的顺利开展。
饮食记录管理:管理员可以查看用户提交的饮食记录,并进行相应的分析与处理。管理员能根据日期范围筛选出用户的饮食记录,进一步进行数据分析,为用户提供健康饮食指导。
饮食分析管理:管理员可以对用户提交的饮食记录进行详细分析,生成个性化的饮食报告,帮助用户更好地了解自己的饮食习惯。此功能为用户提供专业的健康指导,提升平台的服务质量。
用户反馈管理:管理员负责查看和处理用户提交的反馈内容。管理员可以通过反馈的日期或审核状态进行筛选,及时回复用户提出的建议和问题,确保反馈得到有效处理。
系统管理:管理员管理平台系统的展示内容,包括轮播图、网站公告等。管理员可以更新首页展示的轮播图内容或发布最新的公告与通知,确保用户及时获取平台的最新信息。
资源管理:管理员负责饮食资讯的管理。管理员可以通过资讯分类管理查看和调整各类饮食资讯的内容,确保平台上的资讯信息准确、有效,并且有序进行分类管理。
3.2.2 非功能性分析
个性化健康饮食推荐系统设计与实现需要具备性能、可靠性、安全性、可用性、扩展性等非功能性特征。系统应在长时间运行中保持稳定,用户界面简洁直观;具备高效的数据处理和响应速度;采取安全措施保护用户信息;根据用户反馈调整协同过滤推荐算法;方便用户进行食物信息搜索和排序;易于维护和管理,支持与其他系统互操作。设计和开发过程中需注重这些要求,以提供高质量、用户友好和可信赖的系统体验。具体如下3-1表格:
表3-1个性化健康饮食推荐系统非功能需求表
| 非功能性要求 | 说明 |
| 性能 | 评估响应时间、并发用户数、吞吐量等指标,以确保系统稳定高效地运行。 |
| 可靠性 | 评估系统的稳定性、容错能力和数据完整性,保障系统在故障情况下正常运行。 |
| 安全性 | 评估用户身份认证、数据加密和访问控制等,保护用户信息和交易的安全。 |
| 可用性 | 评估系统的稳定性、故障处理能力和用户界面友好性,提供良好的用户体验。 |
| 扩展性 | 评估系统的可扩展性和灵活性,以便根据需求进行功能扩展和升级。 |
系统用例分析是对个性化健康饮食推荐系统中各个功能模块的用户需求和行为进行分析,以识别和描述不同的用户用例。通过系统用例分析,可以深入了解用户在系统上的操作流程和交互方式,为系统设计和开发提供指导,并确保系统能够满足用户的需求和期望。
养生用户的系统用例分析主要关注用户如何通过系统获取个性化的健康饮食推荐。用户首先通过注册或登录进入系统,创建个人账户并维护基本信息。登录后,用户可以访问首页,浏览网站公告、饮食资讯、养生课程推荐等内容,也可通过关键词搜索来查找相关信息。食谱阅览模块展示各类食谱,用户可以查看详细信息,并根据自己的需求进行筛选、点赞、收藏和评论。系统根据用户的饮食偏好和健康数据,通过推荐算法为其生成个性化的饮食建议。此外,用户还可以记录每日饮食并提交反馈,系统会基于这些数据提供相应的健康分析建议。在个人中心,用户可以管理收藏的内容、查看自己的活动报名情况、饮食记录和分析结果,同时与管理员互动,提升平台的互动性和用户体验。养生用户用例图如图3-1所示。
图3-1 个性化健康饮食推荐系统养生用户角色用例图
管理员的系统用例分析主要涉及对平台内容和用户的管理。管理员通过后台登录系统,首先可以修改个人信息和密码,确保账户安全。系统用户管理模块允许管理员查看和管理养生用户及其他管理员的账号,包括增删改查用户信息。食谱、养生课程和活动广场管理模块支持管理员对食谱、课程和活动信息进行编辑、删除和添加,并管理用户评论,确保平台内容的质量和准确性。管理员还可查看和分析用户提交的饮食记录,进行健康分析并提供反馈。此外,管理员负责审核用户的活动报名,并查看用户的反馈内容,及时回复和处理。系统管理模块提供轮播图和网站公告的管理功能,确保平台信息的更新和展示。通过这些功能,管理员确保系统内容的稳定性、安全性和用户体验。管理员角色用例图如图3-2所示。
图3-2 个性化健康饮食推荐系统管理员角色用例图
以上论文主题的描述中没有提及具体的技术实现细节,因此在进一步研究中,可以探讨关于食物营养分析及协同过滤推荐算法、用户交互设计、系统安全性等方面的内容。同时,在实际开发中,需要考虑系统的可扩展性、性能优化和用户隐私保护等问题。
业务流程图既反映了内部业务间的相互联系,又反映了系统信息流动情况。个性化健康饮食推荐系统须支撑整个机构不同层面的多种职能,而各功能模块间存在着多种关联信息,组成一个有机整体,并针对食物信息自身特点和面临的现实条件,对系统进行业务流程图设计。系统通过流程的顺畅和高效,实现了食物营养分析需求的满足和系统管理的便捷,提升了系统的运行效率和用户体验。
活动图是一种用于对系统的动态行为建模的另一种常用图表,通常用于可视化展示系统中各个活动的执行顺序、流程控制和数据交互,展现从一个活动到另一个活动的控制流,活动图在本质上是一种流程图;但活动图着重表现从一个活动到另一个活动的控制流。因此,这里列举了2个业务活动图。
(1)用户登录查询的业务流程如下。
用户注册登录,系统从数据库获取用户数据信息,登录成功用户进入查询页面,用户输入查询关键字,数据库查询用户所输入的关键字,查询成功显示查询的模块信息,查询失败不显示。
用户登录查询功能的活动图如图3-3所示。
图3-3 用户登录查询活动图
(2)管理员添加信息的业务流程如下。
此活动图描述了管理员添加信息。管理员可以通过信息管理模块页面选择要添加的基本信息。添加成功传入数据库中,失败则不添加。管理员可以保存信息并更新系统中的信息。
管理员添加信息功能的活动图如图3-4所示。
从技术角度来看,个性化健康饮食推荐系统的架构设计至关重要。我们将采用MVC架构,包括表现层、业务逻辑层和数据访问层。表现层负责用户界面展示,业务逻辑层处理核心功能逻辑,数据访问层负责数据库交互。通过三层架构模式,确保系统的可靠性和可扩展性。
系统架构图如图4-1所示。
图4-1 系统架构图
通过整体功能模块设计,我们将根据需求分析的结果,将系统的功能划分为不同的模块。每个模块负责实现特定的功能,并与其他模块进行协作。我们将详细定义每个模块的输入、输出、处理逻辑和相互依赖关系。系统总体功能模块图如下图所示。
图4-2 个性化健康饮食推荐系统功能模块图
系统时序图是描述系统中各对象之间交互的图形化工具,本系统时序图主要展示个性化健康饮食推荐系统在用户登入系统、用户模块、个人中心、食谱阅览管理等,管理员模块时的流程。
在个性化健康饮食推荐系统中,登入是用户进入系统的第一步,也是判断用户身份和权限的重要环节。系统应该提供用户账号密码登入以及验证码登入等多种登入方式,以确保用户信息的安全性和便捷性。登入时序图的流程分析将帮助我们深入了解用户如何进行登入操作、系统如何验证用户身份、登入成功后如何跳转至相应界面等关键步骤。登入时序图如图4-3所示。
图4-3 登入时序图
用户模块是个性化健康饮食推荐系统的核心功能之一,该模块包括用户信息管理、食谱阅览、养生课程、活动广场、饮食记录、用户反馈等功能。通过用户模块时序图的流程分析,我们可以清晰地了解用户在系统中的操作流程,以及系统如何响应用户的请求并进行相应的处理。此外,用户模块时序图的分析还可以帮助我们优化用户体验,提高系统的用户友好性和操作便捷性。用户模块时序图如图4-4所示。
图4-4 用户模块时序图
个人中心模块是用户获取个人信息和操作历史记录的重要入口,用户可以在该模块中查看个人信息、修改密码、查看个人首页、食谱阅览、活动报名、饮食记录、饮食分析、用户反馈、收藏信息和评论管理等。个人中心时序图的分析将有助于我们深入了解用户在个人中心模块内的操作流程,以及系统如何处理用户请求并提供相应的信息展示。通过个人中心时序图的流程分析,我们可以优化用户体验,提高用户对系统的信任感和满意度。个人中心模块时序图如图4-5所示。
图4-5 个人中心模块时序图
养生课程管理模块是系统管理员专门用来管理和更新养生课程的功能模块,管理员通过该模块可以对养生课程进行添加、查询、重置和删除等操作。养生课程管理时序图的流程分析将有助于我们了解管理员在系统中如何管理养生课程信息,系统如何响应管理员的操作请求以及如何进行权限验证等关键步骤。通过养生课程管理时序图的分析,我们可以优化管理员操作流程,提高系统的管理效率和准确性。养生课程管理模块时序图如图4-6所示。
图4-6 养生课程管理模块时序图
管理员模块是个性化健康饮食推荐系统的管理者入口,管理员通过该模块可以对系统用户、食谱阅览管理、食谱类型管理、养生课程管理、课程类型管理、活动广场管理、活动报名管理、饮食记录管理、饮食分析管理、用户反馈管理、系统管理、网站公告管理、资源管理等主要模块信息进行增删改查操作。管理员模块时序图的流程分析将帮助我们深入了解管理员在系统中的操作流程,系统如何验证管理员身份和权限,以及如何处理管理员的请求并进行相应的管理操作。通过管理员模块时序图的分析,我们可以优化管理员的管理体验,提高系统的管理效率和安全性。管理员模块时序图如图4-7所示。
图4-7 管理员模块时序图
4.4 数据库设计
数据库设计一般包括需求分析、概念模型设计、数据库表建立三大过程,其中需求分析前面章节已经阐述,概念模型设计有概念模型和逻辑结构设计两部分。
4.4.1 数据库概念结构设计
本文在系统分析阶段就抽取了一些实体,根据实体之间的关系,经过分析进行系统E-R图的设计。下面是整个个性化健康饮食推荐系统中主要的数据库表总E-R实体关系图。
图4-8 个性化健康饮食推荐系统总E-R关系图
4.4.2 数据库逻辑结构设计
数据库是个性化健康饮食推荐系统的数据处理的基础,也是为界面数据的展示与存储的关键。个性化健康饮食推荐系统的主要数据库表如下。
| 编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
| 1 | token_id | int | 10 | 0 | N | Y | 临时访问牌ID | |
| 2 | token | varchar | 64 | 0 | Y | N | 临时访问牌 | |
| 3 | info | text | 65535 | 0 | Y | N | ||
| 4 | maxage | int | 10 | 0 | N | N | 2 | 最大寿命:默认2小时 |
| 5 | create_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 创建时间: |
| 6 | update_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 更新时间: |
| 7 | user_id | int | 10 | 0 | N | N | 0 | 用户编号: |
| 编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
| 1 | activity_square_id | int | 10 | 0 | N | Y | 活动广场ID | |
| 2 | event_name | varchar | 64 | 0 | Y | N | 活动名称 | |
| 3 | activity_pictures | varchar | 255 | 0 | Y | N | 活动图片 | |
| 4 | activity_time | datetime | 19 | 0 | Y | N | 活动时间 | |
| 5 | event_location | varchar | 64 | 0 | Y | N | 活动地点 | |
| 6 | event_overview | longtext | 2147483647 | 0 | Y | N | 活动简介 | |
| 7 | praise_len | int | 10 | 0 | N | N | 0 | 点赞数 |
| 8 | collect_len | int | 10 | 0 | N | N | 0 | 收藏数 |
| 9 | comment_len | int | 10 | 0 | N | N | 0 | 评论数 |
| 10 | event_registration_limit_times | int | 10 | 0 | N | N | 0 | 报名限制次数 |
| 11 | create_time | datetime | 19 | 0 | N | N | CURRENT_TIMESTAMP | 创建时间 |
| 12 | update_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 更新时间 |
| 编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
| 1 | article_id | mediumint | 8 | 0 | N | Y | 文章id:[0,8388607] | |
| 2 | title | varchar | 125 | 0 | N | Y | 标题:[0,125]用于文章和html的title标签中 | |
| 3 | type | varchar | 64 | 0 | N | N | 0 | 文章分类:[0,1000]用来搜索指定类型的文章 |
| 4 | hits | int | 10 | 0 | N | N | 0 | 点击数:[0,1000000000]访问这篇文章的人次 |
| 5 | praise_len | int | 10 | 0 | N | N | 0 | 点赞数 |
| 6 | create_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 创建时间: |
| 7 | update_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 更新时间: |
| 8 | source | varchar | 255 | 0 | Y | N | 来源:[0,255]文章的出处 | |
| 9 | url | varchar | 255 | 0 | Y | N | 来源地址:[0,255]用于跳转到发布该文章的网站 | |
| 10 | tag | varchar | 255 | 0 | Y | N | 标签:[0,255]用于标注文章所属相关内容,多个标签用空格隔开 | |
| 11 | content | longtext | 2147483647 | 0 | Y | N | 正文:文章的主体内容 | |
| 12 | img | varchar | 255 | 0 | Y | N | 封面图 | |
| 13 | description | text | 65535 | 0 | Y | N | 文章描述 |
| 编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
| 1 | type_id | smallint | 5 | 0 | N | Y | 分类ID:[0,10000] | |
| 2 | display | smallint | 5 | 0 | N | N | 100 | 显示顺序:[0,1000]决定分类显示的先后顺序 |
| 3 | name | varchar | 16 | 0 | N | N | 分类名称:[2,16] | |
| 4 | father_id | smallint | 5 | 0 | N | N | 0 | 上级分类ID:[0,32767] |
| 5 | description | varchar | 255 | 0 | Y | N | 描述:[0,255]描述该分类的作用 | |
| 6 | icon | text | 65535 | 0 | Y | N | 分类图标: | |
| 7 | url | varchar | 255 | 0 | Y | N | 外链地址:[0,255]如果该分类是跳转到其他网站的情况下,就在该URL上设置 | |
| 8 | create_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 创建时间: |
| 9 | update_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 更新时间: |
| 编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
| 1 | auth_id | int | 10 | 0 | N | Y | 授权ID: | |
| 2 | user_group | varchar | 64 | 0 | Y | N | 用户组: | |
| 3 | mod_name | varchar | 64 | 0 | Y | N | 模块名: | |
| 4 | table_name | varchar | 64 | 0 | Y | N | 表名: | |
| 5 | page_title | varchar | 255 | 0 | Y | N | 页面标题: | |
| 6 | path | varchar | 255 | 0 | Y | N | 路由路径: | |
| 7 | parent | varchar | 64 | 0 | Y | N | 父级菜单 | |
| 8 | parent_sort | int | 10 | 0 | N | N | 0 | 父级菜单排序 |
| 9 | position | varchar | 32 | 0 | Y | N | 位置: | |
| 10 | mode | varchar | 32 | 0 | N | N | _blank | 跳转方式: |
| 11 | add | tinyint | 3 | 0 | N | N | 1 | 是否可增加: |
| 12 | del | tinyint | 3 | 0 | N | N | 1 | 是否可删除: |
| 13 | set | tinyint | 3 | 0 | N | N | 1 | 是否可修改: |
| 14 | get | tinyint | 3 | 0 | N | N | 1 | 是否可查看: |
| 15 | field_add | text | 65535 | 0 | Y | N | 添加字段: | |
| 16 | field_set | text | 65535 | 0 | Y | N | 修改字段: | |
| 17 | field_get | text | 65535 | 0 | Y | N | 查询字段: | |
| 18 | table_nav_name | varchar | 500 | 0 | Y | N | 跨表导航名称: | |
| 19 | table_nav | varchar | 500 | 0 | Y | N | 跨表导航: | |
| 20 | option | text | 65535 | 0 | Y | N | 配置: | |
| 21 | create_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 创建时间: |
| 22 | update_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 更新时间: |
| 编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
| 1 | code_token_id | int | 10 | 0 | N | Y | ||
| 2 | token | varchar | 255 | 0 | Y | N | ||
| 3 | code | varchar | 255 | 0 | Y | N | 验证码 | |
| 4 | expire_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 失效时间 |
| 5 | create_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 创建时间 |
| 6 | update_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 更新时间: |
| 编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
| 1 | collect_id | int | 10 | 0 | N | Y | 收藏ID: | |
| 2 | user_id | int | 10 | 0 | N | N | 0 | 收藏人ID: |
| 3 | source_table | varchar | 255 | 0 | Y | N | 来源表: | |
| 4 | source_field | varchar | 255 | 0 | Y | N | 来源字段: | |
| 5 | source_id | int | 10 | 0 | N | N | 0 | 来源ID: |
| 6 | title | varchar | 255 | 0 | Y | N | 标题: | |
| 7 | img | varchar | 255 | 0 | Y | N | 封面: | |
| 8 | create_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 创建时间: |
| 9 | update_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 更新时间: |
| 编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
| 1 | comment_id | int | 10 | 0 | N | Y | 评论ID: | |
| 2 | user_id | int | 10 | 0 | N | N | 0 | 评论人ID: |
| 3 | reply_to_id | int | 10 | 0 | N | N | 0 | 回复评论ID:空为0 |
| 4 | content | longtext | 2147483647 | 0 | Y | N | 内容: | |
| 5 | nickname | varchar | 255 | 0 | Y | N | 昵称: | |
| 6 | avatar | varchar | 255 | 0 | Y | N | 头像地址:[0,255] | |
| 7 | create_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 创建时间: |
| 8 | update_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 更新时间: |
| 9 | source_table | varchar | 255 | 0 | Y | N | 来源表: | |
| 10 | source_field | varchar | 255 | 0 | Y | N | 来源字段: | |
| 11 | source_id | int | 10 | 0 | N | N | 0 | 来源ID: |
| 编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
| 1 | course_type_id | int | 10 | 0 | N | Y | 课程类型ID | |
| 2 | course_type | varchar | 64 | 0 | Y | N | 课程类型 | |
| 3 | create_time | datetime | 19 | 0 | N | N | CURRENT_TIMESTAMP | 创建时间 |
| 4 | update_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 更新时间 |
| 编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
| 1 | dietary_analysis_id | int | 10 | 0 | N | Y | 饮食分析ID | |
| 2 | todays_breakfast | varchar | 64 | 0 | Y | N | 今日早餐 | |
| 3 | todays_lunch | varchar | 64 | 0 | Y | N | 今日午餐 | |
| 4 | tonights_dinner | varchar | 64 | 0 | Y | N | 今日晚餐 | |
| 5 | record_date | date | 10 | 0 | Y | N | 记录日期 | |
| 6 | record_users | int | 10 | 0 | Y | N | 0 | 记录用户 |
| 7 | user_name | varchar | 64 | 0 | Y | N | 用户姓名 | |
| 8 | nutritional_index | varchar | 64 | 0 | Y | N | 营养指数 | |
| 9 | health_index | varchar | 64 | 0 | Y | N | 健康指数 | |
| 10 | dietary_evaluation | text | 65535 | 0 | Y | N | 饮食评价 | |
| 11 | create_time | datetime | 19 | 0 | N | N | CURRENT_TIMESTAMP | 创建时间 |
| 12 | update_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 更新时间 |
| 13 | source_table | varchar | 255 | 0 | Y | N | 来源表 | |
| 14 | source_id | int | 10 | 0 | Y | N | 来源ID | |
| 15 | source_user_id | int | 10 | 0 | Y | N | 来源用户 |
| 编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
| 1 | dietary_records_id | int | 10 | 0 | N | Y | 饮食记录ID | |
| 2 | todays_breakfast | varchar | 64 | 0 | Y | N | 今日早餐 | |
| 3 | todays_lunch | varchar | 64 | 0 | Y | N | 今日午餐 | |
| 4 | tonights_dinner | varchar | 64 | 0 | Y | N | 今日晚餐 | |
| 5 | record_date | date | 10 | 0 | Y | N | 记录日期 | |
| 6 | record_users | int | 10 | 0 | Y | N | 0 | 记录用户 |
| 7 | user_name | varchar | 64 | 0 | Y | N | 用户姓名 | |
| 8 | dietary_analysis_limit_times | int | 10 | 0 | N | N | 1 | 分析限制次数 |
| 9 | create_time | datetime | 19 | 0 | N | N | CURRENT_TIMESTAMP | 创建时间 |
| 10 | update_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 更新时间 |
| 编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
| 1 | event_registration_id | int | 10 | 0 | N | Y | 活动报名ID | |
| 2 | event_name | varchar | 64 | 0 | Y | N | 活动名称 | |
| 3 | activity_time | datetime | 19 | 0 | Y | N | 活动时间 | |
| 4 | event_location | varchar | 64 | 0 | Y | N | 活动地点 | |
| 5 | registered_users | int | 10 | 0 | Y | N | 0 | 报名用户 |
| 6 | user_name | varchar | 64 | 0 | Y | N | 用户姓名 | |
| 7 | examine_state | varchar | 16 | 0 | N | N | 未审核 | 审核状态 |
| 8 | create_time | datetime | 19 | 0 | N | N | CURRENT_TIMESTAMP | 创建时间 |
| 9 | update_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 更新时间 |
| 10 | source_table | varchar | 255 | 0 | Y | N | 来源表 | |
| 11 | source_id | int | 10 | 0 | Y | N | 来源ID | |
| 12 | source_user_id | int | 10 | 0 | Y | N | 来源用户 |
| 编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
| 1 | health_course_id | int | 10 | 0 | N | Y | 养生课程ID | |
| 2 | course_name | varchar | 64 | 0 | Y | N | 课程名称 | |
| 3 | course_preview | varchar | 255 | 0 | Y | N | 课程预览 | |
| 4 | course_video | varchar | 255 | 0 | Y | N | 课程视频 | |
| 5 | course_type | varchar | 64 | 0 | Y | N | 课程类型 | |
| 6 | main_lecturer | varchar | 64 | 0 | Y | N | 主讲老师 | |
| 7 | course_details | longtext | 2147483647 | 0 | Y | N | 课程详情 | |
| 8 | praise_len | int | 10 | 0 | N | N | 0 | 点赞数 |
| 9 | collect_len | int | 10 | 0 | N | N | 0 | 收藏数 |
| 10 | comment_len | int | 10 | 0 | N | N | 0 | 评论数 |
| 11 | create_time | datetime | 19 | 0 | N | N | CURRENT_TIMESTAMP | 创建时间 |
| 12 | update_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 更新时间 |
| 编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
| 1 | health_users_id | int | 10 | 0 | N | Y | 养生用户ID | |
| 2 | user_name | varchar | 64 | 0 | Y | N | 用户姓名 | |
| 3 | user_gender | varchar | 64 | 0 | Y | N | 用户性别 | |
| 4 | phone_number | varchar | 16 | 0 | N | N | 手机号码 | |
| 5 | examine_state | varchar | 16 | 0 | N | N | 已通过 | 审核状态 |
| 6 | user_id | int | 10 | 0 | N | N | 0 | 用户ID |
| 7 | create_time | datetime | 19 | 0 | N | N | CURRENT_TIMESTAMP | 创建时间 |
| 8 | update_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 更新时间 |
| 编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
| 1 | hits_id | int | 10 | 0 | N | Y | 点赞ID: | |
| 2 | user_id | int | 10 | 0 | N | N | 0 | 点赞人: |
| 3 | create_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 创建时间: |
| 4 | update_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 更新时间: |
| 5 | source_table | varchar | 255 | 0 | Y | N | 来源表: | |
| 6 | source_field | varchar | 255 | 0 | Y | N | 来源字段: | |
| 7 | source_id | int | 10 | 0 | N | N | 0 | 来源ID: |
| 编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
| 1 | notice_id | mediumint | 8 | 0 | N | Y | 公告id: | |
| 2 | title | varchar | 125 | 0 | N | N | 标题: | |
| 3 | content | longtext | 2147483647 | 0 | Y | N | 正文: | |
| 4 | create_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 创建时间: |
| 5 | update_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 更新时间: |
| 编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
| 1 | praise_id | int | 10 | 0 | N | Y | 点赞ID: | |
| 2 | user_id | int | 10 | 0 | N | N | 0 | 点赞人: |
| 3 | create_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 创建时间: |
| 4 | update_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 更新时间: |
| 5 | source_table | varchar | 255 | 0 | Y | N | 来源表: | |
| 6 | source_field | varchar | 255 | 0 | Y | N | 来源字段: | |
| 7 | source_id | int | 10 | 0 | N | N | 0 | 来源ID: |
| 8 | status | bit | 1 | 0 | N | N | 1 | 点赞状态:1为点赞,0已取消 |
| 编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
| 1 | recipe_reading_id | int | 10 | 0 | N | Y | 食谱阅览ID | |
| 2 | recipe_name | varchar | 64 | 0 | Y | N | 食谱名称 | |
| 3 | finished_product_image | varchar | 255 | 0 | Y | N | 成品图片 | |
| 4 | recipe_type | varchar | 64 | 0 | Y | N | 食谱类型 | |
| 5 | main_ingredients | varchar | 64 | 0 | Y | N | 主要食材 | |
| 6 | nutritive_value | varchar | 64 | 0 | Y | N | 营养价值 | |
| 7 | share_users | int | 10 | 0 | Y | N | 0 | 分享用户 |
| 8 | user_name | varchar | 64 | 0 | Y | N | 用户姓名 | |
| 9 | recipe_details | longtext | 2147483647 | 0 | Y | N | 食谱详情 | |
| 10 | hits | int | 10 | 0 | N | N | 0 | 点击数 |
| 11 | praise_len | int | 10 | 0 | N | N | 0 | 点赞数 |
| 12 | collect_len | int | 10 | 0 | N | N | 0 | 收藏数 |
| 13 | comment_len | int | 10 | 0 | N | N | 0 | 评论数 |
| 14 | recommend | int | 10 | 0 | N | N | 0 | 智能推荐 |
| 15 | create_time | datetime | 19 | 0 | N | N | CURRENT_TIMESTAMP | 创建时间 |
| 16 | update_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 更新时间 |
| 编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
| 1 | recipe_type_id | int | 10 | 0 | N | Y | 食谱类型ID | |
| 2 | recipe_type | varchar | 64 | 0 | Y | N | 食谱类型 | |
| 3 | create_time | datetime | 19 | 0 | N | N | CURRENT_TIMESTAMP | 创建时间 |
| 4 | update_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 更新时间 |
| 编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
| 1 | schedule_id | smallint | 5 | 0 | N | Y | 日程ID:[0,32767] | |
| 2 | content | varchar | 255 | 0 | Y | N | 日程内容 | |
| 3 | scheduled_time | datetime | 19 | 0 | Y | N | 计划时间 | |
| 4 | user_id | int | 10 | 0 | N | N | 用户id | |
| 5 | create_time | datetime | 19 | 0 | Y | N | 创建时间 | |
| 6 | update_time | datetime | 19 | 0 | Y | N | 更新时间 |
| 编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
| 1 | score_id | int | 10 | 0 | N | Y | 评分ID: | |
| 2 | user_id | int | 10 | 0 | N | N | 0 | 评分人: |
| 3 | nickname | varchar | 64 | 0 | Y | N | 昵称: | |
| 4 | score_num | double | 5 | 2 | N | N | 0.00 | 评分: |
| 5 | create_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 创建时间: |
| 6 | update_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 更新时间: |
| 7 | source_table | varchar | 255 | 0 | Y | N | 来源表: | |
| 8 | source_field | varchar | 255 | 0 | Y | N | 来源字段: | |
| 9 | source_id | int | 10 | 0 | N | N | 0 | 来源ID: |
表slides (轮播图)
| 编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
| 1 | slides_id | int | 10 | 0 | N | Y | 轮播图ID: | |
| 2 | title | varchar | 64 | 0 | Y | N | 标题: | |
| 3 | content | varchar | 255 | 0 | Y | N | 内容: | |
| 4 | url | varchar | 255 | 0 | Y | N | 链接: | |
| 5 | img | varchar | 255 | 0 | Y | N | 轮播图: | |
| 6 | hits | int | 10 | 0 | N | N | 0 | 点击量: |
| 7 | create_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 创建时间: |
| 8 | update_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 更新时间: |
表upload (文件上传)
| 编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
| 1 | upload_id | int | 10 | 0 | N | Y | 上传ID | |
| 2 | name | varchar | 64 | 0 | Y | N | 文件名 | |
| 3 | path | varchar | 255 | 0 | Y | N | 访问路径 | |
| 4 | file | varchar | 255 | 0 | Y | N | 文件路径 | |
| 5 | display | varchar | 255 | 0 | Y | N | 显示顺序 | |
| 6 | father_id | int | 10 | 0 | Y | N | 0 | 父级ID |
| 7 | dir | varchar | 255 | 0 | Y | N | 文件夹 | |
| 8 | type | varchar | 32 | 0 | Y | N | 文件类型 |
表user (用户账户:用于保存用户登录信息)
| 编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
| 1 | user_id | int | 10 | 0 | N | Y | 用户ID:[0,8388607]用户获取其他与用户相关的数据 | |
| 2 | state | smallint | 5 | 0 | N | N | 1 | 账户状态:[0,10](1可用|2异常|3已冻结|4已注销) |
| 3 | user_group | varchar | 32 | 0 | Y | N | 所在用户组:[0,32767]决定用户身份和权限 | |
| 4 | login_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 上次登录时间: |
| 5 | phone | varchar | 11 | 0 | Y | N | 手机号码:[0,11]用户的手机号码,用于找回密码时或登录时 | |
| 6 | phone_state | smallint | 5 | 0 | N | N | 0 | 手机认证:[0,1](0未认证|1审核中|2已认证) |
| 7 | username | varchar | 16 | 0 | N | N | 用户名:[0,16]用户登录时所用的账户名称 | |
| 8 | nickname | varchar | 16 | 0 | Y | N | 昵称:[0,16] | |
| 9 | password | varchar | 64 | 0 | N | N | 密码:[0,32]用户登录所需的密码,由6-16位数字或英文组成 | |
| 10 | | varchar | 64 | 0 | Y | N | 邮箱:[0,64]用户的邮箱,用于找回密码时或登录时 | |
| 11 | email_state | smallint | 5 | 0 | N | N | 0 | 邮箱认证:[0,1](0未认证|1审核中|2已认证) |
| 12 | avatar | varchar | 255 | 0 | Y | N | 头像地址:[0,255] | |
| 13 | open_id | varchar | 255 | 0 | Y | N | 针对获取用户信息字段 | |
| 14 | create_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 创建时间: |
| 编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
| 1 | user_feedback_id | int | 10 | 0 | N | Y | 用户反馈ID | |
| 2 | submit_user | int | 10 | 0 | Y | N | 0 | 提交用户 |
| 3 | feedback_date | date | 10 | 0 | Y | N | 反馈日期 | |
| 4 | feedback_content | text | 65535 | 0 | Y | N | 反馈内容 | |
| 5 | examine_state | varchar | 16 | 0 | N | N | 未审核 | 审核状态 |
| 6 | examine_reply | varchar | 16 | 0 | Y | N | 审核回复 | |
| 7 | create_time | datetime | 19 | 0 | N | N | CURRENT_TIMESTAMP | 创建时间 |
| 8 | update_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 更新时间 |
表user_group (用户组:用于用户前端身份和鉴权)
| 编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
| 1 | group_id | mediumint | 8 | 0 | N | Y | 用户组ID:[0,8388607] | |
| 2 | display | smallint | 5 | 0 | N | N | 100 | 显示顺序:[0,1000] |
| 3 | name | varchar | 16 | 0 | N | N | 名称:[0,16] | |
| 4 | description | varchar | 255 | 0 | Y | N | 描述:[0,255]描述该用户组的特点或权限范围 | |
| 5 | source_table | varchar | 255 | 0 | Y | N | 来源表: | |
| 6 | source_field | varchar | 255 | 0 | Y | N | 来源字段: | |
| 7 | source_id | int | 10 | 0 | N | N | 0 | 来源ID: |
| 8 | register | smallint | 5 | 0 | Y | N | 0 | 注册位置: |
| 9 | create_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 创建时间: |
| 10 | update_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 更新时间: |
个性化健康饮食推荐系统的详细设计与实现主要是根据前面的个性化健康饮食推荐系统的需求分析和个性化健康饮食推荐系统的总体设计来设计页面并实现业务逻辑。主要从个性化健康饮食推荐系统界面实现、业务逻辑实现这两部分进行介绍。
5.1用户功能模块
5.1.1 前台首页界面
前台首页界面是用户访问系统的入口页面,它应该展示平台的主要功能和特色,并提供导航链接以便用户浏览和搜索信息。首页界面的设计应注重页面的美观性和用户体验,同时也需要考虑页面的加载速度和响应性能。
首页载入流程图如下所示。
图5-1 首页载入流程图
系统首页实现效果如下图5-2所示。
图5-2 前台首页界面图
5.1.2 用户注册界面
用户注册界面是个性化健康饮食推荐系统中的重要组成部分。该界面包含一个注册表单,其中用户需要填写用户名、密码、确认密码、电子邮箱、用户姓名、性别和手机号码等信息。为了确保安全性,还可以添加验证码字段。用户需要勾选同意系统的用户协议和隐私政策才能继续注册。注册过程中,系统应提供错误提示,及时指出输入信息的错误或不完整,并引导用户进行修正。通过这样的设计,用户可以方便地填写个人信息并完成注册,同时确保注册过程的安全和准确性。
注册流程图如下图5-3所示。
图5-3 注册流程图
用户注册界面展示如下图5-4所示。
图5-4注册界面图
注册关键代码如下:
/**
* 注册
* @param user
* @return
*/
@PostMapping("register")
public Map<String, Object> signUp(@RequestBody User user) {
// 查询用户
Map<String, String> query = new HashMap<>();
Map<String,Object> map = JSON.parseObject(JSON.toJSONString(user));
query.put("username",user.getUsername());
List list = service.selectBaseList(service.select(query, new HashMap<>()));
if (list.size()>0){
return error(30000, "用户已存在");
}
map.put("password",service.encryption(String.valueOf(map.get("password"))));
service.insert(map);
return success(1);
}
5.1.3 用户登录界面
个性化健康饮食推荐系统中的前台上注册后的用户是可以通过自己的账户名和密码进行登录的,当养生用户输入完整的自己的账户名和密码信息并点击“登录”按钮后,将会首先验证输入的有没有空数据,再次验证输入的账户名+密码和数据库中当前保存的用户信息是否一致,只有在一致后将会登录成功并自动跳转到个性化健康饮食推荐系统的首页中;否则将会提示相应错误信息。
登录流程图如下图所示。
图5-5登录流程图
用户登录界面如下图5-6所示。
图5-6用户登录界面图
登录代码如下:
/**
* 登录
* @param data
* @param httpServletRequest
* @return
*/
@PostMapping("login")
public Map<String, Object> login(@RequestBody Map<String, String> data, HttpServletRequest httpServletRequest) {
log.info("[执行登录接口]");
String username = data.get("username");
String email = data.get("email");
String phone = data.get("phone");
String password = data.get("password");
List resultList = null;
Map<String, String> map = new HashMap<>();
if(username != null && "".equals(username) == false){
map.put("username", username);
resultList = service.selectBaseList(service.select(map, new HashMap<>()));
}
else if(email != null && "".equals(email) == false){
map.put("email", email);
resultList = service.selectBaseList(service.select(map, new HashMap<>()));
}
else if(phone != null && "".equals(phone) == false){
map.put("phone", phone);
resultList = service.selectBaseList(service.select(map, new HashMap<>()));
}else{
return error(30000, "账号或密码不能为空");
}
if (resultList == null || password == null) {
return error(30000, "账号或密码不能为空");
}
//判断是否有这个用户
if (resultList.size()<=0){
return error(30000,"用户不存在");
}
User byUsername = (User) resultList.get(0);
Map<String, String> groupMap = new HashMap<>();
groupMap.put("name",byUsername.getUserGroup());
List groupList = userGroupService.selectBaseList(userGroupService.select(groupMap, new HashMap<>()));
if (groupList.size()<1){
return error(30000,"用户组不存在");
}
UserGroup userGroup = (UserGroup) groupList.get(0);
//查询用户审核状态
if (!StringUtils.isEmpty(userGroup.getSourceTable())){
String res = service.selectExamineState(userGroup.getSourceTable(),byUsername.getUserId());
if (res==null){
return error(30000,"用户不存在");
}
if (!res.equals("已通过")){
return error(30000,"该用户审核未通过");
}
}
//查询用户状态
if (byUsername.getState()!=1){
return error(30000,"用户非可用状态,不能登录");
}
String md5password = service.encryption(password);
if (byUsername.getPassword().equals(md5password)) {
// 存储Token到数据库
AccessToken accessToken = new AccessToken();
accessToken.setToken(UUID.randomUUID().toString().replaceAll("-", ""));
accessToken.setUser_id(byUsername.getUserId());
Duration duration = Duration.ofSeconds(7200L);
redisTemplate.opsForValue().set(accessToken.getToken(), accessToken,duration);
// 返回用户信息
JSONObject user = JSONObject.parseObject(JSONObject.toJSONString(byUsername));
user.put("token", accessToken.getToken());
JSONObject ret = new JSONObject();
ret.put("obj",user);
return success(ret);
} else {
return error(30000, "账号或密码不正确");
}
}
查看各类食谱阅览列表详情,如食谱名称、类型、主要食材、营养价值、分享用户等,并通过输入关键字食谱名称、食谱类型或选择排序进行搜索。用户可以对喜欢的食谱进行点赞、收藏和评论,在详情页中查看点赞数、点击数并进行评分打分,食谱阅览界面如下图5-7所示。
图5-7食谱阅览界面图
查看各类养生课程列表详情,包括课程名称、类型、主讲老师等,并通过输入关键字课程名称或选择排序进行搜索。用户可以对喜欢的课程进行点赞、收藏和评论回复,在详情页中查看点赞数、课程视频并对课程进行评分打分。养生课程界面如下图5-8所示。
图5-8养生课程界面图
查看各类活动广场列表详情,如活动名称、时间、地点等,并通过输入关键字活动名称或选择排序进行搜索。用户可以对喜欢的活动进行点赞、收藏和评论回复并报名参加,在详情页中查看点赞数。活动广场详情界面如下图5-9所示。
图5-9活动广场详情界面图
例如,报名活动界面如下图5-10所示。
图5-10 报名活动界面图
5.1.7 饮食记录界面
用户可以输入今日早餐、午餐、晚餐,并选择记录日期提交饮食记录,方便日后查询和分析。饮食记录提交界面如下图5-11所示。
图5-11 饮食记录提交界面图
用户可以选择反馈日期,输入反馈内容提交反馈,与平台管理人员沟通交流。用户反馈界面如下图5-12所示。
图5-12 用户反馈界面图
查看食谱阅览详情,支持通过输入食谱名称、选择食谱类型进行搜索,并对页面执行增删改查等操作,个人中心-食谱阅览界面如下图5-13所示。
图5-13个人中心-食谱阅览界面图
例如,添加食谱界面如下图5-14所示。
图5-14 添加食谱界面图
添加食谱的关键代码如下:
@PostMapping("/add")
@Transactional
public Map<String, Object> add(HttpServletRequest request) throws IOException {
service.insert(service.readBody(request.getReader()));
return success(1);
}
@Transactional
public Map<String, Object> addMap(Map<String,Object> map){
service.insert(map);
return success(1);
}
public Map<String,Object> readBody(BufferedReader reader){
BufferedReader br = null;
StringBuilder sb = new StringBuilder("");
try{
br = reader;
String str;
while ((str = br.readLine()) != null){
sb.append(str);
}
br.close();
String json = sb.toString();
return JSONObject.parseObject(json, Map.class);
}catch (IOException e){
e.printStackTrace();
}finally{
if (null != br){
try{
br.close();
}catch (IOException e){
e.printStackTrace();
}
}
}
return null;
}
public void insert(Map<String,Object> body){
StringBuffer sql = new StringBuffer("INSERT INTO ");
sql.append("`").append(table).append("`").append(" (");
for (Map.Entry<String,Object> entry:body.entrySet()){
sql.append("`"+humpToLine(entry.getKey())+"`").append(",");
}
sql.deleteCharAt(sql.length()-1);
sql.append(") VALUES (");
for (Map.Entry<String,Object> entry:body.entrySet()){
Object value = entry.getValue();
if (value instanceof String){
sql.append("'").append(entry.getValue()).append("'").append(",");
}else {
sql.append(entry.getValue()).append(",");
}
}
sql.deleteCharAt(sql.length() - 1);
sql.append(")");
log.info("[{}] - 插入操作:{}",table,sql);
Query query = runCountSql(sql.toString());
query.executeUpdate();
}
查看管理员对前台记录的饮食进行分析详情,支持通过选择记录日期开始至结束进行搜索,并对页面执行查询、重置等操作,个人中心-饮食分析界面如下图5-15所示。
图5-15 饮食分析界面图
5.2管理员功能模块
管理员负责管理所有用户的账号,包括管理员和养生用户。支持通过输入用户姓名、手机号码进行搜索,并能进行增删改查操作。系统用户界面如下图5-16所示。
图5-16 系统用户界面图
修改用户账户的关键代码如下:
@PostMapping("/set")
@Transactional
public Map<String, Object> set(HttpServletRequest request) throws IOException {
service.update(service.readQuery(request), service.readConfig(request), service.readBody(request.getReader()));
return success(1);
}
public Map<String,String> readConfig(HttpServletRequest request){
Map<String,String> map = new HashMap<>();
map.put(FindConfig.PAGE,request.getParameter(FindConfig.PAGE));
map.put(FindConfig.SIZE,request.getParameter(FindConfig.SIZE));
map.put(FindConfig.LIKE,request.getParameter(FindConfig.LIKE));
map.put(FindConfig.ORDER_BY,request.getParameter(FindConfig.ORDER_BY));
map.put(FindConfig.FIELD,request.getParameter(FindConfig.FIELD));
map.put(FindConfig.GROUP_BY,request.getParameter(FindConfig.GROUP_BY));
map.put(FindConfig.MAX_,request.getParameter(FindConfig.MAX_));
map.put(FindConfig.MIN_,request.getParameter(FindConfig.MIN_));
return map;
}
public Map<String,String> readQuery(HttpServletRequest request){
String queryString = request.getQueryString();
if (queryString != null && !"".equals(queryString)) {
String[] querys = queryString.split("&");
Map<String, String> map = new HashMap<>();
for (String query : querys) {
String[] q = query.split("=");
map.put(q[0], q[1]);
}
map.remove(FindConfig.PAGE);
map.remove(FindConfig.SIZE);
map.remove(FindConfig.LIKE);
map.remove(FindConfig.ORDER_BY);
map.remove(FindConfig.FIELD);
map.remove(FindConfig.GROUP_BY);
map.remove(FindConfig.MAX_);
map.remove(FindConfig.MIN_);
return map;
}else {
return new HashMap<>();
}
}
@Transactional
public void update(Map<String,String> query,Map<String,String> config,Map<String,Object> body){
StringBuffer sql = new StringBuffer("UPDATE ").append("`").append(table).append("`").append(" SET ");
for (Map.Entry<String,Object> entry:body.entrySet()){
Object value = entry.getValue();
if (value instanceof String){
sql.append("`"+humpToLine(entry.getKey())+"`").append("=").append("'").append(value).append("'").append(",");
}else {
sql.append("`"+humpToLine(entry.getKey())+"`").append("=").append(value).append(",");
}
}
sql.deleteCharAt(sql.length()-1);
sql.append(toWhereSql(query,"0".equals(config.get(FindConfig.LIKE))));
log.info("[{}] - 更新操作:{}",table,sql);
Query query1 = runCountSql(sql.toString());
query1.executeUpdate();
}
public String toWhereSql(Map<String,String> query, Boolean like) {
if (query.size() > 0) {
try {
StringBuilder sql = new StringBuilder(" WHERE ");
for (Map.Entry<String, String> entry : query.entrySet()) {
if (entry.getKey().contains(FindConfig.MIN_)) {
String min = humpToLine(entry.getKey()).replace("_min", "");
sql.append("`"+min+"`").append(" >= '").append(URLDecoder.decode(entry.getValue(), "UTF-8")).append("' and ");
continue;
}
if (entry.getKey().contains(FindConfig.MAX_)) {
String max = humpToLine(entry.getKey()).replace("_max", "");
sql.append("`"+max+"`").append(" <= '").append(URLDecoder.decode(entry.getValue(), "UTF-8")).append("' and ");
continue;
}
if (like == true) {
sql.append("`"+humpToLine(entry.getKey())+"`").append(" LIKE '%").append(URLDecoder.decode(entry.getValue(), "UTF-8")).append("%'").append(" and ");
} else {
sql.append("`"+humpToLine(entry.getKey())+"`").append(" = '").append(URLDecoder.decode(entry.getValue(), "UTF-8")).append("'").append(" and ");
}
}
sql.delete(sql.length() - 4, sql.length());
sql.append(" ");
return sql.toString();
} catch (UnsupportedEncodingException e) {
log.info("拼接sql 失败:{}", e.getMessage());
}
}
return "";
}
5.2.2食谱阅览管理界面
管理员可查看各食谱的详情,包括食谱名称、类型、营养成分等,并可以对食谱的相关信息进行修改、删除等操作。同时,管理员也可管理用户对食谱的评论。食谱阅览管理界面如下图5-17所示。
图5-17 食谱阅览管理界面图
管理员可查看各类养生课程的详细信息,并管理用户对课程的评论。管理员可根据课程名称进行搜索,并对课程进行修改、删除等操作。此外,管理员还可上传课程视频和选择课程主讲老师。养生课程界面如下图5-18所示。
图5-18养生课程管理界面图
例如,添加课程界面如下图5-19所示。
图5-19添加课程管理界面图
查看用户的活动报名详情并进行审核,支持通过输入活动名称、活动地点、选择审核状态进行搜索,并能进行查询、重置、删除等操作。活动报名界面如下图5-20所示。
图5-20 活动报名管理界面图
例如,审核活动报名界面如下图5-21所示。
图5-21 审核活动报名界面图
5.2.5饮食记录管理界面
管理员对用户提交的饮食记录进行分析,并提供相关健康建议。管理员可查看分析结果,帮助用户优化饮食习惯。饮食记录管理界面如下图5-22所示。
图5-22饮食记录管理界面图
例如,分析饮食界面如下图5-23所示。
图5-23 分析饮食界面图
管理员查看各轮播图信息详情,支持通过输入标题进行搜索,并能进行增删改查操作。系统管理界面如下图5-24所示。
图5-24 系统管理界面图
6.1 测试目的
在对该系统进行完详细设计和编码之后,就要对个性化健康饮食推荐系统的程序进行测试,检测程序是否运行无误,反复进行测试和修改,使之最后成为完整的软件,满足用户的需求,实现预期的功能。系统测试的目的在于确保软件正常运作,并实现其应有的功能,促进行中出现的错误和逻辑问题。系统测试不但可以找见程序运行中的系统错误,还可以找见程序运行的需要改进的地方,并去协助改良程序运行使其获得最高幅度的完备。世界一流的安装测试员可以增加软件品质,将软件系统错误概率降至最少。
6.2 功能测试
本系统的主要功能就是养生用户登录后,可搜索和浏览食物信息,并可提交饮食记录;管理员登录系统后台后可对食物信息进行管理,包括增改删查操作。测试设计如下所示:
用户登录前首先需注册成为系统用户,使用账号和密码可进行登录。用户登录功能测试用例设计如下表所示:
表6-1 用户登录功功能测试用例
| 测试编号 | 测试目的 | 测试步骤 | 预期结果 | 实际结果 | 是否通过 |
| TC001 | 验证有效登录 | 1. 输入正确的用户名和密码 <br> 2. 点击登录按钮 | 显示登录成功,跳转至用户首页 | 登录成功,跳转至用户首页 | 通过 |
| TC002 | 验证空用户名登录 | 1. 不输入用户名,输入正确密码 <br> 2. 点击登录按钮 | 显示用户名不能为空提示信息 | 显示用户名不能为空提示信息 | 通过 |
| TC003 | 验证空密码登录 | 1. 输入正确用户名,不输入密码 <br> 2. 点击登录按钮 | 显示密码不能为空提示信息 | 显示密码不能为空提示信息 | 通过 |
| TC004 | 验证错误用户名登录 | 1. 输入错误的用户名和正确密码 <br> 2. 点击登录按钮 | 显示用户名或密码错误提示信息 | 显示用户名或密码错误提示信息 | 通过 |
| TC005 | 验证错误密码登录 | 1. 输入正确用户名和错误密码 <br> 2. 点击登录按钮 | 显示用户名或密码错误提示信息 | 显示用户名或密码错误提示信息 | 通过 |
- 食谱阅览模块功能测试
食谱阅览模块测试包括食谱阅览展示功能测试、食谱阅览添加功能测试、食谱阅览搜索功能测试、评分打分功能测试。食谱阅览模块测试用例如表6.2-6.5所示。
食谱阅览展示功能测试用例设计如下表所示:
表6-2 食谱阅览展示功能测试用例
| 测试编号 | 测试目的 | 测试步骤 | 预期结果 | 实际结果 | 是否通过 |
| TC001 | 验证正常展示食谱阅览 | 1. 进入食谱阅览展示页面 <br> 2. 浏览展示的食谱阅览内容 | 能够正常显示食谱阅览内容 | 食谱阅览内容正常显示 | 通过 |
| TC002 | 验证食谱阅览链接跳转 | 1. 进入食谱阅览展示页面 <br> 2. 点击食谱阅览链接 | 能够跳转至相应食谱阅览详情页面 | 成功跳转至食谱阅览详情页面 | 通过 |
| TC003 | 验证搜索功能 | 1. 进入食谱阅览展示页面 <br> 2. 使用搜索功能搜索食谱阅览 | 显示符合搜索条件的食谱阅览列表 | 显示符合搜索条件的食谱阅览列表 | 通过 |
| TC004 | 验证食谱类型展示 | 1. 进入食谱阅览展示页面 <br> 2. 选择食谱类型 | 显示该分类下的食谱阅览列表 | 成功显示该分类下的食谱阅览列表 | 通过 |
| TC005 | 验证食谱阅览的评论功能 | 1. 进入食谱阅览详情展示页面 <br> 2. 查看食谱阅览并发表评论 | 评论成功显示在食谱阅览页面 | 评论成功显示在食谱阅览页面 | 通过 |
| TC006 | 验证评分打分页面跳转 | 1. 进入食谱阅览详情展示页面 <br> 2. 点击评分按钮进行打分 | 能够成功进行打分显示打分 | 成功进行打分 | 通过 |
活动广场添加功能测试用例设计如下表所示:
表6-3 活动广场添加功能测试用例
| 测试编号 | 测试目的 | 测试步骤 | 预期结果 | 实际结果 | 是否通过 |
| TC001 | 验证添加活动广场 | 1. 进入活动广场添加界面 <br> 2. 输入活动名称 <br> 3. 点击添加按钮 | 活动名称成功添加到系统页面中 | 活动名称成功添加到系统页面中 | 通过 |
| TC002 | 验证添加活动广场 | 1. 进入活动广场添加界面 <br> 2. 输入活动地点 <br> 3. 点击添加按钮 | 活动地点成功添加到系统页面中 | 活动地点成功添加到系统页面中 | 通过 |
| TC003 | 验证活动广场活动时间选择 | 1. 进入活动广场添加界面 <br> 2. 选择活动时间 <br> 3. 输入活动广场信息 <br> 4. 提交活动广场信息 | 根据选择的活动广场时间成功添加活动广场 | 根据选择的活动广场时间成功添加活动广场 | 通过 |
| TC004 | 验证活动广场内容输入 | 1. 进入活动广场添加界面 <br> 2. 输入正确活动广场内容和答案 <br> 3. 点击添加按钮 | 活动广场内容成功录入系统 | 活动广场内容成功录入系统 | 通过 |
| TC005 | 验证活动广场图片上传 | 1. 进入活动广场添加界面 <br> 2. 上传活动广场相关图片 <br> 3. 点击添加按钮 | 图片成功上传并与活动广场关联 | 图片成功上传并与活动广场关联 | 通过 |
养生课程搜索功能测试用例设计如下表所示:
表6-4 养生课程搜索功能测试用例
| 测试编号 | 测试目的 | 测试步骤 | 预期结果 | 实际结果 | 是否通过 |
| TC001 | 验证养生课程输入课程名称搜索 | 1. 进入养生课程搜索界面 <br> 2. 输入课程名称 <br> 3. 确认并搜索 | 根据选择的课程名称关键词显示相关养生课程信息 | 根据选择的课程名称关键词成功显示相关养生课程信息 | 通过 |
| TC002 | 验证养生课程下拉排序搜索 | 1. 进入养生课程搜索界面 <br> 2. 选择下拉排序<br> 3. 确认并搜索 | 根据选择下拉排序显示相关养生课程信息 | 根据选择下拉排序成功显示相关养生课程信息 | 通过 |
饮食记录功能测试用例设计如下表所示:
表6-5 饮食记录功能测试用例
| 测试编号 | 测试目的 | 测试步骤 | 预期结果 | 实际结果 | 是否通过 |
| TC001 | 验证未输入今日早餐,点击提交 | 1. 进入饮食记录界面 <br> 2.未输入今日早餐,点击提交 <br> 3. 点击提交按钮 | 提示请输入今日早餐 | 提示请输入今日早餐 | 通过 |
| TC002 | 验证未选择记录日期,点击提交 | 1. 进入饮食记录界面 <br> 2.未选择记录日期,点击提交 <br> 3. 点击提交按钮 | 提示请未选择记录日期 | 提示请未选择记录日期 | 通过 |
| TC003 | 验证未输入今日午餐,点击提交 | 1. 进入饮食记录界面 <br> 2.未输入今日午餐,点击提交 <br> 3. 点击提交按钮 | 提示请输入今日午餐 | 提示请输入今日午餐 | 通过 |
| TC004 | 验证未输入今日晚餐,点击提交 | 1. 进入饮食记录界面 <br> 2.未输入今日晚餐,点击提交 <br> 3. 点击提交按钮 | 提示请输入今日晚餐 | 提示请输入今日晚餐 | 通过 |
(1)兼容性测试
表6-7 兼容性测试用例
| 用例编号 | 测试类型 | 测试目标 | 操作过程 | 预期结果 |
| 兼容性_01 | 设备兼容性 | 测试系统在不同设备上的表现 | 在多种设备上访问系统并记录表现 | 系统在各种设备上都能正常加载和显示页面 |
| 兼容性_02 | 浏览器兼容性 | 测试系统在不同浏览器上的表现 | 在多种浏览器中访问系统并记录表现 | 系统在各种主流浏览器上都能正常加载和显示页面 |
| 兼容性_03 | 分辨率兼容性 | 测试系统在不同分辨率下的显示效果 | 在不同分辨率的设备上访问系统并记录表现 | 系统在各种分辨率下都能适应并正常显示内容 |
| 兼容性_04 | 操作系统兼容性 | 测试系统在不同操作系统上的运行情况 | 在不同操作系统上访问系统并记录表现 | 系统能够在常用操作系统上正常运行和显示 |
(2)性能测试
表6-8 性能测试用例
| 用例编号 | 测试类型 | 测试目标 | 操作过程 | 预期结果 |
| 性能_01 | 负载测试 | 测试系统在正常负载下的性能 | 逐步增加用户数来模拟不同的负载情况 | 系统能够稳定处理并响应不同数量的用户请求 |
| 性能_02 | 压力测试 | 测试系统在极端负载下的性能 | 以超过系统承受极限的用户数来测试系统 | 系统能够在高负载情况下仍然保持正常运行 |
| 性能_03 | 并发测试 | 测试系统能同时处理多少并发用户请求 | 同时发送多个并发用户请求来测试系统性能 | 系统能够有效地处理多个并发请求 |
| 性能_04 | 数据量测试 | 测试系统在大数据量下的性能 | 向系统添加大量数据并测试系统响应时间 | 系统能够在大数据量情况下保持较快的响应时间 |
6.4 测试结果
全部测试用例都已通过,且不存在漏洞,实现了本文开始时所作要求和期望。本系统运行稳定,使用流畅,可以满足客户需求。试运行后进行系统评估,可以认为该系统达到下单的目标要求,可以满足用户的需求,也满足了系统开发前所作目标。系统在经过大量重复测试后运行十分稳定,安全实用,功能模块已经达到下单目标所需。在规定的时间内实现系统的大部分功能,且满足要求,节省开发成本,有助于提高科学管理水平,符合本人经济情况。
简而言之,经过严格的测试,可以发现该系统的功能和性能非常出色,它的精度、可靠性、稳健性都达到了极高的水平,而且它还支持快速、精细的点击操作,使用者的使用感受更加良好。此外,它还支持各种主流浏览器,满足不同的使用要求。
在基于协同过滤的个性化健康饮食推荐系统的设计与实现中,我们通过明确划分养生用户和管理员等角色,实现了多层次的用户管理和权限控制。系统结合协同过滤算法,通过食谱阅览管理、食谱类型管理、养生课程管理、活动报名管理、饮食记录分析和用户反馈管理等功能模块,为用户提供精准的健康饮食推荐体验。点赞、收藏与评论、评分功能的引入不仅增强了平台的互动性,也提升了用户的参与感,从而提高了用户满意度并保障了平台的稳定运行。资源管理和公告管理模块的实施丰富了平台内容,促进了用户之间的信息交流与互动。
未来,系统可以通过进一步优化协同过滤算法和提升响应速度来增强用户体验,同时结合大数据和智能技术,提升平台的智能化水平,为用户提供更加精准和便捷的个性化推荐。此外,加强数据安全和隐私保护是平台未来发展的关键方向之一,以保障用户信息安全,提升平台的口碑和品牌形象。通过本次项目,我深入掌握了SpringBoot框架的应用,并积累了丰富的开发经验,未来将继续优化系统的稳定性和安全性,引入更多智能化、个性化功能,满足用户需求和市场变化。
- 燕声. 健康饮食延寿[N]. 保健时报, 2023-12-21 (001).
- 武杰. 基于深度学习的饮食推荐算法的研究与应用[D]. 黑龙江大学, 2024.
- 张新宇. 基于知识图谱的健康饮食推荐系统研究与开发[D]. 天津科技大学, 2023.
- 陈钱,兰全祥. Java Web中文件上传方法的研究与分析 [J]. 工业控制计算机, 2024, 37 (11): 72-74+77.
- 赖世文. 基于Garrett用户体验要素模型视角下个性化饮食推荐APP设计研究[D]. 江西财经大学, 2023.
- 李尚霏. 健康饮食领域知识图谱构建及推荐系统研究[D]. 华南理工大学, 2023.
- 刘庆. 面向慢病管理的个性化饮食推荐研究与实现[D]. 哈尔滨工业大学, 2022.
- 王志亮,纪松波. 基于SpringBoot的Web前端与数据库的接口设计 [J]. 工业控制计算机, 2023, 36 (03): 51-53.
- 贾琴. Java编程语言的应用策略分析 [J]. 集成电路应用, 2024, 41 (10): 84-85.
- 庞敏. MySQL数据库的数据安全应用设计技术研究 [J]. 数字通信世界, 2024, (09): 25-27.
- 陈蓓蕾,洪年松. 基于SpringBoot的数据库接口设计 [J]. 信息与电脑(理论版), 2023, 35 (16): 181-183.
- 亓浩然. 针对90后健康饮食行为的冰箱体验设计[D]. 江南大学, 2021.
- 王粤. 基于多特征的健康饮食推荐系统的设计与实现[D]. 重庆邮电大学, 2021.
- 耿化聪. 基于知识图谱与协同过滤的饮食推荐算法研究[D]. 青岛科技大学, 2021.
- 雷振风. 面向健康饮食营养挖掘与推荐关键技术研究[D]. 厦门大学, 2021.
- 刘宇豪,刘佳. 基于微信小程序的健康饮食软件设计与实现 [J]. 电脑编程技巧与维护, 2020, (07): 69-71.
- 苏嘉. 面向心血管疾病风险因素的饮食推荐技术研究[D]. 哈尔滨工业大学, 2020.
- Shao W ,Liu K . Design and Implementation of Online Ordering System Based on SpringBoot [J]. Journal of Big Data and Computing, 2024, 2 (3):
- Stokes D . Update or migrate? Planning for MySQL 5.7 EOL [J]. InfoWorld.com, 2023, 24 (03): 22-30.
- Sergey S . Microservices Design Patterns with Java:70+ patterns for designing, building, and deploying microservices (English Edition)[M]. BPB Publishers: 2024-05-24.
时光荏苒,大学的学业生涯即将画上美好的句号。在这段时光里,我深感老师的热情与友谊,校长对学生的关爱深深印在我的心中。老师们时常关心我们的生活状况,关切我们的饮食、寝室和学习环境,使我们感受到了温馨与关怀。在此,我想表达对那些曾经给予我帮助的人们的深深感激之情。
首先,我要衷心感谢我的导师。无论是在学业上还是生活中,您都给予我巨大的支持与启发。这些年来,在您的教导下,我不仅学到了丰富的知识,还领悟了做人的真谛。您的认真和待人之道让我受益匪浅,我感激能够成为您的学生。
同时,感谢我的专业课老师们。没有你们的精心教导,我的论文也不可能如此顺利。我所学到的知识将成为我未来发展的重要动力。
感谢同学们,写作过程中遇到的问题,得到了同学们的耐心指导和丰富参考材料。你们给予了我很多帮助,感谢你们对我的支持。
最后,感谢我的父母,是你们的支持和鼓励让我能够顺利完成学业。你们为我付出了辛勤的努力和无私的关爱,是我坚强前行的后盾。在即将离开校园,我深感家庭的温馨和爱意,这些将是我未来奋斗的力量源泉。
感谢你们一直以来的支持和陪伴,让我在大学的日子里无论遇到什么困难都感到温馨而坚定。未来,我将以更加饱满的热情投入社会工作,为家人和自己创造更美好的未来。再次感谢大家的陪伴与关爱!
点赞+收藏+关注 → 私信领取本源代码、数据库
更多推荐
所有评论(0)