go1.20泛型和接口实现通用DAO类并封装service类

goweb: https://gitee.com/ichub/goweb/settings#index

接口

package generaliface

import (
    "gitee.com/ichub/goweb/common/pagemsg/page"
    "github.com/jinzhu/gorm"
)

type DaoIface[P int32 | int64 | string, E IBaseModel[P]] interface {
    Insert(entity *E) (P, error)
    DeleteById(pkey P) error
    Save(entity *E) (P, error)
    Update(entity *E) (P, error)
    UpdateNotNull(pkey P, maps map[string]any) (P, error)
    UpdateMap(pkey int64, maps map[string]interface{}) (P, error)
    FindById(pkey P) (entity *E, found bool, err error)
    FindByIds(pks string) (*[]E, error)
    Query() *page.PageResult
    Count() (int, error)

    GetDB() *gorm.DB
}
package generaliface

type IBaseModel[P int32 | int64 | string] interface {
    PkeyName() string
    PkeyValue() P
    TableName() string
}

basedao

package basedao

import (
    "gitee.com/ichub/goconfig/common/base/basedto"
    "gitee.com/ichub/goconfig/common/base/basemodel"
    "gitee.com/ichub/goconfig/common/dbcontent"
    "gitee.com/ichub/goweb/basemodel/baseiface"
    "gitee.com/ichub/goweb/common/pagemsg/page"
    "github.com/jinzhu/gorm"
    "github.com/sirupsen/logrus"

    "time"
)

type BaseDao[P int32 | int64 | string, E baseiface.IBaseModel[P]] struct {
    basedto.BaseEntitySingle
    *page.PageRequest
}

func NewBaseDao[P int32 | int64 | string, E baseiface.IBaseModel[P]]() *BaseDao[P, E] {
    return &BaseDao[P, E]{
       PageRequest: page.FindBeanPageRequest(),
    }
}

func (this *BaseDao[P, E]) GetDB() *gorm.DB {
    var db, err = dbcontent.GetDB()
    if err != nil {
       logrus.Error(err)
       return nil
    }
    return db
}

func (this *BaseDao[P, E]) Insert(entity *E) (P, error) {

    panic("implement me")
}

func (this *BaseDao[P, E]) DeleteById(pkey P) error {
    var entity E

    err := this.GetDB().Where(entity.PkeyName()+"=?", pkey).Delete(&entity).Error
    return err
}

func (this *BaseDao[P, E]) Save(entity *E) (P, error) {
    err := this.GetDB().Model(entity).Where((*entity).PkeyName()+"=?", (*entity).PkeyValue()).
       Save(entity).Error
    if err != nil {
       logrus.Error(err.Error())
       return (*entity).PkeyValue(), err
    }
    return (*entity).PkeyValue(), err
}

func (this *BaseDao[P, E]) Update(entity *E) (P, error) {

    err := this.GetDB().Model(entity).Where((*entity).PkeyName()+"=?", (*entity).PkeyValue()).Updates(entity).Error
    if err != nil {
       logrus.Error(err.Error())
       return (*entity).PkeyValue(), err
    }
    return (*entity).PkeyValue(), err
}

func (this *BaseDao[P, E]) UpdateNotNull(pkey P, maps map[string]interface{}) (P, error) {
    //TODO implement me
    panic("implement me")
}

func (this *BaseDao[P, E]) UpdateMap(pkey int64, maps map[string]interface{}) (P, error) {
    //TODO implement me
    panic("implement me")
}

func (this *BaseDao[P, E]) FindById(pkey P) (*E, bool, error) {
    var entity = new(E)

    db := this.GetDB().First(entity, pkey)
    return entity, db.RecordNotFound(), db.Error

}

func (this *BaseDao[P, E]) FindByIds(pks string) (*[]E, error) {
    var entity = new(E)

    this.PageRequest.In((*entity).PkeyName(), []any{pks})
    return nil, nil
}

func (this *BaseDao[P, E]) Query() *page.PageResult {
    return this.PageRequest.Query(new(E), &[]E{})
}

func (this *BaseDao[P, E]) Count() (int, error) {

    return this.PageRequest.Count(new(E))

}

func (this *BaseDao[E, P]) formatTime(sec int64) string {
    timeLayout := "2006-01-02 15:04:05"
    datetime := time.Unix(sec, 0).Format(timeLayout)
    return datetime
}

func (this *BaseDao[P, E]) formatDate(sec int64) string {
    timeLayout := "2006-01-02"
    datetime := time.Unix(sec, 0).Format(timeLayout)
    return datetime
}

func (this *BaseDao[E, P]) localTimeFormat(ptime time.Time) string {
    timeLayout := "2006-01-02 15:04:05"
    return ptime.Format(timeLayout)

}

func (this *BaseDao[E, P]) localTimeUTCFormat(ptime time.Time) string {
    timeLayout := "2006-01-02 15:04:05"
    return ptime.UTC().Format(timeLayout)

}

func (this *BaseDao[E, P]) localDateFormat(localDateInt basemodel.LocalDateInt) string {
    timeLayout := "2006-01-02"
    datetime := localDateInt.Time.Format(timeLayout)
    return datetime
}

