/
member.go
118 lines (106 loc) · 4.19 KB
/
member.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
package models
import (
"encoding/json"
"errors"
"fmt"
"github.com/jinzhu/gorm"
"github.com/shop-r1/utils/pkg"
log "github.com/sirupsen/logrus"
"strconv"
)
type Member struct {
gorm.Model
TenantId string `sql:"type:char(20);index" description:"租户ID" json:"tenant_id"`
Region string `sql:"type:varchar(100)" description:"地区" json:"region"`
ReferrerId string `json:"referrer_id"`
No string `sql:"-" json:"id"`
LevelId string `sql:"type:char(20);index" description:"客户等级ID" json:"level_id" validate:"-"`
Level MemberLevel `gorm:"save_associations:false;ForeignKey:LevelId" json:"level" validate:"-"`
Referrer *Member `gorm:"save_associations:false;ForeignKey:ReferrerId" json:"referrer,omitempty" validate:"-"`
Username string `sql:"type:varchar(100);index" description:"用户名" json:"username"`
Nickname string `sql:"type:varchar(100);index" description:"昵称" json:"nickname"`
Phone string `sql:"type:char(20)" description:"手机号" json:"phone"`
Description string `sql:"type:text" description:"描述" json:"description"`
OpenId string `sql:"type:varchar(100)" description:"三方登录openid" json:"open_id"`
UnionId string `sql:"type:varchar(100)" description:"三方登录unionid" json:"union_id"`
PasswordHash string `sql:"type:varchar(100)" description:"密码hash值" json:"-"`
Salt string `sql:"type:varchar(20)" description:"加盐值" json:"-"`
RestPasswordHash string `sql:"type:varchar(100)" description:"重置密码hash值" json:"-"`
Status Status `sql:"default(1)" description:"状态: 1 启用, 0 禁用" json:"status"`
Password string `sql:"-" json:"password,omitempty"` //用于暂存密码
HeadImage string `sql:"type:text" description:"头像" json:"head_image"`
Metadata []byte `sql:"json" description:"附加信息" json:"-"`
Meta interface{} `sql:"-" json:"meta"`
Address string `sql:"type:varchar(100)" description:"用户地址" json:"address"`
Sex int `json:"sex"` // 用户的性别, 值为1时是男性, 值为2时是女性, 值为0时是未知
ParentReferrerId string `sql:"type:varchar(50);index" description:"推荐人父级ID" json:"parent_referrer_id"`
ParentReferrer *Member `gorm:"save_associations:false;ForeignKey:ParentReferrerId" json:"parent_referrer,omitempty" validate:"-"`
}
type SearchMember struct {
List []Member `json:"list"`
Total int `json:"total"`
Page int `json:"page"`
TotalPage int `json:"total_page"`
Limit int `json:"limit"`
}
func (u *Member) BeforeSave() (err error) {
if u.Password != "" {
u.generateSalt()
u.SetPassword(u.Password)
}
return nil
}
func (u *Member) AfterSave() error {
u.No = strconv.Itoa(int(u.ID))
u.Password = ""
return nil
}
func (u *Member) AfterFind() error {
u.transform()
return nil
}
func (u *Member) transform() {
u.No = strconv.Itoa(int(u.ID))
if len(u.Metadata) > 0 {
_ = json.Unmarshal(u.Metadata, &u.Meta)
}
}
//设置密码
func (u *Member) SetPassword(value string) {
u.Password = value
u.generateSalt()
u.PasswordHash, _ = pkg.SetPassword(u.Password, u.Salt)
}
//获取密码hash
func (u *Member) GetPasswordHash() string {
passwordHash, err := pkg.SetPassword(u.Password, u.Salt)
if err != nil {
return ""
}
return passwordHash
}
//生成加盐值
func (u *Member) generateSalt() {
u.Salt = pkg.GenerateRandomKey16()
}
//验证密码
func (u *Member) Verify() bool {
Db.Where("username= ?", u.Username).
Where("tenant_id = ?", u.TenantId).
Where("status = ?", Enable).First(u)
return u.GetPasswordHash() == u.PasswordHash
}
//验证是否存在重复username
func (u *Member) ExistUsername() (exist bool, err error) {
var count int
err = Db.Model(&Member{}).Where("username = ?", u.Username).
Where("tenant_id = ?", u.TenantId).Count(&count).Error
if err != nil {
err = errors.New("数据库查询出错")
return
}
if exist = count > 0; exist {
log.Error(fmt.Sprintf("username:%s 已经存在", u.Username))
}
return
}