engineclient.go 11 KB

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