2020-11-28 18:50:30 +08:00

140 lines
2.9 KiB
Go

package service
import (
"strconv"
"strings"
)
type Data interface {
String() string
Masking() string
}
var (
_ Data = Address("")
_ Data = Nickname("")
_ Data = PhoneNumber(0)
_ Data = IDNumber("")
_ Data = QQNumber(0)
_ Data = Password("")
_ Data = Email("")
_ Data = Address("")
)
type (
Name string
Nickname string
PhoneNumber int64
IDNumber string
QQNumber int64
Password string
Email string
Address string
)
func (address Address) Masking() string {
return maskLeft(string(address), 1)
}
func (address Address) String() string {
return string(address)
}
func (email Email) Masking() string {
return maskLeft(email.String(), len(strings.Split(string(email), "@")[0])+1)
}
func (email Email) String() string {
return string(email)
}
func (password Password) Masking() string {
return maskLeft(password.String(), 4)
}
func (password Password) String() string {
return string(password)
}
func (qqNumber QQNumber) Masking() string {
return maskLeft(qqNumber.String(), 3)
}
func (qqNumber QQNumber) String() string {
return strconv.Itoa(int(qqNumber))
}
func (idNumber IDNumber) Masking() string {
return mask(maskLeft(idNumber.String(), 3), 16, 16)
}
func (idNumber IDNumber) String() string {
return string(idNumber)
}
func (phoneNumber PhoneNumber) Masking() string {
return mask(phoneNumber.String(), 3, 6)
}
func (phoneNumber PhoneNumber) String() string {
return strconv.Itoa(int(phoneNumber))
}
func (nickname Nickname) Masking() string {
return maskLeft(nickname.String(), 1)
}
func (nickname Nickname) String() string {
return string(nickname)
}
func (name Name) Masking() string {
return maskLeft(name.String(), 1)
}
func (name Name) String() string {
return string(name)
}
func isPhoneNumber(number int) bool {
numberStr := strconv.Itoa(number)
if len(numberStr) != 11 {
return false
}
// https://www.miit.gov.cn/n1146295/n1652858/n1652930/n3757020/c5623267/part/5623278.doc
s := []int{
130, 131, 132, 133, 134, 135, 136, 137, 138, 139,
145, 146, 147, 148, 148,
150, 151, 152, 153, 154, 155, 156, 157, 158, 159,
161, 162, 164, 165, 167,
170, 172, 173, 175, 176, 177, 178, 179,
181, 182, 183, 184, 185, 186, 187, 188, 189,
190, 191, 192, 193, 194, 195, 196, 197, 198, 199,
}
header, _ := strconv.Atoi(numberStr[:3])
for _, num := range s {
if num == header {
return true
}
}
return false
}
func whatType(value string) (result []interface{}) {
if number, err := strconv.ParseInt(value, 10, 64); err == nil {
if number <= 19999999999 && isPhoneNumber(int(number)) {
result = append(result, PhoneNumber(number))
}
if number <= 99999999999 && len(strconv.Itoa(int(number))) >= 5 {
result = append(result, QQNumber(number))
}
}
if len(value) == 18 {
result = append(result, IDNumber(value))
}
if strings.Contains(value, "@") {
result = append(result, Email(value))
}
return result
}