iedc-go/code/makecode.go

280 lines
7.6 KiB
Go

package code
import (
. "../common"
"../db"
"errors"
"fmt"
"io/ioutil"
"net/http"
"os"
"path/filepath"
"strings"
)
type MakeCode struct {
TableConfig Map
TableColumns map[string]map[string]Map
Config Map
Error
}
func (that *MakeCode) Db2JSON(name string, path string, db db.HoTimeDB) {
isMake := false
idSlice := Slice{}
if that.TableColumns == nil {
that.TableColumns = make(map[string]map[string]Map)
}
//加载配置文件
btes, err := ioutil.ReadFile(path)
that.Config = DeepCopyMap(Config).(Map)
if err == nil {
cmap := Map{}
//文件是否损坏
cmap.JsonToMap(string(btes), &that.Error)
for k, v := range cmap {
that.Config[k] = v //程序配置
Config[k] = v //系统配置
}
} else {
that.Error.SetError(errors.New("配置文件不存在,或者配置出错,使用缺省默认配置"))
}
tables := that.Config.GetSlice("tables")
that.TableConfig = Map{}
for k, _ := range tables {
tableName := tables.GetMap(k).GetString("table")
that.TableConfig[tableName] = tables.GetMap(k)
columns := tables.GetMap(k).GetSlice("columns")
//初始化
if that.TableColumns[tableName] == nil {
that.TableColumns[tableName] = map[string]Map{}
}
//注入源数据
for k, _ := range columns {
columnsName := columns.GetMap(k).GetString("name")
that.TableColumns[tableName][columnsName] = columns.GetMap(k)
}
}
myInit := strings.Replace(InitTpt, "{{name}}", name, -1)
ctrList := ""
nowTables := make([]Map, 0)
if db.Type == "mysql" {
nowTables = db.Select("INFORMATION_SCHEMA.TABLES", "TABLE_NAME as name,TABLE_COMMENT as label", Map{"TABLE_SCHEMA": db.DBName})
}
if db.Type == "sqlite" {
nowTables = db.Select("sqlite_sequence", "name")
}
//idSlice=append(idSlice,nowTables)
for _, v := range nowTables {
if that.TableConfig.GetMap(v.GetString("name")) == nil {
if v.GetString("label") == "" {
v["label"] = "备注"
}
that.TableConfig[v.GetString("name")] = Map{
"label": v.GetString("label"),
"table": v.GetString("name"),
"auth": []string{"add", "delete", "edit", "info"},
"columns": []Map{},
"search": []Map{
//{"type": "tree", "name": "oid", "label": "组织", "table": "organization", "showName": "label", "children": "children"},
{"type": "text", "name": "keyword", "label": "请输入关键词", "value": nil},
{"type": "date", "name": "date", "label": "时间段", "value": nil},
{"type": "select", "name": "state", "label": "状态", "value": nil,
"option": []Map{
{"name": "正常", "value": 0},
{"name": "异常", "value": 1},
{"name": "全部", "value": nil},
},
},
},
}
} else {
if !(that.TableConfig.GetMap(v.GetString("name")).GetString("label") != "备注" &&
v.GetString("label") == "备注") {
that.TableConfig.GetMap(v.GetString("name"))["label"] = v.GetString("label")
}
}
//初始化
if that.TableColumns[v.GetString("name")] == nil {
that.TableColumns[v.GetString("name")] = make(map[string]Map)
}
tableInfo := make([]Map, 0)
if db.Type == "mysql" {
tableInfo = db.Select("INFORMATION_SCHEMA.COLUMNS", "COLUMN_NAME AS name,COLUMN_TYPE AS type,COLUMN_COMMENT AS label", Map{"AND": Map{"TABLE_SCHEMA": db.DBName, "TABLE_NAME": v.GetString("name")}})
}
if db.Type == "sqlite" {
tableInfo = db.Query("pragma table_info([" + v.GetString("name") + "]);")
}
idSlice = append(idSlice, tableInfo)
for _, info := range tableInfo {
if info.GetString("label") == "" {
info["label"] = "备注"
}
coloums := that.TableColumns[v.GetString("name")][info.GetString("name")]
if coloums == nil {
coloums = Map{
"name": info.GetString("name"),
"type": info.GetString("type"),
"label": info.GetString("label"),
//"add": false, "info": false, "edit": false, "list": true,
"must": false,
}
} else {
if !(coloums.GetString("label") != "备注" && info.GetString("label") == "备注") {
coloums["label"] = info.GetString("label")
}
coloums["type"] = info.GetString("type")
}
that.TableColumns[v.GetString("name")][info.GetString("name")] = coloums
}
//创建模块文件
//判断文件是否存在
//_, err := os.OpenFile(name+"/"+v.GetString("name"), os.O_RDONLY, os.ModePerm)
_, err := os.Stat(name + "/" + v.GetString("name") + ".go")
if err != nil { //文件不存在,则根据模板创建
myCtr := strings.Replace(CtrTpt, "{{name}}", name, -1)
myCtr = strings.Replace(myCtr, "{{table}}", v.GetString("name"), -1)
_ = os.MkdirAll(name, os.ModeDir)
err = ioutil.WriteFile(name+"/"+v.GetString("name")+".go", []byte(myCtr), os.ModePerm)
if err != nil {
that.Error.SetError(err)
}
isMake = true
}
ctrList = ctrList + `"` + v.GetString("name") + `":` + v.GetString("name") + "Ctr,\r\n "
}
newTables := []Map{}
for k, _ := range that.TableConfig {
newTable := that.TableConfig.GetMap(k)
newTables = append(newTables, newTable)
columns := []Map{}
for _, v := range that.TableColumns[newTable.GetString("table")] {
columns = append(columns, v)
}
newTable["columns"] = columns
}
that.Config["tables"] = newTables
//}
//fmt.Println(ObjToStr(idSlice))
id := Md5(ObjToStr(idSlice))
if id == that.Config.GetString("id") {
if isMake { //有生成包文件
fmt.Println("有新的业务代码生成,请重新运行")
os.Exit(-1)
}
return
}
fmt.Println(id, "---", that.Config.GetString("id"))
that.Config["id"] = id
//init文件初始化
myInit = strings.Replace(myInit, "{{id}}", id, -1)
myInit = strings.Replace(myInit, "{{tablesCtr}}", ctrList, -1)
_ = os.MkdirAll(name, os.ModeDir)
err = ioutil.WriteFile(name+"/init.go", []byte(myInit), os.ModePerm)
if err != nil {
that.Error.SetError(err)
}
//写入配置文件
//var configByte bytes.Buffer
//err = json.Indent(&configByte, []byte(that.Config.ToJsonString()), "", "\t")
_ = os.MkdirAll(filepath.Dir(path), os.ModeDir)
err = ioutil.WriteFile(path, []byte(that.Config.ToJsonString()), os.ModePerm)
if err != nil {
that.Error.SetError(err)
}
fmt.Println("有新的代码生成,请重新运行")
os.Exit(-1)
}
func (that *MakeCode) Info(table string) string {
reStr := ""
for _, v := range that.TableColumns[table] {
if v.Get("info") == nil || v.GetBool("info") {
reStr += v.GetString("name") + ","
}
}
if len(reStr) != 0 {
reStr = reStr[:len(reStr)-1]
}
return reStr
}
func (that *MakeCode) Add(table string, req *http.Request) Map {
data := Map{}
for _, v := range that.TableColumns[table] {
if v.Get("add") == nil || v.GetBool("add") {
reqValue := req.FormValue(v.GetString("name"))
if reqValue == "" {
return nil
}
data[v.GetString("name")] = reqValue
}
}
if len(data) == 0 {
return nil
}
return data
}
func (that *MakeCode) Edit(table string, req *http.Request) Map {
data := Map{}
for _, v := range that.TableColumns[table] {
if v.Get("edit") == nil || v.GetBool("edit") {
reqValue := req.FormValue(v.GetString("name"))
if reqValue == "" {
continue
}
data[v.GetString("name")] = reqValue
}
}
if len(data) == 0 {
return nil
}
return data
}
func (that *MakeCode) Search(table string, req *http.Request) (string, Map) {
reStr := ""
for _, v := range that.TableColumns[table] {
if v.Get("list") == nil || v.GetBool("list") {
reStr += v.GetString("name") + ","
}
}
if len(reStr) != 0 {
reStr = reStr[:len(reStr)-1]
}
data := Map{}
search := that.TableConfig.GetSlice("search")
for k, _ := range search {
reqValue := req.FormValue(search.GetMap(k).GetString("name"))
if reqValue == "" {
continue
}
data[search.GetMap(k).GetString("name")] = reqValue
}
return reStr, data
}