chore: 初始开源发布
iotlcm-app:小程序端 + 用户端服务。 - app/:uni-app 小程序前端(基于 unibest,MIT) - 微信 AppID → YOUR_WX_APPID,uni-app AppID → __UNI__YOURAPPID - 内网后端地址 → admin.iotlcm.example.com - 应用标题与 unibest 模板 README 重写(保留上游致谢与 MIT 声明) - server/:GoFrame 用户端服务(基于 XiuAdmin,Apache-2.0) - module xiuadmin → git.5iot.com/iotlcm-public/iotlcm-app(360 文件) - 支付回调地址 → app.iotlcm.example.com,商户名与应用名泛化 - 真实手机号 → 合法 11 位编造号(保留号段前 3 位 + 后 4 位) - 依赖号码尾部的断言同步更新 - 补 server/LICENSE(Apache-2.0) - 移除内部资产:CI 触发器 - 补根 README,LF 行尾 + .gitattributes 已知:TestSysDept_RefreshDeptAncestors 在源仓同一提交上同样失败,属既有缺陷。
This commit is contained in:
@@ -0,0 +1,123 @@
|
||||
package memorydb
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"git.5iot.com/iotlcm-public/iotlcm-app/internal/cmd/inithttp"
|
||||
"git.5iot.com/iotlcm-public/iotlcm-app/internal/model"
|
||||
"git.5iot.com/iotlcm-public/iotlcm-app/internal/service"
|
||||
"time"
|
||||
|
||||
"github.com/gogf/gf/v2/database/gdb"
|
||||
"github.com/gogf/gf/v2/frame/g"
|
||||
"github.com/gogf/gf/v2/util/gconv"
|
||||
)
|
||||
|
||||
var db gdb.DB
|
||||
|
||||
type memDB interface {
|
||||
Init(ctx context.Context) error
|
||||
EventHandler(ctx context.Context) error
|
||||
TableName(ctx context.Context) string
|
||||
CreateTable(ctx context.Context) error
|
||||
LoadData(ctx context.Context, pk int64) error
|
||||
DeleteData(ctx context.Context, ids []int64) error
|
||||
}
|
||||
|
||||
var memDBMap = make(map[string]memDB)
|
||||
|
||||
func RegisterMemDB(name string, memDB memDB) {
|
||||
memDBMap[name] = memDB
|
||||
}
|
||||
|
||||
type sMemoryDB struct {
|
||||
memDBMap map[string]interface{}
|
||||
}
|
||||
|
||||
func NewMemoryDB() *sMemoryDB {
|
||||
return &sMemoryDB{}
|
||||
}
|
||||
|
||||
func init() {
|
||||
service.RegisterMemoryDB(NewMemoryDB())
|
||||
inithttp.RegisterHttpInitFunc("memorydb", func(ctx context.Context) error {
|
||||
return service.MemoryDB().Init(ctx)
|
||||
})
|
||||
}
|
||||
|
||||
func (s *sMemoryDB) Init(ctx context.Context) error {
|
||||
link := g.Cfg().MustGet(ctx, "database.memorydb.link", "").String()
|
||||
debug := g.Cfg().MustGet(ctx, "database.memorydb.debug", "false").Bool()
|
||||
if link == "" {
|
||||
g.Log().Warning(ctx, "sMemoryDB.Init link is empty")
|
||||
return nil
|
||||
}
|
||||
g.Log().Debug(ctx, "sMemoryDB.Init link", link)
|
||||
var err error
|
||||
db, err = gdb.New(gdb.ConfigNode{
|
||||
Link: link,
|
||||
MaxIdleConnCount: 10,
|
||||
MaxOpenConnCount: 1,
|
||||
MaxConnLifeTime: 24 * 3650 * time.Hour,
|
||||
Debug: debug,
|
||||
})
|
||||
if err != nil {
|
||||
g.Log().Errorf(ctx, "sMemoryDB.Init get db err: %v", err)
|
||||
return err
|
||||
}
|
||||
if db == nil {
|
||||
g.Log().Errorf(ctx, "sMemoryDB.Init not found memorydb")
|
||||
return errors.New("sMemoryDB.Init get db err")
|
||||
}
|
||||
for _, memDB := range memDBMap {
|
||||
err = memDB.Init(ctx)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
g.Log().Debug(ctx, "sMemoryDB.Init end.", db.GetConfig())
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *sMemoryDB) EventHandler(ctx context.Context, chg *model.BroadcastDbChgCache) error {
|
||||
memDB, ok := memDBMap[chg.TableName]
|
||||
if !ok {
|
||||
return nil
|
||||
}
|
||||
|
||||
if chg.Type == "add" || chg.Type == "edit" {
|
||||
for _, pk := range chg.PK {
|
||||
memDB.LoadData(ctx, pk)
|
||||
}
|
||||
} else if chg.Type == "del" {
|
||||
memDB.DeleteData(ctx, chg.PK)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *sMemoryDB) DB(ctx context.Context) gdb.DB {
|
||||
link := g.Cfg().MustGet(ctx, "database.memorydb.link", "sqlite::@file(:memory:)").String()
|
||||
if link == "" {
|
||||
return g.DB()
|
||||
}
|
||||
return db
|
||||
}
|
||||
|
||||
func (s *sMemoryDB) Ctx(ctx context.Context) gdb.DB {
|
||||
return s.DB(ctx).Ctx(ctx)
|
||||
}
|
||||
|
||||
func entityListToDo[E any, D any](source []*E) ([]*D, error) {
|
||||
target := make([]*D, 0, len(source))
|
||||
for _, item := range source {
|
||||
if item == nil {
|
||||
continue
|
||||
}
|
||||
value := new(D)
|
||||
if err := gconv.Struct(item, value); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
target = append(target, value)
|
||||
}
|
||||
return target, nil
|
||||
}
|
||||
@@ -0,0 +1,204 @@
|
||||
package memorydb
|
||||
|
||||
import (
|
||||
"context"
|
||||
"git.5iot.com/iotlcm-public/iotlcm-app/internal/consts"
|
||||
"git.5iot.com/iotlcm-public/iotlcm-app/internal/dao"
|
||||
"git.5iot.com/iotlcm-public/iotlcm-app/internal/library/event"
|
||||
"git.5iot.com/iotlcm-public/iotlcm-app/internal/model"
|
||||
"git.5iot.com/iotlcm-public/iotlcm-app/internal/model/do"
|
||||
"git.5iot.com/iotlcm-public/iotlcm-app/internal/model/entity"
|
||||
"git.5iot.com/iotlcm-public/iotlcm-app/internal/service"
|
||||
|
||||
"git.5iot.com/iotlcm-public/iotlcm-app/utility/queue"
|
||||
|
||||
"github.com/gogf/gf/v2/frame/g"
|
||||
)
|
||||
|
||||
type sMemDBSysConfig struct {
|
||||
}
|
||||
|
||||
var instanceMemDBSysConfig *sMemDBSysConfig
|
||||
|
||||
func NewMemDBSysConfig() *sMemDBSysConfig {
|
||||
if instanceMemDBSysConfig != nil {
|
||||
return instanceMemDBSysConfig
|
||||
}
|
||||
instanceMemDBSysConfig = &sMemDBSysConfig{}
|
||||
initLoadMemoryDB := g.Cfg().MustGet(context.TODO(), "server.initLoadMemoryDB").Bool()
|
||||
if initLoadMemoryDB {
|
||||
instanceMemDBSysConfig.Init(context.TODO())
|
||||
}
|
||||
return instanceMemDBSysConfig
|
||||
}
|
||||
|
||||
func init() {
|
||||
s := NewMemDBSysConfig()
|
||||
service.RegisterMemDBSysConfig(s)
|
||||
RegisterMemDB(s.TableName(context.TODO()), s)
|
||||
}
|
||||
|
||||
func (s *sMemDBSysConfig) Init(ctx context.Context) error {
|
||||
err := s.CreateTable(ctx)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
err = s.EventHandler(ctx)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *sMemDBSysConfig) EventHandler(ctx context.Context) error {
|
||||
eventList := []string{
|
||||
consts.EventKeyDBSysConfigCreate,
|
||||
consts.EventKeyDBSysConfigUpdate,
|
||||
consts.EventKeyDBSysConfigDelete,
|
||||
}
|
||||
event.EventsInstance().Register(eventList, func(ctx context.Context, eventKey string, args ...interface{}) {
|
||||
if len(args) < 1 {
|
||||
g.Log().Errorf(ctx, "memorydb/sys_config.go event args error. eventKey: %s, args: %+v", eventKey, args)
|
||||
return
|
||||
}
|
||||
pkList, ok := args[0].([]int64)
|
||||
if !ok {
|
||||
pk, ok := args[0].(int64)
|
||||
if !ok {
|
||||
g.Log().Errorf(ctx, "sMemDBSysConfig.EventHandler event args error. eventKey: %s, args: %+v", eventKey, args)
|
||||
return
|
||||
}
|
||||
pkList = []int64{pk}
|
||||
}
|
||||
if len(pkList) == 0 {
|
||||
g.Log().Errorf(ctx, "sMemDBSysConfig.EventHandler event args error. eventKey: %s, args: %+v", eventKey, args)
|
||||
return
|
||||
}
|
||||
if eventKey == consts.EventKeyDBSysConfigDelete {
|
||||
s.DeleteData(ctx, pkList)
|
||||
} else {
|
||||
for _, pk := range pkList {
|
||||
s.LoadData(ctx, pk)
|
||||
}
|
||||
}
|
||||
|
||||
dbType := "edit"
|
||||
if eventKey == consts.EventKeyDBSysConfigCreate {
|
||||
dbType = "add"
|
||||
} else if eventKey == consts.EventKeyDBSysConfigDelete {
|
||||
dbType = "del"
|
||||
} else {
|
||||
dbType = "edit"
|
||||
}
|
||||
queue.Push(ctx, consts.BroadcastDbChg, &model.BroadcastDbChgCache{
|
||||
TableName: s.TableName(ctx),
|
||||
PK: pkList,
|
||||
Type: dbType,
|
||||
Data: nil,
|
||||
})
|
||||
})
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *sMemDBSysConfig) TableName(ctx context.Context) string {
|
||||
return dao.SysConfig.Table()
|
||||
}
|
||||
|
||||
func (s *sMemDBSysConfig) CreateTable(ctx context.Context) error {
|
||||
_, err := db.Exec(ctx, "DROP TABLE IF EXISTS "+s.TableName(ctx))
|
||||
if err != nil {
|
||||
g.Log().Errorf(ctx, "sMemDBSysConfig.CreateTable delete table err: %v", err)
|
||||
return err
|
||||
}
|
||||
|
||||
total, err := db.Model("sqlite_master").Where("type", "table").Where("name", dao.SysConfig.Table()).Count()
|
||||
if err != nil {
|
||||
g.Log().Errorf(ctx, "sMemDBSysConfig.CreateTable count err: %v", err)
|
||||
return err
|
||||
}
|
||||
if total == 0 {
|
||||
g.Log().Debug(ctx, "sMemDBSysConfig.List create table ", s.TableName(ctx))
|
||||
res, err := db.Exec(ctx, `
|
||||
CREATE TABLE "sys_config" (
|
||||
"config_id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
|
||||
"tenant_id" TEXT DEFAULT '000000' CHECK(length("tenant_id") <= 20),
|
||||
"config_name" TEXT DEFAULT '' CHECK(length("config_name") <= 100),
|
||||
"config_key" TEXT DEFAULT '' CHECK(length("config_key") <= 100),
|
||||
"config_value" TEXT DEFAULT '' CHECK(length("config_value") <= 1024),
|
||||
"config_type" TEXT DEFAULT 'N',
|
||||
"created_dept" INTEGER,
|
||||
"created_by" INTEGER,
|
||||
"created_at" TEXT,
|
||||
"updated_by" INTEGER,
|
||||
"updated_at" TEXT,
|
||||
"remark" TEXT CHECK(length("remark") <= 500)
|
||||
);
|
||||
`)
|
||||
if err != nil {
|
||||
g.Log().Errorf(ctx, "sMemDBSysConfig.CreateTable create table err: %v", err)
|
||||
return err
|
||||
}
|
||||
g.Log().Debug(ctx, "sMemDBSysConfig.CreateTable create table success", res)
|
||||
// 加载数据
|
||||
s.LoadData(ctx, 0)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *sMemDBSysConfig) LoadData(ctx context.Context, pk int64) error {
|
||||
count := 0
|
||||
if pk == 0 {
|
||||
maxConfigId := int64(0)
|
||||
for {
|
||||
page := 1
|
||||
pageSize := 500
|
||||
dataList := make([]*entity.SysConfig, 0)
|
||||
dao.SysConfig.Ctx(ctx).Page(page, pageSize).WhereGT(dao.SysConfig.Columns().ConfigId, maxConfigId).
|
||||
OrderAsc(dao.SysConfig.Columns().ConfigId).Scan(&dataList)
|
||||
if len(dataList) == 0 {
|
||||
break
|
||||
}
|
||||
count += len(dataList)
|
||||
doList, err := entityListToDo[entity.SysConfig, do.SysConfig](dataList)
|
||||
if err != nil {
|
||||
g.Log().Errorf(ctx, "sMemDBSysConfig.Load convert data err: %v", err)
|
||||
return err
|
||||
}
|
||||
_, err = db.Model(dao.SysConfig.Table()).Data(doList).OnConflict(dao.SysConfig.Columns().ConfigId).Save()
|
||||
if err != nil {
|
||||
g.Log().Errorf(ctx, "sMemDBSysConfig.Load data insert err: %v", err)
|
||||
return err
|
||||
}
|
||||
maxConfigId = dataList[len(dataList)-1].ConfigId
|
||||
if len(dataList) < pageSize {
|
||||
break
|
||||
}
|
||||
}
|
||||
} else {
|
||||
dataList := make([]*entity.SysConfig, 0)
|
||||
dao.SysConfig.Ctx(ctx).Where(dao.SysConfig.Columns().ConfigId, pk).Scan(&dataList)
|
||||
doList, err := entityListToDo[entity.SysConfig, do.SysConfig](dataList)
|
||||
if err != nil {
|
||||
g.Log().Errorf(ctx, "sMemDBSysConfig.Load convert data err: %v", err)
|
||||
return err
|
||||
}
|
||||
_, err = db.Model(dao.SysConfig.Table()).Data(doList).OnConflict(dao.SysConfig.Columns().ConfigId).Save()
|
||||
if err != nil {
|
||||
g.Log().Errorf(ctx, "sMemDBSysConfig.Load data insert err: %v", err)
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
g.Log().Debugf(ctx, "sMemDBSysConfig.LoadData load data success, total: %d, pk: %d", count, pk)
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *sMemDBSysConfig) DeleteData(ctx context.Context, ids []int64) error {
|
||||
_, err := db.Model(dao.SysConfig.Table()).WhereIn(dao.SysConfig.Columns().ConfigId, ids).Delete()
|
||||
if err != nil {
|
||||
g.Log().Errorf(ctx, "sMemDBSysConfig.DeleteData err: %v", err)
|
||||
return err
|
||||
}
|
||||
g.Log().Debugf(ctx, "sMemDBSysConfig.DeleteData delete data success, total: %d, ids: %+v", len(ids), ids)
|
||||
return nil
|
||||
}
|
||||
@@ -0,0 +1,210 @@
|
||||
package memorydb
|
||||
|
||||
import (
|
||||
"context"
|
||||
"git.5iot.com/iotlcm-public/iotlcm-app/internal/consts"
|
||||
"git.5iot.com/iotlcm-public/iotlcm-app/internal/dao"
|
||||
"git.5iot.com/iotlcm-public/iotlcm-app/internal/library/event"
|
||||
"git.5iot.com/iotlcm-public/iotlcm-app/internal/model"
|
||||
"git.5iot.com/iotlcm-public/iotlcm-app/internal/model/do"
|
||||
"git.5iot.com/iotlcm-public/iotlcm-app/internal/model/entity"
|
||||
"git.5iot.com/iotlcm-public/iotlcm-app/internal/service"
|
||||
|
||||
"git.5iot.com/iotlcm-public/iotlcm-app/utility/queue"
|
||||
|
||||
"github.com/gogf/gf/v2/frame/g"
|
||||
)
|
||||
|
||||
type sMemDBSysDept struct {
|
||||
}
|
||||
|
||||
var instanceMemDBSysDept *sMemDBSysDept
|
||||
|
||||
func NewMemDBSysDept() *sMemDBSysDept {
|
||||
if instanceMemDBSysDept != nil {
|
||||
return instanceMemDBSysDept
|
||||
}
|
||||
instanceMemDBSysDept = &sMemDBSysDept{}
|
||||
initLoadMemoryDB := g.Cfg().MustGet(context.TODO(), "server.initLoadMemoryDB").Bool()
|
||||
if initLoadMemoryDB {
|
||||
instanceMemDBSysDept.Init(context.TODO())
|
||||
}
|
||||
return instanceMemDBSysDept
|
||||
}
|
||||
|
||||
func init() {
|
||||
s := NewMemDBSysDept()
|
||||
service.RegisterMemDBSysDept(s)
|
||||
RegisterMemDB(s.TableName(context.TODO()), s)
|
||||
}
|
||||
|
||||
func (s *sMemDBSysDept) Init(ctx context.Context) error {
|
||||
err := s.CreateTable(ctx)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
err = s.EventHandler(ctx)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *sMemDBSysDept) EventHandler(ctx context.Context) error {
|
||||
eventList := []string{
|
||||
consts.EventKeyDBSysDeptCreate,
|
||||
consts.EventKeyDBSysDeptUpdate,
|
||||
consts.EventKeyDBSysDeptDelete,
|
||||
}
|
||||
event.EventsInstance().Register(eventList, func(ctx context.Context, eventKey string, args ...interface{}) {
|
||||
if len(args) < 1 {
|
||||
g.Log().Errorf(ctx, "sMemDBSysDept.EventHandler event args error. eventKey: %s, args: %+v", eventKey, args)
|
||||
return
|
||||
}
|
||||
pkList, ok := args[0].([]int64)
|
||||
if !ok {
|
||||
pk, ok := args[0].(int64)
|
||||
if !ok {
|
||||
g.Log().Errorf(ctx, "sMemDBSysDept.EventHandler event args error. eventKey: %s, args: %+v", eventKey, args)
|
||||
return
|
||||
}
|
||||
pkList = []int64{pk}
|
||||
}
|
||||
if len(pkList) == 0 {
|
||||
g.Log().Errorf(ctx, "sMemDBSysDept.EventHandler event args error. eventKey: %s, args: %+v", eventKey, args)
|
||||
return
|
||||
}
|
||||
if eventKey == consts.EventKeyDBSysDeptDelete {
|
||||
s.DeleteData(ctx, pkList)
|
||||
} else {
|
||||
for _, pk := range pkList {
|
||||
s.LoadData(ctx, pk)
|
||||
}
|
||||
}
|
||||
|
||||
dbType := "edit"
|
||||
if eventKey == consts.EventKeyDBSysDeptCreate {
|
||||
dbType = "add"
|
||||
} else if eventKey == consts.EventKeyDBSysDeptDelete {
|
||||
dbType = "del"
|
||||
} else {
|
||||
dbType = "edit"
|
||||
}
|
||||
queue.Push(ctx, consts.BroadcastDbChg, &model.BroadcastDbChgCache{
|
||||
TableName: s.TableName(ctx),
|
||||
PK: pkList,
|
||||
Type: dbType,
|
||||
Data: nil,
|
||||
})
|
||||
})
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *sMemDBSysDept) TableName(ctx context.Context) string {
|
||||
return dao.SysDept.Table()
|
||||
}
|
||||
|
||||
func (s *sMemDBSysDept) CreateTable(ctx context.Context) error {
|
||||
_, err := db.Exec(ctx, "DROP TABLE IF EXISTS "+s.TableName(ctx))
|
||||
if err != nil {
|
||||
g.Log().Errorf(ctx, "sMemDBSysDept.CreateTable delete table err: %v", err)
|
||||
return err
|
||||
}
|
||||
|
||||
total, err := db.Model("sqlite_master").Where("type", "table").Where("name", dao.SysDept.Table()).Count()
|
||||
if err != nil {
|
||||
g.Log().Errorf(ctx, "sMemDBSysDept.CreateTable count err: %v", err)
|
||||
return err
|
||||
}
|
||||
if total == 0 {
|
||||
g.Log().Debug(ctx, "sMemDBSysDept.List create table ", s.TableName(ctx))
|
||||
res, err := db.Exec(ctx, `
|
||||
CREATE TABLE "sys_dept" (
|
||||
"dept_id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
|
||||
"tenant_id" TEXT DEFAULT '000000' CHECK(length("tenant_id") <= 20),
|
||||
"parent_id" INTEGER DEFAULT 0,
|
||||
"ancestors" TEXT DEFAULT '' CHECK(length("ancestors") <= 500),
|
||||
"dept_name" TEXT DEFAULT '' CHECK(length("dept_name") <= 30),
|
||||
"dept_type" INTEGER DEFAULT 0,
|
||||
"dept_category" TEXT CHECK(length("dept_category") <= 100),
|
||||
"order_num" INTEGER DEFAULT 0,
|
||||
"leader" INTEGER,
|
||||
"phone" TEXT CHECK(length("phone") <= 11),
|
||||
"email" TEXT CHECK(length("email") <= 50),
|
||||
"status" TEXT DEFAULT '0' ,
|
||||
"created_dept" INTEGER,
|
||||
"created_by" INTEGER NOT NULL,
|
||||
"created_at" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updated_by" INTEGER,
|
||||
"updated_at" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"deleted_by" INTEGER,
|
||||
"deleted_at" DATETIME
|
||||
);
|
||||
`)
|
||||
if err != nil {
|
||||
g.Log().Errorf(ctx, "sMemDBSysDept.CreateTable create table err: %v", err)
|
||||
return err
|
||||
}
|
||||
g.Log().Debug(ctx, "sMemDBSysDept.CreateTable create table success", res)
|
||||
// 加载数据
|
||||
s.LoadData(ctx, 0)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *sMemDBSysDept) LoadData(ctx context.Context, pk int64) error {
|
||||
count := 0
|
||||
if pk == 0 {
|
||||
maxDeptId := int64(0)
|
||||
for {
|
||||
page := 1
|
||||
pageSize := 100
|
||||
dataList := make([]*entity.SysDept, 0)
|
||||
dao.SysDept.Ctx(ctx).Page(page, pageSize).WhereGT(dao.SysDept.Columns().DeptId, maxDeptId).
|
||||
OrderAsc(dao.SysDept.Columns().DeptId).Scan(&dataList)
|
||||
if len(dataList) == 0 {
|
||||
break
|
||||
}
|
||||
count += len(dataList)
|
||||
doList, err := entityListToDo[entity.SysDept, do.SysDept](dataList)
|
||||
if err != nil {
|
||||
g.Log().Errorf(ctx, "sMemDBSysDept.Load convert data err: %v", err)
|
||||
return err
|
||||
}
|
||||
_, err = db.Model(dao.SysDept.Table()).Data(doList).OnConflict(dao.SysDept.Columns().DeptId).Save()
|
||||
if err != nil {
|
||||
g.Log().Errorf(ctx, "sMemDBSysDept.Load data insert err: %v", err)
|
||||
return err
|
||||
}
|
||||
maxDeptId = dataList[len(dataList)-1].DeptId
|
||||
if len(dataList) < pageSize {
|
||||
break
|
||||
}
|
||||
}
|
||||
} else {
|
||||
dataList := make([]*entity.SysDept, 0)
|
||||
dao.SysDept.Ctx(ctx).Where(dao.SysDept.Columns().DeptId, pk).Scan(&dataList)
|
||||
doList, err := entityListToDo[entity.SysDept, do.SysDept](dataList)
|
||||
if err != nil {
|
||||
g.Log().Errorf(ctx, "sMemDBSysDept.Load convert data err: %v", err)
|
||||
return err
|
||||
}
|
||||
_, err = db.Model(dao.SysDept.Table()).Data(doList).OnConflict(dao.SysDept.Columns().DeptId).Save()
|
||||
if err != nil {
|
||||
g.Log().Errorf(ctx, "sMemDBSysDept.Load data insert err: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
g.Log().Debugf(ctx, "sMemDBSysDept.LoadData load data success, total: %d, pk: %d", count, pk)
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *sMemDBSysDept) DeleteData(ctx context.Context, ids []int64) error {
|
||||
_, err := db.Model(dao.SysDept.Table()).WhereIn(dao.SysDept.Columns().DeptId, ids).Unscoped().Delete()
|
||||
if err != nil {
|
||||
g.Log().Errorf(ctx, "sMemDBSysDept.DeleteData err: %v", err)
|
||||
return err
|
||||
}
|
||||
g.Log().Debugf(ctx, "sMemDBSysDept.DeleteData delete data success, total: %d, ids: %+v", len(ids), ids)
|
||||
return nil
|
||||
}
|
||||
@@ -0,0 +1,205 @@
|
||||
package memorydb
|
||||
|
||||
import (
|
||||
"context"
|
||||
"git.5iot.com/iotlcm-public/iotlcm-app/internal/consts"
|
||||
"git.5iot.com/iotlcm-public/iotlcm-app/internal/dao"
|
||||
"git.5iot.com/iotlcm-public/iotlcm-app/internal/library/event"
|
||||
"git.5iot.com/iotlcm-public/iotlcm-app/internal/model"
|
||||
"git.5iot.com/iotlcm-public/iotlcm-app/internal/model/do"
|
||||
"git.5iot.com/iotlcm-public/iotlcm-app/internal/model/entity"
|
||||
"git.5iot.com/iotlcm-public/iotlcm-app/internal/service"
|
||||
|
||||
"git.5iot.com/iotlcm-public/iotlcm-app/utility/queue"
|
||||
|
||||
"github.com/gogf/gf/v2/frame/g"
|
||||
)
|
||||
|
||||
type sMemDBSysDictData struct {
|
||||
}
|
||||
|
||||
var instanceMemDBSysDictData *sMemDBSysDictData
|
||||
|
||||
func NewMemDBSysDictData() *sMemDBSysDictData {
|
||||
if instanceMemDBSysDictData != nil {
|
||||
return instanceMemDBSysDictData
|
||||
}
|
||||
instanceMemDBSysDictData = &sMemDBSysDictData{}
|
||||
initLoadMemoryDB := g.Cfg().MustGet(context.TODO(), "server.initLoadMemoryDB").Bool()
|
||||
if initLoadMemoryDB {
|
||||
instanceMemDBSysDictData.Init(context.TODO())
|
||||
}
|
||||
return instanceMemDBSysDictData
|
||||
}
|
||||
|
||||
func init() {
|
||||
s := NewMemDBSysDictData()
|
||||
service.RegisterMemDBSysDictData(s)
|
||||
RegisterMemDB(s.TableName(context.TODO()), s)
|
||||
}
|
||||
|
||||
func (s *sMemDBSysDictData) Init(ctx context.Context) error {
|
||||
err := s.CreateTable(ctx)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
err = s.EventHandler(ctx)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *sMemDBSysDictData) EventHandler(ctx context.Context) error {
|
||||
eventList := []string{
|
||||
consts.EventKeyDBSysDictDataCreate,
|
||||
consts.EventKeyDBSysDictDataUpdate,
|
||||
consts.EventKeyDBSysDictDataDelete,
|
||||
}
|
||||
event.EventsInstance().Register(eventList, func(ctx context.Context, eventKey string, args ...interface{}) {
|
||||
if len(args) < 1 {
|
||||
g.Log().Errorf(ctx, "sMemDBSysDictData.EventHandler event args error. eventKey: %s, args: %+v", eventKey, args)
|
||||
return
|
||||
}
|
||||
pkList, ok := args[0].([]int64)
|
||||
if !ok {
|
||||
pk, ok := args[0].(int64)
|
||||
if !ok {
|
||||
g.Log().Errorf(ctx, "sMemDBSysDictData.EventHandler event args error. eventKey: %s, args: %+v", eventKey, args)
|
||||
return
|
||||
}
|
||||
pkList = []int64{pk}
|
||||
}
|
||||
if len(pkList) == 0 {
|
||||
g.Log().Errorf(ctx, "sMemDBSysDictData.EventHandler event args error. eventKey: %s, args: %+v", eventKey, args)
|
||||
return
|
||||
}
|
||||
if eventKey == consts.EventKeyDBSysDictDataDelete {
|
||||
s.DeleteData(ctx, pkList)
|
||||
} else {
|
||||
for _, pk := range pkList {
|
||||
s.LoadData(ctx, pk)
|
||||
}
|
||||
}
|
||||
dbType := "edit"
|
||||
if eventKey == consts.EventKeyDBSysDictDataCreate {
|
||||
dbType = "add"
|
||||
} else if eventKey == consts.EventKeyDBSysDictDataDelete {
|
||||
dbType = "del"
|
||||
} else {
|
||||
dbType = "edit"
|
||||
}
|
||||
queue.Push(ctx, consts.BroadcastDbChg, &model.BroadcastDbChgCache{
|
||||
TableName: s.TableName(ctx),
|
||||
PK: pkList,
|
||||
Type: dbType,
|
||||
Data: nil,
|
||||
})
|
||||
})
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *sMemDBSysDictData) TableName(ctx context.Context) string {
|
||||
return dao.SysDictData.Table()
|
||||
}
|
||||
|
||||
func (s *sMemDBSysDictData) CreateTable(ctx context.Context) error {
|
||||
_, err := db.Exec(ctx, "DROP TABLE IF EXISTS "+s.TableName(ctx))
|
||||
if err != nil {
|
||||
g.Log().Errorf(ctx, "sMemDBSysDictData.CreateTable delete table err: %v", err)
|
||||
return err
|
||||
}
|
||||
|
||||
total, err := db.Model("sqlite_master").Where("type", "table").Where("name", dao.SysDictData.Table()).Count()
|
||||
if err != nil {
|
||||
g.Log().Errorf(ctx, "sMemDBSysDictData.CreateTable count err: %v", err)
|
||||
return err
|
||||
}
|
||||
if total == 0 {
|
||||
g.Log().Debug(ctx, "sMemDBSysDictData.List create table ", s.TableName(ctx))
|
||||
res, err := db.Exec(ctx, `
|
||||
CREATE TABLE "sys_dict_data" (
|
||||
"dict_code" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
|
||||
"tenant_id" TEXT DEFAULT '000000' CHECK(length("tenant_id") <= 20),
|
||||
"dict_sort" INTEGER DEFAULT 0,
|
||||
"dict_label" TEXT DEFAULT '' CHECK(length("dict_label") <= 100),
|
||||
"dict_value" TEXT DEFAULT '' CHECK(length("dict_value") <= 100),
|
||||
"dict_type" TEXT DEFAULT '' CHECK(length("dict_type") <= 100),
|
||||
"css_class" TEXT CHECK(length("css_class") <= 100),
|
||||
"list_class" TEXT CHECK(length("list_class") <= 100),
|
||||
"is_default" TEXT DEFAULT 'N' ,
|
||||
"created_dept" INTEGER,
|
||||
"created_by" INTEGER,
|
||||
"created_at" TEXT,
|
||||
"updated_by" INTEGER,
|
||||
"updated_at" TEXT,
|
||||
"remark" TEXT CHECK(length("remark") <= 500)
|
||||
);
|
||||
`)
|
||||
if err != nil {
|
||||
g.Log().Errorf(ctx, "sMemDBSysDictData.CreateTable create table err: %v", err)
|
||||
return err
|
||||
}
|
||||
g.Log().Debug(ctx, "sMemDBSysDictData.CreateTable create table success", res)
|
||||
// 加载数据
|
||||
s.LoadData(ctx, 0)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *sMemDBSysDictData) LoadData(ctx context.Context, pk int64) error {
|
||||
count := 0
|
||||
if pk == 0 {
|
||||
maxDictCode := int64(0)
|
||||
for {
|
||||
page := 1
|
||||
pageSize := 500
|
||||
dataList := make([]*entity.SysDictData, 0)
|
||||
dao.SysDictData.Ctx(ctx).Page(page, pageSize).WhereGT(dao.SysDictData.Columns().DictCode, maxDictCode).
|
||||
OrderAsc(dao.SysDictData.Columns().DictCode).Scan(&dataList)
|
||||
if len(dataList) == 0 {
|
||||
break
|
||||
}
|
||||
count += len(dataList)
|
||||
doList, err := entityListToDo[entity.SysDictData, do.SysDictData](dataList)
|
||||
if err != nil {
|
||||
g.Log().Errorf(ctx, "sMemDBSysDictData.Load convert data err: %v", err)
|
||||
return err
|
||||
}
|
||||
_, err = db.Model(dao.SysDictData.Table()).Data(doList).OnConflict(dao.SysDictData.Columns().DictCode).Save()
|
||||
if err != nil {
|
||||
g.Log().Errorf(ctx, "sMemDBSysDictData.Load data insert err: %v", err)
|
||||
return err
|
||||
}
|
||||
maxDictCode = dataList[len(dataList)-1].DictCode
|
||||
if len(dataList) < pageSize {
|
||||
break
|
||||
}
|
||||
}
|
||||
} else {
|
||||
dataList := make([]*entity.SysDictData, 0)
|
||||
dao.SysDictData.Ctx(ctx).Where(dao.SysDictData.Columns().DictCode, pk).Scan(&dataList)
|
||||
doList, err := entityListToDo[entity.SysDictData, do.SysDictData](dataList)
|
||||
if err != nil {
|
||||
g.Log().Errorf(ctx, "sMemDBSysDictData.Load convert data err: %v", err)
|
||||
return err
|
||||
}
|
||||
_, err = db.Model(dao.SysDictData.Table()).Data(doList).OnConflict(dao.SysDictData.Columns().DictCode).Save()
|
||||
if err != nil {
|
||||
g.Log().Errorf(ctx, "sMemDBSysDictData.Load data insert err: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
g.Log().Debugf(ctx, "sMemDBSysDictData.LoadData load data success, total: %d, pk: %d", count, pk)
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *sMemDBSysDictData) DeleteData(ctx context.Context, ids []int64) error {
|
||||
_, err := db.Model(dao.SysDictData.Table()).WhereIn(dao.SysDictData.Columns().DictCode, ids).Delete()
|
||||
if err != nil {
|
||||
g.Log().Errorf(ctx, "sMemDBSysDictData.DeleteData err: %v", err)
|
||||
return err
|
||||
}
|
||||
g.Log().Debugf(ctx, "sMemDBSysDictData.DeleteData delete data success, total: %d, ids: %+v", len(ids), ids)
|
||||
return nil
|
||||
}
|
||||
@@ -0,0 +1,201 @@
|
||||
package memorydb
|
||||
|
||||
import (
|
||||
"context"
|
||||
"git.5iot.com/iotlcm-public/iotlcm-app/internal/consts"
|
||||
"git.5iot.com/iotlcm-public/iotlcm-app/internal/dao"
|
||||
"git.5iot.com/iotlcm-public/iotlcm-app/internal/library/event"
|
||||
"git.5iot.com/iotlcm-public/iotlcm-app/internal/model"
|
||||
"git.5iot.com/iotlcm-public/iotlcm-app/internal/model/do"
|
||||
"git.5iot.com/iotlcm-public/iotlcm-app/internal/model/entity"
|
||||
"git.5iot.com/iotlcm-public/iotlcm-app/internal/service"
|
||||
|
||||
"git.5iot.com/iotlcm-public/iotlcm-app/utility/queue"
|
||||
|
||||
"github.com/gogf/gf/v2/frame/g"
|
||||
)
|
||||
|
||||
type sMemDBSysDictType struct {
|
||||
}
|
||||
|
||||
var instanceMemDBSysDictType *sMemDBSysDictType
|
||||
|
||||
func NewMemDBSysDictType() *sMemDBSysDictType {
|
||||
if instanceMemDBSysDictType != nil {
|
||||
return instanceMemDBSysDictType
|
||||
}
|
||||
instanceMemDBSysDictType = &sMemDBSysDictType{}
|
||||
initLoadMemoryDB := g.Cfg().MustGet(context.TODO(), "server.initLoadMemoryDB").Bool()
|
||||
if initLoadMemoryDB {
|
||||
instanceMemDBSysDictType.Init(context.TODO())
|
||||
}
|
||||
return instanceMemDBSysDictType
|
||||
}
|
||||
|
||||
func init() {
|
||||
s := NewMemDBSysDictType()
|
||||
service.RegisterMemDBSysDictType(s)
|
||||
RegisterMemDB(s.TableName(context.TODO()), s)
|
||||
}
|
||||
|
||||
func (s *sMemDBSysDictType) Init(ctx context.Context) error {
|
||||
err := s.CreateTable(ctx)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
err = s.EventHandler(ctx)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *sMemDBSysDictType) EventHandler(ctx context.Context) error {
|
||||
eventList := []string{
|
||||
consts.EventKeyDBSysDictTypeCreate,
|
||||
consts.EventKeyDBSysDictTypeUpdate,
|
||||
consts.EventKeyDBSysDictTypeDelete,
|
||||
}
|
||||
event.EventsInstance().Register(eventList, func(ctx context.Context, eventKey string, args ...interface{}) {
|
||||
if len(args) < 1 {
|
||||
g.Log().Errorf(ctx, "sMemDBSysDictType.EventHandler event args error. eventKey: %s, args: %+v", eventKey, args)
|
||||
return
|
||||
}
|
||||
pkList, ok := args[0].([]int64)
|
||||
if !ok {
|
||||
pk, ok := args[0].(int64)
|
||||
if !ok {
|
||||
g.Log().Errorf(ctx, "sMemDBSysDictType.EventHandler event args error. eventKey: %s, args: %+v", eventKey, args)
|
||||
return
|
||||
}
|
||||
pkList = []int64{pk}
|
||||
}
|
||||
if len(pkList) == 0 {
|
||||
g.Log().Errorf(ctx, "sMemDBSysDictType.EventHandler event args error. eventKey: %s, args: %+v", eventKey, args)
|
||||
return
|
||||
}
|
||||
if eventKey == consts.EventKeyDBSysDictTypeDelete {
|
||||
s.DeleteData(ctx, pkList)
|
||||
} else {
|
||||
for _, pk := range pkList {
|
||||
s.LoadData(ctx, pk)
|
||||
}
|
||||
}
|
||||
dbType := "edit"
|
||||
if eventKey == consts.EventKeyDBSysDictTypeCreate {
|
||||
dbType = "add"
|
||||
} else if eventKey == consts.EventKeyDBSysDictTypeDelete {
|
||||
dbType = "del"
|
||||
} else {
|
||||
dbType = "edit"
|
||||
}
|
||||
queue.Push(ctx, consts.BroadcastDbChg, &model.BroadcastDbChgCache{
|
||||
TableName: s.TableName(ctx),
|
||||
PK: pkList,
|
||||
Type: dbType,
|
||||
Data: nil,
|
||||
})
|
||||
})
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *sMemDBSysDictType) TableName(ctx context.Context) string {
|
||||
return dao.SysDictType.Table()
|
||||
}
|
||||
|
||||
func (s *sMemDBSysDictType) CreateTable(ctx context.Context) error {
|
||||
_, err := db.Exec(ctx, "DROP TABLE IF EXISTS "+s.TableName(ctx))
|
||||
if err != nil {
|
||||
g.Log().Errorf(ctx, "sMemDBSysDictType.CreateTable delete table err: %v", err)
|
||||
return err
|
||||
}
|
||||
|
||||
total, err := db.Model("sqlite_master").Where("type", "table").Where("name", dao.SysDictType.Table()).Count()
|
||||
if err != nil {
|
||||
g.Log().Errorf(ctx, "sMemDBSysDictType.CreateTable count err: %v", err)
|
||||
return err
|
||||
}
|
||||
if total == 0 {
|
||||
g.Log().Debug(ctx, "sMemDBSysDictType.List create table ", s.TableName(ctx))
|
||||
res, err := db.Exec(ctx, `
|
||||
CREATE TABLE "sys_dict_type" (
|
||||
"dict_id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
|
||||
"tenant_id" TEXT DEFAULT '000000' CHECK(length("tenant_id") <= 20),
|
||||
"dict_name" TEXT DEFAULT '' CHECK(length("dict_name") <= 100),
|
||||
"dict_type" TEXT DEFAULT '' CHECK(length("dict_type") <= 100),
|
||||
"is_sys" TEXT DEFAULT '1' ,
|
||||
"created_dept" INTEGER,
|
||||
"created_by" INTEGER,
|
||||
"created_at" TEXT,
|
||||
"updated_by" INTEGER,
|
||||
"updated_at" TEXT,
|
||||
"remark" TEXT CHECK(length("remark") <= 500)
|
||||
);
|
||||
`)
|
||||
if err != nil {
|
||||
g.Log().Errorf(ctx, "sMemDBSysDictType.CreateTable create table err: %v", err)
|
||||
return err
|
||||
}
|
||||
g.Log().Debug(ctx, "sMemDBSysDictType.CreateTable create table success", res)
|
||||
// 加载数据
|
||||
s.LoadData(ctx, 0)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *sMemDBSysDictType) LoadData(ctx context.Context, pk int64) error {
|
||||
count := 0
|
||||
if pk == 0 {
|
||||
maxDictId := int64(0)
|
||||
for {
|
||||
page := 1
|
||||
pageSize := 500
|
||||
dataList := make([]*entity.SysDictType, 0)
|
||||
dao.SysDictType.Ctx(ctx).Page(page, pageSize).WhereGT(dao.SysDictType.Columns().DictId, maxDictId).
|
||||
OrderAsc(dao.SysDictType.Columns().DictId).Scan(&dataList)
|
||||
if len(dataList) == 0 {
|
||||
break
|
||||
}
|
||||
count += len(dataList)
|
||||
doList, err := entityListToDo[entity.SysDictType, do.SysDictType](dataList)
|
||||
if err != nil {
|
||||
g.Log().Errorf(ctx, "sMemDBSysDictType.Load convert data err: %v", err)
|
||||
return err
|
||||
}
|
||||
_, err = db.Model(dao.SysDictType.Table()).Data(doList).OnConflict(dao.SysDictType.Columns().DictId).Save()
|
||||
if err != nil {
|
||||
g.Log().Errorf(ctx, "sMemDBSysDictType.Load data insert err: %v", err)
|
||||
return err
|
||||
}
|
||||
maxDictId = dataList[len(dataList)-1].DictId
|
||||
if len(dataList) < pageSize {
|
||||
break
|
||||
}
|
||||
}
|
||||
} else {
|
||||
dataList := make([]*entity.SysDictType, 0)
|
||||
dao.SysDictType.Ctx(ctx).Where(dao.SysDictType.Columns().DictId, pk).Scan(&dataList)
|
||||
doList, err := entityListToDo[entity.SysDictType, do.SysDictType](dataList)
|
||||
if err != nil {
|
||||
g.Log().Errorf(ctx, "sMemDBSysDictType.Load convert data err: %v", err)
|
||||
return err
|
||||
}
|
||||
_, err = db.Model(dao.SysDictType.Table()).Data(doList).OnConflict(dao.SysDictType.Columns().DictId).Save()
|
||||
if err != nil {
|
||||
g.Log().Errorf(ctx, "sMemDBSysDictType.Load data insert err: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
g.Log().Debugf(ctx, "sMemDBSysDictType.LoadData load data success, total: %d, pk: %d", count, pk)
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *sMemDBSysDictType) DeleteData(ctx context.Context, ids []int64) error {
|
||||
_, err := db.Model(dao.SysDictType.Table()).WhereIn(dao.SysDictType.Columns().DictId, ids).Delete()
|
||||
if err != nil {
|
||||
g.Log().Errorf(ctx, "sMemDBSysDictType.DeleteData err: %v", err)
|
||||
return err
|
||||
}
|
||||
g.Log().Debugf(ctx, "sMemDBSysDictType.DeleteData delete data success, total: %d, ids: %+v", len(ids), ids)
|
||||
return nil
|
||||
}
|
||||
@@ -0,0 +1,232 @@
|
||||
package memorydb
|
||||
|
||||
import (
|
||||
"context"
|
||||
"git.5iot.com/iotlcm-public/iotlcm-app/internal/consts"
|
||||
"git.5iot.com/iotlcm-public/iotlcm-app/internal/dao"
|
||||
"git.5iot.com/iotlcm-public/iotlcm-app/internal/library/event"
|
||||
"git.5iot.com/iotlcm-public/iotlcm-app/internal/library/mcache"
|
||||
"git.5iot.com/iotlcm-public/iotlcm-app/internal/model"
|
||||
"git.5iot.com/iotlcm-public/iotlcm-app/internal/model/do"
|
||||
"git.5iot.com/iotlcm-public/iotlcm-app/internal/model/entity"
|
||||
"git.5iot.com/iotlcm-public/iotlcm-app/internal/service"
|
||||
|
||||
"git.5iot.com/iotlcm-public/iotlcm-app/utility/queue"
|
||||
|
||||
"github.com/gogf/gf/v2/frame/g"
|
||||
)
|
||||
|
||||
type sMemDBSysMenu struct {
|
||||
}
|
||||
|
||||
var instanceMemDBSysMenu *sMemDBSysMenu
|
||||
|
||||
func NewMemDBSysMenu() *sMemDBSysMenu {
|
||||
if instanceMemDBSysMenu != nil {
|
||||
return instanceMemDBSysMenu
|
||||
}
|
||||
instanceMemDBSysMenu = &sMemDBSysMenu{}
|
||||
initLoadMemoryDB := g.Cfg().MustGet(context.TODO(), "server.initLoadMemoryDB").Bool()
|
||||
if initLoadMemoryDB {
|
||||
instanceMemDBSysMenu.Init(context.TODO())
|
||||
}
|
||||
return instanceMemDBSysMenu
|
||||
}
|
||||
|
||||
func init() {
|
||||
s := NewMemDBSysMenu()
|
||||
service.RegisterMemDBSysMenu(s)
|
||||
RegisterMemDB(s.TableName(context.TODO()), s)
|
||||
}
|
||||
|
||||
func (s *sMemDBSysMenu) Init(ctx context.Context) error {
|
||||
err := s.CreateTable(ctx)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
err = s.EventHandler(ctx)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *sMemDBSysMenu) EventHandler(ctx context.Context) error {
|
||||
eventList := []string{
|
||||
consts.EventKeyDBSysMenuCreate,
|
||||
consts.EventKeyDBSysMenuUpdate,
|
||||
consts.EventKeyDBSysMenuDelete,
|
||||
}
|
||||
event.EventsInstance().Register(eventList, func(ctx context.Context, eventKey string, args ...interface{}) {
|
||||
if len(args) < 1 {
|
||||
g.Log().Errorf(ctx, "sMemDBSysMenu.EventHandler event args error. eventKey: %s, args: %+v", eventKey, args)
|
||||
return
|
||||
}
|
||||
pkList, ok := args[0].([]int64)
|
||||
if !ok {
|
||||
pk, ok := args[0].(int64)
|
||||
if !ok {
|
||||
g.Log().Errorf(ctx, "sMemDBSysMenu.EventHandler event args error. eventKey: %s, args: %+v", eventKey, args)
|
||||
return
|
||||
}
|
||||
pkList = []int64{pk}
|
||||
}
|
||||
if len(pkList) == 0 {
|
||||
g.Log().Errorf(ctx, "sMemDBSysMenu.EventHandler event args error. eventKey: %s, args: %+v", eventKey, args)
|
||||
return
|
||||
}
|
||||
if eventKey == consts.EventKeyDBSysMenuDelete {
|
||||
s.DeleteData(ctx, pkList)
|
||||
} else {
|
||||
for _, pk := range pkList {
|
||||
s.LoadData(ctx, pk)
|
||||
}
|
||||
}
|
||||
|
||||
roleIds := make([]int64, 0)
|
||||
if err := dao.SysRoleMenu.Ctx(ctx).
|
||||
Fields(dao.SysRoleMenu.Columns().RoleId).
|
||||
WhereIn(dao.SysRoleMenu.Columns().MenuId, pkList).
|
||||
Group(dao.SysRoleMenu.Columns().RoleId).
|
||||
Scan(&roleIds); err == nil && len(roleIds) > 0 {
|
||||
userIds := make([]int64, 0)
|
||||
if err := dao.SysUserRole.Ctx(ctx).
|
||||
Fields(dao.SysUserRole.Columns().UserId).
|
||||
WhereIn(dao.SysUserRole.Columns().RoleId, roleIds).
|
||||
Group(dao.SysUserRole.Columns().UserId).
|
||||
Scan(&userIds); err == nil {
|
||||
for _, userId := range userIds {
|
||||
_ = mcache.RemoveUserAccessCodeList(ctx, userId)
|
||||
_ = mcache.RemoveUserRoleDataAccessCodeList(ctx, userId)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
dbType := "edit"
|
||||
if eventKey == consts.EventKeyDBSysMenuCreate {
|
||||
dbType = "add"
|
||||
} else if eventKey == consts.EventKeyDBSysMenuDelete {
|
||||
dbType = "del"
|
||||
} else {
|
||||
dbType = "edit"
|
||||
}
|
||||
queue.Push(ctx, consts.BroadcastDbChg, &model.BroadcastDbChgCache{
|
||||
TableName: s.TableName(ctx),
|
||||
PK: pkList,
|
||||
Type: dbType,
|
||||
Data: nil,
|
||||
})
|
||||
})
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *sMemDBSysMenu) TableName(ctx context.Context) string {
|
||||
return dao.SysMenu.Table()
|
||||
}
|
||||
|
||||
func (s *sMemDBSysMenu) CreateTable(ctx context.Context) error {
|
||||
_, err := db.Exec(ctx, "DROP TABLE IF EXISTS "+s.TableName(ctx))
|
||||
if err != nil {
|
||||
g.Log().Errorf(ctx, "sMemDBSysMenu.CreateTable delete table err: %v", err)
|
||||
return err
|
||||
}
|
||||
|
||||
total, err := db.Model("sqlite_master").Where("type", "table").Where("name", dao.SysMenu.Table()).Count()
|
||||
if err != nil {
|
||||
g.Log().Errorf(ctx, "sMemDBSysMenu.CreateTable count err: %v", err)
|
||||
return err
|
||||
}
|
||||
if total == 0 {
|
||||
g.Log().Debug(ctx, "sMemDBSysMenu.List create table ", s.TableName(ctx))
|
||||
res, err := db.Exec(ctx, `
|
||||
CREATE TABLE "sys_menu" (
|
||||
"menu_id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
|
||||
"menu_name" TEXT NOT NULL CHECK(length("menu_name") <= 50),
|
||||
"parent_id" INTEGER DEFAULT 0,
|
||||
"level" INTEGER DEFAULT 1,
|
||||
"tree" TEXT CHECK(length("tree") <= 255),
|
||||
"order_num" INTEGER DEFAULT 0,
|
||||
"path" TEXT DEFAULT '' CHECK(length("path") <= 200),
|
||||
"component" TEXT CHECK(length("component") <= 255),
|
||||
"query_param" TEXT CHECK(length("query_param") <= 255),
|
||||
"is_frame" INTEGER DEFAULT 1 ,
|
||||
"is_cache" INTEGER DEFAULT 0 ,
|
||||
"menu_type" TEXT DEFAULT '' ,
|
||||
"visible" TEXT DEFAULT '0',
|
||||
"status" TEXT DEFAULT '0' ,
|
||||
"perms" TEXT CHECK(length("perms") <= 100),
|
||||
"icon" TEXT DEFAULT '#' CHECK(length("icon") <= 100),
|
||||
"created_dept" INTEGER,
|
||||
"created_by" INTEGER,
|
||||
"created_at" TEXT,
|
||||
"updated_by" INTEGER,
|
||||
"updated_at" TEXT,
|
||||
"remark" TEXT DEFAULT '' CHECK(length("remark") <= 500)
|
||||
);
|
||||
`)
|
||||
if err != nil {
|
||||
g.Log().Errorf(ctx, "sMemDBSysMenu.CreateTable create table err: %v", err)
|
||||
return err
|
||||
}
|
||||
g.Log().Debug(ctx, "sMemDBSysMenu.CreateTable create table success", res)
|
||||
s.LoadData(ctx, 0)
|
||||
return nil
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *sMemDBSysMenu) LoadData(ctx context.Context, pk int64) error {
|
||||
count := 0
|
||||
if pk == 0 {
|
||||
maxMenuId := int64(0)
|
||||
for {
|
||||
page := 1
|
||||
pageSize := 500
|
||||
dataList := make([]*entity.SysMenu, 0)
|
||||
dao.SysMenu.Ctx(ctx).Page(page, pageSize).WhereGT(dao.SysMenu.Columns().MenuId, maxMenuId).
|
||||
OrderAsc(dao.SysMenu.Columns().MenuId).Scan(&dataList)
|
||||
if len(dataList) == 0 {
|
||||
break
|
||||
}
|
||||
count += len(dataList)
|
||||
doList, err := entityListToDo[entity.SysMenu, do.SysMenu](dataList)
|
||||
if err != nil {
|
||||
g.Log().Errorf(ctx, "sMemDBSysMenu.Load convert data err: %v", err)
|
||||
return err
|
||||
}
|
||||
_, err = db.Model(dao.SysMenu.Table()).Data(doList).OnConflict(dao.SysMenu.Columns().MenuId).Save()
|
||||
if err != nil {
|
||||
g.Log().Errorf(ctx, "sMemDBSysMenu.Load data insert err: %v", err)
|
||||
return err
|
||||
}
|
||||
maxMenuId = dataList[len(dataList)-1].MenuId
|
||||
if len(dataList) < pageSize {
|
||||
break
|
||||
}
|
||||
}
|
||||
} else {
|
||||
dataList := make([]*entity.SysMenu, 0)
|
||||
dao.SysMenu.Ctx(ctx).Where(dao.SysMenu.Columns().MenuId, pk).Scan(&dataList)
|
||||
doList, err := entityListToDo[entity.SysMenu, do.SysMenu](dataList)
|
||||
if err != nil {
|
||||
g.Log().Errorf(ctx, "sMemDBSysMenu.Load convert data err: %v", err)
|
||||
return err
|
||||
}
|
||||
_, err = db.Model(dao.SysMenu.Table()).Data(doList).OnConflict(dao.SysMenu.Columns().MenuId).Save()
|
||||
if err != nil {
|
||||
g.Log().Errorf(ctx, "sMemDBSysMenu.Load data insert err: %v", err)
|
||||
}
|
||||
}
|
||||
g.Log().Debugf(ctx, "sMemDBSysMenu.LoadData load data success, total: %d, pk: %d", count, pk)
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *sMemDBSysMenu) DeleteData(ctx context.Context, ids []int64) error {
|
||||
_, err := db.Model(dao.SysMenu.Table()).WhereIn(dao.SysMenu.Columns().MenuId, ids).Delete()
|
||||
if err != nil {
|
||||
g.Log().Errorf(ctx, "sMemDBSysMenu.DeleteData err: %v", err)
|
||||
return err
|
||||
}
|
||||
g.Log().Debugf(ctx, "sMemDBSysMenu.DeleteData delete data success, total: %d, ids: %+v", len(ids), ids)
|
||||
return nil
|
||||
}
|
||||
@@ -0,0 +1,205 @@
|
||||
package memorydb
|
||||
|
||||
import (
|
||||
"context"
|
||||
"git.5iot.com/iotlcm-public/iotlcm-app/internal/consts"
|
||||
"git.5iot.com/iotlcm-public/iotlcm-app/internal/dao"
|
||||
"git.5iot.com/iotlcm-public/iotlcm-app/internal/library/event"
|
||||
"git.5iot.com/iotlcm-public/iotlcm-app/internal/model"
|
||||
"git.5iot.com/iotlcm-public/iotlcm-app/internal/model/do"
|
||||
"git.5iot.com/iotlcm-public/iotlcm-app/internal/model/entity"
|
||||
"git.5iot.com/iotlcm-public/iotlcm-app/internal/service"
|
||||
|
||||
"git.5iot.com/iotlcm-public/iotlcm-app/utility/queue"
|
||||
|
||||
"github.com/gogf/gf/v2/frame/g"
|
||||
)
|
||||
|
||||
type sMemDBSysPost struct {
|
||||
}
|
||||
|
||||
var instanceMemDBSysPost *sMemDBSysPost
|
||||
|
||||
func NewMemDBSysPost() *sMemDBSysPost {
|
||||
if instanceMemDBSysPost != nil {
|
||||
return instanceMemDBSysPost
|
||||
}
|
||||
instanceMemDBSysPost = &sMemDBSysPost{}
|
||||
initLoadMemoryDB := g.Cfg().MustGet(context.TODO(), "server.initLoadMemoryDB").Bool()
|
||||
if initLoadMemoryDB {
|
||||
instanceMemDBSysPost.Init(context.TODO())
|
||||
}
|
||||
return instanceMemDBSysPost
|
||||
}
|
||||
|
||||
func init() {
|
||||
s := NewMemDBSysPost()
|
||||
service.RegisterMemDBSysPost(s)
|
||||
RegisterMemDB(s.TableName(context.TODO()), s)
|
||||
}
|
||||
|
||||
func (s *sMemDBSysPost) Init(ctx context.Context) error {
|
||||
err := s.CreateTable(ctx)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
err = s.EventHandler(ctx)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *sMemDBSysPost) EventHandler(ctx context.Context) error {
|
||||
eventList := []string{
|
||||
consts.EventKeyDBSysPostCreate,
|
||||
consts.EventKeyDBSysPostUpdate,
|
||||
consts.EventKeyDBSysPostDelete,
|
||||
}
|
||||
event.EventsInstance().Register(eventList, func(ctx context.Context, eventKey string, args ...interface{}) {
|
||||
if len(args) < 1 {
|
||||
g.Log().Errorf(ctx, "sMemDBSysPost.EventHandler event args error. eventKey: %s, args: %+v", eventKey, args)
|
||||
return
|
||||
}
|
||||
pkList, ok := args[0].([]int64)
|
||||
if !ok {
|
||||
pk, ok := args[0].(int64)
|
||||
if !ok {
|
||||
g.Log().Errorf(ctx, "sMemDBSysPost.EventHandler event args error. eventKey: %s, args: %+v", eventKey, args)
|
||||
return
|
||||
}
|
||||
pkList = []int64{pk}
|
||||
}
|
||||
if len(pkList) == 0 {
|
||||
g.Log().Errorf(ctx, "sMemDBSysPost.EventHandler event args error. eventKey: %s, args: %+v", eventKey, args)
|
||||
return
|
||||
}
|
||||
if eventKey == consts.EventKeyDBSysPostDelete {
|
||||
s.DeleteData(ctx, pkList)
|
||||
} else {
|
||||
for _, pk := range pkList {
|
||||
s.LoadData(ctx, pk)
|
||||
}
|
||||
}
|
||||
dbType := "edit"
|
||||
if eventKey == consts.EventKeyDBSysPostCreate {
|
||||
dbType = "add"
|
||||
} else if eventKey == consts.EventKeyDBSysPostDelete {
|
||||
dbType = "del"
|
||||
} else {
|
||||
dbType = "edit"
|
||||
}
|
||||
queue.Push(ctx, consts.BroadcastDbChg, &model.BroadcastDbChgCache{
|
||||
TableName: s.TableName(ctx),
|
||||
PK: pkList,
|
||||
Type: dbType,
|
||||
Data: nil,
|
||||
})
|
||||
})
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *sMemDBSysPost) TableName(ctx context.Context) string {
|
||||
return dao.SysPost.Table()
|
||||
}
|
||||
|
||||
func (s *sMemDBSysPost) CreateTable(ctx context.Context) error {
|
||||
_, err := db.Exec(ctx, "DROP TABLE IF EXISTS "+s.TableName(ctx))
|
||||
if err != nil {
|
||||
g.Log().Errorf(ctx, "sMemDBSysPost.CreateTable delete table err: %v", err)
|
||||
return err
|
||||
}
|
||||
|
||||
total, err := db.Model("sqlite_master").Where("type", "table").Where("name", dao.SysPost.Table()).Count()
|
||||
if err != nil {
|
||||
g.Log().Errorf(ctx, "sMemDBSysPost.CreateTable count err: %v", err)
|
||||
return err
|
||||
}
|
||||
if total == 0 {
|
||||
g.Log().Debug(ctx, "sMemDBSysPost.List create table ", s.TableName(ctx))
|
||||
res, err := db.Exec(ctx, `
|
||||
CREATE TABLE "sys_post" (
|
||||
"post_id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
|
||||
"tenant_id" TEXT DEFAULT '000000' CHECK(length("tenant_id") <= 20),
|
||||
"dept_id" INTEGER NOT NULL,
|
||||
"post_code" TEXT NOT NULL CHECK(length("post_code") <= 64),
|
||||
"post_category" TEXT CHECK(length("post_category") <= 100),
|
||||
"post_name" TEXT NOT NULL CHECK(length("post_name") <= 50),
|
||||
"post_sort" INTEGER NOT NULL,
|
||||
"status" TEXT NOT NULL ,
|
||||
"created_dept" INTEGER,
|
||||
"created_by" INTEGER NOT NULL,
|
||||
"created_at" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updated_by" INTEGER,
|
||||
"updated_at" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"deleted_by" INTEGER,
|
||||
"deleted_at" DATETIME,
|
||||
"remark" TEXT CHECK(length("remark") <= 500)
|
||||
);
|
||||
`)
|
||||
if err != nil {
|
||||
g.Log().Errorf(ctx, "sMemDBSysPost.CreateTable create table err: %v", err)
|
||||
return err
|
||||
}
|
||||
g.Log().Debug(ctx, "sMemDBSysPost.CreateTable create table success", res)
|
||||
// 加载数据
|
||||
s.LoadData(ctx, 0)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *sMemDBSysPost) LoadData(ctx context.Context, pk int64) error {
|
||||
count := 0
|
||||
if pk == 0 {
|
||||
maxPostId := int64(0)
|
||||
for {
|
||||
page := 1
|
||||
pageSize := 500
|
||||
dataList := make([]*entity.SysPost, 0)
|
||||
dao.SysPost.Ctx(ctx).Page(page, pageSize).WhereGT(dao.SysPost.Columns().PostId, maxPostId).
|
||||
OrderAsc(dao.SysPost.Columns().PostId).Scan(&dataList)
|
||||
if len(dataList) == 0 {
|
||||
break
|
||||
}
|
||||
count += len(dataList)
|
||||
doList, err := entityListToDo[entity.SysPost, do.SysPost](dataList)
|
||||
if err != nil {
|
||||
g.Log().Errorf(ctx, "sMemDBSysPost.Load convert data err: %v", err)
|
||||
return err
|
||||
}
|
||||
_, err = db.Model(dao.SysPost.Table()).Data(doList).OnConflict(dao.SysPost.Columns().PostId).Save()
|
||||
if err != nil {
|
||||
g.Log().Errorf(ctx, "sMemDBSysPost.Load data insert err: %v", err)
|
||||
return err
|
||||
}
|
||||
maxPostId = dataList[len(dataList)-1].PostId
|
||||
if len(dataList) < pageSize {
|
||||
break
|
||||
}
|
||||
}
|
||||
} else {
|
||||
dataList := make([]*entity.SysPost, 0)
|
||||
dao.SysPost.Ctx(ctx).Where(dao.SysPost.Columns().PostId, pk).Scan(&dataList)
|
||||
doList, err := entityListToDo[entity.SysPost, do.SysPost](dataList)
|
||||
if err != nil {
|
||||
g.Log().Errorf(ctx, "sMemDBSysPost.Load convert data err: %v", err)
|
||||
return err
|
||||
}
|
||||
_, err = db.Model(dao.SysPost.Table()).Data(doList).OnConflict(dao.SysPost.Columns().PostId).Save()
|
||||
if err != nil {
|
||||
g.Log().Errorf(ctx, "sMemDBSysPost.Load data insert err: %v", err)
|
||||
}
|
||||
}
|
||||
g.Log().Debugf(ctx, "sMemDBSysPost.LoadData load data success, total: %d, pk: %d", count, pk)
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *sMemDBSysPost) DeleteData(ctx context.Context, ids []int64) error {
|
||||
_, err := db.Model(dao.SysPost.Table()).WhereIn(dao.SysPost.Columns().PostId, ids).Delete()
|
||||
if err != nil {
|
||||
g.Log().Errorf(ctx, "sMemDBSysPost.DeleteData err: %v", err)
|
||||
return err
|
||||
}
|
||||
g.Log().Debugf(ctx, "sMemDBSysPost.DeleteData delete data success, total: %d, ids: %+v", len(ids), ids)
|
||||
return nil
|
||||
}
|
||||
@@ -0,0 +1,228 @@
|
||||
package memorydb
|
||||
|
||||
import (
|
||||
"context"
|
||||
"git.5iot.com/iotlcm-public/iotlcm-app/internal/consts"
|
||||
"git.5iot.com/iotlcm-public/iotlcm-app/internal/dao"
|
||||
"git.5iot.com/iotlcm-public/iotlcm-app/internal/library/event"
|
||||
"git.5iot.com/iotlcm-public/iotlcm-app/internal/library/mcache"
|
||||
"git.5iot.com/iotlcm-public/iotlcm-app/internal/model"
|
||||
"git.5iot.com/iotlcm-public/iotlcm-app/internal/model/do"
|
||||
"git.5iot.com/iotlcm-public/iotlcm-app/internal/model/entity"
|
||||
"git.5iot.com/iotlcm-public/iotlcm-app/internal/service"
|
||||
|
||||
"git.5iot.com/iotlcm-public/iotlcm-app/utility/queue"
|
||||
|
||||
"github.com/gogf/gf/v2/frame/g"
|
||||
)
|
||||
|
||||
type sMemDBSysRole struct {
|
||||
}
|
||||
|
||||
var instanceMemDBSysRole *sMemDBSysRole
|
||||
|
||||
func NewMemDBSysRole() *sMemDBSysRole {
|
||||
if instanceMemDBSysRole != nil {
|
||||
return instanceMemDBSysRole
|
||||
}
|
||||
instanceMemDBSysRole = &sMemDBSysRole{}
|
||||
initLoadMemoryDB := g.Cfg().MustGet(context.TODO(), "server.initLoadMemoryDB").Bool()
|
||||
if initLoadMemoryDB {
|
||||
instanceMemDBSysRole.Init(context.TODO())
|
||||
}
|
||||
return instanceMemDBSysRole
|
||||
}
|
||||
|
||||
func init() {
|
||||
s := NewMemDBSysRole()
|
||||
service.RegisterMemDBSysRole(s)
|
||||
RegisterMemDB(s.TableName(context.TODO()), s)
|
||||
}
|
||||
|
||||
func (s *sMemDBSysRole) Init(ctx context.Context) error {
|
||||
err := s.CreateTable(ctx)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
err = s.EventHandler(ctx)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *sMemDBSysRole) EventHandler(ctx context.Context) error {
|
||||
eventList := []string{
|
||||
consts.EventKeyDBSysRoleCreate,
|
||||
consts.EventKeyDBSysRoleUpdate,
|
||||
consts.EventKeyDBSysRoleDelete,
|
||||
}
|
||||
event.EventsInstance().Register(eventList, func(ctx context.Context, eventKey string, args ...interface{}) {
|
||||
if len(args) < 1 {
|
||||
g.Log().Errorf(ctx, "sMemDBSysRole.EventHandler event args error. eventKey: %s, args: %+v", eventKey, args)
|
||||
return
|
||||
}
|
||||
pkList, ok := args[0].([]int64)
|
||||
if !ok {
|
||||
pk, ok := args[0].(int64)
|
||||
if !ok {
|
||||
g.Log().Errorf(ctx, "sMemDBSysRole.EventHandler event args error. eventKey: %s, args: %+v", eventKey, args)
|
||||
return
|
||||
}
|
||||
pkList = []int64{pk}
|
||||
}
|
||||
if len(pkList) == 0 {
|
||||
g.Log().Errorf(ctx, "sMemDBSysRole.EventHandler event args error. eventKey: %s, args: %+v", eventKey, args)
|
||||
return
|
||||
}
|
||||
if eventKey == consts.EventKeyDBSysRoleDelete {
|
||||
s.DeleteData(ctx, pkList)
|
||||
} else {
|
||||
for _, pk := range pkList {
|
||||
s.LoadData(ctx, pk)
|
||||
}
|
||||
}
|
||||
|
||||
userIds := make([]int64, 0)
|
||||
if err := dao.SysUserRole.Ctx(ctx).
|
||||
Fields(dao.SysUserRole.Columns().UserId).
|
||||
WhereIn(dao.SysUserRole.Columns().RoleId, pkList).
|
||||
Group(dao.SysUserRole.Columns().UserId).
|
||||
Scan(&userIds); err == nil {
|
||||
for _, userId := range userIds {
|
||||
_ = mcache.RemoveUserAccessCodeList(ctx, userId)
|
||||
_ = mcache.RemoveUserRoleDataAccessCodeList(ctx, userId)
|
||||
}
|
||||
}
|
||||
|
||||
dbType := "edit"
|
||||
if eventKey == consts.EventKeyDBSysRoleCreate {
|
||||
dbType = "add"
|
||||
} else if eventKey == consts.EventKeyDBSysRoleDelete {
|
||||
dbType = "del"
|
||||
} else {
|
||||
dbType = "edit"
|
||||
}
|
||||
queue.Push(ctx, consts.BroadcastDbChg, &model.BroadcastDbChgCache{
|
||||
TableName: s.TableName(ctx),
|
||||
PK: pkList,
|
||||
Type: dbType,
|
||||
Data: nil,
|
||||
})
|
||||
})
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *sMemDBSysRole) TableName(ctx context.Context) string {
|
||||
return dao.SysRole.Table()
|
||||
}
|
||||
|
||||
func (s *sMemDBSysRole) CreateTable(ctx context.Context) error {
|
||||
_, err := db.Exec(ctx, "DROP TABLE IF EXISTS "+s.TableName(ctx))
|
||||
if err != nil {
|
||||
g.Log().Errorf(ctx, "sMemDBSysRole.CreateTable delete table err: %v", err)
|
||||
return err
|
||||
}
|
||||
total, err := db.Model("sqlite_master").Where("type", "table").Where("name", dao.SysRole.Table()).Count()
|
||||
if err != nil {
|
||||
g.Log().Errorf(ctx, "sMemDBSysRole.CreateTable count err: %v", err)
|
||||
return err
|
||||
}
|
||||
if total == 0 {
|
||||
g.Log().Debug(ctx, "sMemDBSysRole.List create table ", s.TableName(ctx))
|
||||
res, err := db.Exec(ctx, `
|
||||
CREATE TABLE "sys_role" (
|
||||
"role_id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
|
||||
"tenant_id" TEXT DEFAULT '000000' CHECK(length("tenant_id") <= 20),
|
||||
"dept_id" INTEGER DEFAULT 0,
|
||||
"role_name" TEXT NOT NULL CHECK(length("role_name") <= 30),
|
||||
"role_key" TEXT NOT NULL CHECK(length("role_key") <= 100),
|
||||
"role_sort" INTEGER NOT NULL,
|
||||
"data_scope" TEXT DEFAULT '1',
|
||||
"menu_check_strictly" INTEGER DEFAULT 1,
|
||||
"dept_check_strictly" INTEGER DEFAULT 1,
|
||||
"status" TEXT NOT NULL ,
|
||||
"created_dept" INTEGER,
|
||||
"created_by" INTEGER NOT NULL,
|
||||
"created_at" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updated_by" INTEGER,
|
||||
"updated_at" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"deleted_by" INTEGER,
|
||||
"deleted_at" DATETIME,
|
||||
"remark" TEXT CHECK(length("remark") <= 500)
|
||||
);
|
||||
`)
|
||||
if err != nil {
|
||||
g.Log().Errorf(ctx, "sMemDBSysRole.CreateTable create table err: %v", err)
|
||||
return err
|
||||
}
|
||||
g.Log().Debug(ctx, "sMemDBSysRole.CreateTable create table success", res)
|
||||
s.LoadData(ctx, 0)
|
||||
return nil
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *sMemDBSysRole) LoadData(ctx context.Context, pk int64) error {
|
||||
count := 0
|
||||
if pk == 0 {
|
||||
maxRoleId := int64(0)
|
||||
for {
|
||||
page := 1
|
||||
pageSize := 500
|
||||
dataList := make([]*entity.SysRole, 0)
|
||||
dao.SysRole.Ctx(ctx).Page(page, pageSize).WhereGT(dao.SysRole.Columns().RoleId, maxRoleId).
|
||||
OrderAsc(dao.SysRole.Columns().RoleId).Scan(&dataList)
|
||||
if len(dataList) == 0 {
|
||||
break
|
||||
}
|
||||
count += len(dataList)
|
||||
doList, err := entityListToDo[entity.SysRole, do.SysRole](dataList)
|
||||
if err != nil {
|
||||
g.Log().Errorf(ctx, "sMemDBSysRole.Load convert data err: %v", err)
|
||||
return err
|
||||
}
|
||||
_, err = db.Model(dao.SysRole.Table()).Data(doList).OnConflict(dao.SysRole.Columns().RoleId).Save()
|
||||
if err != nil {
|
||||
g.Log().Errorf(ctx, "sMemDBSysRole.Load data insert err: %v", err)
|
||||
return err
|
||||
}
|
||||
maxRoleId = dataList[len(dataList)-1].RoleId
|
||||
if len(dataList) < pageSize {
|
||||
break
|
||||
}
|
||||
}
|
||||
} else {
|
||||
dataList := make([]*entity.SysRole, 0)
|
||||
dao.SysRole.Ctx(ctx).Where(dao.SysRole.Columns().RoleId, pk).Scan(&dataList)
|
||||
doList, err := entityListToDo[entity.SysRole, do.SysRole](dataList)
|
||||
if err != nil {
|
||||
g.Log().Errorf(ctx, "sMemDBSysRole.Load convert data err: %v", err)
|
||||
return err
|
||||
}
|
||||
_, err = db.Model(dao.SysRole.Table()).Data(doList).OnConflict(dao.SysRole.Columns().RoleId).Save()
|
||||
if err != nil {
|
||||
g.Log().Errorf(ctx, "sMemDBSysRole.Load data insert err: %v", err)
|
||||
}
|
||||
}
|
||||
g.Log().Debugf(ctx, "sMemDBSysRole.LoadData load data success, total: %d, pk: %d", count, pk)
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *sMemDBSysRole) DeleteData(ctx context.Context, ids []int64) error {
|
||||
g.Log().Debugf(ctx, "sMemDBSysRole.DeleteData called with ids: %+v, len: %d", ids, len(ids))
|
||||
|
||||
if len(ids) == 0 {
|
||||
g.Log().Warningf(ctx, "sMemDBSysRole.DeleteData called with empty ids")
|
||||
return nil
|
||||
}
|
||||
|
||||
// 使用 Unscoped() 来确保删除操作被执行
|
||||
_, err := db.Model(dao.SysRole.Table()).WhereIn(dao.SysRole.Columns().RoleId, ids).Unscoped().Delete()
|
||||
if err != nil {
|
||||
g.Log().Errorf(ctx, "sMemDBSysRole.DeleteData err: %v", err)
|
||||
return err
|
||||
}
|
||||
g.Log().Debugf(ctx, "sMemDBSysRole.DeleteData delete data success, total: %d, ids: %+v", len(ids), ids)
|
||||
return nil
|
||||
}
|
||||
@@ -0,0 +1,216 @@
|
||||
package memorydb
|
||||
|
||||
import (
|
||||
"context"
|
||||
"git.5iot.com/iotlcm-public/iotlcm-app/internal/consts"
|
||||
"git.5iot.com/iotlcm-public/iotlcm-app/internal/dao"
|
||||
"git.5iot.com/iotlcm-public/iotlcm-app/internal/library/event"
|
||||
"git.5iot.com/iotlcm-public/iotlcm-app/internal/model"
|
||||
"git.5iot.com/iotlcm-public/iotlcm-app/internal/model/do"
|
||||
"git.5iot.com/iotlcm-public/iotlcm-app/internal/model/entity"
|
||||
"git.5iot.com/iotlcm-public/iotlcm-app/internal/service"
|
||||
|
||||
"git.5iot.com/iotlcm-public/iotlcm-app/utility/queue"
|
||||
|
||||
"github.com/gogf/gf/v2/database/gdb"
|
||||
"github.com/gogf/gf/v2/frame/g"
|
||||
)
|
||||
|
||||
type sMemDBSysTenant struct {
|
||||
}
|
||||
|
||||
var instanceMemDBSysTenant *sMemDBSysTenant
|
||||
|
||||
func NewMemDBSysTenant() *sMemDBSysTenant {
|
||||
if instanceMemDBSysTenant != nil {
|
||||
return instanceMemDBSysTenant
|
||||
}
|
||||
instanceMemDBSysTenant = &sMemDBSysTenant{}
|
||||
initLoadMemoryDB := g.Cfg().MustGet(context.TODO(), "server.initLoadMemoryDB").Bool()
|
||||
if initLoadMemoryDB {
|
||||
instanceMemDBSysTenant.Init(context.TODO())
|
||||
}
|
||||
return instanceMemDBSysTenant
|
||||
}
|
||||
|
||||
func init() {
|
||||
s := NewMemDBSysTenant()
|
||||
service.RegisterMemDBSysTenant(s)
|
||||
RegisterMemDB(s.TableName(context.TODO()), s)
|
||||
}
|
||||
|
||||
func (s *sMemDBSysTenant) Init(ctx context.Context) error {
|
||||
err := s.CreateTable(ctx)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
err = s.EventHandler(ctx)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *sMemDBSysTenant) EventHandler(ctx context.Context) error {
|
||||
eventList := []string{
|
||||
consts.EventKeyDBSysTenantCreate,
|
||||
consts.EventKeyDBSysTenantUpdate,
|
||||
consts.EventKeyDBSysTenantDelete,
|
||||
}
|
||||
event.EventsInstance().Register(eventList, func(ctx context.Context, eventKey string, args ...interface{}) {
|
||||
if len(args) < 1 {
|
||||
g.Log().Errorf(ctx, "sMemDBSysTenant.EventHandler event args error. eventKey: %s, args: %+v", eventKey, args)
|
||||
return
|
||||
}
|
||||
pkList, ok := args[0].([]int64)
|
||||
if !ok {
|
||||
pk, ok := args[0].(int64)
|
||||
if !ok {
|
||||
g.Log().Errorf(ctx, "sMemDBSysTenant.EventHandler event args error. eventKey: %s, args: %+v", eventKey, args)
|
||||
return
|
||||
}
|
||||
pkList = []int64{pk}
|
||||
}
|
||||
if len(pkList) == 0 {
|
||||
g.Log().Errorf(ctx, "sMemDBSysTenant.EventHandler event args error. eventKey: %s, args: %+v", eventKey, args)
|
||||
return
|
||||
}
|
||||
if eventKey == consts.EventKeyDBSysTenantDelete {
|
||||
s.DeleteData(ctx, pkList)
|
||||
} else {
|
||||
for _, pk := range pkList {
|
||||
s.LoadData(ctx, pk)
|
||||
}
|
||||
}
|
||||
dbType := "edit"
|
||||
if eventKey == consts.EventKeyDBSysTenantCreate {
|
||||
dbType = "add"
|
||||
} else if eventKey == consts.EventKeyDBSysTenantDelete {
|
||||
dbType = "del"
|
||||
} else {
|
||||
dbType = "edit"
|
||||
}
|
||||
queue.Push(ctx, consts.BroadcastDbChg, &model.BroadcastDbChgCache{
|
||||
TableName: s.TableName(ctx),
|
||||
PK: pkList,
|
||||
Type: dbType,
|
||||
Data: nil,
|
||||
})
|
||||
})
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *sMemDBSysTenant) DB(ctx context.Context) gdb.DB {
|
||||
return db
|
||||
}
|
||||
|
||||
func (s *sMemDBSysTenant) TableName(ctx context.Context) string {
|
||||
return dao.SysTenant.Table()
|
||||
}
|
||||
|
||||
func (s *sMemDBSysTenant) CreateTable(ctx context.Context) error {
|
||||
_, err := db.Exec(ctx, "DROP TABLE IF EXISTS "+s.TableName(ctx))
|
||||
if err != nil {
|
||||
g.Log().Errorf(ctx, "sMemDBSysTenant.CreateTable delete table err: %v", err)
|
||||
return err
|
||||
}
|
||||
|
||||
total, err := db.Model("sqlite_master").Where("type", "table").Where("name", dao.SysTenant.Table()).Count()
|
||||
if err != nil {
|
||||
g.Log().Errorf(ctx, "sMemDBSysTenant.CreateTable count err: %v", err)
|
||||
return err
|
||||
}
|
||||
if total == 0 {
|
||||
g.Log().Debug(ctx, "sMemDBSysTenant.List create table ", s.TableName(ctx))
|
||||
res, err := db.Exec(ctx, `
|
||||
CREATE TABLE "sys_tenant" (
|
||||
"id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
|
||||
"tenant_id" TEXT NOT NULL CHECK(length("tenant_id") <= 20),
|
||||
"contact_user_name" TEXT CHECK(length("contact_user_name") <= 20),
|
||||
"contact_phone" TEXT CHECK(length("contact_phone") <= 20),
|
||||
"company_name" TEXT CHECK(length("company_name") <= 50),
|
||||
"license_number" TEXT CHECK(length("license_number") <= 30),
|
||||
"address" TEXT CHECK(length("address") <= 200),
|
||||
"intro" TEXT CHECK(length("intro") <= 200),
|
||||
"domain" TEXT CHECK(length("domain") <= 200),
|
||||
"remark" TEXT CHECK(length("remark") <= 200),
|
||||
"package_id" INTEGER,
|
||||
"expire_time" TEXT,
|
||||
"account_count" INTEGER DEFAULT -1,
|
||||
"status" TEXT DEFAULT '0',
|
||||
"created_dept" INTEGER,
|
||||
"created_by" INTEGER NOT NULL,
|
||||
"created_at" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updated_by" INTEGER,
|
||||
"updated_at" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"deleted_by" INTEGER,
|
||||
"deleted_at" DATETIME,
|
||||
CONSTRAINT "sys_tenant_tenant_id_unique" UNIQUE ("tenant_id")
|
||||
);
|
||||
`)
|
||||
if err != nil {
|
||||
g.Log().Errorf(ctx, "sMemDBSysTenant.CreateTable create table err: %v", err)
|
||||
return err
|
||||
}
|
||||
g.Log().Debug(ctx, "sMemDBSysTenant.CreateTable create table success", res)
|
||||
// 加载数据
|
||||
s.LoadData(ctx, 0)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *sMemDBSysTenant) LoadData(ctx context.Context, pk int64) error {
|
||||
count := 0
|
||||
if pk == 0 {
|
||||
maxId := int64(0)
|
||||
for {
|
||||
page := 1
|
||||
pageSize := 500
|
||||
dataList := make([]*entity.SysTenant, 0)
|
||||
dao.SysTenant.Ctx(ctx).Page(page, pageSize).WhereGT(dao.SysTenant.Columns().Id, maxId).
|
||||
OrderAsc(dao.SysTenant.Columns().Id).Scan(&dataList)
|
||||
if len(dataList) == 0 {
|
||||
break
|
||||
}
|
||||
count += len(dataList)
|
||||
doList, err := entityListToDo[entity.SysTenant, do.SysTenant](dataList)
|
||||
if err != nil {
|
||||
g.Log().Errorf(ctx, "sMemDBSysTenant.Load convert data err: %v", err)
|
||||
return err
|
||||
}
|
||||
_, err = db.Model(dao.SysTenant.Table()).Data(doList).OnConflict(dao.SysTenant.Columns().Id).Save()
|
||||
if err != nil {
|
||||
g.Log().Errorf(ctx, "sMemDBSysTenant.Load data insert err: %v, dataList: %+v", err, dataList)
|
||||
return err
|
||||
}
|
||||
maxId = dataList[len(dataList)-1].Id
|
||||
if len(dataList) < pageSize {
|
||||
break
|
||||
}
|
||||
}
|
||||
} else {
|
||||
dataList := make([]*entity.SysTenant, 0)
|
||||
dao.SysTenant.Ctx(ctx).Where(dao.SysTenant.Columns().Id, pk).Scan(&dataList)
|
||||
doList, err := entityListToDo[entity.SysTenant, do.SysTenant](dataList)
|
||||
if err != nil {
|
||||
g.Log().Errorf(ctx, "sMemDBSysTenant.Load convert data err: %v", err)
|
||||
return err
|
||||
}
|
||||
_, err = db.Model(dao.SysTenant.Table()).Data(doList).OnConflict(dao.SysTenant.Columns().Id).Save()
|
||||
if err != nil {
|
||||
g.Log().Errorf(ctx, "sMemDBSysTenant.Load data insert err: %v", err)
|
||||
}
|
||||
}
|
||||
g.Log().Debugf(ctx, "sMemDBSysTenant.LoadData load data success, total: %d, pk: %d", count, pk)
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *sMemDBSysTenant) DeleteData(ctx context.Context, ids []int64) error {
|
||||
_, err := db.Model(dao.SysTenant.Table()).WhereIn(dao.SysTenant.Columns().Id, ids).Delete()
|
||||
if err != nil {
|
||||
g.Log().Errorf(ctx, "sMemDBSysTenant.DeleteData err: %v, ids: %+v", err, ids)
|
||||
return err
|
||||
}
|
||||
g.Log().Debugf(ctx, "sMemDBSysTenant.DeleteData delete data success, total: %d, ids: %+v", len(ids), ids)
|
||||
return nil
|
||||
}
|
||||
Reference in New Issue
Block a user