本论文主要论述了如何使用Servlet技术开发一个基于微信小程序的菜谱查询系统,本系统将严格按照软件开发流程进行各个阶段的工作,采用B/S架构,面向对象编程思想进行项目开发。在引言中,作者将论述菜谱查询系统的当前背景以及系统开发的目的,后续章节将严格按照软件开发流程,对系统进行各个阶段分析设计。
菜谱查询系统的主要使用者分为管理员和普通用户,实现功能包括管理员:系统用户、菜谱信息管理、菜谱分类管理、系统管理、系统公告管理、资源管理等模块,普通用户:首页、、菜谱信息、植物识别、资讯文章、基本信息、收藏等功能。由于本网站的功能模块设计比较全面,所以使得整个菜谱查询系统信息管理的过程得以实现。
本菜谱查询系统是以SpringBoot这一框架为基础,采用Java编写的服务器端程序Servlet,基于Java的开发语言,使用了MySQL这一数据库进行开发的,可以实现菜谱查询系统管理的信息化,可以方便管理员进行更加方便快捷的管理。
关键词:菜谱查询系统;Java语言;SpringBoot;Servlet
This paper mainly discusses how to use Servlet technology to develop a recipe query system based on WeChat mini programs. The system will strictly follow the software development process for each stage of work, using B/S architecture and object-oriented programming ideas for project development. In the introduction, the author will discuss the current background of the recipe query system and the purpose of system development. Subsequent chapters will strictly follow the software development process to analyze and design the system at each stage.
The main users of the recipe query system are divided into administrators and ordinary users. The implementation functions include administrator: system user, recipe information management, recipe classification management, system management, system announcement management, resource management, and other modules. Ordinary users: homepage, recipe information, plant recognition, information articles, basic information, favorites, and other functions. Due to the comprehensive design of the functional modules on this website, the information management process of the entire recipe query system can be realized.
This recipe query system is based on the SpringBoot framework, using a server-side program called Servlet written in Java. It is developed using the Java development language and MySQL database. It can realize the informatization of recipe query system management and facilitate administrators to manage more conveniently and quickly.
Keywords: Recipe query system; Java language; SpringBoot; Servlet
目录
在民以食为天,一顿美味的菜肴可以让一整天的生活变得美好,而如今,有很多人并不会做饭,基于生活条件的限制也无法每天点外卖来解决食物需求,因此他们需要查询菜谱,按照菜谱的教程来为自己做一餐菜谱。以前的人们会选择纸质菜谱,但随着科技的发展,手机成为人们不可或缺的物品,大多数人开始从各类App上搜寻菜谱,但这种做法依然存在一些不便利的问题,因此随着微信的普及,不同功能的微信小程序被开发出来,对于管理者来说,比起App微信小程序开发难度和成本更低,管理更方便,对于用户而言微信小程序的操作更加便捷,快速。微信小程序是一种轻量级的应用程序,能够在微信生态系统中运行,不需要用户下载安装即可使用,类似于一个网页应用程序。可以通过微信公众号、微信朋友圈、微信搜索等方式进行推广,用户可以通过搜索关键词等方式快速进入应用程序,享受便捷的使用体验。
随着信息技术的快速发展和普及,人们对于获取信息的需求越来越迫切。在日常生活中,菜谱查询是许多人必不可少的需求之一。通过查询菜谱,人们可以了解如何制作各种菜谱,提高自己的烹饪技能,享受菜谱带来的乐趣。在现有的研究中,菜谱查询系统已经取得了一定的成果。例如,有些网站和App提供了菜谱搜索和推荐功能,用户可以通过关键词搜索或根据系统推荐查找相关菜谱。但是,微信小程序相较于App,对于用户而言内存更小,操作更便捷,对于开发者而言也减少了开发成本,并且现有的莱谱查询系统还存在一些问题,如搜索精度不高、推荐不够个性化等。此外面对部分较为相似或因不同地区而存在不同叫法的食材,很多人无法进行精准搜索。因此,本研究旨在开发一款更加智 能化、个性化的小程序菜谱查询系统。
随着人们生活水平的提高和对食物饮食的需求不断增加,菜谱查询系统成为了人们在日常生活中越来越重要的工具。菜谱查询系统是指通过电子设备,如智能手机、电脑等,来查询各种菜谱的系统,用户可以根据自己的口味、需求和食材,在系统中搜索到相应的菜谱并实现自身的烹饪需求。菜谱查询系统的出现不仅为人们提供了更加便捷、快速的获取菜谱信息的途径,也满足了人们对于多样化饮食的需求。
目前市面上已经存在一些商业化的菜谱查询系统,如“菜谱杰”、“下厨房”等。这些系统通过汇集大量的菜谱资源,为用户提供了便捷、实用的菜谱查询服务。用户可以通过这些系统搜索到各种口味、难度、食材等方面的菜谱,并且还可以看到其他用户对菜谱的评价和分享,帮助用户更好地选择适合自己的菜谱。
随着人工智能技术的发展,一些研究者开始将智能算法应用到菜谱查询系统中,开发了智能菜谱推荐系统。这些系统通过分析用户的口味偏好、饮食习惯等信息,为用户推荐个性化的菜谱。用户可以根据系统的推荐选择适合自己的菜谱,提高了用户体验和满意度。
除了商品化和智能化的菜谱查询系统,还有一些研究者将社交元素引入菜谱查询系统,开发了社交化菜谱查询系统。这些系统允许用户分享自己的烹饪经验、上传自己的菜谱,并与其他用户交流讨论。通过社交化的方式,用户可以更好地学习、分享和交流烹饪知识,丰富了用户的使用体验。
总体来说,菜谱查询系统在国内外研究方面已经取得了一定的进展,不断推动着菜谱查询系统的发展和创新,为用户提供更好的菜谱查询服务。未来,可以进一步深化研究,提升系统的用户体验和智能化水平,满足用户对于个性化、便捷化菜谱查询的需求。
论文将分层次经行编排,除去论文摘要、目录、致谢、文献参考部分,正文部分还会对网站需求做出分析,以及阐述大体的设计和实现的功能,最后罗列部分调测记录,论文主要架构如下:
第1章 交代了项目的背景以及开发的实际意义。
第2章 对本系统的可行性、功能需求展开分析。
第3章 阐述了项目的总体设计。
第4章 阐明了基于微信小程序的菜谱查询系统详细功能的实现,主要根据技术性的功能模块功能实现。
第5章 罗列了部分系统调试与测试的记录。
第6章 介绍了基于微信小程序的菜谱查询系统的结论。
在开发基于微信小程序的菜谱查询系统中所使用的开发软件像IDEA开发工具、Tomcat8.0服务器、MySQL5.7数据库、Photoshop图片处理软件等,这些都是开源免费的,并且基于微信小程序的菜谱查询系统是自己设计并编码实现的,数据库是使用流行MySQL进行数据的存储,开源的MySQL等技术的使用,减少系统开发费用。
基于微信小程序的菜谱查询系统存储所使用的MySQL数据库以及开发中所使用的IDEA、Tomcat这些开发工具的使用,能够给我们的编写工作带来许多的便利。系统使用SpringBoot框架进行开发,使系统的可扩展性和维护性更佳,减少Java配置代码,简化编程代码,目前SpringBoot框架也是很多企业选择的框架之一。
在日常生活中,随着小程序的快速推广和使用,越来越多人掌握小程序的使用方法,基于微信小程序的菜谱查询系统在这种条件背景下是很容易被人们所接受和熟悉的,所以在操作上没任何问题。
菜谱查询系统的开发目的很简单,就是更加方便的帮助人们更轻松地查询菜谱信息和识别植物。管理员后台实现对系统用户、菜谱信息管理、菜谱分类管理、系统管理、系统公告管理、资源管理等功能模块的信息管理,使用者查找信息的时候能够节省大量的时间和精力,有效减少不必要的查找时间。系统在功能上划分为用户端和管理员端两部分。
1、前台用户端:
首页(菜谱信息、植物识别)、资讯文章、我的(基本信息、收藏)
(1)注册登录:当用户想要对系统中所实现的功能进行查询管理的时候,就必须进行登录到系统当中,如果没有账号的话,可以在登录窗口中进行注册,然后再通过账号密码登录。
(2)菜谱信息:点击菜单栏“菜谱信息”就会显示出所有的菜谱信息,可以根据搜索菜谱名称或菜谱分类查看菜谱信息,可对菜谱信息详细进行点赞、评论、收藏、分享等操作。
(3)植物识别:用户点击“植物识别”链接至中国植物图像库,可以通过上传植物图片来识别植物信息。
(4)资讯文章:用户点击“资讯文章”可以搜索查看资讯文章信息,并可对资讯信息进行点赞、收藏和发表评论等操作。
(5)我的:用户点击“我的”进入到个人信息管理界面,可以修改个人信息和密码,也可以对我的收藏进行管理。
菜谱查询系统中用户角色用例图如图2-1所示:

