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:
MiFaZhan
2026-10-26 14:01:25 +08:00
commit 2ed5dfa6a1
1013 changed files with 138466 additions and 0 deletions
+123
View File
@@ -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
}
+210
View File
@@ -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
}
+232
View File
@@ -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
}
+205
View File
@@ -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
}
+228
View File
@@ -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
}