前言
✨ 博主介绍:一线全栈工程师,毕设实战引路人。技术栈覆盖Java、Python、C#、PHP、Node.js及UniApp跨端开发,擅长多语言项目落地与架构设计。持续分享毕设源码、开题报告、技术选型心得与职场踩坑经验。用工程化思维写代码,帮你把毕设做成作品集。👍👍
👇精彩专栏 推荐订阅👇
精选100个热门Java毕业设计项目|适配2026‑2027届选题参考✅
精选100个热门Python毕业设计项目|适配2026‑2027届选题参考✅
精选100个热门微信小程序/安卓APP毕业设计项目|适配2026‑2027届选题参考✅
✅获取源码请私信✅
感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以找我咨询,希望帮助更多的人❤️
1 绪论
1 .1选题背景
当前,随着智慧农业与移动互联技术的飞速发展,水果分类在农业生产、市场流通及大众科普中扮演着日益重要的角色。然而,传统的人工识别方式高度依赖专家经验,存在效率低下、主观性强且难以大规模推广的瓶颈;现有的数字化手段往往功能单一、更新滞后,在面对复杂多变的水果品种时难以提供精准便捷的查询服务,且缺乏高效的移动端交互入口。与此同时,移动互联网技术与智能图像处理能力的成熟为突破这一难题提供了全新路径,能够高效处理图像样本并快速响应用户需求,推动识别服务从被动查阅向主动智能感知转变。
在此背景下,本选题设计并实现智能水果识别微信小程序。系统基于 Python、Django 框架与 MySQL 数据库,构建用户便捷识别与管理员高效运营的综合生态:用户可拍照上传获取识别结果及科普知识,管理员负责信息库维护与内容更新。该设计有效解决了传统方式门槛高、响应慢及现有工具数据陈旧等痛点,切实提升了水果分类效率,助力农业知识普及与智慧助农落地。
1 .2选题意义
1 .2.1实践意义
本选题的实践意义主要体现在提升产业效率、优化用户体验及推动行业数字化三个维度。在产业应用层面,系统利用深度学习技术替代传统人工识别,解决了依赖专家经验导致的效率低、标准不一及成本高等痛点,为农户与商超提供了低成本、全天候的自动化分拣与质检方案,显著提升了水果流通的标准化水平与经济收益。在用户服务层面,依托微信小程序的轻量化优势,构建了“随手拍即识”的便捷交互模式,让用户无需繁琐检索即可即时获取精准品种信息与百科知识,推动农业科普从被动查阅向主动智能感知转型,极大降低了大众获取农业知识的门槛。在社会价值层面,本项目验证了相关技术在移动端落地的可行性,为中小型农业主体提供了一套可复制的数字化解决方案,有助于打破农业信息壁垒,加速智慧农业技术的普及与应用。
1 .2.2理论意义
本选题的理论意义在于丰富了深度学习技术在垂直农业领域的应用理论体系,通过探索深度学习模型与移动端交互逻辑的深度融合机制,为资源受限环境下的智能识别系统构建提供了新的技术范式。研究过程中形成的“云端智能处理与前端便捷交互”协同架构,不仅拓展了人机协作在农业生产场景下的理论边界,揭示了识别精度与响应速度之间的动态平衡规律,还为非结构化农业数据的标准化处理提供了坚实的技术支撑。同时,本项目基于Django架构与MySQL数据库的系统化实现,验证了复杂图像业务逻辑下多角色(普通用户、管理员)协同生态的可行性,完善了关于移动农业信息服务系统架构设计的理论框架,为后续相关领域的学术研究提供了可借鉴的方法论基础与实证案例,推动了农业信息学与计算机科学交叉领域的理论创新与发展。
1 .3国内外研究成果
1 .3.1国内研究成果
国内关于基于深度学习的水果识别微信小程序研究已呈现出从通用识别向垂直细分场景深化的趋势。例如,“保卫水果”小程序便是一个典型实例,该系统利用深度学习模型实现了果树病害的实时识别与智能问答,有效解决了果农在田间地头无法及时获取专业指导的痛点;众多高校及科研团队也推出了类似应用,如基于YOLO系列算法优化的水果识别系统,这些项目通常构建了包含苹果、香蕉、葡萄等数十种常见水果的专用数据集,通过迁移学习技术显著提升了模型在复杂背景下的泛化能力,并成功封装为小程序接口,实现了从“拍照上传”到“结果返回”的秒级响应闭环。
当前研究现状显示,国内学者正致力于解决自然光照变化、果实遮挡及背景杂乱等实际难题,应用场景已从单纯的品种分类逐步拓展至成熟度分级、表面瑕疵检测及产地溯源等精细化服务,整体呈现出数据来源多元化以及服务模式从“单一识别”向“识别+专家咨询+电商导购”综合生态演进的发展态势。
1 .3.2国外研究成果
国外在基于移动端的果蔬识别应用方面已形成一批成熟且广泛使用的实用工具,直接服务于从田间管理到市场流通的全链条:例如在美国,依托农业部及康奈尔大学支持开发的PlantNet等应用,让加州葡萄园主只需对着叶片或果实拍照,即可秒级获取“苹果黑星病”等诊断结果及防治建议,成为日常巡检标配;以色列的Pepper Crop Advisor则帮助柑橘与牛油果种植户通过环绕拍摄视频,自动生成单株产量预估报告及最佳采摘窗口期,从而精确规划人力与物流;在欧洲荷兰与法国,Sortify等工具被广泛用于包装车间和超市,工作人员扫描水果即可依据色泽与疤痕自动判定“一级品”或“加工级”,消费者扫码更能直接查看源自诺曼底具体农场实景照片的完整溯源信息,极大增强购买信任;而澳大利亚的FruitID不仅协助区分本土野生品种如澳洲指橙,还能即时提示食用安全性并标记物种分布。这些案例共同表明,国外相关技术已完全脱离实验室阶段,转化为手机中像地图一样常规的“拍照即反馈”工具,切实解决了种植、分级、溯源及安全采集中的具体痛点,为本选题构建高效、规范的智能水果识别微信小程序提供了极具价值的理念参照与功能范式。
2 相关技术介绍
2 .1Python 语言特性与优势
Python[1]是一种高级编程语言,以简洁、易读和功能强大著称,广泛应用于各个领域。Python作为一种解释型编程语言,配备了广泛的标准库和强有力的第三方库支持,极大地提升了开发人员的编码效率与调试便捷性。它以简洁明了的语法结构著称,高度重视代码的可读性,是进行快速开发及原型构建的理想选择。在Web开发中,Python常与Django、Flask等框架结合使用,能快速构建高效且可扩展的后台系统。在数据分析和人工智能领域,Python凭借Pandas、NumPy等数据处理库,以及TensorFlow、scikit-learn等机器学习框架,成为主流选择。此外,Python[2]具备良好的跨平台特性,支持Windows、Linux、macos等操作系统,确保应用的广泛兼容性。它在自动化测试、爬虫开发和网络编程等方面的应用也非常广泛,是当前最受欢迎的编程语言之一。
2 .2 Django 框架剖析
Django是一款基于Python语言的高效Web框架[3],它倡导迅速开发及简洁、实用的设计哲学。Django框架的核心理念是“尽量减少重复劳动”,即提供一整套可以开箱即用的功能,如身份验证、数据库操作、URL路由、模板引擎等,使开发者可以集中精力于应用程序的具体业务逻辑与功能实现。尽管Django遵循MVC(模型-视图-控制器)架构理念,但实际上采用了MTV(模型-模板-视图)模式:模板处理显示逻辑,视图关注业务流程,而模型则映射至数据库层。
Django[4]通过ORM技术实现了对数据库操作的支持,允许开发者以面向对象的方式便捷地与数据库交互,无需直接编写SQL代码。此外,该框架自带的管理界面极大地简化了数据维护工作,提升了开发效率。Django注重安全性,内置了多种防护措施来抵御常见网络攻击,如XSS和CSRF等。其详尽完善的文档以及活跃的社区支持,确保开发者可以轻松找到所需的资源,快速解决开发过程中的问题。
2 .3 HTML前端技术
HTML(超文本标记语言)是构建WEB页面的标准标记语言[5]。它用于定义网页的结构和内容,通过标签(tag)来描述文本、图像、链接等元素。结合CSS和PythonScript,HTML可以实现丰富的用户界面和交互效果,是WEB前端开发的基础[6]。
2 .4 MySQL 数据库应用
MySQL[7]是一款广受欢迎的开源关系型数据库管理系统,以高效性、稳定性和良好的扩展性著称,被广泛应用于电子商务平台、内容管理及数据分析等多个行业。它为开发者提供了多样的工具和API,方便进行数据库的管理和操作,极大地提升了开发效率和数据处理能力。提供了丰富的工具和API,便于开发者进行数据库管理和操作。MySQL在大多数Web应用中得到广泛使用,尤其是在与PHP、Python等编程语言配合时,能够提供高效的数据存储和查询服务。MySQL数据库[8]具有强大的扩展性,支持水平扩展和分布式架构,可以应对日益增长的数据存储需求。凭借其开源、稳定和高效的特点,MySQL成为全球最受欢迎的数据库系统之一。
2 .5 微信小程序
微信小程序是一种在微信平台上运行的应用,用户无需下载安装即可使用,以轻量化和便捷化著称,依托于微信生态,具备即用即走、开发成本低、用户触达便捷等优势,支持良好的用户交互体验。在本系统中,前端用户界面基于微信小程序技术开发,用户可通过微信客户端直接访问系统功能,如注册、登录和信息查询,无需额外安装独立 App,极大提升了系统的可访问性与用户体验。另外小程序支持丰富的组件库和 API 接口,能够实现页面跳转、网络请求、本地缓存、地理位置获取等多种交互功能。
3 系统分析
3 .1需求分析
3 .1.1功能需求分析
本智能水果识别微信小程序为用户提供科学、精准的果蔬辨识服务。系统主要围绕普通用户的即时识别需求与管理员的后台运维工作,设计了一系列功能模块,设计了一系列功能模块,涵盖水果科普、识果挑战、百科工具等多个方面。
普通用户功能描述:
首页:展示平台核心服务入口、水果资讯浏览、水果科普推荐等内容,通过简洁直观的布局与可视化数据,吸引用户关注,让用户快速掌握平台特色与个性化服务优势。
通知公告:实时发布系统升级维护、病虫害预警及农业政策动态,帮助用户及时获取关键信息。
识果挑战:展示由管理员发布的在线测试题库。用户可参与不同主题的答题挑战,系统自动判分并生成解析,以趣味化方式检验用户的辨识能力,提升互动粘性。
水果科普:推送精选的水果营养价值、挑选技巧、储存方法及食用禁忌等科普文章,树立科学的消费观念,用户可进行点赞、评论等操作。
百科工具:以结构化列表形式呈现海量水果档案,支持按名称、分类、产地等多维度浏览。用户在浏览具体水果详情时,可进行点赞、评论等操作。
蔬菜识别:拓展识别边界,支持用户一键拍摄识别各类蔬菜品种,满足家庭日常多样化的食材辨识需求。
水果资讯:汇聚丰富的行业指导内容,涵盖最新市场行情解读、种植技术分享、深加工趋势分析及专家深度专栏,助力用户提升行业素养,掌握前沿动态。
我的:集成个人信息管理,包含基本信息、收藏记录、点赞记录、食用记录等功能,提供个性化的用户体验。
普通用户角色用例如图3-1所示。