图2-1 用户角色用例图
2、后台管理员端:
(1)个人信息:对个人的基本信息以及对自己账号登录的密码进行修改;
(2)系统用户:在系统用户模块中主要分了两部分,分别是管理员和普通用户,如果需要添加新的用户,点击页面中的“添加”按钮根据提示输入上用户信息,点击“提交”以后在对应的用户界面就可以查看到了,可以点击用户后面的“删除”按钮直接删除某一用户。
(3)菜谱信息管理:点击“菜谱信息列表”这个按钮可以查看到系统中所有发布的菜谱信息,管理员可进行详情、查看评论或删除等相应操作。
(4)菜谱分类管理:点击“菜谱分类管理”系统会把菜谱查询系统当中所有的菜谱分类信息都显示出来,管理员可对菜谱信息进行添加菜谱分类和类型描述管理,并可进行查询、重置或删除等相应操作。
(5)系统管理:点击“轮播图管理”这个按钮可以查看到系统中所有的轮播图信息,如果想要添加新的轮播图信息,点击“添加”按钮然后根据提示输入轮播图信息,点击“提交”后,在轮播图管理界面就会显示新增的轮播图信息,可以点击某一轮播图信息查看轮播图信息的详情,也可以直接点击“删除”进行删除轮播图。
(6)系统公告管理:管理员点击“系统公告”以后,系统当中所有的系统公告都会展示出来,可以通过关键词查询系统公告,也可以添加新的系统公告或者删除某一条系统公告。
(7)资源管理:管理员在“资源管理”页面可对资讯文章以及资讯分类进行增删改查等操作。
菜谱查询系统中管理员角色用例图如图2-2所示:

