基于JAVA的卡證識別管理畢業(yè)設(shè)計作品分享一下唱矛,希望能幫助到有需要的同學(xué)們表锻。
【背景/簡介】
基于JAVA的卡證識別管理系統(tǒng)核心功能為卡證識別吹菱,簡單實用附迷,往往可以作為大學(xué)畢業(yè)設(shè)計/課程設(shè)計的選題目標(biāo)。卡證識別包括身份證識別棱烂、銀行卡識別租漂、名片識別、護(hù)照識別颊糜、營業(yè)執(zhí)照識別哩治、往來港澳通行證識別等,本篇文章以名片識別和身份證識別為例子衬鱼,為大家展示基于JAVA實現(xiàn)的卡證識別管理功能业筏,有需者可參考。
【設(shè)計思路】
卡證識別系統(tǒng)核心在于識別功能鸟赫,考慮到成本加開發(fā)時間等因素蒜胖,識別功能將基于JAVA采用第三方識別接口開發(fā)。
【技術(shù)框架】
系統(tǒng)采用的技術(shù)是基于JAVA語言開發(fā)的后臺管理系統(tǒng)抛蚤,前后端不分離台谢,數(shù)據(jù)庫采用mysql。技術(shù)棧如下:
一岁经、后端技術(shù):SpringBoot2.0 + Spring Data Jpa + Shiro
二朋沮、前端技術(shù):Layui
【核心開發(fā)】
一、數(shù)據(jù)庫設(shè)計
核心表為名片用戶表(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;
// 網(wǎng)址
private String url;
// 手機(jī)
private String mobile;
// 固定電話
private String fixedPhone;
// 傳真
private String fax;
// qq
private String qq;
// 微信
private String weChat;
// 創(chuàng)建時間
@CreatedDate
private Date createDate;
// 更新時間
@LastModifiedDate
private Date updateDate;
// 創(chuàng)建者
@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;
// 數(shù)據(jù)狀態(tài)
private Byte status = StatusEnum.OK.getCode();
}
身份證表設(shè)計如下:
@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;
// 創(chuàng)建時間
@CreatedDate
private Date createDate;
// 更新時間
@LastModifiedDate
private Date updateDate;
// 數(shù)據(jù)狀態(tài)
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';
// 解決節(jié)點(diǎn)渲染和異步上傳不同步問題
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);
//執(zhí)行識別接口
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("網(wǎng)址".equals(desc)){
businessCard.setUrl(value);
}else if("手機(jī)".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("上傳圖片失敗");
}
}
【功能展示】
一、名片用戶列表
二骑脱、上傳名片圖片
三菜枷、名片&身份證識別結(jié)果展示
四、用戶統(tǒng)計展示
根據(jù)收集的識別用戶信息叁丧,分三個維度進(jìn)行數(shù)據(jù)統(tǒng)計展示啤誊,分別是性別統(tǒng)計、民族統(tǒng)計拥娄、省分統(tǒng)計蚊锹。前端采用echart圖標(biāo)展示技術(shù)。圖表展示界面如下:
核心代碼如下:
<script type="text/javascript">
var sexCount;
var proNum;
var nationCount;
$(function(){
//調(diào)用接口返回echart所需數(shù)據(jù)
$.get("/idCard/cardInfo/count", function(result){
console.log(JSON.stringify(result.data));
sexCount = result.data.sexCount;
proNum =result.data.proNum;
nationCount = result.data.nationCount;
// 基于準(zhǔn)備好的dom稚瘾,初始化echarts實例
//性別統(tǒng)計
var mysexChart = echarts.init(document.getElementById('sex'));
//民族統(tǒng)計
var myNationChart = echarts.init(document.getElementById('nation'));
//省分
var myProvinceChart = echarts.init(document.getElementById('province'));
// 性別數(shù)據(jù)
var sexOption = {
title: {
text: '性別統(tǒng)計'
},
tooltip: {},
legend: {
data: ['數(shù)量']
},
xAxis: {
data: sexCount.name
},
yAxis: {},
series: [
{
name: '數(shù)量',
type: 'bar',
data: sexCount.num
}
]
};
// 性別使用剛指定的配置項和數(shù)據(jù)顯示圖表牡昆。
mysexChart.setOption(sexOption);
//民族
var nationOption = {
title: {
text: '民族統(tǒng)計',
left: 'center'
},
tooltip: {
trigger: 'item'
},
legend: {
orient: 'vertical',
left: 'left'
},
series: [
{
name: '數(shù)量',
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: '省分統(tǒng)計',
left: 'center'
},
tooltip: {
trigger: 'item'
},
legend: {
orient: 'vertical',
left: 'left'
},
series: [
{
name: '數(shù)量',
type: 'pie',
radius: '50%',
data: proNum,
emphasis: {
itemStyle: {
shadowBlur: 10,
shadowOffsetX: 0,
shadowColor: 'rgba(0, 0, 0, 0.5)'
}
}
}
]
};
myProvinceChart.setOption(provinceOption);
});
});
</script>
【總結(jié)】
卡證識別應(yīng)用范圍管,核心功能主要有兩個:
(1)調(diào)用第三方api系統(tǒng)進(jìn)行卡證識別摊欠,不同的卡證有對應(yīng)不同的api接口丢烘,解決的難點(diǎn)就是api對接和圖片上傳處理。
(2)針對識別后的數(shù)據(jù)些椒,可以通過echart做不同圖表的展示播瞳,簡單實用。