github.com/easysoft/zendata@v0.0.0-20240513203326-705bd5a7fd67/internal/pkg/helper/idcard.go (about)

     1  package helper
     2  
     3  import (
     4  	"fmt"
     5  	"math/rand"
     6  	"strconv"
     7  	"time"
     8  )
     9  
    10  func GenerateIdCard() (ret string) {
    11  	areaCode := AreaCode[rand.Intn(len(AreaCode))] +
    12  		fmt.Sprintf("%0*d", 4, randInt(1, 9999))
    13  
    14  	birthday := RandDate().Format("20060102")
    15  
    16  	randomCode := fmt.Sprintf("%0*d", 3, randInt(0, 999))
    17  	prefix := areaCode + birthday + randomCode
    18  
    19  	ret = prefix + VerifyCode(prefix)
    20  
    21  	return
    22  }
    23  
    24  var AreaCode = []string{
    25  	"11",
    26  	"12",
    27  	"13",
    28  	"14",
    29  	"15",
    30  	"21",
    31  	"22",
    32  	"23",
    33  	"31",
    34  	"32",
    35  	"33",
    36  	"34",
    37  	"35",
    38  	"36",
    39  	"37",
    40  	"41",
    41  	"42",
    42  	"43",
    43  	"44",
    44  	"45",
    45  	"46",
    46  	"50",
    47  	"51",
    48  	"52",
    49  	"53",
    50  	"54",
    51  	"61",
    52  	"62",
    53  	"63",
    54  	"64",
    55  	"65",
    56  	"71",
    57  	"81",
    58  	"82",
    59  	"91",
    60  }
    61  
    62  var AreaCodeMap = map[string]string{
    63  	"11": "北京",
    64  	"12": "天津",
    65  	"13": "河北",
    66  	"14": "山西",
    67  	"15": "内蒙古",
    68  	"21": "辽宁",
    69  	"22": "吉林",
    70  	"23": "黑龙江",
    71  	"31": "上海",
    72  	"32": "江苏",
    73  	"33": "浙江",
    74  	"34": "安徽",
    75  	"35": "福建",
    76  	"36": "江西",
    77  	"37": "山东",
    78  	"41": "河南",
    79  	"42": "湖北",
    80  	"43": "湖南",
    81  	"44": "广东",
    82  	"45": "广西",
    83  	"46": "海南",
    84  	"50": "重庆",
    85  	"51": "四川",
    86  	"52": "贵州",
    87  	"53": "云南",
    88  	"54": "西藏",
    89  	"61": "陕西",
    90  	"62": "甘肃",
    91  	"63": "青海",
    92  	"64": "宁夏",
    93  	"65": "新疆",
    94  	"71": "台湾",
    95  	"81": "香港",
    96  	"82": "澳门",
    97  	"91": "国外",
    98  }
    99  
   100  // VerifyCode 通过给定的身份证号生成最后一位的 VerifyCode
   101  func VerifyCode(cardId string) string {
   102  	tmp := 0
   103  	for i, v := range Wi {
   104  		t, _ := strconv.Atoi(string(cardId[i]))
   105  		tmp += t * v
   106  	}
   107  	return ValCodeArr[tmp%11]
   108  }
   109  
   110  var ValCodeArr = []string{
   111  	"1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2",
   112  }
   113  
   114  var Wi = []int{
   115  	7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2,
   116  }
   117  
   118  // 指定范围随机 int
   119  func randInt(min, max int) int {
   120  	return min + rand.Intn(max-min)
   121  }
   122  
   123  // 指定范围随机 int64
   124  func randInt64(min, max int64) int64 {
   125  	return min + rand.Int63n(max-min)
   126  }
   127  
   128  // RandDate 返回随机时间,时间区间从 1970 年 ~ 2020 年
   129  func RandDate() time.Time {
   130  	begin, _ := time.Parse("2006-01-02 15:04:05", "1970-01-01 00:00:00")
   131  	end, _ := time.Parse("2006-01-02 15:04:05", "2020-01-01 00:00:00")
   132  	return time.Unix(randInt64(begin.Unix(), end.Unix()), 0)
   133  }