package utils import ( "encoding/json" "fmt" "io/ioutil" "os" "qnc-server/model/model" "regexp" "strconv" "time" ) func loadRegions(filename string) (map[string]model.Region, error) { file, err := os.Open(filename) if err != nil { return nil, err } defer file.Close() byteValue, _ := ioutil.ReadAll(file) var regions map[string]model.Region json.Unmarshal(byteValue, ®ions) return regions, nil } func ParseIDCard(id string) (model.IDInfo, error) { if len(id) != 18 { return model.IDInfo{}, fmt.Errorf("Invalid ID length") } // Validate the ID card number validID, _ := regexp.MatchString(`^\d{17}[\dX]$`, id) if !validID { return model.IDInfo{}, fmt.Errorf("Invalid ID format") } regionCode := id[:6] birthDate := id[6:14] genderCode := id[16:17] regions, err := loadRegions("processed.json") if err != nil { return model.IDInfo{}, fmt.Errorf("loadRegions error: %v", err) } region, exists := regions[regionCode] if !exists { return model.IDInfo{}, fmt.Errorf("Region code not found") } birth, err := time.Parse("20060102", birthDate) if err != nil { return model.IDInfo{}, fmt.Errorf("Invalid birth date") } gender, err := strconv.Atoi(genderCode) if err != nil { return model.IDInfo{}, fmt.Errorf("Invalid gender code") } genderStr := "男" if gender%2 == 0 { genderStr = "女" } return model.IDInfo{ Location: region.FullRegion, BirthDate: birth.Format("2006年01月02日"), Gender: genderStr, }, nil }