图3-1 普通用户角色用例图
管理员功能描述:
后台首页:提供关键数据概览,帮助管理员快速掌握平台运营状况。
系统用户:添加、删除和修改系统用户信息,包括普通用户和管理员的账号、密码、权限等。确保用户信息的准确性和安全性,防止用户信息泄露。
水果科普管理:负责平台科普内容的全面运维,支持管理员发布、编辑、下架水果科普信息,确保科普信息的准确性与时效性。
百科工具管理:维护水果百科列表的核心数据库,支持录入和更新各类水果的详细档案,并具备对用户点赞、评论等互动数据的监控与管理能力。
食用记录管理:集中查看与分析用户提交的水果摄入记录,支持按时间、用户或水果种类进行多维度检索与统计,必要时可对异常数据进行清理或标记。
系统管理(轮播图):配置首页轮播图内容,包括图片上传、链接跳转设置及展示顺序调整,用于推广重点活动或优质内容。
通知公告管理:发布、编辑与删除平台级的通知公告(如系统维护等),支持设定公告的发布时间与适用范围。
资源管理(水果资讯、资讯分类、水果挑战):管理水果资讯频道,包括资讯分类的维护、文章的发布与管理、专题策划等,以及识果挑战题库的配置,确保资讯丰富度与测试内容的持续更新。
管理员角色用例如图3-2所示。

