From c05cb63bc78d4005216937bb10c1a7a0880b4a5b Mon Sep 17 00:00:00 2001 From: zhangwenjian Date: Thu, 3 Jun 2021 09:27:34 +0800 Subject: [PATCH] =?UTF-8?q?refactor=F0=9F=8E=A8:=20=20=E6=94=B9=E9=80=A0?= =?UTF-8?q?=E5=8D=87=E7=BA=A7=E7=94=A8=E6=88=B7=E7=AE=A1=E7=90=86=E6=A8=A1?= =?UTF-8?q?=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/admin/apis/sys_user.go | 150 ++++++++++++++++++++++-------- app/admin/router/sys_user.go | 6 +- app/admin/service/dto/sys_user.go | 49 ++++++++-- app/admin/service/sys_user.go | 68 +++++++++++++- 4 files changed, 218 insertions(+), 55 deletions(-) diff --git a/app/admin/apis/sys_user.go b/app/admin/apis/sys_user.go index 7faa84ec..d6ed4fe2 100644 --- a/app/admin/apis/sys_user.go +++ b/app/admin/apis/sys_user.go @@ -1,6 +1,7 @@ package apis import ( + "github.com/gin-gonic/gin/binding" "go-admin/app/admin/models" "net/http" @@ -29,11 +30,11 @@ type SysUser struct { // @Router /api/v1/sysUser [get] // @Security Bearer func (e SysUser) GetSysUserList(c *gin.Context) { - s := new(service.SysUser) - req := new(dto.SysUserSearch) + s := service.SysUser{} + req := dto.SysUserSearch{} err := e.MakeContext(c). MakeOrm(). - Bind(req). + Bind(&req, binding.Form). MakeService(&s.Service). Errors if err != nil { @@ -48,7 +49,7 @@ func (e SysUser) GetSysUserList(c *gin.Context) { list := make([]models.SysUser, 0) var count int64 - err = s.GetSysUserPage(req, p, &list, &count) + err = s.GetSysUserPage(&req, p, &list, &count) if err != nil { e.Error(http.StatusInternalServerError, err, "查询失败") return @@ -66,11 +67,11 @@ func (e SysUser) GetSysUserList(c *gin.Context) { // @Router /api/v1/sysUser/{userId} [get] // @Security Bearer func (e SysUser) GetSysUser(c *gin.Context) { - s := new(service.SysUser) - req := new(dto.SysUserById) + s := service.SysUser{} + req := dto.SysUserById{} err := e.MakeContext(c). MakeOrm(). - Bind(req). + Bind(&req, nil). MakeService(&s.Service). Errors if err != nil { @@ -78,18 +79,14 @@ func (e SysUser) GetSysUser(c *gin.Context) { e.Logger.Error(err) return } - var object models.SysUser - //数据权限检查 p := actions.GetPermissionFromContext(c) - - err = s.GetSysUser(req, p, &object) + err = s.GetSysUser(&req, p, &object) if err != nil { e.Error(http.StatusUnprocessableEntity, err, "查询失败") return } - e.OK(object, "查看成功") } @@ -104,11 +101,11 @@ func (e SysUser) GetSysUser(c *gin.Context) { // @Success 200 {string} string "{"code": -1, "message": "添加失败"}" // @Router /api/v1/sysUser [post] func (e SysUser) InsertSysUser(c *gin.Context) { - s := new(service.SysUser) - req := new(dto.SysUserControl) + s := service.SysUser{} + req := dto.SysUserControl{} err := e.MakeContext(c). MakeOrm(). - Bind(req). + Bind(&req, binding.JSON). MakeService(&s.Service). Errors if err != nil { @@ -116,14 +113,12 @@ func (e SysUser) InsertSysUser(c *gin.Context) { e.Logger.Error(err) return } - // 设置创建人 req.SetCreateBy(user.GetUserId(c)) - - err = s.InsertSysUser(req) + err = s.InsertSysUser(&req) if err != nil { e.Logger.Error(err) - e.Error(http.StatusInternalServerError, err, "创建失败") + e.Error(http.StatusInternalServerError, err, err.Error()) return } @@ -141,11 +136,11 @@ func (e SysUser) InsertSysUser(c *gin.Context) { // @Success 200 {string} string "{"code": -1, "message": "修改失败"}" // @Router /api/v1/sysuser/{userId} [put] func (e SysUser) UpdateSysUser(c *gin.Context) { - s := new(service.SysUser) - req := new(dto.SysUserControl) + s := service.SysUser{} + req := dto.SysUserControl{} err := e.MakeContext(c). MakeOrm(). - Bind(req). + Bind(&req, binding.JSON, nil). MakeService(&s.Service). Errors if err != nil { @@ -159,7 +154,7 @@ func (e SysUser) UpdateSysUser(c *gin.Context) { //数据权限检查 p := actions.GetPermissionFromContext(c) - err = s.UpdateSysUser(req, p) + err = s.UpdateSysUser(&req, p) if err != nil { e.Logger.Error(err) return @@ -176,11 +171,11 @@ func (e SysUser) UpdateSysUser(c *gin.Context) { // @Success 200 {string} string "{"code": -1, "message": "删除失败"}" // @Router /api/v1/sysuser/{userId} [delete] func (e SysUser) DeleteSysUser(c *gin.Context) { - s := new(service.SysUser) - req := new(dto.SysUserById) + s := service.SysUser{} + req := dto.SysUserById{} err := e.MakeContext(c). MakeOrm(). - Bind(req). + Bind(&req, binding.JSON, nil). MakeService(&s.Service). Errors if err != nil { @@ -195,7 +190,7 @@ func (e SysUser) DeleteSysUser(c *gin.Context) { // 数据权限检查 p := actions.GetPermissionFromContext(c) - err = s.RemoveSysUser(req, p) + err = s.RemoveSysUser(&req, p) if err != nil { e.Logger.Error(err) return @@ -214,7 +209,7 @@ func (e SysUser) DeleteSysUser(c *gin.Context) { // @Router /api/v1/user/avatar [post] func (e SysUser) InsetSysUserAvatar(c *gin.Context) { s := service.SysUser{} - req := new(dto.SysUserControl) + req := dto.SysUserControl{} err := e.MakeContext(c). MakeOrm(). MakeService(&s.Service). @@ -226,7 +221,6 @@ func (e SysUser) InsetSysUserAvatar(c *gin.Context) { } // 数据权限检查 p := actions.GetPermissionFromContext(c) - form, _ := c.MultipartForm() files := form.File["upload[]"] guid := uuid.New().String() @@ -244,7 +238,7 @@ func (e SysUser) InsetSysUserAvatar(c *gin.Context) { req.UserId = p.UserId req.Avatar = "/" + filPath - err = s.UpdateSysUser(req, p) + err = s.UpdateSysUser(&req, p) if err != nil { e.Logger.Error(err) return @@ -252,7 +246,81 @@ func (e SysUser) InsetSysUserAvatar(c *gin.Context) { e.OK(filPath, "修改成功") } -// SysUserUpdatePwd +// UpdateSysUserStatus 修改用户状态 +// @Summary 修改用户状态 +// @Description 获取JSON +// @Tags 用户 +// @Accept application/json +// @Product application/json +// @Param data body dto.UpdateSysUserStatusReq true "body" +// @Success 200 {string} string "{"code": 200, "message": "修改成功"}" +// @Success 200 {string} string "{"code": -1, "message": "修改失败"}" +// @Router /api/v1/user/status [put] +func (e SysUser) UpdateSysUserStatus(c *gin.Context) { + s := service.SysUser{} + req := dto.UpdateSysUserStatusReq{} + err := e.MakeContext(c). + MakeOrm(). + Bind(&req). + MakeService(&s.Service). + Errors + if err != nil { + e.Error(http.StatusInternalServerError, err, err.Error()) + e.Logger.Error(err) + return + } + + req.SetUpdateBy(user.GetUserId(c)) + + //数据权限检查 + p := actions.GetPermissionFromContext(c) + + err = s.UpdateSysUserStatus(&req, p) + if err != nil { + e.Logger.Error(err) + return + } + e.OK(req.GetId(), "更新成功") +} + +// ResetSysUserPwd 重置用户密码 +// @Summary 重置用户密码 +// @Description 获取JSON +// @Tags 用户 +// @Accept application/json +// @Product application/json +// @Param data body dto.ResetSysUserPwdReq true "body" +// @Success 200 {string} string "{"code": 200, "message": "修改成功"}" +// @Success 200 {string} string "{"code": -1, "message": "修改失败"}" +// @Router /api/v1/user/pwd/reset [put] +func (e SysUser) ResetSysUserPwd(c *gin.Context) { + s := service.SysUser{} + req := dto.ResetSysUserPwdReq{} + err := e.MakeContext(c). + MakeOrm(). + Bind(&req). + MakeService(&s.Service). + Errors + if err != nil { + e.Error(http.StatusInternalServerError, err, err.Error()) + e.Logger.Error(err) + return + } + + req.SetUpdateBy(user.GetUserId(c)) + + //数据权限检查 + p := actions.GetPermissionFromContext(c) + + err = s.ResetSysUserPwd(&req, p) + if err != nil { + e.Logger.Error(err) + return + } + e.OK(req.GetId(), "更新成功") +} + +// UpdateSysUserPwd // @Summary 重置密码 // @Description 获取JSON // @Tags 用户 @@ -262,12 +330,12 @@ func (e SysUser) InsetSysUserAvatar(c *gin.Context) { // @Success 200 {object} response.Response "{"code": 200, "data": [...]}" // @Router /api/v1/user/pwd [post] // @Security Bearer -func (e SysUser) SysUserUpdatePwd(c *gin.Context) { - s := new(service.SysUser) - req := new(dto.PassWord) +func (e SysUser) UpdateSysUserPwd(c *gin.Context) { + s := service.SysUser{} + req := dto.PassWord{} err := e.MakeContext(c). MakeOrm(). - Bind(req). + Bind(&req). MakeService(&s.Service). Errors if err != nil { @@ -296,8 +364,8 @@ func (e SysUser) SysUserUpdatePwd(c *gin.Context) { // @Router /api/v1/user/profile [get] // @Security Bearer func (e SysUser) GetSysUserProfile(c *gin.Context) { - s := new(service.SysUser) - req := new(dto.SysUserById) + s := service.SysUser{} + req := dto.SysUserById{} err := e.MakeContext(c). MakeOrm(). MakeService(&s.Service). @@ -313,7 +381,7 @@ func (e SysUser) GetSysUserProfile(c *gin.Context) { user := new(models.SysUser) roles := make([]models.SysRole, 0) posts := make([]models.SysPost, 0) - err = s.GetSysUserProfile(req, user, &roles, &posts) + err = s.GetSysUserProfile(&req, user, &roles, &posts) if err != nil { e.Logger.Errorf("get user profile error, %s", err.Error()) e.Error(http.StatusInternalServerError, err, "获取用户信息失败") @@ -327,8 +395,8 @@ func (e SysUser) GetSysUserProfile(c *gin.Context) { } func (e SysUser) GetInfo(c *gin.Context) { - req := new(dto.SysUserById) - s := new(service.SysUser) + req := dto.SysUserById{} + s := service.SysUser{} err := e.MakeContext(c). MakeOrm(). MakeService(&s.Service). @@ -369,7 +437,7 @@ func (e SysUser) GetInfo(c *gin.Context) { req.Id = user.GetUserId(c) - err = s.GetSysUser(req, p, &sysUser) + err = s.GetSysUser(&req, p, &sysUser) if err != nil { e.Error(http.StatusUnauthorized, err, "登录失败") return diff --git a/app/admin/router/sys_user.go b/app/admin/router/sys_user.go index c44fec98..8c4e1d71 100644 --- a/app/admin/router/sys_user.go +++ b/app/admin/router/sys_user.go @@ -15,7 +15,7 @@ func init() { // 需认证的路由代码 func registerSysUserRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) { api := apis.SysUser{} - r := v1.Group("/sysUser").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole()).Use(actions.PermissionAction()) + r := v1.Group("/sys-user").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole()).Use(actions.PermissionAction()) { r.GET("", api.GetSysUserList) r.GET("/:id", api.GetSysUser) @@ -28,7 +28,9 @@ func registerSysUserRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddle { user.GET("/profile", api.GetSysUserProfile) user.POST("/avatar", api.InsetSysUserAvatar) - user.PUT("/pwd", api.SysUserUpdatePwd) + user.PUT("/pwd", api.UpdateSysUserPwd) + user.PUT("/pwd/reset", api.ResetSysUserPwd) + user.PUT("/status", api.UpdateSysUserStatus) } v1auth := v1.Group("").Use(authMiddleware.MiddlewareFunc()) { diff --git a/app/admin/service/dto/sys_user.go b/app/admin/service/dto/sys_user.go index 506cd222..11ecb7d2 100644 --- a/app/admin/service/dto/sys_user.go +++ b/app/admin/service/dto/sys_user.go @@ -9,7 +9,7 @@ import ( type SysUserSearch struct { dto.Pagination `search:"-"` - UserId int `form:"UserId" search:"type:exact;column:user_id;table:sys_user" comment:"用户ID"` + UserId int `form:"userId" search:"type:exact;column:user_id;table:sys_user" comment:"用户ID"` Username string `form:"username" search:"type:contains;column:username;table:sys_user" comment:"用户名"` NickName string `form:"nickName" search:"type:contains;column:nick_name;table:sys_user" comment:"昵称"` Phone string `form:"phone" search:"type:contains;column:phone;table:sys_user" comment:"手机号"` @@ -29,24 +29,59 @@ type SysUserOrder struct { CreatedAtOrder string `search:"type:order;column:created_at;table:sys_user" form:"createdAtOrder"` } + func (m *SysUserSearch) GetNeedSearch() interface{} { return *m } +type ResetSysUserPwdReq struct { + UserId int `json:"userId" comment:"用户ID" binding:"required"` // 用户ID + Password string `json:"password" comment:"密码" binding:"required"` + common.ControlBy +} + +func (s *ResetSysUserPwdReq) GetId() interface{} { + return s.UserId +} + +func (s *ResetSysUserPwdReq) Generate(model *models.SysUser) { + if s.UserId != 0 { + model.UserId = s.UserId + } + model.Password = s.Password +} + +type UpdateSysUserStatusReq struct { + UserId int `json:"userId" comment:"用户ID" binding:"required"` // 用户ID + Status string `json:"status" comment:"状态" binding:"required"` + common.ControlBy +} + +func (s *UpdateSysUserStatusReq) GetId() interface{} { + return s.UserId +} + +func (s *UpdateSysUserStatusReq) Generate(model *models.SysUser) { + if s.UserId != 0 { + model.UserId = s.UserId + } + model.Status = s.Status +} + type SysUserControl struct { UserId int `json:"userId" comment:"用户ID"` // 用户ID - Username string `json:"username" comment:"用户名"` + Username string `json:"username" comment:"用户名" binding:"required"` Password string `json:"password" comment:"密码"` - NickName string `json:"nickName" comment:"昵称"` - Phone string `json:"phone" comment:"手机号"` + NickName string `json:"nickName" comment:"昵称" binding:"required"` + Phone string `json:"phone" comment:"手机号" binding:"required"` RoleId int `json:"roleId" comment:"角色ID"` Avatar string `json:"avatar" comment:"头像"` Sex string `json:"sex" comment:"性别"` - Email string `json:"email" comment:"邮箱"` - DeptId int `json:"deptId" comment:"部门"` + Email string `json:"email" comment:"邮箱" binding:"required,email"` + DeptId int `json:"deptId" comment:"部门" binding:"required"` PostId int `json:"postId" comment:"岗位"` Remark string `json:"remark" comment:"备注"` - Status string `json:"status" comment:"状态"` + Status string `json:"status" comment:"状态" binding:"required" default:"1"` common.ControlBy } diff --git a/app/admin/service/sys_user.go b/app/admin/service/sys_user.go index e08c124f..2ebf2b50 100644 --- a/app/admin/service/sys_user.go +++ b/app/admin/service/sys_user.go @@ -23,13 +23,12 @@ func (e *SysUser) GetSysUserPage(c *dto.SysUserSearch, p *actions.DataPermission var err error var data models.SysUser - err = e.Orm.Model(&data). + err = e.Orm.Debug().Preload("Dept"). Scopes( cDto.MakeCondition(c.GetNeedSearch()), cDto.Paginate(c.GetPageSize(), c.GetPageIndex()), actions.Permission(data.TableName(), p), ). - Preload("Dept"). Find(list).Limit(-1).Offset(-1). Count(count).Error if err != nil { @@ -43,7 +42,7 @@ func (e *SysUser) GetSysUserPage(c *dto.SysUserSearch, p *actions.DataPermission func (e *SysUser) GetSysUser(d *dto.SysUserById, p *actions.DataPermission, model *models.SysUser) error { var data models.SysUser - err := e.Orm.Model(&data). + err := e.Orm.Model(&data).Debug(). Scopes( actions.Permission(data.TableName(), p), ). @@ -64,6 +63,17 @@ func (e *SysUser) GetSysUser(d *dto.SysUserById, p *actions.DataPermission, mode func (e *SysUser) InsertSysUser(c *dto.SysUserControl) error { var err error var data models.SysUser + var i int64 + err = e.Orm.Model(&data).Where("username = ?", c.Username).Count(&i).Error + if err != nil { + e.Log.Errorf("db error: %s", err) + return err + } + if i > 0 { + err := errors.New("用户名已存在!") + e.Log.Errorf("db error: %s", err) + return err + } c.Generate(&data) err = e.Orm.Create(&data).Error if err != nil { @@ -97,6 +107,53 @@ func (e *SysUser) UpdateSysUser(c *dto.SysUserControl, p *actions.DataPermission return nil } +// UpdateSysUserStatus 更新用户状态 +func (e *SysUser) UpdateSysUserStatus(c *dto.UpdateSysUserStatusReq, p *actions.DataPermission) error { + var err error + var model models.SysUser + db := e.Orm.Scopes( + actions.Permission(model.TableName(), p), + ).First(&model, c.GetId()) + if err = db.Error; err != nil { + e.Log.Errorf("Service UpdateSysUser error: %s", err) + return err + } + if db.RowsAffected == 0 { + return errors.New("无权更新该数据") + + } + c.Generate(&model) + err = e.Orm.Save(&model).Error + if err != nil { + e.Log.Errorf("Service UpdateSysUser error: %s", err) + return err + } + return nil +} + +// ResetSysUserPwd 重置用户密码 +func (e *SysUser) ResetSysUserPwd(c *dto.ResetSysUserPwdReq, p *actions.DataPermission) error { + var err error + var model models.SysUser + db := e.Orm.Scopes( + actions.Permission(model.TableName(), p), + ).First(&model, c.GetId()) + if err = db.Error; err != nil { + e.Log.Errorf("At Service ResetSysUserPwd error: %s", err) + return err + } + if db.RowsAffected == 0 { + return errors.New("无权更新该数据") + } + c.Generate(&model) + err = e.Orm.Save(&model).Error + if err != nil { + e.Log.Errorf("At Service ResetSysUserPwd error: %s", err) + return err + } + return nil +} + // RemoveSysUser 删除SysUser func (e *SysUser) RemoveSysUser(c *dto.SysUserById, p *actions.DataPermission) error { var err error @@ -107,7 +164,7 @@ func (e *SysUser) RemoveSysUser(c *dto.SysUserById, p *actions.DataPermission) e actions.Permission(data.TableName(), p), ).Delete(&data, c.GetId()) if err = db.Error; err != nil { - e.Log.Errorf("Delete error: %s", err) + e.Log.Errorf("Error found in RemoveSysUser : %s", err) return err } if db.RowsAffected == 0 { @@ -128,7 +185,8 @@ func (e *SysUser) UpdateSysUserPwd(id int, oldPassword, newPassword string, p *a err = e.Orm.Model(c). Scopes( actions.Permission(c.TableName(), p), - ).Where(id).Select("UserId", "Password", "Salt").First(c).Error + ).Select("UserId", "Password", "Salt"). + First(c, id).Error if err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { return errors.New("无权更新该数据")