畢業(yè)設計 - 基于JAVA的卡證識別管理系統(tǒng)(簡便易上手)

基于JAVA的卡證識別管理畢業(yè)設計作品分享一下,希望能幫助到有需要的同學們。

【背景/簡介】

基于JAVA的卡證識別管理系統(tǒng)核心功能為卡證識別,簡單實用,往往可以作為大學畢業(yè)設計/課程設計的選題目標。卡證識別包括身份證識別、銀行卡識別、名片識別、護照識別、營業(yè)執(zhí)照識別、往來港澳通行證識別等,本篇文章以名片識別和身份證識別為例子,為大家展示基于JAVA實現(xiàn)的卡證識別管理功能,有需者可參考。

【設計思路】

卡證識別系統(tǒng)核心在于識別功能,考慮到成本加開發(fā)時間等因素,識別功能將基于JAVA采用第三方識別接口開發(fā)。

【技術框架】

系統(tǒng)采用的技術是基于JAVA語言開發(fā)的后臺管理系統(tǒng),前后端不分離,數(shù)據(jù)庫采用mysql。技術棧如下:
一、后端技術:SpringBoot2.0 + Spring Data Jpa + Shiro
二、前端技術:Layui

【核心開發(fā)】

一、數(shù)據(jù)庫設計
核心表為名片用戶表(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;
    // 手機
    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();
}

身份證表設計如下:

@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é)點渲染和異步上傳不同步問題
            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("手機".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("上傳圖片失敗");
        }
    }

【功能展示】

一、名片用戶列表

二、上傳名片圖片

三、名片&身份證識別結果展示


四、用戶統(tǒng)計展示
根據(jù)收集的識別用戶信息,分三個維度進行數(shù)據(jù)統(tǒng)計展示,分別是性別統(tǒng)計、民族統(tǒng)計、省分統(tǒng)計。前端采用echart圖標展示技術。圖表展示界面如下:



核心代碼如下:

<script type="text/javascript">
    var sexCount;
    var proNum;
    var nationCount;
    $(function(){
        //調用接口返回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;

            // 基于準備好的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>

【總結】
卡證識別應用范圍管,核心功能主要有兩個:
(1)調用第三方api系統(tǒng)進行卡證識別,不同的卡證有對應不同的api接口,解決的難點就是api對接和圖片上傳處理。
(2)針對識別后的數(shù)據(jù),可以通過echart做不同圖表的展示,簡單實用。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容