图3-2 管理员角色用例图
3 .1.2 非功能需求分析
非功能需求分析主要围绕系统的性能、安全、稳定、扩展等多个维度展开,旨在全方位提升系统的质量与用户体验,确保系统能在各种复杂环境下稳定、高效、安全地运行。
(1)性能:系统应具备快速响应能力,各类操作平均响应时间控制在1秒以内。面对高并发场景,如科普查询高峰期,系统需支持至少1000个并发用户访问,确保吞吐量充足,保障系统在高负载下稳定可靠运行。
(2)稳定性:通过定期维护、数据备份以及实时监控等措施,及时排查并解决潜在问题,保证系统在长时间运行过程中不出现故障或异常,维持稳定运行状态。
(3)扩展性:智能识图服务场景深化与用户量增长,系统借助分布式架构、云计算等先进技术,实现功能与性能的便捷扩展,从容应对未来业务发展需求。
(4)安全性:对用户敏感信息,如身份证号、银行卡号、密码等,采用SSL/TLS加密协议保障传输安全,运用AES等加密算法进行加密存储,防止数据被窃取或篡改。同时,设置严格权限控制,依据用户角色赋予不同权限,防止越权访问与操作。此外,具备完善用户认证机制,采用用户名密码结合验证码、短信验证登录,定期提醒用户更换密码,并具备防范SQL注入、XSS攻击等常见Web安全漏洞的能力。
3 .2 可行性分析
3 .2.1经济可行性分析
从经济角度来看,本系统的构建成本主要集中在初期开发和后期维护上。使用开源技术和框架显著降低了软件许可费用。该系统通过提供精准的水果品种识别及营养信息查询服务,能够显著提升用户在生活消费与农业种植场景下的决策效率与体验,进而增强小程序的服务价值与用户粘性,这不仅为后续拓展生鲜电商导流、农业技术推广等商业化模式奠定了坚实基础,也确保了项目在低投入下具备显著的经济效益与广阔的市场应用前景。
3 .2.2 技术可行性分析
本系统基于成熟的Django框架和MySQL数据库开发,利用Python语言的高效与灵活性,确保了技术实现的可行性。Django提供的丰富功能和强大支持极大地简化了开发流程,而前后端分离的设计使得系统易于维护和扩展。此外,采用HTML进行前端开发,不仅提高了用户体验,也保证了系统的稳定性和响应速度。
3 .2.3 操作可行性分析
系统具备直观友好的用户界面,支持简便的导航和功能访问,极大地提升了用户的使用体验。系统提供了自定义的工作流程和角色交流管理,使不同层级的用户能够快速上手,完成各自的任务。
3 .3 系统业务流程图
3.3.1 用户登录流程
当用户进入登录页面时,当其在浏览器执行具体操作的时候,后端会同步显示,如图3-3所示。

图3-3 登录流程图
3.3.2 用户 修改个人信息操作流程
当用户登录系统的时候,可以修改个人信息,管理员在后端审核个人信息。用户修改个人信息操作流程如图3-4所示。
[请替换图片]
图3-4 用户修改个人信息流程图
3.3.3 用户提交 识果挑战操作流程
用户点击识果挑战按钮,可以填写测试信息并提交。提交识果挑战流程如图3-5所示。
[请替换图片]
图3-5 提交识果挑战流程图
4 系统设计
4 .1 系统架构设计
系统采用分层架构设计,包括表现层、业务逻辑层、数据访问层和数据库层。表现层通过Chrome、Firefox等浏览器与用户交互,采用Vue.js框架构建用户界面,结合Element UI组件库实现布局。业务逻辑层基于Django框架实现系统核心功能,采用模块化设计分离用户管理、科普管理、资讯管理等业务功能。数据访问层通过Django ORM组件与数据库建立连接,执行数据的增删改查操作。数据库层选用MySQL关系型数据库存储和管理系统数据,为科普数据、用户数据和行为记录提供稳定的数据存储支持。系统通过Nginx服务器接收和处理用户请求,使用Gunicorn作为WSGI服务器部署Django应用,系统的高效稳定运行。整个系统架构如图4-1所示。

图4-1 系统架构图
4 .2 系统总体功能设计
系统采用了先进的架构模式,不仅提高了系统的稳定性,还为功能的扩展提供了有力支持。本智能水果识别微信小程序的功能模块设计依据不同用户角色的需求,分为普通用户和管理员两大核心类别。整体设计注重各模块之间的协同运作,强调系统的安全性、高效性和便捷性,以提升水果识别的准确度与用户体验,支持智能农业科普业务的持续创新发展。
系统功能结构如图4-2所示:
图4-2 系统总体功能模块图
4 .2 数据库设计
4.2.1 概念结构设计
概念结构设计是数据库设计的重要阶段,通过绘制E-R图来展示系统中各个实体以及它们之间的关系,确保数据的完整性和一致性。在智能水果识别微信小程序中,主要涉及以下实体:用户、科普、资讯等。通过E-R图的设计,可以清晰地展示了智能水果识别微信小程序中各个实体之间的关系,为后续的数据库逻辑结构设计提供了坚实的基础,确保系统能够准确、高效地存储和管理各类数据,满足系统日常运营和管理的需求。

