Compare commits

..

8 Commits

Author SHA1 Message Date
maguodong f50930ec74 refactor(database): 更新时间模型的钩子函数实现
- 将 BeforeCreate 中的时间设置从直接赋值改为使用 scope.Set 方法
- 将 BeforeUpdate 中的时间设置从直接赋值改为使用 scope.Set 方法
- 移除 AfterDelete 钩子函数并注释掉 AfterFind 钩子函数
- 统一使用 GORM 的 scope 机制处理时间字段更新
2026-03-30 10:32:50 +08:00
maguodong d50f150d98 fix(test): 修正Crud泛型类型声明
- 将Crud[interface{}]更改为Crud[interface{}, interface{}]以匹配正确的泛型参数数量
2026-03-28 18:18:10 +08:00
maguodong 0238ec9a01 docs(curd): 更新Crud结构体注释文档
- 为Crud结构体添加C参数的说明
- 明确C参数为对应模型结构体的字段结构体
- 完善泛型CURD封装的功能描述
2026-03-28 18:17:31 +08:00
maguodong 1cc976ed72 refactor(database): 重构基础模型包结构
- 将 model 包重命名为 base 包
- 移动 base.go 文件到 database/base 目录
- 更新包导入路径以匹配新的目录结构
2026-03-28 18:03:54 +08:00
maguodong 7d3ddc62e3 refactor(database): 重构基础模型结构和时间处理逻辑
- 将 BaseModel 拆分为 IdModel 和 TimeModel 两个独立结构体
- 替换标准库 time 包为 gf 框架的 gtime 包进行时间处理
- 修改字段标签定义,优化数据库列映射配置
- 重写 BeforeCreate、BeforeUpdate 钩子方法实现
- 新增 AfterDelete 钩子方法处理删除后的时间转换
- 统一时间格式化为字符串类型存储到数据库中
2026-03-28 18:01:44 +08:00
maguodong 427f568db6 fix(model): 修改BaseModel主键ID数据类型
- 将Id字段从uint类型改为int类型
- 保持GORM标签和JSON序列化配置不变
2026-03-28 16:22:53 +08:00
maguodong 828e19de93 refactor(database): 修改BaseModel中的ID字段命名规范
- 将ID字段名改为Id以符合Go语言命名约定
- 保持gorm标签和json标签的一致性
- 确保数据库映射功能不受影响
2026-03-28 16:21:02 +08:00
maguodong 1e18be8326 refactor(database): 简化基础模型时间处理逻辑
- 移除自定义 DateTime 类型及其 JSON 序列化/反序列化实现
- 将 CreateTime 和 UpdateTime 字段类型从 DateTime 改为 string
- 添加 GORM 的 BeforeCreate 和 BeforeUpdate 钩子函数
- 使用 time.Now().Format 直接格式化时间字符串
- 移除冗余的 driver.Valuer 和 sql.Scanner 接口实现
2026-03-28 16:13:54 +08:00
4 changed files with 35 additions and 82 deletions

View File

@ -48,7 +48,7 @@ var pageInfo = []string{
}
// Crud -------------------------- 泛型CURD核心结构体 --------------------------
// Crud GORM 版本的泛型CURD封装R为对应的模型结构体
// Crud GORM 版本的泛型CURD封装R为对应的模型结构体 C为对应模型结构体的字段结构体
type Crud[R any, C any] struct {
Dao IDao[C]
}

View File

@ -98,7 +98,7 @@ func TestBuildWhere(t *testing.T) {
// TestBuildMap 测试 BuildMap 方法
func TestBuildMap(t *testing.T) {
// 创建一个空的 Crud 实例用于测试(不需要实际的 Dao
var crud Crud[interface{}]
var crud Crud[interface{}, interface{}]
t.Run("BuildMapWithoutField", func(t *testing.T) {
result := crud.BuildMap(">", 18)
@ -131,7 +131,7 @@ func TestBuildMap(t *testing.T) {
// TestClearField 测试 ClearField 方法
func TestClearField(t *testing.T) {
var crud Crud[interface{}]
var crud Crud[interface{}, interface{}]
t.Run("ClearFieldBasic", func(t *testing.T) {
req := struct {
@ -210,7 +210,7 @@ func TestClearField(t *testing.T) {
// TestBuildWhereAndOr 测试 BuildWhereAndOr 方法
func TestBuildWhereAndOr(t *testing.T) {
var crud Crud[interface{}]
var crud Crud[interface{}, interface{}]
t.Run("SimpleAND", func(t *testing.T) {
where := crud.BuildWhereAndOr().

31
database/base/base.go Normal file
View File

@ -0,0 +1,31 @@
package base
import (
"github.com/gogf/gf/v2/os/gtime"
"gorm.io/gorm"
)
type IdModel struct {
Id int `json:"id" gorm:"column:id;type:int(11);common:id"`
}
type TimeModel struct {
CreateTime string `json:"create_time" gorm:"column:create_time;type:varchar(255);common:创建时间"`
UpdateTime string `json:"update_time" gorm:"column:update_time;type:varchar(255);common:更新时间"`
}
func (tm *TimeModel) BeforeCreate(scope *gorm.DB) error {
scope.Set("create_time", gtime.Datetime())
scope.Set("update_time", gtime.Datetime())
return nil
}
func (tm *TimeModel) BeforeUpdate(scope *gorm.DB) error {
scope.Set("update_time", gtime.Datetime())
return nil
}
//func (tm *TimeModel) AfterFind(scope *gorm.DB) error {
// tm.CreateTime = gtime.New(tm.CreateTime).String()
// tm.UpdateTime = gtime.New(tm.UpdateTime).String()
// return nil
//}

View File

@ -1,78 +0,0 @@
package model
import (
"database/sql/driver"
"encoding/json"
"fmt"
"time"
)
// DateTime 自定义时间类型
type DateTime struct {
time.Time
}
// MarshalJSON 实现 JSON 序列化
func (t DateTime) MarshalJSON() ([]byte, error) {
if t.IsZero() {
return []byte("null"), nil
}
return json.Marshal(t.Format("2006-01-02 15:04:05"))
}
// UnmarshalJSON 实现 JSON 反序列化
func (t *DateTime) UnmarshalJSON(data []byte) error {
var s string
if err := json.Unmarshal(data, &s); err != nil {
return err
}
if s == "" || s == "null" {
t.Time = time.Time{}
return nil
}
parsed, err := time.Parse("2006-01-02 15:04:05", s)
if err != nil {
return err
}
t.Time = parsed
return nil
}
// Value 实现 driver.Valuer
func (t DateTime) Value() (driver.Value, error) {
if t.IsZero() {
return nil, nil
}
return t.Time, nil
}
// Scan 实现 sql.Scanner
func (t *DateTime) Scan(v interface{}) error {
if v == nil {
t.Time = time.Time{}
return nil
}
switch value := v.(type) {
case time.Time:
t.Time = value
return nil
case string:
parsed, err := time.Parse("2006-01-02 15:04:05", value)
if err != nil {
return err
}
t.Time = parsed
return nil
default:
return fmt.Errorf("unsupported type: %T", v)
}
}
// 基础模型
type BaseModel struct {
ID uint `gorm:"column:id;primaryKey;autoIncrement;common:主键ID" json:"id"`
CreateTime DateTime `gorm:"autoCreateTime;column:create_time;type:datetime" json:"create_time"`
UpdateTime DateTime `gorm:"autoUpdateTime;column:update_time;type:datetime" json:"update_time"`
}