代码拉取完成,页面将自动刷新
package impl
import (
"context"
"gitee.com/baicaijc/vblog/apps/user"
)
// 实现 user.Service
// 怎么判断这个服务有没有实现这个接口喃?
// &UserServiceImpl{} 是会分配内存, 怎么才能不分配内存,var _ user.Service = &UserServiceImpl{}
// nil 如何声明 *UserServiceImpl 的 nil
// (*UserServiceImpl)(nil) ---> int8的1 转换成int32的1 --> (int32)(1)
// nil 就是一个*UserServiceImpl的空指针
var _ user.Service = (*UserServiceImpl)(nil) // 如果结构体没有实现interface的方法就报错,限制用的结构体必须实现接口的方法
// 用户创建
func (i *UserServiceImpl) CreateUser(
ctx context.Context,
in *user.CreateUserRequest) (
*user.User, error) {
// 1. 校验用户参数请求
if err := in.Validate(); err != nil {
return nil, err
}
// // 2. 创建用户实例对象
u := user.NewUser(in)
// 3. 把对象持久化(放到数据库里)
// orm: orm 需要定义这个对象 存在在那个表里, 以及struct和数据库里表字段的映射关系
// object --> row
// INSERT INTO `users` (`created_at`,`updated_at`,`username`,`password`,`role`,`label`) VALUES (1705130308,1705130308,'admin','123456','1','{}') RETURNING `id`
// 比如 create user, 4秒的时候 请求还没返回, 用户就取消了请求, 后端会因为请求退出而结束吗?
// 程序里 并没有中断数据库操作的能力, 通过WithContext携带上ctx
if err := i.db.WithContext(ctx).Create(u).Error; err != nil {
return nil, err
}
// 4. 返回创建好的对象
return u, nil
}
// 查询用户列表, 对象列表 [{}]
func (i *UserServiceImpl) QueryUser(
ctx context.Context,
in *user.QueryUserRequest) (
*user.UserSet, error) {
// 去数据库查找
query := i.db.WithContext(ctx).Model(&user.User{})
// 构造条件 where username = ""
if in.Username != "" {
// query 会生成一个新的语句, 不会修改query对象本身
query = query.Where("username = ?", in.Username)
}
set := user.NewUserSet()
// 统计当前有多个
// select COUNT(*) from uers where ....
err := query.
Count(&set.Total).
Error
if err != nil {
return nil, err
}
// 做真正的分页查询: sql LIMIT offset,limit
// LIMIT 20,20 这个是查询的第2页
// 使用Find把多行数据查询出来, 使用[]User 来接收返回
err = query.
Limit(in.Limit()).
Offset(in.Offset()).
Find(&set.Items).
Error
if err != nil {
return nil, err
}
return set, nil
}
// 查询用户详情, 通过Id查询,
func (i *UserServiceImpl) DescribeUser(
ctx context.Context,
in *user.DescribeUserRequest) (
*user.User, error) {
// 去数据库查找
query := i.db.WithContext(ctx).Model(&user.User{}).Where("id = ?", in.UserId)
// 准备一个对象 接收数据库的返回
u := user.NewUser(user.NewCreateUserRequest())
if err := query.First(u).Error; err != nil {
return nil, err
}
return u, nil
}
// 修改用户
func (i *UserServiceImpl) UpdateUser(
ctx context.Context,
in *user.UpdateUserRequest) (
*user.User, error) {
// 先去数据库查找要修改的用户
query := i.db.WithContext(ctx).Model(&user.User{}).Where("id = ?", in.UserId)
u := user.NewUser(user.NewCreateUserRequest())
if err := query.First(u).Error; err != nil {
return nil, err
}
// password hash
in.HashPassword()
// 更新用户, 先查后改
u.Username = in.Username
u.Password = in.Password
u.Role = in.Role
i.db.Save(&u)
return u, nil
}
// 删除用户
func (i *UserServiceImpl) DeleteUser(
ctx context.Context,
in *user.DeleteUserRequest) (
*user.User, error) {
// 根据id去数据库查找用户
query := i.db.WithContext(ctx).Model(&user.User{}).Where("id = ?", in.UserId)
// 准备一个对象 接收数据库的返回,用于展示删除的用户信息
u := user.NewUser(user.NewCreateUserRequest())
if err := query.First(u).Error; err != nil {
return nil, err
}
// 删除用户
i.db.Delete(&u)
return u, nil
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。