图2-2管理员角色用例图
-
-
- 非功能需求分析
-
菜谱查询系统的非功能性需求比如菜谱查询系统的安全性怎么样,可靠性怎么样,性能怎么样,可拓展性怎么样等。具体可以表示在如下2-1表格中:
表2-1 菜谱查询系统非功能需求表
安全性 | 主要指菜谱查询系统数据库的安装,数据库的使用和密码的设定必须合乎规范。 |
可靠性 | 可靠性是指菜谱查询系统能够安装用户的指示进行操作,经过测试,可靠性90%以上。 |
性能 | 性能是影响菜谱查询系统占据市场的必要条件,所以性能最好要佳才好。 |
可扩展性 | 比如数据库预留多个属性,比如接口的使用等确保了系统的非功能性需求。 |
易用性 | 用户只要跟着菜谱查询系统的页面展示内容进行操作,就可以了。 |
可维护性 | 菜谱查询系统开发的可维护性是非常重要的,经过测试,可维护性没有问题 |
开发基于微信小程序的菜谱查询系统的设计与实现最主要的一个目的就是实现用户在线查询菜谱信息的便捷,系统的业务流程图如下所示。

图2-3系统业务流程图
在分析了项目开发的背景、意义以及其开发的可行性后,接下来就是探讨项目的功能划分,以及具体实现的时候对项目数据库各种表的设计,在本章会做一个系统的介绍。
系功能模块的设计就是把系统具体要实现哪些功能,功能如何划分做一个系统的架构,以模块图的方式展示出来,方便我们进行功能得罗列以及涉及。在系统的功能方面,项目分成了管理员+用户两个模块,每个模块登录进去对应相应的功能,具体的功能模块图如图3-1所示。

