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

基于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做不同圖表的展示播瞳,簡單實用。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末免糕,一起剝皮案震驚了整個濱河市赢乓,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌石窑,老刑警劉巖牌芋,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異松逊,居然都是意外死亡躺屁,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進(jìn)店門经宏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來楼咳,“玉大人,你說我怎么就攤上這事烛恤。” “怎么了余耽?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵缚柏,是天一觀的道長。 經(jīng)常有香客問我碟贾,道長币喧,這世上最難降的妖魔是什么轨域? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮杀餐,結(jié)果婚禮上干发,老公的妹妹穿的比我還像新娘。我一直安慰自己史翘,他們只是感情好枉长,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著琼讽,像睡著了一般必峰。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上钻蹬,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天吼蚁,我揣著相機(jī)與錄音,去河邊找鬼问欠。 笑死肝匆,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的顺献。 我是一名探鬼主播旗国,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼滚澜!你這毒婦竟也來了粗仓?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤设捐,失蹤者是張志新(化名)和其女友劉穎借浊,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體萝招,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蚂斤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了槐沼。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片曙蒸。...
    茶點(diǎn)故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖岗钩,靈堂內(nèi)的尸體忽然破棺而出纽窟,到底是詐尸還是另有隱情,我是刑警寧澤兼吓,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布臂港,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏审孽。R本人自食惡果不足惜县袱,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望佑力。 院中可真熱鬧式散,春花似錦、人聲如沸打颤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瘸洛。三九已至揍移,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間反肋,已是汗流浹背那伐。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留石蔗,地道東北人罕邀。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像养距,于是被迫代替她去往敵國和親诉探。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評論 2 348

推薦閱讀更多精彩內(nèi)容