# tmaic **Repository Path**: tmaic-cms/tmaic ## Basic Information - **Project Name**: tmaic - **Description**: tmaic saas多租户(Multi-Tenant ),即一个Tenant,一个Database的数据存储方式。隔离级别最高、最安全,说到底是要解决数据存储的问题,golang语言saas框架唯数不多的框架之一。 - **Primary Language**: Go - **License**: AGPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 29 - **Forks**: 4 - **Created**: 2021-01-10 - **Last Updated**: 2024-12-23 ## Categories & Tags **Categories**: Uncategorized **Tags**: goang, tmaic, Laravel, saas, Go语言 ## README # tmaic saas 多应用开发框架 #### 介绍 tmaic saas 是一套简洁、优雅的Golang API Web 多应用开发框架(GoLang Web Framework)。它可以让你从面条一样杂乱的代码中解脱出来;它可以帮你构建一个完美的网络应用,而且每行代码都可以简洁、富于表达力。 亮点: 1. 可以独立编译应用; 2. 每个应用可以独立数据库; 3. 权限(正在开发中),功能与 spatie/laravel-permission 一致; 4. 集成redis缓存工具; 5. 集成NSQ中间件; 6. 支持MYSQL,MSSQL数据库; #### 安装教程 出始化框架前确保安装NSQ,安装教程见官方文档 1. git clone https://gitee.com/tmaic-cms/tmaic.git 2. go mod tidy 3. go run main.go ### 使用说明 ### 获取上下文 ```` UserId := this.Get("UserId") ````` ### 获取应用DB实例 ``` db := paas.DB.Initiation(Ctx.Context) db := Ctx.Db() db := Ctx.ContextTenantDb() db := AppDb(AppId) //传入应用ID ``` ### redis缓存 #### 设置缓存 ``` userData, _ := json.Marshal(Admin) cache.AddTokenCache(userInfoKey, userData) ``` ### #### 读取缓存 ``` adminInfoValue := cache.Get(userInfoKey) var adminInfo *sysmdel.PlatformAdmin if err := simple.InterfaceToStruct(adminInfoValue, &adminInfo); err != nil { return nil } return adminInfo ``` ### NSQ队列,生成Jobs,如下 ``` package jobs import ( "gitee.com/pangxianfei/frame/kernel/debug" "gitee.com/pangxianfei/frame/queue/work" "github.com/golang/protobuf/proto" "tmaic/app/jobs/proto3/protomodel" ) func init() { work.Add(&loginJob{}) } var LoginJob = new(loginJob) type loginJob struct { work.Job } // Retries 失败重启次数 func (e *loginJob) Retries() uint32 { return 3 } // Name 列队名称 Topics 名 func (e *loginJob) Name() string { return "login" } func (e *loginJob) SetParam(paramPtr proto.Message) { e.Job.SetParam(paramPtr) } func (e *loginJob) ParamData() proto.Message { return e.Job.ParamProto() } // ParamProto proto 类名参数 实例 func (e *loginJob) ParamProto() proto.Message { return &protomodel.LoginJob{} } // Handle 执行 func (e *loginJob) Handle(paramPtr proto.Message) error { LoginJobObj := paramPtr.(*protomodel.LoginJob) debug.Dd(LoginJobObj) return nil } ``` #### 编辑MQ ``` package MQ import ( "gitee.com/pangxianfei/frame/queue/work" "gitee.com/pangxianfei/saas/sysmodel" "tmaic/app/jobs" "tmaic/app/jobs/proto3/protomodel" ) var LoginMessage = new(LoginDispatch) type loginMessage interface { Dispatch(adminInfo *sysmdel.PlatformAdmin) bool } type LoginDispatch struct{} func (l *LoginDispatch) Dispatch(adminInfo *sysmdel.PlatformAdmin) bool { LoginJob := jobs.LoginJob LoginJob.SetParam(&protomodel.LoginJob{ UserName: adminInfo.UserName, Mobile: adminInfo.Mobile, TenantId: adminInfo.TenantId, UserType: adminInfo.UserType, }) if jobErr := work.Dispatch(LoginJob); jobErr != nil { return false } return true } ``` #### 发送消息send(入列) ``` MQ.LoginMessage.Dispatch(adminInfo) ``` ####启动一个工作任务进行消费, 注:login 列队名称 Topics 名,未消费之前 ![mq1.png](initialize%2Fdoc%2Fmq1.png) 执行(artisan 是编译后的则:./artisan queue:work login) ``` go run artisan.go queue:work login ``` 效果: ![mq2.png](initialize%2Fdoc%2Fmq2.png) ![mq3.png](initialize%2Fdoc%2Fmq3.png) ### 快速生成模板,如:控制器,模型,MQ等 ``` go run artisan.go ``` ![img.png](initialize%2Fdoc%2Fimg.png) #### 控制器: controller:make 应用名 控制器名 ``` go artisan.go controller:make User Login ``` #### 模型: model:make 应用名 模型名 ``` go artisan.go model:make User Login ``` #### 参与贡献 1. Fork 本仓库 2. 新建 Feat_xxx 分支 3. 提交代码 4. 新建 Pull Request