基于JAVA的卡证识别管理毕业设计作品分享一下,希望能帮助到有需要的同学们。
【背景/简介】
基于JAVA的卡证识别管理系统核心功能为卡证识别,简单实用,往往可以作为大学毕业设计/课程设计的选题目标。卡证识别包括身份证识别、银行卡识别、名片识别、护照识别、营业执照识别、往来港澳通行证识别等,本篇文章以名片识别和身份证识别为例子,为大家展示基于JAVA实现的卡证识别管理功能,有需者可参考。
【设计思路】
卡证识别系统核心在于识别功能,考虑到成本加开发时间等因素,识别功能将基于JAVA采用第三方识别接口开发。
【技术框架】
系统采用的技术是基于JAVA语言开发的后台管理系统,前后端不分离,数据库采用mysql。技术栈如下:
一、后端技术:SpringBoot2.0 + Spring Data Jpa + Shiro
二、前端技术:Layui
【核心开发】
一、数据库设计
核心表为名片用户表(or_businessCard),具体字段如下
@Data
@Entity
@Table(name="or_businessCard")
public class BusinessCard implements Serializable {
// 主键ID
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;
private String name;
// 职位
private String job;
// 公司
private String company;
// 地址
private String address;
// 网址
private String url;
// 手机
private String mobile;
// 固定电话
private String fixedPhone;
// 传真
private String fax;
// qq
private String qq;
// 微信
private String weChat;
// 创建时间
@CreatedDate
private Date createDate;
// 更新时间
@LastModifiedDate
private Date updateDate;
// 创建者
@CreatedBy
@ManyToOne(fetch=FetchType.LAZY)
@NotFound(action=NotFoundAction.IGNORE)
@JoinColumn(name="create_by")
@JsonIgnore
private User createBy;
// 更新者
@LastModifiedBy
@ManyToOne(fetch=FetchType.LAZY)
@NotFound(action=NotFoundAction.IGNORE)
@JoinColumn(name="update_by")
@JsonIgnore
private User updateBy;
// 数据状态
private Byte status = StatusEnum.OK.getCode();
}
身份证表设计如下:
@Data
@Entity
@Table(name="or_cardInfo")
public class CardInfo implements Serializable {
// 主键ID
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;
private String name;
// 民族
private String nation;
// 住址
private String address;
// 省份
private String province;
// 公民身份号码
private String idNum;
// 性别
private String sex;
// 出生
private String born;
// 创建时间
@CreatedDate
private Date createDate;
// 更新时间
@LastModifiedDate
private Date updateDate;
// 数据状态
private Byte status = StatusEnum.OK.getCode();
}
二、前端上传图片代码
/** 上传图片操作 */
upload.render({
elem: '.upload-image' //绑定元素
,url: $('.upload-image').attr('up-url') //上传接口
,field: 'image' //文件域的字段名
,acceptMime: 'image/*' //选择文件类型
,exts: 'jpg|jpeg|png|gif' //支持的图片格式
,multiple: true //开启多文件选择
,choose: function (obj) {
obj.preview(function (index, file, result) {
var upload = $('.upload-image');
var name = upload.attr('name');
var show = upload.parents('.layui-form-item').children('.upload-show');
show.append("<div class='upload-item'><img src='"+ result +"'/>" +
"<input id='"+ index +"' type='hidden' name='"+name+"'/>" +
"<i class='upload-item-close layui-icon layui-icon-close'></i></div>");
});
}
,done: function(res, index, upload){
console.log("2222="+JSON.stringify(res.data));
layer.msg("识别名片成功", {offset: '15px', time: 3000, icon: 1});
var field = $('.upload-image').attr('up-field') || 'id';
// 解决节点渲染和异步上传不同步问题
var interval = window.setInterval(function(){
var hide = $("#"+index);
if(hide.length > 0){
var item = hide.parent('.upload-item');
if (res.code === 200) {
hide.val(res.data[field]);
item.addClass('succeed');
}else {
hide.remove();
item.addClass('error');
}
clearInterval(interval);
}
}, 100);
}
});
三、后端代码
/**
* 上传图片
*/
@PostMapping("/upload/image")
@ResponseBody
public ResultVo uploadImage(@RequestParam("image") MultipartFile multipartFile) {
Upload upload = FileUpload.getFile(multipartFile, "/images");
try {
ResultVo resultVo = saveImage(multipartFile, upload);
//图片URL
String imgUrl = "";
//图片base64字符
String imgBase64 = "";
//token秘钥
String token = yuebaoTest2();
//接口URL
String url = "https://ai.ybinsure.com/s/api/ocr/businessCard";
//图片文件
File file = FileUpload.getDestFile(upload);
Map<String, String> map = new HashMap<>();
map.put(IMG_URL, imgUrl);
map.put(IMG_BASE_64, imgBase64);
map.put(TOKEN, token);
//执行识别接口
String result = yuebaoPost(url, map, file);
JSONObject jsonObject = JSON.parseObject(result);
JSONArray userInfor = (JSONArray)jsonObject.get("data");
BusinessCard businessCard = new BusinessCard();
for (Object o : userInfor) {
JSONObject detail = JSON.parseObject(o.toString());
String desc =(String) detail.get("desc");
String value =(String) detail.get("value");
if("姓名".equals(desc)){
businessCard.setName(value);
}else if("职位".equals(desc)){
businessCard.setJob(value);
}else if("公司".equals(desc)){
businessCard.setCompany(value);
}else if("地址".equals(desc)){
businessCard.setAddress(value);
}else if("网址".equals(desc)){
businessCard.setUrl(value);
}else if("手机".equals(desc)){
businessCard.setMobile(value);
}else if("电话".equals(desc)){
businessCard.setFixedPhone(value);
}else if("QQ".equals(desc)){
businessCard.setQq(value);
}else if("微信".equals(desc)){
businessCard.setWeChat(value);
}else if("传真".equals(desc)){
businessCard.setFax(value);
}
}
resultVo.setData(businessCard);
return resultVo;
} catch (IOException | NoSuchAlgorithmException e) {
return ResultVoUtil.error("上传图片失败");
}
}
【功能展示】
一、名片用户列表
二、上传名片图片
三、名片&身份证识别结果展示
四、用户统计展示
根据收集的识别用户信息,分三个维度进行数据统计展示,分别是性别统计、民族统计、省分统计。前端采用echart图标展示技术。图表展示界面如下:
核心代码如下:
<script type="text/javascript">
var sexCount;
var proNum;
var nationCount;
$(function(){
//调用接口返回echart所需数据
$.get("/idCard/cardInfo/count", function(result){
console.log(JSON.stringify(result.data));
sexCount = result.data.sexCount;
proNum =result.data.proNum;
nationCount = result.data.nationCount;
// 基于准备好的dom,初始化echarts实例
//性别统计
var mysexChart = echarts.init(document.getElementById('sex'));
//民族统计
var myNationChart = echarts.init(document.getElementById('nation'));
//省分
var myProvinceChart = echarts.init(document.getElementById('province'));
// 性别数据
var sexOption = {
title: {
text: '性别统计'
},
tooltip: {
},
legend: {
data: ['数量']
},
xAxis: {
data: sexCount.name
},
yAxis: {
},
series: [
{
name: '数量',
type: 'bar',
data: sexCount.num
}
]
};
// 性别使用刚指定的配置项和数据显示图表。
mysexChart.setOption(sexOption);
//民族
var nationOption = {
title: {
text: '民族统计',
left: 'center'
},
tooltip: {
trigger: 'item'
},
legend: {
orient: 'vertical',
left: 'left'
},
series: [
{
name: '数量',
type: 'pie',
radius: '50%',
data: nationCount,
emphasis: {
itemStyle: {
shadowBlur: 10,
shadowOffsetX: 0,
shadowColor: 'rgba(0, 0, 0, 0.5)'
}
}
}
]
};
myNationChart.setOption(nationOption);
//省分
var provinceOption = {
title: {
text: '省分统计',
left: 'center'
},
tooltip: {
trigger: 'item'
},
legend: {
orient: 'vertical',
left: 'left'
},
series: [
{
name: '数量',
type: 'pie',
radius: '50%',
data: proNum,
emphasis: {
itemStyle: {
shadowBlur: 10,
shadowOffsetX: 0,
shadowColor: 'rgba(0, 0, 0, 0.5)'
}
}
}
]
};
myProvinceChart.setOption(provinceOption);
});
});
</script>
【总结】
卡证识别应用范围管,核心功能主要有两个:
(1)调用第三方api系统进行卡证识别,不同的卡证有对应不同的api接口,解决的难点就是api对接和图片上传处理。
(2)针对识别后的数据,可以通过echart做不同图表的展示,简单实用。