本系统可在前端批量识别身份证照片,将识别到的身份证信息存入数据库,然后可以提供在前端导出到EXcel里,由于信息具有时效性,数据库里的身份证信息会在每日的凌晨一点自动清除。本系统经过改造可以,添加功能,可以作为毕业设计。文末附源码。
**
系统提出背景:
有一次去做核酸的时候,发现核酸站点,一名医护人员在取样,另一名在拿着身份证手工摘抄身份证号到记录簿上,当时想到,一个社区千百个人,这样工作量岂不是很大,于是就动了一个念头,那么,用我的专业知识是否能开发一套线上的系统,帮助他们快速识别身份证信息,然后提供批量操作功能。
系统分析
根据以上背景原因,开始着手分析系统应该具备的功能,通过仔细考虑以后,因为办公地点不同,办公地点线路问题,不能即时为电脑供电,所以没有做实时识别导入功能,当天医护人员可以将拍的照传到电脑上,一键批量导入,方便统计,
在前端主要设计两个页面,一个是导入页面,一个是导入成功以后,将信息显示在页面上,并且提供 选定导出项功能,后端则进行功能模块代码编写。
于是会产生这么几个问题:
1 每个用户同时进行操作的时候,如何保证数据不乱
2 每个用户导入的数据,该放为每个用户建立一张表,存放对应的数据,
3用户频繁请求时,如何避免重复提交等问题
4 系统的效率有多高,每次允许用户传多少张图片合适呢,等等,基于以上问题的分析,我展开了系统的整体和详细设计
系统设计
1 因为服务器是邀请式注册,服务器性能低,承受不住高并发,所以很难去开放式注册,只能面向小众社区,千百号人,如果使用的人多了也不太方便,这个会在下文细说
2 框架 框架还是采用熟悉的springboot+Thymeleaf开发,本系统,一个人经历了全栈开发,从设计到实施再到运维。
3 对于数据库方面,如果给每个用户开辟一张表,对于本系统来说没什么,可是以后遇到这样的业务场景,总不能 都开辟一张表,这样用户的基数庞大了,所以最终让用户插入的信息都插到一张表了,让用户登录的sessionid做隔断,查询的时候根据对应的session_id将用户的信息返回到前端即可。这样还方便定时任务统一将所有的信息清除掉。可谓是一箭多雕啊
4 在后端的配置文件里,更改Tomcat单次可以上传的最大容量,因为face++单次要求的图片为2mb,所以为了最大控制在50张以内,服务器承载的最大容量为100MB,虽然在前端提示是不超过50张,这里没有做图片的数量限制,实际上只要容量不超过100mb即可使用。
5 单节点测试:就是我只用一个用户进行批量测试,看看该接口的效率怎么样,果然免费的是最贵的,如果一次性请求的次数过快,接口就奔溃了,于是我进行了反反复复的测试。主要有以下两种方法:
**牺牲效率:**单次让用户上传的少一点,多上传几次,这样接口不会奔溃。
**牺牲时间:**每执行一次,让线程休眠一定时间,这样就是花费了一定的时间,可以让用户一次性的多上传一点。
在反复的思考下,我觉得本系统的意义就是在于批量上传识别,所以说,牺牲效率的方法不可取,那么选择牺牲时间的方法,那么牺牲时间要牺牲多长时间才合适,才能满足最大效率。于是我又经过大量的测试,开始从100ms,到1000ms之间找最值,当某次设定为600ms的时候,50张执行成功,但是紧接着在试一次失败了,于是,我就又写了一种方法,就是让每执行几次,休息二倍时间,那么执行几次合适,于是我又经过了大量测试,最终定格在让他执行10次,也就是每执行10次,休息1-1.5秒,这样在接口请求的情况下,该服务不容易被熔断。
6 单节点测试通过时,我就开启了多用户并发测试。这里的多用户是三个用户,因为我电脑只有三个浏览器,而且每次要提交50张图片,用其他的接口请求测试工具不太方便,当然可能也有可以批量传文件的,只不过我没发现而已,不测不知道,一测吓一跳,要不说程序开发的生命周期40%是在做测试工作,当进行三个用户测试的时候,服务又奔溃了,我一想,为什么单节点运行的好好地,一到了各自的线程里就会奔溃了,百思不得其解,突然恍然大悟,因为这又回到了那个问题,多线程并发的时候,也是在那一瞬间就对接口进行请求,造成了请求过快,所以奔溃的原因,这里可以有底气的说一句,如果我有钱开通付费服务,根本就不用考虑下边的解决办法,哈哈。有钱就是豪横。
7解决方案,这个方案就是类似于分布式秒杀同一类商品的原理,多线程同时进行抢一个方法,谁抢到谁执行,起初我用的是非公平锁,然后执行的时候,发生了数据混乱,于是又改成了公平锁,当然对这个系统来说也比较友好,谁先来谁用,后来的排队,不能插队。测试通过
8 那么对于前端的用户,怎么能让他们知道提交成功了呢,避免重复提交。
起初我做了一个进度的页面,让他们实时的可以看到进度,可就是因为设计进度的方案,导致系统出现了很多bug,后来虽然进度的功能做出来了,但是我感觉没有必要做那个功能,于是在前端设计了一个提交等待的界面,当点击提交按钮的时候,出现遮罩层,给一个动画,防止用户重复提交,也可以避免同一用户不断提交,每当用户一提交了以后,等到执行结果才可继续提交,这样对多用户在并发的时候比较公平。
Tips:这里锁我用的是Lock锁,而且之前因为没有锁对位置,让每个线程持有了一把锁,所以导致服务又奔溃了,后来突然想到,应该是多线程抢一把锁,所以修正以后系统平稳运行,
不想用锁也可以用数据库来实现,插入一个主键方法,这样别的线程插入的时候就报错,不能执行只能等待了,但是这样得手动去实现等待队列,或者让线程休眠,因为我的识别方法和上面的请求进来没有分离,所以最用还是用了lock锁比较方便,读者以后遇到业务可以考虑一下那个方法。
系统实现:
本地运行平稳以后就要发布,我发布在了我的云服务器上
配置:阿里云ECS服务器(共享型),单核2G 1mb的带宽,不得不说1mb的带宽服务是真慢啊,今天正好阿里云的客服给我打了一个电话,我和他说了一下细节,经过沟通,我升级了几天的2mb带宽,这个速度明细就感觉比之前快了,访问网站以及请求数据变快了。都是金钱惹的祸啊!
正文: springboot项目默认打包方式 jar,而且jar部署也方便,我用了war,一直和服务器有冲突,环境不对,一气之下,我还是选择了jar的方式。下面请看步骤,
因为我 在我的云服务器上8080端口还跑着一个我的静态网页,所以我需要开放一个8081端口用来部署服务,
提示:Tomcat和jar只要端口号不冲突可以同时启动
因为80端口运行这nginx,所以开放一个81端口用来跑http服务,因为springboot项目运行的时候需要由http服务开通,这个bug我也解决了好久。
1 阿里云控制台 开放安全组,开放 8081,81端口,
2 在服务器里开放上述端口,开放步骤请点击此链接:
3 打包部署项目,请点击此链接:
4 如果80端口被占用,需要修改http端口,请点击此链接
5 开启httpd 服务,需要先下载,步骤请点击此链接
所有的服务启动起来以后,可以查看端口号,是否平稳运行,命令:
查看端口运行情况
netstat -ntlp
根据pid 杀掉进程:
kill -9 8640
后边的8640是pid
6 查看启动日志 请点击此链接
部署完毕。然后就可以在系统中通过对应的端口访问系统。
源码获取可以通过 :
1 去我的下载主页 下载,
https://download.csdn.net/download/delete_bug/85526999
2 通过关注公众号,后台回复:身份证识别系统获取