毕业设计 - 基于JAVA的卡证识别管理系统(简便易上手)

基于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做不同图表的展示,简单实用。

猜你喜欢

转载自blog.csdn.net/weixin_43423484/article/details/122832021