You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

192 lines
5.3 KiB

package setting
import (
"base/app/common"
"base/app/lib/bean"
"base/app/model"
"errors"
"fmt"
"git.oa00.com/go/acs"
"git.oa00.com/go/mysql"
"gorm.io/gorm"
)
var ManageLogic = &manageLogic{}
type manageLogic struct {
}
type manageItem struct {
Id uint `json:"id"`
Account string `json:"account"`
Name string `json:"name"`
Phone string `json:"phone"`
RoleId uint `json:"roleId"`
RoleName string `json:"roleName"`
Status uint `json:"status"`
CreatedAt int64 `json:"createdAt"`
UpdatedAt int64 `json:"updatedAt"`
}
type ManageListsSearch struct {
Id uint
Name string
}
// Lists @Title 用户列表
func (m *manageLogic) Lists(search ManageListsSearch, page bean.Page) (lists []manageItem, total int64) {
lists = []manageItem{}
var manages []model.Manage
where := mysql.Db
if search.Id > 0 {
where = where.Where("id = ?", search.Id)
}
if search.Name != "" {
where = where.Where("name like ?", fmt.Sprintf("%%%s%%", search.Name))
}
mysql.Db.Model(&manages).Where(where).Count(&total)
if page.HasPage(total) {
mysql.Db.
Preload("Department").Preload("Role").
Where(where).Offset(page.GetStart()).Limit(page.GetLimit()).Order("id desc").Find(&manages)
for _, manage := range manages {
lists = append(lists, manageItem{
Id: manage.Id,
Account: manage.Account,
Name: manage.Name,
Phone: manage.Phone,
RoleId: manage.RoleId,
RoleName: manage.Role.Name,
Status: manage.Status,
CreatedAt: manage.CreatedAt.Unix(),
UpdatedAt: manage.UpdatedAt.Unix(),
})
}
}
return
}
type ManageAdd struct {
Account string `binding:"required" label:"账号"`
Password string `binding:"required,min=6" label:"密码"`
Name string `binding:"required" label:"姓名"`
Phone string `binding:"required" label:"手机号"`
RoleId uint `binding:"required" label:"角色"`
Status uint `binding:"required,oneof=1 2" label:"状态"`
}
// Add @Title 添加用户
func (m *manageLogic) Add(data ManageAdd) error {
manage := model.Manage{Account: data.Account}
mysql.Db.Where(&manage).First(&manage)
if manage.Id > 0 {
return errors.New("账号已存在")
}
salt := common.RandStr(8)
return mysql.Db.Transaction(func(tx *gorm.DB) error {
manageData := model.Manage{
Name: data.Name,
Account: data.Account,
Salt: salt,
Password: common.GetPassword(data.Password, salt),
Status: data.Status,
Phone: data.Phone,
RoleId: data.RoleId,
}
if tx.Create(&manageData).Error != nil {
return errors.New("添加失败")
}
if _, err := acs.Enforcer.AddGroupingPolicy(fmt.Sprintf("manage_%d", manageData.Id), fmt.Sprintf("role_%d", data.RoleId)); err != nil {
return errors.New("添加失败")
}
return nil
})
}
type ManageEdit struct {
ManageId uint `binding:"required" label:"用户"`
Password string
Name string `binding:"required" label:"姓名"`
RoleId uint `binding:"required" label:"角色"`
Phone string `binding:"required" label:"手机号"`
Status uint `binding:"required,oneof=1 2" label:"状态"`
}
// Edit @Title 编辑用户
func (m *manageLogic) Edit(data ManageEdit) error {
manage := model.Manage{Id: data.ManageId}
if mysql.Db.First(&manage).Error != nil {
return errors.New("用户错误")
}
password := manage.Password
if data.Password != "" {
if len(data.Password) < 6 {
return errors.New("密码不能小于6位")
}
password = common.GetPassword(data.Password, manage.Salt)
}
return mysql.Db.Transaction(func(tx *gorm.DB) error {
if tx.Model(&manage).UpdateColumns(map[string]interface{}{
"password": password,
"name": data.Name,
"phone": data.Phone,
"role_id": data.RoleId,
"status": data.Status,
}).Error != nil {
return errors.New("编辑失败")
}
if manage.RoleId != data.RoleId {
groupingName := fmt.Sprintf("manage_%d", manage.Id)
if _, err := acs.Enforcer.RemoveGroupingPolicies(acs.Enforcer.GetFilteredGroupingPolicy(0, groupingName)); err != nil {
return errors.New("编辑失败")
}
if _, err := acs.Enforcer.AddGroupingPolicy(groupingName, fmt.Sprintf("role_%d", data.RoleId)); err != nil {
return errors.New("编辑失败")
}
}
return nil
})
}
// Enabled @Title 启用
func (m *manageLogic) Enabled(manageId uint) error {
manage := model.Manage{Id: manageId}
if mysql.Db.First(&manage).Error != nil {
return errors.New("用户错误")
}
if manage.Status == model.ManageStatusEnabled {
return nil
}
if mysql.Db.Model(&manage).UpdateColumn("status", model.ManageStatusEnabled).Error != nil {
return errors.New("启用失败")
}
return nil
}
// Disabled @Title 停用
func (m *manageLogic) Disabled(manageId uint) error {
manage := model.Manage{Id: manageId}
if mysql.Db.First(&manage).Error != nil {
return errors.New("用户错误")
}
if manage.Status == model.ManageStatusDisabled {
return nil
}
if mysql.Db.Model(&manage).UpdateColumn("status", model.ManageStatusDisabled).Error != nil {
return errors.New("停用失败")
}
return nil
}
// Select @Title 用户筛选
func (m *manageLogic) Select() (result []bean.SelectItem) {
result = []bean.SelectItem{}
var manages []model.Manage
mysql.Db.Find(&manages)
for _, manage := range manages {
result = append(result, bean.SelectItem{
Id: manage.Id,
Name: manage.Name,
})
}
return
}