一、使用配置文件启动项目
-
1、在项目的
etc
文件夹下分别创建开发环境和测试环境的配置文件,这里简单点使用不同的端口 -
2、配置
Makefile
文件启动命令来启动不同配置文件runDev: go run users.go -f etc/application-dev.yml runProd: go run users.go -f etc/application-prod.yml
-
3、如果要使用
pm2
部署go-zero
项目可以配置以下命令,这里演示window
下打包和部署runDev: go run users.go -f etc/application-dev.yml runProd: go run users.go -f etc/application-prod.yml build: CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build users.go chmod: chmod 777 users startDev: pm2 start users.exe -o ./out.log -e ./error.log --log-date-format="YYYY-MM-DD HH:mm Z" -- -f etc/application-dev.yml startProd: pm2 start users.exe -o ./out.log -e ./error.log --log-date-format="YYYY-MM-DD HH:mm Z" -- -f etc/application-prod.yml
-
4、不太清楚如何使用
pm2
部署go
项目的可以参考,链接地址
二、swagger
文档基本使用
-
1、安装依赖包
go install github.com/zeromicro/goctl-swagger@latest
-
2、生成文档,**注意
main.api
**要根据项目实际的来写goctl api plugin -plugin goctl-swagger="swagger -filename main.json" -api main.api -dir .
-
3、在
apifox
中导入刚刚生成的swagger
的json
文件 -
4、关于
go-zero
中写文档可以自己网上搜索 -
5、在
api
上定义type PostDemoReq { Name string `json:"name" validate:"required"` // 姓名 Age int64 `json:"age" validate:"required,gte=1,lte=130"` // 年龄 // optional 表示可选,omitempty如果为空的时候不走后面 Mobile string `json:"mobile,optional" validate:"omitempty,checkMobile"` // 手机号码 Email string `json:"email,optional" validate:"omitempty,checkEmail"` // 邮箱地址 Date string `json:"date" validate:"omitempty,checkDate,checkAfterDate"` // 时间 Password string `json:"password" validate:"required"` // 密码 ConfimPassword string `json:"confimPassword" validate:"eqfield=Password"` // 确认密码 }
-
6、服务的定义
@server ( prefix: demo/v1 group: demo ) service demo-api { @doc "添加" @handler PostDemoHandler post /postDemo (PostDemoReq) returns (Response) }
-
7、查看
apifox
文档
三、获取客户端参数
目前来说几乎全部都是
json
方式前后端交付,这里就演示json
的方式
-
1、
get
请求获取url
上path
参数,比如:xx/:id
,注意这里反引号里面是path
不是json
type IdReq { Id int64 `path:"id"` // 主键id }
-
2、
get
请求获取url
上query
的参数,比如:xx?pageSize=10&pageNumber=1
type GetUserPageReq { PageNumber int64 `form:"pageNumber"` PageSize int64 `form:"pageSize"` }
-
3、当使用
put
请求的时候,url
也有参数,请求提也有参数可以使用下面方式type ModifyUser { Id int64 `path:"id"` Name string `json:"name"` }
-
4、如果上传文件,这时候要使用表单的方式接收参数,这个有点麻烦
-
1、直接定义一个表单字段接收
file
数据type UploadFileReq { File string `form:"file" binding:"required"` }
-
2、定义服务
@server( prefix: demo/v1 group: demo ) service demo-api { @doc "上传文件" @handler UploadFileApi post /uploadFile (UploadFileReq) returns (Response) }
-
3、生成
swagger
文档,导入到apifox
中手动修改下数据类型 -
4、接收客户端传递的参数
func UploadFileApiHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { fileData, fileHeader, err := r.FormFile("file") fmt.Println(fileData, fileHeader, "上传文件") l := demo.NewUploadFileApiLogic(r.Context(), svcCtx) resp, err := l.UploadFileApi() if err != nil { httpx.ErrorCtx(r.Context(), w, err) } else { httpx.OkJsonCtx(r.Context(), w, resp) } } }
-
5、另外在服务层直接使用阿里
oss
上传文件func (l *UploadFileLogic) UploadFile(data multipart.File, fileHeader *multipart.FileHeader) (resp interface{}, err error) { imgType := strings.Split(fileHeader.Filename, ".")[1] var fileType = false if imgType == "jpg" || imgType == "gif" || imgType == "png" || imgType == "JPG" || imgType == "GIF" || imgType == "PNG" { fileType = true if fileHeader.Size > 1024*1024*5 { return nil, errorx.NewDefaultError(errorx.BackUploadPngBiggerError) } } if fileType == false { return nil, errorx.NewDefaultError(errorx.BackUploadFileTypeError) } fileName := fileHeader.Filename filePath, err := common.CosUpload(l.svcCtx.Cos, l.Logger, data, fileName) return filePath, err }
-
-
6、关于文件上传的补充,参考文档
四、关于直接上传文件
-
1、定义
api
type Response { OK int `json:"ok"` } service upload-api { @handler UploadHandler post /upload returns (Response) }
-
2、生成代码,修改
handler
文件package handler import ( "net/http" "upload/internal/logic" "upload/internal/svc" "github.com/zeromicro/go-zero/rest/httpx" ) func UploadHandler(ctx *svc.ServiceContext) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { l := logic.NewUploadLogic(r.Context(), ctx) resp, err := l.Upload(r) if err != nil { httpx.Error(w, err) } else { httpx.OkJson(w, resp) } } }
-
3、修改
logic
上传文件package logic import ( "context" "fmt" "io" "net/http" "os" "path" "upload/internal/svc" "upload/internal/types" "github.com/zeromicro/go-zero/core/logx" ) const maxFileSize = 10 << 20 // 10 MB type UploadLogic struct { logx.Logger ctx context.Context svcCtx *svc.ServiceContext } func NewUploadLogic(ctx context.Context, svcCtx *svc.ServiceContext) UploadLogic { return UploadLogic{ Logger: logx.WithContext(ctx), ctx: ctx, svcCtx: svcCtx, } } func (l *UploadLogic) Upload(r *http.Request) (resp *types.Response, err error) { _ = r.ParseMultipartForm(maxFileSize) file, handler, err := r.FormFile("myFile") if err != nil { fmt.Println(err) return nil, err } defer file.Close() fmt.Printf("Uploaded File: %+v\n", handler.Filename) fmt.Printf("File Size: %+v\n", handler.Size) fmt.Printf("MIME Header: %+v\n", handler.Header) tempFile, err := os.Create(path.Join(l.svcCtx.Config.Path, handler.Filename)) if err != nil { fmt.Println(err) return nil, err } defer tempFile.Close() io.Copy(tempFile, file) return &types.Response{ OK: 0, }, nil }