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 }