mirror of
https://github.com/go-admin-team/go-admin.git
synced 2026-09-21 10:13:01 +00:00
feat: Add transaction (#124)
This commit is contained in:
+19
-1
@@ -204,11 +204,29 @@ func (e *Dept) Update(id int) (update Dept, err error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (e *Dept) Delete(id int) (success bool, err error) {
|
func (e *Dept) Delete(id int) (success bool, err error) {
|
||||||
if err = orm.Eloquent.Table(e.TableName()).Where("dept_id = ?", id).Delete(&Dept{}).Error; err != nil {
|
|
||||||
|
tx := orm.Eloquent.Begin()
|
||||||
|
defer func() {
|
||||||
|
if r := recover(); r != nil {
|
||||||
|
tx.Rollback()
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
if err := tx.Error; err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if err = tx.Table(e.TableName()).Where("dept_id = ?", id).Delete(&Dept{}).Error; err != nil {
|
||||||
|
success = false
|
||||||
|
tx.Rollback()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if err =tx.Commit().Error; err != nil {
|
||||||
success = false
|
success = false
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
success = true
|
success = true
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+73
-14
@@ -7,8 +7,8 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type RoleMenu struct {
|
type RoleMenu struct {
|
||||||
RoleId int `gorm:"type:int(11)"`
|
RoleId int `gorm:"type:int(11)"`
|
||||||
MenuId int `gorm:"type:int(11)"`
|
MenuId int `gorm:"type:int(11)"`
|
||||||
RoleName string `gorm:"type:varchar(128)"`
|
RoleName string `gorm:"type:varchar(128)"`
|
||||||
CreateBy string `gorm:"type:varchar(128)"`
|
CreateBy string `gorm:"type:varchar(128)"`
|
||||||
UpdateBy string `gorm:"type:varchar(128)"`
|
UpdateBy string `gorm:"type:varchar(128)"`
|
||||||
@@ -65,47 +65,98 @@ func (rm *RoleMenu) GetIDS() ([]MenuPath, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (rm *RoleMenu) DeleteRoleMenu(roleId int) (bool, error) {
|
func (rm *RoleMenu) DeleteRoleMenu(roleId int) (bool, error) {
|
||||||
if err := orm.Eloquent.Table("sys_role_dept").Where("role_id = ?", roleId).Delete(&rm).Error; err != nil {
|
tx := orm.Eloquent.Begin()
|
||||||
|
defer func() {
|
||||||
|
if r := recover(); r != nil {
|
||||||
|
tx.Rollback()
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
if err := tx.Error; err != nil {
|
||||||
return false, err
|
return false, err
|
||||||
}
|
}
|
||||||
if err := orm.Eloquent.Table("sys_role_menu").Where("role_id = ?", roleId).Delete(&rm).Error; err != nil {
|
|
||||||
|
if err := tx.Table("sys_role_dept").Where("role_id = ?", roleId).Delete(&rm).Error; err != nil {
|
||||||
|
tx.Rollback()
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
if err := tx.Table("sys_role_menu").Where("role_id = ?", roleId).Delete(&rm).Error; err != nil {
|
||||||
|
tx.Rollback()
|
||||||
return false, err
|
return false, err
|
||||||
}
|
}
|
||||||
var role SysRole
|
var role SysRole
|
||||||
if err := orm.Eloquent.Table("sys_role").Where("role_id = ?", roleId).First(&role).Error; err != nil {
|
if err := tx.Table("sys_role").Where("role_id = ?", roleId).First(&role).Error; err != nil {
|
||||||
|
tx.Rollback()
|
||||||
return false, err
|
return false, err
|
||||||
}
|
}
|
||||||
sql3 := "delete from casbin_rule where v0= '" + role.RoleKey + "';"
|
sql3 := "delete from casbin_rule where v0= '" + role.RoleKey + "';"
|
||||||
orm.Eloquent.Exec(sql3)
|
if err := tx.Exec(sql3).Error; err != nil {
|
||||||
|
tx.Rollback()
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
if err := tx.Commit().Error; err != nil {
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
|
||||||
return true, nil
|
return true, nil
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (rm *RoleMenu) BatchDeleteRoleMenu(roleIds []int) (bool, error) {
|
func (rm *RoleMenu) BatchDeleteRoleMenu(roleIds []int) (bool, error) {
|
||||||
if err := orm.Eloquent.Table("sys_role_menu").Where("role_id in (?)", roleIds).Delete(&rm).Error; err != nil {
|
tx := orm.Eloquent.Begin()
|
||||||
|
defer func() {
|
||||||
|
if r := recover(); r != nil {
|
||||||
|
tx.Rollback()
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
if err := tx.Error; err != nil {
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := tx.Table("sys_role_menu").Where("role_id in (?)", roleIds).Delete(&rm).Error; err != nil {
|
||||||
|
tx.Rollback()
|
||||||
return false, err
|
return false, err
|
||||||
}
|
}
|
||||||
var role []SysRole
|
var role []SysRole
|
||||||
if err := orm.Eloquent.Table("sys_role").Where("role_id in (?)", roleIds).Find(&role).Error; err != nil {
|
if err := tx.Table("sys_role").Where("role_id in (?)", roleIds).Find(&role).Error; err != nil {
|
||||||
|
tx.Rollback()
|
||||||
return false, err
|
return false, err
|
||||||
}
|
}
|
||||||
sql := ""
|
sql := ""
|
||||||
for i := 0; i < len(role); i++ {
|
for i := 0; i < len(role); i++ {
|
||||||
sql += "delete from casbin_rule where v0= '" + role[i].RoleName + "';"
|
sql += "delete from casbin_rule where v0= '" + role[i].RoleName + "';"
|
||||||
}
|
}
|
||||||
orm.Eloquent.Exec(sql)
|
if err := tx.Exec(sql).Error; err != nil {
|
||||||
|
tx.Rollback()
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
if err := tx.Commit().Error; err != nil {
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
return true, nil
|
return true, nil
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (rm *RoleMenu) Insert(roleId int, menuId []int) (bool, error) {
|
func (rm *RoleMenu) Insert(roleId int, menuId []int) (bool, error) {
|
||||||
var role SysRole
|
var role SysRole
|
||||||
if err := orm.Eloquent.Table("sys_role").Where("role_id = ?", roleId).First(&role).Error; err != nil {
|
tx := orm.Eloquent.Begin()
|
||||||
|
defer func() {
|
||||||
|
if r := recover(); r != nil {
|
||||||
|
tx.Rollback()
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
if err := tx.Error; err != nil {
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
if err := tx.Table("sys_role").Where("role_id = ?", roleId).First(&role).Error; err != nil {
|
||||||
|
tx.Rollback()
|
||||||
return false, err
|
return false, err
|
||||||
}
|
}
|
||||||
var menu []Menu
|
var menu []Menu
|
||||||
if err := orm.Eloquent.Table("sys_menu").Where("menu_id in (?)", menuId).Find(&menu).Error; err != nil {
|
if err := tx.Table("sys_menu").Where("menu_id in (?)", menuId).Find(&menu).Error; err != nil {
|
||||||
|
tx.Rollback()
|
||||||
return false, err
|
return false, err
|
||||||
}
|
}
|
||||||
//ORM不支持批量插入所以需要拼接 sql 串
|
//ORM不支持批量插入所以需要拼接 sql 串
|
||||||
@@ -126,10 +177,18 @@ func (rm *RoleMenu) Insert(roleId int, menuId []int) (bool, error) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
orm.Eloquent.Exec(sql)
|
if err := tx.Exec(sql).Error; err != nil {
|
||||||
|
tx.Rollback()
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
sql2 = sql2[0:len(sql2)-1] + ";"
|
sql2 = sql2[0:len(sql2)-1] + ";"
|
||||||
orm.Eloquent.Exec(sql2)
|
if err := tx.Exec(sql2).Error; err != nil {
|
||||||
|
tx.Rollback()
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
if err := tx.Commit().Error; err != nil {
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
return true, nil
|
return true, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+2
-1
@@ -2,10 +2,10 @@ package models
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
|
log "github.com/sirupsen/logrus"
|
||||||
"go-admin/global/orm"
|
"go-admin/global/orm"
|
||||||
"go-admin/tools"
|
"go-admin/tools"
|
||||||
"golang.org/x/crypto/bcrypt"
|
"golang.org/x/crypto/bcrypt"
|
||||||
log "github.com/sirupsen/logrus"
|
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -59,6 +59,7 @@ type SysUserB struct {
|
|||||||
BaseModel
|
BaseModel
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
type SysUser struct {
|
type SysUser struct {
|
||||||
SysUserId
|
SysUserId
|
||||||
SysUserB
|
SysUserB
|
||||||
|
|||||||
@@ -0,0 +1,170 @@
|
|||||||
|
package service
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
log "github.com/sirupsen/logrus"
|
||||||
|
"go-admin/global/orm"
|
||||||
|
. "go-admin/models"
|
||||||
|
"go-admin/tools"
|
||||||
|
"golang.org/x/crypto/bcrypt"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
// 获取用户数据
|
||||||
|
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 = ""
|
||||||
|
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("sys_user", table)
|
||||||
|
if err != nil {
|
||||||
|
return nil, 0, err
|
||||||
|
}
|
||||||
|
var count int
|
||||||
|
|
||||||
|
if err := table.Offset((pageIndex - 1) * pageSize).Limit(pageSize).Find(&doc).Error; err != nil {
|
||||||
|
return nil, 0, err
|
||||||
|
}
|
||||||
|
table.Where("sys_user.deleted_at IS NULL").Count(&count)
|
||||||
|
return doc, count, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
//加密
|
||||||
|
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 int
|
||||||
|
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
|
||||||
|
}
|
||||||
|
|
||||||
|
//参数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.Get()
|
||||||
|
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
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user