# tmaic multiapp framework **Repository Path**: pangxianfei/tmaic_multiapp_framework ## Basic Information - **Project Name**: tmaic multiapp framework - **Description**: tmaic multiapp 是一套简洁、优雅的Golang API Web 多应用开发框架(GoLang Web Framework)。它可以让你从面条一样杂乱的代码中解脱出来;它可以帮你构建一个完美的网络应用,而且每行代码都可以简洁、富于表达力。 - **Primary Language**: Go - **License**: AGPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 14 - **Forks**: 1 - **Created**: 2023-02-28 - **Last Updated**: 2023-04-22 ## Categories & Tags **Categories**: Uncategorized **Tags**: Go语言, Iris, multiapp ## README # tmaic multiapp 多应用开发框架 #### 介绍 tmaic multiapp 是一套简洁、优雅的Golang API Web 多应用开发框架(GoLang Web Framework)。它可以让你从面条一样杂乱的代码中解脱出来;它可以帮你构建一个完美的网络应用,而且每行代码都可以简洁、富于表达力。 亮点: 1. 可以独立编译应用; 2. 每个应用可以独立数据库; 3. 权限(正在开发中),功能与 spatie/laravel-permission 一致; 4. 集成redis缓存工具; 5. 集成NSQ中间件; 6. 支持MYSQL,MSSQL数据库; 7. 支持 zap 日志收集; 8. 文件存储; 9. 支持 gorm 数据库组件 10. 支持 RESTful API 返回值规范 #### 安装教程 出始化框架前确保安装NSQ,安装教程见官方文档 1. git clone https://gitee.com/pangxianfei/tmaic_multiapp_framework.git 2. go mod tidy 3. go run main.go ### 使用说明 ### 1. 获取上下文 ```` UserId := this.Ctx.Values().Get("UserId") ````` ### 2. 获取应用DB实例 注:this.Context 上下文对象 ``` db := multiapp.DB.Initiation(this.Context) ``` ### 3. redis缓存 1. 设置缓存 ``` userData, _ := json.Marshal(Admin) cache.AddTokenCache(userInfoKey, userData) ``` 2. 读取缓存 ``` adminInfoValue := cache.Get(userInfoKey) var adminInfo *sysmdel.PlatformAdmin if err := simple.InterfaceToStruct(adminInfoValue, &adminInfo); err != nil { return nil } return adminInfo ``` ### 4. NSQ队列,生成Jobs,如下 ``` package jobs import ( "gitee.com/pangxianfei/framework/kernel/debug" "gitee.com/pangxianfei/framework/queue/work" "github.com/golang/protobuf/proto" "tmaic/app/login/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 } ``` 2. 编辑MQ ``` package MQ import ( "gitee.com/pangxianfei/framework/queue/work" "gitee.com/pangxianfei/saas/sysmodel" "tmaic/LoginApp/jobs" "tmaic/LoginApp/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) ``` 4.启动一个工作任务进行消费, 注:login 列队名称 Topics 名,未消费之前 ![mq1.png](doc%2Fmq1.png) 执行(artisan 是编译后的则:./artisan queue:work login) ``` go run artisan.go queue:work login ``` 效果: ![mq2.png](doc%2Fmq2.png) ![mq3.png](doc%2Fmq3.png) ### 5. 快速生成模板,如:控制器,模型,MQ等 ``` go run artisan.go ``` ![img.png](doc/img.png) (1) 控制器: controller:make 应用名 控制器名 ``` go artisan.go controller:make User Login ``` (1) 模型: model:make 应用名 模型名 ``` go artisan.go model:make User Login ``` ### 文件存储 #### 上传 ``` newFile, err := this.File("file") if err != nil { return this.JsonErrorMsg(err.Error()) } file, _ := facades.Storage.PutFile("pang", newFile) url := facades.Storage.Url(file) return this.JsonCreateSucces(url)) ``` #### 特别感谢 #### 参与贡献 1. Fork 本仓库 2. 新建 Feat_xxx 分支 3. 提交代码 4. 新建 Pull Request