基于可视化结构的身份证号码校验系统

谁说我不能喝 提交于 2020-02-23 15:47:38

基于可视化结构的身份证号码校验系统

摘要: 本作品是一个通用的身份证号码校验系统,目前已经尝试在Linux和Windows系统下运行,结果均可达到理想效果。系统通过运用基础GUI库tkinter创建系统兼容性极高的可视化界面。通过数据结构算法对身份证号码进行分析和计算,最终输出由身份证号得到的身份信息,同时如果信息有误,系统会通过可视化界面进行提示。同时系统还具有程序简洁,灵活,执行效率高等众多优势。
关键词: 身份证校验;可视化;

1 问题描述:

二代身份证作为证明公民身份的证件,身份证号码是独一无二的编号,因此根据身份证号码校验身份证的真伪尤为重要。校验身份证号码真伪应该符合以下设计要求:
(1)身份证号码长度的正确性
(2)身份证号码的合法性
拟设计的身份证号码的校验系统,不仅可以做到校验身份证号码的长度是否正确,校验身份证号码的合法性,还可以识别出生年月、籍贯、性别等信息。

2 系统设计

2.1设计原理

根据中华人民共和国国家标准 GB11643-1999 中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。地址码表示编码对象常住户口所在县(市、旗、区)的行政区划代码。生日期码表示编码对象出生的年、月、日,其中年份用四位数字表示,年、月、日之间不用分隔符。序码表示同一地址码所标识的区域范围内,对同年、月、日出生的人员编定的顺序号。顺序码的奇数分给男性,偶数分给女性。校验码是根据前面十七位数字码,按照 ISO 7064:1983.MOD 11-2 校验码计算出来的检验码。最后一位的校验码尤为重要。

公式(1)中: 表示号码字符从右至左,包括校验码在内的位置序号; 表示第 位置上的号码字符值; 表示第 位置上的加权因子,其数值可依据公式 计算得出。号码字符及对应的加权因子如表1分布所示:

  • 表1 号码字符及对应的加权因子
i 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
W 7 9 10 5 8 4 2 1 6 3 7 9 10 5 4 3 2 1

按公式(1)来计算,只要最后的加权和除以11,余数只要能和表2校验码查询表相对应,那么身份证号码就是正确的。

  • 表2 校验码查询表
0 1 2 3 4 5 6 7 8 9 10
1 0 x 9 8 7 6 5 4 3 2

注:X表示计算结果为10。

2.2.功能模块设计

功能模块设计如图1所示,主要包含可视化界面模块及数据处理模块。其中可视化界面模块又可分为输入提示窗口、信息显示窗口两大组成。数据处理模块包括有数据读取、数据拆分及算法处理等组件构成。

图1系统功能模块图
在这里插入图片描述

主程序窗口负责记录并显示用户输入的身份证号码,同时为用户提供操作按键及操作提示。

系统将用户输入的身份证号码读取并经过算法处理后,经由校验结果显示窗口进行交互显示,通过窗口可以清晰的看到身份证号码是否合格,若合格则可以得到正确的身份信息。

2.3.数据结构设计

系统为用户输入的身份证号码定义了列表结构,得到的身份证号形式如下:
** id_num = [‘3’,’4’,’0’,’4’,’2’,’1’,’1’……] **
对于可视化界面的输出数据格式皆以字符的形式表示,一方面字符比较方便拼接,同时可以兼容多种符号及语言。另一方面采用字符的形式进行可视化的界面显示设计,可以有效的防止数据在传输过程中发生变形。
在进行籍贯信息读取计算时,籍贯表格通过字典的形式进行存储,程序可以直接通过对字典的检索直接得到相应的籍贯信息。籍贯字典形式如下:
prov_list = {“11”: “北京”, “12”: “天津”, “13”: “河北”, “14”: “山西”, “15”: “内蒙古”, “21”: “辽宁”,“22”: “吉林”, “23”: “黑龙江”, “31”: “上海”, “32”: “江苏”, “33”: “浙江”, “34”: “安徽”,“35”: “福建”, “36”: “江西”, “37”: “山东”, “41”: “河南”, “42”: “湖北”, “43”: “湖南”,“44”: “广东”, “45”: “广西”, “46”: “海南”, “50”: “重庆”, “51”: “四川”, “52”: “贵州”,“53”: “云南”, “54”: “西藏”, “61”: “陕西”, “62”: “甘肃”, “63”: “青海”, “64”: “宁夏”,“65”: “新疆”, “71”: “台湾”, “81”: “香港”, “82”: “澳门”, “91”: “国外”}