图4-3 系统总E-R关系图
4.2.2 逻辑结构设计
逻辑结构设计是将概念结构设计阶段得到的E-R图转换为具体的关系模型,设计数据库表的字段、数据类型、主键和外键,以实现数据的有效存储和管理。通过逻辑结构设计,将E-R图转换为具体的关系模型,明确了各表之间的关联关系和数据存储方式,为智能水果识别微信小程序的数据库实现提供了详细的设计方案,确保系统能够高效、稳定地运行,满足用户对各类数据的管理和查询需求。在智能水果识别微信小程序中,根据E-R图设计以下数据库表:
表 4-1-access_token(登陆访问时长)
| 编号 | 字段名 | 类型 | 长度 | 是否非空 | 是否主键 | 注释 |
|---|---|---|---|---|---|---|
| 1 | create_time | timestamp | 是 | 否 | 创建时间 | |
| 2 | info | text | 65535 | 否 | 否 | 信息 |
| 3 | maxage | int | 是 | 否 | 最大寿命:默认2小时 | |
| 4 | token | varchar | 64 | 否 | 否 | 临时访问牌 |
| 5 | token_id | int | 是 | 是 | 临时访问牌ID | |
| 6 | update_time | timestamp | 是 | 否 | 更新时间 | |
| 7 | user_id | int | 是 | 否 | 用户编号 |
表 4-2-article(文章)
| 编号 | 字段名 | 类型 | 长度 | 是否非空 | 是否主键 | 注释 |
|---|---|---|---|---|---|---|
| 1 | article_id | mediumint | 是 | 是 | 文章id | |
| 2 | title | varchar | 125 | 是 | 是 | 标题 |
| 3 | type | varchar | 64 | 是 | 否 | 文章分类 |
| 4 | hits | int | 是 | 否 | 点击数 | |
| 5 | praise_len | int | 是 | 否 | 点赞数 | |
| 6 | create_time | timestamp | 是 | 否 | 创建时间 | |
| 7 | update_time | timestamp | 是 | 否 | 更新时间 | |
| 8 | source | varchar | 255 | 否 | 否 | 来源 |
| 9 | url | varchar | 255 | 否 | 否 | 来源地址 |
| 10 | tag | varchar | 255 | 否 | 否 | 标签 |
| 11 | content | longtext | 4294967295 | 否 | 否 | 正文 |
| 12 | img | varchar | 255 | 否 | 否 | 封面图 |
| 13 | description | text | 65535 | 否 | 否 | 文章描述 |
表 4-3-article_type(文章分类)
| 编号 | 字段名 | 类型 | 长度 | 是否非空 | 是否主键 | 注释 |
|---|---|---|---|---|---|---|
| 1 | create_time | timestamp | 是 | 否 | 创建时间 | |
| 2 | description | varchar | 255 | 否 | 否 | 描述 |
| 3 | display | smallint | 是 | 否 | 显示顺序 | |
| 4 | father_id | smallint | 是 | 否 | 上级分类ID | |
| 5 | icon | text | 65535 | 否 | 否 | 分类图标 |
| 6 | name | varchar | 16 | 是 | 否 | 分类名称 |
| 7 | type_id | smallint | 是 | 是 | 分类ID | |
| 8 | update_time | timestamp | 是 | 否 | 更新时间 | |
| 9 | url | varchar | 255 | 否 | 否 | 外链地址 |
表 4-4-auth(用户权限管理)
| 编号 | 字段名 | 类型 | 长度 | 是否非空 | 是否主键 | 注释 |
|---|---|---|---|---|---|---|
| 1 | auth_id | int | 是 | 是 | 授权ID | |
| 2 | user_group | varchar | 64 | 否 | 否 | 用户组 |
| 3 | mod_name | varchar | 64 | 否 | 否 | 模块名 |
| 4 | table_name | varchar | 64 | 否 | 否 | 表名 |
| 5 | page_title | varchar | 255 | 否 | 否 | 页面标题 |
| 6 | path | varchar | 255 | 否 | 否 | 路由路径 |
| 7 | parent | varchar | 64 | 否 | 否 | 父级菜单 |
| 8 | parent_sort | int | 是 | 否 | 父级菜单排序 | |
| 9 | position | varchar | 32 | 否 | 否 | 位置 |
| 10 | mode | varchar | 32 | 是 | 否 | 跳转方式 |
| 11 | add | tinyint | 是 | 否 | 是否可增加 | |
| 12 | del | tinyint | 是 | 否 | 是否可删除 | |
| 13 | set | tinyint | 是 | 否 | 是否可修改 | |
| 14 | get | tinyint | 是 | 否 | 是否可查看 | |
| 15 | field_add | text | 65535 | 否 | 否 | 添加字段 |
| 16 | field_set | text | 65535 | 否 | 否 | 修改字段 |
| 17 | field_get | text | 65535 | 否 | 否 | 查询字段 |
| 18 | table_nav_name | varchar | 500 | 否 | 否 | 跨表导航名称 |
| 19 | table_nav | varchar | 500 | 否 | 否 | 跨表导航 |
| 20 | option | text | 65535 | 否 | 否 | 配置 |
| 21 | create_time | timestamp | 是 | 否 | 创建时间 | |
| 22 | update_time | timestamp | 是 | 否 | 更新时间 |
表 4-5-code_token(验证码)
| 编号 | 字段名 | 类型 | 长度 | 是否非空 | 是否主键 | 注释 |
|---|---|---|---|---|---|---|
| 1 | code | varchar | 255 | 否 | 否 | 验证码 |
| 2 | code_token_id | int | 是 | 是 | 验证码ID | |
| 3 | create_time | timestamp | 是 | 否 | 创建时间 | |
| 4 | expire_time | timestamp | 是 | 否 | 失效时间 | |
| 5 | token | varchar | 255 | 否 | 否 | 令牌 |
| 6 | update_time | timestamp | 是 | 否 | 更新时间 |
表 4-6-collect(收藏)
| 编号 | 字段名 | 类型 | 长度 | 是否非空 | 是否主键 | 注释 |
|---|---|---|---|---|---|---|
| 1 | collect_id | int | 是 | 是 | 收藏ID | |
| 2 | user_id | int | 是 | 是 | 收藏人ID | |
| 3 | source_table | varchar | 255 | 否 | 否 | 来源表 |
| 4 | source_field | varchar | 255 | 否 | 否 | 来源字段 |
| 5 | source_id | int | 是 | 否 | 来源ID | |
| 6 | title | varchar | 255 | 否 | 否 | 标题 |
| 7 | img | varchar | 255 | 否 | 否 | 封面 |
| 8 | create_time | timestamp | 是 | 否 | 创建时间 | |
| 9 | update_time | timestamp | 是 | 否 | 更新时间 |
表 4-7-comment(评论)
| 编号 | 字段名 | 类型 | 长度 | 是否非空 | 是否主键 | 注释 |
|---|---|---|---|---|---|---|
| 1 | avatar | varchar | 255 | 否 | 否 | 头像地址 |
| 2 | comment_id | int | 是 | 是 | 评论ID | |
| 3 | content | longtext | 4294967295 | 否 | 否 | 内容 |
| 4 | create_time | timestamp | 是 | 否 | 创建时间 | |
| 5 | hidden | tinyint | 否 | 否 | 是否隐藏 | |
| 6 | nickname | varchar | 255 | 否 | 否 | 昵称 |
| 7 | reply_to_id | int | 是 | 否 | 回复评论ID | |
| 8 | source_field | varchar | 255 | 否 | 否 | 来源字段 |
| 9 | source_id | int | 是 | 否 | 来源ID | |
| 10 | source_table | varchar | 255 | 否 | 否 | 来源表 |
| 11 | sticky | tinyint | 否 | 否 | 是否置顶 | |
| 12 | update_time | timestamp | 是 | 否 | 更新时间 | |
| 13 | user_id | int | 是 | 是 | 评论人ID |
表 4-8-edible_record(食用记录)
| 编号 | 字段名 | 类型 | 长度 | 是否非空 | 是否主键 | 注释 |
|---|---|---|---|---|---|---|
| 1 | edible_record_id | int | 是 | 是 | 食用记录ID | |
| 2 | regular_user | int | 否 | 否 | 普通用户 | |
| 3 | user_name | varchar | 64 | 否 | 否 | 用户姓名 |
| 4 | record_date | date | 否 | 否 | 记录日期 | |
| 5 | fruit_pictures | varchar | 255 | 否 | 否 | 水果图片 |
| 6 | record_specificss | text | 65535 | 否 | 否 | 记录详情 |
| 7 | create_time | datetime | 是 | 否 | 创建时间 | |
| 8 | create_by | int | 是 | 否 | 创建用户ID | |
| 9 | update_time | timestamp | 是 | 否 | 更新时间 |
表 4-9-encyclopedia_tools(百科工具)
| 编号 | 字段名 | 类型 | 长度 | 是否非空 | 是否主键 | 注释 |
|---|---|---|---|---|---|---|
| 1 | collect_len | int | 是 | 否 | 收藏数 | |
| 2 | comment_len | int | 是 | 否 | 评论数 | |
| 3 | content_specificss | text | 65535 | 否 | 否 | 内容详情 |
| 4 | content_title | varchar | 64 | 否 | 否 | 内容标题 |
| 5 | content_type | varchar | 64 | 否 | 否 | 内容类型 |
| 6 | cover_image | varchar | 255 | 否 | 否 | 封面图片 |
| 7 | create_by | int | 是 | 否 | 创建用户ID | |
| 8 | create_time | datetime | 是 | 否 | 创建时间 | |
| 9 | encyclopedia_tools_id | int | 是 | 是 | 百科工具ID | |
| 10 | praise_len | int | 是 | 否 | 点赞数 | |
| 11 | publication_date | date | 否 | 否 | 发布日期 | |
| 12 | recommended_index | varchar | 64 | 否 | 否 | 推荐指数 |
| 13 | update_time | timestamp | 是 | 否 | 更新时间 |
表 4-10-exam(考试)
| 编号 | 字段名 | 类型 | 长度 | 是否非空 | 是否主键 | 注释 |
|---|---|---|---|---|---|---|
| 1 | exam_id | mediumint | 是 | 是 | 考试id | |
| 2 | name | varchar | 32 | 是 | 否 | 考试名称:[2,32] |
| 3 | duration | int | 否 | 否 | 答题时长 | |
| 4 | score | double | 否 | 否 | 总分 | |
| 5 | status | varchar | 10 | 否 | 否 | 状态:启用、禁用 |
| 6 | create_time | timestamp | 是 | 否 | 创建时间 | |
| 7 | update_time | timestamp | 是 | 否 | 更新时间 | |
| 8 | open_start | datetime | 否 | 否 | 开放开始时间 | |
| 9 | open_end | datetime | 否 | 否 | 开放结束时间 | |
| 10 | reuse_state | varchar | 10 | 否 | 否 | 多次答题:启用、禁用 |
表 4-11-exam_question(试题)
| 编号 | 字段名 | 类型 | 长度 | 是否非空 | 是否主键 | 注释 |
|---|---|---|---|---|---|---|
| 1 | answer | varchar | 500 | 否 | 否 | 参考答案 |
| 2 | answer_analysis | varchar | 500 | 否 | 否 | 答案解析 |
| 3 | create_time | timestamp | 是 | 否 | 创建时间 | |
| 4 | exam_id | mediumint | 是 | 是 | 所属试卷 | |
| 5 | exam_question_id | mediumint | 是 | 是 | ID | |
| 6 | question_item | varchar | 500 | 否 | 否 | 选项 |
| 7 | question_order | int | 否 | 否 | 排序 | |
| 8 | score | double | 否 | 否 | 总分 | |
| 9 | title | varchar | 255 | 否 | 否 | 题目 |
| 10 | type | varchar | 20 | 否 | 否 | 类型 |
| 11 | update_time | timestamp | 是 | 否 | 更新时间 |
表 4-12-fruit_science_popularization(水果科普)
| 编号 | 字段名 | 类型 | 长度 | 是否非空 | 是否主键 | 注释 |
|---|---|---|---|---|---|---|
| 1 | fruit_science_popularization_id | int | 是 | 是 | 水果科普ID | |
| 2 | popular_science_title | varchar | 64 | 否 | 否 | 科普标题 |
| 3 | popular_science_type | varchar | 64 | 否 | 否 | 科普类型 |
| 4 | publication_date | date | 否 | 否 | 发布日期 | |
| 5 | popular_science_source | varchar | 64 | 否 | 否 | 科普来源 |
| 6 | cover_image | varchar | 255 | 否 | 否 | 封面图片 |
| 7 | business_ingredients | text | 65535 | 否 | 否 | 营业成分 |
| 8 | edible_taboo | text | 65535 | 否 | 否 | 食用禁忌 |
| 9 | food_recommendations | text | 65535 | 否 | 否 | 食用建议 |
| 10 | praise_len | int | 是 | 否 | 点赞数 | |
| 11 | collect_len | int | 是 | 否 | 收藏数 | |
| 12 | comment_len | int | 是 | 否 | 评论数 | |
| 13 | create_time | datetime | 是 | 否 | 创建时间 | |
| 14 | create_by | int | 是 | 否 | 创建用户ID | |
| 15 | update_time | timestamp | 是 | 否 | 更新时间 |
表 4-13-hits(用户点击)
| 编号 | 字段名 | 类型 | 长度 | 是否非空 | 是否主键 | 注释 |
|---|---|---|---|---|---|---|
| 1 | create_time | timestamp | 是 | 否 | 创建时间 | |
| 2 | hits_id | int | 是 | 是 | 点赞ID | |
| 3 | source_field | varchar | 255 | 否 | 否 | 来源字段 |
| 4 | source_id | int | 是 | 否 | 来源ID | |
| 5 | source_table | varchar | 255 | 否 | 否 | 来源表 |
| 6 | update_time | timestamp | 是 | 否 | 更新时间 | |
| 7 | user_id | int | 是 | 否 | 点赞人 |
表 4-14-notice(公告)
| 编号 | 字段名 | 类型 | 长度 | 是否非空 | 是否主键 | 注释 |
|---|---|---|---|---|---|---|
| 1 | notice_id | mediumint | 是 | 是 | 公告ID | |
| 2 | title | varchar | 125 | 是 | 否 | 标题 |
| 3 | content | longtext | 4294967295 | 否 | 否 | 正文 |
| 4 | create_time | timestamp | 是 | 否 | 创建时间 | |
| 5 | update_time | timestamp | 是 | 否 | 更新时间 |
表 4-15-praise(点赞)
| 编号 | 字段名 | 类型 | 长度 | 是否非空 | 是否主键 | 注释 |
|---|---|---|---|---|---|---|
| 1 | create_time | timestamp | 是 | 否 | 创建时间 | |
| 2 | img | varchar | 255 | 否 | 否 | |
| 3 | praise_id | int | 是 | 是 | 点赞ID | |
| 4 | source_field | varchar | 255 | 否 | 否 | 来源字段 |
| 5 | source_id | int | 是 | 否 | 来源ID | |
| 6 | source_table | varchar | 255 | 否 | 否 | 来源表 |
| 7 | status | tinyint | 是 | 否 | 点赞状态:1为点赞,0已取消 | |
| 8 | title | varchar | 255 | 否 | 否 | |
| 9 | update_time | timestamp | 是 | 否 | 更新时间 | |
| 10 | user_id | int | 是 | 是 | 点赞人 |
表 4-16-regular_user(普通用户)
| 编号 | 字段名 | 类型 | 长度 | 是否非空 | 是否主键 | 注释 |
|---|---|---|---|---|---|---|
| 1 | regular_user_id | int | 是 | 是 | 普通用户ID | |
| 2 | user_name | varchar | 64 | 否 | 否 | 用户姓名 |
| 3 | user_phone | varchar | 64 | 否 | 否 | 用户电话 |
| 4 | examine_state | varchar | 16 | 是 | 否 | 审核状态 |
| 5 | user_id | int | 是 | 否 | 用户ID | |
| 6 | create_time | datetime | 是 | 否 | 创建时间 | |
| 7 | create_by | int | 是 | 否 | 创建用户ID | |
| 8 | update_time | timestamp | 是 | 否 | 更新时间 |
表 4-17-slides(轮播图)
| 编号 | 字段名 | 类型 | 长度 | 是否非空 | 是否主键 | 注释 |
|---|---|---|---|---|---|---|
| 1 | content | varchar | 255 | 否 | 否 | 内容 |
| 2 | create_time | timestamp | 是 | 否 | 创建时间 | |
| 3 | hits | int | 是 | 否 | 点击量 | |
| 4 | img | varchar | 255 | 否 | 否 | 轮播图 |
| 5 | slides_id | int | 是 | 是 | 轮播图ID | |
| 6 | title | varchar | 64 | 否 | 否 | 标题 |
| 7 | update_time | timestamp | 是 | 否 | 更新时间 | |
| 8 | url | varchar | 255 | 否 | 否 | 链接 |
表 4-18-upload(文件上传)
| 编号 | 字段名 | 类型 | 长度 | 是否非空 | 是否主键 | 注释 |
|---|---|---|---|---|---|---|
| 1 | upload_id | int | 是 | 是 | 上传ID | |
| 2 | name | varchar | 64 | 否 | 否 | 文件名 |
| 3 | path | varchar | 255 | 否 | 否 | 访问路径 |
| 4 | file | varchar | 255 | 否 | 否 | 文件路径 |
| 5 | display | varchar | 255 | 否 | 否 | 显示顺序 |
| 6 | father_id | int | 否 | 否 | 父级ID | |
| 7 | dir | varchar | 255 | 否 | 否 | 文件夹 |
| 8 | type | varchar | 32 | 否 | 否 | 文件类型 |
表 4-19-user(用户账户)
| 编号 | 字段名 | 类型 | 长度 | 是否非空 | 是否主键 | 注释 | |||
|---|---|---|---|---|---|---|---|---|---|
| 1 | avatar | varchar | 255 | 否 | 否 | 头像地址 | |||
| 2 | create_time | timestamp | 是 | 否 | 创建时间 | ||||
| 3 | varchar | 64 | 否 | 否 | 邮箱 | ||||
| 4 | email_state | smallint | 是 | 否 | 邮箱认证:(0未认证 | 1审核中 | 2已认证) | ||
| 5 | login_time | timestamp | 否 | 否 | 上次登录时间 | ||||
| 6 | nickname | varchar | 16 | 否 | 否 | 昵称 | |||
| 7 | open_id | varchar | 255 | 否 | 否 | 针对获取用户信息字段 | |||
| 8 | password | varchar | 64 | 是 | 否 | 密码 | |||
| 9 | phone | varchar | 11 | 否 | 否 | 手机号码 | |||
| 10 | phone_state | smallint | 是 | 否 | 手机认证:(0未认证 | 1审核中 | 2已认证) | ||
| 11 | state | smallint | 是 | 否 | 账户状态:(1可用 | 2异常 | 3已冻结 | 4已注销) | |
| 12 | user_group | varchar | 32 | 否 | 否 | 所在用户组 | |||
| 13 | user_id | int | 是 | 是 | 用户ID | ||||
| 14 | username | varchar | 16 | 是 | 否 | 用户名 |
表 4-20-user_answer(用户答题)
| 编号 | 字段名 | 类型 | 长度 | 是否非空 | 是否主键 | 注释 |
|---|---|---|---|---|---|---|
| 1 | user_answer_id | mediumint | 是 | 是 | 用户答题ID | |
| 2 | user_id | mediumint | 是 | 否 | 用户ID | |
| 3 | exam_id | mediumint | 是 | 是 | 考试id | |
| 4 | score | double | 否 | 否 | 分数 | |
| 5 | answers | text | 65535 | 否 | 否 | 答案 |
| 6 | score_detail | text | 65535 | 否 | 否 | 评分详情 |
| 7 | objective_score | double | 否 | 否 | 客观题得分 | |
| 8 | subjective_score | double | 否 | 否 | 主观题得分 | |
| 9 | score_state | tinyint | 否 | 否 | 评分状态 | |
| 10 | nickname | varchar | 255 | 否 | 否 | 提交人 |
| 11 | create_time | timestamp | 是 | 否 | 创建时间 | |
| 12 | update_time | timestamp | 是 | 否 | 更新时间 | |
| 13 | comment_desc | varchar | 255 | 否 | 否 | 评语 |
表 4-21-user_group(用户组)
| 编号 | 字段名 | 类型 | 长度 | 是否非空 | 是否主键 | 注释 |
|---|---|---|---|---|---|---|
| 1 | create_time | timestamp | 是 | 否 | 创建时间 | |
| 2 | description | varchar | 255 | 否 | 否 | 描述 |
| 3 | display | smallint | 是 | 否 | 显示顺序 | |
| 4 | group_id | mediumint | 是 | 是 | 用户组ID | |
| 5 | name | varchar | 16 | 是 | 否 | 名称 |
| 6 | register | smallint | 否 | 否 | 注册位置 | |
| 7 | source_field | varchar | 255 | 否 | 否 | 来源字段 |
| 8 | source_id | int | 是 | 否 | 来源ID | |
| 9 | source_table | varchar | 255 | 否 | 否 | 来源表 |
| 10 | update_time | timestamp | 是 | 否 | 更新时间 |
5 系统详细设计与实现
5.1 前台用户模块的实现
5.1.1 用户注册
用户注册时,需要提交昵称、密码、确认密码、姓名、性别、年龄、联系方式等必要个人信息,并接受合法性校验。系统会对用户提交的信息进行严格核验,验证用户名是否已存在,密码是否符合强度要求等。若验证不通过,系统将返回错误信息给前端页面,提示用户修改。用户注册界面展示如下图5-1所示。

