使用gorm自定义类型做手机号,名称,邮箱的脱敏

413 阅读1分钟
package main

import (
   "encoding/json"
   "fmt"
   "gorm.io/driver/mysql"
   "gorm.io/gorm"
   "strings"
)

type Mobile string

// Scan 将数据库中取出的数据,赋值给目标类型
func (s *Mobile) Scan(v interface{}) error {
   if vt, ok := v.([]byte); ok {
      *s = Mobile(string(vt[:3]) + "****" + string(vt[7:]))
   }
   return nil
}

type Name string

// Scan 将数据库中取出的数据,赋值给目标类型
func (s *Name) Scan(v interface{}) error {
   if vt, ok := v.([]byte); ok {
      nvt := []rune(string(vt))
      if len(nvt) == 2 {
         *s = Name(string(nvt[:1]) + "*")
      }
      if len(nvt) == 3 {
         *s = Name(string(nvt[:1]) + "*" + string(nvt[2:]))
      }
      if len(nvt) > 4 {
         *s = Name(string(nvt[:2]) + strings.Repeat("*", len(nvt)-3) + string(nvt[len(nvt)-1:]))
      }
      if len(nvt) < 2 {
         *s = Name(nvt)
      }
   }
   return nil
}

type Email string

// Scan 将数据库中取出的数据,赋值给目标类型
func (s *Email) Scan(v interface{}) error {
   if nvt, ok := v.([]byte); ok {
      if string(nvt) == "" {
         *s = ""
      } else {
         email := strings.Split(string(nvt), "@")
         emailPrefix := email[0]
         if len(email) == 1 {
            *s = Email(emailPrefix[:1] + strings.Repeat("*", len(emailPrefix)-1) + emailPrefix[len(emailPrefix)-1:])
         } else {
            *s = Email(emailPrefix[:1] + strings.Repeat("*", len(emailPrefix)-1) + emailPrefix[len(emailPrefix)-1:] + "@" + email[1])
         }
      }
   }
   return nil
}

// SysAdministrator  管理员表
type SysAdministrator struct {
   ID       int64  `gorm:"column:id"`                       //  主键id
   Mobile   Mobile `gorm:"column:mobile" json:"mobile"`     //  手机号码
   Nickname Name   `gorm:"column:nickname" json:"nickname"` //  名称
   Email    Email  `gorm:"column:email" json:"email"`       //  邮箱
}

func (SysAdministrator) TableName() string {
   return "sys_administrator"
}

func main() {
   db, _ := gorm.Open(mysql.Open("root:root@tcp(127.0.0.1:3306)/dbname?parseTime=true&collation=utf8mb4_unicode_ci&loc=Asia%2FShanghai&charset=utf8mb4"), &gorm.Config{})
   var resp []SysAdministrator
   db.Model(&SysAdministrator{}).Scan(&resp)
   for _, v := range resp {
      fmt.Println(`v.Mobile`, v.Mobile)
      fmt.Println(`v.Nickname`, v.Nickname)
      fmt.Println(`v.Email`, v.Email)
   }

   marshal, _ := json.Marshal(resp)
   fmt.Println(string(marshal))
}

打印效果

image.png