package querysubject import ( "strings" ) func isNameField(key string) bool { key = strings.ToLower(key) if isPhoneField(key) || isIDCardField(key) { return false } return strings.Contains(key, "name") || strings.Contains(key, "姓名") || strings.Contains(key, "owner") || strings.Contains(key, "main") } func isIDCardField(key string) bool { key = strings.ToLower(key) return strings.Contains(key, "idcard") || strings.Contains(key, "id_card") || strings.Contains(key, "身份证") || strings.Contains(key, "证件号") } func isPhoneField(key string) bool { key = strings.ToLower(key) return strings.Contains(key, "phone") || strings.Contains(key, "mobile") || strings.Contains(key, "手机") || strings.Contains(key, "电话") } // ExtractPlainSubject 从解密后的 query 参数 map 中提取被查询人姓名、手机、身份证(首次匹配优先) func ExtractPlainSubject(m map[string]interface{}) (name, mobile, idCard string) { walkMap(m, &name, &mobile, &idCard) return name, mobile, idCard } func walkMap(m map[string]interface{}, name, mobile, idCard *string) { for k, v := range m { switch val := v.(type) { case string: assignSubjectField(k, val, name, mobile, idCard) case map[string]interface{}: walkMap(val, name, mobile, idCard) } } } func assignSubjectField(key, val string, name, mobile, idCard *string) { if val == "" { return } if *idCard == "" && isIDCardField(key) { *idCard = val return } if *mobile == "" && isPhoneField(key) { *mobile = val return } if *name == "" && isNameField(key) { *name = val } }