图5-1 用户注册界面图
注册代码如下:
def Register(self, ctx):
print("===================注册=====================")
userService = service_select("user")
body = ctx.body
if "username" not in body and body["username"] == '':
return ctx.response(json.dumps({
"error": {
"code": 70000,
"message": "用户名不能为空",
}
}, ensure_ascii=False))
if "user_group" not in body and body["user_group"] == '':
return ctx.response(json.dumps({
"error": {
"code": 70000,
"message": "用户组不能为空",
}
}, ensure_ascii=False))
if "password" not in body and body["password"] == '':
return ctx.response(json.dumps({
"error": {
"code": 70000,
"message": "密码不能为空",
}
}, ensure_ascii=False))
post_param = body
post_param['nickname'] = body["nickname"] or ""
post_param['password'] = md5hash(body["password"])
obj = userService.Get_obj({"username": post_param['username']}, {"like": False})
if obj:
return ctx.response(json.dumps({
"error": {
"code": 70000,
"message": "用户名已存在",
}
}, ensure_ascii=False))
ret = {
"error": {
"code": 70000,
"message": "注册失败",
}
}
bl = userService.Add(post_param)
if bl:
ret = {
"result": {
"bl": True,
"message": "注册成功"
}
}
return ctx.response(json.dumps(ret, ensure_ascii=False))
5.1.2 用户登录
用户能够通过登录流程访问系统个人信息和功能。登录时,用户需在登录页面输入用户名和密码,系统会在Django的视图函数中接收用户提交的信息,并通过数据库查询验证用户身份。为提高登录的安全性,系统引入验证码机制,在登录页面生成一个随机验证码图片,用户需要在登录时输入图片中的验证码,后端在验证用户登录信息时,会同时验证用户输入的验证码是否正确,防止恶意程序通过自动化脚本进行暴力破解登录。用户登录界面展示如下图5-2所示。