图3-1 菜谱查询系统功能模块图
一个成熟的系统,数据库的好坏直接影响着其运行,如果没有一个好的数据库对数据存储,那么系统中所有的数据就没有办法调用,数据库是由很多个表组成,然后表和表之间相互联系,形成一个大大的数据库实体。
下面是整个菜谱查询系统中主要的数据库表总E-R实体关系图。

图3-2菜谱查询系统总E-R关系图
数据库逻辑结构设计则是在概念结构的基础上,进行具体的数据库表设计。我们将定义每个表的结构、字段和约束,并建立表与表之间的关系。具体如下:
表access_token (登陆访问时长)
编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
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 | 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 | position | varchar | 32 | 0 | Y | N | 位置: | |
8 | mode | varchar | 32 | 0 | N | N | _blank | 跳转方式: |
9 | add | tinyint | 3 | 0 | N | N | 1 | 是否可增加: |
10 | del | tinyint | 3 | 0 | N | N | 1 | 是否可删除: |
11 | set | tinyint | 3 | 0 | N | N | 1 | 是否可修改: |
12 | get | tinyint | 3 | 0 | N | N | 1 | 是否可查看: |
13 | field_add | text | 65535 | 0 | Y | N | 添加字段: | |
14 | field_set | text | 65535 | 0 | Y | N | 修改字段: | |
15 | field_get | text | 65535 | 0 | Y | N | 查询字段: | |
16 | table_nav_name | varchar | 500 | 0 | Y | N | 跨表导航名称: | |
17 | table_nav | varchar | 500 | 0 | Y | N | 跨表导航: | |
18 | option | text | 65535 | 0 | Y | N | 配置: | |
19 | create_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 创建时间: |
20 | 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 | 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_classification_id | int | 10 | 0 | N | Y | 菜谱分类ID | |
2 | recipe_classification | 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 | recipe_information_id | int | 10 | 0 | N | Y | 菜谱信息ID | |
2 | recipe_name | varchar | 64 | 0 | Y | N | 菜谱名称 | |
3 | menu_image | varchar | 255 | 0 | Y | N | 菜谱图片 | |
4 | recipe_classification | varchar | 64 | 0 | Y | N | 菜谱分类 | |
5 | reference_price | varchar | 64 | 0 | Y | N | 参考价 | |
6 | creating_videos | varchar | 255 | 0 | Y | N | 制作视频 | |
7 | recipe_materials | text | 65535 | 0 | Y | N | 菜谱材料 | |
8 | hits | int | 10 | 0 | N | N | 0 | 点击数 |
9 | praise_len | int | 10 | 0 | N | N | 0 | 点赞数 |
10 | recommend | 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 | regular_users_id | int | 10 | 0 | N | Y | 普通用户ID | |
2 | user_name | varchar | 64 | 0 | Y | N | 用户姓名 | |
3 | users_mobile_phone | varchar | 16 | 0 | Y | N | 用户手机 | |
4 | examine_state | varchar | 16 | 0 | N | N | 已通过 | 审核状态 |
5 | user_id | int | 10 | 0 | N | N | 0 | 用户ID |
6 | create_time | datetime | 19 | 0 | N | N | CURRENT_TIMESTAMP | 创建时间 |
7 | update_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 更新时间 |
编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
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 | 更新时间: |
编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
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 | 文件类型 |
编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
1 | user_id | mediumint | 8 | 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 | 创建时间: |
15 | vip_level | varchar | 255 | 0 | Y | N | 会员等级 | |
16 | vip_discount | double | 11 | 2 | Y | N | 0.00 | 会员折扣 |
编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
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 | 更新时间: |
- 4 章 关键模块的设计与实现
- 系统首页模块
在前台首页,用户可以轻松访问首页、菜谱信息、植物识别、资讯文章、我的等多种功能,如图4-1所示,为用户提供了更加便捷的服务。
图4-1系统首页界面图
用户登录的验证将不再局限于登录信息和权限的匹配验证,而是另外增加了一个验证码,只有界面上所有的编辑框数据都准确的情况下才能实现登录成功。管理员的登录和前台用户登录是一样的过程,其主要就是利用权限字段来完成对用户或管理员的角色识别。
用户登录流程图如下所示。

