用户注销后禁止再次注册

This commit is contained in:
CaIon 2023-12-27 00:19:11 +08:00
parent 3c52a0991f
commit ad6842da7f
3 changed files with 99 additions and 53 deletions

View File

@ -152,6 +152,21 @@ func Register(c *gin.Context) {
return return
} }
} }
exist, err := model.CheckUserExistOrDeleted(user.Username, user.Email)
if err != nil {
c.JSON(http.StatusOK, gin.H{
"success": false,
"message": err.Error(),
})
return
}
if exist {
c.JSON(http.StatusOK, gin.H{
"success": false,
"message": "用户名已存在,或已注销",
})
return
}
affCode := user.AffCode // this code is the inviter's code, not the user's own code affCode := user.AffCode // this code is the inviter's code, not the user's own code
inviterId, _ := model.GetUserIdByAffCode(affCode) inviterId, _ := model.GetUserIdByAffCode(affCode)
cleanUser := model.User{ cleanUser := model.User{
@ -525,7 +540,7 @@ func DeleteUser(c *gin.Context) {
}) })
return return
} }
err = model.DeleteUserById(id) err = model.HardDeleteUserById(id)
if err != nil { if err != nil {
c.JSON(http.StatusOK, gin.H{ c.JSON(http.StatusOK, gin.H{
"success": true, "success": true,

View File

@ -31,6 +31,23 @@ type User struct {
AffQuota int `json:"aff_quota" gorm:"type:int;default:0;column:aff_quota"` // 邀请剩余额度 AffQuota int `json:"aff_quota" gorm:"type:int;default:0;column:aff_quota"` // 邀请剩余额度
AffHistoryQuota int `json:"aff_history_quota" gorm:"type:int;default:0;column:aff_history"` // 邀请历史额度 AffHistoryQuota int `json:"aff_history_quota" gorm:"type:int;default:0;column:aff_history"` // 邀请历史额度
InviterId int `json:"inviter_id" gorm:"type:int;column:inviter_id;index"` InviterId int `json:"inviter_id" gorm:"type:int;column:inviter_id;index"`
DeletedAt gorm.DeletedAt `json:"deleted_at" gorm:"index"`
}
// CheckUserExistOrDeleted check if user exist or deleted, if not exist, return false, nil, if deleted or exist, return true, nil
func CheckUserExistOrDeleted(username string, email string) (bool, error) {
var user User
err := DB.Unscoped().First(&user, "username = ? or email = ?", username, email).Error
if err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
// not exist, return false, nil
return false, nil
}
// other error, return false, err
return false, err
}
// exist, return true, nil
return true, nil
} }
func GetMaxUserId() int { func GetMaxUserId() int {
@ -40,7 +57,7 @@ func GetMaxUserId() int {
} }
func GetAllUsers(startIdx int, num int) (users []*User, err error) { func GetAllUsers(startIdx int, num int) (users []*User, err error) {
err = DB.Order("id desc").Limit(num).Offset(startIdx).Omit("password").Find(&users).Error err = DB.Unscoped().Order("id desc").Limit(num).Offset(startIdx).Omit("password").Find(&users).Error
return users, err return users, err
} }
@ -80,6 +97,14 @@ func DeleteUserById(id int) (err error) {
return user.Delete() return user.Delete()
} }
func HardDeleteUserById(id int) error {
if id == 0 {
return errors.New("id 为空!")
}
err := DB.Unscoped().Delete(&User{}, "id = ?", id).Error
return err
}
func inviteUser(inviterId int) (err error) { func inviteUser(inviterId int) (err error) {
user, err := GetUserById(inviterId, true) user, err := GetUserById(inviterId, true)
if err != nil { if err != nil {

View File

@ -72,11 +72,14 @@ const UsersTable = () => {
}, { }, {
title: '状态', dataIndex: 'status', render: (text, record, index) => { title: '状态', dataIndex: 'status', render: (text, record, index) => {
return (<div> return (<div>
{renderStatus(text)} {record.deleted_at !== null? <Tag color='red'>已注销</Tag> : renderStatus(text)}
</div>); </div>);
}, },
}, { }, {
title: '', dataIndex: 'operate', render: (text, record, index) => (<div> title: '', dataIndex: 'operate', render: (text, record, index) => (<div>
{
record.deleted_at !== null ? <></>:
<>
<Popconfirm <Popconfirm
title="确定?" title="确定?"
okType={'warning'} okType={'warning'}
@ -95,19 +98,6 @@ const UsersTable = () => {
> >
<Button theme='light' type='secondary' style={{marginRight: 1}}>降级</Button> <Button theme='light' type='secondary' style={{marginRight: 1}}>降级</Button>
</Popconfirm> </Popconfirm>
<Popconfirm
title="确定是否要删除此用户?"
content="此修改将不可逆"
okType={'danger'}
position={'left'}
onConfirm={() => {
manageUser(record.username, 'delete', record).then(() => {
removeRecord(record.id);
})
}}
>
<Button theme='light' type='danger' style={{marginRight: 1}}>删除</Button>
</Popconfirm>
{record.status === 1 ? {record.status === 1 ?
<Button theme='light' type='warning' style={{marginRight: 1}} onClick={async () => { <Button theme='light' type='warning' style={{marginRight: 1}} onClick={async () => {
manageUser(record.username, 'disable', record) manageUser(record.username, 'disable', record)
@ -119,6 +109,22 @@ const UsersTable = () => {
setEditingUser(record); setEditingUser(record);
setShowEditUser(true); setShowEditUser(true);
}}>编辑</Button> }}>编辑</Button>
</>
}
<Popconfirm
title="确定是否要删除此用户?"
content="硬删除,此修改将不可逆"
okType={'danger'}
position={'left'}
onConfirm={() => {
manageUser(record.username, 'delete', record).then(() => {
removeRecord(record.id);
})
}}
>
<Button theme='light' type='danger' style={{marginRight: 1}}>删除</Button>
</Popconfirm>
</div>), </div>),
},]; },];