图5-2 用户登录界面图
登录代码如下:
def Login(self, ctx):
print("===================登录=====================")
ret = {
"error": {
"code": 70000,
"message": "账户不存在",
}
}
body = ctx.body
password = md5hash(body["password"]) or ""
obj = service_select("user").Get_obj(
{"username": body["username"]}, {"like": False}
)
if obj:
user_group = service_select("user_group").Get_obj({'name': obj['user_group']}, {"like": False})
if user_group and user_group['source_table'] != '':
user_obj = service_select(user_group['source_table']).Get_obj({"user_id": obj['user_id']}, {"like": False})
if user_obj['examine_state'] == '未通过':
ret = {
"error": {
"code": 70000,
"message": "账户未通过审核",
}
}
return ret
if user_obj['examine_state'] == '未审核':
ret = {
"error": {
"code": 70000,
"message": "账户未审核",
}
}
return ret
if obj["state"] == 1:
if obj["password"] == password:
timeout = timezone.now()
timestamp = int(time.mktime(timeout.timetuple())) * 1000
token = md5hash(str(obj["user_id"]) + "_" + str(timestamp))
ctx.request.session[token] = obj["user_id"]
service_select("access_token").Add(
{"token": token, "user_id": obj["user_id"]}
)
obj["token"] = token
ret = {
"result": {"obj": obj}
}
else:
ret = {
"error": {
"code": 70000,
"message": "密码错误",
}
}
else:
ret = {
"error": {
"code": 70000,
"message": "用户账户不可用,请联系管理员",
}
}
return ctx.response(json.dumps(ret, ensure_ascii=False))
5.1.3 前台首页
系统首页是用户进入智能水果识别微信小程序的初始界面,用于展示平台的核心服务、水果资讯及最新动态。系统使用Django的模板引擎,从数据库中查询热门资讯、水果科普推荐及最新通知公告等数据,并将其动态展示在首页上,为用户提供良好的视觉体验。前台首页界面展示如下图5-3所示。

