mirror of
https://github.com/beego/bee.git
synced 2024-11-23 17:00:56 +00:00
Merge branch 'feature/specification' into develop
This commit is contained in:
commit
0e708a2f26
3
.gitignore
vendored
3
.gitignore
vendored
@ -28,3 +28,6 @@ _testmain.go
|
|||||||
bee
|
bee
|
||||||
*.exe~
|
*.exe~
|
||||||
.goxc.local.json
|
.goxc.local.json
|
||||||
|
|
||||||
|
#IDEA
|
||||||
|
.idea
|
||||||
|
145
apiapp.go
145
apiapp.go
@ -42,19 +42,23 @@ on the existing database.
|
|||||||
The command 'api' creates a folder named [appname] and inside the folder deploy
|
The command 'api' creates a folder named [appname] and inside the folder deploy
|
||||||
the following files/directories structure:
|
the following files/directories structure:
|
||||||
|
|
||||||
|
.
|
||||||
├── conf
|
├── conf
|
||||||
│ └── app.conf
|
│ └── app.conf
|
||||||
├── controllers
|
├── controllers
|
||||||
│ └── object.go
|
│ ├── object_controller.go
|
||||||
│ └── user.go
|
│ └── user_controller.go
|
||||||
├── routers
|
├── docs
|
||||||
│ └── router.go
|
│ └── doc.go
|
||||||
├── tests
|
|
||||||
│ └── default_test.go
|
|
||||||
├── main.go
|
├── main.go
|
||||||
└── models
|
├── models
|
||||||
└── object.go
|
│ ├── object.go
|
||||||
└── user.go
|
│ └── user.go
|
||||||
|
├── routers
|
||||||
|
│ └── router.go
|
||||||
|
├── structures
|
||||||
|
└── tests
|
||||||
|
└── default_test.go
|
||||||
|
|
||||||
`,
|
`,
|
||||||
}
|
}
|
||||||
@ -144,41 +148,36 @@ func init() {
|
|||||||
var apiModels = `package models
|
var apiModels = `package models
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"{{.Appname}}/structures"
|
||||||
"errors"
|
"errors"
|
||||||
"strconv"
|
"strconv"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
Objects map[string]*Object
|
Objects map[string]*structures.Object
|
||||||
)
|
)
|
||||||
|
|
||||||
type Object struct {
|
|
||||||
ObjectId string
|
|
||||||
Score int64
|
|
||||||
PlayerName string
|
|
||||||
}
|
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
Objects = make(map[string]*Object)
|
Objects = make(map[string]*structures.Object)
|
||||||
Objects["hjkhsbnmn123"] = &Object{"hjkhsbnmn123", 100, "astaxie"}
|
Objects["hjkhsbnmn123"] = &structures.Object{"hjkhsbnmn123", 100, "astaxie"}
|
||||||
Objects["mjjkxsxsaa23"] = &Object{"mjjkxsxsaa23", 101, "someone"}
|
Objects["mjjkxsxsaa23"] = &structures.Object{"mjjkxsxsaa23", 101, "someone"}
|
||||||
}
|
}
|
||||||
|
|
||||||
func AddOne(object Object) (ObjectId string) {
|
func AddOne(object structures.Object) (ObjectId string) {
|
||||||
object.ObjectId = "astaxie" + strconv.FormatInt(time.Now().UnixNano(), 10)
|
object.ObjectId = "astaxie" + strconv.FormatInt(time.Now().UnixNano(), 10)
|
||||||
Objects[object.ObjectId] = &object
|
Objects[object.ObjectId] = &object
|
||||||
return object.ObjectId
|
return object.ObjectId
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetOne(ObjectId string) (object *Object, err error) {
|
func GetOne(ObjectId string) (object *structures.Object, err error) {
|
||||||
if v, ok := Objects[ObjectId]; ok {
|
if v, ok := Objects[ObjectId]; ok {
|
||||||
return v, nil
|
return v, nil
|
||||||
}
|
}
|
||||||
return nil, errors.New("ObjectId Not Exist")
|
return nil, errors.New("ObjectId Not Exist")
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetAll() map[string]*Object {
|
func GetAll() map[string]*structures.Object {
|
||||||
return Objects
|
return Objects
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -199,53 +198,40 @@ func Delete(ObjectId string) {
|
|||||||
var apiModels2 = `package models
|
var apiModels2 = `package models
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"{{.Appname}}/structures"
|
||||||
"errors"
|
"errors"
|
||||||
"strconv"
|
"strconv"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
UserList map[string]*User
|
UserList map[string]*structures.User
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
UserList = make(map[string]*User)
|
UserList = make(map[string]*structures.User)
|
||||||
u := User{"user_11111", "astaxie", "11111", Profile{"male", 20, "Singapore", "astaxie@gmail.com"}}
|
u := structures.User{"user_11111", "astaxie", "11111", structures.Profile{"male", 20, "Singapore", "astaxie@gmail.com"}}
|
||||||
UserList["user_11111"] = &u
|
UserList["user_11111"] = &u
|
||||||
}
|
}
|
||||||
|
|
||||||
type User struct {
|
func AddUser(u structures.User) string {
|
||||||
Id string
|
|
||||||
Username string
|
|
||||||
Password string
|
|
||||||
Profile Profile
|
|
||||||
}
|
|
||||||
|
|
||||||
type Profile struct {
|
|
||||||
Gender string
|
|
||||||
Age int
|
|
||||||
Address string
|
|
||||||
Email string
|
|
||||||
}
|
|
||||||
|
|
||||||
func AddUser(u User) string {
|
|
||||||
u.Id = "user_" + strconv.FormatInt(time.Now().UnixNano(), 10)
|
u.Id = "user_" + strconv.FormatInt(time.Now().UnixNano(), 10)
|
||||||
UserList[u.Id] = &u
|
UserList[u.Id] = &u
|
||||||
return u.Id
|
return u.Id
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetUser(uid string) (u *User, err error) {
|
func GetUser(uid string) (u *structures.User, err error) {
|
||||||
if u, ok := UserList[uid]; ok {
|
if u, ok := UserList[uid]; ok {
|
||||||
return u, nil
|
return u, nil
|
||||||
}
|
}
|
||||||
return nil, errors.New("User not exists")
|
return nil, errors.New("User not exists")
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetAllUsers() map[string]*User {
|
func GetAllUsers() map[string]*structures.User {
|
||||||
return UserList
|
return UserList
|
||||||
}
|
}
|
||||||
|
|
||||||
func UpdateUser(uid string, uu *User) (a *User, err error) {
|
func UpdateUser(uid string, uu *structures.User) (a *structures.User, err error) {
|
||||||
if u, ok := UserList[uid]; ok {
|
if u, ok := UserList[uid]; ok {
|
||||||
if uu.Username != "" {
|
if uu.Username != "" {
|
||||||
u.Username = uu.Username
|
u.Username = uu.Username
|
||||||
@ -288,6 +274,7 @@ var apiControllers = `package controllers
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"{{.Appname}}/models"
|
"{{.Appname}}/models"
|
||||||
|
"{{.Appname}}/structures"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
|
||||||
"github.com/astaxie/beego"
|
"github.com/astaxie/beego"
|
||||||
@ -305,7 +292,7 @@ type ObjectController struct {
|
|||||||
// @Failure 403 body is empty
|
// @Failure 403 body is empty
|
||||||
// @router / [post]
|
// @router / [post]
|
||||||
func (o *ObjectController) Post() {
|
func (o *ObjectController) Post() {
|
||||||
var ob models.Object
|
var ob structures.Object
|
||||||
json.Unmarshal(o.Ctx.Input.RequestBody, &ob)
|
json.Unmarshal(o.Ctx.Input.RequestBody, &ob)
|
||||||
objectid := models.AddOne(ob)
|
objectid := models.AddOne(ob)
|
||||||
o.Data["json"] = map[string]string{"ObjectId": objectid}
|
o.Data["json"] = map[string]string{"ObjectId": objectid}
|
||||||
@ -351,7 +338,7 @@ func (o *ObjectController) GetAll() {
|
|||||||
// @router /:objectId [put]
|
// @router /:objectId [put]
|
||||||
func (o *ObjectController) Put() {
|
func (o *ObjectController) Put() {
|
||||||
objectId := o.Ctx.Input.Param(":objectId")
|
objectId := o.Ctx.Input.Param(":objectId")
|
||||||
var ob models.Object
|
var ob structures.Object
|
||||||
json.Unmarshal(o.Ctx.Input.RequestBody, &ob)
|
json.Unmarshal(o.Ctx.Input.RequestBody, &ob)
|
||||||
|
|
||||||
err := models.Update(objectId, ob.Score)
|
err := models.Update(objectId, ob.Score)
|
||||||
@ -377,10 +364,12 @@ func (o *ObjectController) Delete() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
`
|
`
|
||||||
|
|
||||||
var apiControllers2 = `package controllers
|
var apiControllers2 = `package controllers
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"{{.Appname}}/models"
|
"{{.Appname}}/models"
|
||||||
|
"{{.Appname}}/structures"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
|
||||||
"github.com/astaxie/beego"
|
"github.com/astaxie/beego"
|
||||||
@ -398,7 +387,7 @@ type UserController struct {
|
|||||||
// @Failure 403 body is empty
|
// @Failure 403 body is empty
|
||||||
// @router / [post]
|
// @router / [post]
|
||||||
func (u *UserController) Post() {
|
func (u *UserController) Post() {
|
||||||
var user models.User
|
var user structures.User
|
||||||
json.Unmarshal(u.Ctx.Input.RequestBody, &user)
|
json.Unmarshal(u.Ctx.Input.RequestBody, &user)
|
||||||
uid := models.AddUser(user)
|
uid := models.AddUser(user)
|
||||||
u.Data["json"] = map[string]string{"uid": uid}
|
u.Data["json"] = map[string]string{"uid": uid}
|
||||||
@ -444,7 +433,7 @@ func (u *UserController) Get() {
|
|||||||
func (u *UserController) Put() {
|
func (u *UserController) Put() {
|
||||||
uid := u.GetString(":uid")
|
uid := u.GetString(":uid")
|
||||||
if uid != "" {
|
if uid != "" {
|
||||||
var user models.User
|
var user structures.User
|
||||||
json.Unmarshal(u.Ctx.Input.RequestBody, &user)
|
json.Unmarshal(u.Ctx.Input.RequestBody, &user)
|
||||||
uu, err := models.UpdateUser(uid, &user)
|
uu, err := models.UpdateUser(uid, &user)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -538,6 +527,34 @@ func TestGet(t *testing.T) {
|
|||||||
|
|
||||||
`
|
`
|
||||||
|
|
||||||
|
var apistructures = `package structures
|
||||||
|
|
||||||
|
type User struct {
|
||||||
|
Id string
|
||||||
|
Username string
|
||||||
|
Password string
|
||||||
|
Profile Profile
|
||||||
|
}
|
||||||
|
|
||||||
|
type Profile struct {
|
||||||
|
Gender string
|
||||||
|
Age int
|
||||||
|
Address string
|
||||||
|
Email string
|
||||||
|
}
|
||||||
|
|
||||||
|
`
|
||||||
|
|
||||||
|
var apistructures2 = `package structures
|
||||||
|
|
||||||
|
type Object struct {
|
||||||
|
ObjectId string
|
||||||
|
Score int64
|
||||||
|
PlayerName string
|
||||||
|
}
|
||||||
|
|
||||||
|
`
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
cmdApiapp.Run = createapi
|
cmdApiapp.Run = createapi
|
||||||
cmdApiapp.Flag.Var(&tables, "tables", "specify tables to generate model")
|
cmdApiapp.Flag.Var(&tables, "tables", "specify tables to generate model")
|
||||||
@ -574,6 +591,8 @@ func createapi(cmd *Command, args []string) int {
|
|||||||
fmt.Println("create docs:", path.Join(apppath, "docs"))
|
fmt.Println("create docs:", path.Join(apppath, "docs"))
|
||||||
os.Mkdir(path.Join(apppath, "tests"), 0755)
|
os.Mkdir(path.Join(apppath, "tests"), 0755)
|
||||||
fmt.Println("create tests:", path.Join(apppath, "tests"))
|
fmt.Println("create tests:", path.Join(apppath, "tests"))
|
||||||
|
os.Mkdir(path.Join(apppath, "helpers"), 0755)
|
||||||
|
fmt.Println("create helpers:", path.Join(apppath, "helpers"))
|
||||||
|
|
||||||
fmt.Println("create conf app.conf:", path.Join(apppath, "conf", "app.conf"))
|
fmt.Println("create conf app.conf:", path.Join(apppath, "conf", "app.conf"))
|
||||||
writetofile(path.Join(apppath, "conf", "app.conf"),
|
writetofile(path.Join(apppath, "conf", "app.conf"),
|
||||||
@ -604,14 +623,16 @@ func createapi(cmd *Command, args []string) int {
|
|||||||
os.Mkdir(path.Join(apppath, "models"), 0755)
|
os.Mkdir(path.Join(apppath, "models"), 0755)
|
||||||
fmt.Println("create models:", path.Join(apppath, "models"))
|
fmt.Println("create models:", path.Join(apppath, "models"))
|
||||||
os.Mkdir(path.Join(apppath, "routers"), 0755)
|
os.Mkdir(path.Join(apppath, "routers"), 0755)
|
||||||
fmt.Println(path.Join(apppath, "routers") + string(path.Separator))
|
fmt.Println("create routers:", path.Join(apppath, "routers"))
|
||||||
|
os.Mkdir(path.Join(apppath, "structures"), 0755)
|
||||||
|
fmt.Println("create structures:", path.Join(apppath, "structures"))
|
||||||
|
|
||||||
fmt.Println("create controllers object.go:", path.Join(apppath, "controllers", "object.go"))
|
fmt.Println("create controllers object_controller.go:", path.Join(apppath, "controllers", "object_controller.go"))
|
||||||
writetofile(path.Join(apppath, "controllers", "object.go"),
|
writetofile(path.Join(apppath, "controllers", "object_controller.go"),
|
||||||
strings.Replace(apiControllers, "{{.Appname}}", packpath, -1))
|
strings.Replace(apiControllers, "{{.Appname}}", packpath, -1))
|
||||||
|
|
||||||
fmt.Println("create controllers user.go:", path.Join(apppath, "controllers", "user.go"))
|
fmt.Println("create controllers user_controller.go:", path.Join(apppath, "controllers", "user_controller.go"))
|
||||||
writetofile(path.Join(apppath, "controllers", "user.go"),
|
writetofile(path.Join(apppath, "controllers", "user_controller.go"),
|
||||||
strings.Replace(apiControllers2, "{{.Appname}}", packpath, -1))
|
strings.Replace(apiControllers2, "{{.Appname}}", packpath, -1))
|
||||||
|
|
||||||
fmt.Println("create tests default.go:", path.Join(apppath, "tests", "default_test.go"))
|
fmt.Println("create tests default.go:", path.Join(apppath, "tests", "default_test.go"))
|
||||||
@ -623,10 +644,24 @@ func createapi(cmd *Command, args []string) int {
|
|||||||
strings.Replace(apirouter, "{{.Appname}}", packpath, -1))
|
strings.Replace(apirouter, "{{.Appname}}", packpath, -1))
|
||||||
|
|
||||||
fmt.Println("create models object.go:", path.Join(apppath, "models", "object.go"))
|
fmt.Println("create models object.go:", path.Join(apppath, "models", "object.go"))
|
||||||
writetofile(path.Join(apppath, "models", "object.go"), apiModels)
|
writetofile(path.Join(apppath, "models", "object.go"),
|
||||||
|
strings.Replace(apiModels, "{{.Appname}}", packpath, -1))
|
||||||
|
|
||||||
fmt.Println("create models user.go:", path.Join(apppath, "models", "user.go"))
|
fmt.Println("create models user.go:", path.Join(apppath, "models", "user.go"))
|
||||||
writetofile(path.Join(apppath, "models", "user.go"), apiModels2)
|
writetofile(path.Join(apppath, "models", "user.go"),
|
||||||
|
strings.Replace(apiModels2, "{{.Appname}}", packpath, -1))
|
||||||
|
|
||||||
|
fmt.Println("create structures user_structure.go:", path.Join(apppath, "structures", "user_structure.go"))
|
||||||
|
writetofile(path.Join(apppath, "structures", "user_structure.go"), apistructures)
|
||||||
|
|
||||||
|
fmt.Println("create structures object_structure.go:", path.Join(apppath, "structures", "object_structure.go"))
|
||||||
|
writetofile(path.Join(apppath, "structures", "object_structure.go"), apistructures2)
|
||||||
|
|
||||||
|
fmt.Println("create helpers user_helper.go:", path.Join(apppath, "helpers", "user_helper.go"))
|
||||||
|
writetofile(path.Join(apppath, "helpers", "user_helper.go"), "package helpers")
|
||||||
|
|
||||||
|
fmt.Println("create helpers object_helper.go:", path.Join(apppath, "helpers", "object_helper.go"))
|
||||||
|
writetofile(path.Join(apppath, "helpers", "object_helper.go"), "package helpers")
|
||||||
|
|
||||||
fmt.Println("create docs doc.go:", path.Join(apppath, "docs", "doc.go"))
|
fmt.Println("create docs doc.go:", path.Join(apppath, "docs", "doc.go"))
|
||||||
writetofile(path.Join(apppath, "docs", "doc.go"), "package docs")
|
writetofile(path.Join(apppath, "docs", "doc.go"), "package docs")
|
||||||
|
63
g.go
63
g.go
@ -27,8 +27,14 @@ bee generate scaffold [scaffoldname] [-fields=""] [-driver=mysql] [-conn="root:@
|
|||||||
-conn: the connection string used by the driver, the default is root:@tcp(127.0.0.1:3306)/test
|
-conn: the connection string used by the driver, the default is root:@tcp(127.0.0.1:3306)/test
|
||||||
example: bee generate scaffold post -fields="title:string,body:text"
|
example: bee generate scaffold post -fields="title:string,body:text"
|
||||||
|
|
||||||
|
bee generate structure [structurename]
|
||||||
|
bee generate structure [structurename] [-fields=""]
|
||||||
|
generate struct based
|
||||||
|
-fields: a list of table fields. Format: field:type, ...
|
||||||
|
|
||||||
|
bee generate model [modelname]
|
||||||
bee generate model [modelname] [-fields=""]
|
bee generate model [modelname] [-fields=""]
|
||||||
generate RESTFul model based on fields
|
generate RESTFul model based
|
||||||
-fields: a list of table fields. Format: field:type, ...
|
-fields: a list of table fields. Format: field:type, ...
|
||||||
|
|
||||||
bee generate controller [controllerfile]
|
bee generate controller [controllerfile]
|
||||||
@ -44,6 +50,9 @@ bee generate migration [migrationfile] [-fields=""]
|
|||||||
bee generate docs
|
bee generate docs
|
||||||
generate swagger doc file
|
generate swagger doc file
|
||||||
|
|
||||||
|
bee generate helper [filename]
|
||||||
|
generate helper file
|
||||||
|
|
||||||
bee generate test [routerfile]
|
bee generate test [routerfile]
|
||||||
generate testcase
|
generate testcase
|
||||||
|
|
||||||
@ -170,6 +179,15 @@ func generateCode(cmd *Command, args []string) int {
|
|||||||
downsql = `m.SQL("DROP TABLE ` + "`" + mname + "`" + `")`
|
downsql = `m.SQL("DROP TABLE ` + "`" + mname + "`" + `")`
|
||||||
}
|
}
|
||||||
generateMigration(mname, upsql, downsql, curpath)
|
generateMigration(mname, upsql, downsql, curpath)
|
||||||
|
case "helper":
|
||||||
|
if len(args) == 2 {
|
||||||
|
cname := args[1]
|
||||||
|
generateHelper(cname, curpath)
|
||||||
|
} else {
|
||||||
|
ColorLog("[ERRO] Wrong number of arguments\n")
|
||||||
|
ColorLog("[HINT] Usage: bee generate helper [helpername]\n")
|
||||||
|
os.Exit(2)
|
||||||
|
}
|
||||||
case "controller":
|
case "controller":
|
||||||
if len(args) == 2 {
|
if len(args) == 2 {
|
||||||
cname := args[1]
|
cname := args[1]
|
||||||
@ -179,25 +197,52 @@ func generateCode(cmd *Command, args []string) int {
|
|||||||
ColorLog("[HINT] Usage: bee generate controller [controllername]\n")
|
ColorLog("[HINT] Usage: bee generate controller [controllername]\n")
|
||||||
os.Exit(2)
|
os.Exit(2)
|
||||||
}
|
}
|
||||||
case "model":
|
case "structure":
|
||||||
if len(args) < 2 {
|
sname := args[1]
|
||||||
|
switch len(args) {
|
||||||
|
case 2:
|
||||||
|
generateStructure(sname, "", curpath)
|
||||||
|
case 3:
|
||||||
|
cmd.Flag.Parse(args[2:])
|
||||||
|
if fields == "" {
|
||||||
ColorLog("[ERRO] Wrong number of arguments\n")
|
ColorLog("[ERRO] Wrong number of arguments\n")
|
||||||
ColorLog("[HINT] Usage: bee generate model [modelname] [-fields=\"\"]\n")
|
ColorLog("[HINT] Usage: bee generate structure [structurename] [-fields=\"title:string,body:text\"]\n")
|
||||||
os.Exit(2)
|
os.Exit(2)
|
||||||
}
|
}
|
||||||
|
sname := args[1]
|
||||||
|
ColorLog("[INFO] Using '%s' as structure name\n", sname)
|
||||||
|
generateStructure(sname, fields.String(), curpath)
|
||||||
|
default:
|
||||||
|
ColorLog("[ERRO] Wrong number of arguments\n")
|
||||||
|
ColorLog("[HINT] Usage: bee generate structure [structurename]\n")
|
||||||
|
ColorLog("[HINT] Usage: bee generate structure [structurename] [-fields=\"title:string,body:text\"]\n")
|
||||||
|
os.Exit(2)
|
||||||
|
|
||||||
|
}
|
||||||
|
case "model":
|
||||||
|
mname := args[1]
|
||||||
|
switch len(args) {
|
||||||
|
case 2:
|
||||||
|
generateModel(mname, "", curpath)
|
||||||
|
case 3:
|
||||||
cmd.Flag.Parse(args[2:])
|
cmd.Flag.Parse(args[2:])
|
||||||
if fields == "" {
|
if fields == "" {
|
||||||
ColorLog("[ERRO] Wrong number of arguments\n")
|
ColorLog("[ERRO] Wrong number of arguments\n")
|
||||||
ColorLog("[HINT] Usage: bee generate model [modelname] [-fields=\"title:string,body:text\"]\n")
|
ColorLog("[HINT] Usage: bee generate model [modelname] [-fields=\"title:string,body:text\"]\n")
|
||||||
os.Exit(2)
|
os.Exit(2)
|
||||||
}
|
}
|
||||||
sname := args[1]
|
ColorLog("[INFO] Using '%s' as model name\n", mname)
|
||||||
ColorLog("[INFO] Using '%s' as model name\n", sname)
|
generateModel(mname, fields.String(), curpath)
|
||||||
generateModel(sname, fields.String(), curpath)
|
default:
|
||||||
|
ColorLog("[ERRO] Wrong number of arguments\n")
|
||||||
|
ColorLog("[HINT] Usage: bee generate model [modelname]\n")
|
||||||
|
ColorLog("[HINT] Usage: bee generate model [modelname] [-fields=\"\"]\n")
|
||||||
|
os.Exit(2)
|
||||||
|
}
|
||||||
case "view":
|
case "view":
|
||||||
if len(args) == 2 {
|
if len(args) == 2 {
|
||||||
cname := args[1]
|
vname := args[1]
|
||||||
generateView(cname, curpath)
|
generateView(vname, curpath)
|
||||||
} else {
|
} else {
|
||||||
ColorLog("[ERRO] Wrong number of arguments\n")
|
ColorLog("[ERRO] Wrong number of arguments\n")
|
||||||
ColorLog("[HINT] Usage: bee generate view [viewpath]\n")
|
ColorLog("[HINT] Usage: bee generate view [viewpath]\n")
|
||||||
|
129
g_appcode.go
129
g_appcode.go
@ -32,6 +32,7 @@ const (
|
|||||||
O_MODEL byte = 1 << iota
|
O_MODEL byte = 1 << iota
|
||||||
O_CONTROLLER
|
O_CONTROLLER
|
||||||
O_ROUTER
|
O_ROUTER
|
||||||
|
O_STRUCTURE
|
||||||
)
|
)
|
||||||
|
|
||||||
// DbTransformer has method to reverse engineer a database schema to restful api code
|
// DbTransformer has method to reverse engineer a database schema to restful api code
|
||||||
@ -60,6 +61,7 @@ type MvcPath struct {
|
|||||||
ModelPath string
|
ModelPath string
|
||||||
ControllerPath string
|
ControllerPath string
|
||||||
RouterPath string
|
RouterPath string
|
||||||
|
StructurePath string
|
||||||
}
|
}
|
||||||
|
|
||||||
// typeMapping maps SQL data type to corresponding Go data type
|
// typeMapping maps SQL data type to corresponding Go data type
|
||||||
@ -263,7 +265,7 @@ func generateAppcode(driver, connStr, level, tables, currpath string) {
|
|||||||
case "2":
|
case "2":
|
||||||
mode = O_MODEL | O_CONTROLLER
|
mode = O_MODEL | O_CONTROLLER
|
||||||
case "3":
|
case "3":
|
||||||
mode = O_MODEL | O_CONTROLLER | O_ROUTER
|
mode = O_MODEL | O_CONTROLLER | O_ROUTER | O_STRUCTURE
|
||||||
default:
|
default:
|
||||||
ColorLog("[ERRO] Invalid 'level' option: %s\n", level)
|
ColorLog("[ERRO] Invalid 'level' option: %s\n", level)
|
||||||
ColorLog("[HINT] Level must be either 1, 2 or 3\n")
|
ColorLog("[HINT] Level must be either 1, 2 or 3\n")
|
||||||
@ -307,6 +309,7 @@ func gen(dbms, connStr string, mode byte, selectedTableNames map[string]bool, cu
|
|||||||
mvcPath.ModelPath = path.Join(currpath, "models")
|
mvcPath.ModelPath = path.Join(currpath, "models")
|
||||||
mvcPath.ControllerPath = path.Join(currpath, "controllers")
|
mvcPath.ControllerPath = path.Join(currpath, "controllers")
|
||||||
mvcPath.RouterPath = path.Join(currpath, "routers")
|
mvcPath.RouterPath = path.Join(currpath, "routers")
|
||||||
|
mvcPath.StructurePath = path.Join(currpath, "structures")
|
||||||
createPaths(mode, mvcPath)
|
createPaths(mode, mvcPath)
|
||||||
pkgPath := getPackagePath(currpath)
|
pkgPath := getPackagePath(currpath)
|
||||||
writeSourceFiles(pkgPath, tables, mode, mvcPath, selectedTableNames)
|
writeSourceFiles(pkgPath, tables, mode, mvcPath, selectedTableNames)
|
||||||
@ -705,15 +708,22 @@ func createPaths(mode byte, paths *MvcPath) {
|
|||||||
if (mode & O_ROUTER) == O_ROUTER {
|
if (mode & O_ROUTER) == O_ROUTER {
|
||||||
os.Mkdir(paths.RouterPath, 0777)
|
os.Mkdir(paths.RouterPath, 0777)
|
||||||
}
|
}
|
||||||
|
if (mode & O_STRUCTURE) == O_STRUCTURE {
|
||||||
|
os.Mkdir(paths.StructurePath, 0777)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// writeSourceFiles generates source files for model/controller/router
|
// writeSourceFiles generates source files for model/controller/router
|
||||||
// It will wipe the following directories and recreate them:./models, ./controllers, ./routers
|
// It will wipe the following directories and recreate them:./models, ./controllers, ./routers
|
||||||
// Newly geneated files will be inside these folders.
|
// Newly geneated files will be inside these folders.
|
||||||
func writeSourceFiles(pkgPath string, tables []*Table, mode byte, paths *MvcPath, selectedTables map[string]bool) {
|
func writeSourceFiles(pkgPath string, tables []*Table, mode byte, paths *MvcPath, selectedTables map[string]bool) {
|
||||||
|
if (O_STRUCTURE & mode) == O_STRUCTURE {
|
||||||
|
ColorLog("[INFO] Creating structure files...\n")
|
||||||
|
writeStructureFiles(tables, paths.StructurePath, selectedTables)
|
||||||
|
}
|
||||||
if (O_MODEL & mode) == O_MODEL {
|
if (O_MODEL & mode) == O_MODEL {
|
||||||
ColorLog("[INFO] Creating model files...\n")
|
ColorLog("[INFO] Creating model files...\n")
|
||||||
writeModelFiles(tables, paths.ModelPath, selectedTables)
|
writeModelFiles(tables, paths.ModelPath, selectedTables, pkgPath)
|
||||||
}
|
}
|
||||||
if (O_CONTROLLER & mode) == O_CONTROLLER {
|
if (O_CONTROLLER & mode) == O_CONTROLLER {
|
||||||
ColorLog("[INFO] Creating controller files...\n")
|
ColorLog("[INFO] Creating controller files...\n")
|
||||||
@ -726,7 +736,7 @@ func writeSourceFiles(pkgPath string, tables []*Table, mode byte, paths *MvcPath
|
|||||||
}
|
}
|
||||||
|
|
||||||
// writeModelFiles generates model files
|
// writeModelFiles generates model files
|
||||||
func writeModelFiles(tables []*Table, mPath string, selectedTables map[string]bool) {
|
func writeModelFiles(tables []*Table, mPath string, selectedTables map[string]bool, pkgPath string) {
|
||||||
for _, tb := range tables {
|
for _, tb := range tables {
|
||||||
// if selectedTables map is not nil and this table is not selected, ignore it
|
// if selectedTables map is not nil and this table is not selected, ignore it
|
||||||
if selectedTables != nil {
|
if selectedTables != nil {
|
||||||
@ -763,7 +773,7 @@ func writeModelFiles(tables []*Table, mPath string, selectedTables map[string]bo
|
|||||||
} else {
|
} else {
|
||||||
template = MODEL_TPL
|
template = MODEL_TPL
|
||||||
}
|
}
|
||||||
fileStr := strings.Replace(template, "{{modelStruct}}", tb.String(), 1)
|
fileStr := strings.Replace(template, "{{pkgPath}}", pkgPath, -1)
|
||||||
fileStr = strings.Replace(fileStr, "{{modelName}}", camelCase(tb.Name), -1)
|
fileStr = strings.Replace(fileStr, "{{modelName}}", camelCase(tb.Name), -1)
|
||||||
fileStr = strings.Replace(fileStr, "{{tableName}}", tb.Name, -1)
|
fileStr = strings.Replace(fileStr, "{{tableName}}", tb.Name, -1)
|
||||||
// if table contains time field, import time.Time package
|
// if table contains time field, import time.Time package
|
||||||
@ -785,6 +795,61 @@ func writeModelFiles(tables []*Table, mPath string, selectedTables map[string]bo
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// writeStructureFiles generates structure files
|
||||||
|
func writeStructureFiles(tables []*Table, mPath string, selectedTables map[string]bool) {
|
||||||
|
for _, tb := range tables {
|
||||||
|
// if selectedTables map is not nil and this table is not selected, ignore it
|
||||||
|
if selectedTables != nil {
|
||||||
|
if _, selected := selectedTables[tb.Name]; !selected {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
filename := getFileName(tb.Name)
|
||||||
|
fpath := path.Join(mPath, filename+"_structure.go")
|
||||||
|
var f *os.File
|
||||||
|
var err error
|
||||||
|
if isExist(fpath) {
|
||||||
|
ColorLog("[WARN] %v is exist, do you want to overwrite it? Yes or No?\n", fpath)
|
||||||
|
if askForConfirmation() {
|
||||||
|
f, err = os.OpenFile(fpath, os.O_RDWR|os.O_TRUNC, 0666)
|
||||||
|
if err != nil {
|
||||||
|
ColorLog("[WARN] %v\n", err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
ColorLog("[WARN] skip create file\n")
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
f, err = os.OpenFile(fpath, os.O_CREATE|os.O_RDWR, 0666)
|
||||||
|
if err != nil {
|
||||||
|
ColorLog("[WARN] %v\n", err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
template := STRUCT_TPL
|
||||||
|
fileStr := strings.Replace(template, "{{Struct}}", tb.String(), 1)
|
||||||
|
fileStr = strings.Replace(fileStr, "{{modelName}}", camelCase(tb.Name), -1)
|
||||||
|
fileStr = strings.Replace(fileStr, "{{tableName}}", tb.Name, -1)
|
||||||
|
// if table contains time field, import time.Time package
|
||||||
|
timePkg := ""
|
||||||
|
importTimePkg := ""
|
||||||
|
if tb.ImportTimePkg {
|
||||||
|
timePkg = "\"time\"\n"
|
||||||
|
importTimePkg = "import \"time\"\n"
|
||||||
|
}
|
||||||
|
fileStr = strings.Replace(fileStr, "{{timePkg}}", timePkg, -1)
|
||||||
|
fileStr = strings.Replace(fileStr, "{{importTimePkg}}", importTimePkg, -1)
|
||||||
|
if _, err := f.WriteString(fileStr); err != nil {
|
||||||
|
ColorLog("[ERRO] Could not write model file to %s\n", fpath)
|
||||||
|
os.Exit(2)
|
||||||
|
}
|
||||||
|
f.Close()
|
||||||
|
ColorLog("[INFO] structure => %s\n", fpath)
|
||||||
|
formatSourceCode(fpath)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// writeControllerFiles generates controller files
|
// writeControllerFiles generates controller files
|
||||||
func writeControllerFiles(tables []*Table, cPath string, selectedTables map[string]bool, pkgPath string) {
|
func writeControllerFiles(tables []*Table, cPath string, selectedTables map[string]bool, pkgPath string) {
|
||||||
for _, tb := range tables {
|
for _, tb := range tables {
|
||||||
@ -798,7 +863,7 @@ func writeControllerFiles(tables []*Table, cPath string, selectedTables map[stri
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
filename := getFileName(tb.Name)
|
filename := getFileName(tb.Name)
|
||||||
fpath := path.Join(cPath, filename+".go")
|
fpath := path.Join(cPath, filename+"_controller.go")
|
||||||
var f *os.File
|
var f *os.File
|
||||||
var err error
|
var err error
|
||||||
if isExist(fpath) {
|
if isExist(fpath) {
|
||||||
@ -996,14 +1061,21 @@ func getPackagePath(curpath string) (packpath string) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const (
|
const (
|
||||||
STRUCT_MODEL_TPL = `package models
|
STRUCT_TPL = `package structures
|
||||||
{{importTimePkg}}
|
{{importTimePkg}}
|
||||||
{{modelStruct}}
|
{{Struct}}
|
||||||
|
|
||||||
|
func (t *{{modelName}}) TableName() string {
|
||||||
|
return "{{tableName}}"
|
||||||
|
}
|
||||||
|
`
|
||||||
|
STRUCT_MODEL_TPL = `package models
|
||||||
`
|
`
|
||||||
|
|
||||||
MODEL_TPL = `package models
|
MODEL_TPL = `package models
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"{{pkgPath}}/structures"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"reflect"
|
"reflect"
|
||||||
@ -1012,19 +1084,13 @@ import (
|
|||||||
"github.com/astaxie/beego/orm"
|
"github.com/astaxie/beego/orm"
|
||||||
)
|
)
|
||||||
|
|
||||||
{{modelStruct}}
|
|
||||||
|
|
||||||
func (t *{{modelName}}) TableName() string {
|
|
||||||
return "{{tableName}}"
|
|
||||||
}
|
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
orm.RegisterModel(new({{modelName}}))
|
orm.RegisterModel(new(structures.{{modelName}}))
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add {{modelName}} insert a new {{modelName}} into database and returns
|
// Add {{modelName}} insert a new {{modelName}} into database and returns
|
||||||
// last inserted Id on success.
|
// last inserted Id on success.
|
||||||
func Add{{modelName}}(m *{{modelName}}) (id int64, err error) {
|
func Add{{modelName}}(m *structures.{{modelName}}) (id int64, err error) {
|
||||||
o := orm.NewOrm()
|
o := orm.NewOrm()
|
||||||
id, err = o.Insert(m)
|
id, err = o.Insert(m)
|
||||||
return
|
return
|
||||||
@ -1032,9 +1098,9 @@ func Add{{modelName}}(m *{{modelName}}) (id int64, err error) {
|
|||||||
|
|
||||||
// Get{{modelName}}ById retrieves {{modelName}} by Id. Returns error if
|
// Get{{modelName}}ById retrieves {{modelName}} by Id. Returns error if
|
||||||
// Id doesn't exist
|
// Id doesn't exist
|
||||||
func Get{{modelName}}ById(id int) (v *{{modelName}}, err error) {
|
func Get{{modelName}}ById(id int) (v *structures.{{modelName}}, err error) {
|
||||||
o := orm.NewOrm()
|
o := orm.NewOrm()
|
||||||
v = &{{modelName}}{Id: id}
|
v = &structures.{{modelName}}{Id: id}
|
||||||
if err = o.Read(v); err == nil {
|
if err = o.Read(v); err == nil {
|
||||||
return v, nil
|
return v, nil
|
||||||
}
|
}
|
||||||
@ -1046,7 +1112,7 @@ func Get{{modelName}}ById(id int) (v *{{modelName}}, err error) {
|
|||||||
func GetAll{{modelName}}(query map[string]string, fields []string, sortby []string, order []string,
|
func GetAll{{modelName}}(query map[string]string, fields []string, sortby []string, order []string,
|
||||||
offset int64, limit int64) (ml []interface{}, err error) {
|
offset int64, limit int64) (ml []interface{}, err error) {
|
||||||
o := orm.NewOrm()
|
o := orm.NewOrm()
|
||||||
qs := o.QueryTable(new({{modelName}}))
|
qs := o.QueryTable(new(structures.{{modelName}}))
|
||||||
// query k=v
|
// query k=v
|
||||||
for k, v := range query {
|
for k, v := range query {
|
||||||
// rewrite dot-notation to Object__Attribute
|
// rewrite dot-notation to Object__Attribute
|
||||||
@ -1092,7 +1158,7 @@ func GetAll{{modelName}}(query map[string]string, fields []string, sortby []stri
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var l []{{modelName}}
|
var l []structures.{{modelName}}
|
||||||
qs = qs.OrderBy(sortFields...)
|
qs = qs.OrderBy(sortFields...)
|
||||||
if _, err := qs.Limit(limit, offset).All(&l, fields...); err == nil {
|
if _, err := qs.Limit(limit, offset).All(&l, fields...); err == nil {
|
||||||
if len(fields) == 0 {
|
if len(fields) == 0 {
|
||||||
@ -1117,9 +1183,9 @@ func GetAll{{modelName}}(query map[string]string, fields []string, sortby []stri
|
|||||||
|
|
||||||
// Update{{modelName}} updates {{modelName}} by Id and returns error if
|
// Update{{modelName}} updates {{modelName}} by Id and returns error if
|
||||||
// the record to be updated doesn't exist
|
// the record to be updated doesn't exist
|
||||||
func Update{{modelName}}ById(m *{{modelName}}) (err error) {
|
func Update{{modelName}}ById(m *structures.{{modelName}}) (err error) {
|
||||||
o := orm.NewOrm()
|
o := orm.NewOrm()
|
||||||
v := {{modelName}}{Id: m.Id}
|
v := structures.{{modelName}}{Id: m.Id}
|
||||||
// ascertain id exists in the database
|
// ascertain id exists in the database
|
||||||
if err = o.Read(&v); err == nil {
|
if err = o.Read(&v); err == nil {
|
||||||
var num int64
|
var num int64
|
||||||
@ -1134,11 +1200,11 @@ func Update{{modelName}}ById(m *{{modelName}}) (err error) {
|
|||||||
// the record to be deleted doesn't exist
|
// the record to be deleted doesn't exist
|
||||||
func Delete{{modelName}}(id int) (err error) {
|
func Delete{{modelName}}(id int) (err error) {
|
||||||
o := orm.NewOrm()
|
o := orm.NewOrm()
|
||||||
v := {{modelName}}{Id: id}
|
v := structures.{{modelName}}{Id: id}
|
||||||
// ascertain id exists in the database
|
// ascertain id exists in the database
|
||||||
if err = o.Read(&v); err == nil {
|
if err = o.Read(&v); err == nil {
|
||||||
var num int64
|
var num int64
|
||||||
if num, err = o.Delete(&{{modelName}}{Id: id}); err == nil {
|
if num, err = o.Delete(&structures.{{modelName}}{Id: id}); err == nil {
|
||||||
fmt.Println("Number of records deleted in database:", num)
|
fmt.Println("Number of records deleted in database:", num)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1148,6 +1214,7 @@ func Delete{{modelName}}(id int) (err error) {
|
|||||||
CTRL_TPL = `package controllers
|
CTRL_TPL = `package controllers
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"{{pkgPath}}/structures"
|
||||||
"{{pkgPath}}/models"
|
"{{pkgPath}}/models"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"errors"
|
"errors"
|
||||||
@ -1172,12 +1239,12 @@ func (c *{{ctrlName}}Controller) URLMapping() {
|
|||||||
|
|
||||||
// @Title Post
|
// @Title Post
|
||||||
// @Description create {{ctrlName}}
|
// @Description create {{ctrlName}}
|
||||||
// @Param body body models.{{ctrlName}} true "body for {{ctrlName}} content"
|
// @Param body body structures.{{ctrlName}} true "body for {{ctrlName}} content"
|
||||||
// @Success 201 {int} models.{{ctrlName}}
|
// @Success 201 {int} structures.{{ctrlName}}
|
||||||
// @Failure 403 body is empty
|
// @Failure 403 body is empty
|
||||||
// @router / [post]
|
// @router / [post]
|
||||||
func (c *{{ctrlName}}Controller) Post() {
|
func (c *{{ctrlName}}Controller) Post() {
|
||||||
var v models.{{ctrlName}}
|
var v structures.{{ctrlName}}
|
||||||
if err := json.Unmarshal(c.Ctx.Input.RequestBody, &v); err == nil {
|
if err := json.Unmarshal(c.Ctx.Input.RequestBody, &v); err == nil {
|
||||||
if _, err := models.Add{{ctrlName}}(&v); err == nil {
|
if _, err := models.Add{{ctrlName}}(&v); err == nil {
|
||||||
c.Ctx.Output.SetStatus(201)
|
c.Ctx.Output.SetStatus(201)
|
||||||
@ -1194,7 +1261,7 @@ func (c *{{ctrlName}}Controller) Post() {
|
|||||||
// @Title Get
|
// @Title Get
|
||||||
// @Description get {{ctrlName}} by id
|
// @Description get {{ctrlName}} by id
|
||||||
// @Param id path string true "The key for staticblock"
|
// @Param id path string true "The key for staticblock"
|
||||||
// @Success 200 {object} models.{{ctrlName}}
|
// @Success 200 {object} structures.{{ctrlName}}
|
||||||
// @Failure 403 :id is empty
|
// @Failure 403 :id is empty
|
||||||
// @router /:id [get]
|
// @router /:id [get]
|
||||||
func (c *{{ctrlName}}Controller) GetOne() {
|
func (c *{{ctrlName}}Controller) GetOne() {
|
||||||
@ -1217,7 +1284,7 @@ func (c *{{ctrlName}}Controller) GetOne() {
|
|||||||
// @Param order query string false "Order corresponding to each sortby field, if single value, apply to all sortby fields. e.g. desc,asc ..."
|
// @Param order query string false "Order corresponding to each sortby field, if single value, apply to all sortby fields. e.g. desc,asc ..."
|
||||||
// @Param limit query string false "Limit the size of result set. Must be an integer"
|
// @Param limit query string false "Limit the size of result set. Must be an integer"
|
||||||
// @Param offset query string false "Start position of result set. Must be an integer"
|
// @Param offset query string false "Start position of result set. Must be an integer"
|
||||||
// @Success 200 {object} models.{{ctrlName}}
|
// @Success 200 {object} structures.{{ctrlName}}
|
||||||
// @Failure 403
|
// @Failure 403
|
||||||
// @router / [get]
|
// @router / [get]
|
||||||
func (c *{{ctrlName}}Controller) GetAll() {
|
func (c *{{ctrlName}}Controller) GetAll() {
|
||||||
@ -1274,14 +1341,14 @@ func (c *{{ctrlName}}Controller) GetAll() {
|
|||||||
// @Title Update
|
// @Title Update
|
||||||
// @Description update the {{ctrlName}}
|
// @Description update the {{ctrlName}}
|
||||||
// @Param id path string true "The id you want to update"
|
// @Param id path string true "The id you want to update"
|
||||||
// @Param body body models.{{ctrlName}} true "body for {{ctrlName}} content"
|
// @Param body body structures.{{ctrlName}} true "body for {{ctrlName}} content"
|
||||||
// @Success 200 {object} models.{{ctrlName}}
|
// @Success 200 {object} structures.{{ctrlName}}
|
||||||
// @Failure 403 :id is not int
|
// @Failure 403 :id is not int
|
||||||
// @router /:id [put]
|
// @router /:id [put]
|
||||||
func (c *{{ctrlName}}Controller) Put() {
|
func (c *{{ctrlName}}Controller) Put() {
|
||||||
idStr := c.Ctx.Input.Param(":id")
|
idStr := c.Ctx.Input.Param(":id")
|
||||||
id, _ := strconv.Atoi(idStr)
|
id, _ := strconv.Atoi(idStr)
|
||||||
v := models.{{ctrlName}}{Id: id}
|
v := structures.{{ctrlName}}{Id: id}
|
||||||
if err := json.Unmarshal(c.Ctx.Input.RequestBody, &v); err == nil {
|
if err := json.Unmarshal(c.Ctx.Input.RequestBody, &v); err == nil {
|
||||||
if err := models.Update{{ctrlName}}ById(&v); err == nil {
|
if err := models.Update{{ctrlName}}ById(&v); err == nil {
|
||||||
c.Data["json"] = "OK"
|
c.Data["json"] = "OK"
|
||||||
|
@ -41,7 +41,7 @@ func generateController(cname, crupath string) {
|
|||||||
os.Exit(2)
|
os.Exit(2)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
fpath := path.Join(fp, strings.ToLower(controllerName)+".go")
|
fpath := path.Join(fp, strings.ToLower(controllerName)+"_controller.go")
|
||||||
if f, err := os.OpenFile(fpath, os.O_CREATE|os.O_EXCL|os.O_RDWR, 0666); err == nil {
|
if f, err := os.OpenFile(fpath, os.O_CREATE|os.O_EXCL|os.O_RDWR, 0666); err == nil {
|
||||||
defer f.Close()
|
defer f.Close()
|
||||||
modelPath := path.Join(crupath, "models", strings.ToLower(controllerName)+".go")
|
modelPath := path.Join(crupath, "models", strings.ToLower(controllerName)+".go")
|
||||||
@ -146,6 +146,7 @@ var controllerModelTpl = `package {{packageName}}
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"{{pkgPath}}/models"
|
"{{pkgPath}}/models"
|
||||||
|
"{{pkgPath}}/structures"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"errors"
|
"errors"
|
||||||
"strconv"
|
"strconv"
|
||||||
@ -174,7 +175,7 @@ func (c *{{controllerName}}Controller) URLMapping() {
|
|||||||
// @Failure 403 body is empty
|
// @Failure 403 body is empty
|
||||||
// @router / [post]
|
// @router / [post]
|
||||||
func (c *{{controllerName}}Controller) Post() {
|
func (c *{{controllerName}}Controller) Post() {
|
||||||
var v models.{{controllerName}}
|
var v structures.{{controllerName}}
|
||||||
json.Unmarshal(c.Ctx.Input.RequestBody, &v)
|
json.Unmarshal(c.Ctx.Input.RequestBody, &v)
|
||||||
if _, err := models.Add{{controllerName}}(&v); err == nil {
|
if _, err := models.Add{{controllerName}}(&v); err == nil {
|
||||||
c.Ctx.Output.SetStatus(201)
|
c.Ctx.Output.SetStatus(201)
|
||||||
@ -275,7 +276,7 @@ func (c *{{controllerName}}Controller) GetAll() {
|
|||||||
func (c *{{controllerName}}Controller) Put() {
|
func (c *{{controllerName}}Controller) Put() {
|
||||||
idStr := c.Ctx.Input.Param(":id")
|
idStr := c.Ctx.Input.Param(":id")
|
||||||
id, _ := strconv.ParseInt(idStr, 0, 64)
|
id, _ := strconv.ParseInt(idStr, 0, 64)
|
||||||
v := models.{{controllerName}}{Id: id}
|
v := structures.{{controllerName}}{Id: id}
|
||||||
json.Unmarshal(c.Ctx.Input.RequestBody, &v)
|
json.Unmarshal(c.Ctx.Input.RequestBody, &v)
|
||||||
if err := models.Update{{controllerName}}ById(&v); err == nil {
|
if err := models.Update{{controllerName}}ById(&v); err == nil {
|
||||||
c.Data["json"] = "OK"
|
c.Data["json"] = "OK"
|
50
g_helper.go
Normal file
50
g_helper.go
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"os"
|
||||||
|
"path"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
func generateHelper(cname, crupath string) {
|
||||||
|
p, f := path.Split(cname)
|
||||||
|
helperName := strings.Title(f)
|
||||||
|
packageName := "helpers"
|
||||||
|
if p != "" {
|
||||||
|
i := strings.LastIndex(p[:len(p)-1], "/")
|
||||||
|
packageName = p[i+1 : len(p)-1]
|
||||||
|
}
|
||||||
|
ColorLog("[INFO] Using '%s' as helpers name\n", helperName)
|
||||||
|
ColorLog("[INFO] Using '%s' as package name\n", packageName)
|
||||||
|
fp := path.Join(crupath, "helpers", p)
|
||||||
|
if _, err := os.Stat(fp); os.IsNotExist(err) {
|
||||||
|
// create controller directory
|
||||||
|
if err := os.MkdirAll(fp, 0777); err != nil {
|
||||||
|
ColorLog("[ERRO] Could not create helpers directory: %s\n", err)
|
||||||
|
os.Exit(2)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fpath := path.Join(fp, strings.ToLower(helperName)+"_helper.go")
|
||||||
|
if f, err := os.OpenFile(fpath, os.O_CREATE|os.O_EXCL|os.O_RDWR, 0666); err == nil {
|
||||||
|
defer f.Close()
|
||||||
|
content := strings.Replace(BASE_HELPER_TPL, "{{packageName}}", packageName, -1)
|
||||||
|
content = strings.Replace(content, "{{helperName}}", helperName, -1)
|
||||||
|
f.WriteString(content)
|
||||||
|
// gofmt generated source code
|
||||||
|
formatSourceCode(fpath)
|
||||||
|
ColorLog("[INFO] helpers file generated: %s\n", fpath)
|
||||||
|
} else {
|
||||||
|
// error creating file
|
||||||
|
ColorLog("[ERRO] Could not create helper file: %s\n", err)
|
||||||
|
os.Exit(2)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const (
|
||||||
|
BASE_HELPER_TPL = `package {{packageName}}
|
||||||
|
|
||||||
|
func {{helperName}}() {
|
||||||
|
|
||||||
|
}
|
||||||
|
`
|
||||||
|
)
|
@ -31,7 +31,7 @@ func generateHproseAppcode(driver, connStr, level, tables, currpath string) {
|
|||||||
var mode byte
|
var mode byte
|
||||||
switch level {
|
switch level {
|
||||||
case "1":
|
case "1":
|
||||||
mode = O_MODEL
|
mode = O_MODEL | O_STRUCTURE
|
||||||
case "2":
|
case "2":
|
||||||
mode = O_MODEL | O_CONTROLLER
|
mode = O_MODEL | O_CONTROLLER
|
||||||
case "3":
|
case "3":
|
||||||
@ -77,6 +77,7 @@ func genHprose(dbms, connStr string, mode byte, selectedTableNames map[string]bo
|
|||||||
tables := getTableObjects(tableNames, db, trans)
|
tables := getTableObjects(tableNames, db, trans)
|
||||||
mvcPath := new(MvcPath)
|
mvcPath := new(MvcPath)
|
||||||
mvcPath.ModelPath = path.Join(currpath, "models")
|
mvcPath.ModelPath = path.Join(currpath, "models")
|
||||||
|
mvcPath.StructurePath = path.Join(currpath, "structures")
|
||||||
createPaths(mode, mvcPath)
|
createPaths(mode, mvcPath)
|
||||||
pkgPath := getPackagePath(currpath)
|
pkgPath := getPackagePath(currpath)
|
||||||
writeHproseSourceFiles(pkgPath, tables, mode, mvcPath, selectedTableNames)
|
writeHproseSourceFiles(pkgPath, tables, mode, mvcPath, selectedTableNames)
|
||||||
@ -92,12 +93,16 @@ func genHprose(dbms, connStr string, mode byte, selectedTableNames map[string]bo
|
|||||||
func writeHproseSourceFiles(pkgPath string, tables []*Table, mode byte, paths *MvcPath, selectedTables map[string]bool) {
|
func writeHproseSourceFiles(pkgPath string, tables []*Table, mode byte, paths *MvcPath, selectedTables map[string]bool) {
|
||||||
if (O_MODEL & mode) == O_MODEL {
|
if (O_MODEL & mode) == O_MODEL {
|
||||||
ColorLog("[INFO] Creating model files...\n")
|
ColorLog("[INFO] Creating model files...\n")
|
||||||
writeHproseModelFiles(tables, paths.ModelPath, selectedTables)
|
writeHproseModelFiles(tables, paths.ModelPath, selectedTables, pkgPath)
|
||||||
|
}
|
||||||
|
if (O_MODEL & mode) == O_MODEL {
|
||||||
|
ColorLog("[INFO] Creating structure files...\n")
|
||||||
|
writeHproseStructureFiles(tables, paths.StructurePath, selectedTables)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// writeHproseModelFiles generates model files
|
// writeHproseModelFiles generates model files
|
||||||
func writeHproseModelFiles(tables []*Table, mPath string, selectedTables map[string]bool) {
|
func writeHproseModelFiles(tables []*Table, mPath string, selectedTables map[string]bool, pkgPath string) {
|
||||||
for _, tb := range tables {
|
for _, tb := range tables {
|
||||||
// if selectedTables map is not nil and this table is not selected, ignore it
|
// if selectedTables map is not nil and this table is not selected, ignore it
|
||||||
if selectedTables != nil {
|
if selectedTables != nil {
|
||||||
@ -135,8 +140,9 @@ func writeHproseModelFiles(tables []*Table, mPath string, selectedTables map[str
|
|||||||
template = HPROSE_MODEL_TPL
|
template = HPROSE_MODEL_TPL
|
||||||
hproseAddFunctions = append(hproseAddFunctions, strings.Replace(HPROSE_ADDFUNCTION, "{{modelName}}", camelCase(tb.Name), -1))
|
hproseAddFunctions = append(hproseAddFunctions, strings.Replace(HPROSE_ADDFUNCTION, "{{modelName}}", camelCase(tb.Name), -1))
|
||||||
}
|
}
|
||||||
fileStr := strings.Replace(template, "{{modelStruct}}", tb.String(), 1)
|
fileStr := strings.Replace(template, "{{pkgPath}}", pkgPath, -1)
|
||||||
fileStr = strings.Replace(fileStr, "{{modelName}}", camelCase(tb.Name), -1)
|
fileStr = strings.Replace(fileStr, "{{modelName}}", camelCase(tb.Name), -1)
|
||||||
|
fileStr = strings.Replace(fileStr, "{{tableName}}", tb.Name, -1)
|
||||||
// if table contains time field, import time.Time package
|
// if table contains time field, import time.Time package
|
||||||
timePkg := ""
|
timePkg := ""
|
||||||
importTimePkg := ""
|
importTimePkg := ""
|
||||||
@ -156,6 +162,59 @@ func writeHproseModelFiles(tables []*Table, mPath string, selectedTables map[str
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// writeHproseStructureFiles generates structure files
|
||||||
|
func writeHproseStructureFiles(tables []*Table, mPath string, selectedTables map[string]bool) {
|
||||||
|
for _, tb := range tables {
|
||||||
|
// if selectedTables map is not nil and this table is not selected, ignore it
|
||||||
|
if selectedTables != nil {
|
||||||
|
if _, selected := selectedTables[tb.Name]; !selected {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
filename := getFileName(tb.Name)
|
||||||
|
fpath := path.Join(mPath, filename+"_structure.go")
|
||||||
|
var f *os.File
|
||||||
|
var err error
|
||||||
|
if isExist(fpath) {
|
||||||
|
ColorLog("[WARN] %v is exist, do you want to overwrite it? Yes or No?\n", fpath)
|
||||||
|
if askForConfirmation() {
|
||||||
|
f, err = os.OpenFile(fpath, os.O_RDWR|os.O_TRUNC, 0666)
|
||||||
|
if err != nil {
|
||||||
|
ColorLog("[WARN] %v\n", err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
ColorLog("[WARN] skip create file\n")
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
f, err = os.OpenFile(fpath, os.O_CREATE|os.O_RDWR, 0666)
|
||||||
|
if err != nil {
|
||||||
|
ColorLog("[WARN] %v\n", err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
template := HPROSE_STRUCT_TPL
|
||||||
|
fileStr := strings.Replace(template, "{{Struct}}", tb.String(), 1)
|
||||||
|
// if table contains time field, import time.Time package
|
||||||
|
timePkg := ""
|
||||||
|
importTimePkg := ""
|
||||||
|
if tb.ImportTimePkg {
|
||||||
|
timePkg = "\"time\"\n"
|
||||||
|
importTimePkg = "import \"time\"\n"
|
||||||
|
}
|
||||||
|
fileStr = strings.Replace(fileStr, "{{timePkg}}", timePkg, -1)
|
||||||
|
fileStr = strings.Replace(fileStr, "{{importTimePkg}}", importTimePkg, -1)
|
||||||
|
if _, err := f.WriteString(fileStr); err != nil {
|
||||||
|
ColorLog("[ERRO] Could not write model file to %s\n", fpath)
|
||||||
|
os.Exit(2)
|
||||||
|
}
|
||||||
|
f.Close()
|
||||||
|
ColorLog("[INFO] structure => %s\n", fpath)
|
||||||
|
formatSourceCode(fpath)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const (
|
const (
|
||||||
HPROSE_ADDFUNCTION = `
|
HPROSE_ADDFUNCTION = `
|
||||||
// publish about {{modelName}} function
|
// publish about {{modelName}} function
|
||||||
@ -167,13 +226,16 @@ const (
|
|||||||
|
|
||||||
`
|
`
|
||||||
HPROSE_STRUCT_MODEL_TPL = `package models
|
HPROSE_STRUCT_MODEL_TPL = `package models
|
||||||
|
`
|
||||||
|
HPROSE_STRUCT_TPL = `package structures
|
||||||
{{importTimePkg}}
|
{{importTimePkg}}
|
||||||
{{modelStruct}}
|
{{Struct}}
|
||||||
`
|
`
|
||||||
|
|
||||||
HPROSE_MODEL_TPL = `package models
|
HPROSE_MODEL_TPL = `package models
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"{{pkgPath}}/structures"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"reflect"
|
"reflect"
|
||||||
@ -182,15 +244,13 @@ import (
|
|||||||
"github.com/astaxie/beego/orm"
|
"github.com/astaxie/beego/orm"
|
||||||
)
|
)
|
||||||
|
|
||||||
{{modelStruct}}
|
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
orm.RegisterModel(new({{modelName}}))
|
orm.RegisterModel(new(structures.{{modelName}}))
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add{{modelName}} insert a new {{modelName}} into database and returns
|
// Add{{modelName}} insert a new {{modelName}} into database and returns
|
||||||
// last inserted Id on success.
|
// last inserted Id on success.
|
||||||
func Add{{modelName}}(m *{{modelName}}) (id int64, err error) {
|
func Add{{modelName}}(m *structures.{{modelName}}) (id int64, err error) {
|
||||||
o := orm.NewOrm()
|
o := orm.NewOrm()
|
||||||
id, err = o.Insert(m)
|
id, err = o.Insert(m)
|
||||||
return
|
return
|
||||||
@ -198,9 +258,9 @@ func Add{{modelName}}(m *{{modelName}}) (id int64, err error) {
|
|||||||
|
|
||||||
// Get{{modelName}}ById retrieves {{modelName}} by Id. Returns error if
|
// Get{{modelName}}ById retrieves {{modelName}} by Id. Returns error if
|
||||||
// Id doesn't exist
|
// Id doesn't exist
|
||||||
func Get{{modelName}}ById(id int) (v *{{modelName}}, err error) {
|
func Get{{modelName}}ById(id int) (v *structures.{{modelName}}, err error) {
|
||||||
o := orm.NewOrm()
|
o := orm.NewOrm()
|
||||||
v = &{{modelName}}{Id: id}
|
v = &structures.{{modelName}}{Id: id}
|
||||||
if err = o.Read(v); err == nil {
|
if err = o.Read(v); err == nil {
|
||||||
return v, nil
|
return v, nil
|
||||||
}
|
}
|
||||||
@ -212,7 +272,7 @@ func Get{{modelName}}ById(id int) (v *{{modelName}}, err error) {
|
|||||||
func GetAll{{modelName}}(query map[string]string, fields []string, sortby []string, order []string,
|
func GetAll{{modelName}}(query map[string]string, fields []string, sortby []string, order []string,
|
||||||
offset int64, limit int64) (ml []interface{}, err error) {
|
offset int64, limit int64) (ml []interface{}, err error) {
|
||||||
o := orm.NewOrm()
|
o := orm.NewOrm()
|
||||||
qs := o.QueryTable(new({{modelName}}))
|
qs := o.QueryTable(new(structures.{{modelName}}))
|
||||||
// query k=v
|
// query k=v
|
||||||
for k, v := range query {
|
for k, v := range query {
|
||||||
// rewrite dot-notation to Object__Attribute
|
// rewrite dot-notation to Object__Attribute
|
||||||
@ -258,7 +318,7 @@ func GetAll{{modelName}}(query map[string]string, fields []string, sortby []stri
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var l []{{modelName}}
|
var l []structures.{{modelName}}
|
||||||
qs = qs.OrderBy(sortFields...)
|
qs = qs.OrderBy(sortFields...)
|
||||||
if _, err := qs.Limit(limit, offset).All(&l, fields...); err == nil {
|
if _, err := qs.Limit(limit, offset).All(&l, fields...); err == nil {
|
||||||
if len(fields) == 0 {
|
if len(fields) == 0 {
|
||||||
@ -283,9 +343,9 @@ func GetAll{{modelName}}(query map[string]string, fields []string, sortby []stri
|
|||||||
|
|
||||||
// Update{{modelName}} updates {{modelName}} by Id and returns error if
|
// Update{{modelName}} updates {{modelName}} by Id and returns error if
|
||||||
// the record to be updated doesn't exist
|
// the record to be updated doesn't exist
|
||||||
func Update{{modelName}}ById(m *{{modelName}}) (err error) {
|
func Update{{modelName}}ById(m *structures.{{modelName}}) (err error) {
|
||||||
o := orm.NewOrm()
|
o := orm.NewOrm()
|
||||||
v := {{modelName}}{Id: m.Id}
|
v := structures.{{modelName}}{Id: m.Id}
|
||||||
// ascertain id exists in the database
|
// ascertain id exists in the database
|
||||||
if err = o.Read(&v); err == nil {
|
if err = o.Read(&v); err == nil {
|
||||||
var num int64
|
var num int64
|
||||||
@ -300,11 +360,11 @@ func Update{{modelName}}ById(m *{{modelName}}) (err error) {
|
|||||||
// the record to be deleted doesn't exist
|
// the record to be deleted doesn't exist
|
||||||
func Delete{{modelName}}(id int) (err error) {
|
func Delete{{modelName}}(id int) (err error) {
|
||||||
o := orm.NewOrm()
|
o := orm.NewOrm()
|
||||||
v := {{modelName}}{Id: id}
|
v := structures.{{modelName}}{Id: id}
|
||||||
// ascertain id exists in the database
|
// ascertain id exists in the database
|
||||||
if err = o.Read(&v); err == nil {
|
if err = o.Read(&v); err == nil {
|
||||||
var num int64
|
var num int64
|
||||||
if num, err = o.Delete(&{{modelName}}{Id: id}); err == nil {
|
if num, err = o.Delete(&structures.{{modelName}}{Id: id}); err == nil {
|
||||||
fmt.Println("Number of records deleted in database:", num)
|
fmt.Println("Number of records deleted in database:", num)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
136
g_model.go
136
g_model.go
@ -1,7 +1,6 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
|
||||||
"os"
|
"os"
|
||||||
"path"
|
"path"
|
||||||
"strings"
|
"strings"
|
||||||
@ -15,11 +14,6 @@ func generateModel(mname, fields, crupath string) {
|
|||||||
i := strings.LastIndex(p[:len(p)-1], "/")
|
i := strings.LastIndex(p[:len(p)-1], "/")
|
||||||
packageName = p[i+1 : len(p)-1]
|
packageName = p[i+1 : len(p)-1]
|
||||||
}
|
}
|
||||||
modelStruct, err, hastime := getStruct(modelName, fields)
|
|
||||||
if err != nil {
|
|
||||||
ColorLog("[ERRO] Could not genrate models struct: %s\n", err)
|
|
||||||
os.Exit(2)
|
|
||||||
}
|
|
||||||
ColorLog("[INFO] Using '%s' as model name\n", modelName)
|
ColorLog("[INFO] Using '%s' as model name\n", modelName)
|
||||||
ColorLog("[INFO] Using '%s' as package name\n", packageName)
|
ColorLog("[INFO] Using '%s' as package name\n", packageName)
|
||||||
fp := path.Join(crupath, "models", p)
|
fp := path.Join(crupath, "models", p)
|
||||||
@ -33,14 +27,16 @@ func generateModel(mname, fields, crupath string) {
|
|||||||
fpath := path.Join(fp, strings.ToLower(modelName)+".go")
|
fpath := path.Join(fp, strings.ToLower(modelName)+".go")
|
||||||
if f, err := os.OpenFile(fpath, os.O_CREATE|os.O_EXCL|os.O_RDWR, 0666); err == nil {
|
if f, err := os.OpenFile(fpath, os.O_CREATE|os.O_EXCL|os.O_RDWR, 0666); err == nil {
|
||||||
defer f.Close()
|
defer f.Close()
|
||||||
content := strings.Replace(modelTpl, "{{packageName}}", packageName, -1)
|
var content string
|
||||||
content = strings.Replace(content, "{{modelName}}", modelName, -1)
|
if fields != "" {
|
||||||
content = strings.Replace(content, "{{modelStruct}}", modelStruct, -1)
|
generateStructure(modelName,fields,crupath)
|
||||||
if hastime {
|
content = strings.Replace(CRUD_MODEL_TPL, "{{packageName}}", packageName, -1)
|
||||||
content = strings.Replace(content, "{{timePkg}}", `"time"`, -1)
|
pkgPath := getPackagePath(crupath)
|
||||||
|
content = strings.Replace(content, "{{pkgPath}}", pkgPath, -1)
|
||||||
} else {
|
} else {
|
||||||
content = strings.Replace(content, "{{timePkg}}", "", -1)
|
content = strings.Replace(BASE_MODEL_TPL, "{{packageName}}", packageName, -1)
|
||||||
}
|
}
|
||||||
|
content = strings.Replace(content, "{{modelName}}", modelName, -1)
|
||||||
f.WriteString(content)
|
f.WriteString(content)
|
||||||
// gofmt generated source code
|
// gofmt generated source code
|
||||||
formatSourceCode(fpath)
|
formatSourceCode(fpath)
|
||||||
@ -52,87 +48,54 @@ func generateModel(mname, fields, crupath string) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func getStruct(structname, fields string) (string, error, bool) {
|
const (
|
||||||
if fields == "" {
|
BASE_MODEL_TPL = `package {{packageName}}
|
||||||
return "", errors.New("fields can't empty"), false
|
|
||||||
}
|
// Add{{modelName}} insert a new {{modelName}} into database and returns
|
||||||
hastime := false
|
// last inserted Id on success.
|
||||||
structStr := "type " + structname + " struct{\n"
|
func Add{{modelName}}() () {
|
||||||
fds := strings.Split(fields, ",")
|
|
||||||
for i, v := range fds {
|
|
||||||
kv := strings.SplitN(v, ":", 2)
|
|
||||||
if len(kv) != 2 {
|
|
||||||
return "", errors.New("the filds format is wrong. should key:type,key:type " + v), false
|
|
||||||
}
|
|
||||||
typ, tag, hastimeinner := getType(kv[1])
|
|
||||||
if typ == "" {
|
|
||||||
return "", errors.New("the filds format is wrong. should key:type,key:type " + v), false
|
|
||||||
}
|
|
||||||
if i == 0 && strings.ToLower(kv[0]) != "id" {
|
|
||||||
structStr = structStr + "Id int64 `orm:\"auto\"`\n"
|
|
||||||
}
|
|
||||||
if hastimeinner {
|
|
||||||
hastime = true
|
|
||||||
}
|
|
||||||
structStr = structStr + camelString(kv[0]) + " " + typ + " " + tag + "\n"
|
|
||||||
}
|
|
||||||
structStr += "}\n"
|
|
||||||
return structStr, nil, hastime
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// fields support type
|
// Get{{modelName}}ById retrieves {{modelName}} by Id. Returns error if
|
||||||
// http://beego.me/docs/mvc/model/models.md#mysql
|
// Id doesn't exist
|
||||||
func getType(ktype string) (kt, tag string, hasTime bool) {
|
func Get{{modelName}}ById() () {
|
||||||
kv := strings.SplitN(ktype, ":", 2)
|
|
||||||
switch kv[0] {
|
|
||||||
case "string":
|
|
||||||
if len(kv) == 2 {
|
|
||||||
return "string", "`orm:\"size(" + kv[1] + ")\"`", false
|
|
||||||
} else {
|
|
||||||
return "string", "`orm:\"size(128)\"`", false
|
|
||||||
}
|
|
||||||
case "text":
|
|
||||||
return "string", "`orm:\"type(longtext)\"`", false
|
|
||||||
case "auto":
|
|
||||||
return "int64", "`orm:\"auto\"`", false
|
|
||||||
case "pk":
|
|
||||||
return "int64", "`orm:\"pk\"`", false
|
|
||||||
case "datetime":
|
|
||||||
return "time.Time", "`orm:\"type(datetime)\"`", true
|
|
||||||
case "int", "int8", "int16", "int32", "int64":
|
|
||||||
fallthrough
|
|
||||||
case "uint", "uint8", "uint16", "uint32", "uint64":
|
|
||||||
fallthrough
|
|
||||||
case "bool":
|
|
||||||
fallthrough
|
|
||||||
case "float32", "float64":
|
|
||||||
return kv[0], "", false
|
|
||||||
case "float":
|
|
||||||
return "float64", "", false
|
|
||||||
}
|
|
||||||
return "", "", false
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var modelTpl = `package {{packageName}}
|
// GetAll{{modelName}} retrieves all {{modelName}} matches certain condition. Returns empty list if
|
||||||
|
// no records exist
|
||||||
|
func GetAll{{modelName}}() () {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update{{modelName}} updates {{modelName}} by Id and returns error if
|
||||||
|
// the record to be updated doesn't exist
|
||||||
|
func Update{{modelName}}ById() () {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Delete{{modelName}} deletes {{modelName}} by Id and returns error if
|
||||||
|
// the record to be deleted doesn't exist
|
||||||
|
func Delete{{modelName}}() () {
|
||||||
|
|
||||||
|
}
|
||||||
|
`
|
||||||
|
CRUD_MODEL_TPL = `package {{packageName}}
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"{{pkgPath}}/structures"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"reflect"
|
"reflect"
|
||||||
"strings"
|
"strings"
|
||||||
{{timePkg}}
|
|
||||||
"github.com/astaxie/beego/orm"
|
"github.com/astaxie/beego/orm"
|
||||||
)
|
)
|
||||||
|
|
||||||
{{modelStruct}}
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
orm.RegisterModel(new({{modelName}}))
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add{{modelName}} insert a new {{modelName}} into database and returns
|
// Add{{modelName}} insert a new {{modelName}} into database and returns
|
||||||
// last inserted Id on success.
|
// last inserted Id on success.
|
||||||
func Add{{modelName}}(m *{{modelName}}) (id int64, err error) {
|
func Add{{modelName}}(m *structures.{{modelName}}) (id int64, err error) {
|
||||||
o := orm.NewOrm()
|
o := orm.NewOrm()
|
||||||
id, err = o.Insert(m)
|
id, err = o.Insert(m)
|
||||||
return
|
return
|
||||||
@ -140,9 +103,9 @@ func Add{{modelName}}(m *{{modelName}}) (id int64, err error) {
|
|||||||
|
|
||||||
// Get{{modelName}}ById retrieves {{modelName}} by Id. Returns error if
|
// Get{{modelName}}ById retrieves {{modelName}} by Id. Returns error if
|
||||||
// Id doesn't exist
|
// Id doesn't exist
|
||||||
func Get{{modelName}}ById(id int64) (v *{{modelName}}, err error) {
|
func Get{{modelName}}ById(id int64) (v *structures.{{modelName}}, err error) {
|
||||||
o := orm.NewOrm()
|
o := orm.NewOrm()
|
||||||
v = &{{modelName}}{Id: id}
|
v = &structures.{{modelName}}{Id: id}
|
||||||
if err = o.Read(v); err == nil {
|
if err = o.Read(v); err == nil {
|
||||||
return v, nil
|
return v, nil
|
||||||
}
|
}
|
||||||
@ -154,7 +117,7 @@ func Get{{modelName}}ById(id int64) (v *{{modelName}}, err error) {
|
|||||||
func GetAll{{modelName}}(query map[string]string, fields []string, sortby []string, order []string,
|
func GetAll{{modelName}}(query map[string]string, fields []string, sortby []string, order []string,
|
||||||
offset int64, limit int64) (ml []interface{}, err error) {
|
offset int64, limit int64) (ml []interface{}, err error) {
|
||||||
o := orm.NewOrm()
|
o := orm.NewOrm()
|
||||||
qs := o.QueryTable(new({{modelName}}))
|
qs := o.QueryTable(new(structures.{{modelName}}))
|
||||||
// query k=v
|
// query k=v
|
||||||
for k, v := range query {
|
for k, v := range query {
|
||||||
// rewrite dot-notation to Object__Attribute
|
// rewrite dot-notation to Object__Attribute
|
||||||
@ -200,7 +163,7 @@ func GetAll{{modelName}}(query map[string]string, fields []string, sortby []stri
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var l []{{modelName}}
|
var l []structures.{{modelName}}
|
||||||
qs = qs.OrderBy(sortFields...)
|
qs = qs.OrderBy(sortFields...)
|
||||||
if _, err := qs.Limit(limit, offset).All(&l, fields...); err == nil {
|
if _, err := qs.Limit(limit, offset).All(&l, fields...); err == nil {
|
||||||
if len(fields) == 0 {
|
if len(fields) == 0 {
|
||||||
@ -225,9 +188,9 @@ func GetAll{{modelName}}(query map[string]string, fields []string, sortby []stri
|
|||||||
|
|
||||||
// Update{{modelName}} updates {{modelName}} by Id and returns error if
|
// Update{{modelName}} updates {{modelName}} by Id and returns error if
|
||||||
// the record to be updated doesn't exist
|
// the record to be updated doesn't exist
|
||||||
func Update{{modelName}}ById(m *{{modelName}}) (err error) {
|
func Update{{modelName}}ById(m *structures.{{modelName}}) (err error) {
|
||||||
o := orm.NewOrm()
|
o := orm.NewOrm()
|
||||||
v := {{modelName}}{Id: m.Id}
|
v := structures.{{modelName}}{Id: m.Id}
|
||||||
// ascertain id exists in the database
|
// ascertain id exists in the database
|
||||||
if err = o.Read(&v); err == nil {
|
if err = o.Read(&v); err == nil {
|
||||||
var num int64
|
var num int64
|
||||||
@ -242,14 +205,15 @@ func Update{{modelName}}ById(m *{{modelName}}) (err error) {
|
|||||||
// the record to be deleted doesn't exist
|
// the record to be deleted doesn't exist
|
||||||
func Delete{{modelName}}(id int64) (err error) {
|
func Delete{{modelName}}(id int64) (err error) {
|
||||||
o := orm.NewOrm()
|
o := orm.NewOrm()
|
||||||
v := {{modelName}}{Id: id}
|
v := structures.{{modelName}}{Id: id}
|
||||||
// ascertain id exists in the database
|
// ascertain id exists in the database
|
||||||
if err = o.Read(&v); err == nil {
|
if err = o.Read(&v); err == nil {
|
||||||
var num int64
|
var num int64
|
||||||
if num, err = o.Delete(&{{modelName}}{Id: id}); err == nil {
|
if num, err = o.Delete(&structures.{{modelName}}{Id: id}); err == nil {
|
||||||
fmt.Println("Number of records deleted in database:", num)
|
fmt.Println("Number of records deleted in database:", num)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
`
|
`
|
||||||
|
)
|
||||||
|
160
g_structure.go
Normal file
160
g_structure.go
Normal file
@ -0,0 +1,160 @@
|
|||||||
|
// Copyright 2016 Dylan LYU (mingzong.lyu@gmail.com)
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License"): you may
|
||||||
|
// not use this file except in compliance with the License. You may obtain
|
||||||
|
// a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
// License for the specific language governing permissions and limitations
|
||||||
|
// under the License.
|
||||||
|
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"os"
|
||||||
|
"path"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
func generateStructure(cname, fields, crupath string) {
|
||||||
|
p, f := path.Split(cname)
|
||||||
|
structureName := strings.Title(f)
|
||||||
|
packageName := "structures"
|
||||||
|
if p != "" {
|
||||||
|
i := strings.LastIndex(p[:len(p)-1], "/")
|
||||||
|
packageName = p[i+1 : len(p)-1]
|
||||||
|
}
|
||||||
|
ColorLog("[INFO] Using '%s' as structure name\n", structureName)
|
||||||
|
ColorLog("[INFO] Using '%s' as package name\n", packageName)
|
||||||
|
fp := path.Join(crupath, packageName, p)
|
||||||
|
if _, err := os.Stat(fp); os.IsNotExist(err) {
|
||||||
|
// create controller directory
|
||||||
|
if err := os.MkdirAll(fp, 0777); err != nil {
|
||||||
|
ColorLog("[ERRO] Could not create structures directory: %s\n", err)
|
||||||
|
os.Exit(2)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fpath := path.Join(fp, strings.ToLower(structureName)+"_structure.go")
|
||||||
|
if f, err := os.OpenFile(fpath, os.O_CREATE|os.O_EXCL|os.O_RDWR, 0666); err == nil {
|
||||||
|
defer f.Close()
|
||||||
|
var content string
|
||||||
|
|
||||||
|
if fields != "" {
|
||||||
|
structStruct, err, hastime := getStruct(structureName, fields)
|
||||||
|
if err != nil {
|
||||||
|
ColorLog("[ERRO] Could not genrate struct: %s\n", err)
|
||||||
|
os.Exit(2)
|
||||||
|
}
|
||||||
|
content = strings.Replace(STRUCTURE_TPL, "{{packageName}}", packageName, -1)
|
||||||
|
content = strings.Replace(content, "{{structStruct}}", structStruct, -1)
|
||||||
|
if hastime {
|
||||||
|
content = strings.Replace(content, "{{timePkg}}", `"time"`, -1)
|
||||||
|
} else {
|
||||||
|
content = strings.Replace(content, "{{timePkg}}", "", -1)
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
content = strings.Replace(BAST_STRUCTURE_TPL, "{{packageName}}", packageName, -1)
|
||||||
|
}
|
||||||
|
content = strings.Replace(content, "{{structureName}}", structureName, -1)
|
||||||
|
f.WriteString(content)
|
||||||
|
// gofmt generated source code
|
||||||
|
formatSourceCode(fpath)
|
||||||
|
ColorLog("[INFO] structure file generated: %s\n", fpath)
|
||||||
|
} else {
|
||||||
|
// error creating file
|
||||||
|
ColorLog("[ERRO] Could not create structure file: %s\n", err)
|
||||||
|
os.Exit(2)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func getStruct(structname, fields string) (string, error, bool) {
|
||||||
|
if fields == "" {
|
||||||
|
return "", errors.New("fields can't empty"), false
|
||||||
|
}
|
||||||
|
hastime := false
|
||||||
|
structStr := "type " + structname + " struct{\n"
|
||||||
|
fds := strings.Split(fields, ",")
|
||||||
|
for i, v := range fds {
|
||||||
|
kv := strings.SplitN(v, ":", 2)
|
||||||
|
if len(kv) != 2 {
|
||||||
|
return "", errors.New("the filds format is wrong. should key:type,key:type " + v), false
|
||||||
|
}
|
||||||
|
typ, tag, hastimeinner := getType(kv[1])
|
||||||
|
if typ == "" {
|
||||||
|
return "", errors.New("the filds format is wrong. should key:type,key:type " + v), false
|
||||||
|
}
|
||||||
|
if i == 0 && strings.ToLower(kv[0]) != "id" {
|
||||||
|
structStr = structStr + "Id int64 `orm:\"auto\"`\n"
|
||||||
|
}
|
||||||
|
if hastimeinner {
|
||||||
|
hastime = true
|
||||||
|
}
|
||||||
|
structStr = structStr + camelString(kv[0]) + " " + typ + " " + tag + "\n"
|
||||||
|
}
|
||||||
|
structStr += "}\n"
|
||||||
|
return structStr, nil, hastime
|
||||||
|
}
|
||||||
|
|
||||||
|
// fields support type
|
||||||
|
// http://beego.me/docs/mvc/model/models.md#mysql
|
||||||
|
func getType(ktype string) (kt, tag string, hasTime bool) {
|
||||||
|
kv := strings.SplitN(ktype, ":", 2)
|
||||||
|
switch kv[0] {
|
||||||
|
case "string":
|
||||||
|
if len(kv) == 2 {
|
||||||
|
return "string", "`orm:\"size(" + kv[1] + ")\"`", false
|
||||||
|
} else {
|
||||||
|
return "string", "`orm:\"size(128)\"`", false
|
||||||
|
}
|
||||||
|
case "text":
|
||||||
|
return "string", "`orm:\"type(longtext)\"`", false
|
||||||
|
case "auto":
|
||||||
|
return "int64", "`orm:\"auto\"`", false
|
||||||
|
case "pk":
|
||||||
|
return "int64", "`orm:\"pk\"`", false
|
||||||
|
case "datetime":
|
||||||
|
return "time.Time", "`orm:\"type(datetime)\"`", true
|
||||||
|
case "int", "int8", "int16", "int32", "int64":
|
||||||
|
fallthrough
|
||||||
|
case "uint", "uint8", "uint16", "uint32", "uint64":
|
||||||
|
fallthrough
|
||||||
|
case "bool":
|
||||||
|
fallthrough
|
||||||
|
case "float32", "float64":
|
||||||
|
return kv[0], "", false
|
||||||
|
case "float":
|
||||||
|
return "float64", "", false
|
||||||
|
}
|
||||||
|
return "", "", false
|
||||||
|
}
|
||||||
|
|
||||||
|
const (
|
||||||
|
BAST_STRUCTURE_TPL = `package {{packageName}}
|
||||||
|
|
||||||
|
type {{structureName}} struct {
|
||||||
|
|
||||||
|
}
|
||||||
|
`
|
||||||
|
|
||||||
|
STRUCTURE_TPL = `package {{packageName}}
|
||||||
|
|
||||||
|
import(
|
||||||
|
"github.com/astaxie/beego/orm"
|
||||||
|
|
||||||
|
{{timePkg}}
|
||||||
|
)
|
||||||
|
|
||||||
|
{{structStruct}}
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
orm.RegisterModel(new({{structureName}}))
|
||||||
|
}
|
||||||
|
`
|
||||||
|
)
|
29
hproseapp.go
29
hproseapp.go
@ -45,11 +45,15 @@ In the current path, will create a folder named [appname]
|
|||||||
In the appname folder has the follow struct:
|
In the appname folder has the follow struct:
|
||||||
|
|
||||||
├── conf
|
├── conf
|
||||||
│ └── app.conf
|
│ └── app.conf
|
||||||
|
├── helpers
|
||||||
├── main.go
|
├── main.go
|
||||||
└── models
|
├── models
|
||||||
└── object.go
|
│ ├── object.go
|
||||||
└── user.go
|
│ └── user.go
|
||||||
|
└── structures
|
||||||
|
├── object_structure.go
|
||||||
|
└── user_structure.go
|
||||||
`,
|
`,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -276,6 +280,8 @@ func createhprose(cmd *Command, args []string) int {
|
|||||||
fmt.Println("create conf app.conf:", path.Join(apppath, "conf", "app.conf"))
|
fmt.Println("create conf app.conf:", path.Join(apppath, "conf", "app.conf"))
|
||||||
writetofile(path.Join(apppath, "conf", "app.conf"),
|
writetofile(path.Join(apppath, "conf", "app.conf"),
|
||||||
strings.Replace(hproseconf, "{{.Appname}}", args[0], -1))
|
strings.Replace(hproseconf, "{{.Appname}}", args[0], -1))
|
||||||
|
os.Mkdir(path.Join(apppath, "helpers"), 0755)
|
||||||
|
fmt.Println("create helpers:", path.Join(apppath, "helpers"))
|
||||||
|
|
||||||
if conn != "" {
|
if conn != "" {
|
||||||
ColorLog("[INFO] Using '%s' as 'driver'\n", driver)
|
ColorLog("[INFO] Using '%s' as 'driver'\n", driver)
|
||||||
@ -300,14 +306,25 @@ func createhprose(cmd *Command, args []string) int {
|
|||||||
),
|
),
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
|
os.Mkdir(path.Join(apppath, "structures"), 0755)
|
||||||
|
fmt.Println("create structures:", path.Join(apppath, "structures"))
|
||||||
|
|
||||||
|
fmt.Println("create structures user_structure.go:", path.Join(apppath, "structures", "user_structure.go"))
|
||||||
|
writetofile(path.Join(apppath, "structures", "user_structure.go"), apistructures)
|
||||||
|
|
||||||
|
fmt.Println("create structures object_structure.go:", path.Join(apppath, "structures", "object_structure.go"))
|
||||||
|
writetofile(path.Join(apppath, "structures", "object_structure.go"), apistructures2)
|
||||||
|
|
||||||
os.Mkdir(path.Join(apppath, "models"), 0755)
|
os.Mkdir(path.Join(apppath, "models"), 0755)
|
||||||
fmt.Println("create models:", path.Join(apppath, "models"))
|
fmt.Println("create models:", path.Join(apppath, "models"))
|
||||||
|
|
||||||
fmt.Println("create models object.go:", path.Join(apppath, "models", "object.go"))
|
fmt.Println("create models object.go:", path.Join(apppath, "models", "object.go"))
|
||||||
writetofile(path.Join(apppath, "models", "object.go"), apiModels)
|
writetofile(path.Join(apppath, "models", "object.go"),
|
||||||
|
strings.Replace(apiModels, "{{.Appname}}", packpath, -1))
|
||||||
|
|
||||||
fmt.Println("create models user.go:", path.Join(apppath, "models", "user.go"))
|
fmt.Println("create models user.go:", path.Join(apppath, "models", "user.go"))
|
||||||
writetofile(path.Join(apppath, "models", "user.go"), apiModels2)
|
writetofile(path.Join(apppath, "models", "user.go"),
|
||||||
|
strings.Replace(apiModels2, "{{.Appname}}", packpath, -1))
|
||||||
|
|
||||||
fmt.Println("create main.go:", path.Join(apppath, "main.go"))
|
fmt.Println("create main.go:", path.Join(apppath, "main.go"))
|
||||||
writetofile(path.Join(apppath, "main.go"),
|
writetofile(path.Join(apppath, "main.go"),
|
||||||
|
43
new.go
43
new.go
@ -30,22 +30,25 @@ Creates a Beego application for the given app name in the current directory.
|
|||||||
The command 'new' creates a folder named [appname] and inside the folder deploy
|
The command 'new' creates a folder named [appname] and inside the folder deploy
|
||||||
the following files/directories structure:
|
the following files/directories structure:
|
||||||
|
|
||||||
|- main.go
|
.
|
||||||
|- conf
|
├── conf
|
||||||
|- app.conf
|
│ └── app.conf
|
||||||
|- controllers
|
├── controllers
|
||||||
|- default.go
|
│ └── index_controller.go
|
||||||
|- models
|
├── helpers
|
||||||
|- routers
|
├── main.go
|
||||||
|- router.go
|
├── models
|
||||||
|- tests
|
├── routers
|
||||||
|- default_test.go
|
│ └── router.go
|
||||||
|- static
|
├── static
|
||||||
|- js
|
│ ├── css
|
||||||
|- css
|
│ ├── img
|
||||||
|- img
|
│ └── js
|
||||||
|- views
|
├── structure
|
||||||
index.tpl
|
├── tests
|
||||||
|
│ └── default_test.go
|
||||||
|
└── views
|
||||||
|
└── index.tpl
|
||||||
|
|
||||||
`,
|
`,
|
||||||
}
|
}
|
||||||
@ -116,12 +119,16 @@ func createApp(cmd *Command, args []string) int {
|
|||||||
fmt.Println(path.Join(apppath, "conf") + string(path.Separator))
|
fmt.Println(path.Join(apppath, "conf") + string(path.Separator))
|
||||||
os.Mkdir(path.Join(apppath, "controllers"), 0755)
|
os.Mkdir(path.Join(apppath, "controllers"), 0755)
|
||||||
fmt.Println(path.Join(apppath, "controllers") + string(path.Separator))
|
fmt.Println(path.Join(apppath, "controllers") + string(path.Separator))
|
||||||
|
os.Mkdir(path.Join(apppath, "helpers"), 0755)
|
||||||
|
fmt.Println(path.Join(apppath, "helpers") + string(path.Separator))
|
||||||
os.Mkdir(path.Join(apppath, "models"), 0755)
|
os.Mkdir(path.Join(apppath, "models"), 0755)
|
||||||
fmt.Println(path.Join(apppath, "models") + string(path.Separator))
|
fmt.Println(path.Join(apppath, "models") + string(path.Separator))
|
||||||
os.Mkdir(path.Join(apppath, "routers"), 0755)
|
os.Mkdir(path.Join(apppath, "routers"), 0755)
|
||||||
fmt.Println(path.Join(apppath, "routers") + string(path.Separator))
|
fmt.Println(path.Join(apppath, "routers") + string(path.Separator))
|
||||||
os.Mkdir(path.Join(apppath, "tests"), 0755)
|
os.Mkdir(path.Join(apppath, "tests"), 0755)
|
||||||
fmt.Println(path.Join(apppath, "tests") + string(path.Separator))
|
fmt.Println(path.Join(apppath, "tests") + string(path.Separator))
|
||||||
|
os.Mkdir(path.Join(apppath, "structures"), 0755)
|
||||||
|
fmt.Println(path.Join(apppath, "structures") + string(path.Separator))
|
||||||
os.Mkdir(path.Join(apppath, "static"), 0755)
|
os.Mkdir(path.Join(apppath, "static"), 0755)
|
||||||
fmt.Println(path.Join(apppath, "static") + string(path.Separator))
|
fmt.Println(path.Join(apppath, "static") + string(path.Separator))
|
||||||
os.Mkdir(path.Join(apppath, "static", "js"), 0755)
|
os.Mkdir(path.Join(apppath, "static", "js"), 0755)
|
||||||
@ -135,8 +142,8 @@ func createApp(cmd *Command, args []string) int {
|
|||||||
fmt.Println(path.Join(apppath, "conf", "app.conf"))
|
fmt.Println(path.Join(apppath, "conf", "app.conf"))
|
||||||
writetofile(path.Join(apppath, "conf", "app.conf"), strings.Replace(appconf, "{{.Appname}}", args[0], -1))
|
writetofile(path.Join(apppath, "conf", "app.conf"), strings.Replace(appconf, "{{.Appname}}", args[0], -1))
|
||||||
|
|
||||||
fmt.Println(path.Join(apppath, "controllers", "default.go"))
|
fmt.Println(path.Join(apppath, "controllers", "index_controller.go"))
|
||||||
writetofile(path.Join(apppath, "controllers", "default.go"), controllers)
|
writetofile(path.Join(apppath, "controllers", "index_controller.go"), controllers)
|
||||||
|
|
||||||
fmt.Println(path.Join(apppath, "views", "index.tpl"))
|
fmt.Println(path.Join(apppath, "views", "index.tpl"))
|
||||||
writetofile(path.Join(apppath, "views", "index.tpl"), indextpl)
|
writetofile(path.Join(apppath, "views", "index.tpl"), indextpl)
|
||||||
|
Loading…
Reference in New Issue
Block a user