func (this *BaseDao[E, P]) localDatetimeFormat(localTimeInt basemodel.LocalTimeInt) string {
    timeLayout := "2006-01-02 15:04:05"
    datetime := localTimeInt.Time.Format(timeLayout)
    return datetime
}

service

package baseservice

/*
   @Title  文件名称: SysDeptDao.go
   @Description 描述: DAO层SysDeptDao

   @Author  作者: leijianming@163.com  时间(2024-01-24 17:15:32)
   @Update  作者: leijianming@163.com  时间(2024-01-24 17:15:32)

*/

import (
    "gitee.com/ichub/goweb/basemodel/basedao"
    "gitee.com/ichub/goweb/basemodel/basedto"
)

type SysDeptService struct {
    *basedao.BaseDao[int64, *basedto.SysDept]
}

func NewSysDeptService() *SysDeptService {
    return &SysDeptService{
       BaseDao: basedao.NewBaseDao[int64, *basedto.SysDept](),
    }
}

entity

package basedto

/*
   @Title    文件名称: SysDept.gomodel
   @Description  描述: 实体SysDept

   @Author  作者: leijianming@163.com  时间(2024-01-24 17:15:32)
   @Update  作者: leijianming@163.com  时间(2024-01-24 17:15:32)

*/

import (
    "encoding/json"
    "fmt"
    "gitee.com/ichub/goconfig/common/base/basemodel"
    "github.com/jinzhu/gorm"
    "time"
    _ "time"
)

/* 指定扩展结结构,单独存文件。生成时不会覆盖: */
//type SysDeptBase struct {ModelBase}

/*
部门表
*/
type SysDept struct {
    
    /*  部门id  */
    DeptId int64 `gorm:"column:dept_id;type:bigint(20);PRIMARY_KEY;comment:'部门id'" json:"dept_id,string"`
    /*  父部门id  */
    ParentId int64 `gorm:"column:parent_id;type:bigint(20);comment:'父部门id';default:0" json:"parent_id,string"`
    /*  祖级列表  */
    Ancestors string `gorm:"column:ancestors;type:varchar(50);comment:'祖级列表'" json:"ancestors"`
    /*  部门名称  */
    DeptName string `gorm:"column:dept_name;type:varchar(30);comment:'部门名称'" json:"dept_name"`
    /*  显示顺序  */
    OrderNum int32 `gorm:"column:order_num;type:int(4);comment:'显示顺序';default:0" json:"order_nm"`
    /*  负责人  */
    Leader string `gorm:"column:leader;type:varchar(20);comment:'负责人'" json:"leader"`
    /*  联系电话  */
    Phone string `gorm:"column:phone;type:varchar(11);comment:'联系电话'" json:"phone"`
    /*  邮箱  */
    Email string `gorm:"column:email;type:varchar(50);comment:'邮箱'" json:"email"`
    /*  部门状态(0正常 1停用)  */
    Status string `gorm:"column:status;type:char(1);comment:'部门状态(0正常 1停用)';default:\'0\'" json:"status"`
    /*  删除标志(0代表存在 2代表删除)  */
    DelFlag string `gorm:"column:del_flag;type:char(1);comment:'删除标志(0代表存在 2代表删除)';default:\'0\'" json:"del_flag"`
    /*  创建者  */
    CreateBy string `gorm:"column:create_by;type:varchar(64);comment:'创建者'" json:"create_by"`
    /*  创建时间  */
    CreateTime time.Time `gorm:"column:create_time;type:datetime;comment:'创建时间'" json:"create_time"`
    /*  更新者  */
    UpdateBy string `gorm:"column:update_by;type:varchar(64);comment:'更新者'" json:"update_by"`
    /*  更新时间  */
    UpdateTime time.Time `gorm:"column:update_time;type:datetime;comment:'更新时间'" json:"-"`
}

func NewSysDept() *SysDept {
    return &SysDept{}
}

/*
    gorm默认生成的表名是结构名+'s',所以必须以结构方法指定!
*/
func (entity *SysDept) TableName() string {

    return "sys_dept"
}
func (entity *SysDept) PkeyName() string {

    return "dept_id"
}
func (entity *SysDept) PkeyValue() int64 {

    return entity.DeptId
}

testcase

func Test001(t *testing.T) {
    var s = NewSysDeptService()
    s.PageSize = 2
    s.Query()
    logrus.Error(s)
}

结果:

 {
     "code": 200,
     "msg": "成功",
     "page_size": 2,
     "current": 1,
     "total": 10,
     "data": [
          {
               "dept_id": "100",
               "parent_id": "0",
               "ancestors": "0",
               "dept_name": "若依科技",
               "order_nm": 0,
               "leader": "若依",
               "phone": "15888888888",
               "email": "ry@qq.com",
               "status": "0",
               "del_flag": "0",
               "create_by": "admin",
               "create_time": "2022-05-11T20:38:20+08:00",
               "update_by": ""
          },
          {
               "dept_id": "101",
               "parent_id": "100",
               "ancestors": "0,100",
               "dept_name": "深圳总公司",
               "order_nm": 1,
               "leader": "若依",
               "phone": "15888888888",
               "email": "ry@qq.com",
               "status": "0",
               "del_flag": "0",
               "create_by": "admin",
               "create_time": "2022-05-11T20:38:20+08:00",
               "update_by": ""
          }
     ]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

leijmdas

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值