图5-3 前台首页界面图
5.1.4 通知公告
通知公告功能模块为管理员提供便捷的信息发布渠道,向全体用户及时传达重要资讯。管理员通过后台管理界面可进行通知的发布、编辑、删除和分类管理,通知数据存储于MySQL数据库中,包含标题、内容、发布人、发布时间和状态等字段。通知公告界面如下图5-4所示。

图5-4 通知公告界面图
5.1.5 水果资讯
水果资讯模块用于汇聚丰富的行业指导内容,涵盖最新市场行情解读、种植技术分享、深加工趋势分析及专家深度专栏,助力用户提升行业素养,掌握前沿动态。在前端页面,系统使用HTML的列表元素展示资讯列表,每个列表项包含资讯的标题、发布时间和简要介绍。用户点击资讯标题,可进入资讯详情页面,查看完整的资讯内容。系统可以根据用户选择的资讯分类进行筛选,为用户提供个性化的资讯展示。水果资讯界面如下图5-5所示。

图5-5 水果资讯界面图
5.1.6 水果科普
水果科普模块推送精选的水果营养价值、挑选技巧、储存方法及食用禁忌等科普文章,树立科学的消费观念,用户可进行点赞、评论等操作。水果科普界面展示如下图5-6所示。

图5-6 水果科普界面图
5.1.7 我的
我的模块是用户管理个人信息的核心区域,包含多个子模块。此模块不仅允许用户编辑个人资料、修改密码,还可以查看账户的安全设置。它还整合了收藏记录、点赞记录、食用记录等功能,为用户提供一站式服务体验。用户我的界面展示如下图5-7所示。

图5-7 我的界面图
我的代码如下:
def Add(self, ctx):
body = ctx.body
unique = self.config.get("unique")
obj = None
if unique:
qy = {}
for i in range(len(unique)):
key = unique[i]
qy[key] = body.get(key)
obj = self.service.Get_obj(qy)
if not obj:
error = self.Add_before(ctx)
if error["code"]:
return {"error": error}
error = self.Events("add_before", ctx, None)
if error["code"]:
return {"error": error}
result = self.service.Add(body, self.config)
if self.service.error:
return {"error": self.service.error}
res = self.Add_after(ctx, result)
if res:
result = res
res = self.Events("add_after", ctx, result)
if res:
result = res
return {"result": result}
else:
return {"error": {"code": 10000, "message": "已存在"}}
5.2 后台管理员模块的实现
5.2 . 1后台首页
后台首页是管理员登录系统后台的初始界面,该界面主要提供系统重要信息概览和系统各类数据统计分析图。后台首页界面如下图5-8所示。

图5-8 后台首页管理界面图
5.2.2 系统用户
管理员在系统用户管理模块,能够执行添加新用户、删除已有用户、修改用户信息的操作。还可以对用户的登录行为进行监控,查看登录日志,一旦发现异常行为,能够及时采取相应措施。系统用户管理界面展示如下图5-9所示。

图5-9 系统用户管理界面图
系统用户代码如下:
def Del(self, ctx):
if len(ctx.query) == 0:
errorMsg = {"code": 30000, "message": "删除条件不能为空!"}
return errorMsg
result = self.service.Del(ctx.query, self.config)
if self.service.error:
return {"error": self.service.error}
return {"result": result}
5.2.3 系统管理
管理员在轮播图管理模块,可进行上传新的首页轮播图、更换现有的轮播图、删除不需要的轮播图等操作,以此来管理首页轮播图的展示内容。系统管理界面展示如下图5-10所示。