2.4.函数功能描述

def exit_gui(): 退出系统函数,执行此函数将会退出该系统。
def math(): 数据处理函数,对输入的身份证号码进行数据分析,最终输出相应的身份信息数据。
def id_check_ui (birth_num, add, sex, check): 可视化界面函数,将经过分析的身份信息显示出来。
def get_id_born_year(id_birth): 通过输入的部分身份证号码,获取出生日期并返回。
def get_id_pro(id_add): 通过输入的部分身份证号码,获取籍贯信息并返回。
def get_id_sex(id_sex): 通过输入的部分身份证号码,获取性别信息并返回。
def get_id_ecc(id_num): 通过输入的部分身份证号码,计算出校验位信息并返回。
myWindow.mainloop() 进入窗口循环(程序入口)

3 详细设计(程序源码)

"""
程序说明:     读取用户输入的身份证号码,并判断号码是否合法,若合法则显示身份信息,不合法则提醒用户。
Author:       张海涛
Specification:  遵循 PEP-257 规则
Modify:       2019-09-16
"""
# -*- coding: utf-8 -*-
# 导入GUI编程基础库-tkinter
import tkinter as tk
# 获取函数文件的绝对路径root_path,并导入。
import os
current_path = os.path.abspath(__file__)
root_path = os.path.abspath(os.path.dirname(current_path) + os.path.sep + ".")  
import sys
sys.path.append(root_path)
# 导入算法文件
import function.mathfunction as mathfunction

# 创建一个主程序窗口
myWindow = tk.Tk()
# 设置窗口的标题
myWindow.title('身份证校验')
# 设置窗口大小
myWindow.geometry('300x300')

# 导入提示标签
input_lab = tk.Label(myWindow, text="请输入您的身份证号码 :")
# 确定提示标签位置和大小
input_lab.place(x=50, y=10, width=150, height=50)

"""
函数说明:将身份信息以可视化的形式显示在屏幕上
Parameters: birth_num - 出生日期、
            add - 籍贯信息
            sex - 性别信息
            check - 检验位信息
Returns:    无
Modify:     2019-09-16
"""
def id_check_ui(birth_num, add, sex, check):
    # 创建一个信息显示窗口
    view = tk.Tk()
    # 设置窗口的标题
    view.title('身份证信息显示窗口')
    # 设置窗口大小
    view.geometry('300x300')
    # 导入年龄标签框
    birth_num_lab = tk.Label(view, text="出生日期:")
    # 确定年龄标签位置和大小
    birth_num_lab.place(x=10, y=20, width=60, height=30)
    # 将身份证号码中提取到的年龄信息打印到文本框
    birth_num_txt = tk.Text(view)
    birth_num_txt.place(x=80, y=25, width=200, height=20)
    birth_num_txt.insert('insert', birth_num)

    # 导入籍贯标签框
    add_lab = tk.Label(view, text="籍贯:")
    # 确定籍贯标签位置和大小
    add_lab.place(x=10, y=60, width=60, height=30)
    # 导入籍贯文本框
    add_txt = tk.Text(view)
    # 导入籍贯文本框位置与大小
    add_txt.place(x=80, y=65, width=200, height=20)
    # 导入籍贯文本框中的数据
    add_txt.insert('insert', add)

    # 导入性别标签框
    sex_lab = tk.Label(view, text="性别:")
    # 确定性别标签位置和大小
    sex_lab.place(x=10, y=100, width=60, height=30)
    sex_txt = tk.Text(view)
    sex_txt.place(x=80, y=105, width=200, height=20)
    sex_txt.insert('insert', sex)

    # 导入校验结果标签框
    sex_lab = tk.Label(view, text="校验结果:")
    # 确定校验结果标签位置和大小
    sex_lab.place(x=10, y=140, width=60, height=30)
    sex_txt = tk.Text(view)
    sex_txt.place(x=80, y=145, width=200, height=20)
    sex_txt.insert('insert', check)

