engineclient.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441
  1. package client
  2. import (
  3. "bytes"
  4. "compress/gzip"
  5. "encoding/json"
  6. "encoding/xml"
  7. "fmt"
  8. "io"
  9. "io/ioutil"
  10. "mime/multipart"
  11. "net/http"
  12. "os"
  13. "path/filepath"
  14. "strings"
  15. "git.qianqiusoft.com/qianqiusoft/light-apiengine/env"
  16. "git.qianqiusoft.com/qianqiusoft/light-apiengine/utils"
  17. )
  18. type EngineClient struct {
  19. ProjectName string
  20. ServerUrl string
  21. }
  22. type ResponeResult struct {
  23. Code int32 `json:"code"`
  24. //描述
  25. Msg string `json:"msg"`
  26. //数据
  27. Data []GenerateResult `json:"data"`
  28. }
  29. type GenerateResult struct {
  30. Name string `json:"name"`
  31. Content []byte `json:"content"`
  32. Type string `json:"type"`
  33. }
  34. func NewEngineClient(project_name string, server_url string) *EngineClient {
  35. return &EngineClient{project_name, server_url}
  36. }
  37. func (c *EngineClient) InitDefalutFile(project_name string) {
  38. c.ProjectName = project_name
  39. os.MkdirAll("controllers/gen", os.ModePerm)
  40. os.MkdirAll("controllers/partial", os.ModePerm)
  41. os.MkdirAll("models", os.ModePerm)
  42. os.MkdirAll("routers", os.ModePerm)
  43. os.MkdirAll("conf", os.ModePerm)
  44. os.MkdirAll("sqlconfig", os.ModePerm)
  45. //os.MkdirAll("sqlconfig/gen", os.ModePerm)
  46. os.MkdirAll("doc", os.ModePerm)
  47. os.MkdirAll("web", os.ModePerm)
  48. _, err := os.Stat(project_name + ".xml")
  49. if os.IsNotExist(err) {
  50. xml := strings.Replace(DefaultProjectXML, "{project_name}", project_name, -1)
  51. ioutil.WriteFile(project_name+".xml", []byte(xml), os.ModePerm)
  52. }
  53. _, err = os.Stat(project_name + ".xsd")
  54. if os.IsNotExist(err) {
  55. ioutil.WriteFile(project_name+".xsd", []byte(XSD), os.ModePerm)
  56. }
  57. _, err = os.Stat("Dockerfile")
  58. if os.IsNotExist(err) {
  59. xml := strings.Replace(DockerFile, "{project_name}", project_name, -1)
  60. ioutil.WriteFile("Dockerfile", []byte(xml), os.ModePerm)
  61. }
  62. _, err = os.Stat("build_docker.sh")
  63. if os.IsNotExist(err) {
  64. xml := strings.Replace(BuildSH, "{project_name}", project_name, -1)
  65. ioutil.WriteFile("build_docker.sh", []byte(xml), os.ModePerm)
  66. }
  67. _, err = os.Stat("README.md")
  68. if os.IsNotExist(err) {
  69. xml := strings.Replace(MARK_DOWN, "{project_name}", project_name, -1)
  70. xml = strings.Replace(xml, "{!}", "`", -1)
  71. ioutil.WriteFile("README.md", []byte(xml), os.ModePerm)
  72. }
  73. }
  74. func (c *EngineClient) GenerateCurrentProject() {
  75. c.InitDefalutFile(c.ProjectName)
  76. // 0---0
  77. //path, _ := utils.GetCurrentPath()
  78. //c.Generate(path + c.ProjectName + ".xml")
  79. projMainXmlFileTemp := c.MergeXmlToSingle()
  80. if projMainXmlFileTemp == ""{
  81. fmt.Println("projMainXmlFileTemp is empty")
  82. return
  83. }
  84. c.Generate(projMainXmlFileTemp)
  85. path, _ := utils.GetCurrentPath()
  86. CopyDir(env.Get("GOPATH", "") + "/src/git.qianqiusoft.com/qianqiusoft/light-apiengine/sqlconfig",
  87. path+"sqlconfig")
  88. }
  89. func (c *EngineClient) Generate(xmlfile string) {
  90. var result ResponeResult
  91. server := "http://qianqiusoft.com:6166"
  92. if c.ServerUrl != "" {
  93. server = c.ServerUrl
  94. }
  95. server += "/api/v1/develop/generate"
  96. bs := DoRequest(xmlfile, server)
  97. if bs != nil {
  98. err := json.Unmarshal(bs.Bytes(), &result)
  99. if err != nil {
  100. fmt.Println(err.Error())
  101. }
  102. for i := 0; i < len(result.Data); i++ {
  103. var b bytes.Buffer
  104. b.Write(result.Data[i].Content)
  105. unzip := unzipbytes(&b)
  106. result.Data[i].Content = unzip.Bytes()
  107. }
  108. for i := 0; i < len(result.Data); i++ {
  109. path := result.Data[i].Name
  110. //fmt.Println(path)
  111. path = path[len(c.ProjectName)+1:]
  112. fmt.Println(path)
  113. ft := result.Data[i].Type
  114. if result.Data[i].Type == "main" {
  115. } else if ft == "config" || ft == "ci" {
  116. _, err := os.Stat(path)
  117. if err == nil {
  118. fmt.Println(path + "已经存在,忽略...")
  119. } else {
  120. ioutil.WriteFile(path, result.Data[i].Content, os.ModePerm)
  121. }
  122. } else if ft == "controllers" {
  123. if strings.Index(path, "_gen.go") > 0 {
  124. ioutil.WriteFile(path, result.Data[i].Content, os.ModePerm)
  125. } else {
  126. _, err := os.Stat(path)
  127. if err == nil {
  128. ioutil.WriteFile(path+"_new", result.Data[i].Content, os.ModePerm)
  129. } else if os.IsNotExist(err) {
  130. ioutil.WriteFile(path, result.Data[i].Content, os.ModePerm)
  131. }
  132. }
  133. } else if ft == "routers" {
  134. _, err := os.Stat(path)
  135. if err == nil {
  136. fmt.Println(path + "已经存在")
  137. ioutil.WriteFile(path+"_new", result.Data[i].Content, os.ModePerm)
  138. } else {
  139. ioutil.WriteFile(path, result.Data[i].Content, os.ModePerm)
  140. }
  141. } else {
  142. os.MkdirAll(filepath.Dir(path), os.ModePerm)
  143. err := ioutil.WriteFile(path, result.Data[i].Content, os.ModePerm)
  144. if err != nil {
  145. fmt.Println(err.Error())
  146. }
  147. }
  148. }
  149. }
  150. }
  151. /**
  152. * @brief: merge xml
  153. * @param: none
  154. * @return: the path of final xml
  155. */
  156. func (c *EngineClient)MergeXmlToSingle()string{
  157. path, _ := utils.GetCurrentPath()
  158. // e.g.: c:/gopath/src/hanghua_background_proj
  159. projDir := fmt.Sprintf("%s%s.proj", path, c.ProjectName)
  160. projMainXmlFile := projDir + "/" + c.ProjectName + ".xml"
  161. projMainXmlFileTemp := projDir + "/" + c.ProjectName + "_temp.xml"
  162. _, err := os.Stat(projMainXmlFileTemp)
  163. if os.IsNotExist(err) {
  164. fmt.Println("-------------------------->remove project main file temp")
  165. os.Remove(projMainXmlFileTemp) // remove
  166. }
  167. _, err = os.Stat(projMainXmlFile)
  168. if os.IsNotExist(err) {
  169. fmt.Println("main xml file of " + c.ProjectName + " does not exist")
  170. return ""
  171. }
  172. app := XmlApplication{}
  173. bytess, _ := ioutil.ReadFile(projMainXmlFile)
  174. err = xml.Unmarshal(bytess, &app)
  175. if err != nil{
  176. fmt.Println("xml.Unmarshal(bytess, &app) error " + err.Error())
  177. return ""
  178. }
  179. controllers, err := scanControllers(projDir + "/controllers")
  180. if err != nil{
  181. fmt.Println("scanControllers error " + err.Error())
  182. return ""
  183. }
  184. beans, err := scanBeans(projDir + "/beans")
  185. if err != nil{
  186. fmt.Println("scanBeans error " + err.Error())
  187. return ""
  188. }
  189. tables, err := scanTables(projDir + "/tables")
  190. if err != nil{
  191. fmt.Println("scanTables error " + err.Error())
  192. return ""
  193. }
  194. if app.Controllers.ControllerList == nil{
  195. app.Controllers.ControllerList = []XmlController{}
  196. }
  197. for i := range controllers{
  198. app.Controllers.ControllerList = append(app.Controllers.ControllerList, controllers[i])
  199. }
  200. createVueApisFolder(app.Controllers.ControllerList)
  201. if app.Beans.BeanList == nil{
  202. app.Beans.BeanList = []XmlBean{}
  203. }
  204. for i := range beans{
  205. app.Beans.BeanList = append(app.Beans.BeanList, beans[i])
  206. }
  207. if app.Tables.TableList == nil{
  208. app.Tables.TableList = []XmlTable{}
  209. }
  210. for i := range tables{
  211. app.Tables.TableList = append(app.Tables.TableList, tables[i])
  212. }
  213. bytess, err = xml.Marshal(app)
  214. if err != nil{
  215. fmt.Println("xml.Marshal(app) error " + err.Error())
  216. return ""
  217. }
  218. err = ioutil.WriteFile(projMainXmlFileTemp, bytess,os.ModePerm)
  219. if err != nil{
  220. fmt.Println("ioutil.WriteFile(projMainXmlFileTemp, bytess,os.ModePerm) error " + err.Error())
  221. return ""
  222. }
  223. _, err = os.Stat(projMainXmlFileTemp)
  224. if os.IsNotExist(err) {
  225. fmt.Println("main xml file temp of " + c.ProjectName + " does not exist")
  226. return ""
  227. }else{
  228. fmt.Println("main xml file temp of " + c.ProjectName + " exist")
  229. }
  230. return projMainXmlFileTemp
  231. }
  232. func scanControllers(ctrldir string) ([]XmlController, error){
  233. _, err := os.Stat(ctrldir)
  234. if os.IsNotExist(err) {
  235. fmt.Println("controller dir does not exist")
  236. return nil, err
  237. }
  238. controllers := []XmlController{}
  239. err = filepath.Walk(ctrldir, func(path string, info os.FileInfo, err error) error {
  240. if err != nil {
  241. return filepath.SkipDir
  242. }
  243. if info.IsDir(){
  244. return nil
  245. }
  246. ctrl := XmlController{}
  247. ctrlfile := ctrldir + "/" + info.Name()
  248. _, err = os.Stat(ctrlfile)
  249. if os.IsNotExist(err) {
  250. fmt.Println("controller xml file " + ctrlfile + " does not exist")
  251. return filepath.SkipDir
  252. }
  253. bytess, _ := ioutil.ReadFile(ctrlfile)
  254. err = xml.Unmarshal(bytess, &ctrl)
  255. if err != nil{
  256. fmt.Println("xml.Unmarshal(bytess, &app) error " + err.Error())
  257. return filepath.SkipDir
  258. }
  259. controllers = append(controllers, ctrl)
  260. return nil
  261. })
  262. return controllers, err
  263. }
  264. func scanBeans(ctrldir string) ([]XmlBean, error){
  265. _, err := os.Stat(ctrldir)
  266. if os.IsNotExist(err) {
  267. fmt.Println("controller dir does not exist")
  268. return nil, err
  269. }
  270. beans := []XmlBean{}
  271. err = filepath.Walk(ctrldir, func(path string, info os.FileInfo, err error) error {
  272. if err != nil {
  273. return filepath.SkipDir
  274. }
  275. if info.IsDir(){
  276. return nil
  277. }
  278. bean := XmlBean{}
  279. beanfile := ctrldir + "/" + info.Name()
  280. _, err = os.Stat(beanfile)
  281. if os.IsNotExist(err) {
  282. fmt.Println("controller xml file " + beanfile + " does not exist")
  283. return filepath.SkipDir
  284. }
  285. bytess, _ := ioutil.ReadFile(beanfile)
  286. err = xml.Unmarshal(bytess, &bean)
  287. if err != nil{
  288. fmt.Println("xml.Unmarshal(bytess, &app) error " + err.Error())
  289. return filepath.SkipDir
  290. }
  291. beans = append(beans, bean)
  292. return nil
  293. })
  294. return beans, err
  295. }
  296. func scanTables(ctrldir string) ([]XmlTable, error){
  297. _, err := os.Stat(ctrldir)
  298. if os.IsNotExist(err) {
  299. fmt.Println("controller dir does not exist")
  300. return nil, err
  301. }
  302. tables := []XmlTable{}
  303. err = filepath.Walk(ctrldir, func(path string, info os.FileInfo, err error) error {
  304. if err != nil {
  305. return filepath.SkipDir
  306. }
  307. if info.IsDir(){
  308. return nil
  309. }
  310. table := XmlTable{}
  311. tablefile := ctrldir + "/" + info.Name()
  312. _, err = os.Stat(tablefile)
  313. if os.IsNotExist(err) {
  314. fmt.Println("controller xml file " + tablefile + " does not exist")
  315. return filepath.SkipDir
  316. }
  317. bytess, _ := ioutil.ReadFile(tablefile)
  318. err = xml.Unmarshal(bytess, &table)
  319. if err != nil{
  320. fmt.Println("xml.Unmarshal(bytess, &app) error " + err.Error())
  321. return filepath.SkipDir
  322. }
  323. tables = append(tables, table)
  324. return nil
  325. })
  326. return tables, err
  327. }
  328. func createVueApisFolder(controllers []XmlController){
  329. for i := range controllers{
  330. fmt.Println("------------------------------>" + controllers[i].Name)
  331. os.MkdirAll("vue/api/modules/" + controllers[i].Name, os.ModePerm)
  332. }
  333. }
  334. func unzipbytes(bs *bytes.Buffer) bytes.Buffer {
  335. r, _ := gzip.NewReader(bs)
  336. defer r.Close()
  337. var b bytes.Buffer
  338. b.ReadFrom(r)
  339. //undatas, _ := ioutil.ReadAll(r)
  340. //fmt.Println("ungzip size:", len(undatas))
  341. return b
  342. }
  343. func DoRequest(xmlfile string, server string) *bytes.Buffer {
  344. request, err := newfileUploadRequest(server, nil, "xmlfile", xmlfile)
  345. if err != nil {
  346. fmt.Println(err)
  347. }
  348. client := &http.Client{}
  349. resp, err := client.Do(request)
  350. if err != nil {
  351. fmt.Println(err)
  352. } else {
  353. body := &bytes.Buffer{}
  354. _, err := body.ReadFrom(resp.Body)
  355. if err != nil {
  356. fmt.Println(err)
  357. }
  358. resp.Body.Close()
  359. fmt.Println(resp.StatusCode)
  360. fmt.Println(resp.Header)
  361. //fmt.Println(body)
  362. return body
  363. }
  364. return nil
  365. }
  366. func newfileUploadRequest(uri string, params map[string]string, paramName, path string) (*http.Request, error) {
  367. file, err := os.Open(path)
  368. if err != nil {
  369. return nil, err
  370. }
  371. defer file.Close()
  372. body := &bytes.Buffer{}
  373. writer := multipart.NewWriter(body)
  374. part, err := writer.CreateFormFile(paramName, filepath.Base(path))
  375. if err != nil {
  376. return nil, err
  377. }
  378. _, err = io.Copy(part, file)
  379. for key, val := range params {
  380. _ = writer.WriteField(key, val)
  381. }
  382. err = writer.Close()
  383. if err != nil {
  384. return nil, err
  385. }
  386. request, err := http.NewRequest("POST", uri, body)
  387. request.Header.Add("Content-Type", writer.FormDataContentType())
  388. return request, err
  389. }