This commit is contained in:
wucongxing 2023-06-13 17:08:48 +08:00
parent 588ae8ebdc
commit 71f682d99a
17 changed files with 202 additions and 58 deletions

View File

@ -17,7 +17,7 @@ func (r *Menu) GetMenuList(c *gin.Context) {
return return
} }
if len(MenuList) == 0 { if MenuList == nil {
responses.FailWithMessage("请联系管理人员设置菜单", c) responses.FailWithMessage("请联系管理人员设置菜单", c)
return return
} }

View File

@ -62,7 +62,7 @@ func (r *Role) GetRoleList(c *gin.Context) {
AdminRoleDao := dao.AdminRoleDao{} AdminRoleDao := dao.AdminRoleDao{}
adminRole, err := AdminRoleDao.GetAdminRolePageSearch(RoleRequest.GetRoleList.RoleName, RoleRequest.GetRoleList.Page, RoleRequest.GetRoleList.PageSize) adminRole, err := AdminRoleDao.GetAdminRolePageSearch(RoleRequest.GetRoleList.RoleName, RoleRequest.GetRoleList.Page, RoleRequest.GetRoleList.PageSize)
if err != nil || len(adminRole) == 0 { if err != nil || adminRole == nil {
responses.Ok(c) responses.Ok(c)
c.Abort() c.Abort()
return return
@ -116,17 +116,29 @@ func (r *Role) PutRoleStatus(c *gin.Context) {
// AddRole 新增角色 // AddRole 新增角色
func (r *Role) AddRole(c *gin.Context) { func (r *Role) AddRole(c *gin.Context) {
// if err := c.ShouldBind(&RoleRequest.PutRoleStatus); err != nil { if err := c.ShouldBindJSON(&RoleRequest.AddRole); err != nil {
// responses.FailWithMessage(err.Error(), c) responses.FailWithMessage(err.Error(), c)
// return return
// } }
//
// // 参数验证
// if err := global.Validate.Struct(RoleRequest.PutRoleStatus); err != nil {
// responses.FailWithMessage(utils.Translate(err), c)
// return
// }
// 参数验证
if err := global.Validate.Struct(RoleRequest.AddRole); err != nil {
responses.FailWithMessage(utils.Translate(err), c)
return
}
// 判断菜单数据是否为空
if len(RoleRequest.AddRole.MenuIds) == 0 {
responses.FailWithMessage("请为角色添加菜单", c)
return
}
RoleService := service.RoleService{}
_, err := RoleService.AddRole(c, RoleRequest.AddRole)
if err != nil {
responses.FailWithMessage(err.Error(), c)
return
}
responses.Ok(c) responses.Ok(c)
} }

View File

@ -8,6 +8,7 @@ import (
type AdminMenuDao struct { type AdminMenuDao struct {
} }
// GetAdminMenuList 获取菜单列表
func (r *AdminMenuDao) GetAdminMenuList() (m []*model.AdminMenu, err error) { func (r *AdminMenuDao) GetAdminMenuList() (m []*model.AdminMenu, err error) {
err = global.Db.Find(&m).Error err = global.Db.Find(&m).Error
if err != nil { if err != nil {
@ -16,6 +17,7 @@ func (r *AdminMenuDao) GetAdminMenuList() (m []*model.AdminMenu, err error) {
return m, nil return m, nil
} }
// GetAdminMenuListSortOrderNum 获取菜单列表-排序
func (r *AdminMenuDao) GetAdminMenuListSortOrderNum() (m []*model.AdminMenu, err error) { func (r *AdminMenuDao) GetAdminMenuListSortOrderNum() (m []*model.AdminMenu, err error) {
err = global.Db.Order("order_num asc").Find(&m).Error err = global.Db.Order("order_num asc").Find(&m).Error
if err != nil { if err != nil {
@ -23,3 +25,12 @@ func (r *AdminMenuDao) GetAdminMenuListSortOrderNum() (m []*model.AdminMenu, err
} }
return m, nil return m, nil
} }
// GetAdminMenuById 获取菜单数据-菜单id
func (r *AdminMenuDao) GetAdminMenuById(menuId int64) (m *model.AdminMenu, err error) {
err = global.Db.First(&m, menuId).Error
if err != nil {
return nil, err
}
return m, nil
}

View File

@ -1,6 +1,7 @@
package dao package dao
import ( import (
"gorm.io/gorm"
"hospital-admin-api/api/model" "hospital-admin-api/api/model"
"hospital-admin-api/global" "hospital-admin-api/global"
) )
@ -10,28 +11,28 @@ type AdminRoleDao struct {
// GetAdminRoleFirstById 角色id获取用户角色 // GetAdminRoleFirstById 角色id获取用户角色
// roleId 角色id // roleId 角色id
func (r *AdminRoleDao) GetAdminRoleFirstById(roleId int64) (m model.AdminRole, err error) { func (r *AdminRoleDao) GetAdminRoleFirstById(roleId int64) (m *model.AdminRole, err error) {
err = global.Db.First(&m, roleId).Error err = global.Db.First(&m, roleId).Error
if err != nil { if err != nil {
return m, err return nil, err
} }
return m, nil return m, nil
} }
// GetAdminRolePageSearch 搜索角色列表-分页 // GetAdminRolePageSearch 搜索角色列表-分页
func (r *AdminRoleDao) GetAdminRolePageSearch(roleName string, page, pageSize int) (m []model.AdminRole, err error) { func (r *AdminRoleDao) GetAdminRolePageSearch(roleName string, page, pageSize int) (m []*model.AdminRole, err error) {
// 计算偏移量 // 计算偏移量
offset := (page - 1) * pageSize offset := (page - 1) * pageSize
if roleName != "" { if roleName != "" {
err = global.Db.Where("role_name = ?", roleName).Offset(offset).Limit(pageSize).Find(&m).Error err = global.Db.Where("role_name = ?", roleName).Offset(offset).Limit(pageSize).Find(&m).Error
if err != nil { if err != nil {
return m, err return nil, err
} }
} else { } else {
err = global.Db.Offset(offset).Limit(pageSize).Find(&m).Error err = global.Db.Offset(offset).Limit(pageSize).Find(&m).Error
if err != nil { if err != nil {
return m, err return nil, err
} }
} }
return m, nil return m, nil
@ -45,3 +46,11 @@ func (r *AdminRoleDao) EditAdminRoleStatusById(roleId int64, roleStatus int) err
} }
return nil return nil
} }
// AddAdminRole 新增角色
func (r *AdminRoleDao) AddAdminRole(tx *gorm.DB, model *model.AdminRole) (*model.AdminRole, error) {
if err := tx.Create(model).Error; err != nil {
return nil, err
}
return model, nil
}

View File

@ -10,19 +10,19 @@ type AdminUserDao struct {
// GetAdminUserFirstById 获取用户数据-用户id // GetAdminUserFirstById 获取用户数据-用户id
// roleId 用户id // roleId 用户id
func (r *AdminUserDao) GetAdminUserFirstById(userId int64) (m model.AdminUser, err error) { func (r *AdminUserDao) GetAdminUserFirstById(userId int64) (m *model.AdminUser, err error) {
err = global.Db.First(&m, userId).Error err = global.Db.First(&m, userId).Error
if err != nil { if err != nil {
return m, err return nil, err
} }
return m, nil return m, nil
} }
// GetAdminUserFirstByAccess 获取用户数据-用户账号 // GetAdminUserFirstByAccess 获取用户数据-用户账号
func (r *AdminUserDao) GetAdminUserFirstByAccess(username string) (m model.AdminUser, err error) { func (r *AdminUserDao) GetAdminUserFirstByAccess(username string) (m *model.AdminUser, err error) {
err = global.Db.Where("access = ?", username).First(&m).Error err = global.Db.Where("access = ?", username).First(&m).Error
if err != nil { if err != nil {
return m, err return nil, err
} }
return m, nil return m, nil
} }

View File

@ -32,7 +32,7 @@ func Auth() gin.HandlerFunc {
// 获取用户数据 // 获取用户数据
AdminUserDao := dao.AdminUserDao{} AdminUserDao := dao.AdminUserDao{}
adminUser, err := AdminUserDao.GetAdminUserFirstById(userId) adminUser, err := AdminUserDao.GetAdminUserFirstById(userId)
if err != nil || adminUser.UserID == 0 { if err != nil || adminUser == nil {
responses.FailWithMessage("用户数据错误", c) responses.FailWithMessage("用户数据错误", c)
c.Abort() c.Abort()
return return
@ -53,7 +53,7 @@ func Auth() gin.HandlerFunc {
// 获取角色数据 // 获取角色数据
AdminRoleDao := dao.AdminRoleDao{} AdminRoleDao := dao.AdminRoleDao{}
adminRole, err := AdminRoleDao.GetAdminRoleFirstById(roleId) adminRole, err := AdminRoleDao.GetAdminRoleFirstById(roleId)
if err != nil || adminRole.RoleId == 0 { if err != nil || adminRole == nil {
responses.FailWithMessage("用户数据错误", c) responses.FailWithMessage("用户数据错误", c)
c.Abort() c.Abort()
return return

View File

@ -2,8 +2,8 @@ package model
// AdminMenuApi 后台-菜单-接口表 // AdminMenuApi 后台-菜单-接口表
type AdminMenuApi struct { type AdminMenuApi struct {
MenuId int64 `gorm:"column:menu_id;type:bigint(19);primary_key;comment:菜单id" json:"menu_id"` MenuId int64 `gorm:"column:menu_id;type:bigint(19);comment:菜单id" json:"menu_id"`
ApiId int64 `gorm:"column:api_id;type:bigint(19);primary_key;comment:接口id" json:"api_id"` ApiId int64 `gorm:"column:api_id;type:bigint(19);comment:接口id" json:"api_id"`
Menu AdminMenu `gorm:"foreignkey:MenuId;association_foreignkey:MenuID"` Menu AdminMenu `gorm:"foreignkey:MenuId;association_foreignkey:MenuID"`
API AdminAPI `gorm:"foreignkey:ApiId;association_foreignkey:APIID"` API AdminAPI `gorm:"foreignkey:ApiId;association_foreignkey:APIID"`
} }

View File

@ -12,3 +12,15 @@ type AdminRole struct {
func (m *AdminRole) TableName() string { func (m *AdminRole) TableName() string {
return "gdxz_admin_role" return "gdxz_admin_role"
} }
// func (a *AdminRole) BeforeCreate(tx *gorm.DB) (err error) {
// node, err := snowflake.NewNode(config.C.Snowflake)
// if err != nil {
// return err
// }
// tx.Statement.SetColumn("RoleId", node.Generate().Int64())
//
// a.Model.CreatedAt = LocalTime(time.Now())
// tx.Statement.SetColumn("CreatedAt", a.Model.CreatedAt)
// return
// }

View File

@ -5,7 +5,6 @@ import (
"errors" "errors"
"fmt" "fmt"
"gorm.io/gorm" "gorm.io/gorm"
"reflect"
"strings" "strings"
"time" "time"
) )
@ -59,26 +58,26 @@ func (t *LocalTime) String() string {
} }
// BeforeCreate 注册 BeforeCreate 回调函数 // BeforeCreate 注册 BeforeCreate 回调函数
func (m *Model) BeforeCreate(tx *gorm.DB) (err error) { // func (m *Model) BeforeCreate(tx *gorm.DB) (err error) {
// 动态访问 YourModel 结构体本身 // // 动态访问 YourModel 结构体本身
model := tx.Statement.Dest // model := tx.Statement.Dest
//
// 设置创建时间 // // 设置创建时间
layout := "2006-01-02 15:04:05" // layout := "2006-01-02 15:04:05"
strTime := "2019-08-09 11:35:52" // strTime := "2019-08-09 11:35:52"
parsedTime, err := time.Parse(layout, strTime) // parsedTime, err := time.Parse(layout, strTime)
if err != nil { // if err != nil {
return err // return err
} // }
//
// 使用反射设置创建时间字段 // // 使用反射设置创建时间字段
createdAtField := reflect.ValueOf(model).Elem().FieldByName("CreatedAt") // createdAtField := reflect.ValueOf(model).Elem().FieldByName("CreatedAt")
if createdAtField.CanSet() { // if createdAtField.CanSet() {
createdAtField.Set(reflect.ValueOf(parsedTime)) // createdAtField.Set(reflect.ValueOf(parsedTime))
} // }
//
return nil // return nil
} // }
func (m *Model) BeforeUpdate(tx *gorm.DB) (err error) { func (m *Model) BeforeUpdate(tx *gorm.DB) (err error) {
m.UpdatedAt = LocalTime(time.Now()) m.UpdatedAt = LocalTime(time.Now())
@ -86,3 +85,35 @@ func (m *Model) BeforeUpdate(tx *gorm.DB) (err error) {
return nil return nil
} }
// BeforeCreate 注册 BeforeCreate 回调函数
func (m *Model) BeforeCreate(tx *gorm.DB) (err error) {
IdName := ""
field := tx.Statement.Schema.Fields
for _, v := range field {
if v.PrimaryKey {
IdName = v.Name
}
}
if IdName == "" {
return errors.New("主键错误")
}
// 动态访问 YourModel 结构体本身
model := tx.Statement.Dest
// primaryField := reflect.ValueOf(model).Elem().FieldByName(IdName)
//
// if primaryField.CanSet() {
// primaryField.SetColumn(reflect.ValueOf(parsedTime))
// }
fmt.Println(model)
m.CreatedAt = LocalTime(time.Now())
tx.Statement.SetColumn("CreatedAt", m.CreatedAt)
m.UpdatedAt = LocalTime(time.Now())
tx.Statement.SetColumn("UpdatedAt", m.UpdatedAt)
return nil
}

View File

@ -3,6 +3,7 @@ package requests
type RoleRequest struct { type RoleRequest struct {
GetRoleList // 获取角色列表 GetRoleList // 获取角色列表
PutRoleStatus // 角色禁用/启用 PutRoleStatus // 角色禁用/启用
AddRole // 新增角色
} }
// GetRoleList 获取角色列表 // GetRoleList 获取角色列表
@ -19,4 +20,7 @@ type PutRoleStatus struct {
// AddRole 新增角色 // AddRole 新增角色
type AddRole struct { type AddRole struct {
RoleName string `json:"role_name" form:"role_name" validate:"required" label:"角色名称"`
IsAdmin int `json:"is_admin" form:"is_admin" validate:"oneof=0 1" label:"是否管理员"` // 0:否 1:是)
MenuIds []int64 `json:"menu_ids" form:"menu_ids" validate:"required" label:"菜单"`
} }

View File

@ -17,7 +17,7 @@ func (b *BasicService) Login(LoginRequest requests.Login) (basicResponse.Login,
// 获取用户信息 // 获取用户信息
AdminUserDao := dao.AdminUserDao{} AdminUserDao := dao.AdminUserDao{}
adminUser, err := AdminUserDao.GetAdminUserFirstByAccess(LoginRequest.Access) adminUser, err := AdminUserDao.GetAdminUserFirstByAccess(LoginRequest.Access)
if err != nil || adminUser.UserID == 0 { if err != nil || adminUser == nil {
return basicResponse.Login{}, errors.New("用户名或密码错误") return basicResponse.Login{}, errors.New("用户名或密码错误")
} }

View File

@ -13,7 +13,7 @@ func (r *MenuService) GetMenuList() ([]*menuResponse.GetMenuList, error) {
AdminMenuDao := dao.AdminMenuDao{} AdminMenuDao := dao.AdminMenuDao{}
adminMenu, _ := AdminMenuDao.GetAdminMenuListSortOrderNum() adminMenu, _ := AdminMenuDao.GetAdminMenuListSortOrderNum()
if adminMenu == nil { if adminMenu == nil {
return []*menuResponse.GetMenuList{}, nil return nil, nil
} }
menuMap := make(map[int64]*menuResponse.GetMenuList) menuMap := make(map[int64]*menuResponse.GetMenuList)

View File

@ -2,9 +2,12 @@ package service
import ( import (
"errors" "errors"
"github.com/gin-gonic/gin"
"hospital-admin-api/api/dao" "hospital-admin-api/api/dao"
"hospital-admin-api/api/model" "hospital-admin-api/api/model"
"hospital-admin-api/api/requests"
"hospital-admin-api/api/responses/roleResponse" "hospital-admin-api/api/responses/roleResponse"
"hospital-admin-api/global"
) )
type RoleService struct{} type RoleService struct{}
@ -85,7 +88,7 @@ func (r *RoleService) PutRoleStatus(roleId int64, roleStatus int) (bool, error)
// 获取请求角色数据 // 获取请求角色数据
AdminRoleDao := dao.AdminRoleDao{} AdminRoleDao := dao.AdminRoleDao{}
adminRole, err := AdminRoleDao.GetAdminRoleFirstById(roleId) adminRole, err := AdminRoleDao.GetAdminRoleFirstById(roleId)
if err != nil || adminRole.RoleId == 0 { if err != nil || adminRole == nil {
return false, errors.New("非法操作") return false, errors.New("非法操作")
} }
@ -107,7 +110,7 @@ func (r *RoleService) GetRole(roleId int64) (*roleResponse.GetRole, error) {
// 获取请求角色数据 // 获取请求角色数据
AdminRoleDao := dao.AdminRoleDao{} AdminRoleDao := dao.AdminRoleDao{}
adminRole, err := AdminRoleDao.GetAdminRoleFirstById(roleId) adminRole, err := AdminRoleDao.GetAdminRoleFirstById(roleId)
if err != nil || adminRole.RoleId == 0 { if err != nil || adminRole == nil {
return nil, errors.New("非法操作") return nil, errors.New("非法操作")
} }
@ -128,3 +131,58 @@ func (r *RoleService) GetRole(roleId int64) (*roleResponse.GetRole, error) {
return GetRoleResponse, nil return GetRoleResponse, nil
} }
// AddRole 新增角色
func (r *RoleService) AddRole(c *gin.Context, AddRoleRequest requests.AddRole) (bool, error) {
roleId := c.GetInt64("RoleId")
if roleId == 0 {
return false, errors.New("数据错误")
}
// 获取当前登陆用户数据
AdminRoleDao := dao.AdminRoleDao{}
adminRole, err := AdminRoleDao.GetAdminRoleFirstById(roleId)
if err != nil || adminRole == nil {
return false, errors.New("非法操作")
}
if AddRoleRequest.IsAdmin == 1 && adminRole.IsAdmin == 0 {
return false, errors.New("您当前为普通用户,无法添加管理员用户")
}
AdminMenuDao := dao.AdminMenuDao{}
// 判断菜单id
for _, menuId := range AddRoleRequest.MenuIds {
adminMenu, _ := AdminMenuDao.GetAdminMenuById(menuId)
if adminMenu == nil {
return false, errors.New("菜单错误")
}
}
// 开始事务
tx := global.Db.Begin()
// defer func() {
// if r := recover(); r != nil {
// tx.Rollback()
// }
// }()
// 新增角色
AdminRoleModel := &model.AdminRole{
RoleId: 10,
RoleName: AddRoleRequest.RoleName,
IsAdmin: AddRoleRequest.IsAdmin,
}
adminRole, err = AdminRoleDao.AddAdminRole(tx, AdminRoleModel)
if err != nil || adminRole == nil {
tx.Rollback()
return false, errors.New("非法操作")
}
tx.Commit()
// 新增角色菜单
return true, nil
}

View File

@ -2,6 +2,8 @@ port: 8198 # 启动端口
env: dev # 环境配置 env: dev # 环境配置
snowflake: 1 # 雪花算法机器id
# [数据库配置] # [数据库配置]
mysql: mysql:
host: '42.193.16.243' host: '42.193.16.243'
@ -14,7 +16,8 @@ mysql:
debug: true debug: true
log: log:
file-path: "/var/log/dev-hospital-admin-api/" file-path: "./log/"
# file-path: "/var/log/dev-hospital-admin-api/"
file-name: "hospital-admin-api.log" file-name: "hospital-admin-api.log"
# [redis] # [redis]

View File

@ -3,11 +3,12 @@ package config
var C Config var C Config
type Config struct { type Config struct {
Port int `mapstructure:"port" json:"port" yaml:"port"` Port int `mapstructure:"port" json:"port" yaml:"port"`
Env string `mapstructure:"env" json:"Env" yaml:"Env"` Env string `mapstructure:"env" json:"Env" yaml:"Env"`
Mysql Mysql `mapstructure:"mysql" json:"mysql" yaml:"mysql"` Mysql Mysql `mapstructure:"mysql" json:"mysql" yaml:"mysql"`
Log Log `mapstructure:"log" json:"log" yaml:"log"` Log Log `mapstructure:"log" json:"log" yaml:"log"`
Redis Redis `mapstructure:"redis" json:"redis" yaml:"redis"` Redis Redis `mapstructure:"redis" json:"redis" yaml:"redis"`
Jwt Jwt `mapstructure:"jwt" json:"jwt" yaml:"jwt"` Jwt Jwt `mapstructure:"jwt" json:"jwt" yaml:"jwt"`
Oss Oss `mapstructure:"oss" json:"oss" yaml:"oss"` Oss Oss `mapstructure:"oss" json:"oss" yaml:"oss"`
Snowflake int64 `mapstructure:"snowflake" json:"snowflake" yaml:"snowflake"`
} }

1
go.mod
View File

@ -19,6 +19,7 @@ require (
) )
require ( require (
github.com/bwmarrin/snowflake v0.3.0 // indirect
github.com/bytedance/sonic v1.9.1 // indirect github.com/bytedance/sonic v1.9.1 // indirect
github.com/cespare/xxhash/v2 v2.1.2 // indirect github.com/cespare/xxhash/v2 v2.1.2 // indirect
github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 // indirect github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 // indirect

2
go.sum
View File

@ -38,6 +38,8 @@ cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3f
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
github.com/bwmarrin/snowflake v0.3.0 h1:xm67bEhkKh6ij1790JB83OujPR5CzNe8QuQqAgISZN0=
github.com/bwmarrin/snowflake v0.3.0/go.mod h1:NdZxfVWX+oR6y2K0o6qAYv6gIOP9rjG0/E9WsDpxqwE=
github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM= github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=
github.com/bytedance/sonic v1.9.1 h1:6iJ6NqdoxCDr6mbY8h18oSO+cShGSMRGCEo7F2h0x8s= github.com/bytedance/sonic v1.9.1 h1:6iJ6NqdoxCDr6mbY8h18oSO+cShGSMRGCEo7F2h0x8s=
github.com/bytedance/sonic v1.9.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U= github.com/bytedance/sonic v1.9.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=