feat: add gormv2 and support sqlite

This commit is contained in:
engigu
2024-04-29 17:31:13 +08:00
parent 44054ae157
commit 33e44ce596
22 changed files with 236 additions and 279 deletions
+4 -4
View File
@@ -2,13 +2,13 @@ package models
import (
"errors"
"github.com/jinzhu/gorm"
"gorm.io/gorm"
)
type Auth struct {
ID int `json:"id" gorm:"type:int(11) AUTO_INCREMENT comment 'id';primary_key" json:"id"`
Username string `json:"username" gorm:"type:varchar(100) comment '用户名';default:'';"`
Password string `json:"password" gorm:"type:varchar(100) comment '密码';default:'';"`
ID int `json:"id" gorm:"autoIncrement;type:integer ;primaryKey" json:"id"`
Username string `json:"username" gorm:"type:varchar(100);default:'';"`
Password string `json:"password" gorm:"type:varchar(100);default:'';"`
}
// CheckAuth 检查用户信息
+12 -12
View File
@@ -3,21 +3,21 @@ package models
import (
"errors"
"fmt"
"github.com/jinzhu/gorm"
"gorm.io/gorm"
"message-nest/pkg/util"
)
type CronMessages struct {
UUIDModel
Name string `json:"name" gorm:"type:varchar(200) comment '关联的消息名称';default:'';"`
TaskID string `json:"task_id" gorm:"type:varchar(36) comment '关联的消息ID';default:'';"`
Cron string `json:"cron" gorm:"type:varchar(4096) comment '定时表达式';default:'';"`
Title string `json:"title" gorm:"type:varchar(1000) comment '消息名称';default:'';"`
Content string `json:"content" gorm:"type:varchar(4096) comment '消息内容';default:'';"`
//MarkDown string `json:"markdown" gorm:"type:varchar(4096) comment 'markdown内容';default:'';"`
Url string `json:"url" gorm:"type:varchar(4096) comment 'url地址';default:'';"`
Enable int `json:"enable" gorm:"type:int comment '开启、暂停状态';default:1;"`
Name string `json:"name" gorm:"type:varchar(200) ;default:'';"`
TaskID string `json:"task_id" gorm:"type:varchar(36) ;default:'';"`
Cron string `json:"cron" gorm:"type:varchar(4096) ;default:'';"`
Title string `json:"title" gorm:"type:varchar(1000) ;default:'';"`
Content string `json:"content" gorm:"type:varchar(4096) ;default:'';"`
//MarkDown string `json:"markdown" gorm:"type:varchar(4096) ;default:'';"`
Url string `json:"url" gorm:"type:varchar(4096) ;default:'';"`
Enable int `json:"enable" gorm:"type:int ;default:1;"`
}
func GenerateMsgUniqueID() string {
@@ -77,10 +77,10 @@ func GetCronMessages(pageNum int, pageSize int, name string, maps interface{}) (
}
// GetCronMessagesTotal 获取所有任务总数
func GetCronMessagesTotal(name string, maps interface{}) (int, error) {
func GetCronMessagesTotal(name string, maps interface{}) (int64, error) {
var (
err error
total int
total int64
)
query := db.Model(&CronMessages{}).Where(maps)
if name != "" {
@@ -110,7 +110,7 @@ func EditCronMsg(id string, data interface{}) error {
func GetCronMsgByID(id string) (CronMessages, error) {
var msg CronMessages
err := db.Where("id = ? ", id).Find(&msg).Error
err := db.Where("id = ? ", id).Take(&msg).Error
if err != nil && errors.Is(err, gorm.ErrRecordNotFound) {
return msg, err
}
+33 -91
View File
@@ -2,32 +2,33 @@ package models
import (
"fmt"
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/mysql"
"github.com/glebarez/sqlite"
"gorm.io/driver/mysql"
"gorm.io/gorm"
"gorm.io/gorm/schema"
"log"
"message-nest/pkg/setting"
"message-nest/pkg/util"
"time"
)
var db *gorm.DB
type IDModel struct {
ID int `gorm:"type:int(11) AUTO_INCREMENT comment 'id';primary_key" json:"id"`
ID uint `gorm:"autoIncrement;type:integer;primaryKey" json:"id"`
CreatedBy string `json:"created_by" gorm:"type:varchar(100) comment '创建人';default:'';"`
ModifiedBy string `json:"modified_by" gorm:"type:varchar(100) comment '修改人';default:'';"`
CreatedOn util.Time `json:"created_on" gorm:"type:timestamp comment '创建时间';default:current_timestamp;"`
ModifiedOn util.Time `json:"modified_on" gorm:"type:timestamp comment '更新时间';"`
CreatedBy string `json:"created_by" gorm:"type:varchar(100) ;default:'';"`
ModifiedBy string `json:"modified_by" gorm:"type:varchar(100) ;default:'';"`
CreatedAt util.Time `json:"created_on" gorm:"column:created_on;autoCreateTime "`
UpdatedAt util.Time `json:"modified_on" gorm:"column:modified_on;autoUpdateTime ;"`
}
type UUIDModel struct {
ID string `gorm:"type:varchar(12) comment 'id';primary_key" json:"id"`
ID string `gorm:"type:varchar(12) ;primaryKey" json:"id"`
CreatedBy string `json:"created_by" gorm:"type:varchar(100) comment '创建人';default:'';"`
ModifiedBy string `json:"modified_by" gorm:"type:varchar(100) comment '修改人';default:'';"`
CreatedOn util.Time `json:"created_on" gorm:"type:timestamp comment '创建时间';default:current_timestamp;"`
ModifiedOn util.Time `json:"modified_on" gorm:"type:timestamp comment '更新时间';"`
CreatedBy string `json:"created_by" gorm:"type:varchar(100) ;default:'';"`
ModifiedBy string `json:"modified_by" gorm:"type:varchar(100) ;default:'';"`
CreatedAt util.Time `json:"created_on" gorm:"column:created_on;autoCreateTime "`
UpdatedAt util.Time `json:"modified_on" gorm:"column:modified_on;autoUpdateTime ;"`
}
// Setup initializes the database instance
@@ -39,92 +40,33 @@ func Setup() *gorm.DB {
setting.DatabaseSetting.Host,
setting.DatabaseSetting.Port,
setting.DatabaseSetting.Name)
db, err = gorm.Open(setting.DatabaseSetting.Type, connStr)
config := &gorm.Config{
NamingStrategy: schema.NamingStrategy{
TablePrefix: setting.DatabaseSetting.TablePrefix,
},
}
switch setting.DatabaseSetting.Type {
case "mysql":
db, err = gorm.Open(mysql.Open(connStr), config)
case "sqlite":
db, err = gorm.Open(sqlite.Open("conf/database.db"), config)
}
if err != nil {
log.Fatalf("models.Setup err: %v", err)
}
gorm.DefaultTableNameHandler = func(db *gorm.DB, defaultTableName string) string {
return setting.DatabaseSetting.TablePrefix + defaultTableName
}
if setting.DatabaseSetting.SqlDebug == "enable" {
db.LogMode(true)
db = db.Debug()
}
db.SingularTable(true)
db.Callback().Create().Replace("gorm:update_time_stamp", updateTimeStampForCreateCallback)
db.Callback().Update().Replace("gorm:update_time_stamp", updateTimeStampForUpdateCallback)
db.Callback().Delete().Replace("gorm:delete", deleteCallback)
db.DB().SetMaxIdleConns(10)
db.DB().SetMaxOpenConns(100)
return db
}
// CloseDB closes database connection (unnecessary)
func CloseDB() {
defer db.Close()
}
// updateTimeStampForCreateCallback will set `CreatedOn`, `ModifiedOn` when creating
func updateTimeStampForCreateCallback(scope *gorm.Scope) {
if !scope.HasError() {
nowTime := time.Now()
if createTimeField, ok := scope.FieldByName("CreatedOn"); ok {
if createTimeField.IsBlank {
createTimeField.Set(nowTime)
}
}
if modifyTimeField, ok := scope.FieldByName("ModifiedOn"); ok {
if modifyTimeField.IsBlank {
modifyTimeField.Set(nowTime)
}
}
}
}
// updateTimeStampForUpdateCallback will set `ModifiedOn` when updating
func updateTimeStampForUpdateCallback(scope *gorm.Scope) {
if _, ok := scope.Get("gorm:update_column"); !ok {
scope.SetColumn("ModifiedOn", time.Now())
}
}
// deleteCallback will set `DeletedOn` where deleting
func deleteCallback(scope *gorm.Scope) {
if !scope.HasError() {
var extraOption string
if str, ok := scope.Get("gorm:delete_option"); ok {
extraOption = fmt.Sprint(str)
}
deletedOnField, hasDeletedOnField := scope.FieldByName("DeletedOn")
if !scope.Search.Unscoped && hasDeletedOnField {
scope.Raw(fmt.Sprintf(
"UPDATE %v SET %v=%v%v%v",
scope.QuotedTableName(),
scope.Quote(deletedOnField.DBName),
scope.AddToVars(time.Now().Unix()),
addExtraSpaceIfExist(scope.CombinedConditionSql()),
addExtraSpaceIfExist(extraOption),
)).Exec()
} else {
scope.Raw(fmt.Sprintf(
"DELETE FROM %v%v%v",
scope.QuotedTableName(),
addExtraSpaceIfExist(scope.CombinedConditionSql()),
addExtraSpaceIfExist(extraOption),
)).Exec()
}
}
}
// addExtraSpaceIfExist adds a separator
func addExtraSpaceIfExist(str string) string {
if str != "" {
return " " + str
}
return ""
func GetSchema(table any) string {
stmt := &gorm.Statement{DB: db}
stmt.Parse(table)
return stmt.Schema.Table
}
+8 -8
View File
@@ -3,13 +3,13 @@ package models
type SendTasksIns struct {
UUIDModel
TaskID string `json:"task_id" gorm:"type:varchar(12) comment '任务id';default:'';index:task_id"`
WayID string `json:"way_id" gorm:"type:varchar(12) comment '渠道id';default:'';index:way_id"`
WayType string `json:"way_type" gorm:"type:varchar(100) comment '渠道类型';default:'';index:way_type"`
ContentType string `json:"content_type" gorm:"type:varchar(100) comment '实例类型';default:'';index:content_type"`
Config string `json:"config" gorm:"type:text comment '实例配置';"`
Extra string `json:"extra" gorm:"type:text comment '额外信息';"`
Enable int `json:"enable" gorm:"type:int comment '开启、暂停状态';default:1;"`
TaskID string `json:"task_id" gorm:"type:varchar(12) ;default:'';index"`
WayID string `json:"way_id" gorm:"type:varchar(12) ;default:'';index"`
WayType string `json:"way_type" gorm:"type:varchar(100) ;default:'';index"`
ContentType string `json:"content_type" gorm:"type:varchar(100) ;default:'';index"`
Config string `json:"config" gorm:"type:text ;"`
Extra string `json:"extra" gorm:"type:text ;"`
Enable int `json:"enable" gorm:"type:int ;default:1;"`
}
// InsEmailConfig 实例里面的邮箱config
@@ -39,7 +39,7 @@ func ManyAddTaskIns(taskIns []SendTasksIns) error {
tx := db.Begin()
for _, ins := range taskIns {
// 存在就跳过这条ins记录
err := db.Where("id = ?", ins.ID).Find(&SendTasksIns{}).Error
err := db.Where("id = ?", ins.ID).Take(&SendTasksIns{}).Error
if err == nil {
continue
}
+11 -10
View File
@@ -3,14 +3,14 @@ package models
import (
"errors"
"fmt"
"github.com/jinzhu/gorm"
"gorm.io/gorm"
"message-nest/pkg/util"
)
type SendTasks struct {
UUIDModel
Name string `json:"name" gorm:"type:varchar(100) comment '任务名称';default:'';"`
Name string `json:"name" gorm:"type:varchar(100) ;default:'';"`
}
func GenerateTaskUniqueID() string {
@@ -20,7 +20,7 @@ func GenerateTaskUniqueID() string {
// AddSendTaskWithID 添加实例的时候添加任务
func AddSendTaskWithID(name string, id string, createdBy string) error {
err := db.Where("id = ?", id).Find(&SendTasks{}).Error
err := db.Where("id = ?", id).Take(&SendTasks{}).Error
if err == nil {
return nil
}
@@ -77,10 +77,10 @@ func GetSendTasks(pageNum int, pageSize int, name string, maps interface{}) ([]S
}
// GetSendTasksTotal 获取所有任务总数
func GetSendTasksTotal(name string, maps interface{}) (int, error) {
func GetSendTasksTotal(name string, maps interface{}) (int64, error) {
var (
err error
total int
total int64
)
query := db.Model(&SendTasks{}).Where(maps)
if name != "" {
@@ -108,8 +108,9 @@ type TaskIns struct {
// GetTasksIns 获取所有任务下所有的实例
func GetTasksIns(id string) (TaskIns, error) {
insTable := db.NewScope(SendTasksIns{}).TableName()
waysTable := db.NewScope(SendWays{}).TableName()
//insTable := GetSchema(SendTasksIns{})
insTable := GetSchema(SendTasksIns{})
waysTable := GetSchema(SendWays{})
var (
task SendTasks
taskIns []SendTasksInsRes
@@ -136,8 +137,8 @@ func GetTasksIns(id string) (TaskIns, error) {
// FindTaskByWayId 通过way_id找到关联的任务
func FindTaskByWayId(wayId string) []SendTasks {
insTable := db.NewScope(SendTasksIns{}).TableName()
taskTable := db.NewScope(SendTasks{}).TableName()
insTable := GetSchema(SendTasksIns{})
taskTable := GetSchema(SendTasks{})
var (
tasks []SendTasks
)
@@ -177,7 +178,7 @@ func EditSendTask(id string, data interface{}) error {
func GetTaskByID(id string) (SendTasks, error) {
var task SendTasks
err := db.Where("id = ? ", id).Find(&task).Error
err := db.Where("id = ? ", id).Take(&task).Error
if err != nil && errors.Is(err, gorm.ErrRecordNotFound) {
return task, err
}
+27 -21
View File
@@ -3,17 +3,18 @@ package models
import (
"fmt"
"message-nest/pkg/util"
//"time"
)
type SendTasksLogs struct {
ID int `gorm:"primary_key" json:"id" `
TaskID string `json:"task_id" gorm:"type:varchar(12) comment '任务id';default:'';index:task_id"`
Log string `json:"log" gorm:"type:text comment '日志';"`
Status *int `json:"status" gorm:"type:int comment '状态';default:0;"`
CallerIp string `json:"caller_ip" gorm:"type:varchar(256) comment '发送者的ip';default:'';"`
ID int `gorm:"primaryKey" json:"id" `
TaskID string `json:"task_id" gorm:"type:varchar(12) ;default:'';index:task_id"`
Log string `json:"log" gorm:"type:text ;"`
Status *int `json:"status" gorm:"type:int ;default:0;"`
CallerIp string `json:"caller_ip" gorm:"type:varchar(256) ;default:'';"`
CreatedOn util.Time `json:"created_on" gorm:"type:timestamp comment '创建时间';default:current_timestamp;"`
ModifiedOn util.Time `json:"modified_on" gorm:"type:timestamp comment '更新时间';"`
CreatedAt util.Time `json:"created_on" gorm:"column:created_on;autoCreateTime "`
UpdatedAt util.Time `json:"modified_on" gorm:"column:modified_on;autoUpdateTime ;"`
}
// Add 添加日志记录
@@ -39,8 +40,8 @@ type LogsResult struct {
// GetSendLogs 获取所有日志记录
func GetSendLogs(pageNum int, pageSize int, name string, taskId string, maps map[string]interface{}) ([]LogsResult, error) {
var logs []LogsResult
logt := db.NewScope(SendTasksLogs{}).TableName()
taskt := db.NewScope(SendTasks{}).TableName()
logt := GetSchema(SendTasksLogs{})
taskt := GetSchema(SendTasks{})
query := db.
Table(logt).
@@ -70,10 +71,10 @@ func GetSendLogs(pageNum int, pageSize int, name string, taskId string, maps map
}
// GetSendLogsTotal 获取所有日志总数
func GetSendLogsTotal(name string, taskId string, maps map[string]interface{}) (int, error) {
var total int
logt := db.NewScope(SendTasksLogs{}).TableName()
taskt := db.NewScope(SendTasks{}).TableName()
func GetSendLogsTotal(name string, taskId string, maps map[string]interface{}) (int64, error) {
var total int64
logt := GetSchema(SendTasksLogs{})
taskt := GetSchema(SendTasks{})
query := db.
Table(logt).
Joins(fmt.Sprintf("LEFT JOIN %s ON %s.task_id = %s.id", taskt, logt, taskt))
@@ -98,7 +99,7 @@ func GetSendLogsTotal(name string, taskId string, maps map[string]interface{}) (
// GetSendLogsTotal 获取所有日志总数
func DeleteOutDateLogs(keepNum int) (int, error) {
var affectedRows int
logt := db.NewScope(SendTasksLogs{}).TableName()
logt := GetSchema(SendTasksLogs{})
sql := fmt.Sprintf(`DELETE FROM %s
WHERE id NOT IN (
SELECT id FROM (
@@ -122,8 +123,8 @@ type StatisticData struct {
TodayFailedNum int `json:"today_failed_num"`
TodayTotalNum int `json:"today_total_num"`
LatestSendData []LatestSendData `json:"latest_send_data"`
WayCateData []WayCateData `json:"way_cate_data"`
LatestSendData []LatestSendData `json:"latest_send_data" gorm:"many2many:latest_send_data;"`
WayCateData []WayCateData `json:"way_cate_data" gorm:"many2many:way_cate_data;"`
}
type LatestSendData struct {
@@ -144,9 +145,9 @@ func GetStatisticData() (StatisticData, error) {
var statistic StatisticData
var latestData []LatestSendData
var wayCateData []WayCateData
logt := db.NewScope(SendTasksLogs{}).TableName()
inst := db.NewScope(SendTasksIns{}).TableName()
wayst := db.NewScope(SendWays{}).TableName()
logt := GetSchema(SendTasksLogs{})
inst := GetSchema(SendTasksIns{})
wayst := GetSchema(SendWays{})
currDay := util.GetNowTimeStr()[:10]
// 今日统计数据
@@ -158,10 +159,15 @@ func GetStatisticData() (StatisticData, error) {
SUM(CASE WHEN status != 1 or status is null THEN 1 ELSE 0 END) AS today_failed_num`).
Where("DATE(created_on) = ?", currDay)
query.First(&statistic)
query.Take(&statistic)
// 最近30天数据
days := 30
now := util.GetNowTime()
past := now.AddDate(0, 0, -days)
pastDate := past.Format("2006-01-02")
next := now.AddDate(0, 0, 1)
nextDate := next.Format("2006-01-02")
queryData := db.
Table(logt).
Select(`
@@ -169,7 +175,7 @@ func GetStatisticData() (StatisticData, error) {
SUM(CASE WHEN status = 1 THEN 1 ELSE 0 END) AS day_succ_num,
SUM(CASE WHEN status != 1 or status is null THEN 1 ELSE 0 END) AS day_failed_num,
COUNT(*) AS num`).
Where(" created_on >= DATE(?) - INTERVAL ? DAY", currDay, days).
Where(fmt.Sprintf(" created_on >= '%s' and created_on <= '%s' ", pastDate, nextDate)).
Group("day").
Order("day")
+7 -7
View File
@@ -3,16 +3,16 @@ package models
import (
"errors"
"fmt"
"github.com/jinzhu/gorm"
"gorm.io/gorm"
"message-nest/pkg/util"
)
type SendWays struct {
UUIDModel
Name string `json:"name" gorm:"type:varchar(100) comment '渠道名称';default:'';"`
Type string `json:"type" gorm:"type:varchar(100) comment '渠道类型';default:'';index:type"`
Auth string `json:"auth" gorm:"type:varchar(2048) comment '认证信息';default:'';"`
Name string `json:"name" gorm:"type:varchar(100) ;default:'';"`
Type string `json:"type" gorm:"type:varchar(100) ;default:'';index"`
Auth string `json:"auth" gorm:"type:varchar(2048) ;default:'';"`
}
func GenerateWayUniqueID() string {
@@ -63,10 +63,10 @@ func GetSendWays(pageNum int, pageSize int, name string, type_ string, maps inte
return ways, nil
}
func GetSendWaysTotal(name string, type_ string, maps interface{}) (int, error) {
func GetSendWaysTotal(name string, type_ string, maps interface{}) (int64, error) {
var (
err error
total int
total int64
)
query := db.Model(&SendWays{}).Where(maps)
if name != "" {
@@ -85,7 +85,7 @@ func GetSendWaysTotal(name string, type_ string, maps interface{}) (int, error)
func GetWayByID(id string) (SendWays, error) {
var way SendWays
err := db.Where("id = ? ", id).Find(&way).Error
err := db.Where("id = ? ", id).Take(&way).Error
if err != nil && errors.Is(err, gorm.ErrRecordNotFound) {
return way, err
}
+6 -6
View File
@@ -2,15 +2,15 @@ package models
import (
"errors"
"github.com/jinzhu/gorm"
"gorm.io/gorm"
)
type Settings struct {
IDModel
Section string `json:"section" gorm:"type:varchar(100) comment '实例类型';default:'';index:section"`
Key string `json:"key" gorm:"type:varchar(100) comment '实例类型';default:'';"`
Value string `json:"value" gorm:"type:text comment '实例类型';"`
Section string `json:"section" gorm:"type:varchar(100) ;default:'';index"`
Key string `json:"key" gorm:"type:varchar(100) ;default:'';"`
Value string `json:"value" gorm:"type:text ;"`
}
// AddOneSetting 添加一条设置
@@ -22,7 +22,7 @@ func AddOneSetting(setting Settings) error {
}
// EditSetting 编辑设置
func EditSetting(id int, data interface{}) error {
func EditSetting(id uint, data interface{}) error {
if err := db.Model(&Settings{}).Where("id = ? ", id).Updates(data).Error; err != nil {
return err
}
@@ -49,7 +49,7 @@ func GetSettingByKey(section string, key string) (Settings, error) {
func GetSettingBySection(section string) ([]Settings, error) {
var settings []Settings
err := db.Table(db.NewScope(Settings{}).TableName()).Where("`section` = ? ", section).Scan(&settings).Error
err := db.Table(GetSchema(Settings{})).Where("`section` = ? ", section).Scan(&settings).Error
if err != nil && errors.Is(err, gorm.ErrRecordNotFound) {
return settings, err
}