From 71f682d99ad201bc0410be6ec576755d8541420f Mon Sep 17 00:00:00 2001 From: wucongxing <815046773@qq.com> Date: Tue, 13 Jun 2023 17:08:48 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/controller/menu.go | 2 +- api/controller/role.go | 34 ++++++++++++------ api/dao/adminMenu.go | 11 ++++++ api/dao/adminRole.go | 19 +++++++--- api/dao/adminUser.go | 8 ++--- api/middlewares/auth.go | 4 +-- api/model/adminMenuApi.go | 4 +-- api/model/adminRole.go | 12 +++++++ api/model/model.go | 73 ++++++++++++++++++++++++++++----------- api/requests/role.go | 4 +++ api/service/basic.go | 2 +- api/service/menu.go | 2 +- api/service/role.go | 62 +++++++++++++++++++++++++++++++-- config.yaml | 5 ++- config/config.go | 15 ++++---- go.mod | 1 + go.sum | 2 ++ 17 files changed, 202 insertions(+), 58 deletions(-) diff --git a/api/controller/menu.go b/api/controller/menu.go index fd13bf8..3f70a34 100644 --- a/api/controller/menu.go +++ b/api/controller/menu.go @@ -17,7 +17,7 @@ func (r *Menu) GetMenuList(c *gin.Context) { return } - if len(MenuList) == 0 { + if MenuList == nil { responses.FailWithMessage("请联系管理人员设置菜单", c) return } diff --git a/api/controller/role.go b/api/controller/role.go index b812f6f..dbf2db5 100644 --- a/api/controller/role.go +++ b/api/controller/role.go @@ -62,7 +62,7 @@ func (r *Role) GetRoleList(c *gin.Context) { AdminRoleDao := dao.AdminRoleDao{} 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) c.Abort() return @@ -116,17 +116,29 @@ func (r *Role) PutRoleStatus(c *gin.Context) { // AddRole 新增角色 func (r *Role) AddRole(c *gin.Context) { - // if err := c.ShouldBind(&RoleRequest.PutRoleStatus); err != nil { - // responses.FailWithMessage(err.Error(), c) - // return - // } - // - // // 参数验证 - // if err := global.Validate.Struct(RoleRequest.PutRoleStatus); err != nil { - // responses.FailWithMessage(utils.Translate(err), c) - // return - // } + if err := c.ShouldBindJSON(&RoleRequest.AddRole); err != nil { + responses.FailWithMessage(err.Error(), 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) } diff --git a/api/dao/adminMenu.go b/api/dao/adminMenu.go index c5f80ac..ed247a0 100644 --- a/api/dao/adminMenu.go +++ b/api/dao/adminMenu.go @@ -8,6 +8,7 @@ import ( type AdminMenuDao struct { } +// GetAdminMenuList 获取菜单列表 func (r *AdminMenuDao) GetAdminMenuList() (m []*model.AdminMenu, err error) { err = global.Db.Find(&m).Error if err != nil { @@ -16,6 +17,7 @@ func (r *AdminMenuDao) GetAdminMenuList() (m []*model.AdminMenu, err error) { return m, nil } +// GetAdminMenuListSortOrderNum 获取菜单列表-排序 func (r *AdminMenuDao) GetAdminMenuListSortOrderNum() (m []*model.AdminMenu, err error) { err = global.Db.Order("order_num asc").Find(&m).Error if err != nil { @@ -23,3 +25,12 @@ func (r *AdminMenuDao) GetAdminMenuListSortOrderNum() (m []*model.AdminMenu, err } 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 +} diff --git a/api/dao/adminRole.go b/api/dao/adminRole.go index ac256ab..23ca0da 100644 --- a/api/dao/adminRole.go +++ b/api/dao/adminRole.go @@ -1,6 +1,7 @@ package dao import ( + "gorm.io/gorm" "hospital-admin-api/api/model" "hospital-admin-api/global" ) @@ -10,28 +11,28 @@ type AdminRoleDao struct { // GetAdminRoleFirstById 角色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 if err != nil { - return m, err + return nil, err } return m, nil } // 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 if roleName != "" { err = global.Db.Where("role_name = ?", roleName).Offset(offset).Limit(pageSize).Find(&m).Error if err != nil { - return m, err + return nil, err } } else { err = global.Db.Offset(offset).Limit(pageSize).Find(&m).Error if err != nil { - return m, err + return nil, err } } return m, nil @@ -45,3 +46,11 @@ func (r *AdminRoleDao) EditAdminRoleStatusById(roleId int64, roleStatus int) err } 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 +} diff --git a/api/dao/adminUser.go b/api/dao/adminUser.go index f6b9607..d0953a3 100644 --- a/api/dao/adminUser.go +++ b/api/dao/adminUser.go @@ -10,19 +10,19 @@ type AdminUserDao struct { // GetAdminUserFirstById 获取用户数据-用户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 if err != nil { - return m, err + return nil, err } return m, nil } // 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 if err != nil { - return m, err + return nil, err } return m, nil } diff --git a/api/middlewares/auth.go b/api/middlewares/auth.go index 9516cec..d63c097 100644 --- a/api/middlewares/auth.go +++ b/api/middlewares/auth.go @@ -32,7 +32,7 @@ func Auth() gin.HandlerFunc { // 获取用户数据 AdminUserDao := dao.AdminUserDao{} adminUser, err := AdminUserDao.GetAdminUserFirstById(userId) - if err != nil || adminUser.UserID == 0 { + if err != nil || adminUser == nil { responses.FailWithMessage("用户数据错误", c) c.Abort() return @@ -53,7 +53,7 @@ func Auth() gin.HandlerFunc { // 获取角色数据 AdminRoleDao := dao.AdminRoleDao{} adminRole, err := AdminRoleDao.GetAdminRoleFirstById(roleId) - if err != nil || adminRole.RoleId == 0 { + if err != nil || adminRole == nil { responses.FailWithMessage("用户数据错误", c) c.Abort() return diff --git a/api/model/adminMenuApi.go b/api/model/adminMenuApi.go index 434284e..8b764f1 100644 --- a/api/model/adminMenuApi.go +++ b/api/model/adminMenuApi.go @@ -2,8 +2,8 @@ package model // AdminMenuApi 后台-菜单-接口表 type AdminMenuApi struct { - MenuId int64 `gorm:"column:menu_id;type:bigint(19);primary_key;comment:菜单id" json:"menu_id"` - ApiId int64 `gorm:"column:api_id;type:bigint(19);primary_key;comment:接口id" json:"api_id"` + MenuId int64 `gorm:"column:menu_id;type:bigint(19);comment:菜单id" json:"menu_id"` + ApiId int64 `gorm:"column:api_id;type:bigint(19);comment:接口id" json:"api_id"` Menu AdminMenu `gorm:"foreignkey:MenuId;association_foreignkey:MenuID"` API AdminAPI `gorm:"foreignkey:ApiId;association_foreignkey:APIID"` } diff --git a/api/model/adminRole.go b/api/model/adminRole.go index 06f7b64..4051fac 100644 --- a/api/model/adminRole.go +++ b/api/model/adminRole.go @@ -12,3 +12,15 @@ type AdminRole struct { func (m *AdminRole) TableName() string { 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 +// } diff --git a/api/model/model.go b/api/model/model.go index 95c2dbb..fde4b41 100644 --- a/api/model/model.go +++ b/api/model/model.go @@ -5,7 +5,6 @@ import ( "errors" "fmt" "gorm.io/gorm" - "reflect" "strings" "time" ) @@ -59,26 +58,26 @@ func (t *LocalTime) String() string { } // BeforeCreate 注册 BeforeCreate 回调函数 -func (m *Model) BeforeCreate(tx *gorm.DB) (err error) { - // 动态访问 YourModel 结构体本身 - model := tx.Statement.Dest - - // 设置创建时间 - layout := "2006-01-02 15:04:05" - strTime := "2019-08-09 11:35:52" - parsedTime, err := time.Parse(layout, strTime) - if err != nil { - return err - } - - // 使用反射设置创建时间字段 - createdAtField := reflect.ValueOf(model).Elem().FieldByName("CreatedAt") - if createdAtField.CanSet() { - createdAtField.Set(reflect.ValueOf(parsedTime)) - } - - return nil -} +// func (m *Model) BeforeCreate(tx *gorm.DB) (err error) { +// // 动态访问 YourModel 结构体本身 +// model := tx.Statement.Dest +// +// // 设置创建时间 +// layout := "2006-01-02 15:04:05" +// strTime := "2019-08-09 11:35:52" +// parsedTime, err := time.Parse(layout, strTime) +// if err != nil { +// return err +// } +// +// // 使用反射设置创建时间字段 +// createdAtField := reflect.ValueOf(model).Elem().FieldByName("CreatedAt") +// if createdAtField.CanSet() { +// createdAtField.Set(reflect.ValueOf(parsedTime)) +// } +// +// return nil +// } func (m *Model) BeforeUpdate(tx *gorm.DB) (err error) { m.UpdatedAt = LocalTime(time.Now()) @@ -86,3 +85,35 @@ func (m *Model) BeforeUpdate(tx *gorm.DB) (err error) { 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 +} diff --git a/api/requests/role.go b/api/requests/role.go index 81c0564..39e61c5 100644 --- a/api/requests/role.go +++ b/api/requests/role.go @@ -3,6 +3,7 @@ package requests type RoleRequest struct { GetRoleList // 获取角色列表 PutRoleStatus // 角色禁用/启用 + AddRole // 新增角色 } // GetRoleList 获取角色列表 @@ -19,4 +20,7 @@ type PutRoleStatus struct { // AddRole 新增角色 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:"菜单"` } diff --git a/api/service/basic.go b/api/service/basic.go index 329a48b..128e253 100644 --- a/api/service/basic.go +++ b/api/service/basic.go @@ -17,7 +17,7 @@ func (b *BasicService) Login(LoginRequest requests.Login) (basicResponse.Login, // 获取用户信息 AdminUserDao := dao.AdminUserDao{} adminUser, err := AdminUserDao.GetAdminUserFirstByAccess(LoginRequest.Access) - if err != nil || adminUser.UserID == 0 { + if err != nil || adminUser == nil { return basicResponse.Login{}, errors.New("用户名或密码错误") } diff --git a/api/service/menu.go b/api/service/menu.go index 306e13d..6054aff 100644 --- a/api/service/menu.go +++ b/api/service/menu.go @@ -13,7 +13,7 @@ func (r *MenuService) GetMenuList() ([]*menuResponse.GetMenuList, error) { AdminMenuDao := dao.AdminMenuDao{} adminMenu, _ := AdminMenuDao.GetAdminMenuListSortOrderNum() if adminMenu == nil { - return []*menuResponse.GetMenuList{}, nil + return nil, nil } menuMap := make(map[int64]*menuResponse.GetMenuList) diff --git a/api/service/role.go b/api/service/role.go index f69ef59..a9fe09f 100644 --- a/api/service/role.go +++ b/api/service/role.go @@ -2,9 +2,12 @@ package service import ( "errors" + "github.com/gin-gonic/gin" "hospital-admin-api/api/dao" "hospital-admin-api/api/model" + "hospital-admin-api/api/requests" "hospital-admin-api/api/responses/roleResponse" + "hospital-admin-api/global" ) type RoleService struct{} @@ -85,7 +88,7 @@ func (r *RoleService) PutRoleStatus(roleId int64, roleStatus int) (bool, error) // 获取请求角色数据 AdminRoleDao := dao.AdminRoleDao{} adminRole, err := AdminRoleDao.GetAdminRoleFirstById(roleId) - if err != nil || adminRole.RoleId == 0 { + if err != nil || adminRole == nil { return false, errors.New("非法操作") } @@ -107,7 +110,7 @@ func (r *RoleService) GetRole(roleId int64) (*roleResponse.GetRole, error) { // 获取请求角色数据 AdminRoleDao := dao.AdminRoleDao{} adminRole, err := AdminRoleDao.GetAdminRoleFirstById(roleId) - if err != nil || adminRole.RoleId == 0 { + if err != nil || adminRole == nil { return nil, errors.New("非法操作") } @@ -128,3 +131,58 @@ func (r *RoleService) GetRole(roleId int64) (*roleResponse.GetRole, error) { 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 +} diff --git a/config.yaml b/config.yaml index 0c47b1a..a240e84 100644 --- a/config.yaml +++ b/config.yaml @@ -2,6 +2,8 @@ port: 8198 # 启动端口 env: dev # 环境配置 +snowflake: 1 # 雪花算法机器id + # [数据库配置] mysql: host: '42.193.16.243' @@ -14,7 +16,8 @@ mysql: debug: true 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" # [redis] diff --git a/config/config.go b/config/config.go index dd19da3..24c7043 100644 --- a/config/config.go +++ b/config/config.go @@ -3,11 +3,12 @@ package config var C Config type Config struct { - Port int `mapstructure:"port" json:"port" yaml:"port"` - Env string `mapstructure:"env" json:"Env" yaml:"Env"` - Mysql Mysql `mapstructure:"mysql" json:"mysql" yaml:"mysql"` - Log Log `mapstructure:"log" json:"log" yaml:"log"` - Redis Redis `mapstructure:"redis" json:"redis" yaml:"redis"` - Jwt Jwt `mapstructure:"jwt" json:"jwt" yaml:"jwt"` - Oss Oss `mapstructure:"oss" json:"oss" yaml:"oss"` + Port int `mapstructure:"port" json:"port" yaml:"port"` + Env string `mapstructure:"env" json:"Env" yaml:"Env"` + Mysql Mysql `mapstructure:"mysql" json:"mysql" yaml:"mysql"` + Log Log `mapstructure:"log" json:"log" yaml:"log"` + Redis Redis `mapstructure:"redis" json:"redis" yaml:"redis"` + Jwt Jwt `mapstructure:"jwt" json:"jwt" yaml:"jwt"` + Oss Oss `mapstructure:"oss" json:"oss" yaml:"oss"` + Snowflake int64 `mapstructure:"snowflake" json:"snowflake" yaml:"snowflake"` } diff --git a/go.mod b/go.mod index c27a727..f44c62c 100644 --- a/go.mod +++ b/go.mod @@ -19,6 +19,7 @@ require ( ) require ( + github.com/bwmarrin/snowflake v0.3.0 // indirect github.com/bytedance/sonic v1.9.1 // indirect github.com/cespare/xxhash/v2 v2.1.2 // indirect github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 // indirect diff --git a/go.sum b/go.sum index df9bb19..5fb72f8 100644 --- a/go.sum +++ b/go.sum @@ -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= 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/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.9.1 h1:6iJ6NqdoxCDr6mbY8h18oSO+cShGSMRGCEo7F2h0x8s= github.com/bytedance/sonic v1.9.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=