图5-10 系统管理界面图
5.2.4 资源管理
管理员在资源管理模块,主要管理水果资讯以及资讯分类。可以添加新的资讯分类、修改已有的资讯分类、删除不再使用的资讯分类,从而实现对水果资讯的有序管理,以及对识果挑战题库的配置,确保资讯丰富度与测试内容的持续更新。资源管理界面展示如下图5-11所示。

图5-11 资源管理界面图
5.2.5 水果科普管理
管理员在水果科普管理模块,负责平台科普内容的全面运维,支持管理员发布、编辑、下架水果科普信息,确保科普信息的准确性与时效性。水果科普管理界面展示如下图5-12所示。

图5-12 水果科普管理界面图
6 系统测试
6.1 测试目的
系统测试是软件开发过程中的重要环节,对于智能水果识别微信小程序而言,其测试目的具有多方面的重要意义。通过系统测试,能够全面验证系统的功能是否符合预先设定的需求规格说明书。在性能方面,测试旨在评估系统在不同负载条件下的响应时间、吞吐量和资源消耗情况。安全层面的测试也是至关重要的。系统存储了大量用户的敏感信息,因此需要通过安全测试,全面检测系统的安全防护机制是否完善。重点测试数据加密是否有效,确保用户信息在传输和存储过程中的保密性,防止信息被窃取或篡改,保护用户的隐私和权益。
通过对系统各项功能的细致测试,能够及时发现并修正潜在的功能缺陷,保证系统的功能完整性和正确性,为用户提供稳定可靠的服务。
6.2 测试用例
本系统需要满足普通用户和管理员三种角色的需求,所以以下将对这三类角色分别进行功能测试。
6.2.1 普通用户功能测试
普通用户主要对用户注册、用户登录、提交识果挑战、查看通知公告、收藏水果科普等用例进行功能测试。
表6-1 普通用户功能测试表
| 编号 | 用例说明 | 输入数据 | 预测结果 | 测试结果 |
|---|---|---|---|---|
| S01 | 注册账号 | 用户名:fruit_fan,密码:888888,角色:普通用户 | 注册成功,系统提示“注册成功”并自动跳转至登录页,数据库用户表中新增一条用户记录 | 通过 |
| S02 | 登录系统 | 用户名:fruit_fan,密码:888888 | 登录成功,页面跳转至小程序首页,底部导航栏显示“首页”、“水果资讯”、“我的”入口及用户昵称 | 通过 |
| S03 | 参加识果挑战 (文字选择题场景) | 1. 点击“挑战答题”进入考试页; 2. 系统展示文字题目:“哪种水果被誉为‘维 C 之王’,且表皮布满小刺?”; 3. 选项为:A. 苹果 B. 猕猴桃 C. 香蕉; 4. 用户勾选B 选项并点击“提交”。 | 提交成功,系统立即判卷: 1. 弹出结果框显示:"回答正确! 答案是猕猴桃,其维生素 C 含量极高”; 2. 界面自动记录得分; 3. 个人中心“我的战绩”中答对题数 +1,准确率实时更新。 | 通过 |
| S04 | 查看通知公告 | 进入“公告”模块,点击标题为《系统升级:新增 50 种热带水果题库》的通知 | 页面加载成功,完整展示本次更新的水果种类列表及题库优化说明,无乱码或内容缺失 | 通过 |
| S05 | 收藏水果科普 | 在 S03 答题结束后的解析页面,阅读完知识点后,点击“收藏”图标 | 收藏成功,图标状态变为“已收藏”,且在个人中心的“我的收藏”列表中可找到该水果的百科条目,支持一键跳转复习 | 通过 |
6.2.2 管理员功能测试
管理员主要对登录后台、发布通知公告、管理水果资讯、审核识果挑战、管理水果科普、查看系统用户列表等用例进行功能测试。
表6-2 管理员功能测试表
| 编号 | 用例说明 | 输入数据 | 预测结果 | 测试结果 |
|---|---|---|---|---|
| A01 | 登录后台 | 用户名:admin,密码:admin123 | 登录成功,进入管理员后台首页,显示平台运营概览(如:用户总数、累计答题次数、今日新增题目数) | 通过 |
| A02 | 发布通知公告 | 标题:“系统升级:新增50种热带水果题库”,内容:“本周我们更新了榴莲、山竹等热带水果的识别数据,欢迎大家前来挑战!” | 公告发布成功,用户端首页公告栏即时可见该通知,点击可查看详情 | 通过 |
| A03 | 管理水果资讯 | 发布一篇标题为“春季草莓种植与病虫害防治指南”的文章,分类选择“种植技术” | 资讯发布成功,用户可在“水果资讯”板块浏览、阅读及点赞该文章,无分类错误 | 通过 |
| A04 | 审核识果挑战 | 在“题目审核”列表中,找到一条用户提交的新题目(题目:“外皮金黄且有软刺的水果是?”,选项:A.菠萝 B.榴莲),将状态由“待审核”改为“已上架” | 题目审核通过,该题目正式加入“识果挑战”随机题库,其他用户在进行挑战时有可能抽到此题 | 通过 |
| A05 | 管理水果科普 | 进入“科普管理”页,编辑条目“阳光玫瑰葡萄”,补充其“糖度范围”和“最佳产地”信息并保存 | 修改保存成功,用户端在查看该水果的百科详情页或答题解析页时,能立即看到更新后的详细信息 | 通过 |
| A06 | 查看系统用户列表 | 进入“系统用户”管理页面,筛选角色为“普通用户”,并搜索用户名“fruit_fan” | 正确显示该用户信息(昵称、注册时间、累计答题数、准确率),支持对该账号进行“禁用”或“重置密码”操作 | 通过 |
6.3 测试结果
系统功能测试结果表明,普通用户、教师用户和管理员三类角色的核心操作均能正常执行。普通用户可顺利完成注册登录、水果挑战提交、通知公告查看及水果科普收藏等操作;管理员在系统用户统筹、水果资讯与公告发布、识果挑战审核、水果科普管理及全局数据管控方面功能完整,角色权限隔离准确。测试覆盖了主要业务流程,系统界面响应正常,数据交互一致,预期结果达成率高,未发现严重功能缺陷。整体测试结果验证了系统功能的完整性与稳定性,达到了设计预期,具备投入实际应用的基础条件。
👇精彩专栏 推荐订阅👇
精选100个热门Java毕业设计项目|适配2026‑2027届选题参考✅
精选100个热门Python毕业设计项目|适配2026‑2027届选题参考✅
精选100个热门微信小程序/安卓APP毕业设计项目|适配2026‑2027届选题参考✅
✅获取源码请私信✅
感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以找我咨询,希望帮助更多的人❤️

233

被折叠的 条评论
为什么被折叠?



