engineclient.go 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. package client
  2. import (
  3. "bytes"
  4. "fmt"
  5. "io"
  6. "mime/multipart"
  7. "net/http"
  8. "os"
  9. "path/filepath"
  10. "encoding/json"
  11. "compress/gzip"
  12. "io/ioutil"
  13. "strings"
  14. "git.qianqiusoft.com/qianqiusoft/light-apiengine/utils"
  15. )
  16. type EngineClient struct {
  17. ProjectName string
  18. }
  19. type ResponeResult struct {
  20. Code int32 `json:"code"`
  21. //描述
  22. Msg string `json:"msg"`
  23. //数据
  24. Data []GenerateResult `json:"data"`
  25. }
  26. type GenerateResult struct {
  27. Name string `json:"name"`
  28. Content []byte `json:"content"`
  29. Type string `json:"type"`
  30. }
  31. func NewEngineClient(project_name string) *EngineClient {
  32. return &EngineClient{project_name}
  33. }
  34. func (c * EngineClient)InitDefalutFile(project_name string) {
  35. c.ProjectName = project_name
  36. os.MkdirAll("controllers", os.ModePerm)
  37. os.MkdirAll("models", os.ModePerm)
  38. os.MkdirAll("routers", os.ModePerm)
  39. os.MkdirAll("conf", os.ModePerm)
  40. os.MkdirAll("sqlconfig", os.ModePerm)
  41. _,err:=os.Stat(project_name+".xml")
  42. if os.IsNotExist(err){
  43. xml:=strings.Replace(DefaultProjectXML, "{project_name}", project_name,-1)
  44. ioutil.WriteFile(project_name+".xml",[]byte(xml), os.ModePerm)
  45. }
  46. _,err =os.Stat(project_name+".xsd")
  47. if os.IsNotExist(err) {
  48. ioutil.WriteFile(project_name+".xsd", []byte(XSD), os.ModePerm)
  49. }
  50. _,err =os.Stat("Dockerfile")
  51. if os.IsNotExist(err) {
  52. xml:=strings.Replace(DockerFile, "{project_name}", project_name,-1)
  53. ioutil.WriteFile("Dockerfile", []byte(xml), os.ModePerm)
  54. }
  55. _,err =os.Stat("build_docker.sh")
  56. if os.IsNotExist(err) {
  57. xml:=strings.Replace(BuildSH, "{project_name}", project_name,-1)
  58. ioutil.WriteFile("build_docker.sh", []byte(xml), os.ModePerm)
  59. }
  60. _,err =os.Stat("README.md")
  61. if os.IsNotExist(err) {
  62. xml:=strings.Replace(MARK_DOWN, "{project_name}", project_name,-1)
  63. xml =strings.Replace(xml, "{!}", "`",-1)
  64. ioutil.WriteFile("README.md", []byte(xml), os.ModePerm)
  65. }
  66. }
  67. func (c * EngineClient)GenerateCurrentProject() {
  68. path,_:=utils.GetCurrentPath()
  69. c.InitDefalutFile(c.ProjectName)
  70. c.Generate(path+c.ProjectName+".xml")
  71. }
  72. func (c * EngineClient)Generate(xmlfile string) {
  73. var result ResponeResult
  74. bs := DoRequest(xmlfile)
  75. if bs !=nil {
  76. err:=json.Unmarshal(bs.Bytes(), &result)
  77. if err!=nil{
  78. fmt.Println(err.Error())
  79. }
  80. for i := 0; i < len(result.Data); i++ {
  81. var b bytes.Buffer
  82. b.Write(result.Data[i].Content)
  83. unzip := unzipbytes(&b)
  84. result.Data[i].Content = unzip.Bytes()
  85. }
  86. for i := 0; i < len(result.Data); i++ {
  87. path:= result.Data[i].Name
  88. //fmt.Println(path)
  89. path = path[len(c.ProjectName)+1:]
  90. fmt.Println(path)
  91. ft:=result.Data[i].Type
  92. if result.Data[i].Type == "main" {
  93. }else if ft == "config"{
  94. _,err := os.Stat(path)
  95. if err == nil{
  96. fmt.Println("配置文件已经存在,忽略...")
  97. }else {
  98. ioutil.WriteFile(path, result.Data[i].Content,os.ModePerm)
  99. }
  100. }else if ft =="controllers"{
  101. if strings.Index(path, "_gen.go")>0 {
  102. ioutil.WriteFile(path, result.Data[i].Content,os.ModePerm)
  103. }else {
  104. _, err := os.Stat(path)
  105. if err==nil{
  106. ioutil.WriteFile(path+"_new", result.Data[i].Content,os.ModePerm)
  107. }else if os.IsNotExist(err){
  108. ioutil.WriteFile(path, result.Data[i].Content,os.ModePerm)
  109. }
  110. }
  111. }else {
  112. err:=ioutil.WriteFile(path, result.Data[i].Content,os.ModePerm)
  113. if err !=nil{
  114. fmt.Println(err.Error())
  115. }
  116. }
  117. }
  118. }
  119. }
  120. func unzipbytes(bs *bytes.Buffer) bytes.Buffer{
  121. r, _ := gzip.NewReader(bs)
  122. defer r.Close()
  123. var b bytes.Buffer
  124. b.ReadFrom(r)
  125. //undatas, _ := ioutil.ReadAll(r)
  126. //fmt.Println("ungzip size:", len(undatas))
  127. return b
  128. }
  129. func DoRequest(xmlfile string) *bytes.Buffer{
  130. server:="http://qianqiusoft.com:6166/api/v1/develop/generate"
  131. request, err := newfileUploadRequest(server, nil, "xmlfile", xmlfile)
  132. if err != nil {
  133. fmt.Println(err)
  134. }
  135. client := &http.Client{}
  136. resp, err := client.Do(request)
  137. if err != nil {
  138. fmt.Println(err)
  139. } else {
  140. body := &bytes.Buffer{}
  141. _, err := body.ReadFrom(resp.Body)
  142. if err != nil {
  143. fmt.Println(err)
  144. }
  145. resp.Body.Close()
  146. fmt.Println(resp.StatusCode)
  147. fmt.Println(resp.Header)
  148. //fmt.Println(body)
  149. return body
  150. }
  151. return nil
  152. }
  153. func newfileUploadRequest(uri string, params map[string]string, paramName, path string) (*http.Request, error) {
  154. file, err := os.Open(path)
  155. if err != nil {
  156. return nil, err
  157. }
  158. defer file.Close()
  159. body := &bytes.Buffer{}
  160. writer := multipart.NewWriter(body)
  161. part, err := writer.CreateFormFile(paramName, filepath.Base(path))
  162. if err != nil {
  163. return nil, err
  164. }
  165. _, err = io.Copy(part, file)
  166. for key, val := range params {
  167. _ = writer.WriteField(key, val)
  168. }
  169. err = writer.Close()
  170. if err != nil {
  171. return nil, err
  172. }
  173. request, err := http.NewRequest("POST", uri, body)
  174. request.Header.Add("Content-Type", writer.FormDataContentType())
  175. return request, err
  176. }