sys_auto_code.go 4.6 KB
Newer Older
1 2 3
package service

import (
Mr.奇淼('s avatar
Mr.奇淼( 已提交
4
	"gin-vue-admin/global"
5
	"gin-vue-admin/model"
Mr.奇淼('s avatar
Mr.奇淼( 已提交
6
	"gin-vue-admin/model/request"
7
	"gin-vue-admin/utils"
8
	"io/ioutil"
9
	"os"
10
	"strings"
11
	"text/template"
12 13
)

14 15 16 17 18 19
type tplData struct {
	template     *template.Template
	locationPath string
	autoCodePath string
}

20 21
// @title    CreateTemp
// @description   函数的详细描述
22 23
// @auth                     (2020/04/05  20:22)
// @param     autoCode        model.AutoCodeStruct
24
// @return    err             error
Mr.奇淼('s avatar
Mr.奇淼( 已提交
25

26
func CreateTemp(autoCode model.AutoCodeStruct) (err error) {
27 28 29
	basePath := "resource/template"
	// 获取 basePath 文件夹下所有tpl文件
	tplFileList, err := GetAllTplFile(basePath, nil)
30 31 32
	if err != nil {
		return err
	}
33 34 35 36 37 38
	dataList := make([]tplData, 0, len(tplFileList))
	fileList := make([]string, 0, len(tplFileList))
	needMkdir := make([]string, 0, len(tplFileList)) // 当文件夹下存在多个tpl文件时,改为map更合理
	// 根据文件路径生成 tplData 结构体,待填充数据
	for _, value := range tplFileList {
		dataList = append(dataList, tplData{locationPath: value})
39
	}
40 41 42
	// 生成 *Template, 填充 template 字段
	for index, value := range dataList {
		dataList[index].template, err = template.ParseFiles(value.locationPath)
43 44 45
		if err != nil {
			return err
		}
46 47 48
	}

	// 生成文件路径,填充 autoCodePath 字段,readme.txt.tpl不符合规则,需要特殊处理
49
	// resource/template/web/api.js.tpl -> autoCode/web/autoCode.PackageName/api/autoCode.PackageName.js
50 51 52 53 54 55 56
	// resource/template/readme.txt.tpl -> autoCode/readme.txt
	autoPath := "autoCode/"
	for index, value := range dataList {
		trimBase := strings.TrimPrefix(value.locationPath, basePath+"/")
		if trimBase == "readme.txt.tpl" {
			dataList[index].autoCodePath = autoPath + "readme.txt"
			continue
57
		}
58 59 60 61 62 63 64 65

		if lastSeparator := strings.LastIndex(trimBase, "/"); lastSeparator != -1 {
			origFileName := strings.TrimSuffix(trimBase[lastSeparator+1:], ".tpl")
			firstDot := strings.Index(origFileName, ".")
			if firstDot != -1 {
				dataList[index].autoCodePath = autoPath + trimBase[:lastSeparator] + "/" + autoCode.PackageName + "/" +
					origFileName[:firstDot] + "/" + autoCode.PackageName + origFileName[firstDot:]
			}
Mr.奇淼('s avatar
Mr.奇淼( 已提交
66
		}
67 68 69

		if lastSeparator := strings.LastIndex(dataList[index].autoCodePath, "/"); lastSeparator != -1 {
			needMkdir = append(needMkdir, dataList[index].autoCodePath[:lastSeparator])
70
		}
71 72 73 74 75 76 77 78 79 80 81
	}

	// 写入文件前,先创建文件夹
	if err = utils.CreateDir(needMkdir...); err != nil {
		return err
	}

	// 生成文件
	for _, value := range dataList {
		fileList = append(fileList, value.autoCodePath)
		f, err := os.OpenFile(value.autoCodePath, os.O_CREATE|os.O_WRONLY, 0755)
82 83 84
		if err != nil {
			return err
		}
85
		if err = value.template.Execute(f, autoCode); err != nil {
86 87
			return err
		}
88
		_ = f.Close()
89
	}
90

91 92
	// 生成压缩包
	if err := utils.ZipFiles("./ginvueadmin.zip", fileList, ".", "."); err != nil {
93 94
		return err
	}
95 96 97

	// 移除中间文件
	if err := os.RemoveAll(autoPath); err != nil {
98 99 100 101
		return err
	}
	return nil
}
102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119

// GetAllTplFile 用来获取 pathName 文件夹下所有 tpl 文件
func GetAllTplFile(pathName string, fileList []string) ([]string, error) {
	files, err := ioutil.ReadDir(pathName)
	for _, fi := range files {
		if fi.IsDir() {
			fileList, err = GetAllTplFile(pathName+"/"+fi.Name(), fileList)
			if err != nil {
				return nil, err
			}
		} else {
			if strings.HasSuffix(fi.Name(), ".tpl") {
				fileList = append(fileList, pathName+"/"+fi.Name())
			}
		}
	}
	return fileList, err
}
Mr.奇淼('s avatar
Mr.奇淼( 已提交
120 121

func GetTables(dbName string) (err error, TableNames []request.TableReq) {
122
	err = global.GVA_DB.Raw("select table_name as table_name from information_schema.tables where table_schema = ?", dbName).Scan(&TableNames).Error
Mr.奇淼('s avatar
Mr.奇淼( 已提交
123 124 125 126 127 128 129 130 131
	return err, TableNames
}

func GetDB() (err error, DBNames []request.DBReq) {
	err = global.GVA_DB.Raw("SELECT SCHEMA_NAME AS `database` FROM INFORMATION_SCHEMA.SCHEMATA;").Scan(&DBNames).Error
	return err, DBNames
}

func GetColume(tableName string, dbName string) (err error, Columes []request.ColumeReq) {
132
	err = global.GVA_DB.Raw("SELECT COLUMN_NAME colume_name,DATA_TYPE data_type,CASE DATA_TYPE WHEN 'longtext' THEN c.CHARACTER_MAXIMUM_LENGTH WHEN 'varchar' THEN c.CHARACTER_MAXIMUM_LENGTH WHEN 'double' THEN CONCAT_WS( ',', c.NUMERIC_PRECISION, c.NUMERIC_SCALE ) WHEN 'decimal' THEN CONCAT_WS( ',', c.NUMERIC_PRECISION, c.NUMERIC_SCALE ) WHEN 'int' THEN c.NUMERIC_PRECISION WHEN 'bigint' THEN c.NUMERIC_PRECISION ELSE '' END AS data_type_long,COLUMN_COMMENT colume_comment FROM INFORMATION_SCHEMA.COLUMNS c WHERE table_name = ? AND table_schema = ?", tableName, dbName).Scan(&Columes).Error
Mr.奇淼('s avatar
Mr.奇淼( 已提交
133 134
	return err, Columes
}