图4-2 用户登录流程图
登录界面如下图所示。

图4-3 登录界面
登录的逻辑代码如下所示。
/**
* 登录
* @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.select(map, new HashMap<>()).getResultList();
}
else if(email != null && "".equals(email) == false){
map.put("email", email);
resultList = service.select(map, new HashMap<>()).getResultList();
}
else if(phone != null && "".equals(phone) == false){
map.put("phone", phone);
resultList = service.select(map, new HashMap<>()).getResultList();
}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.select(groupMap, new HashMap<>()).getResultList();
if (groupList.size()<1){
return error(30000,"用户组不存在");
}
UserGroup userGroup = (UserGroup) groupList.get(0);
//查询用户审核状态
if (!StringUtils.isEmpty(userGroup.getSourceTable())){
String sql = "select examine_state from "+ userGroup.getSourceTable() +" WHERE user_id = " + byUsername.getUserId();
String res = String.valueOf(service.runCountSql(sql).getSingleResult());
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());
tokenService.save(accessToken);
// 返回用户信息
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, "账号或密码不正确");
}
}
系统的用户通过自行注册生成,在系统首页点击用户注册菜单,系统跳转到对应的注册页面。点击重置按钮,清空所填数据,点击注册按钮完成注册。
用户注册流程图如下所示。

图4-4 用户注册流程图
用户注册界面如下图所示。

图4-5 用户注册界面
注册关键代码如下所示。
/**
* 注册
* @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);
}
当用户点击首页的“菜谱信息”按钮后就可以看到所有的菜谱信息列表,选择你想要了解的菜谱信息后将会进入该菜谱信息的详情界面,可以了解到菜谱分类、菜谱名称、菜谱图片、参考价、制作视频、菜谱材料等信息,可以进行点赞、评论、收藏和分享操作,菜谱信息详情界面如下图4-6所示。

图4-6菜谱信息详情界面图
当用户点击首页的“植物识别”按钮后跳转至至中国植物图像库,可以按提示上传图片,生成识别结果。植物识别界面如下图4-7所示。

图4-7植物识别填写界面图
用户点击“资讯文章”可以搜索查看资讯文章信息,并可对资讯信息进行点赞、收藏和发表评论等操作。资讯文章详情界面如下图4-8所示。

图4-8资讯文章界面图
管理员可以对系统中所有的用户角色进行管控,包含了管理员和普通用户这两种角色,如果需要添加新的用户,点击页面中的“添加”按钮根据提示输入上用户信息,点击“提交”以后在对应的用户界面就可以查看到了,可以点击用户后面的“删除”按钮直接删除某一用户。界面如下图4-9所示。

图4-9用户管理界面图
管理员执行菜谱信息管理,并可以操作相关内容,例如添加,查看,编辑和删除。通过单击“菜谱信息管理”,可以通过菜谱信息管理界面查看详细信息。菜谱信息管理界面如下图4-10所示。

图4-10菜谱信息详情界面图
管理员在“菜谱分类管理”一栏可查看菜谱分类和类型描述等信息,管理员可进行添加、重置或删除等相应操作。界面如下图4-11所示。

图4-11 菜谱分类管理界面图
菜谱查询系统中的管理人员在“系统管理”这一菜单下是可以对菜谱查询系统内的轮播图进行添加修改的,其管理界面如下图4-12所示。

图4-12系统管理界面图
菜谱查询系统中的管理人员在“资源管理”这一菜单下是可以对系统内的资讯文章及资讯分类列表进行管理,资源管理界面如下图4-13所示。

图4-13资源管理界面图
这部分内容主要是把前期编码完成的系统,当成是计算机系统的一部分,并结合一些数据,计算机硬件和支持的软件进行集成测试和确认测试。之所以要进行最后的测试步骤,原因在于检查制作的系统与需求说明书的比较中,存在的差异问题。进一步确认制作的系统在功能与性能上跟需求说明书当中的要求相符。
检测系统是否合格,需要用到很多的测试类型。接下来就对这部分内容进行描述。
功能测试:这是系统测试中,首先进行的测试内容,其属于黑盒测试。主要检验制作的系统与需求说明文档的相符程度,还有它们之间存在的差异问题。
性能测试:主要测试制作的系统,在同时面对很多的用户请求时,该系统的应对能力。同时也是检查制作的系统跟事先预定的系统性能存在的差距问题。这样的方法通常在实时系统中,或者是嵌入式系统中运用得比较多。
容量测试:这种方法针对数据。检查正常运行的系统对数据处理的容量值。
安全性测试:这种方法常用于检验系统中设置的安全保护机制对来自非法用户的攻击时是否有效。而检测系统中的信息保护机制就需要使用常见安全测试中的保护测试来验证。
健壮性测试:这种测试还有一个别称是容错测试,通常运用故障插入法来检测系统的容错能力,看系统是否可以忽略故障保持继续运行,或者是检测系统应对故障时的自动恢复能力。
兼容性测试:面对计算机的各种软硬件环境,检测本系统是否可以兼容。
易用性测试:这种方法主要是面向用户,检测用户是否很容易理解和使用系统。
菜谱查询系统在经历最后的测试环节,需要检验本系统的功能安全性,功能适用性等内容,最终得出测试结论。
表5-1 功能测试数据表
符合要求 | |
符合要求 | |
符合要求 | |
符合要求 | |
符合要求 |
通常来说,一个布局合理,显示的内容无错别字,并具备合理正常的操作逻辑的系统往往很受欢迎,而且可以提升访问者的使用时间以及访问率。
表5-2 可用性测试数据表
测试内容 | 测试结果 |
合理 | |
合理 | |
能 | |
无 | |
检查系统功能有无友好性 | 有 |
能 | |
无 | |
检查系统有无提供帮助信息 | 有 |
菜谱查询系统经过了编码阶段的单元测试,和最后的系统整体测试等测试后,对于用户要求的功能,本系统都进行了实现,各个模块都运行正常。在面对一些故障性问题时,本系统也有相应的应对办法,并且本系统可以保持24小时正常运转。因此,基于微信小程序的菜谱查询系统的设计与实现可以交付用户使用。
本文总结了基于微信小程序的菜谱查询系统的设计与实现开发背景与意义,然后阐述了平台的具体业务需求,并根据平台需求对平台结构以及功能模块等进行了详细地设计,将整个平台划分为多个不同的功能模块。在分析平台功能需求时,对整个平台的总体架构以及功能模块等进行了分析,并选择合适的平台开发技术完成了对各个模块的开发工作。平台开发完成之后进行了部署,同时进行了平台的测试过程,通过测试证明了平台在功能以及性能等方面都达到了预期的要求,具有较高的稳定性与可靠性。
在开发菜谱查询系统的时候,我还意识到了在开发之前做好前期准备是必须的,只有准备充分,心里才能用有底气,然后需要在脑海中对想要实现的功能进行总体的规划,设计出系统的主要框架。做好这一步我们才能胸有成竹的经行开发项目。当设计框架了熟于心之后,需要思考本次编程所需的主要知识点和技术点,并充分学习。如此一来项目的开发才能循序渐进、如丝般顺滑,长久以往就能养成良好的开发习惯。一个程序好不好还要看出的bug多不多,如果在项目完成前做好bug的查验与预防可能发生的事故才能保证程序的稳定长久性运行。如果项目在完工后出现各种问题自己,那么在进入社会后,不仅会给公司团队带来麻烦和增加不必要的工作,还会导致客户流失,公司对自己的评价下降。
在本次项目中我也暴露了诸多问题。对于Servlet的编程知识有所欠缺,环境配置和算法上出现诸多问题,时常导致项目运行出错,或者目标的实现有问题。或者实现想法时算法未优化,使得代码冗长,程序运行不顺畅。
[1]Xiao J ,Zhou H ,Lei Q , et al.Attention-Mechanism-Based Face Feature Extraction Model for WeChat Applet on Mobile Devices[J].Electronics,2024,13(1):
[2]Wu J ,Chen N ,Xia H , et al.Design and application of a game‐based WeChat mini‐program for screening cognitive impairments in Chinese older adults[J].Alzheimer's Dementia,2023,19(S11):
[3]Wu J ,Chen N ,Xia H , et al.Design and development of the intelligent voice recognition‐based cognitive assessment WeChat mini‐program[J].Alzheimer's Dementia,2023,19(S11):
[4]高森孟,周睿.“互联网+”时代全媒体视域下的移动端菜谱可用性研究[J].设计,2023,36(22):123-125.DOI:10.20055/j.cnki.1003-0069.001320.
[5]Liao S ,Gao F ,Feng L , et al.Observed Equity and Driving Factors of Automated External Defibrillators: A Case Study Using WeChat Applet Data[J].ISPRS International Journal of Geo-Information,2023,12(11):
[6]吴思源,曹湛慧,黄志豪等.“轻享健康”微信小程序的设计与实现[J].软件,2023,44(08):69-71+79.
[7]王志亮,纪松波.基于SpringBoot的Web前端与数据库的接口设计[J].工业控制计算机,2023,36(03):51-53.
[8]孙惠.面向家常菜谱的文本分类方法研究[D].中南民族大学,2022.DOI:10.27710/d.cnki.gznmc.2022.000527.
[9]陈沁仪,冲蕾,于泽昊等.基于深度学习与百度AI的菜谱推荐与健康分析微信小程序设计[J].智能计算机与应用,2022,12(06):146-154.
[10]田猛,高淑贤,李祝君等.一种便捷式的智能菜谱推荐系统的设计与实现[J].电脑知识与技术,2022,18(11):55-57.DOI:10.14004/j.cnki.ckt.2022.0691.
[11]徐志.基于网络爬虫的菜谱搜索和智能推荐方法研究[D].安徽建筑大学,2022.DOI:10.27784/d.cnki.gahjz.2022.000419.
[12]李绪远,陈云贵,何敏等.智能烹饪小助手的设计与实现[J].电脑知识与技术,2021,17(32):81-83.DOI:10.14004/j.cnki.ckt.2021.3222.
[13]闫晨曦,张强,赵伟等.大学生DIY“创意厨房+”系统的设计与实现[J].信息与电脑(理论版),2021,33(19):171-173.
[14]喻佳,吴丹新.基于SpringBoot的Web快速开发框架[J].电脑编程技巧与维护,2021,(09):31-33.DOI:10.16184/j.cnki.comprg.2021.09.013.
[15]黄颖康.基于轻量级神经网络的食材识别系统研究与应用[D].广东工业大学,2021.DOI:10.27029/d.cnki.ggdgu.2021.001015.
[16]朱敏.基于微信小程序的美食服务平台的设计与实现[J].电子技术与软件工程,2021,(08):50-51.
[17]刘晓霞,公司食堂菜谱管理系统V1.0.湖北省,武汉东湖学院,2021-04-01.
[18]辜萍萍.基于微信小程序的食品鉴别讨论平台[J].信息技术与信息化,2021,(01):103-106.
[19]李晶.基于微信小程序的美食推荐系统[D].兰州大学,2020.DOI:10.27204/d.cnki.glzhu.2020.003430.
[20]韩洪勇,朱珍珍,姚连达.基于JSP和Servlet的学生信息管理系统[J].科技风,2020,(19):74.DOI:10.19392/j.cnki.1671-7341.202019061.
致谢
至此论文结束,感谢您的阅读。在此我要特别的感谢我的导师,虽然我在实习期间很忙,论文撰写的时候经常是停停改改,但是我的导师依旧十分的负责,时不时的询问我的任务进展情况,跟进我的论文进度,在指导老师的帮助下,我逐步完成了自己的论文和程序,从导师身上也学习到很多知识和经验,这些知识和经验令我受益匪浅。同时我也从导师身上看到了自己的不足,不论是在技术层面上还是在对待工作的态度上,导师如同明镜一般照出了我的缺点我的不足。此外,我还要感谢在我实习期间在论文和程序上帮助过我的同学和社会人士,此前我对于Servlet技术和Java编程语言方面的一些知识还不了解,是他们在我编写程序过程中给了我很多的启发和感想,也帮助了我对于程序的调试和检测。没有他们我是不能顺利完成本次毕业设计的。至此,我的毕业设计就花上了一个圆满的句号了。
关注+点赞+收藏+私信博主,免费领取项目源码