# 图像识别APP **Repository Path**: we_2575603672/image-recognition-app ## Basic Information - **Project Name**: 图像识别APP - **Description**: 图像识别APP是采用Java语言与APP开发框架mui.js相结合的方式打造出一款以通过图像识别的方式来获取知识、分享知识、开阔眼界且独具特色的APP应用。 本文从拥有求知欲的用户的角度思考问题,通过调查这类用户所遇问题而提出需求,并在开发的角度对APP进行总体设计与详细设计分析和系统实现,把目前应用和后继发展进行兼顾考虑。 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 0 - **Created**: 2024-06-11 - **Last Updated**: 2025-03-30 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ![image-20240611231315114](images/image-20240611231315114.png) 将client_id和client_secret 换成自己到百度AI平台中申请的秘钥 ![image-20240611225734512](images/image-20240611225734512.png) 将其中的username和password换成自己的邮箱和授权码,记得在自己邮箱中打开smtp权限。 本次设计具备普通用户使用的App应用软件与管理员使用的管理网站。 App应用具有最基本的注册与登录,各种物品的图像识别,识别分享,个人信息管理。如图3.1所示。 ![img](images/wps1.jpg) 图3.1 APP结构图 管理网站应具备基础的登录和登出以及管理APP应用中的图像识别信息,识别分享信息、留言与用户信息的功能。如图3.2所示。 ![img](images/wps2.jpg) 图3.2 后台管理结构图 数据库共分成三个实体,两个关联实体,存在五个关系模式,其中有拥有用户账号信息的用户实体,拥有识别结果信息的识别内容实体,拥有分享内容信息的分享内容实体,一个用户可以收藏多个识别内容,而一个识别内容只能被一个用户收藏,一个用户可以发布多个分享内容,但一个分享内容只能由一个用户发布,一个分享内容只能对应一个识别内容,一个用户可以点赞多个分享内容,一个分享内容可以被多个用户点赞。一个用户可以在多个分享内容中留言,一个分享内容可以被多个用户留言。其主体ER图如图3.3所示。 ![img](images/wps3.jpg) 图3.3主体ER图 (1) 拥有用户账号信息的用户实体,如图3.4所示。 img 图3.4 用户ER图 (2)用于存储用户识别信息的识别内容实体,如图3.5所示。 ![img](images/wps5.jpg) 图3.5识别内容ER图 (3)用于存储用户识别后分享出来的分享信息的分享内容实体,如图3.6所示。 ![img](images/wps6.jpg) 图3.6 分享内容ER图 (4)用于存储各用户在各分享信息中留言的留言信息的关联关系,如图3.7所示。 ![img](images/wps7.jpg) 图3.7 留言信息ER图 (5)用于存储各用户在各分享信息中的点赞信息的关联关系,如图3.8所示。 ![img](images/wps8.jpg) 图3.8 点赞信息ER图 这里列举了主要的数据库表的结构,如表3-1~3-5所示。 表3-1用户表 | ***\*名称\**** | ***\*类型\**** | ***\*长度\**** | ***\*小数点\**** | ***\*非空\**** | ***\*主键\**** | ***\*备注\**** | | -------------- | -------------- | -------------- | ---------------- | -------------- | -------------- | -------------- | | USER_ID | int | 11 | 0 | Y | Y | 唯一编号 | | USERNAME | varchar | 64 | 0 | Y | N | 账号 | | PASSWORD | varchar | 64 | 0 | Y | N | 密码 | | NICKNAME | varchar | 64 | 0 | Y | N | 昵称 | | HEAD_IMAGE_URL | varchar | 255 | 0 | Y | N | 头像路径 | | EMAIL | varchar | 64 | 0 | Y | N | 邮箱 | | USER_TYPE | tinyint | 1 | 0 | Y | N | 用户类型 | | CREATED_BY | int | 11 | 0 | N | N | 创建人 | | CREATED_TIME | datetime | 28 | 0 | N | N | 创建时间 | | UPDATED_BY | int | 11 | 0 | N | N | 修改人 | | UPDATED_TIME | datetime | 28 | 0 | N | N | 修改时间 | 表3-2识别内容表 | ***\*名称\**** | ***\*类型\**** | ***\*长度\**** | ***\*小数点\**** | ***\*非空\**** | ***\*主键\**** | ***\*备注\**** | | -------------- | -------------- | -------------- | ---------------- | -------------- | -------------- | -------------- | | ID | varchar | 64 | 0 | Y | Y | 唯一编号 | | PARENT_ID | varchar | 64 | 0 | N | N | 父级编号 | | NAME | varchar | 64 | 0 | N | N | 名称 | | SCORE | decimal | 6 | 2 | N | N | 相似度 | | MESSAGE | varchar | 2000 | 0 | N | N | 内容 | | IMAGE_PATH | varchar | 255 | 0 | Y | N | 图片路径 | | CREATED_BY | int | 11 | 0 | N | N | 创建人 | | CREATED_TIME | datetime | 28 | 0 | N | N | 创建时间 | | UPDATED_BY | int | 11 | 0 | N | N | 修改人 | | UPDATED_TIME | datetime | 28 | 0 | N | N | 修改时间 | 表3-3分享内容表 | ***\*名称\**** | ***\*类型\**** | ***\*长度\**** | ***\*小数点\**** | ***\*非空\**** | ***\*主键\**** | ***\*备注\**** | | ----------------- | -------------- | -------------- | ---------------- | -------------- | -------------- | -------------- | | ID | int | 11 | 0 | Y | Y | 唯一编号 | | IDENTIFICATION_ID | varchar | 64 | 0 | Y | N | 识别编号 | | TITLE | varchar | 64 | 0 | Y | N | 标题 | | MESSAGE | varchar | 255 | 0 | Y | N | 内容 | | CREATED_BY | int | 11 | 0 | Y | N | 创建人 | | CREATED_TIME | datetime | 28 | 0 | Y | N | 创建时间 | | UPDATED_BY | int | 11 | 0 | N | N | 修改人 | | UPDATED_TIME | datetime | 28 | 0 | N | N | 修改时间 | 表3-4点赞表 | ***\*名称\**** | ***\*类型\**** | ***\*长度\**** | ***\*小数点\**** | ***\*非空\**** | ***\*主键\**** | ***\*备注\**** | | -------------- | -------------- | -------------- | ---------------- | -------------- | -------------- | -------------- | | ID | int | 11 | 0 | Y | Y | 唯一编号 | | INVITATION_ID | int | 11 | 0 | Y | N | 分享编号 | | CREATED_BY | int | 11 | 0 | Y | N | 创建人 | | CREATED_TIME | datetime | 28 | 0 | Y | N | 创建时间 | 表3-5留言表 | ***\*名称\**** | ***\*类型\**** | ***\*长度\**** | ***\*小数点\**** | ***\*非空\**** | ***\*主键\**** | ***\*备注\**** | | -------------- | -------------- | -------------- | ---------------- | -------------- | -------------- | -------------- | | ID | int | 11 | 0 | Y | Y | 唯一编号 | | MESSAGE | varchar | 255 | 0 | Y | N | 留言内容 | | INVITATION_ID | int | 11 | 0 | Y | N | 分享编号 | | CREATED_BY | int | 11 | 0 | Y | N | 创建人 | | CREATED_TIME | datetime | 28 | 0 | Y | N | 创建时间 | ![img](file:///C:\Users\Administrator\AppData\Local\Temp\ksohtml16416\wps9.png) 用户注册为了验证用户身份的真实性,采用邮箱验证方式,使用网易邮箱平台可实现通过公钥与秘钥的方式实现在后端发送电子邮件到用户所填写的邮箱上,在用户填写完自定义的账号、邮箱等信息后,需要点击界面上的获取验证码,App会将客户所填写的账号与邮箱进行校验,若账号已存在则拒绝用户注册,若账号未存在则在服务端生成拥有随机6位数字与英文字符组成的有效期五分钟的验证码并使用模板创建邮件页面通过系统的网易邮箱发送到用户的电子邮箱上,用户在注册界面输入所收到的验证码并点击注册,若验证码正确且未失效则提示注册成功并跳转到登录页面。其流程如图4.1所示。 ![img](images/wps10.jpg) 图4.1注册流程图 用户登录是为了实现APP应用的安全性,除了对账号密码进行校验外,还需要获得服务端的授权。因此采用JWT令牌实现该功能,在用户登录时,服务端会校验用户名与密码是否匹配,若匹配则将用户信息及其签名经过编码后生成一个字符串令牌,服务器会将其存储在redis中并设置过期时间为十五分钟,APP客户端在拿到返回的令牌之后将其存储在本地文件中,每次访问数据时都必须携带令牌才能进行成功访问,而服务端在接收到用户的令牌之后会进行增强,重置其过期时间。若用户在十五分钟之内没有进行任意操作,则存储在redis中的令牌的值将会过期,此时若客户进行操作时,会提示用户进行重新登录。其流程如图4.2所示。 ![img](images/wps11.jpg) 图4.2 权限校验流程图 图像识别功能使用的是百度AI平台与百度百科平台的组合识别图片并获取信息。用户在APP界面上通过拍照或获取本地图片的方式上传图片,客户端会先将图片转成base64字符串,通过post请求将字符串上传到服务端,服务端会先判断图片格式是否正确,若正确则判断图片是否大于200kb,若大于则会将其转为io流并进行压缩,直到图片小于200kb,转储到服务端中并返回存储的图片路径,而后使用百度AI平台颁发的公钥与私钥向服务平台发送http请求获取令牌,而后根据用户选择的识别内容不同将令牌与图片的base64编码上传到平台开放的不同接口获取其返回值,服务端根据其不同的接口使用不同的方式解析返回值。若解析完成后,解析结果中不存在图片与内容,则将其名称使用get请求模拟百度百科查询并获取其返回的H5页面字符串,通过解析其字符串,获取其中的图片路径与百科内容。若经过两次搜索解析后仍未找到其识别结果的图片,则系统会使用用户上传的图片作为其名称对应的图片,最后将结果返回给客户端。如图4.3所示。 ![img](images/wps12.jpg) 图4.3 图像识别顺序图 ### 在图像识别结果出来后,用户可点击界面上的收藏按钮,填写名称并点击确认,APP客户端会将名称和识别结果一起传给服务端,服务端会将识别结果以用户上传的图像为父级,而识别结果信息为子集存储到mysql数据库中。通过将当前的用户ID和自定义名称赋值给父级信息的属性来区分该信息为用户的收藏信息。用户收藏成功后可在我的收藏中查看并编辑名称与进行删除操作。 管理员登录后台管理网站后可以对图像识别内容进行管理,对图像识别的内容可以进行条件查询、添加新的数据、修改旧的数据、删除存在的数据等操作。 ## 用户在进行识别后,可将识别结果进行分享,输入标题与内容并点击确认,APP客户端会将识别结果内容存入到识别内容表中,而后将识别内容ID、标题、内容和当前用户ID也存入到分享信息表中。用户成功分享后可在我的分享中查看并修改和删除。 用户也可在分享信息板块中查看自己与其他用户分享出来的识别信息,并且也可查看识别出来的信息详情,且对于自己喜欢的信息也可进行点赞,点赞成功后可在我的点赞中查看和删除。用户点赞后,APP会将分享内容的ID发送到服务端,服务端收到请求后会将当前用户与ID存储到数据库中的分享点赞表。 此外,用户也可在内容详情中进行留言。用户留言时,APP客户端会将分享内容ID与留言信息发送到服务端,服务端会将当前用户ID、分享内容ID和留言信息存储到mysql的留言表中。用户留言后也可在帖子下方的留言中找到自己的留言,并且该留言在右侧拥有删除按钮,用户可点击删除按钮删掉自己的留言。 管理员登录后台管理网站后可以对所有的识别分享进行管理,可以按条件搜索识别分享信息,可以添加新的识别分享信息,也可以修改旧的识别分享信息,还可以删除存在的识别分享信息。此外,管理员还可以管理每个识别分享下的留言,对留言信息也可以进行添加、修改和删除操作。 ## 普通用户在App客户端登录后可以在个人信息管理界面对自己的信息进行查看、修改、删除操作,其中包含了修改用户的昵称、头像和密码,也包含了对用户个人的收藏、点赞及分享内容的管理。 管理员可以登录后台管理网站,对所有用户信息进行管理。用户信息管理页面采用分页的方式对用户信息列表进行展示,并且可以按条件搜索用户信息、添加新的用户,修改旧用户的信息,删除存在的用户等操作。 用户在填写账号与邮箱后即可点击获取验证码,服务端在接收到请求后会通过查询数据库查看账号是否已经存在,若存在则发送验证码到邮箱,如图5.1所示。此功能使用了网易邮箱平台。 ![img](images\wps14.png)![img](images/wps15.png) 图5.1 注册页面与验证码邮件 首先注册网易邮箱平台,在邮箱主页上找到SMTP服务并将其开启,并在页面上获取授权码。在服务端使用MimeMessage 连接网易邮箱服务器并向其请求使用授权码用户邮箱向目标用户邮箱发送html页面,关键代码如图5.2所示。 ![img](images/wps16.jpg) 图5.2 获取验证码关键代码 用户注册完后若是忘记密码还可以进入重置密码界面,输入账号会自动显示预留的邮箱,输入验证码和密码后即可完成密码重置。重置密码的客户端页面如图5.3所示。 ![img](images/wps17.png) 图5.3 重置密码 ## 用户在注册成功后即可使用账号与密码登录APP使用其功能,该验证功能由服务端通过查询数据库验证账号与密码的正确性后会将其信息编码成token,保存到redis数据库中并将其数据发送给前端。其关键代码如图5.4所示。客户端页面如图5.5所示。服务端页面如图5.6所示。 ![img](images/wps18.jpg) 图5.4 登录功能关键代码 ![img](images/wps19.png) 图5.5 用户登录页面 ![img](images/wps20.jpg) 图5.6 管理员登录页面 普通用户点击底部菜单栏上的“我的”菜单选项即可进入个人信息管理页面,如图5.7所示。点击修改个人信息即可进入到修改页面,如图5.8所示。点击我的收藏即可进入到收藏页面,如图5.11所示。点击我的点赞即可进入到点赞记录页面,如图5.9所示,点击我的分享即可进入个人的分享管理页面,如图5.10所示。管理员用户登录管理网站后点击用户管理即可进入用户管理页面,如图5.12所示。 ![img](images/wps21.png) 图5.7 个人信息管理页面 ![img](images/wps22.png) 图5.8 修改个人信息页面 ![img](images/wps23.png) 图5.9 我的点赞页面 ![img](images/wps24.png) 图5.10 我的分享页面 ![img](images/wps25.png) 图5.11 我的收藏页面 img 图5.12 用户管理页面 图像识别功能是接入了百度AI平台,关键代码如图5.13所示。而后将拿到的数据进行处理,通过解析百度百科补全对应名称的图片和内容,再将百度百科查不到的数据进行补充,最后返回给客户。客户端识别页面如图5.14所示。识别后出现的结果列表如图5.15所示。点击列表中的其中一列即可查看详情信息,如图5.16所示。管理员登录管理网站即可管理识别内容信息,页面如图5.17所示。 ![img](images/wps27.jpg) 图5.13 图像识别关键代码 ![img](images/wps28.png) 图5.14 图像识别界面 ![img](images/wps29.png) 图5.15 识别结果界面 ![img](images/wps30.png) 图5.16 识别详情界面 ![img](images/wps31.jpg) 图5.17 识别内容管理页面 识别分享是用户在完成图像识别之后才可进行的操作,而在此之前,用户只能浏览其他用户分享出来的信息并可进行点赞和留言。如图5.18所示。点击列表可进入详情信息,如图5.19所示。详情信息中在图片下方是点赞按钮及其数量和评论总数量显示,底部是用户留言,如图5.20所示。管理员登录管理网站后点击识别分享管理即可进入分享信息的管理页面,如图5.21所示。 ![img](images/wps32.png) 图5.18 识别分享界面 ![img](images/wps33.png) 图5.19识别分享详情 ![img](images/wps34.png) 图5.20 识别分享留言信息 ![img](images/wps35.jpg) 图5.21 识别分享管理页面 ***\* \**** # 系统测试存在白盒测试与黑盒测试两种方式。白盒测试是指按照程序内部的结构对程序进行测试,检验程序是否能按照预定的路线正常工作。黑盒测试是在已知程序功能的情况下通过测试来检查每个功能是否可用。本次功能测试在服务端开发完成时已由IDEA自带的DEBUG工具测试过了每个处理方法的路线正确性和每个节点的变量和内存的状态变化,经检测符合预期规划。现采用黑盒测试中的错误推测法对APP的功能进行确认测试,并且也在其中加入了正确的测试内容来进行对比。 ## 本功能测试主要内容: (1)输入正确内容进行注册; (2)输入已注册的账号进行注册; (3)输入非邮箱获取验证码进行注册; (4)输入错误的验证码进行注册; (5)不输入任何内容进行注册; 测试结果如图6.1,6.2,6.3,6.4,6.5所示。 ![img](images/wps36.png) 图6.1 输入正确内容进行注册 ![img](images/wps37.png) 图6.2 输入已注册的账号进行再次注册 ![img](images/wps38.png) 图6.3 输入非邮箱获取验证码进行注册 ![img](images/wps39.png) 图6.4 输入错误的验证码进行注册 ![img](images/wps40.png) 图6.5 不输入任何内容进行注册 ## 本功能测试内容: (1)输入正确账号密码进行登录; (2)不输入内容进行登录; (3)使用不存在的账号或错误的密码进行登录; 测试结果如图6.6,6.7,6.8所示。 ![img](images/wps41.jpg) 图6.6 输入正确账号密码进行登录 ![img](images/wps42.png) 图6.7 不输入内容进行登录 ![img](images/wps43.png) 图6.8 使用不存在的账号或错误的密码进行登录 ## 本功能测试内容(以动物识别为例): (1)使用对应的图片进行识别; (2)使用与不对应的图片进行识别; (3)输入正确的名称进行收藏; (4)不输入名称进行收藏; (5)点击结果列表查看详情信息; 测试结果如图6.9,6.10,6.11,6.12,6.13所示。 ![img](images/wps44.png) 图6.9 使用对应的图片进行识别 ![img](images/wps45.png) 图6.10 使用与不对应的图片进行识别 ![img](images/wps46.png) 图6.11 输入正确的名称进行收藏 ![img](images/wps47.png) 图6.12 不输入名称进行收藏 ![img](images/wps48.png) 图6.13 点击结果列表查看详情信息 ## 本功能测试内容: (1)输入正确的内容进行分享; (2)不输入内容进行分享; (3)输入正确的内容进行留言; (4)不输入内容进行留言; (5)进行点赞; 测试结果如图6.14,6.15,6.16,6.17,6.18所示。 ![img](images/wps49.png) 图6.14 输入正确的内容进行分享 ![img](images/wps50.png) 图6.15 不输入内容进行分享 ![img](images/wps51.png) 图6.16 输入正确的内容进行留言 ![img](images/wps52.png) 图6.17 不输入内容进行留言 ![img](images/wps53.png) 图6.18 进行点赞 ## 本功能测试内容: (1)输入正确的内容修改个人信息; (2)清空内容修改个人信息; 测试结果如图6.19,6.20所示。 ![img](images/wps54.png) 图6.19 输入正确的内容修改个人信息 ![img](images/wps55.png) 图6.20 清空内容修改个人信息