本文最后更新于 2024-08-19,文章内容距离上一次更新已经过去了很久啦,可能已经过时了,请谨慎参考喵。

前情提要

https://blog.imbhj.com/archives/fsaSCzwqhttps://blog.imbhj.com/archives/VePoGk3Dhttps://blog.imbhj.com/archives/csO7QabU

新增用户

还是一样的,首先创建用户表,表结构如下:

CREATE TABLE `sys_admin` (
    `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
    `username` varchar(64) NOT NULL COMMENT '账号',
    `password` varchar(64) NOT NULL COMMENT '密码',
    `nickname` varchar(64) DEFAULT NULL COMMENT '昵称',
    `icon` varchar(500) DEFAULT NULL COMMENT '头像',
    `sex` int(11) NOT NULL DEFAULT '1' COMMENT '性别:1-男;2-女',
    `email` varchar(64) DEFAULT NULL COMMENT '邮箱',
    `phone` varchar(64) DEFAULT NULL COMMENT '手机号',
    `note` varchar(500) DEFAULT NULL COMMENT '备注信息',
    `create_time` datetime NOT NULL COMMENT '创建时间',
    `status` int(11) NOT NULL DEFAULT '1' COMMENT '账号启用状态:1-启用;2-禁用',
    PRIMARY KEY (`id`) USING BTREE,
    UNIQUE KEY `username` (`username`) USING BTREE,
    KEY `create_time` (`create_time`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='后台管理员表(用户)';

实际执行结果:

接下来就是常规操作,先创建结构体 /model/sysAdmin.go

// 系统用户相关模型
// @author DaBaiLuoBo

package model

import "goblog-admin/utils"

// SysAdmin 用户模型对象
type SysAdmin struct {
    ID         uint        `gorm:"column:id;comment:'主键';primaryKey;NOT NULL" json:"id"`                      // ID
    Username   string      `gorm:"column:username;varchar(64);comment:'用户账号';NOT NULL" json:"username"`       // 用户账号
    Password   string      `gorm:"column:password;varchar(64);comment:'密码';NOT NULL" json:"password"`         // 密码
    Nickname   string      `gorm:"column:nickname;varchar(64);comment:'昵称'" json:"nickname"`                  // 昵称
    Status     int         `gorm:"column:status;default:1;comment:'账号启用状态:1-启用;2-禁用';NOT NULL" json:"status"` // 账号启用状态:1-启用;2-禁用
    Icon       string      `gorm:"column:icon;varchar(500);comment:'头像'" json:"icon"`                         // 头像
    Sex        int         `gorm:"column:sex;default:1;comment:'性别:1-男;2-女';NOT NULL" json:"sex"`             // 性别:1-男;2-女
    Email      string      `gorm:"column:email;varchar(64);comment:'邮箱'" json:"email"`                        // 邮箱
    Phone      string      `gorm:"column:phone;varchar(64);comment:'手机号'" json:"phone"`                       // 手机号
    Note       string      `gorm:"column:note;varchar(500);comment:'备注信息'" json:"note"`                       // 备注信息
    CreateTime utils.HTime `gorm:"column:create_time;comment:'创建时间';NOT NULL" json:"createTime"`              // 创建时间
}

func (SysAdmin) TableName() string {
    return "sys_admin"
}

// AddSysAdminDto 新增用户参数对象
type AddSysAdminDto struct {
    RoleId   uint   `validate:"required"` // 角色ID(不是用户ID)
    Username string `validate:"required"` // 用户名(账号)
    Password string `validate:"required"` // 密码
    Nickname string `validate:"required"` // 昵称
    Sex      int    // 性别:1-男;2-女
    Phone    string `validate:"required"` // 手机号
    Email    string `validate:"required"` // 邮箱
    Note     string // 备注信息
    Status   int    `validate:"required"` // 账号启用状态:1-启用;2-禁用
}

然后创建API /api/sysAdmin.go

// 系统用户相关接口
// @author DaBaiLuoBo

package api

import (
    "github.com/gin-gonic/gin"
    "github.com/go-playground/validator/v10"
    "goblog-admin/core"
    "goblog-admin/model"
    "goblog-admin/result"
    "goblog-admin/utils"
    "time"
)

// CreateSysAdmin 新增用户
// @Summary 新增用户
// @Tags 用户相关接口
// @Produce json
// @Description 新增用户
// @Param data body model.AddSysAdminDto true "data"
// @Success 200 {object} result.Result
// @router /api/sysAdmin/add [post]
func CreateSysAdmin(c *gin.Context) {
    var dto model.AddSysAdminDto
    _ = c.BindJSON(&dto)
    // 对必填参数进行一个校验
    err := validator.New().Struct(dto)
    if err != nil {
        result.Failed(c, int(result.ApiCode.MissParameter), result.ApiCode.GetMessage(result.ApiCode.MissParameter))
        return
    }
    // 查询用户名是否重复
    sysAdminByUsername := GetSysAdminByUsername(dto.Username)
    if sysAdminByUsername.ID > 0 {
        result.Failed(c, int(result.ApiCode.UsernameAlreadyExists), result.ApiCode.GetMessage(result.ApiCode.UsernameAlreadyExists))
        return
    }
    // 新增用户
    sysAdmin := model.SysAdmin{
        Username:   dto.Username,
        Nickname:   dto.Nickname,
        Password:   utils.EncryptionMd5(dto.Password), // 使用加密工具类加密密码
        Phone:      dto.Phone,
        Email:      dto.Email,
        Sex:        dto.Sex,
        Note:       dto.Note,
        Status:     dto.Status,
        CreateTime: utils.HTime{Time: time.Now()},
    }
    core.Db.Create(&sysAdmin)
    // 新增用户与角色关系表信息
    sysAdminExists := GetSysAdminByUsername(dto.Username)
    var sysAdminRole model.SysAdminRole
    sysAdminRole.AdminId = sysAdminExists.ID // 用户ID
    sysAdminRole.RoleId = dto.RoleId         // 角色ID
    core.Db.Create(&sysAdminRole)
    result.Success(c, true)
}

// GetSysAdminByUsername 根据用户名称查询用户
func GetSysAdminByUsername(username string) (sysAdmin model.SysAdmin) {
    core.Db.Where("username = ?", username).First(&sysAdmin)
    return sysAdmin
}

/result/code.go 中定义一下新增的状态码:

// 状态码/状态信息
// @author DaiBaiLuoBo

package result

// Codes 定义状态
type Codes struct {
    Message               map[uint]string
    Success               uint
    Failed                uint
    SysMenuIsExist        uint
    DelSysMenuFailed      uint
    DelSysChildMenuFailed uint
    RoleAlreadyExists     uint
    DelSysRoleFailed      uint
    MissParameter         uint
    UsernameAlreadyExists uint
}

// ApiCode 状态码
var ApiCode = &Codes{
    Success:               200,
    Failed:                501,
    SysMenuIsExist:        600,
    DelSysMenuFailed:      601,
    DelSysChildMenuFailed: 602,
    RoleAlreadyExists:     603,
    DelSysRoleFailed:      604,
    MissParameter:         605,
    UsernameAlreadyExists: 606,
}

// 状态信息初始化
func init() {
    ApiCode.Message = map[uint]string{
        ApiCode.Success:               "成功",
        ApiCode.Failed:                "失败",
        ApiCode.SysMenuIsExist:        "菜单名称已存在,请重新输入",
        ApiCode.DelSysMenuFailed:      "菜单已分配,不能删除",
        ApiCode.DelSysChildMenuFailed: "该菜单存在子菜单,不能删除",
        ApiCode.RoleAlreadyExists:     "角色名或角色Key已存在,请重新输入",
        ApiCode.DelSysRoleFailed:      "角色已分配,不能删除",
        ApiCode.MissParameter:         "缺少必填参数",
        ApiCode.UsernameAlreadyExists: "用户名称已存在,请重新输入",
    }
}

// GetMessage 供给外部调用状态信息
func (c *Codes) GetMessage(code uint) string {
    message, ok := c.Message[code]
    // 如果不 ok,返回空,ok 则返回 message
    if !ok {
        return ""
    }
    return message
}

创建一个工具类 /utils/encryption.go ,来加密密码:

// 简单密码加密工具类
// @author DaiBaiLuoBo

package utils

import (
    "crypto/md5"
    "encoding/hex"
)

func EncryptionMd5(s string) string {
    ctx := md5.New()
    ctx.Write([]byte(s))
    return hex.EncodeToString(ctx.Sum(nil))
}

再把路由新增进去 /router/router.go

router.POST("/api/sysAdmin/add", api.CreateSysAdmin)

最后初始化swag,测试一下,先新增几个角色,方便测试数据:

{
  "description": "111111",
  "roleKey": "admintest1",
  "roleName": "测试管理员1",
  "status": 1
}
{
  "description": "222222",
  "roleKey": "admintest2",
  "roleName": "测试管理员2",
  "status": 1
}

查看一下数据库有没有数据:

然后测试新增用户:

{
  "email": "test@test.com",
  "nickname": "测试组组长",
  "note": "测试组组长",
  "password": "111111",
  "phone": "12312341234",
  "roleId": 2,
  "sex": 1,
  "status": 1,
  "username": "test"
}

新增一下:

查看一下数据库:

根据ID查询用户

第一步首先来定义结构体 /model/sysAdmin.go

// 系统用户相关模型
// @author DaBaiLuoBo

package model

import "goblog-admin/utils"

// SysAdmin 用户模型对象
type SysAdmin struct {
    ID         uint        `gorm:"column:id;comment:'主键';primaryKey;NOT NULL" json:"id"`                      // ID
    Username   string      `gorm:"column:username;varchar(64);comment:'用户账号';NOT NULL" json:"username"`       // 用户账号
    Password   string      `gorm:"column:password;varchar(64);comment:'密码';NOT NULL" json:"password"`         // 密码
    Nickname   string      `gorm:"column:nickname;varchar(64);comment:'昵称'" json:"nickname"`                  // 昵称
    Status     int         `gorm:"column:status;default:1;comment:'账号启用状态:1-启用;2-禁用';NOT NULL" json:"status"` // 账号启用状态:1-启用;2-禁用
    Icon       string      `gorm:"column:icon;varchar(500);comment:'头像'" json:"icon"`                         // 头像
    Sex        int         `gorm:"column:sex;default:1;comment:'性别:1-男;2-女';NOT NULL" json:"sex"`             // 性别:1-男;2-女
    Email      string      `gorm:"column:email;varchar(64);comment:'邮箱'" json:"email"`                        // 邮箱
    Phone      string      `gorm:"column:phone;varchar(64);comment:'手机号'" json:"phone"`                       // 手机号
    Note       string      `gorm:"column:note;varchar(500);comment:'备注信息'" json:"note"`                       // 备注信息
    CreateTime utils.HTime `gorm:"column:create_time;comment:'创建时间';NOT NULL" json:"createTime"`              // 创建时间
}

func (SysAdmin) TableName() string {
    return "sys_admin"
}

// AddSysAdminDto 新增用户参数对象
type AddSysAdminDto struct {
    RoleId   uint   `validate:"required"` // 角色ID(不是用户ID)
    Username string `validate:"required"` // 用户名(账号)
    Password string `validate:"required"` // 密码
    Nickname string `validate:"required"` // 昵称
    Sex      int    // 性别:1-男;2-女
    Phone    string `validate:"required"` // 手机号
    Email    string `validate:"required"` // 邮箱
    Note     string // 备注信息
    Status   int    `validate:"required"` // 账号启用状态:1-启用;2-禁用
}

// SysAdminInfo 根据ID查询用户
type SysAdminInfo struct {
    ID       uint   `json:"id"`       // ID
    RoleId   uint   `json:"roleId"`   // 角色ID(不是用户ID)
    Username string `json:"username"` // 用户名(账号)
    Nickname string `json:"nickname"` // 昵称
    Sex      int    `json:"sex"`      // 性别:1-男;2-女
    Phone    string `json:"phone"`    // 手机号
    Email    string `json:"email"`    // 邮箱
    Note     string `json:"note"`     // 备注信息
    Status   int    `json:"status"`   // 账号启用状态:1-启用;2-禁用
}

下一步去定义api /api/sysAdmin.go

// 系统用户相关接口
// @author DaBaiLuoBo

package api

import (
    "github.com/gin-gonic/gin"
    "github.com/go-playground/validator/v10"
    "goblog-admin/core"
    "goblog-admin/model"
    "goblog-admin/result"
    "goblog-admin/utils"
    "strconv"
    "time"
)

// CreateSysAdmin 新增用户
// @Summary 新增用户
// @Tags 用户相关接口
// @Produce json
// @Description 新增用户
// @Param data body model.AddSysAdminDto true "data"
// @Success 200 {object} result.Result
// @router /api/sysAdmin/add [post]
func CreateSysAdmin(c *gin.Context) {
    var dto model.AddSysAdminDto
    _ = c.BindJSON(&dto)
    // 对必填参数进行一个校验
    err := validator.New().Struct(dto)
    if err != nil {
        result.Failed(c, int(result.ApiCode.MissParameter), result.ApiCode.GetMessage(result.ApiCode.MissParameter))
        return
    }
    // 查询用户名是否重复
    sysAdminByUsername := GetSysAdminByUsername(dto.Username)
    if sysAdminByUsername.ID > 0 {
        result.Failed(c, int(result.ApiCode.UsernameAlreadyExists), result.ApiCode.GetMessage(result.ApiCode.UsernameAlreadyExists))
        return
    }
    // 新增用户
    sysAdmin := model.SysAdmin{
        Username:   dto.Username,
        Nickname:   dto.Nickname,
        Password:   utils.EncryptionMd5(dto.Password), // 使用加密工具类加密密码
        Phone:      dto.Phone,
        Email:      dto.Email,
        Sex:        dto.Sex,
        Note:       dto.Note,
        Status:     dto.Status,
        CreateTime: utils.HTime{Time: time.Now()},
    }
    core.Db.Create(&sysAdmin)
    // 新增用户与角色关系表信息
    sysAdminExists := GetSysAdminByUsername(dto.Username)
    var sysAdminRole model.SysAdminRole
    sysAdminRole.AdminId = sysAdminExists.ID // 用户ID
    sysAdminRole.RoleId = dto.RoleId         // 角色ID
    core.Db.Create(&sysAdminRole)
    result.Success(c, true)
}

// GetSysAdmin 根据ID查询用户
// @Summary 根据ID查询用户
// @Tags 用户相关接口
// @Produce json
// @Description 根据ID查询用户
// @Param id query int true "用户ID"
// @Success 200 {object} result.Result
// @router /api/sysAdmin/info [get]
func GetSysAdmin(c *gin.Context) {
    Id, _ := strconv.Atoi(c.Query("id"))
    // 定义返回的结构体
    var sysAdminInfo model.SysAdminInfo
    core.Db.Table("sys_admin").
        Select("sys_admin.*", "sys_admin_role.role_id").
        Joins("LEFT JOIN sys_admin_role ON sys_admin.id = sys_admin_role.admin_id").
        Joins("LEFT JOIN sys_role ON sys_admin_role.role_id = sys_role.id").
        First(&sysAdminInfo, Id)
    result.Success(c, sysAdminInfo)
}

// GetSysAdminByUsername 根据用户名称查询用户
func GetSysAdminByUsername(username string) (sysAdmin model.SysAdmin) {
    core.Db.Where("username = ?", username).First(&sysAdmin)
    return sysAdmin
}

下一步加入路由 /router/router.go

router.GET("/api/sysAdmin/info", api.GetSysAdmin)

最后初始化swag,测试一下:

修改用户信息

第一步依然还是定义结构体 /model/sysAdmin.go

// 系统用户相关模型
// @author DaBaiLuoBo

package model

import "goblog-admin/utils"

// SysAdmin 用户模型对象
type SysAdmin struct {
    ID         uint        `gorm:"column:id;comment:'主键';primaryKey;NOT NULL" json:"id"`                      // ID
    Username   string      `gorm:"column:username;varchar(64);comment:'用户账号';NOT NULL" json:"username"`       // 用户账号
    Password   string      `gorm:"column:password;varchar(64);comment:'密码';NOT NULL" json:"password"`         // 密码
    Nickname   string      `gorm:"column:nickname;varchar(64);comment:'昵称'" json:"nickname"`                  // 昵称
    Status     int         `gorm:"column:status;default:1;comment:'账号启用状态:1-启用;2-禁用';NOT NULL" json:"status"` // 账号启用状态:1-启用;2-禁用
    Icon       string      `gorm:"column:icon;varchar(500);comment:'头像'" json:"icon"`                         // 头像
    Sex        int         `gorm:"column:sex;default:1;comment:'性别:1-男;2-女';NOT NULL" json:"sex"`             // 性别:1-男;2-女
    Email      string      `gorm:"column:email;varchar(64);comment:'邮箱'" json:"email"`                        // 邮箱
    Phone      string      `gorm:"column:phone;varchar(64);comment:'手机号'" json:"phone"`                       // 手机号
    Note       string      `gorm:"column:note;varchar(500);comment:'备注信息'" json:"note"`                       // 备注信息
    CreateTime utils.HTime `gorm:"column:create_time;comment:'创建时间';NOT NULL" json:"createTime"`              // 创建时间
}

func (SysAdmin) TableName() string {
    return "sys_admin"
}

// AddSysAdminDto 新增用户参数对象
type AddSysAdminDto struct {
    RoleId   uint   `validate:"required"` // 角色ID(不是用户ID)
    Username string `validate:"required"` // 用户名(账号)
    Password string `validate:"required"` // 密码
    Nickname string `validate:"required"` // 昵称
    Sex      int    // 性别:1-男;2-女
    Phone    string `validate:"required"` // 手机号
    Email    string `validate:"required"` // 邮箱
    Note     string // 备注信息
    Status   int    `validate:"required"` // 账号启用状态:1-启用;2-禁用
}

// SysAdminInfo 根据ID查询用户
type SysAdminInfo struct {
    ID       uint   `json:"id"`       // ID
    RoleId   uint   `json:"roleId"`   // 角色ID(不是用户ID)
    Username string `json:"username"` // 用户名(账号)
    Nickname string `json:"nickname"` // 昵称
    Sex      int    `json:"sex"`      // 性别:1-男;2-女
    Phone    string `json:"phone"`    // 手机号
    Email    string `json:"email"`    // 邮箱
    Note     string `json:"note"`     // 备注信息
    Status   int    `json:"status"`   // 账号启用状态:1-启用;2-禁用
}

// UpdateSysAdminDto 修改用户信息
type UpdateSysAdminDto struct {
    ID       uint   // ID
    RoleId   uint   `validate:"required"` // 角色ID(不是用户ID)
    Username string `validate:"required"` // 用户名(账号)
    Password string `validate:"required"` // 密码
    Nickname string `validate:"required"` // 昵称
    Sex      int    // 性别:1-男;2-女
    Phone    string `validate:"required"` // 手机号
    Email    string `validate:"required"` // 邮箱
    Note     string // 备注信息
    Status   int    `validate:"required"` // 账号启用状态:1-启用;2-禁用
}

下一步定义接口 /api/sysAdmin.go

// 系统用户相关接口
// @author DaBaiLuoBo

package api

import (
    "github.com/gin-gonic/gin"
    "github.com/go-playground/validator/v10"
    "goblog-admin/core"
    "goblog-admin/model"
    "goblog-admin/result"
    "goblog-admin/utils"
    "strconv"
    "time"
)

// CreateSysAdmin 新增用户
// @Summary 新增用户
// @Tags 用户相关接口
// @Produce json
// @Description 新增用户
// @Param data body model.AddSysAdminDto true "data"
// @Success 200 {object} result.Result
// @router /api/sysAdmin/add [post]
func CreateSysAdmin(c *gin.Context) {
    var dto model.AddSysAdminDto
    _ = c.BindJSON(&dto)
    // 对必填参数进行一个校验
    err := validator.New().Struct(dto)
    if err != nil {
        result.Failed(c, int(result.ApiCode.MissParameter), result.ApiCode.GetMessage(result.ApiCode.MissParameter))
        return
    }
    // 查询用户名是否重复
    sysAdminByUsername := GetSysAdminByUsername(dto.Username)
    if sysAdminByUsername.ID > 0 {
        result.Failed(c, int(result.ApiCode.UsernameAlreadyExists), result.ApiCode.GetMessage(result.ApiCode.UsernameAlreadyExists))
        return
    }
    // 新增用户
    sysAdmin := model.SysAdmin{
        Username:   dto.Username,
        Nickname:   dto.Nickname,
        Password:   utils.EncryptionMd5(dto.Password), // 使用加密工具类加密密码
        Phone:      dto.Phone,
        Email:      dto.Email,
        Sex:        dto.Sex,
        Note:       dto.Note,
        Status:     dto.Status,
        CreateTime: utils.HTime{Time: time.Now()},
    }
    core.Db.Create(&sysAdmin)
    // 新增用户与角色关系表信息
    sysAdminExists := GetSysAdminByUsername(dto.Username)
    var sysAdminRole model.SysAdminRole
    sysAdminRole.AdminId = sysAdminExists.ID // 用户ID
    sysAdminRole.RoleId = dto.RoleId         // 角色ID
    core.Db.Create(&sysAdminRole)
    result.Success(c, true)
}

// GetSysAdmin 根据ID查询用户
// @Summary 根据ID查询用户
// @Tags 用户相关接口
// @Produce json
// @Description 根据ID查询用户
// @Param id query int true "用户ID"
// @Success 200 {object} result.Result
// @router /api/sysAdmin/info [get]
func GetSysAdmin(c *gin.Context) {
    Id, _ := strconv.Atoi(c.Query("id"))
    // 定义返回的结构体
    var sysAdminInfo model.SysAdminInfo
    core.Db.Table("sys_admin").
        Select("sys_admin.*", "sys_admin_role.role_id").
        Joins("LEFT JOIN sys_admin_role ON sys_admin.id = sys_admin_role.admin_id").
        Joins("LEFT JOIN sys_role ON sys_admin_role.role_id = sys_role.id").
        First(&sysAdminInfo, Id)
    result.Success(c, sysAdminInfo)
}

// UpdateSysAdmin 修改用户信息
// @Summary 修改用户信息
// @Tags 用户相关接口
// @Produce json
// @Description 修改用户信息
// @Param data body model.UpdateSysAdminDto true "data"
// @Success 200 {object} result.Result
// @router /api/sysAdmin/update [put]
func UpdateSysAdmin(c *gin.Context) {
    var dto model.UpdateSysAdminDto
    _ = c.BindJSON(&dto)
    // 对必填参数进行一个校验
    err := validator.New().Struct(dto)
    if err != nil {
        result.Failed(c, int(result.ApiCode.MissParameter), result.ApiCode.GetMessage(result.ApiCode.MissParameter))
        return
    }
    // 先查询用户信息
    var sysAdmin model.SysAdmin
    core.Db.First(&sysAdmin, dto.ID)
    // 再修改用户信息
    if dto.Username != "" {
        sysAdmin.Username = dto.Username
    }
    if dto.Nickname != "" {
        sysAdmin.Nickname = dto.Nickname
    }
    if dto.Phone != "" {
        sysAdmin.Phone = dto.Phone
    }
    if dto.Email != "" {
        sysAdmin.Email = dto.Email
    }
    if dto.Note != "" {
        sysAdmin.Note = dto.Note
    }
    sysAdmin.Status = dto.Status
    sysAdmin.Sex = dto.Sex
    core.Db.Save(&sysAdmin)
    // 删除之前绑定的角色再分配新的角色(角色与用户关系表)
    var sysAdminRole model.SysAdminRole
    core.Db.Where("admin_id = ?", dto.ID).Delete(&model.SysAdminRole{})
    sysAdminRole.AdminId = dto.ID
    sysAdminRole.RoleId = dto.RoleId
    core.Db.Create(&sysAdminRole)
    result.Success(c, true)
}

// GetSysAdminByUsername 根据用户名称查询用户
func GetSysAdminByUsername(username string) (sysAdmin model.SysAdmin) {
    core.Db.Where("username = ?", username).First(&sysAdmin)
    return sysAdmin
}

下一步增加路由 /router/router.go

router.PUT("/api/sysAdmin/update", api.UpdateSysAdmin)

初始化swag,测试一下:

报错缺少必填参数了,这是因为定义结构体多定义了一个密码,删除掉:

重新测试:

好的,已经没问题了

删除用户和设置启用状态

还是一样,第一步定义结构体 /model/sysAdmin.go

// 系统用户相关模型
// @author DaBaiLuoBo

package model

import "goblog-admin/utils"

// SysAdmin 用户模型对象
type SysAdmin struct {
    ID         uint        `gorm:"column:id;comment:'主键';primaryKey;NOT NULL" json:"id"`                      // ID
    Username   string      `gorm:"column:username;varchar(64);comment:'用户账号';NOT NULL" json:"username"`       // 用户账号
    Password   string      `gorm:"column:password;varchar(64);comment:'密码';NOT NULL" json:"password"`         // 密码
    Nickname   string      `gorm:"column:nickname;varchar(64);comment:'昵称'" json:"nickname"`                  // 昵称
    Status     int         `gorm:"column:status;default:1;comment:'账号启用状态:1-启用;2-禁用';NOT NULL" json:"status"` // 账号启用状态:1-启用;2-禁用
    Icon       string      `gorm:"column:icon;varchar(500);comment:'头像'" json:"icon"`                         // 头像
    Sex        int         `gorm:"column:sex;default:1;comment:'性别:1-男;2-女';NOT NULL" json:"sex"`             // 性别:1-男;2-女
    Email      string      `gorm:"column:email;varchar(64);comment:'邮箱'" json:"email"`                        // 邮箱
    Phone      string      `gorm:"column:phone;varchar(64);comment:'手机号'" json:"phone"`                       // 手机号
    Note       string      `gorm:"column:note;varchar(500);comment:'备注信息'" json:"note"`                       // 备注信息
    CreateTime utils.HTime `gorm:"column:create_time;comment:'创建时间';NOT NULL" json:"createTime"`              // 创建时间
}

func (SysAdmin) TableName() string {
    return "sys_admin"
}

// AddSysAdminDto 新增用户参数对象
type AddSysAdminDto struct {
    RoleId   uint   `validate:"required"` // 角色ID(不是用户ID)
    Username string `validate:"required"` // 用户名(账号)
    Password string `validate:"required"` // 密码
    Nickname string `validate:"required"` // 昵称
    Sex      int    // 性别:1-男;2-女
    Phone    string `validate:"required"` // 手机号
    Email    string `validate:"required"` // 邮箱
    Note     string // 备注信息
    Status   int    `validate:"required"` // 账号启用状态:1-启用;2-禁用
}

// SysAdminInfo 根据ID查询用户
type SysAdminInfo struct {
    ID       uint   `json:"id"`       // ID
    RoleId   uint   `json:"roleId"`   // 角色ID(不是用户ID)
    Username string `json:"username"` // 用户名(账号)
    Nickname string `json:"nickname"` // 昵称
    Sex      int    `json:"sex"`      // 性别:1-男;2-女
    Phone    string `json:"phone"`    // 手机号
    Email    string `json:"email"`    // 邮箱
    Note     string `json:"note"`     // 备注信息
    Status   int    `json:"status"`   // 账号启用状态:1-启用;2-禁用
}

// UpdateSysAdminDto 修改用户信息
type UpdateSysAdminDto struct {
    ID       uint   // ID
    RoleId   uint   `validate:"required"` // 角色ID(不是用户ID)
    Username string `validate:"required"` // 用户名(账号)
    Nickname string `validate:"required"` // 昵称
    Sex      int    // 性别:1-男;2-女
    Phone    string `validate:"required"` // 手机号
    Email    string `validate:"required"` // 邮箱
    Note     string // 备注信息
    Status   int    `validate:"required"` // 账号启用状态:1-启用;2-禁用
}

// SysAdminIdDto 用户ID参数
type SysAdminIdDto struct {
    ID uint `json:"id"` // ID
}

// UpdateSysAdminStatusDto 设置启用状态参数
type UpdateSysAdminStatusDto struct {
    ID     uint // ID
    Status int  // 账号启用状态:1-启用;2-禁用
}

下一步定义API /api/sysAdmin.go

// 系统用户相关接口
// @author DaBaiLuoBo

package api

import (
    "github.com/gin-gonic/gin"
    "github.com/go-playground/validator/v10"
    "goblog-admin/core"
    "goblog-admin/model"
    "goblog-admin/result"
    "goblog-admin/utils"
    "strconv"
    "time"
)

// CreateSysAdmin 新增用户
// @Summary 新增用户
// @Tags 用户相关接口
// @Produce json
// @Description 新增用户
// @Param data body model.AddSysAdminDto true "data"
// @Success 200 {object} result.Result
// @router /api/sysAdmin/add [post]
func CreateSysAdmin(c *gin.Context) {
    var dto model.AddSysAdminDto
    _ = c.BindJSON(&dto)
    // 对必填参数进行一个校验
    err := validator.New().Struct(dto)
    if err != nil {
        result.Failed(c, int(result.ApiCode.MissParameter), result.ApiCode.GetMessage(result.ApiCode.MissParameter))
        return
    }
    // 查询用户名是否重复
    sysAdminByUsername := GetSysAdminByUsername(dto.Username)
    if sysAdminByUsername.ID > 0 {
        result.Failed(c, int(result.ApiCode.UsernameAlreadyExists), result.ApiCode.GetMessage(result.ApiCode.UsernameAlreadyExists))
        return
    }
    // 新增用户
    sysAdmin := model.SysAdmin{
        Username:   dto.Username,
        Nickname:   dto.Nickname,
        Password:   utils.EncryptionMd5(dto.Password), // 使用加密工具类加密密码
        Phone:      dto.Phone,
        Email:      dto.Email,
        Sex:        dto.Sex,
        Note:       dto.Note,
        Status:     dto.Status,
        CreateTime: utils.HTime{Time: time.Now()},
    }
    core.Db.Create(&sysAdmin)
    // 新增用户与角色关系表信息
    sysAdminExists := GetSysAdminByUsername(dto.Username)
    var sysAdminRole model.SysAdminRole
    sysAdminRole.AdminId = sysAdminExists.ID // 用户ID
    sysAdminRole.RoleId = dto.RoleId         // 角色ID
    core.Db.Create(&sysAdminRole)
    result.Success(c, true)
}

// GetSysAdmin 根据ID查询用户
// @Summary 根据ID查询用户
// @Tags 用户相关接口
// @Produce json
// @Description 根据ID查询用户
// @Param id query int true "用户ID"
// @Success 200 {object} result.Result
// @router /api/sysAdmin/info [get]
func GetSysAdmin(c *gin.Context) {
    Id, _ := strconv.Atoi(c.Query("id"))
    // 定义返回的结构体
    var sysAdminInfo model.SysAdminInfo
    core.Db.Table("sys_admin").
        Select("sys_admin.*", "sys_admin_role.role_id").
        Joins("LEFT JOIN sys_admin_role ON sys_admin.id = sys_admin_role.admin_id").
        Joins("LEFT JOIN sys_role ON sys_admin_role.role_id = sys_role.id").
        First(&sysAdminInfo, Id)
    result.Success(c, sysAdminInfo)
}

// UpdateSysAdmin 修改用户信息
// @Summary 修改用户信息
// @Tags 用户相关接口
// @Produce json
// @Description 修改用户信息
// @Param data body model.UpdateSysAdminDto true "data"
// @Success 200 {object} result.Result
// @router /api/sysAdmin/update [put]
func UpdateSysAdmin(c *gin.Context) {
    var dto model.UpdateSysAdminDto
    _ = c.BindJSON(&dto)
    // 对必填参数进行一个校验
    err := validator.New().Struct(dto)
    if err != nil {
        result.Failed(c, int(result.ApiCode.MissParameter), result.ApiCode.GetMessage(result.ApiCode.MissParameter))
        return
    }
    // 先查询用户信息
    var sysAdmin model.SysAdmin
    core.Db.First(&sysAdmin, dto.ID)
    // 再修改用户信息
    if dto.Username != "" {
        sysAdmin.Username = dto.Username
    }
    if dto.Nickname != "" {
        sysAdmin.Nickname = dto.Nickname
    }
    if dto.Phone != "" {
        sysAdmin.Phone = dto.Phone
    }
    if dto.Email != "" {
        sysAdmin.Email = dto.Email
    }
    if dto.Note != "" {
        sysAdmin.Note = dto.Note
    }
    sysAdmin.Status = dto.Status
    sysAdmin.Sex = dto.Sex
    core.Db.Save(&sysAdmin)
    // 删除之前绑定的角色再分配新的角色(角色与用户关系表)
    var sysAdminRole model.SysAdminRole
    core.Db.Where("admin_id = ?", dto.ID).Delete(&model.SysAdminRole{})
    sysAdminRole.AdminId = dto.ID
    sysAdminRole.RoleId = dto.RoleId
    core.Db.Create(&sysAdminRole)
    result.Success(c, true)
}

// DeleteSysAdmin 根据ID删除用户
// @Summary 根据ID删除用户
// @Tags 用户相关接口
// @Produce json
// @Description 根据ID删除用户
// @Param data body model.SysAdminIdDto true "data"
// @Success 200 {object} result.Result
// @router /api/sysAdmin/delete [delete]
func DeleteSysAdmin(c *gin.Context) {
    var dto model.SysAdminIdDto
    _ = c.BindJSON(&dto)
    core.Db.Delete(&model.SysAdmin{}, dto.ID)
    // 再查询关系表,并删除
    core.Db.Where("admin_id = ?", dto.ID).Delete(&model.SysAdminRole{})
    result.Success(c, true)
}

// UpdateSysAdminStatus 设置用户启用状态
// @Summary 设置用户启用状态
// @Tags 用户相关接口
// @Produce json
// @Description 设置用户启用状态
// @Param data body model.UpdateSysAdminStatusDto true "data"
// @Success 200 {object} result.Result
// @router /api/sysAdmin/updateStatus [put]
func UpdateSysAdminStatus(c *gin.Context) {
    var dto model.UpdateSysAdminStatusDto
    _ = c.BindJSON(&dto)
    var sysAdmin model.SysAdmin
    core.Db.First(&sysAdmin, dto.ID)
    sysAdmin.Status = dto.Status
    core.Db.Save(&sysAdmin)
    result.Success(c, true)
}

// GetSysAdminByUsername 根据用户名称查询用户
func GetSysAdminByUsername(username string) (sysAdmin model.SysAdmin) {
    core.Db.Where("username = ?", username).First(&sysAdmin)
    return sysAdmin
}

最后增加路由 /router/router.go

router.DELETE("/api/sysAdmin/delete", api.DeleteSysAdmin)
router.PUT("/api/sysAdmin/updateStatus", api.UpdateSysAdminStatus)

老样子,初始化swag,测试一下,先新增一个用户,方便测试删除用户:

{
  "email": "test1@test.com",
  "nickname": "测试用户1",
  "note": "测试用户1",
  "password": "1234567890",
  "phone": "12312345678",
  "roleId": 3,
  "sex": 2,
  "status": 1,
  "username": "test1"
}

然后测试接口:

再测试删除:

ok,没问题

修改用户密码

第一步还是先定义结构体 /model/sysAdmin.go

// 系统用户相关模型
// @author DaBaiLuoBo

package model

import "goblog-admin/utils"

// SysAdmin 用户模型对象
type SysAdmin struct {
    ID         uint        `gorm:"column:id;comment:'主键';primaryKey;NOT NULL" json:"id"`                      // ID
    Username   string      `gorm:"column:username;varchar(64);comment:'用户账号';NOT NULL" json:"username"`       // 用户账号
    Password   string      `gorm:"column:password;varchar(64);comment:'密码';NOT NULL" json:"password"`         // 密码
    Nickname   string      `gorm:"column:nickname;varchar(64);comment:'昵称'" json:"nickname"`                  // 昵称
    Status     int         `gorm:"column:status;default:1;comment:'账号启用状态:1-启用;2-禁用';NOT NULL" json:"status"` // 账号启用状态:1-启用;2-禁用
    Icon       string      `gorm:"column:icon;varchar(500);comment:'头像'" json:"icon"`                         // 头像
    Sex        int         `gorm:"column:sex;default:1;comment:'性别:1-男;2-女';NOT NULL" json:"sex"`             // 性别:1-男;2-女
    Email      string      `gorm:"column:email;varchar(64);comment:'邮箱'" json:"email"`                        // 邮箱
    Phone      string      `gorm:"column:phone;varchar(64);comment:'手机号'" json:"phone"`                       // 手机号
    Note       string      `gorm:"column:note;varchar(500);comment:'备注信息'" json:"note"`                       // 备注信息
    CreateTime utils.HTime `gorm:"column:create_time;comment:'创建时间';NOT NULL" json:"createTime"`              // 创建时间
}

func (SysAdmin) TableName() string {
    return "sys_admin"
}

// AddSysAdminDto 新增用户参数对象
type AddSysAdminDto struct {
    RoleId   uint   `validate:"required"` // 角色ID(不是用户ID)
    Username string `validate:"required"` // 用户名(账号)
    Password string `validate:"required"` // 密码
    Nickname string `validate:"required"` // 昵称
    Sex      int    // 性别:1-男;2-女
    Phone    string `validate:"required"` // 手机号
    Email    string `validate:"required"` // 邮箱
    Note     string // 备注信息
    Status   int    `validate:"required"` // 账号启用状态:1-启用;2-禁用
}

// SysAdminInfo 根据ID查询用户
type SysAdminInfo struct {
    ID       uint   `json:"id"`       // ID
    RoleId   uint   `json:"roleId"`   // 角色ID(不是用户ID)
    Username string `json:"username"` // 用户名(账号)
    Nickname string `json:"nickname"` // 昵称
    Sex      int    `json:"sex"`      // 性别:1-男;2-女
    Phone    string `json:"phone"`    // 手机号
    Email    string `json:"email"`    // 邮箱
    Note     string `json:"note"`     // 备注信息
    Status   int    `json:"status"`   // 账号启用状态:1-启用;2-禁用
}

// UpdateSysAdminDto 修改用户信息
type UpdateSysAdminDto struct {
    ID       uint   // ID
    RoleId   uint   `validate:"required"` // 角色ID(不是用户ID)
    Username string `validate:"required"` // 用户名(账号)
    Nickname string `validate:"required"` // 昵称
    Sex      int    // 性别:1-男;2-女
    Phone    string `validate:"required"` // 手机号
    Email    string `validate:"required"` // 邮箱
    Note     string // 备注信息
    Status   int    `validate:"required"` // 账号启用状态:1-启用;2-禁用
}

// SysAdminIdDto 用户ID参数
type SysAdminIdDto struct {
    ID uint `json:"id"` // ID
}

// UpdateSysAdminStatusDto 设置启用状态参数
type UpdateSysAdminStatusDto struct {
    ID     uint // ID
    Status int  // 账号启用状态:1-启用;2-禁用
}

// ResetSysAdminPasswordDto 重置密码参数对象
type ResetSysAdminPasswordDto struct {
    ID       uint   // ID
    Password string // 密码
}

下一步写接口逻辑 /api/sysAdmin.go

// 系统用户相关接口
// @author DaBaiLuoBo

package api

import (
    "github.com/gin-gonic/gin"
    "github.com/go-playground/validator/v10"
    "goblog-admin/core"
    "goblog-admin/model"
    "goblog-admin/result"
    "goblog-admin/utils"
    "strconv"
    "time"
)

// CreateSysAdmin 新增用户
// @Summary 新增用户
// @Tags 用户相关接口
// @Produce json
// @Description 新增用户
// @Param data body model.AddSysAdminDto true "data"
// @Success 200 {object} result.Result
// @router /api/sysAdmin/add [post]
func CreateSysAdmin(c *gin.Context) {
    var dto model.AddSysAdminDto
    _ = c.BindJSON(&dto)
    // 对必填参数进行一个校验
    err := validator.New().Struct(dto)
    if err != nil {
        result.Failed(c, int(result.ApiCode.MissParameter), result.ApiCode.GetMessage(result.ApiCode.MissParameter))
        return
    }
    // 查询用户名是否重复
    sysAdminByUsername := GetSysAdminByUsername(dto.Username)
    if sysAdminByUsername.ID > 0 {
        result.Failed(c, int(result.ApiCode.UsernameAlreadyExists), result.ApiCode.GetMessage(result.ApiCode.UsernameAlreadyExists))
        return
    }
    // 新增用户
    sysAdmin := model.SysAdmin{
        Username:   dto.Username,
        Nickname:   dto.Nickname,
        Password:   utils.EncryptionMd5(dto.Password), // 使用加密工具类加密密码
        Phone:      dto.Phone,
        Email:      dto.Email,
        Sex:        dto.Sex,
        Note:       dto.Note,
        Status:     dto.Status,
        CreateTime: utils.HTime{Time: time.Now()},
    }
    core.Db.Create(&sysAdmin)
    // 新增用户与角色关系表信息
    sysAdminExists := GetSysAdminByUsername(dto.Username)
    var sysAdminRole model.SysAdminRole
    sysAdminRole.AdminId = sysAdminExists.ID // 用户ID
    sysAdminRole.RoleId = dto.RoleId         // 角色ID
    core.Db.Create(&sysAdminRole)
    result.Success(c, true)
}

// GetSysAdmin 根据ID查询用户
// @Summary 根据ID查询用户
// @Tags 用户相关接口
// @Produce json
// @Description 根据ID查询用户
// @Param id query int true "用户ID"
// @Success 200 {object} result.Result
// @router /api/sysAdmin/info [get]
func GetSysAdmin(c *gin.Context) {
    Id, _ := strconv.Atoi(c.Query("id"))
    // 定义返回的结构体
    var sysAdminInfo model.SysAdminInfo
    core.Db.Table("sys_admin").
        Select("sys_admin.*", "sys_admin_role.role_id").
        Joins("LEFT JOIN sys_admin_role ON sys_admin.id = sys_admin_role.admin_id").
        Joins("LEFT JOIN sys_role ON sys_admin_role.role_id = sys_role.id").
        First(&sysAdminInfo, Id)
    result.Success(c, sysAdminInfo)
}

// UpdateSysAdmin 修改用户信息
// @Summary 修改用户信息
// @Tags 用户相关接口
// @Produce json
// @Description 修改用户信息
// @Param data body model.UpdateSysAdminDto true "data"
// @Success 200 {object} result.Result
// @router /api/sysAdmin/update [put]
func UpdateSysAdmin(c *gin.Context) {
    var dto model.UpdateSysAdminDto
    _ = c.BindJSON(&dto)
    // 对必填参数进行一个校验
    err := validator.New().Struct(dto)
    if err != nil {
        result.Failed(c, int(result.ApiCode.MissParameter), result.ApiCode.GetMessage(result.ApiCode.MissParameter))
        return
    }
    // 先查询用户信息
    var sysAdmin model.SysAdmin
    core.Db.First(&sysAdmin, dto.ID)
    // 再修改用户信息
    if dto.Username != "" {
        sysAdmin.Username = dto.Username
    }
    if dto.Nickname != "" {
        sysAdmin.Nickname = dto.Nickname
    }
    if dto.Phone != "" {
        sysAdmin.Phone = dto.Phone
    }
    if dto.Email != "" {
        sysAdmin.Email = dto.Email
    }
    if dto.Note != "" {
        sysAdmin.Note = dto.Note
    }
    sysAdmin.Status = dto.Status
    sysAdmin.Sex = dto.Sex
    core.Db.Save(&sysAdmin)
    // 删除之前绑定的角色再分配新的角色(角色与用户关系表)
    var sysAdminRole model.SysAdminRole
    core.Db.Where("admin_id = ?", dto.ID).Delete(&model.SysAdminRole{})
    sysAdminRole.AdminId = dto.ID
    sysAdminRole.RoleId = dto.RoleId
    core.Db.Create(&sysAdminRole)
    result.Success(c, true)
}

// DeleteSysAdmin 根据ID删除用户
// @Summary 根据ID删除用户
// @Tags 用户相关接口
// @Produce json
// @Description 根据ID删除用户
// @Param data body model.SysAdminIdDto true "data"
// @Success 200 {object} result.Result
// @router /api/sysAdmin/delete [delete]
func DeleteSysAdmin(c *gin.Context) {
    var dto model.SysAdminIdDto
    _ = c.BindJSON(&dto)
    core.Db.Delete(&model.SysAdmin{}, dto.ID)
    // 再查询关系表,并删除
    core.Db.Where("admin_id = ?", dto.ID).Delete(&model.SysAdminRole{})
    result.Success(c, true)
}

// UpdateSysAdminStatus 设置用户启用状态
// @Summary 设置用户启用状态
// @Tags 用户相关接口
// @Produce json
// @Description 设置用户启用状态
// @Param data body model.UpdateSysAdminStatusDto true "data"
// @Success 200 {object} result.Result
// @router /api/sysAdmin/updateStatus [put]
func UpdateSysAdminStatus(c *gin.Context) {
    var dto model.UpdateSysAdminStatusDto
    _ = c.BindJSON(&dto)
    var sysAdmin model.SysAdmin
    core.Db.First(&sysAdmin, dto.ID)
    sysAdmin.Status = dto.Status
    core.Db.Save(&sysAdmin)
    result.Success(c, true)
}

// ResetSysAdminPassword 重置用户密码
// @Summary 重置用户密码
// @Tags 用户相关接口
// @Produce json
// @Description 重置用户密码
// @Param data body model.ResetSysAdminPasswordDto true "data"
// @Success 200 {object} result.Result
// @router /api/sysAdmin/resetPassword [put]
func ResetSysAdminPassword(c *gin.Context) {
    var dto model.ResetSysAdminPasswordDto
    _ = c.BindJSON(&dto)
    var sysAdmin model.SysAdmin
    core.Db.First(&sysAdmin, dto.ID)
    sysAdmin.Password = utils.EncryptionMd5(dto.Password)
    core.Db.Save(&sysAdmin)
    result.Success(c, true)
}

// GetSysAdminByUsername 根据用户名称查询用户
func GetSysAdminByUsername(username string) (sysAdmin model.SysAdmin) {
    core.Db.Where("username = ?", username).First(&sysAdmin)
    return sysAdmin
}

下一步加入路由 /router/router.go

router.PUT("/api/sysAdmin/resetPassword", api.ResetSysAdminPassword)

最后初始化swag,测试一下,修改前的数据:

修改后:

用户列表

类似于上一篇中的角色查询列表,先定义一个返回的结构体 /model/sysAdmin.go

// 系统用户相关模型
// @author DaBaiLuoBo

package model

import "goblog-admin/utils"

// SysAdmin 用户模型对象
type SysAdmin struct {
    ID         uint        `gorm:"column:id;comment:'主键';primaryKey;NOT NULL" json:"id"`                      // ID
    Username   string      `gorm:"column:username;varchar(64);comment:'用户账号';NOT NULL" json:"username"`       // 用户账号
    Password   string      `gorm:"column:password;varchar(64);comment:'密码';NOT NULL" json:"password"`         // 密码
    Nickname   string      `gorm:"column:nickname;varchar(64);comment:'昵称'" json:"nickname"`                  // 昵称
    Status     int         `gorm:"column:status;default:1;comment:'账号启用状态:1-启用;2-禁用';NOT NULL" json:"status"` // 账号启用状态:1-启用;2-禁用
    Icon       string      `gorm:"column:icon;varchar(500);comment:'头像'" json:"icon"`                         // 头像
    Sex        int         `gorm:"column:sex;default:1;comment:'性别:1-男;2-女';NOT NULL" json:"sex"`             // 性别:1-男;2-女
    Email      string      `gorm:"column:email;varchar(64);comment:'邮箱'" json:"email"`                        // 邮箱
    Phone      string      `gorm:"column:phone;varchar(64);comment:'手机号'" json:"phone"`                       // 手机号
    Note       string      `gorm:"column:note;varchar(500);comment:'备注信息'" json:"note"`                       // 备注信息
    CreateTime utils.HTime `gorm:"column:create_time;comment:'创建时间';NOT NULL" json:"createTime"`              // 创建时间
}

func (SysAdmin) TableName() string {
    return "sys_admin"
}

// AddSysAdminDto 新增用户参数对象
type AddSysAdminDto struct {
    RoleId   uint   `validate:"required"` // 角色ID(不是用户ID)
    Username string `validate:"required"` // 用户名(账号)
    Password string `validate:"required"` // 密码
    Nickname string `validate:"required"` // 昵称
    Sex      int    // 性别:1-男;2-女
    Phone    string `validate:"required"` // 手机号
    Email    string `validate:"required"` // 邮箱
    Note     string // 备注信息
    Status   int    `validate:"required"` // 账号启用状态:1-启用;2-禁用
}

// SysAdminInfo 根据ID查询用户
type SysAdminInfo struct {
    ID       uint   `json:"id"`       // ID
    RoleId   uint   `json:"roleId"`   // 角色ID(不是用户ID)
    Username string `json:"username"` // 用户名(账号)
    Nickname string `json:"nickname"` // 昵称
    Sex      int    `json:"sex"`      // 性别:1-男;2-女
    Phone    string `json:"phone"`    // 手机号
    Email    string `json:"email"`    // 邮箱
    Note     string `json:"note"`     // 备注信息
    Status   int    `json:"status"`   // 账号启用状态:1-启用;2-禁用
}

// UpdateSysAdminDto 修改用户信息
type UpdateSysAdminDto struct {
    ID       uint   // ID
    RoleId   uint   `validate:"required"` // 角色ID(不是用户ID)
    Username string `validate:"required"` // 用户名(账号)
    Nickname string `validate:"required"` // 昵称
    Sex      int    // 性别:1-男;2-女
    Phone    string `validate:"required"` // 手机号
    Email    string `validate:"required"` // 邮箱
    Note     string // 备注信息
    Status   int    `validate:"required"` // 账号启用状态:1-启用;2-禁用
}

// SysAdminIdDto 用户ID参数
type SysAdminIdDto struct {
    ID uint `json:"id"` // ID
}

// UpdateSysAdminStatusDto 设置启用状态参数
type UpdateSysAdminStatusDto struct {
    ID     uint // ID
    Status int  // 账号启用状态:1-启用;2-禁用
}

// ResetSysAdminPasswordDto 重置密码参数对象
type ResetSysAdminPasswordDto struct {
    ID       uint   // ID
    Password string // 密码
}

// SysAdminVo 用户参数对象
type SysAdminVo struct {
    ID         uint        `json:"id"`         // ID
    Username   string      `json:"username"`   // 用户名(账号)
    Nickname   string      `json:"nickname"`   // 昵称
    Status     int         `json:"status"`     // 账号启用状态:1-启用;2-禁用
    Icon       string      `json:"icon"`       // 头像
    Sex        int         `json:"sex"`        // 性别:1-男;2-女
    Email      string      `json:"email"`      // 邮箱
    Phone      string      `json:"phone"`      // 手机号
    Note       string      `json:"note"`       // 备注信息
    RoleName   string      `json:"roleName"`   // 备注名称
    CreateTime utils.HTime `json:"createTime"` // 创建时间
}

接下来写接口逻辑 /api/sysAdmin.go

// 系统用户相关接口
// @author DaBaiLuoBo

package api

import (
    "github.com/gin-gonic/gin"
    "github.com/go-playground/validator/v10"
    "goblog-admin/core"
    "goblog-admin/model"
    "goblog-admin/result"
    "goblog-admin/utils"
    "strconv"
    "time"
)

// CreateSysAdmin 新增用户
// @Summary 新增用户
// @Tags 用户相关接口
// @Produce json
// @Description 新增用户
// @Param data body model.AddSysAdminDto true "data"
// @Success 200 {object} result.Result
// @router /api/sysAdmin/add [post]
func CreateSysAdmin(c *gin.Context) {
    var dto model.AddSysAdminDto
    _ = c.BindJSON(&dto)
    // 对必填参数进行一个校验
    err := validator.New().Struct(dto)
    if err != nil {
        result.Failed(c, int(result.ApiCode.MissParameter), result.ApiCode.GetMessage(result.ApiCode.MissParameter))
        return
    }
    // 查询用户名是否重复
    sysAdminByUsername := GetSysAdminByUsername(dto.Username)
    if sysAdminByUsername.ID > 0 {
        result.Failed(c, int(result.ApiCode.UsernameAlreadyExists), result.ApiCode.GetMessage(result.ApiCode.UsernameAlreadyExists))
        return
    }
    // 新增用户
    sysAdmin := model.SysAdmin{
        Username:   dto.Username,
        Nickname:   dto.Nickname,
        Password:   utils.EncryptionMd5(dto.Password), // 使用加密工具类加密密码
        Phone:      dto.Phone,
        Email:      dto.Email,
        Sex:        dto.Sex,
        Note:       dto.Note,
        Status:     dto.Status,
        CreateTime: utils.HTime{Time: time.Now()},
    }
    core.Db.Create(&sysAdmin)
    // 新增用户与角色关系表信息
    sysAdminExists := GetSysAdminByUsername(dto.Username)
    var sysAdminRole model.SysAdminRole
    sysAdminRole.AdminId = sysAdminExists.ID // 用户ID
    sysAdminRole.RoleId = dto.RoleId         // 角色ID
    core.Db.Create(&sysAdminRole)
    result.Success(c, true)
}

// GetSysAdmin 根据ID查询用户
// @Summary 根据ID查询用户
// @Tags 用户相关接口
// @Produce json
// @Description 根据ID查询用户
// @Param id query int true "用户ID"
// @Success 200 {object} result.Result
// @router /api/sysAdmin/info [get]
func GetSysAdmin(c *gin.Context) {
    Id, _ := strconv.Atoi(c.Query("id"))
    // 定义返回的结构体
    var sysAdminInfo model.SysAdminInfo
    core.Db.Table("sys_admin").
        Select("sys_admin.*", "sys_admin_role.role_id").
        Joins("LEFT JOIN sys_admin_role ON sys_admin.id = sys_admin_role.admin_id").
        Joins("LEFT JOIN sys_role ON sys_admin_role.role_id = sys_role.id").
        First(&sysAdminInfo, Id)
    result.Success(c, sysAdminInfo)
}

// UpdateSysAdmin 修改用户信息
// @Summary 修改用户信息
// @Tags 用户相关接口
// @Produce json
// @Description 修改用户信息
// @Param data body model.UpdateSysAdminDto true "data"
// @Success 200 {object} result.Result
// @router /api/sysAdmin/update [put]
func UpdateSysAdmin(c *gin.Context) {
    var dto model.UpdateSysAdminDto
    _ = c.BindJSON(&dto)
    // 对必填参数进行一个校验
    err := validator.New().Struct(dto)
    if err != nil {
        result.Failed(c, int(result.ApiCode.MissParameter), result.ApiCode.GetMessage(result.ApiCode.MissParameter))
        return
    }
    // 先查询用户信息
    var sysAdmin model.SysAdmin
    core.Db.First(&sysAdmin, dto.ID)
    // 再修改用户信息
    if dto.Username != "" {
        sysAdmin.Username = dto.Username
    }
    if dto.Nickname != "" {
        sysAdmin.Nickname = dto.Nickname
    }
    if dto.Phone != "" {
        sysAdmin.Phone = dto.Phone
    }
    if dto.Email != "" {
        sysAdmin.Email = dto.Email
    }
    if dto.Note != "" {
        sysAdmin.Note = dto.Note
    }
    sysAdmin.Status = dto.Status
    sysAdmin.Sex = dto.Sex
    core.Db.Save(&sysAdmin)
    // 删除之前绑定的角色再分配新的角色(角色与用户关系表)
    var sysAdminRole model.SysAdminRole
    core.Db.Where("admin_id = ?", dto.ID).Delete(&model.SysAdminRole{})
    sysAdminRole.AdminId = dto.ID
    sysAdminRole.RoleId = dto.RoleId
    core.Db.Create(&sysAdminRole)
    result.Success(c, true)
}

// DeleteSysAdmin 根据ID删除用户
// @Summary 根据ID删除用户
// @Tags 用户相关接口
// @Produce json
// @Description 根据ID删除用户
// @Param data body model.SysAdminIdDto true "data"
// @Success 200 {object} result.Result
// @router /api/sysAdmin/delete [delete]
func DeleteSysAdmin(c *gin.Context) {
    var dto model.SysAdminIdDto
    _ = c.BindJSON(&dto)
    core.Db.Delete(&model.SysAdmin{}, dto.ID)
    // 再查询关系表,并删除
    core.Db.Where("admin_id = ?", dto.ID).Delete(&model.SysAdminRole{})
    result.Success(c, true)
}

// UpdateSysAdminStatus 设置用户启用状态
// @Summary 设置用户启用状态
// @Tags 用户相关接口
// @Produce json
// @Description 设置用户启用状态
// @Param data body model.UpdateSysAdminStatusDto true "data"
// @Success 200 {object} result.Result
// @router /api/sysAdmin/updateStatus [put]
func UpdateSysAdminStatus(c *gin.Context) {
    var dto model.UpdateSysAdminStatusDto
    _ = c.BindJSON(&dto)
    var sysAdmin model.SysAdmin
    core.Db.First(&sysAdmin, dto.ID)
    sysAdmin.Status = dto.Status
    core.Db.Save(&sysAdmin)
    result.Success(c, true)
}

// ResetSysAdminPassword 重置用户密码
// @Summary 重置用户密码
// @Tags 用户相关接口
// @Produce json
// @Description 重置用户密码
// @Param data body model.ResetSysAdminPasswordDto true "data"
// @Success 200 {object} result.Result
// @router /api/sysAdmin/resetPassword [put]
func ResetSysAdminPassword(c *gin.Context) {
    var dto model.ResetSysAdminPasswordDto
    _ = c.BindJSON(&dto)
    var sysAdmin model.SysAdmin
    core.Db.First(&sysAdmin, dto.ID)
    sysAdmin.Password = utils.EncryptionMd5(dto.Password)
    core.Db.Save(&sysAdmin)
    result.Success(c, true)
}

// GetSysAdminList 分页查询用户列表
// @Summary 分页查询用户列表
// @Tags 用户相关接口
// @Produce json
// @Description 分页查询用户列表
// @Param pageNum query int false "分页数"
// @Param pageSize query int false "每页数"
// @Param username query string false "用户名称"
// @Param status query string false "账号启用状态:1-启用;2-禁用"
// @Param beginTime query string false "开始时间"
// @Param endTime query string false "结束时间"
// @Success 200 {object} result.Result
// @router /api/sysAdmin/list [get]
func GetSysAdminList(c *gin.Context) {
    PageNum, _ := strconv.Atoi(c.Query("pageNum"))
    PageSize, _ := strconv.Atoi(c.Query("pageSize"))
    Username := c.Query("username")
    Status := c.Query("status")
    BeginTime := c.Query("beginTime")
    EndTime := c.Query("endTime")
    if PageSize < 1 {
        PageSize = 10
    }
    if PageNum < 1 {
        PageNum = 1
    }
    var sysAdminVo []model.SysAdminVo
    var count int64
    curDb := core.Db.Table("sys_admin").
        Select("sys_admin.*, sys_role.role_name").
        Joins("LEFT JOIN sys_admin_role ON sys_admin.id = sys_admin_role.admin_id").
        Joins("LEFT JOIN sys_role ON sys_role.id = sys_admin_role.role_id")
    if Username != "" {
        curDb = curDb.Where("sys_admin.username = ?", Username)
    }
    if BeginTime != "" && EndTime != "" {
        curDb = curDb.Where("sys_admin.create_time BETWEEN ? AND ?", BeginTime, EndTime)
    }
    if Status != "" {
        curDb = curDb.Where("sys_admin.status = ?", Status)
    }
    curDb.Count(&count).Limit(PageSize).Offset((PageNum - 1) * PageSize).Order("sys_admin.create_time DESC").Find(&sysAdminVo)
    result.Success(c, map[string]interface{}{"total": count, "pageSize": PageSize, "pageNum": PageNum, "list": sysAdminVo})
}

// GetSysAdminByUsername 根据用户名称查询用户
func GetSysAdminByUsername(username string) (sysAdmin model.SysAdmin) {
    core.Db.Where("username = ?", username).First(&sysAdmin)
    return sysAdmin
}

下一步增加路由 /router/router.go

router.GET("/api/sysAdmin/list", api.GetSysAdminList)

初始化swag,测试一下:

欧克,没什么问题。