def math():
    # 在主程序窗口添加提示标签
    prompt_lab1 = tk.Label(myWindow, text="正在校验 :")
    prompt_lab1 .place(x=50, y=200, width=150, height=50)

    # 获取输入的身份证号码
    id_num = Input_num.get()
    print(id_num)
    if len(id_num) != 18:
        prompt_lab1 = tk.Label(myWindow, text="您输入的号码长度有误 :", fg='red')
        prompt_lab1 .place(x=50, y=200, width=150, height=50)
        return 0

    # 将获取到的身份证号码进行拆分处理,方便后期运算
    id_add = id_num[0:6]
    id_birth = id_num[6:14]
    id_sex = id_num[14:17]
    id_check = id_num[17]

    # 计算身份证号码中的出生日期
    birth_num = mathfunction.get_id_born_year(id_birth)
    print(birth_num)

    # 计算身份证号码的籍贯信息
    add = mathfunction.get_id_pro(id_add)
    print(add)

    # 计算身份证号码的性别信息
    sex = mathfunction.get_id_sex(id_sex)
    print(sex)

    # 计算身份证号码的校验位信息 校验数学用语(ECC)
    check_num = mathfunction.get_id_ecc(id_num)
    print(check_num)
    if id_check == check_num:
        check = '校验成功'
    else:
        check = '校验失败'
    print(check)

    # 调用UI显示函数将身份信息显示出来
id_check_ui(birth_num, add, sex, check)

"""
函数说明:    退出系统
Parameters:   无
Returns:      无
Modify:     2019-09-16
"""
def exit_gui():
    sys.exit()

# 导入按键1,当按键1按下将会调用 hit_me 函数
Button1 = tk.Button(myWindow, text="校验", bg='yellow', command=math)
# 确定按键1位置和大小
Button1.place(x=50, y=120, width=60, height=50)
# 导入按键2,当按键2按下将会调用 exit_gui 函数
Button2 = tk.Button(myWindow, text="退出", command=exit_gui)
# 确定按键2位置和大小
Button2.place(x=160, y=120, width=60, height=50)
# 放置输入模块
Input_num = tk.Entry(myWindow, show=None)  # 输入全部正常显示
Input_num.place(x=30, y=70, width=200, height=30)

# 启动窗口循环
myWindow.mainloop()

参考文献

[1] 曾浩.界面程序开发应用技术[J].科教文汇,2010(10):87-89.
[2] 邱道尹.基于MATLAB的身份证号码的识别算法[N].华北水利水电学院学报,2012-4-2(2).
[3] 齐鹏.基于的Web数据采集技术[J/OL].电子科技,2012-11-05.
[4] 魏锐.用C++Builder实现身份证15位升18位的算法[J].天中学刊,2007(10):54-55.
[5] 李文宏.基于冗余位校验及信息对比的身份证号纠错方法[J].中国人民公安大学学报,2012(2):87-90.
[6] 申习身.使用Excel验证身份证号校验码的设计方法[J].天津联合职业院校联合学报,2014(2):65-67.
[7] 龙相明.用自定义函数校验与获取身份证数据[J].电脑编程技巧与维护,2014(5):106-107.
[8] 朱健.移动端身份证号码识别算法实现[J].软件导刊,2019(7):71-73.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!