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
}