engineclient.go 5.1 KB

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