395 lines
11 KiB
Go
395 lines
11 KiB
Go
package models
|
|
|
|
import (
|
|
"encoding/json"
|
|
"errors"
|
|
"log"
|
|
"strings"
|
|
|
|
"golang.org/x/crypto/bcrypt"
|
|
|
|
orm "go-admin/common/global"
|
|
"go-admin/tools"
|
|
)
|
|
|
|
// User
|
|
type User struct {
|
|
// key
|
|
IdentityKey string
|
|
// 用户名
|
|
UserName string
|
|
FirstName string
|
|
LastName string
|
|
// 角色
|
|
Role string
|
|
}
|
|
|
|
type UserName struct {
|
|
Username string `gorm:"size:64" json:"username"` // 用户名
|
|
}
|
|
|
|
type PassWord struct {
|
|
Password string `gorm:"size:128" json:"password"` // 密码
|
|
}
|
|
|
|
type LoginM struct {
|
|
UserName
|
|
PassWord
|
|
}
|
|
|
|
type SysUserId struct {
|
|
UserId int `gorm:"primary_key;AUTO_INCREMENT" json:"userId"` // 编码
|
|
}
|
|
|
|
type SysUserB struct {
|
|
NickName string `gorm:"size:128" json:"nickName"` // 昵称
|
|
Phone string `gorm:"size:11" json:"phone"` // 手机号
|
|
RoleId int `gorm:"" json:"roleId"` // 角色编码
|
|
Salt string `gorm:"size:255" json:"salt"` // 盐
|
|
Avatar string `gorm:"size:255" json:"avatar"` // 头像
|
|
Sex string `gorm:"size:255" json:"sex"` // 性别
|
|
Email string `gorm:"size:128" json:"email"` // 邮箱
|
|
DeptId int `gorm:"" json:"deptId"` // 部门编码
|
|
PostId int `gorm:"" json:"postId"` // 职位编码
|
|
CreateBy string `gorm:"size:128" json:"createBy"` //
|
|
UpdateBy string `gorm:"size:128" json:"updateBy"` //
|
|
Remark string `gorm:"size:255" json:"remark"` // 备注
|
|
Status string `gorm:"size:4;" json:"status"` // 状态
|
|
StoreId uint32 `json:"store_id"` // 门店id
|
|
StoreName string `json:"store_name"` // 门店名称
|
|
CooperativeBusinessId uint32 `json:"cooperative_business_id" gorm:"index"` // 合作商id
|
|
CooperativeName string `json:"cooperative_name"` // 合作商名称
|
|
AccountType uint32 `json:"account_type"` // 账号类型:1-管理端
|
|
StoreData string `gorm:"type:json" json:"store_data,omitempty"` // 有效门店
|
|
StoreList []StoreInfo `gorm:"-" json:"store_list"` // 有效门店列表
|
|
SalesCommRate float64 `json:"sales_comm_rate"` // 销售提成比例
|
|
Uid uint32 `json:"uid" gorm:"column:uid;unique_index"` // 用户uid todo 待添加
|
|
BaseModel
|
|
|
|
DataScope string `gorm:"-" json:"dataScope"`
|
|
Params string `gorm:"-" json:"params"`
|
|
}
|
|
|
|
type StoreInfo struct {
|
|
StoreID int `json:"storeId"` //门店id
|
|
StoreName string `json:"storeName"` //门店名称
|
|
ExpireTime string `json:"expireTime"` //有效期
|
|
}
|
|
|
|
type SysUser struct {
|
|
SysUserId
|
|
LoginM
|
|
SysUserB
|
|
}
|
|
|
|
type InsertSysUserReq struct {
|
|
SysUserId
|
|
LoginM
|
|
NickName string `json:"nickName"` // 昵称
|
|
Phone string `json:"phone"` // 手机号
|
|
RoleId int `json:"roleId"` // 角色编码
|
|
Salt string `json:"salt"` // 盐
|
|
Avatar string `json:"avatar"` // 头像
|
|
Sex string `json:"sex"` // 性别
|
|
Email string `json:"email"` // 邮箱
|
|
DeptId int `json:"deptId"` // 部门编码
|
|
PostId int `json:"postId"` // 职位编码
|
|
Remark string `json:"remark"` // 备注
|
|
Status string `json:"status"` // 状态
|
|
StoreId uint32 `json:"store_id"` // 门店id
|
|
StoreName string `json:"store_name"` // 门店名称
|
|
CooperativeBusinessId uint32 `json:"cooperative_business_id"` // 合作商id
|
|
CooperativeName string `json:"cooperative_name"` // 合作商名称
|
|
AccountType uint32 `json:"account_type"` // 账号类型:1-管理端
|
|
SalesCommRate string `json:"sales_comm_rate"` // 销售提成比例
|
|
StoreList []StoreInfo `json:"store_list"` // 有效门店
|
|
Uid uint32 `json:"uid"` // 用户uid
|
|
}
|
|
|
|
func (SysUser) TableName() string {
|
|
return "sys_user"
|
|
}
|
|
|
|
type SysUserPwd struct {
|
|
OldPassword string `json:"oldPassword"`
|
|
NewPassword string `json:"newPassword"`
|
|
}
|
|
|
|
type SysUserPage struct {
|
|
SysUserId
|
|
SysUserB
|
|
LoginM
|
|
DeptName string `gorm:"-" json:"deptName"`
|
|
}
|
|
|
|
type SysUserView struct {
|
|
SysUserId
|
|
SysUserB
|
|
LoginM
|
|
RoleName string `gorm:"column:role_name" json:"role_name"`
|
|
}
|
|
|
|
// 获取用户数据
|
|
func (e *SysUser) Get() (SysUserView SysUserView, err error) {
|
|
|
|
table := orm.Eloquent.Table(e.TableName()).Select([]string{"sys_user.*", "sys_role.role_name"})
|
|
table = table.Joins("left join sys_role on sys_user.role_id=sys_role.role_id")
|
|
if e.UserId != 0 {
|
|
table = table.Where("user_id = ?", e.UserId)
|
|
}
|
|
|
|
if e.Username != "" {
|
|
table = table.Where("username = ?", e.Username)
|
|
}
|
|
|
|
if e.Password != "" {
|
|
table = table.Where("password = ?", e.Password)
|
|
}
|
|
|
|
if e.RoleId != 0 {
|
|
table = table.Where("role_id = ?", e.RoleId)
|
|
}
|
|
|
|
if e.DeptId != 0 {
|
|
table = table.Where("dept_id = ?", e.DeptId)
|
|
}
|
|
|
|
if e.PostId != 0 {
|
|
table = table.Where("post_id = ?", e.PostId)
|
|
}
|
|
|
|
if err = table.First(&SysUserView).Error; err != nil {
|
|
return
|
|
}
|
|
|
|
SysUserView.Password = ""
|
|
if SysUserView.StoreData != "" {
|
|
SysUserView.StoreList = deserializeStoreData(SysUserView.StoreData)
|
|
}
|
|
return
|
|
}
|
|
|
|
func (e *SysUser) GetUserInfo() (SysUserView SysUserView, err error) {
|
|
|
|
table := orm.Eloquent.Table(e.TableName()).Select([]string{"sys_user.*", "sys_role.role_name"})
|
|
table = table.Joins("left join sys_role on sys_user.role_id=sys_role.role_id")
|
|
if e.UserId != 0 {
|
|
table = table.Where("user_id = ?", e.UserId)
|
|
}
|
|
|
|
if e.Username != "" {
|
|
table = table.Where("username = ?", e.Username)
|
|
}
|
|
|
|
if e.Password != "" {
|
|
table = table.Where("password = ?", e.Password)
|
|
}
|
|
|
|
if e.RoleId != 0 {
|
|
table = table.Where("role_id = ?", e.RoleId)
|
|
}
|
|
|
|
if e.DeptId != 0 {
|
|
table = table.Where("dept_id = ?", e.DeptId)
|
|
}
|
|
|
|
if e.PostId != 0 {
|
|
table = table.Where("post_id = ?", e.PostId)
|
|
}
|
|
|
|
if err = table.First(&SysUserView).Error; err != nil {
|
|
return
|
|
}
|
|
return
|
|
}
|
|
|
|
func (e *SysUser) GetList() (SysUserView []SysUserView, err error) {
|
|
|
|
table := orm.Eloquent.Table(e.TableName()).Select([]string{"sys_user.*", "sys_role.role_name"})
|
|
table = table.Joins("left join sys_role on sys_user.role_id=sys_role.role_id")
|
|
if e.UserId != 0 {
|
|
table = table.Where("user_id = ?", e.UserId)
|
|
}
|
|
|
|
if e.Username != "" {
|
|
table = table.Where("username = ?", e.Username)
|
|
}
|
|
|
|
if e.Password != "" {
|
|
table = table.Where("password = ?", e.Password)
|
|
}
|
|
|
|
if e.RoleId != 0 {
|
|
table = table.Where("role_id = ?", e.RoleId)
|
|
}
|
|
|
|
if e.DeptId != 0 {
|
|
table = table.Where("dept_id = ?", e.DeptId)
|
|
}
|
|
|
|
if e.PostId != 0 {
|
|
table = table.Where("post_id = ?", e.PostId)
|
|
}
|
|
|
|
if err = table.Find(&SysUserView).Error; err != nil {
|
|
return
|
|
}
|
|
return
|
|
}
|
|
|
|
func (e *SysUser) GetPage(pageSize int, pageIndex int) ([]SysUserPage, int, error) {
|
|
var doc []SysUserPage
|
|
table := orm.Eloquent.Select("sys_user.*,sys_dept.dept_name").Table(e.TableName())
|
|
table = table.Joins("left join sys_dept on sys_dept.dept_id = sys_user.dept_id")
|
|
|
|
if e.Username != "" {
|
|
table = table.Where("username = ?", e.Username)
|
|
}
|
|
if e.Status != "" {
|
|
table = table.Where("sys_user.status = ?", e.Status)
|
|
}
|
|
|
|
if e.Phone != "" {
|
|
table = table.Where("sys_user.phone = ?", e.Phone)
|
|
}
|
|
|
|
if e.DeptId != 0 {
|
|
table = table.Where("sys_user.dept_id in (select dept_id from sys_dept where dept_path like ? )", "%"+tools.IntToString(e.DeptId)+"%")
|
|
}
|
|
|
|
// 数据权限控制(如果不需要数据权限请将此处去掉)
|
|
dataPermission := new(DataPermission)
|
|
dataPermission.UserId, _ = tools.StringToInt(e.DataScope)
|
|
table, err := dataPermission.GetDataScope(e.TableName(), table)
|
|
if err != nil {
|
|
return nil, 0, err
|
|
}
|
|
var count int64
|
|
|
|
if err := table.Offset((pageIndex - 1) * pageSize).Limit(pageSize).Find(&doc).Offset(-1).Limit(-1).Count(&count).Error; err != nil {
|
|
return nil, 0, err
|
|
}
|
|
|
|
// 反序列化 StoreData
|
|
for i, v := range doc {
|
|
if doc[i].StoreData != "" {
|
|
doc[i].StoreList = deserializeStoreData(v.StoreData)
|
|
doc[i].StoreData = ""
|
|
}
|
|
}
|
|
|
|
return doc, int(count), nil
|
|
}
|
|
|
|
// 反序列化 StoreData
|
|
func deserializeStoreData(storeData string) []StoreInfo {
|
|
var StoreData []StoreInfo
|
|
if err := json.Unmarshal([]byte(storeData), &StoreData); err != nil {
|
|
// 可以根据实际情况处理反序列化失败的情况
|
|
log.Println("反序列化 StoreData 失败:", err)
|
|
}
|
|
return StoreData
|
|
}
|
|
|
|
// 加密
|
|
func (e *SysUser) Encrypt() (err error) {
|
|
if e.Password == "" {
|
|
return
|
|
}
|
|
|
|
var hash []byte
|
|
if hash, err = bcrypt.GenerateFromPassword([]byte(e.Password), bcrypt.DefaultCost); err != nil {
|
|
return
|
|
} else {
|
|
e.Password = string(hash)
|
|
return
|
|
}
|
|
}
|
|
|
|
// 添加
|
|
func (e SysUser) Insert() (id int, err error) {
|
|
if err = e.Encrypt(); err != nil {
|
|
return
|
|
}
|
|
|
|
// check 用户名
|
|
var count int64
|
|
orm.Eloquent.Table(e.TableName()).Where("username = ?", e.Username).Count(&count)
|
|
if count > 0 {
|
|
err = errors.New("账户已存在!")
|
|
return
|
|
}
|
|
|
|
//添加数据
|
|
if err = orm.Eloquent.Table(e.TableName()).Create(&e).Error; err != nil {
|
|
return
|
|
}
|
|
id = e.UserId
|
|
return
|
|
}
|
|
|
|
// 修改
|
|
func (e *SysUser) Update(id int) (update SysUser, err error) {
|
|
if e.Password != "" {
|
|
if err = e.Encrypt(); err != nil {
|
|
return
|
|
}
|
|
}
|
|
if err = orm.Eloquent.Table(e.TableName()).First(&update, id).Error; err != nil {
|
|
return
|
|
}
|
|
if e.RoleId == 0 {
|
|
e.RoleId = update.RoleId
|
|
}
|
|
|
|
if len(e.StoreList) != 0 {
|
|
// 将 StoreData 转换为 JSON 字符串
|
|
storeDataJSON, err := json.Marshal(e.StoreList)
|
|
if err != nil {
|
|
return SysUser{}, err
|
|
}
|
|
e.StoreData = string(storeDataJSON)
|
|
}
|
|
|
|
//参数1:是要修改的数据
|
|
//参数2:是修改的数据
|
|
if err = orm.Eloquent.Table(e.TableName()).Model(&update).Updates(&e).Error; err != nil {
|
|
return
|
|
}
|
|
return
|
|
}
|
|
|
|
func (e *SysUser) BatchDelete(id []int) (Result bool, err error) {
|
|
if err = orm.Eloquent.Table(e.TableName()).Where("user_id in (?)", id).Delete(&SysUser{}).Error; err != nil {
|
|
return
|
|
}
|
|
Result = true
|
|
return
|
|
}
|
|
|
|
func (e *SysUser) SetPwd(pwd SysUserPwd) (Result bool, err error) {
|
|
user, err := e.GetUserInfo()
|
|
if err != nil {
|
|
tools.HasError(err, "获取用户数据失败(代码202)", 500)
|
|
}
|
|
_, err = tools.CompareHashAndPassword(user.Password, pwd.OldPassword)
|
|
if err != nil {
|
|
if strings.Contains(err.Error(), "hashedPassword is not the hash of the given password") {
|
|
tools.HasError(err, "密码错误(代码202)", 500)
|
|
}
|
|
log.Print(err)
|
|
return
|
|
}
|
|
e.Password = pwd.NewPassword
|
|
_, err = e.Update(e.UserId)
|
|
tools.HasError(err, "更新密码失败(代码202)", 500)
|
|
return
|
|
}
|
|
|
|
func GetUserById(id uint32) *SysUserB {
|
|
var u = new(SysUserB)
|
|
orm.Eloquent.Table("sys_user").Where("user_id", id).First(u)
|
|
|
|
return u
|
|
}
|